/** @file | |
PKCS7 Verify Null implementation. | |
Copyright (C) Microsoft Corporation. All Rights Reserved. | |
Copyright (c) 2019, Intel Corporation. All rights reserved.<BR> | |
SPDX-License-Identifier: BSD-2-Clause-Patent | |
**/ | |
#include "InternalCryptLib.h" | |
/** | |
This function will return the leaf signer certificate in a chain. This is | |
required because certificate chains are not guaranteed to have the | |
certificates in the order that they were issued. | |
A typical certificate chain looks like this: | |
---------------------------- | |
| Root | | |
---------------------------- | |
^ | |
| | |
---------------------------- | |
| Policy CA | <-- Typical Trust Anchor. | |
---------------------------- | |
^ | |
| | |
---------------------------- | |
| Issuing CA | | |
---------------------------- | |
^ | |
| | |
----------------------------- | |
/ End-Entity (leaf) signer / <-- Bottom certificate. | |
----------------------------- EKU: "1.3.6.1.4.1.311.76.9.21.1" | |
(Firmware Signing) | |
@param[in] CertChain Certificate chain. | |
@param[out] SignerCert Last certificate in the chain. For PKCS7 signatures, | |
this will be the end-entity (leaf) signer cert. | |
@retval EFI_SUCCESS The required EKUs were found in the signature. | |
@retval EFI_INVALID_PARAMETER A parameter was invalid. | |
@retval EFI_NOT_FOUND The number of signers found was not 1. | |
**/ | |
EFI_STATUS | |
GetSignerCertificate ( | |
IN CONST VOID *CertChain, | |
OUT VOID **SignerCert | |
) | |
{ | |
ASSERT (FALSE); | |
return EFI_NOT_READY; | |
} | |
/** | |
Determines if the specified EKU represented in ASN1 form is present | |
in a given certificate. | |
@param[in] Cert The certificate to check. | |
@param[in] Asn1ToFind The EKU to look for. | |
@retval EFI_SUCCESS We successfully identified the signing type. | |
@retval EFI_INVALID_PARAMETER A parameter was invalid. | |
@retval EFI_NOT_FOUND One or more EKU's were not found in the signature. | |
**/ | |
EFI_STATUS | |
IsEkuInCertificate ( | |
IN CONST VOID *Cert, | |
IN VOID *Asn1ToFind | |
) | |
{ | |
ASSERT (FALSE); | |
return EFI_NOT_READY; | |
} | |
/** | |
Determines if the specified EKUs are present in a signing certificate. | |
@param[in] SignerCert The certificate to check. | |
@param[in] RequiredEKUs The EKUs to look for. | |
@param[in] RequiredEKUsSize The number of EKUs | |
@param[in] RequireAllPresent If TRUE, then all the specified EKUs | |
must be present in the certificate. | |
@retval EFI_SUCCESS We successfully identified the signing type. | |
@retval EFI_INVALID_PARAMETER A parameter was invalid. | |
@retval EFI_NOT_FOUND One or more EKU's were not found in the signature. | |
**/ | |
EFI_STATUS | |
CheckEKUs ( | |
IN CONST VOID *SignerCert, | |
IN CONST CHAR8 *RequiredEKUs[], | |
IN CONST UINT32 RequiredEKUsSize, | |
IN BOOLEAN RequireAllPresent | |
) | |
{ | |
ASSERT (FALSE); | |
return EFI_NOT_READY; | |
} | |
/** | |
This function receives a PKCS#7 formatted signature blob, | |
looks for the EKU SEQUENCE blob, and if found then looks | |
for all the required EKUs. This function was created so that | |
the Surface team can cut down on the number of Certificate | |
Authorities (CA's) by checking EKU's on leaf signers for | |
a specific product. This prevents one product's certificate | |
from signing another product's firmware or unlock blobs. | |
Note that this function does not validate the certificate chain. | |
That needs to be done before using this function. | |
@param[in] Pkcs7Signature The PKCS#7 signed information content block. An array | |
containing the content block with both the signature, | |
the signer's certificate, and any necessary intermediate | |
certificates. | |
@param[in] Pkcs7SignatureSize Number of bytes in Pkcs7Signature. | |
@param[in] RequiredEKUs Array of null-terminated strings listing OIDs of | |
required EKUs that must be present in the signature. | |
@param[in] RequiredEKUsSize Number of elements in the RequiredEKUs string array. | |
@param[in] RequireAllPresent If this is TRUE, then all of the specified EKU's | |
must be present in the leaf signer. If it is | |
FALSE, then we will succeed if we find any | |
of the specified EKU's. | |
@retval EFI_SUCCESS The required EKUs were found in the signature. | |
@retval EFI_INVALID_PARAMETER A parameter was invalid. | |
@retval EFI_NOT_FOUND One or more EKU's were not found in the signature. | |
**/ | |
EFI_STATUS | |
EFIAPI | |
VerifyEKUsInPkcs7Signature ( | |
IN CONST UINT8 *Pkcs7Signature, | |
IN CONST UINT32 SignatureSize, | |
IN CONST CHAR8 *RequiredEKUs[], | |
IN CONST UINT32 RequiredEKUsSize, | |
IN BOOLEAN RequireAllPresent | |
) | |
{ | |
ASSERT (FALSE); | |
return EFI_NOT_READY; | |
} |