\r
**/\r
EFI_STATUS\r
-IsCertHashFoundInDatabase (\r
+IsCertHashFoundInDbx (\r
IN UINT8 *Certificate,\r
IN UINTN CertSize,\r
IN EFI_SIGNATURE_LIST *SignatureList,\r
@param[in] Signature Pointer to signature that is searched for.\r
@param[in] CertType Pointer to hash algorithm.\r
@param[in] SignatureSize Size of Signature.\r
+ @param[out] IsFound Search result. Only valid if EFI_SUCCESS returned\r
\r
- @return TRUE Found the signature in the variable database.\r
- @return FALSE Not found the signature in the variable database.\r
+ @retval EFI_SUCCESS Finished the search without any error.\r
+ @retval Others Error occurred in the search of database.\r
\r
**/\r
-BOOLEAN\r
+EFI_STATUS\r
IsSignatureFoundInDatabase (\r
- IN CHAR16 *VariableName,\r
- IN UINT8 *Signature,\r
- IN EFI_GUID *CertType,\r
- IN UINTN SignatureSize\r
+ IN CHAR16 *VariableName,\r
+ IN UINT8 *Signature,\r
+ IN EFI_GUID *CertType,\r
+ IN UINTN SignatureSize,\r
+ OUT BOOLEAN *IsFound\r
)\r
{\r
EFI_STATUS Status;\r
UINT8 *Data;\r
UINTN Index;\r
UINTN CertCount;\r
- BOOLEAN IsFound;\r
\r
//\r
// Read signature database variable.\r
//\r
- IsFound = FALSE;\r
+ *IsFound = FALSE;\r
Data = NULL;\r
DataSize = 0;\r
Status = gRT->GetVariable (VariableName, &gEfiImageSecurityDatabaseGuid, NULL, &DataSize, NULL);\r
if (Status != EFI_BUFFER_TOO_SMALL) {\r
- return FALSE;\r
+ if (Status == EFI_NOT_FOUND) {\r
+ //\r
+ // No database, no need to search.\r
+ //\r
+ Status = EFI_SUCCESS;\r
+ }\r
+\r
+ return Status;\r
}\r
\r
Data = (UINT8 *) AllocateZeroPool (DataSize);\r
if (Data == NULL) {\r
- return FALSE;\r
+ return EFI_OUT_OF_RESOURCES;\r
}\r
\r
Status = gRT->GetVariable (VariableName, &gEfiImageSecurityDatabaseGuid, NULL, &DataSize, Data);\r
//\r
// Find the signature in database.\r
//\r
- IsFound = TRUE;\r
+ *IsFound = TRUE;\r
//\r
// Entries in UEFI_IMAGE_SECURITY_DATABASE that are used to validate image should be measured\r
//\r
Cert = (EFI_SIGNATURE_DATA *) ((UINT8 *) Cert + CertList->SignatureSize);\r
}\r
\r
- if (IsFound) {\r
+ if (*IsFound) {\r
break;\r
}\r
}\r
FreePool (Data);\r
}\r
\r
- return IsFound;\r
+ return Status;\r
}\r
\r
/**\r
\r
Status = gRT->GetVariable (EFI_IMAGE_SECURITY_DATABASE1, &gEfiImageSecurityDatabaseGuid, NULL, &DataSize, (VOID *) Data);\r
if (EFI_ERROR (Status)) {\r
- return IsForbidden;\r
+ goto Done;\r
}\r
\r
//\r
//\r
CertPtr = CertPtr + sizeof (UINT32) + CertSize;\r
\r
- Status = IsCertHashFoundInDatabase (Cert, CertSize, (EFI_SIGNATURE_LIST *)Data, DataSize, &RevocationTime, &IsFound);\r
+ Status = IsCertHashFoundInDbx (Cert, CertSize, (EFI_SIGNATURE_LIST *)Data, DataSize, &RevocationTime, &IsFound);\r
if (EFI_ERROR (Status)) {\r
//\r
// Error in searching dbx. Consider it as 'found'. RevocationTime might\r
//\r
// Here We still need to check if this RootCert's Hash is revoked\r
//\r
- Status = IsCertHashFoundInDatabase (RootCert, RootCertSize, (EFI_SIGNATURE_LIST *)DbxData, DbxDataSize, &RevocationTime, &IsFound);\r
+ Status = IsCertHashFoundInDbx (RootCert, RootCertSize, (EFI_SIGNATURE_LIST *)DbxData, DbxDataSize, &RevocationTime, &IsFound);\r
if (EFI_ERROR (Status)) {\r
//\r
// Error in searching dbx. Consider it as 'found'. RevocationTime might\r
EFIAPI\r
DxeImageVerificationHandler (\r
IN UINT32 AuthenticationStatus,\r
- IN CONST EFI_DEVICE_PATH_PROTOCOL *File,\r
+ IN CONST EFI_DEVICE_PATH_PROTOCOL *File, OPTIONAL\r
IN VOID *FileBuffer,\r
IN UINTN FileSize,\r
IN BOOLEAN BootPolicy\r
CHAR16 *NameStr;\r
RETURN_STATUS PeCoffStatus;\r
EFI_STATUS HashStatus;\r
+ EFI_STATUS DbStatus;\r
+ BOOLEAN IsFound;\r
\r
SignatureList = NULL;\r
SignatureListSize = 0;\r
PkcsCertData = NULL;\r
Action = EFI_IMAGE_EXECUTION_AUTH_UNTESTED;\r
IsVerified = FALSE;\r
-\r
+ IsFound = FALSE;\r
\r
//\r
// Check the image type and get policy setting.\r
goto Failed;\r
}\r
\r
- if (IsSignatureFoundInDatabase (EFI_IMAGE_SECURITY_DATABASE1, mImageDigest, &mCertType, mImageDigestSize)) {\r
+ DbStatus = IsSignatureFoundInDatabase (\r
+ EFI_IMAGE_SECURITY_DATABASE1,\r
+ mImageDigest,\r
+ &mCertType,\r
+ mImageDigestSize,\r
+ &IsFound\r
+ );\r
+ if (EFI_ERROR (DbStatus) || IsFound) {\r
//\r
// Image Hash is in forbidden database (DBX).\r
//\r
goto Failed;\r
}\r
\r
- if (IsSignatureFoundInDatabase (EFI_IMAGE_SECURITY_DATABASE, mImageDigest, &mCertType, mImageDigestSize)) {\r
+ DbStatus = IsSignatureFoundInDatabase (\r
+ EFI_IMAGE_SECURITY_DATABASE,\r
+ mImageDigest,\r
+ &mCertType,\r
+ mImageDigestSize,\r
+ &IsFound\r
+ );\r
+ if (!EFI_ERROR (DbStatus) && IsFound) {\r
//\r
// Image Hash is in allowed database (DB).\r
//\r
//\r
// Check the image's hash value.\r
//\r
- if (IsSignatureFoundInDatabase (EFI_IMAGE_SECURITY_DATABASE1, mImageDigest, &mCertType, mImageDigestSize)) {\r
+ DbStatus = IsSignatureFoundInDatabase (\r
+ EFI_IMAGE_SECURITY_DATABASE1,\r
+ mImageDigest,\r
+ &mCertType,\r
+ mImageDigestSize,\r
+ &IsFound\r
+ );\r
+ if (EFI_ERROR (DbStatus) || IsFound) {\r
Action = EFI_IMAGE_EXECUTION_AUTH_SIG_FOUND;\r
DEBUG ((DEBUG_INFO, "DxeImageVerificationLib: Image is signed but %s hash of image is found in DBX.\n", mHashTypeStr));\r
IsVerified = FALSE;\r
break;\r
}\r
+\r
if (!IsVerified) {\r
- if (IsSignatureFoundInDatabase (EFI_IMAGE_SECURITY_DATABASE, mImageDigest, &mCertType, mImageDigestSize)) {\r
+ DbStatus = IsSignatureFoundInDatabase (\r
+ EFI_IMAGE_SECURITY_DATABASE,\r
+ mImageDigest,\r
+ &mCertType,\r
+ mImageDigestSize,\r
+ &IsFound\r
+ );\r
+ if (!EFI_ERROR (DbStatus) && IsFound) {\r
IsVerified = TRUE;\r
} else {\r
DEBUG ((DEBUG_INFO, "DxeImageVerificationLib: Image is signed but signature is not allowed by DB and %s hash of image is not found in DB/DBX.\n", mHashTypeStr));\r