This external input must be validated carefully to avoid security issue like\r
buffer overflow, integer overflow.\r
Variable attribute should also be checked to avoid authentication bypass.\r
+ The whole SMM authentication variable design relies on the integrity of flash part and SMM.\r
+ which is assumed to be protected by platform. All variable code and metadata in flash/SMM Memory\r
+ may not be modified without authorization. If platform fails to protect these resources,\r
+ the authentication service provided in this driver will be broken, and the behavior is undefined.\r
\r
ProcessVarWithPk(), ProcessVarWithKek() and ProcessVariable() are the function to do\r
variable authentication.\r
///\r
/// Global database array for scratch\r
///\r
-UINT8 mPubKeyStore[MAX_KEYDB_SIZE];\r
+UINT8 *mPubKeyStore;\r
UINT32 mPubKeyNumber;\r
-UINT8 mCertDbStore[MAX_CERTDB_SIZE];\r
+UINT32 mMaxKeyNumber;\r
+UINT32 mMaxKeyDbSize;\r
+UINT8 *mCertDbStore;\r
+UINT32 mMaxCertDbSize;\r
UINT32 mPlatformMode;\r
UINT8 mVendorKeyState;\r
\r
{EFI_CERT_X509_GUID, 0, ((UINT32) ~0)},\r
{EFI_CERT_SHA224_GUID, 0, 28 },\r
{EFI_CERT_SHA384_GUID, 0, 48 },\r
- {EFI_CERT_SHA512_GUID, 0, 64 }\r
+ {EFI_CERT_SHA512_GUID, 0, 64 },\r
+ {EFI_CERT_X509_SHA256_GUID, 0, 48 },\r
+ {EFI_CERT_X509_SHA384_GUID, 0, 64 },\r
+ {EFI_CERT_X509_SHA512_GUID, 0, 80 }\r
};\r
\r
/**\r
\r
@retval TRUE This variable is protected, only a physical present user could set this variable.\r
@retval FALSE This variable is not protected.\r
- \r
+\r
**/\r
BOOLEAN\r
NeedPhysicallyPresent(\r
|| (CompareGuid (VendorGuid, &gEfiCustomModeEnableGuid) && (StrCmp (VariableName, EFI_CUSTOM_MODE_NAME) == 0))) {\r
return TRUE;\r
}\r
- \r
+\r
return FALSE;\r
}\r
\r
if (Variable.CurrPtr != NULL && *(GetVariableDataPtr (Variable.CurrPtr)) == CUSTOM_SECURE_BOOT_MODE) {\r
return TRUE;\r
}\r
- \r
+\r
return FALSE;\r
}\r
\r
return EFI_OUT_OF_RESOURCES;\r
}\r
\r
+ //\r
+ // Reserve runtime buffer for public key database. The size excludes variable header and name size.\r
+ //\r
+ mMaxKeyDbSize = PcdGet32 (PcdMaxVariableSize) - sizeof (VARIABLE_HEADER) - sizeof (AUTHVAR_KEYDB_NAME);\r
+ mMaxKeyNumber = mMaxKeyDbSize / EFI_CERT_TYPE_RSA2048_SIZE;\r
+ mPubKeyStore = AllocateRuntimePool (mMaxKeyDbSize);\r
+ if (mPubKeyStore == NULL) {\r
+ return EFI_OUT_OF_RESOURCES;\r
+ }\r
+\r
+ //\r
+ // Reserve runtime buffer for certificate database. The size excludes variable header and name size.\r
+ //\r
+ mMaxCertDbSize = PcdGet32 (PcdMaxVariableSize) - sizeof (VARIABLE_HEADER) - sizeof (EFI_CERT_DB_NAME);\r
+ mCertDbStore = AllocateRuntimePool (mMaxCertDbSize);\r
+ if (mCertDbStore == NULL) {\r
+ return EFI_OUT_OF_RESOURCES;\r
+ }\r
+\r
//\r
// Prepare runtime buffer for serialized data of time-based authenticated\r
// Variable, i.e. (VariableName, VendorGuid, Attributes, TimeStamp, Data).\r
DataSize = DataSizeOfVariable (Variable.CurrPtr);\r
Data = GetVariableDataPtr (Variable.CurrPtr);\r
ASSERT ((DataSize != 0) && (Data != NULL));\r
+ //\r
+ // "AuthVarKeyDatabase" is an internal variable. Its DataSize is always ensured not to exceed mPubKeyStore buffer size(See definition before)\r
+ // Therefore, there is no memory overflow in underlying CopyMem.\r
+ //\r
CopyMem (mPubKeyStore, (UINT8 *) Data, DataSize);\r
mPubKeyNumber = (UINT32) (DataSize / EFI_CERT_TYPE_RSA2048_SIZE);\r
}\r
} else {\r
DEBUG ((EFI_D_INFO, "Variable %s exists.\n", EFI_PLATFORM_KEY_NAME));\r
}\r
- \r
+\r
//\r
// Create "SetupMode" variable with BS+RT attribute set.\r
//\r
if (EFI_ERROR (Status)) {\r
return Status;\r
}\r
- \r
+\r
//\r
// Create "SignatureSupport" variable with BS+RT attribute set.\r
//\r
if (EFI_ERROR (Status)) {\r
return Status;\r
}\r
- \r
+\r
DEBUG ((EFI_D_INFO, "Variable %s is %x\n", EFI_CUSTOM_MODE_NAME, CustomMode));\r
\r
//\r
// Check "certdb" variable's existence.\r
- // If it doesn't exist, then create a new one with \r
+ // If it doesn't exist, then create a new one with\r
// EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS set.\r
//\r
Status = FindVariable (\r
if (EFI_ERROR (Status)) {\r
return Status;\r
}\r
- } \r
+ }\r
\r
//\r
// Check "VendorKeysNv" variable's existence and create "VendorKeys" variable accordingly.\r
Add public key in store and return its index.\r
\r
@param[in] PubKey Input pointer to Public Key data\r
+ @param[in] VariableDataEntry The variable data entry\r
\r
@return Index of new added item\r
\r
**/\r
UINT32\r
AddPubKeyInStore (\r
- IN UINT8 *PubKey\r
+ IN UINT8 *PubKey,\r
+ IN VARIABLE_ENTRY_CONSISTENCY *VariableDataEntry\r
)\r
{\r
- EFI_STATUS Status;\r
- BOOLEAN IsFound;\r
- UINT32 Index;\r
- VARIABLE_POINTER_TRACK Variable;\r
- UINT8 *Ptr;\r
- UINT8 *Data;\r
- UINTN DataSize;\r
+ EFI_STATUS Status;\r
+ BOOLEAN IsFound;\r
+ UINT32 Index;\r
+ VARIABLE_POINTER_TRACK Variable;\r
+ UINT8 *Ptr;\r
+ UINT8 *Data;\r
+ UINTN DataSize;\r
+ VARIABLE_ENTRY_CONSISTENCY PublicKeyEntry;\r
+ UINT32 Attributes;\r
\r
if (PubKey == NULL) {\r
return 0;\r
//\r
// Add public key in database.\r
//\r
- if (mPubKeyNumber == MAX_KEY_NUM) {\r
+ if (mPubKeyNumber == mMaxKeyNumber) {\r
//\r
// Public key dadatase is full, try to reclaim invalid key.\r
//\r
//\r
return 0;\r
}\r
- \r
+\r
Status = Reclaim (\r
mVariableModuleGlobal->VariableGlobal.NonVolatileVariableBase,\r
&mVariableModuleGlobal->NonVolatileLastVariableOffset,\r
DataSize = DataSizeOfVariable (Variable.CurrPtr);\r
Data = GetVariableDataPtr (Variable.CurrPtr);\r
ASSERT ((DataSize != 0) && (Data != NULL));\r
+ //\r
+ // "AuthVarKeyDatabase" is an internal used variable. Its DataSize is always ensured not to exceed mPubKeyStore buffer size(See definition before)\r
+ // Therefore, there is no memory overflow in underlying CopyMem.\r
+ //\r
CopyMem (mPubKeyStore, (UINT8 *) Data, DataSize);\r
mPubKeyNumber = (UINT32) (DataSize / EFI_CERT_TYPE_RSA2048_SIZE);\r
\r
- if (mPubKeyNumber == MAX_KEY_NUM) {\r
+ if (mPubKeyNumber == mMaxKeyNumber) {\r
return 0;\r
- } \r
+ }\r
+ }\r
+\r
+ //\r
+ // Check the variable space for both public key and variable data.\r
+ //\r
+ PublicKeyEntry.VariableSize = (mPubKeyNumber + 1) * EFI_CERT_TYPE_RSA2048_SIZE;\r
+ PublicKeyEntry.Guid = &gEfiAuthenticatedVariableGuid;\r
+ PublicKeyEntry.Name = AUTHVAR_KEYDB_NAME;\r
+ Attributes = VARIABLE_ATTRIBUTE_NV_BS_RT | EFI_VARIABLE_AUTHENTICATED_WRITE_ACCESS;\r
+\r
+ if (!CheckRemainingSpaceForConsistency (Attributes, &PublicKeyEntry, VariableDataEntry, NULL)) {\r
+ //\r
+ // No enough variable space.\r
+ //\r
+ return 0;\r
}\r
\r
CopyMem (mPubKeyStore + mPubKeyNumber * EFI_CERT_TYPE_RSA2048_SIZE, PubKey, EFI_CERT_TYPE_RSA2048_SIZE);\r
&gEfiAuthenticatedVariableGuid,\r
mPubKeyStore,\r
mPubKeyNumber * EFI_CERT_TYPE_RSA2048_SIZE,\r
- EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_AUTHENTICATED_WRITE_ACCESS,\r
+ Attributes,\r
0,\r
0,\r
&Variable,\r
UINT8 Digest[SHA256_DIGEST_SIZE];\r
VOID *Rsa;\r
UINTN PayloadSize;\r
- \r
+\r
PayloadSize = DataSize - AUTHINFO_SIZE;\r
Rsa = NULL;\r
CertData = NULL;\r
}\r
\r
/**\r
- Check input data form to make sure it is a valid EFI_SIGNATURE_LIST for PK/KEK/db/dbx variable.\r
+ Check input data form to make sure it is a valid EFI_SIGNATURE_LIST for PK/KEK/db/dbx/dbt variable.\r
\r
@param[in] VariableName Name of Variable to be check.\r
@param[in] VendorGuid Variable vendor GUID.\r
\r
@return EFI_INVALID_PARAMETER Invalid signature list format.\r
@return EFI_SUCCESS Passed signature list format check successfully.\r
- \r
+\r
**/\r
EFI_STATUS\r
CheckSignatureListFormat(\r
\r
if (CompareGuid (VendorGuid, &gEfiGlobalVariableGuid) && (StrCmp (VariableName, EFI_PLATFORM_KEY_NAME) == 0)){\r
IsPk = TRUE;\r
- } else if ((CompareGuid (VendorGuid, &gEfiGlobalVariableGuid) && StrCmp (VariableName, EFI_KEY_EXCHANGE_KEY_NAME) == 0) ||\r
- (CompareGuid (VendorGuid, &gEfiImageSecurityDatabaseGuid) && \r
- (StrCmp (VariableName, EFI_IMAGE_SECURITY_DATABASE) == 0 || StrCmp (VariableName, EFI_IMAGE_SECURITY_DATABASE1) == 0))){\r
+ } else if ((CompareGuid (VendorGuid, &gEfiGlobalVariableGuid) && (StrCmp (VariableName, EFI_KEY_EXCHANGE_KEY_NAME) == 0)) ||\r
+ (CompareGuid (VendorGuid, &gEfiImageSecurityDatabaseGuid) &&\r
+ ((StrCmp (VariableName, EFI_IMAGE_SECURITY_DATABASE) == 0) || (StrCmp (VariableName, EFI_IMAGE_SECURITY_DATABASE1) == 0) ||\r
+ (StrCmp (VariableName, EFI_IMAGE_SECURITY_DATABASE2) == 0)))) {\r
IsPk = FALSE;\r
} else {\r
return EFI_SUCCESS;\r
for (Index = 0; Index < (sizeof (mSupportSigItem) / sizeof (EFI_SIGNATURE_ITEM)); Index++ ) {\r
if (CompareGuid (&SigList->SignatureType, &mSupportSigItem[Index].SigType)) {\r
//\r
- // The value of SignatureSize should always be 16 (size of SignatureOwner \r
+ // The value of SignatureSize should always be 16 (size of SignatureOwner\r
// component) add the data length according to signature type.\r
//\r
- if (mSupportSigItem[Index].SigDataSize != ((UINT32) ~0) && \r
+ if (mSupportSigItem[Index].SigDataSize != ((UINT32) ~0) &&\r
(SigList->SignatureSize - sizeof (EFI_GUID)) != mSupportSigItem[Index].SigDataSize) {\r
return EFI_INVALID_PARAMETER;\r
}\r
return EFI_INVALID_PARAMETER;\r
}\r
SigCount += (SigList->SignatureListSize - sizeof (EFI_SIGNATURE_LIST) - SigList->SignatureHeaderSize) / SigList->SignatureSize;\r
- \r
+\r
SigDataSize -= SigList->SignatureListSize;\r
SigList = (EFI_SIGNATURE_LIST *) ((UINT8 *) SigList + SigList->SignatureListSize);\r
}\r
\r
@return EFI_SUCCESS Variable is updated successfully.\r
@return Others Failed to update variable.\r
- \r
+\r
**/\r
EFI_STATUS\r
VendorKeyIsModified (\r
return EFI_SUCCESS;\r
}\r
mVendorKeyState = VENDOR_KEYS_MODIFIED;\r
- \r
+\r
FindVariable (EFI_VENDOR_KEYS_NV_VARIABLE_NAME, &gEfiVendorKeysNvGuid, &Variable, &mVariableModuleGlobal->VariableGlobal, FALSE);\r
Status = UpdateVariable (\r
EFI_VENDOR_KEYS_NV_VARIABLE_NAME,\r
UINT8 *Payload;\r
UINTN PayloadSize;\r
\r
- if ((Attributes & EFI_VARIABLE_NON_VOLATILE) == 0 || \r
+ if ((Attributes & EFI_VARIABLE_NON_VOLATILE) == 0 ||\r
(Attributes & EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS) == 0) {\r
//\r
- // PK, KEK and db/dbx should set EFI_VARIABLE_NON_VOLATILE attribute and should be a time-based\r
+ // PK, KEK and db/dbx/dbt should set EFI_VARIABLE_NON_VOLATILE attribute and should be a time-based\r
// authenticated variable.\r
//\r
return EFI_INVALID_PARAMETER;\r
if ((Attributes & EFI_VARIABLE_NON_VOLATILE) == 0 ||\r
(Attributes & EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS) == 0) {\r
//\r
- // DB and DBX should set EFI_VARIABLE_NON_VOLATILE attribute and should be a time-based\r
+ // DB, DBX and DBT should set EFI_VARIABLE_NON_VOLATILE attribute and should be a time-based\r
// authenticated variable.\r
//\r
return EFI_INVALID_PARAMETER;\r
if (EFI_ERROR (Status)) {\r
return Status;\r
}\r
- \r
+\r
Status = UpdateVariable (\r
VariableName,\r
VendorGuid,\r
EFI_CERT_BLOCK_RSA_2048_SHA256 *CertBlock;\r
UINT32 KeyIndex;\r
UINT64 MonotonicCount;\r
+ VARIABLE_ENTRY_CONSISTENCY VariableDataEntry;\r
\r
KeyIndex = 0;\r
CertData = NULL;\r
//\r
return EFI_SECURITY_VIOLATION;\r
}\r
- \r
+\r
//\r
// A time-based authenticated variable and a count-based authenticated variable\r
// can't be updated by each other.\r
- // \r
- if (Variable->CurrPtr != NULL) { \r
+ //\r
+ if (Variable->CurrPtr != NULL) {\r
if (((Attributes & EFI_VARIABLE_AUTHENTICATED_WRITE_ACCESS) != 0) &&\r
((Variable->CurrPtr->Attributes & EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS) != 0)) {\r
- return EFI_SECURITY_VIOLATION; \r
+ return EFI_SECURITY_VIOLATION;\r
}\r
- \r
- if (((Attributes & EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS) != 0) && \r
+\r
+ if (((Attributes & EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS) != 0) &&\r
((Variable->CurrPtr->Attributes & EFI_VARIABLE_AUTHENTICATED_WRITE_ACCESS) != 0)) {\r
- return EFI_SECURITY_VIOLATION; \r
+ return EFI_SECURITY_VIOLATION;\r
}\r
}\r
- \r
+\r
//\r
// Process Time-based Authenticated variable.\r
//\r
KeyIndex = Variable->CurrPtr->PubKeyIndex;\r
IsFirstTime = FALSE;\r
}\r
- } else if ((Variable->CurrPtr != NULL) && \r
+ } else if ((Variable->CurrPtr != NULL) &&\r
((Variable->CurrPtr->Attributes & (EFI_VARIABLE_AUTHENTICATED_WRITE_ACCESS | EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS)) != 0)\r
) {\r
//\r
\r
if (!IsFirstTime) {\r
//\r
- // Check input PubKey.\r
+ // 2 cases need to check here\r
+ // 1. Internal PubKey variable. PubKeyIndex is always 0\r
+ // 2. Other counter-based AuthVariable. Check input PubKey.\r
//\r
- if (CompareMem (PubKey, mPubKeyStore + (KeyIndex - 1) * EFI_CERT_TYPE_RSA2048_SIZE, EFI_CERT_TYPE_RSA2048_SIZE) != 0) {\r
+ if (KeyIndex == 0 || CompareMem (PubKey, mPubKeyStore + (KeyIndex - 1) * EFI_CERT_TYPE_RSA2048_SIZE, EFI_CERT_TYPE_RSA2048_SIZE) != 0) {\r
return EFI_SECURITY_VIOLATION;\r
}\r
//\r
// Now, the signature has been verified!\r
//\r
if (IsFirstTime && !IsDeletion) {\r
+ VariableDataEntry.VariableSize = DataSize - AUTHINFO_SIZE;\r
+ VariableDataEntry.Guid = VendorGuid;\r
+ VariableDataEntry.Name = VariableName;\r
+\r
//\r
// Update public key database variable if need.\r
//\r
- KeyIndex = AddPubKeyInStore (PubKey);\r
+ KeyIndex = AddPubKeyInStore (PubKey, &VariableDataEntry);\r
if (KeyIndex == 0) {\r
return EFI_OUT_OF_RESOURCES;\r
}\r
\r
@param[in, out] Data Pointer to original EFI_SIGNATURE_LIST.\r
@param[in] DataSize Size of Data buffer.\r
- @param[in] FreeBufSize Size of free data buffer \r
+ @param[in] FreeBufSize Size of free data buffer\r
@param[in] NewData Pointer to new EFI_SIGNATURE_LIST to be appended.\r
@param[in] NewDataSize Size of NewData buffer.\r
@param[out] MergedBufSize Size of the merged buffer\r
//\r
// Check whether VariableName matches.\r
//\r
- if ((NameSize == StrLen (VariableName)) && \r
+ if ((NameSize == StrLen (VariableName)) &&\r
(CompareMem (Data + Offset, VariableName, NameSize * sizeof (CHAR16)) == 0)) {\r
Offset = Offset + NameSize * sizeof (CHAR16);\r
\r
}\r
\r
if (CertDataSize != NULL) {\r
- *CertDataSize = CertSize; \r
+ *CertDataSize = CertSize;\r
}\r
\r
if (CertNodeOffset != NULL) {\r
}\r
}\r
\r
- return EFI_NOT_FOUND; \r
+ return EFI_NOT_FOUND;\r
}\r
\r
/**\r
if ((VariableName == NULL) || (VendorGuid == NULL) || (CertData == NULL) || (CertDataSize == NULL)) {\r
return EFI_INVALID_PARAMETER;\r
}\r
- \r
+\r
//\r
// Get variable "certdb".\r
//\r
&CertDbVariable,\r
&mVariableModuleGlobal->VariableGlobal,\r
FALSE\r
- ); \r
+ );\r
if (EFI_ERROR (Status)) {\r
return Status;\r
}\r
if ((VariableName == NULL) || (VendorGuid == NULL)) {\r
return EFI_INVALID_PARAMETER;\r
}\r
- \r
+\r
//\r
// Get variable "certdb".\r
//\r
&CertDbVariable,\r
&mVariableModuleGlobal->VariableGlobal,\r
FALSE\r
- ); \r
+ );\r
if (EFI_ERROR (Status)) {\r
return Status;\r
}\r
\r
//\r
// Set "certdb".\r
- // \r
- VarAttr = EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS; \r
+ //\r
+ VarAttr = EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS;\r
Status = UpdateVariable (\r
EFI_CERT_DB_NAME,\r
&gEfiCertDbGuid,\r
if ((VariableName == NULL) || (VendorGuid == NULL) || (CertData == NULL)) {\r
return EFI_INVALID_PARAMETER;\r
}\r
- \r
+\r
//\r
// Get variable "certdb".\r
//\r
&CertDbVariable,\r
&mVariableModuleGlobal->VariableGlobal,\r
FALSE\r
- ); \r
+ );\r
if (EFI_ERROR (Status)) {\r
return Status;\r
}\r
// Construct new data content of variable "certdb".\r
//\r
NameSize = (UINT32) StrLen (VariableName);\r
- CertNodeSize = sizeof (AUTH_CERT_DB_DATA) + (UINT32) CertDataSize + NameSize * sizeof (CHAR16); \r
+ CertNodeSize = sizeof (AUTH_CERT_DB_DATA) + (UINT32) CertDataSize + NameSize * sizeof (CHAR16);\r
NewCertDbSize = (UINT32) DataSize + CertNodeSize;\r
- if (NewCertDbSize > MAX_CERTDB_SIZE) {\r
+ if (NewCertDbSize > mMaxCertDbSize) {\r
return EFI_OUT_OF_RESOURCES;\r
}\r
NewCertDb = (UINT8*) mCertDbStore;\r
CopyMem (&Ptr->CertNodeSize, &CertNodeSize, sizeof (UINT32));\r
CopyMem (&Ptr->NameSize, &NameSize, sizeof (UINT32));\r
CopyMem (&Ptr->CertDataSize, &CertDataSize, sizeof (UINT32));\r
- \r
+\r
CopyMem (\r
(UINT8 *) Ptr + sizeof (AUTH_CERT_DB_DATA),\r
VariableName,\r
CertData,\r
CertDataSize\r
);\r
- \r
+\r
//\r
// Set "certdb".\r
- // \r
- VarAttr = EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS; \r
+ //\r
+ VarAttr = EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS;\r
Status = UpdateVariable (\r
EFI_CERT_DB_NAME,\r
&gEfiCertDbGuid,\r
WrapSigData = NULL;\r
SignerCerts = NULL;\r
RootCert = NULL;\r
+ CertsInCertDb = NULL;\r
\r
//\r
// When the attribute EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS is\r
} else if (AuthVarType == AuthVarTypePriv) {\r
\r
//\r
- // Process common authenticated variable except PK/KEK/DB/DBX.\r
+ // Process common authenticated variable except PK/KEK/DB/DBX/DBT.\r
// Get signer's certificates from SignedData.\r
//\r
VerifyStatus = Pkcs7GetSigners (\r
if (EFI_ERROR (Status)) {\r
goto Exit;\r
}\r
- \r
+\r
if ((CertStackSize != CertsSizeinDb) ||\r
(CompareMem (SignerCerts, CertsInCertDb, CertsSizeinDb) != 0)) {\r
goto Exit;\r
Cert = (EFI_SIGNATURE_DATA *) ((UINT8 *) CertList + sizeof (EFI_SIGNATURE_LIST) + CertList->SignatureHeaderSize);\r
RootCert = Cert->SignatureData;\r
RootCertSize = CertList->SignatureSize - (sizeof (EFI_SIGNATURE_DATA) - 1);\r
- \r
+\r
// Verify Pkcs7 SignedData via Pkcs7Verify library.\r
//\r
VerifyStatus = Pkcs7Verify (\r
&CertData->TimeStamp\r
);\r
}\r
-\r