summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/usr/isteps/istep10/call_host_set_voltages.C734
-rw-r--r--src/usr/isteps/istep10/call_host_update_redundant_tpm.C688
2 files changed, 734 insertions, 688 deletions
diff --git a/src/usr/isteps/istep10/call_host_set_voltages.C b/src/usr/isteps/istep10/call_host_set_voltages.C
index d0a8dbd8c..22fe8faf0 100644
--- a/src/usr/isteps/istep10/call_host_set_voltages.C
+++ b/src/usr/isteps/istep10/call_host_set_voltages.C
@@ -43,6 +43,51 @@
#include <hbToHwsvVoltageMsg.H>
+// Note: The following secureboot-related includes will be kept separate from
+// any other includes in this file in spite of the resulting duplicate includes.
+// This will make it easier going forward to relocate the code that requires
+// these includes. In the past isteps have been moved around, causing the
+// security code below to slip farther away from the SBE update step. For
+// maximal security, we want the secure boot code to happen immediately after
+// SBE update and keeping the code relocateable facilitates this.
+
+// begin includes for post sbe secureboot steps
+#include <errl/errlentry.H>
+#include <errl/errlmanager.H>
+#include <isteps/istep_reasoncodes.H>
+#include <initservice/initserviceif.H>
+
+// targeting support
+#include <targeting/common/target.H>
+#include <targeting/common/commontargeting.H>
+#include <targeting/common/utilFilter.H>
+#include <errl/errludtarget.H>
+#include <attributetraits.H>
+
+#include <config.h>
+#include <util/align.H>
+#include <util/algorithm.H>
+
+// Fapi Support
+#include <fapi2.H>
+#include <target_types.H>
+#include <plat_hwp_invoker.H>
+#include <attributeenums.H>
+#include <istepHelperFuncs.H>
+
+//HWP
+#include <p9_update_security_ctrl.H>
+
+// secureboot
+#include <secureboot/service.H>
+#include <secureboot/settings.H>
+#include <i2c/eepromif.H>
+#include <sbe/sbeif.H>
+#include "../../secureboot/common/errlud_secure.H"
+#include <sbe/sbe_update.H>
+
+// end includes for post sbe secureboot steps
+
using namespace TARGETING;
using namespace ERRORLOG;
using namespace ISTEP_ERROR;
@@ -50,6 +95,693 @@ using namespace ISTEP_ERROR;
namespace ISTEP_10
{
+#ifdef CONFIG_SECUREBOOT
+/**
+ * @brief This structure associates SBE HW keys' hashes with names and SBE sides
+ */
+struct HashNode
+{
+ uint8_t* hash; /** SBE HW keys' hash for the named side */
+ const char* name; /** Name of the side: either primary or backup */
+ uint8_t side; /** A uint8_t value of 0 for primary or 1 for backup */
+ HashNode(uint8_t* i_hash,
+ const char* i_name,
+ uint8_t i_side) : hash(i_hash), name(i_name), side(i_side)
+ {
+ }
+};
+
+/**
+ * @brief This union simplifies bitwise operations for tracking the four
+ * conditions of mismatch when matching security settings of a slave processor
+ * with that of the master processor.
+ */
+union Mismatches
+{
+ uint8_t val;
+ struct {
+ uint8_t reserved : 4; /** unused */
+ uint8_t sabmis : 1; /** Value of 1 indicates the SAB bit didn't match,
+ * 0 otherwise.
+ */
+ uint8_t smdmis : 1; /** Value of 1 indicates the SMD bit did not match,
+ * 0 otherwise.
+ */
+ uint8_t primis : 1; /** Value of 1 indicates the primary SBE HW key's
+ * did not match, 0 otherwise.
+ */
+ uint8_t bacmis : 1; /** Value of 1 indicates the backup SBE HW key's
+ * did not match, 0 otherwise.
+ */
+ };
+};
+
+/** @brief Handle a processor security error.
+ * @par Detailed Description:
+ * Puts all the error handling for mismatched processor security
+ * settings in one place in order to minimize code footprint. This
+ * highly-specialized function is not intended for public consumption.
+ * @param[in] i_pProc The target processor whose secure processor settings are
+ * exhibiting a problem. Must not be null.
+ * @param[in] i_rc The reason code of the error to be handled.
+ * @param[in] i_hashes A vector containing hash/string/side triples, where
+ * the string indicates the name of the hash, and the side refers to the
+ * SBE side that the hash was taken from.
+ * @param[in] i_plid If non zero this plid from a previous error will be linked
+ * To the error created by this function, ignored otherwise.
+ * @param[in] i_continue A boolean indicating whether hostboot should continue
+ * booting (and deconfigure the processor) or stop the IPL.
+ * @param[in] i_mismatches A bitstring of mismatch bits of type Mismatches
+ * corresponding to a mismatch of the SAB or SMD register or primary or
+ * secondary SBE HW Keys' Hash between the supplied target and the master
+ * processor. Optional parameter is for the RC_PROC_SECURITY_STATE_MISMATCH
+ * case only and must be left as default (value of 0) for all other cases.
+ */
+void handleProcessorSecurityError(TARGETING::Target* i_pProc,
+ ISTEP::istepReasonCode i_rc,
+ const std::vector<HashNode>& i_hashes,
+ uint16_t i_plid,
+ bool i_continue,
+ Mismatches i_mismatches={0})
+{
+ using namespace ISTEP;
+
+ // stop the caller from passing a null target
+ assert(i_pProc != nullptr, "Bug! Target pointer must not be null");
+
+ // make sure that caller is using the Mismatches parameter at the right time
+ assert( (i_rc!=RC_PROC_SECURITY_STATE_MISMATCH && !i_mismatches.val) ||
+ (i_rc==RC_PROC_SECURITY_STATE_MISMATCH && i_mismatches.val),
+ "Mismatches parameter is for RC_PROC_SECURITY_STATE_MISMATCH only");
+
+ ERRORLOG::errlSeverity_t l_severity = ERRORLOG::ERRL_SEV_UNRECOVERABLE;
+
+ if (i_rc==RC_MASTER_PROC_SBE_KEYS_HASH_MISMATCH ||
+ i_rc==RC_PROC_SECURITY_STATE_MISMATCH)
+ {
+ if (i_rc==RC_PROC_SECURITY_STATE_MISMATCH)
+ {
+ TRACFCOMP(ISTEPS_TRACE::g_trac_isteps_trace,
+ ERR_MRK"call_host_set_voltages - handleProcessorSecurityError processor state does match master for processor tgt=0x%X",
+ TARGETING::get_huid(i_pProc));
+
+ TRACFCOMP(ISTEPS_TRACE::g_trac_isteps_trace,
+ "SMD is a %smatch", i_mismatches.smdmis? "mis": "");
+ TRACFCOMP(ISTEPS_TRACE::g_trac_isteps_trace,
+ "SAB is a %smatch", i_mismatches.sabmis? "mis": "");
+ TRACFCOMP(ISTEPS_TRACE::g_trac_isteps_trace,
+ "Primary SBE hash is a %smatch",
+ i_mismatches.primis? "mis": "");
+ TRACFCOMP(ISTEPS_TRACE::g_trac_isteps_trace,
+ "Backup SBE hash is a %smatch",
+ i_mismatches.bacmis? "mis": "");
+ }
+ else // master proc sbe keys' hash mismatch
+ {
+ TRACFCOMP(ISTEPS_TRACE::g_trac_isteps_trace,
+ ERR_MRK"call_host_set_voltages - handleProcessorSecurityError: Master processor sbe keys' hash doesn't match master backup sbe key's hash");
+ }
+
+ // Log as informational if secure boot is disabled
+ if (!SECUREBOOT::enabled())
+ {
+ l_severity = ERRORLOG::ERRL_SEV_INFORMATIONAL;
+ }
+ }
+ else
+ {
+ TRACFCOMP(ISTEPS_TRACE::g_trac_isteps_trace,
+ "call_host_set_voltages - handleProcessorSecurityError: Istep error occurred, reason code 0x%X"
+ ,i_rc);
+ TRACDCOMP(ISTEPS_TRACE::g_trac_isteps_trace,
+ ERR_MRK"call_host_set_voltages - handleProcessorSecurityError: %s fail",
+ i_rc==RC_MASTER_PROC_PRIMARY_HASH_READ_FAIL?"Master primary hash read":
+ i_rc==RC_MASTER_PROC_BACKUP_HASH_READ_FAIL?"Master backup hash read":
+ i_rc==RC_MASTER_PROC_CBS_CONTROL_READ_FAIL?"Master CBS control read":
+ i_rc==RC_SLAVE_PROC_PRIMARY_HASH_READ_FAIL?"Slave primary hash read":
+ i_rc==RC_SLAVE_PROC_BACKUP_HASH_READ_FAIL?"Slave backup hash read":
+ i_rc==RC_SLAVE_PROC_CBS_CONTROL_READ_FAIL?"Slave CBS control read":
+ "unknown");
+ }
+
+ auto err = new ERRORLOG::ErrlEntry(l_severity,
+ ISTEP::MOD_UPDATE_REDUNDANT_TPM,
+ i_rc,
+ TARGETING::get_huid(i_pProc),
+ TO_UINT64(i_mismatches.val),
+ true);
+
+ // if a plid was given, link it to the new error.
+ if (i_plid)
+ {
+ err->plid(i_plid);
+ }
+
+ err->collectTrace(ISTEP_COMP_NAME);
+
+ ERRORLOG::ErrlUserDetailsTarget(i_pProc).addToLog(err);
+
+ // Add Security related user details
+ SECUREBOOT::addSecureUserDetailsToErrolog(err);
+
+ // add hashes to log and traces
+ for(auto& hsh : i_hashes)
+ {
+ TRACFCOMP(ISTEPS_TRACE::g_trac_isteps_trace, ERR_MRK"call_host_set_voltages - handleProcessorSecurityError - %s hash: ", hsh.name);
+ TRACFBIN(ISTEPS_TRACE::g_trac_isteps_trace,
+ "Data = ",
+ reinterpret_cast<void*>(hsh.hash),
+ SHA512_DIGEST_LENGTH);
+ SECUREBOOT::UdTargetHwKeyHash(
+ i_pProc,
+ hsh.side,
+ hsh.hash).addToLog(err);
+ }
+
+ if (i_continue)
+ {
+ err->addHwCallout(i_pProc,
+ HWAS::SRCI_PRIORITY_LOW,
+ i_mismatches.val && // for any mismatch
+ !RC_MASTER_PROC_SBE_KEYS_HASH_MISMATCH?
+ HWAS::NO_DECONFIG: // don't deconfig the processor
+ HWAS::DELAYED_DECONFIG,
+ HWAS::GARD_NULL);
+ }
+
+ // save off reason code before committing
+ auto l_reason = err->reasonCode();
+
+ ERRORLOG::errlCommit(err, ISTEP_COMP_ID);
+
+ if (!i_continue)
+ {
+ TRACFCOMP(ISTEPS_TRACE::g_trac_isteps_trace,
+ "Terminating because future security cannot be guaranteed.");
+ INITSERVICE::doShutdown(l_reason);
+ }
+}
+#endif
+
+//*****************************************************************************
+// validateSecuritySettings()
+//*****************************************************************************
+/*
+ * @brief Lock the SUL bit and enforce synchronized processor security states
+ */
+void validateSecuritySettings()
+{
+ TRACFCOMP(ISTEPS_TRACE::g_trac_isteps_trace,
+ ENTER_MRK"validateSecuritySettings");
+
+ errlHndl_t err = nullptr;
+
+ // Before update procedure, trace security settings
+ err = SECUREBOOT::traceSecuritySettings();
+ if (err)
+ {
+ TRACFCOMP( ISTEPS_TRACE::g_trac_isteps_trace,
+ "validateSecuritySettings: Error back from "
+ "SECUREBOOT::traceSecuritySettings: rc=0x%X, plid=0x%X",
+ ERRL_GETRC_SAFE(err), ERRL_GETPLID_SAFE(err));
+
+ // Commit log, but continue
+ ERRORLOG::errlCommit( err, SECURE_COMP_ID );
+ }
+
+ // Start of update procedure
+ #ifdef CONFIG_SECUREBOOT
+
+ bool l_force = false;
+
+ TARGETING::TargetHandleList l_procList;
+ getAllChips(l_procList,TARGETING::TYPE_PROC,true);
+
+ // call p9_update_security_ctrl.C HWP
+ do {
+
+ if (!SECUREBOOT::enabled() && !l_force)
+ {
+ break;
+ }
+
+ TARGETING::TargetHandleList l_tpmList;
+ getAllChips(l_tpmList,TARGETING::TYPE_TPM,false);
+
+ // loop through the processors
+ auto pProcItr = l_procList.begin();
+ while (pProcItr != l_procList.end())
+ {
+ bool l_notInMrw = true;
+ TARGETING::Target* l_tpm = nullptr;
+
+ // check if processor has a TPM according to the mrw
+
+ // for each TPM in the list compare i2c master path with
+ // the path of the current processor
+ for (auto itpm : l_tpmList)
+ {
+ auto l_physPath = (*pProcItr)->getAttr<TARGETING::ATTR_PHYS_PATH>();
+
+ auto l_tpmInfo = itpm->getAttr<TARGETING::ATTR_TPM_INFO>();
+
+ if (l_tpmInfo.i2cMasterPath == l_physPath)
+ {
+ l_notInMrw = false;
+ l_tpm = itpm;
+ break;
+ }
+ }
+
+ if (l_notInMrw)
+ {
+ uint8_t l_protectTpm = 1;
+ (*pProcItr)->setAttr<
+ TARGETING::ATTR_SECUREBOOT_PROTECT_DECONFIGURED_TPM
+ >(l_protectTpm);
+ }
+
+ const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP> l_fapiTarg(*pProcItr);
+
+ FAPI_INVOKE_HWP(err, p9_update_security_ctrl, l_fapiTarg);
+
+ if (err)
+ {
+ TRACFCOMP(ISTEPS_TRACE::g_trac_isteps_trace,
+ ERR_MRK"validateSecuritySettings - "
+ "p9_update_security_ctrl failed for processor tgt=0x%X, "
+ "TPM tgt=0x%X. Deconfiguring processor because future "
+ "security cannot be guaranteed.",
+ TARGETING::get_huid(*pProcItr),
+ TARGETING::get_huid(l_tpm));
+
+ // save the plid from the error before commiting
+ auto plid = err->plid();
+
+ ERRORLOG::ErrlUserDetailsTarget(*pProcItr).addToLog(err);
+
+ // commit this error log first before creating the new one
+ ERRORLOG::errlCommit(err, ISTEP_COMP_ID);
+
+ /*@
+ * @errortype
+ * @reasoncode ISTEP::RC_UPDATE_SECURITY_CTRL_HWP_FAIL
+ * @moduleid ISTEP::MOD_UPDATE_REDUNDANT_TPM
+ * @severity ERRL_SEV_UNRECOVERABLE
+ * @userdata1 Processor Target
+ * @userdata2 TPM Target
+ * @devdesc Failed to set SEEPROM lock and/or TPM deconfig
+ * protection for this processor, so we cannot
+ * guarrantee platform secuirty for this processor
+ * @custdesc Platform security problem detected
+ */
+ err = new ERRORLOG::ErrlEntry(ERRORLOG::ERRL_SEV_UNRECOVERABLE,
+ ISTEP::MOD_UPDATE_REDUNDANT_TPM,
+ ISTEP::RC_UPDATE_SECURITY_CTRL_HWP_FAIL,
+ TARGETING::get_huid(*pProcItr),
+ TARGETING::get_huid(l_tpm),
+ true);
+
+ err->addHwCallout(*pProcItr,
+ HWAS::SRCI_PRIORITY_LOW,
+ HWAS::DELAYED_DECONFIG,
+ HWAS::GARD_NULL);
+
+ err->collectTrace(ISTEP_COMP_NAME);
+
+ // pass on the plid from the previous error log to the new one
+ err->plid(plid);
+
+ ERRORLOG::ErrlUserDetailsTarget(*pProcItr).addToLog(err);
+
+ ERRORLOG::errlCommit(err, ISTEP_COMP_ID);
+
+ // remove the deconfigured processor from the list so that we can
+ // reuse this list later to enforce processor security state below
+ pProcItr = l_procList.erase(pProcItr);
+
+ // we don't break here. we need to continue on to the next
+ // processor and run the HWP on that one
+ }
+ else
+ {
+ TRACFCOMP(ISTEPS_TRACE::g_trac_isteps_trace,
+ "p9_update_security_ctrl successful for proc: 0x%X tpm: 0x%X",
+ TARGETING::get_huid(*pProcItr),
+ TARGETING::get_huid(l_tpm));
+ // only move on to the next processor if we didn't erase the
+ // current one, since erasing the current one automatically gives us
+ // the next one
+ ++pProcItr;
+ }
+ }
+
+ } while(0);
+ // end of p9_update_security_ctrl procedure
+
+ // Enforce Synchronized Proc Security State
+ do {
+
+ uint64_t l_mainCbs = 0;
+
+ // a list of hashes we will be using to match primary to backups and
+ // masters to slaves
+ std::vector<HashNode> l_hashes;
+
+ // master processor primary hash
+ SHA512_t l_masterHash = {0};
+
+ // master processor backup hash
+ SHA512_t l_backupHash = {0};
+
+ // slave processor primary hash (reset each time through the loop)
+ SHA512_t l_slaveHashPri = {0};
+
+ // slave processor backup hash (reset each time through the loop)
+ SHA512_t l_slaveHashBac = {0};
+
+ // nodes for the hashes vector only to be added to vector as needed
+ auto l_master = HashNode(l_masterHash, "master primary", SBE::SBE_SEEPROM0);
+ auto l_backup = HashNode(l_backupHash, "master backup", SBE::SBE_SEEPROM1);
+ auto l_slave = HashNode(l_slaveHashPri, "slave primary", SBE::SBE_SEEPROM0);
+ auto l_slaveb = HashNode(l_slaveHashBac, "slave backup", SBE::SBE_SEEPROM1);
+ // obtain the master processor target
+ TARGETING::Target* mProc = nullptr;
+ err = TARGETING::targetService().queryMasterProcChipTargetHandle(mProc);
+ if (err)
+ {
+ // if this happens we are in big trouble
+ auto rc = err->reasonCode();
+ ERRORLOG::errlCommit(err, ISTEP_COMP_ID);
+ TRACFCOMP(ISTEPS_TRACE::g_trac_isteps_trace,
+ "Terminating because future security cannot be guaranteed.");
+ INITSERVICE::doShutdown(rc);
+ break;
+ }
+
+ // read the CBS control register of the main processor
+ // (has SAB/SMD bits)
+ err = SECUREBOOT::getProcCbsControlRegister(l_mainCbs, mProc);
+ if (err)
+ {
+ auto plid = err->plid();
+ ERRORLOG::errlCommit(err, ISTEP_COMP_ID);
+
+ /*@
+ * @errortype
+ * @reasoncode ISTEP::RC_MASTER_PROC_CBS_CONTROL_READ_FAIL
+ * @moduleid ISTEP::MOD_UPDATE_REDUNDANT_TPM
+ * @userdata1 Master Processor Target
+ * @devdesc Unable to read the master processor CBS control
+ * register
+ * @custdesc Platform security problem detected
+ */
+ handleProcessorSecurityError(mProc,
+ ISTEP::RC_MASTER_PROC_CBS_CONTROL_READ_FAIL,
+ l_hashes,
+ plid,
+ false); // stop IPL and deconfig processor
+ break;
+ }
+
+ // read the primary sbe HW keys' hash for the master processor
+ err = SBE::getHwKeyHashFromSbeImage(
+ mProc,
+ EEPROM::SBE_PRIMARY,
+ l_masterHash);
+ if (err)
+ {
+ auto plid = err->plid();
+ ERRORLOG::errlCommit(err, ISTEP_COMP_ID);
+
+ /*@
+ * @errortype
+ * @reasoncode ISTEP::RC_MASTER_PROC_PRIMARY_HASH_READ_FAIL
+ * @moduleid ISTEP::MOD_UPDATE_REDUNDANT_TPM
+ * @userdata1 Master Processor Target
+ * @devdesc Unable to read the master processor primary hash
+ * from the SBE
+ * @custdesc Platform security problem detected
+ */
+ handleProcessorSecurityError(mProc,
+ ISTEP::RC_MASTER_PROC_PRIMARY_HASH_READ_FAIL,
+ l_hashes,
+ plid,
+ false); // stop IPL and deconfig processor
+ }
+
+ // read the backup sbe HW keys' hash for the master processor
+ err = SBE::getHwKeyHashFromSbeImage(
+ mProc,
+ EEPROM::SBE_BACKUP,
+ l_backupHash);
+ if (err)
+ {
+ auto plid = err->plid();
+ ERRORLOG::errlCommit(err, ISTEP_COMP_ID);
+
+ /*@
+ * @errortype
+ * @reasoncode ISTEP::RC_MASTER_PROC_BACKUP_HASH_READ_FAIL
+ * @moduleid ISTEP::MOD_UPDATE_REDUNDANT_TPM
+ * @userdata1 Processor Target
+ * @devdesc Unable to read the master processor backup hash
+ * from the SBE
+ * @custdesc Platform security problem detected
+ */
+ handleProcessorSecurityError(mProc,
+ ISTEP::RC_MASTER_PROC_BACKUP_HASH_READ_FAIL,
+ l_hashes,
+ plid,
+ false); // stop IPL and deconfig processor
+ break;
+ }
+
+ // make sure the master processor primary and backup SBE HW keys' hashes
+ // match each other
+ if (memcmp(l_masterHash,l_backupHash, SHA512_DIGEST_LENGTH)!=0)
+ {
+ // add only the hashes relevant to the error to hashes vector
+ l_hashes.push_back(l_master);
+ l_hashes.push_back(l_backup);
+
+ bool l_continue = !SECUREBOOT::enabled();
+ /*@
+ * @errortype
+ * @reasoncode ISTEP::RC_MASTER_PROC_SBE_KEYS_HASH_MISMATCH
+ * @moduleid ISTEP::MOD_UPDATE_REDUNDANT_TPM
+ * @severity ERRL_SEV_UNRECOVERABLE
+ * @userdata1 Master Processor Target
+ * @devdesc The primary SBE HW Keys' hash does not match the
+ * the backup SBE HW Keys' hash, so we cannot
+ * guarrantee platform security for the system
+ * @custdesc Platform security problem detected
+ */
+ handleProcessorSecurityError(mProc,
+ ISTEP::RC_MASTER_PROC_SBE_KEYS_HASH_MISMATCH,
+ l_hashes,
+ 0,
+ l_continue); // stop IPL if secureboot enabled
+
+ break;
+ }
+ TRACFCOMP(ISTEPS_TRACE::g_trac_isteps_trace,
+ "Master Primary SBE HW keys' hash successfully matches backup.");
+
+ for(auto pProc : l_procList)
+ {
+ uint64_t l_procCbs = 0;
+
+ if (mProc == pProc)
+ {
+ // skip the master processor
+ continue;
+ }
+
+ // start with empty slave hashes each time through the loop
+ memset(l_slaveHashPri,0,SHA512_DIGEST_LENGTH);
+ memset(l_slaveHashBac,0,SHA512_DIGEST_LENGTH);
+
+ // read the CBS control register of the current processor
+ err = SECUREBOOT::getProcCbsControlRegister(l_procCbs, pProc);
+ if (err)
+ {
+ auto plid = err->plid();
+ ERRORLOG::errlCommit(err, ISTEP_COMP_ID);
+
+ /*@
+ * @errortype
+ * @reasoncode ISTEP::RC_SLAVE_PROC_CBS_CONTROL_READ_FAIL
+ * @moduleid ISTEP::MOD_UPDATE_REDUNDANT_TPM
+ * @userdata1 Slave Processor Target
+ * @devdesc Unable to read the slave processor CBS control
+ * register
+ *
+ * @custdesc Platform security problem detected
+ */
+ handleProcessorSecurityError(pProc,
+ ISTEP::RC_SLAVE_PROC_CBS_CONTROL_READ_FAIL,
+ l_hashes,
+ plid,
+ true); // deconfigure proc and move on
+ continue;
+ }
+
+ // read the primary sbe HW keys' hash for the current processor
+ err = SBE::getHwKeyHashFromSbeImage(
+ pProc,
+ EEPROM::SBE_PRIMARY,
+ l_slaveHashPri);
+ if (err)
+ {
+ auto plid = err->plid();
+ ERRORLOG::errlCommit(err, ISTEP_COMP_ID);
+
+ /*@
+ * @errortype
+ * @reasoncode ISTEP::RC_SLAVE_PROC_PRIMARY_HASH_READ_FAIL
+ * @moduleid ISTEP::MOD_UPDATE_REDUNDANT_TPM
+ * @userdata1 Slave Processor Target
+ * @devdesc Unable to read the slave processor primary
+ * hash from the SBE
+ * @custdesc Platform security problem detected
+ */
+ handleProcessorSecurityError(pProc,
+ ISTEP::RC_SLAVE_PROC_PRIMARY_HASH_READ_FAIL,
+ l_hashes,
+ plid,
+ true); // deconfigure proc and move on
+ continue;
+ }
+
+ // read the backup sbe HW keys' hash for the current processor
+ err = SBE::getHwKeyHashFromSbeImage(
+ pProc,
+ EEPROM::SBE_BACKUP,
+ l_slaveHashBac);
+ if (err)
+ {
+ auto plid = err->plid();
+ ERRORLOG::errlCommit(err, ISTEP_COMP_ID);
+
+ /*@
+ * @errortype
+ * @reasoncode ISTEP::RC_SLAVE_PROC_BACKUP_HASH_READ_FAIL
+ * @moduleid ISTEP::MOD_UPDATE_REDUNDANT_TPM
+ * @userdata1 Slave Processor Target
+ * @devdesc Unable to read the slave processor backup
+ * hash from the SBE
+ * @custdesc Platform security problem detected
+ */
+ handleProcessorSecurityError(pProc,
+ ISTEP::RC_SLAVE_PROC_BACKUP_HASH_READ_FAIL,
+ l_hashes,
+ plid,
+ true); // deconfigure proc and move on
+
+ continue;
+ }
+
+ // If the current processor has a key or SAB mismatch
+ // then throw a terminate error. For SMD mismatch we throw
+ // an informational error
+ Mismatches l_mismatches = {0};
+
+ // SAB bit mismatch
+ l_mismatches.sabmis =
+ (SECUREBOOT::ProcCbsControl::SabBit & l_mainCbs) !=
+ (SECUREBOOT::ProcCbsControl::SabBit & l_procCbs);
+
+ // Jumper state mismatch
+ l_mismatches.smdmis =
+ (SECUREBOOT::ProcCbsControl::JumperStateBit & l_mainCbs) !=
+ (SECUREBOOT::ProcCbsControl::JumperStateBit & l_procCbs);
+
+ // primary sbe hash mismatch
+ l_mismatches.primis = memcmp(l_slaveHashPri,
+ l_masterHash,
+ SHA512_DIGEST_LENGTH) != 0;
+
+ // backup sbe hash mismatch
+ l_mismatches.bacmis = memcmp(l_slaveHashBac,
+ l_masterHash,
+ SHA512_DIGEST_LENGTH) != 0;
+
+ // only provide the relevant hashes for error handling cases
+ if(l_mismatches.primis || l_mismatches.bacmis)
+ {
+ l_hashes.push_back(l_master);
+ }
+ if(l_mismatches.primis)
+ {
+ l_hashes.push_back(l_slave);
+ }
+ if(l_mismatches.bacmis)
+ {
+ l_hashes.push_back(l_slaveb);
+ }
+
+ // if there was any mismatch
+ if (l_mismatches.val)
+ {
+ auto l_continue = true;
+ // do not continue booting if there is a SAB mismatch under any
+ // circumstance
+ if (l_mismatches.sabmis)
+ {
+ l_continue = false;
+ }
+ // In secure mode, do not continue booting when SBE HW keys' hashes
+ // are mismatched
+ if ((l_mismatches.primis || l_mismatches.bacmis)
+ && SECUREBOOT::enabled())
+ {
+ l_continue = false;
+ }
+
+ /*@
+ * @errortype
+ * @reasoncode ISTEP::RC_PROC_SECURITY_STATE_MISMATCH
+ * @moduleid ISTEP::MOD_UPDATE_REDUNDANT_TPM
+ * @userdata1 Processor Target
+ * @userdata2[60:60] SAB bit mismatch
+ * @userdata2[61:61] Jumper (SMD) bit mismatch
+ * @userdata2[62:62] Primary SBE hash mismatch
+ * @userdata2[63:63] Backup SBE hash mismatch
+ * @devdesc Mismatch processor state was detected for this
+ * processor, so we cannot guarrantee platform
+ * security for the system
+ * @custdesc Platform security problem detected
+ */
+ handleProcessorSecurityError(pProc,
+ ISTEP::RC_PROC_SECURITY_STATE_MISMATCH,
+ l_hashes,
+ 0,
+ l_continue,
+ l_mismatches);
+
+ // In non-secure mode, look for other inconsistencies and log the
+ // issues
+ if (l_continue)
+ {
+ continue;
+ }
+ // In secure mode, stop checking for proc security state mismatches
+ // as soon as a mismatch has been found
+ break;
+ }
+
+ }
+
+ } while(0);
+
+ #endif // CONFIG_SECUREBOOT
+
+ TRACFCOMP(ISTEPS_TRACE::g_trac_isteps_trace,
+ EXIT_MRK"validateSecuritySettings");
+}
+
+
//*****************************************************************************
// call_host_set_voltages()
//*****************************************************************************
@@ -58,6 +790,8 @@ void* call_host_set_voltages(void *io_pArgs)
TRACFCOMP(ISTEPS_TRACE::g_trac_isteps_trace,
"call_host_set_voltages enter");
+ validateSecuritySettings();
+
errlHndl_t l_err = NULL;
TargetHandleList l_procList;
IStepError l_stepError;
diff --git a/src/usr/isteps/istep10/call_host_update_redundant_tpm.C b/src/usr/isteps/istep10/call_host_update_redundant_tpm.C
index d91e723f8..af6030891 100644
--- a/src/usr/isteps/istep10/call_host_update_redundant_tpm.C
+++ b/src/usr/isteps/istep10/call_host_update_redundant_tpm.C
@@ -37,704 +37,16 @@
#include <config.h>
#include <util/align.H>
#include <util/algorithm.H>
-
-// Fapi Support
-#include <fapi2.H>
-#include <target_types.H>
-#include <plat_hwp_invoker.H>
-#include <attributeenums.H>
#include <istepHelperFuncs.H>
-// HWP
-#include <p9_update_security_ctrl.H>
-
-// secure boot
-#include <secureboot/service.H>
-#include <secureboot/settings.H>
-#include <i2c/eepromif.H>
-#include <sbe/sbeif.H>
-#include "../../secureboot/common/errlud_secure.H"
-#include <sbe/sbe_update.H>
-
namespace ISTEP_10
{
-#ifdef CONFIG_SECUREBOOT
-/**
- * @brief This structure associates SBE HW keys' hashes with names and SBE sides
- */
-struct HashNode
-{
- uint8_t* hash; /** SBE HW keys' hash for the named side */
- const char* name; /** Name of the side: either primary or backup */
- uint8_t side; /** A uint8_t value of 0 for primary or 1 for backup */
- HashNode(uint8_t* i_hash,
- const char* i_name,
- uint8_t i_side) : hash(i_hash), name(i_name), side(i_side)
- {
- }
-};
-
-/**
- * @brief This union simplifies bitwise operations for tracking the four
- * conditions of mismatch when matching security settings of a slave processor
- * with that of the master processor.
- */
-union Mismatches
-{
- uint8_t val;
- struct {
- uint8_t reserved : 4; /** unused */
- uint8_t sabmis : 1; /** Value of 1 indicates the SAB bit didn't match,
- * 0 otherwise.
- */
- uint8_t smdmis : 1; /** Value of 1 indicates the SMD bit did not match,
- * 0 otherwise.
- */
- uint8_t primis : 1; /** Value of 1 indicates the primary SBE HW key's
- * did not match, 0 otherwise.
- */
- uint8_t bacmis : 1; /** Value of 1 indicates the backup SBE HW key's
- * did not match, 0 otherwise.
- */
- };
-};
-
-/** @brief Handle a processor security error.
- * @par Detailed Description:
- * Puts all the error handling for mismatched processor security
- * settings in one place in order to minimize code footprint. This
- * highly-specialized function is not intended for public consumption.
- * @param[in] i_pProc The target processor whose secure processor settings are
- * exhibiting a problem. Must not be null.
- * @param[in] i_rc The reason code of the error to be handled.
- * @param[in] i_hashes A vector containing hash/string/side triples, where
- * the string indicates the name of the hash, and the side refers to the
- * SBE side that the hash was taken from.
- * @param[in] i_plid If non zero this plid from a previous error will be linked
- * To the error created by this function, ignored otherwise.
- * @param[in] i_continue A boolean indicating whether hostboot should continue
- * booting (and deconfigure the processor) or stop the IPL.
- * @param[in] i_mismatches A bitstring of mismatch bits of type Mismatches
- * corresponding to a mismatch of the SAB or SMD register or primary or
- * secondary SBE HW Keys' Hash between the supplied target and the master
- * processor. Optional parameter is for the RC_PROC_SECURITY_STATE_MISMATCH
- * case only and must be left as default (value of 0) for all other cases.
- */
-void handleProcessorSecurityError(TARGETING::Target* i_pProc,
- ISTEP::istepReasonCode i_rc,
- const std::vector<HashNode>& i_hashes,
- uint16_t i_plid,
- bool i_continue,
- Mismatches i_mismatches={0})
-{
- using namespace ISTEP;
-
- // stop the caller from passing a null target
- assert(i_pProc != nullptr, "Bug! Target pointer must not be null");
-
- // make sure that caller is using the Mismatches parameter at the right time
- assert( (i_rc!=RC_PROC_SECURITY_STATE_MISMATCH && !i_mismatches.val) ||
- (i_rc==RC_PROC_SECURITY_STATE_MISMATCH && i_mismatches.val),
- "Mismatches parameter is for RC_PROC_SECURITY_STATE_MISMATCH only");
-
- ERRORLOG::errlSeverity_t l_severity = ERRORLOG::ERRL_SEV_UNRECOVERABLE;
-
- if (i_rc==RC_MASTER_PROC_SBE_KEYS_HASH_MISMATCH ||
- i_rc==RC_PROC_SECURITY_STATE_MISMATCH)
- {
- if (i_rc==RC_PROC_SECURITY_STATE_MISMATCH)
- {
- TRACFCOMP(ISTEPS_TRACE::g_trac_isteps_trace,
- ERR_MRK"call_host_update_redundant_tpm - handleProcessorSecurityError processor state does match master for processor tgt=0x%X",
- TARGETING::get_huid(i_pProc));
-
- TRACFCOMP(ISTEPS_TRACE::g_trac_isteps_trace,
- "SMD is a %smatch", i_mismatches.smdmis? "mis": "");
- TRACFCOMP(ISTEPS_TRACE::g_trac_isteps_trace,
- "SAB is a %smatch", i_mismatches.sabmis? "mis": "");
- TRACFCOMP(ISTEPS_TRACE::g_trac_isteps_trace,
- "Primary SBE hash is a %smatch",
- i_mismatches.primis? "mis": "");
- TRACFCOMP(ISTEPS_TRACE::g_trac_isteps_trace,
- "Backup SBE hash is a %smatch",
- i_mismatches.bacmis? "mis": "");
- }
- else // master proc sbe keys' hash mismatch
- {
- TRACFCOMP(ISTEPS_TRACE::g_trac_isteps_trace,
- ERR_MRK"call_host_update_redundant_tpm - handleProcessorSecurityError: Master processor sbe keys' hash doesn't match master backup sbe key's hash");
- }
-
- // Log as informational if secure boot is disabled
- if (!SECUREBOOT::enabled())
- {
- l_severity = ERRORLOG::ERRL_SEV_INFORMATIONAL;
- }
- }
- else
- {
- TRACFCOMP(ISTEPS_TRACE::g_trac_isteps_trace,
- "call_host_update_redundant_tpm - handleProcessorSecurityError: Istep error occurred, reason code 0x%X"
- ,i_rc);
- TRACDCOMP(ISTEPS_TRACE::g_trac_isteps_trace,
- ERR_MRK"call_host_update_redundant_tpm - handleProcessorSecurityError: %s fail",
- i_rc==RC_MASTER_PROC_PRIMARY_HASH_READ_FAIL?"Master primary hash read":
- i_rc==RC_MASTER_PROC_BACKUP_HASH_READ_FAIL?"Master backup hash read":
- i_rc==RC_MASTER_PROC_CBS_CONTROL_READ_FAIL?"Master CBS control read":
- i_rc==RC_SLAVE_PROC_PRIMARY_HASH_READ_FAIL?"Slave primary hash read":
- i_rc==RC_SLAVE_PROC_BACKUP_HASH_READ_FAIL?"Slave backup hash read":
- i_rc==RC_SLAVE_PROC_CBS_CONTROL_READ_FAIL?"Slave CBS control read":
- "unknown");
- }
-
- auto err = new ERRORLOG::ErrlEntry(l_severity,
- ISTEP::MOD_UPDATE_REDUNDANT_TPM,
- i_rc,
- TARGETING::get_huid(i_pProc),
- TO_UINT64(i_mismatches.val),
- true);
-
- // if a plid was given, link it to the new error.
- if (i_plid)
- {
- err->plid(i_plid);
- }
-
- err->collectTrace(ISTEP_COMP_NAME);
-
- ERRORLOG::ErrlUserDetailsTarget(i_pProc).addToLog(err);
-
- // Add Security related user details
- SECUREBOOT::addSecureUserDetailsToErrolog(err);
-
- // add hashes to log and traces
- for(auto& hsh : i_hashes)
- {
- TRACFCOMP(ISTEPS_TRACE::g_trac_isteps_trace, ERR_MRK"call_host_update_redundant_tpm - handleProcessorSecurityError - %s hash: ", hsh.name);
- TRACFBIN(ISTEPS_TRACE::g_trac_isteps_trace,
- "Data = ",
- reinterpret_cast<void*>(hsh.hash),
- SHA512_DIGEST_LENGTH);
- SECUREBOOT::UdTargetHwKeyHash(
- i_pProc,
- hsh.side,
- hsh.hash).addToLog(err);
- }
-
- if (i_continue)
- {
- err->addHwCallout(i_pProc,
- HWAS::SRCI_PRIORITY_LOW,
- i_mismatches.val && // for any mismatch
- !RC_MASTER_PROC_SBE_KEYS_HASH_MISMATCH?
- HWAS::NO_DECONFIG: // don't deconfig the processor
- HWAS::DELAYED_DECONFIG,
- HWAS::GARD_NULL);
- }
-
- // save off reason code before committing
- auto l_reason = err->reasonCode();
-
- ERRORLOG::errlCommit(err, ISTEP_COMP_ID);
-
- if (!i_continue)
- {
- TRACFCOMP(ISTEPS_TRACE::g_trac_isteps_trace,
- "Terminating because future security cannot be guaranteed.");
- INITSERVICE::doShutdown(l_reason);
- }
-}
-#endif
-
void* call_host_update_redundant_tpm (void *io_pArgs)
{
TRACFCOMP(ISTEPS_TRACE::g_trac_isteps_trace,
ENTER_MRK"call_host_update_redundant_tpm");
- errlHndl_t err = nullptr;
-
- // Before update procedure, trace security settings
- err = SECUREBOOT::traceSecuritySettings();
- if (err)
- {
- TRACFCOMP( ISTEPS_TRACE::g_trac_isteps_trace,
- "call_host_update_redundant_tpm: Error back from "
- "SECUREBOOT::traceSecuritySettings: rc=0x%X, plid=0x%X",
- ERRL_GETRC_SAFE(err), ERRL_GETPLID_SAFE(err));
-
- // Commit log, but continue
- ERRORLOG::errlCommit( err, SECURE_COMP_ID );
- }
-
- // Start of update procedure
- #ifdef CONFIG_SECUREBOOT
-
- bool l_force = false;
-
- TARGETING::TargetHandleList l_procList;
- getAllChips(l_procList,TARGETING::TYPE_PROC,true);
-
- // call p9_update_security_ctrl.C HWP
- do {
-
- if (!SECUREBOOT::enabled() && !l_force)
- {
- break;
- }
-
- TARGETING::TargetHandleList l_tpmList;
- getAllChips(l_tpmList,TARGETING::TYPE_TPM,false);
-
- // loop through the processors
- auto pProcItr = l_procList.begin();
- while (pProcItr != l_procList.end())
- {
- bool l_notInMrw = true;
- TARGETING::Target* l_tpm = nullptr;
-
- // check if processor has a TPM according to the mrw
-
- // for each TPM in the list compare i2c master path with
- // the path of the current processor
- for (auto itpm : l_tpmList)
- {
- auto l_physPath = (*pProcItr)->getAttr<TARGETING::ATTR_PHYS_PATH>();
-
- auto l_tpmInfo = itpm->getAttr<TARGETING::ATTR_TPM_INFO>();
-
- if (l_tpmInfo.i2cMasterPath == l_physPath)
- {
- l_notInMrw = false;
- l_tpm = itpm;
- break;
- }
- }
-
- if (l_notInMrw)
- {
- uint8_t l_protectTpm = 1;
- (*pProcItr)->setAttr<
- TARGETING::ATTR_SECUREBOOT_PROTECT_DECONFIGURED_TPM
- >(l_protectTpm);
- }
-
- const fapi2::Target<fapi2::TARGET_TYPE_PROC_CHIP> l_fapiTarg(*pProcItr);
-
- FAPI_INVOKE_HWP(err, p9_update_security_ctrl, l_fapiTarg);
-
- if (err)
- {
- TRACFCOMP(ISTEPS_TRACE::g_trac_isteps_trace,
- ERR_MRK"call_host_update_redundant_tpm - "
- "p9_update_security_ctrl failed for processor tgt=0x%X, "
- "TPM tgt=0x%X. Deconfiguring processor because future "
- "security cannot be guaranteed.",
- TARGETING::get_huid(*pProcItr),
- TARGETING::get_huid(l_tpm));
-
- // save the plid from the error before commiting
- auto plid = err->plid();
-
- ERRORLOG::ErrlUserDetailsTarget(*pProcItr).addToLog(err);
-
- // commit this error log first before creating the new one
- ERRORLOG::errlCommit(err, ISTEP_COMP_ID);
-
- /*@
- * @errortype
- * @reasoncode ISTEP::RC_UPDATE_SECURITY_CTRL_HWP_FAIL
- * @moduleid ISTEP::MOD_UPDATE_REDUNDANT_TPM
- * @severity ERRL_SEV_UNRECOVERABLE
- * @userdata1 Processor Target
- * @userdata2 TPM Target
- * @devdesc Failed to set SEEPROM lock and/or TPM deconfig
- * protection for this processor, so we cannot
- * guarrantee platform secuirty for this processor
- * @custdesc Platform security problem detected
- */
- err = new ERRORLOG::ErrlEntry(ERRORLOG::ERRL_SEV_UNRECOVERABLE,
- ISTEP::MOD_UPDATE_REDUNDANT_TPM,
- ISTEP::RC_UPDATE_SECURITY_CTRL_HWP_FAIL,
- TARGETING::get_huid(*pProcItr),
- TARGETING::get_huid(l_tpm),
- true);
-
- err->addHwCallout(*pProcItr,
- HWAS::SRCI_PRIORITY_LOW,
- HWAS::DELAYED_DECONFIG,
- HWAS::GARD_NULL);
-
- err->collectTrace(ISTEP_COMP_NAME);
-
- // pass on the plid from the previous error log to the new one
- err->plid(plid);
-
- ERRORLOG::ErrlUserDetailsTarget(*pProcItr).addToLog(err);
-
- ERRORLOG::errlCommit(err, ISTEP_COMP_ID);
-
- // remove the deconfigured processor from the list so that we can
- // reuse this list later to enforce processor security state below
- pProcItr = l_procList.erase(pProcItr);
-
- // we don't break here. we need to continue on to the next
- // processor and run the HWP on that one
- }
- else
- {
- TRACFCOMP(ISTEPS_TRACE::g_trac_isteps_trace,
- "p9_update_security_ctrl successful for proc: 0x%X tpm: 0x%X",
- TARGETING::get_huid(*pProcItr),
- TARGETING::get_huid(l_tpm));
- // only move on to the next processor if we didn't erase the
- // current one, since erasing the current one automatically gives us
- // the next one
- ++pProcItr;
- }
- }
-
- } while(0);
- // end of p9_update_security_ctrl procedure
-
- // Enforce Synchronized Proc Security State
- do {
-
- uint64_t l_mainCbs = 0;
-
- // a list of hashes we will be using to match primary to backups and
- // masters to slaves
- std::vector<HashNode> l_hashes;
-
- // master processor primary hash
- SHA512_t l_masterHash = {0};
-
- // master processor backup hash
- SHA512_t l_backupHash = {0};
-
- // slave processor primary hash (reset each time through the loop)
- SHA512_t l_slaveHashPri = {0};
-
- // slave processor backup hash (reset each time through the loop)
- SHA512_t l_slaveHashBac = {0};
-
- // nodes for the hashes vector only to be added to vector as needed
- auto l_master = HashNode(l_masterHash, "master primary", SBE::SBE_SEEPROM0);
- auto l_backup = HashNode(l_backupHash, "master backup", SBE::SBE_SEEPROM1);
- auto l_slave = HashNode(l_slaveHashPri, "slave primary", SBE::SBE_SEEPROM0);
- auto l_slaveb = HashNode(l_slaveHashBac, "slave backup", SBE::SBE_SEEPROM1);
- // obtain the master processor target
- TARGETING::Target* mProc = nullptr;
- err = TARGETING::targetService().queryMasterProcChipTargetHandle(mProc);
- if (err)
- {
- // if this happens we are in big trouble
- auto rc = err->reasonCode();
- ERRORLOG::errlCommit(err, ISTEP_COMP_ID);
- TRACFCOMP(ISTEPS_TRACE::g_trac_isteps_trace,
- "Terminating because future security cannot be guaranteed.");
- INITSERVICE::doShutdown(rc);
- break;
- }
-
- // read the CBS control register of the main processor
- // (has SAB/SMD bits)
- err = SECUREBOOT::getProcCbsControlRegister(l_mainCbs, mProc);
- if (err)
- {
- auto plid = err->plid();
- ERRORLOG::errlCommit(err, ISTEP_COMP_ID);
-
- /*@
- * @errortype
- * @reasoncode ISTEP::RC_MASTER_PROC_CBS_CONTROL_READ_FAIL
- * @moduleid ISTEP::MOD_UPDATE_REDUNDANT_TPM
- * @userdata1 Master Processor Target
- * @devdesc Unable to read the master processor CBS control
- * register
- * @custdesc Platform security problem detected
- */
- handleProcessorSecurityError(mProc,
- ISTEP::RC_MASTER_PROC_CBS_CONTROL_READ_FAIL,
- l_hashes,
- plid,
- false); // stop IPL and deconfig processor
- break;
- }
-
- // read the primary sbe HW keys' hash for the master processor
- err = SBE::getHwKeyHashFromSbeImage(
- mProc,
- EEPROM::SBE_PRIMARY,
- l_masterHash);
- if (err)
- {
- auto plid = err->plid();
- ERRORLOG::errlCommit(err, ISTEP_COMP_ID);
-
- /*@
- * @errortype
- * @reasoncode ISTEP::RC_MASTER_PROC_PRIMARY_HASH_READ_FAIL
- * @moduleid ISTEP::MOD_UPDATE_REDUNDANT_TPM
- * @userdata1 Master Processor Target
- * @devdesc Unable to read the master processor primary hash
- * from the SBE
- * @custdesc Platform security problem detected
- */
- handleProcessorSecurityError(mProc,
- ISTEP::RC_MASTER_PROC_PRIMARY_HASH_READ_FAIL,
- l_hashes,
- plid,
- false); // stop IPL and deconfig processor
- }
-
- // read the backup sbe HW keys' hash for the master processor
- err = SBE::getHwKeyHashFromSbeImage(
- mProc,
- EEPROM::SBE_BACKUP,
- l_backupHash);
- if (err)
- {
- auto plid = err->plid();
- ERRORLOG::errlCommit(err, ISTEP_COMP_ID);
-
- /*@
- * @errortype
- * @reasoncode ISTEP::RC_MASTER_PROC_BACKUP_HASH_READ_FAIL
- * @moduleid ISTEP::MOD_UPDATE_REDUNDANT_TPM
- * @userdata1 Processor Target
- * @devdesc Unable to read the master processor backup hash
- * from the SBE
- * @custdesc Platform security problem detected
- */
- handleProcessorSecurityError(mProc,
- ISTEP::RC_MASTER_PROC_BACKUP_HASH_READ_FAIL,
- l_hashes,
- plid,
- false); // stop IPL and deconfig processor
- break;
- }
-
- // make sure the master processor primary and backup SBE HW keys' hashes
- // match each other
- if (memcmp(l_masterHash,l_backupHash, SHA512_DIGEST_LENGTH)!=0)
- {
- // add only the hashes relevant to the error to hashes vector
- l_hashes.push_back(l_master);
- l_hashes.push_back(l_backup);
-
- bool l_continue = !SECUREBOOT::enabled();
- /*@
- * @errortype
- * @reasoncode ISTEP::RC_MASTER_PROC_SBE_KEYS_HASH_MISMATCH
- * @moduleid ISTEP::MOD_UPDATE_REDUNDANT_TPM
- * @severity ERRL_SEV_UNRECOVERABLE
- * @userdata1 Master Processor Target
- * @devdesc The primary SBE HW Keys' hash does not match the
- * the backup SBE HW Keys' hash, so we cannot
- * guarrantee platform security for the system
- * @custdesc Platform security problem detected
- */
- handleProcessorSecurityError(mProc,
- ISTEP::RC_MASTER_PROC_SBE_KEYS_HASH_MISMATCH,
- l_hashes,
- 0,
- l_continue); // stop IPL if secureboot enabled
-
- break;
- }
- TRACFCOMP(ISTEPS_TRACE::g_trac_isteps_trace,
- "Master Primary SBE HW keys' hash successfully matches backup.");
-
- for(auto pProc : l_procList)
- {
- uint64_t l_procCbs = 0;
-
- if (mProc == pProc)
- {
- // skip the master processor
- continue;
- }
-
- // start with empty slave hashes each time through the loop
- memset(l_slaveHashPri,0,SHA512_DIGEST_LENGTH);
- memset(l_slaveHashBac,0,SHA512_DIGEST_LENGTH);
-
- // read the CBS control register of the current processor
- err = SECUREBOOT::getProcCbsControlRegister(l_procCbs, pProc);
- if (err)
- {
- auto plid = err->plid();
- ERRORLOG::errlCommit(err, ISTEP_COMP_ID);
-
- /*@
- * @errortype
- * @reasoncode ISTEP::RC_SLAVE_PROC_CBS_CONTROL_READ_FAIL
- * @moduleid ISTEP::MOD_UPDATE_REDUNDANT_TPM
- * @userdata1 Slave Processor Target
- * @devdesc Unable to read the slave processor CBS control
- * register
- *
- * @custdesc Platform security problem detected
- */
- handleProcessorSecurityError(pProc,
- ISTEP::RC_SLAVE_PROC_CBS_CONTROL_READ_FAIL,
- l_hashes,
- plid,
- true); // deconfigure proc and move on
- continue;
- }
-
- // read the primary sbe HW keys' hash for the current processor
- err = SBE::getHwKeyHashFromSbeImage(
- pProc,
- EEPROM::SBE_PRIMARY,
- l_slaveHashPri);
- if (err)
- {
- auto plid = err->plid();
- ERRORLOG::errlCommit(err, ISTEP_COMP_ID);
-
- /*@
- * @errortype
- * @reasoncode ISTEP::RC_SLAVE_PROC_PRIMARY_HASH_READ_FAIL
- * @moduleid ISTEP::MOD_UPDATE_REDUNDANT_TPM
- * @userdata1 Slave Processor Target
- * @devdesc Unable to read the slave processor primary
- * hash from the SBE
- * @custdesc Platform security problem detected
- */
- handleProcessorSecurityError(pProc,
- ISTEP::RC_SLAVE_PROC_PRIMARY_HASH_READ_FAIL,
- l_hashes,
- plid,
- true); // deconfigure proc and move on
- continue;
- }
-
- // read the backup sbe HW keys' hash for the current processor
- err = SBE::getHwKeyHashFromSbeImage(
- pProc,
- EEPROM::SBE_BACKUP,
- l_slaveHashBac);
- if (err)
- {
- auto plid = err->plid();
- ERRORLOG::errlCommit(err, ISTEP_COMP_ID);
-
- /*@
- * @errortype
- * @reasoncode ISTEP::RC_SLAVE_PROC_BACKUP_HASH_READ_FAIL
- * @moduleid ISTEP::MOD_UPDATE_REDUNDANT_TPM
- * @userdata1 Slave Processor Target
- * @devdesc Unable to read the slave processor backup
- * hash from the SBE
- * @custdesc Platform security problem detected
- */
- handleProcessorSecurityError(pProc,
- ISTEP::RC_SLAVE_PROC_BACKUP_HASH_READ_FAIL,
- l_hashes,
- plid,
- true); // deconfigure proc and move on
-
- continue;
- }
-
- // If the current processor has a key or SAB mismatch
- // then throw a terminate error. For SMD mismatch we throw
- // an informational error
- Mismatches l_mismatches = {0};
-
- // SAB bit mismatch
- l_mismatches.sabmis =
- (SECUREBOOT::ProcCbsControl::SabBit & l_mainCbs) !=
- (SECUREBOOT::ProcCbsControl::SabBit & l_procCbs);
-
- // Jumper state mismatch
- l_mismatches.smdmis =
- (SECUREBOOT::ProcCbsControl::JumperStateBit & l_mainCbs) !=
- (SECUREBOOT::ProcCbsControl::JumperStateBit & l_procCbs);
-
- // primary sbe hash mismatch
- l_mismatches.primis = memcmp(l_slaveHashPri,
- l_masterHash,
- SHA512_DIGEST_LENGTH) != 0;
-
- // backup sbe hash mismatch
- l_mismatches.bacmis = memcmp(l_slaveHashBac,
- l_masterHash,
- SHA512_DIGEST_LENGTH) != 0;
-
- // only provide the relevant hashes for error handling cases
- if(l_mismatches.primis || l_mismatches.bacmis)
- {
- l_hashes.push_back(l_master);
- }
- if(l_mismatches.primis)
- {
- l_hashes.push_back(l_slave);
- }
- if(l_mismatches.bacmis)
- {
- l_hashes.push_back(l_slaveb);
- }
-
- // if there was any mismatch
- if (l_mismatches.val)
- {
- auto l_continue = true;
- // do not continue booting if there is a SAB mismatch under any
- // circumstance
- if (l_mismatches.sabmis)
- {
- l_continue = false;
- }
- // In secure mode, do not continue booting when SBE HW keys' hashes
- // are mismatched
- if ((l_mismatches.primis || l_mismatches.bacmis)
- && SECUREBOOT::enabled())
- {
- l_continue = false;
- }
-
- /*@
- * @errortype
- * @reasoncode ISTEP::RC_PROC_SECURITY_STATE_MISMATCH
- * @moduleid ISTEP::MOD_UPDATE_REDUNDANT_TPM
- * @userdata1 Processor Target
- * @userdata2[60:60] SAB bit mismatch
- * @userdata2[61:61] Jumper (SMD) bit mismatch
- * @userdata2[62:62] Primary SBE hash mismatch
- * @userdata2[63:63] Backup SBE hash mismatch
- * @devdesc Mismatch processor state was detected for this
- * processor, so we cannot guarrantee platform
- * security for the system
- * @custdesc Platform security problem detected
- */
- handleProcessorSecurityError(pProc,
- ISTEP::RC_PROC_SECURITY_STATE_MISMATCH,
- l_hashes,
- 0,
- l_continue,
- l_mismatches);
-
- // In non-secure mode, look for other inconsistencies and log the
- // issues
- if (l_continue)
- {
- continue;
- }
- // In secure mode, stop checking for proc security state mismatches
- // as soon as a mismatch has been found
- break;
- }
-
- }
-
- } while(0);
-
- #endif // CONFIG_SECUREBOOT
-
TRACFCOMP(ISTEPS_TRACE::g_trac_isteps_trace,
EXIT_MRK"call_host_update_redundant_tpm");
OpenPOWER on IntegriCloud