Hi Jiewen, Thank you for the comments. I will update the patch and follow the process. BR Sheng Wei
> -----Original Message----- > From: Yao, Jiewen <jiewen....@intel.com> > Sent: 2023年7月25日 14:06 > To: Sheng, W <w.sh...@intel.com>; devel@edk2.groups.io > Cc: Wang, Jian J <jian.j.w...@intel.com>; Xu, Min M <min.m...@intel.com>; > Chen, Zeyi <zeyi.c...@intel.com>; Wang, Fiona <fiona.w...@intel.com> > Subject: RE: [PATCH v4] SecurityPkg/SecureBoot: Support RSA 512 and RSA > 384 > > Thanks for the update, Wei. > > From process perspective, please always do following: > > 1) Please describe what is the difference between this version and previous > version. As such, we can know what is delta and we can focus on the delta. > > 2) Please describe what test has been done for this specific version. Such as > unit test, integration test, etc. > > 3) Please split the patch based upon package. The reason is that we need > different reviewer for each package. > > > For the patch, I have below comment: > > 1) Please don't use magic number. Please always define MACRO for better > maintenance. > > + if (KeyInfo->KeyType == 0) { > > Please use "if (KeyInfo->KeyType == KEY_TYPE_RSASSA) {" > > > Thank you > Yao, Jiewen > > > > -----Original Message----- > > From: Sheng, W <w.sh...@intel.com> > > Sent: Thursday, July 6, 2023 4:06 PM > > To: devel@edk2.groups.io > > Cc: Yao, Jiewen <jiewen....@intel.com>; Wang, Jian J > > <jian.j.w...@intel.com>; Xu, Min M <min.m...@intel.com>; Chen, Zeyi > > <zeyi.c...@intel.com>; Wang, Fiona <fiona.w...@intel.com> > > Subject: [PATCH v4] SecurityPkg/SecureBoot: Support RSA 512 and RSA > > 384 > > > > REF: https://bugzilla.tianocore.org/show_bug.cgi?id=3413 > > > > Cc: Jiewen Yao <jiewen....@intel.com> > > Cc: Jian J Wang <jian.j.w...@intel.com> > > Cc: Min Xu <min.m...@intel.com> > > Cc: Zeyi Chen <zeyi.c...@intel.com> > > Cc: Fiona Wang <fiona.w...@intel.com> > > Signed-off-by: Sheng Wei <w.sh...@intel.com> > > --- > > CryptoPkg/Library/BaseCryptLib/Pk/CryptTs.c | 3 +- > > MdePkg/Include/Guid/ImageAuthentication.h | 26 +++ > > MdePkg/MdePkg.dec | 2 + > > .../Library/AuthVariableLib/AuthService.c | 220 +++++++++++++++--- > > .../AuthVariableLib/AuthServiceInternal.h | 4 +- > > .../Library/AuthVariableLib/AuthVariableLib.c | 42 ++-- > > .../DxeImageVerificationLib.c | 73 +++--- > > .../SecureBootConfigDxe.inf | 16 ++ > > .../SecureBootConfigImpl.c | 114 +++++++-- > > .../SecureBootConfigImpl.h | 2 + > > .../SecureBootConfigStrings.uni | 6 + > > 11 files changed, 416 insertions(+), 92 deletions(-) > > > > diff --git a/CryptoPkg/Library/BaseCryptLib/Pk/CryptTs.c > > b/CryptoPkg/Library/BaseCryptLib/Pk/CryptTs.c > > index 027dbb6842..944bcf8d38 100644 > > --- a/CryptoPkg/Library/BaseCryptLib/Pk/CryptTs.c > > +++ b/CryptoPkg/Library/BaseCryptLib/Pk/CryptTs.c > > @@ -591,7 +591,8 @@ ImageTimestampVerify ( > > // Register & Initialize necessary digest algorithms for PKCS#7 Handling. > > > > // > > > > if ((EVP_add_digest (EVP_md5 ()) == 0) || (EVP_add_digest (EVP_sha1 > > ()) == 0) > > || > > > > - (EVP_add_digest (EVP_sha256 ()) == 0) || ((EVP_add_digest_alias > > (SN_sha1WithRSAEncryption, SN_sha1WithRSA)) == 0)) > > > > + (EVP_add_digest (EVP_sha256 ()) == 0) || (EVP_add_digest > > + (EVP_sha384 ()) > > == 0) || > > > > + (EVP_add_digest (EVP_sha512 ()) == 0) || ((EVP_add_digest_alias > > (SN_sha1WithRSAEncryption, SN_sha1WithRSA)) == 0)) > > > > { > > > > return FALSE; > > > > } > > > > diff --git a/MdePkg/Include/Guid/ImageAuthentication.h > > b/MdePkg/Include/Guid/ImageAuthentication.h > > index fe83596571..c8ea2c14fb 100644 > > --- a/MdePkg/Include/Guid/ImageAuthentication.h > > +++ b/MdePkg/Include/Guid/ImageAuthentication.h > > @@ -144,6 +144,30 @@ typedef struct { > > 0x3c5766e8, 0x269c, 0x4e34, {0xaa, 0x14, 0xed, 0x77, 0x6e, 0x85, > > 0xb3, 0xb6} \ > > > > } > > > > > > > > +/// > > > > +/// This identifies a signature containing an RSA-3072 key. The key > > +(only the > > modulus > > > > +/// since the public key exponent is known to be 0x10001) shall be > > +stored in big- > > endian > > > > +/// order. > > > > +/// The SignatureHeader size shall always be 0. The SignatureSize > > +shall always be > > 16 (size > > > > +/// of SignatureOwner component) + 384 bytes. > > > > +/// > > > > +#define EFI_CERT_RSA3072_GUID \ > > > > + { \ > > > > + 0xedd320c2, 0xb057, 0x4b8e, {0xad, 0x46, 0x2c, 0x9b, 0x85, 0x89, > > + 0xee, > > 0x92 } \ > > > > + } > > > > + > > > > +/// > > > > +/// This identifies a signature containing an RSA-4096 key. The key > > +(only the > > modulus > > > > +/// since the public key exponent is known to be 0x10001) shall be > > +stored in big- > > endian > > > > +/// order. > > > > +/// The SignatureHeader size shall always be 0. The SignatureSize > > +shall always be > > 16 (size > > > > +/// of SignatureOwner component) + 512 bytes. > > > > +/// > > > > +#define EFI_CERT_RSA4096_GUID \ > > > > + { \ > > > > + 0xb23e89a6, 0x8c8b, 0x4412, {0x85, 0x73, 0x15, 0x4e, 0x8d, 0x00, > > + 0x98, > > 0x2c } \ > > > > + } > > > > + > > > > /// > > > > /// This identifies a signature containing a RSA-2048 signature of a > > SHA-256 > hash. > > The > > > > /// SignatureHeader size shall always be 0. The SignatureSize shall > > always be 16 (size of > > > > @@ -330,6 +354,8 @@ typedef struct { > > extern EFI_GUID gEfiImageSecurityDatabaseGuid; > > > > extern EFI_GUID gEfiCertSha256Guid; > > > > extern EFI_GUID gEfiCertRsa2048Guid; > > > > +extern EFI_GUID gEfiCertRsa3072Guid; > > > > +extern EFI_GUID gEfiCertRsa4096Guid; > > > > extern EFI_GUID gEfiCertRsa2048Sha256Guid; > > > > extern EFI_GUID gEfiCertSha1Guid; > > > > extern EFI_GUID gEfiCertRsa2048Sha1Guid; > > > > diff --git a/MdePkg/MdePkg.dec b/MdePkg/MdePkg.dec index > > d6c4179b2a..c88e88fa6b 100644 > > --- a/MdePkg/MdePkg.dec > > +++ b/MdePkg/MdePkg.dec > > @@ -571,6 +571,8 @@ > > gEfiImageSecurityDatabaseGuid = { 0xd719b2cb, 0x3d3a, 0x4596, > > {0xa3, 0xbc, 0xda, 0xd0, 0xe, 0x67, 0x65, 0x6f }} > > > > gEfiCertSha256Guid = { 0xc1c41626, 0x504c, 0x4092, {0xac, > > 0xa9, > 0x41, > > 0xf9, 0x36, 0x93, 0x43, 0x28 }} > > > > gEfiCertRsa2048Guid = { 0x3c5766e8, 0x269c, 0x4e34, {0xaa, > > 0x14, > 0xed, > > 0x77, 0x6e, 0x85, 0xb3, 0xb6 }} > > > > + gEfiCertRsa3072Guid = { 0xedd320c2, 0xb057, 0x4b8e, {0xad, > > 0x46, > 0x2c, > > 0x9b, 0x85, 0x89, 0xee, 0x92 }} > > > > + gEfiCertRsa4096Guid = { 0xb23e89a6, 0x8c8b, 0x4412, {0x85, > > 0x73, > > 0x15, 0x4e, 0x8d, 0x00, 0x98, 0x2c }} > > > > gEfiCertRsa2048Sha256Guid = { 0xe2b36190, 0x879b, 0x4a3d, {0xad, > 0x8d, > > 0xf2, 0xe7, 0xbb, 0xa3, 0x27, 0x84 }} > > > > gEfiCertSha1Guid = { 0x826ca512, 0xcf10, 0x4ac9, {0xb1, > > 0x87, 0xbe, > > 0x1, 0x49, 0x66, 0x31, 0xbd }} > > > > gEfiCertRsa2048Sha1Guid = { 0x67f8444f, 0x8743, 0x48f1, {0xa3, > > 0x28, > > 0x1e, 0xaa, 0xb8, 0x73, 0x60, 0x80 }} > > > > diff --git a/SecurityPkg/Library/AuthVariableLib/AuthService.c > > b/SecurityPkg/Library/AuthVariableLib/AuthService.c > > index d81c581d78..4c268a85cd 100644 > > --- a/SecurityPkg/Library/AuthVariableLib/AuthService.c > > +++ b/SecurityPkg/Library/AuthVariableLib/AuthService.c > > @@ -29,12 +29,125 @@ SPDX-License-Identifier: BSD-2-Clause-Patent > > #include <Protocol/VariablePolicy.h> > > > > #include <Library/VariablePolicyLib.h> > > > > > > > > +#define SHA_DIGEST_SIZE_MAX SHA512_DIGEST_SIZE > > > > + > > > > +/** > > > > + Retrieves the size, in bytes, of the context buffer required for hash > operations. > > > > + > > > > + If this interface is not supported, then return zero. > > > > + > > > > + @return The size, in bytes, of the context buffer required for hash > operations. > > > > + @retval 0 This interface is not supported. > > > > + > > > > +**/ > > > > +typedef > > > > +UINTN > > > > +(EFIAPI *EFI_HASH_GET_CONTEXT_SIZE)( > > > > + VOID > > > > + ); > > > > + > > > > +/** > > > > + Initializes user-supplied memory pointed by Sha1Context as hash > > + context for > > > > + subsequent use. > > > > + > > > > + If HashContext is NULL, then return FALSE. > > > > + If this interface is not supported, then return FALSE. > > > > + > > > > + @param[out] HashContext Pointer to Hashcontext being initialized. > > > > + > > > > + @retval TRUE Hash context initialization succeeded. > > > > + @retval FALSE Hash context initialization failed. > > > > + @retval FALSE This interface is not supported. > > > > + > > > > +**/ > > > > +typedef > > > > +BOOLEAN > > > > +(EFIAPI *EFI_HASH_INIT)( > > > > + OUT VOID *HashContext > > > > + ); > > > > + > > > > +/** > > > > + Digests the input data and updates Hash context. > > > > + > > > > + This function performs Hash digest on a data buffer of the specified > > size. > > > > + It can be called multiple times to compute the digest of long or > > + discontinuous > > data streams. > > > > + Hash context should be already correctly initialized by HashInit(), > > + and should > > not be finalized > > > > + by HashFinal(). Behavior with invalid context is undefined. > > > > + > > > > + If HashContext is NULL, then return FALSE. > > > > + If this interface is not supported, then return FALSE. > > > > + > > > > + @param[in, out] HashContext Pointer to the Hash context. > > > > + @param[in] Data Pointer to the buffer containing the data > > to be > > hashed. > > > > + @param[in] DataSize Size of Data buffer in bytes. > > > > + > > > > + @retval TRUE SHA-1 data digest succeeded. > > > > + @retval FALSE SHA-1 data digest failed. > > > > + @retval FALSE This interface is not supported. > > > > + > > > > +**/ > > > > +typedef > > > > +BOOLEAN > > > > +(EFIAPI *EFI_HASH_UPDATE)( > > > > + IN OUT VOID *HashContext, > > > > + IN CONST VOID *Data, > > > > + IN UINTN DataSize > > > > + ); > > > > + > > > > +/** > > > > + Completes computation of the Hash digest value. > > > > + > > > > + This function completes hash computation and retrieves the digest > > + value into > > > > + the specified memory. After this function has been called, the Hash > > + context > > cannot > > > > + be used again. > > > > + Hash context should be already correctly initialized by HashInit(), > > + and should > > not be > > > > + finalized by HashFinal(). Behavior with invalid Hash context is > > undefined. > > > > + > > > > + If HashContext is NULL, then return FALSE. > > > > + If HashValue is NULL, then return FALSE. > > > > + If this interface is not supported, then return FALSE. > > > > + > > > > + @param[in, out] HashContext Pointer to the Hash context. > > > > + @param[out] HashValue Pointer to a buffer that receives the Hash > digest > > > > + value. > > > > + > > > > + @retval TRUE Hash digest computation succeeded. > > > > + @retval FALSE Hash digest computation failed. > > > > + @retval FALSE This interface is not supported. > > > > + > > > > +**/ > > > > +typedef > > > > +BOOLEAN > > > > +(EFIAPI *EFI_HASH_FINAL)( > > > > + IN OUT VOID *HashContext, > > > > + OUT UINT8 *HashValue > > > > + ); > > > > + > > > > +typedef struct { > > > > + UINT32 HashSize; > > > > + EFI_HASH_GET_CONTEXT_SIZE GetContextSize; > > > > + EFI_HASH_INIT Init; > > > > + EFI_HASH_UPDATE Update; > > > > + EFI_HASH_FINAL Final; > > > > + VOID **HashShaCtx; > > > > + UINT8 *OidValue; > > > > + UINTN OidLength; > > > > +} EFI_HASH_INFO; > > > > + > > > > // > > > > // Public Exponent of RSA Key. > > > > // > > > > CONST UINT8 mRsaE[] = { 0x01, 0x00, 0x01 }; > > > > > > > > -CONST UINT8 mSha256OidValue[] = { 0x60, 0x86, 0x48, 0x01, 0x65, > > 0x03, 0x04, 0x02, 0x01 }; > > > > +UINT8 mSha256OidValue[] = { 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, > > +0x04, 0x02, > > 0x01 }; > > > > +UINT8 mSha384OidValue[] = { 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, > > +0x04, 0x02, > > 0x02 }; > > > > +UINT8 mSha512OidValue[] = { 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, > > +0x04, 0x02, > > 0x03 }; > > > > + > > > > +EFI_HASH_INFO mHashInfo[] = { > > > > + {SHA256_DIGEST_SIZE, Sha256GetContextSize, Sha256Init, > > + Sha256Update, > > Sha256Final, &mHashSha256Ctx, mSha256OidValue, 9}, > > > > + {SHA384_DIGEST_SIZE, Sha384GetContextSize, Sha384Init, > > + Sha384Update, > > Sha384Final, &mHashSha384Ctx, mSha384OidValue, 9}, > > > > + {SHA512_DIGEST_SIZE, Sha512GetContextSize, Sha512Init, > > + Sha512Update, > > Sha512Final, &mHashSha512Ctx, mSha512OidValue, 9}, > > > > +}; > > > > > > > > // > > > > // Requirement for different signature type which have been defined > > in UEFI spec. > > > > @@ -44,6 +157,8 @@ EFI_SIGNATURE_ITEM mSupportSigItem[] = { > > // {SigType, SigHeaderSize, SigDataSize } > > > > { EFI_CERT_SHA256_GUID, 0, 32 }, > > > > { EFI_CERT_RSA2048_GUID, 0, 256 }, > > > > + { EFI_CERT_RSA3072_GUID, 0, 384 }, > > > > + { EFI_CERT_RSA4096_GUID, 0, 512 }, > > > > { EFI_CERT_RSA2048_SHA256_GUID, 0, 256 }, > > > > { EFI_CERT_SHA1_GUID, 0, 20 }, > > > > { EFI_CERT_RSA2048_SHA1_GUID, 0, 256 }, > > > > @@ -1090,26 +1205,28 @@ AuthServiceInternalCompareTimeStamp ( } > > > > > > > > /** > > > > - Calculate SHA256 digest of SignerCert CommonName + ToplevelCert > > tbsCertificate > > > > + Calculate SHA digest of SignerCert CommonName + ToplevelCert > > + tbsCertificate > > > > SignerCert and ToplevelCert are inside the signer certificate chain. > > > > > > > > + @param[in] HashAlgId Hash algorithm index > > > > @param[in] SignerCert A pointer to SignerCert data. > > > > @param[in] SignerCertSize Length of SignerCert data. > > > > @param[in] TopLevelCert A pointer to TopLevelCert data. > > > > @param[in] TopLevelCertSize Length of TopLevelCert data. > > > > - @param[out] Sha256Digest Sha256 digest calculated. > > > > + @param[out] ShaDigest Sha digest calculated. > > > > > > > > @return EFI_ABORTED Digest process failed. > > > > - @return EFI_SUCCESS SHA256 Digest is successfully calculated. > > > > + @return EFI_SUCCESS SHA Digest is successfully calculated. > > > > > > > > **/ > > > > EFI_STATUS > > > > -CalculatePrivAuthVarSignChainSHA256Digest ( > > > > +CalculatePrivAuthVarSignChainSHADigest ( > > > > + IN UINT8 HashAlgId, > > > > IN UINT8 *SignerCert, > > > > IN UINTN SignerCertSize, > > > > IN UINT8 *TopLevelCert, > > > > IN UINTN TopLevelCertSize, > > > > - OUT UINT8 *Sha256Digest > > > > + OUT UINT8 *ShaDigest > > > > ) > > > > { > > > > UINT8 *TbsCert; > > > > @@ -1119,6 +1236,11 @@ CalculatePrivAuthVarSignChainSHA256Digest ( > > BOOLEAN CryptoStatus; > > > > EFI_STATUS Status; > > > > > > > > + if (HashAlgId >= (sizeof (mHashInfo) / sizeof (EFI_HASH_INFO))) { > > > > + DEBUG ((DEBUG_INFO, "%a Unsupported Hash Algorithm %d\n", > > + __func__, > > HashAlgId)); > > > > + return EFI_ABORTED; > > > > + } > > > > + > > > > CertCommonNameSize = sizeof (CertCommonName); > > > > > > > > // > > > > @@ -1141,8 +1263,8 @@ CalculatePrivAuthVarSignChainSHA256Digest ( > > // > > > > // Digest SignerCert CN + TopLevelCert tbsCertificate > > > > // > > > > - ZeroMem (Sha256Digest, SHA256_DIGEST_SIZE); > > > > - CryptoStatus = Sha256Init (mHashCtx); > > > > + ZeroMem (ShaDigest, mHashInfo[HashAlgId].HashSize); > > > > + CryptoStatus = mHashInfo[HashAlgId].Init > > (*(mHashInfo[HashAlgId].HashShaCtx)); > > > > if (!CryptoStatus) { > > > > return EFI_ABORTED; > > > > } > > > > @@ -1150,8 +1272,8 @@ CalculatePrivAuthVarSignChainSHA256Digest ( > > // > > > > // '\0' is forced in CertCommonName. No overflow issue > > > > // > > > > - CryptoStatus = Sha256Update ( > > > > - mHashCtx, > > > > + CryptoStatus = mHashInfo[HashAlgId].Update ( > > > > + *(mHashInfo[HashAlgId].HashShaCtx), > > > > CertCommonName, > > > > AsciiStrLen (CertCommonName) > > > > ); > > > > @@ -1159,12 +1281,12 @@ CalculatePrivAuthVarSignChainSHA256Digest ( > > return EFI_ABORTED; > > > > } > > > > > > > > - CryptoStatus = Sha256Update (mHashCtx, TbsCert, TbsCertSize); > > > > + CryptoStatus = mHashInfo[HashAlgId].Update > > (*(mHashInfo[HashAlgId].HashShaCtx), TbsCert, TbsCertSize); > > > > if (!CryptoStatus) { > > > > return EFI_ABORTED; > > > > } > > > > > > > > - CryptoStatus = Sha256Final (mHashCtx, Sha256Digest); > > > > + CryptoStatus = mHashInfo[HashAlgId].Final > > (*(mHashInfo[HashAlgId].HashShaCtx), ShaDigest); > > > > if (!CryptoStatus) { > > > > return EFI_ABORTED; > > > > } > > > > @@ -1516,9 +1638,10 @@ DeleteCertsFromDb ( > > /** > > > > Insert signer's certificates for common authenticated variable with > > VariableName > > > > and VendorGuid in AUTH_CERT_DB_DATA to "certdb" or "certdbv" > > according to > > > > - time based authenticated variable attributes. CertData is the > > SHA256 digest of > > > > + time based authenticated variable attributes. CertData is the SHA > > + digest of > > > > SignerCert CommonName + TopLevelCert tbsCertificate. > > > > > > > > + @param[in] HashAlgId Hash algorithm index. > > > > @param[in] VariableName Name of authenticated Variable. > > > > @param[in] VendorGuid Vendor GUID of authenticated Variable. > > > > @param[in] Attributes Attributes of authenticated variable. > > > > @@ -1536,6 +1659,7 @@ DeleteCertsFromDb ( **/ > > > > EFI_STATUS > > > > InsertCertsToDb ( > > > > + IN UINT8 HashAlgId, > > > > IN CHAR16 *VariableName, > > > > IN EFI_GUID *VendorGuid, > > > > IN UINT32 Attributes, > > > > @@ -1556,12 +1680,16 @@ InsertCertsToDb ( > > UINT32 CertDataSize; > > > > AUTH_CERT_DB_DATA *Ptr; > > > > CHAR16 *DbName; > > > > - UINT8 Sha256Digest[SHA256_DIGEST_SIZE]; > > > > + UINT8 ShaDigest[SHA_DIGEST_SIZE_MAX]; > > > > > > > > if ((VariableName == NULL) || (VendorGuid == NULL) || (SignerCert > > == NULL) || (TopLevelCert == NULL)) { > > > > return EFI_INVALID_PARAMETER; > > > > } > > > > > > > > + if (HashAlgId >= (sizeof (mHashInfo) / sizeof (EFI_HASH_INFO))) { > > > > + return EFI_INVALID_PARAMETER; > > > > + } > > > > + > > > > if ((Attributes & EFI_VARIABLE_NON_VOLATILE) != 0) { > > > > // > > > > // Get variable "certdb". > > > > @@ -1618,20 +1746,22 @@ InsertCertsToDb ( > > // Construct new data content of variable "certdb" or "certdbv". > > > > // > > > > NameSize = (UINT32)StrLen (VariableName); > > > > - CertDataSize = sizeof (Sha256Digest); > > > > + CertDataSize = mHashInfo[HashAlgId].HashSize; > > > > CertNodeSize = sizeof (AUTH_CERT_DB_DATA) + (UINT32)CertDataSize + > > NameSize * sizeof (CHAR16); > > > > NewCertDbSize = (UINT32)DataSize + CertNodeSize; > > > > if (NewCertDbSize > mMaxCertDbSize) { > > > > return EFI_OUT_OF_RESOURCES; > > > > } > > > > > > > > - Status = CalculatePrivAuthVarSignChainSHA256Digest ( > > > > + Status = CalculatePrivAuthVarSignChainSHADigest ( > > > > + HashAlgId, > > > > SignerCert, > > > > SignerCertSize, > > > > TopLevelCert, > > > > TopLevelCertSize, > > > > - Sha256Digest > > > > + ShaDigest > > > > ); > > > > + > > > > if (EFI_ERROR (Status)) { > > > > return Status; > > > > } > > > > @@ -1663,7 +1793,7 @@ InsertCertsToDb ( > > > > > > CopyMem ( > > > > (UINT8 *)Ptr + sizeof (AUTH_CERT_DB_DATA) + NameSize * sizeof > > (CHAR16), > > > > - Sha256Digest, > > > > + ShaDigest, > > > > CertDataSize > > > > ); > > > > > > > > @@ -1790,6 +1920,36 @@ CleanCertsFromDb ( > > return Status; > > > > } > > > > > > > > +/** > > > > + Find hash algorithm index > > > > + > > > > + @param[in] SigData Pointer to the PKCS#7 message > > > > + @param[in] SigDataSize Length of the PKCS#7 message > > > > + > > > > + @retval UINT8 Hash Algorithm Index > > > > +**/ > > > > +UINT8 > > > > +FindHashAlgorithmIndex ( > > > > + IN UINT8 *SigData, > > > > + IN UINT32 SigDataSize > > > > +) > > > > +{ > > > > + UINT8 i; > > > > + > > > > + for (i = 0; i < (sizeof (mHashInfo) / sizeof (EFI_HASH_INFO)); i++) > > + { > > > > + if ( ( (SigDataSize >= (13 + mHashInfo[i].OidLength)) > > > > + && ( ((*(SigData + 1) & TWO_BYTE_ENCODE) == > > + TWO_BYTE_ENCODE) > > > > + && (CompareMem (SigData + 13, mHashInfo[i].OidValue, > > mHashInfo[i].OidLength) == 0))) > > > > + || (( (SigDataSize >= (32 + mHashInfo[i].OidLength))) > > > > + && ( ((*(SigData + 20) & TWO_BYTE_ENCODE) == > > + TWO_BYTE_ENCODE) > > > > + && (CompareMem (SigData + 32, mHashInfo[i].OidValue, > > mHashInfo[i].OidLength) == 0)))) > > > > + { > > > > + break; > > > > + } > > > > + } > > > > + return i; > > > > +} > > > > + > > > > /** > > > > Process variable with > > EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS set > > > > > > > > @@ -1857,8 +2017,9 @@ VerifyTimeBasedPayload ( > > UINTN CertStackSize; > > > > UINT8 *CertsInCertDb; > > > > UINT32 CertsSizeinDb; > > > > - UINT8 Sha256Digest[SHA256_DIGEST_SIZE]; > > > > + UINT8 ShaDigest[SHA_DIGEST_SIZE_MAX]; > > > > EFI_CERT_DATA *CertDataPtr; > > > > + UINT8 HashAlgId; > > > > > > > > // > > > > // 1. TopLevelCert is the top-level issuer certificate in signature > > Signer Cert Chain > > > > @@ -1928,7 +2089,7 @@ VerifyTimeBasedPayload ( > > > > > > // > > > > // SignedData.digestAlgorithms shall contain the digest algorithm > > used when preparing the > > > > - // signature. Only a digest algorithm of SHA-256 is accepted. > > > > + // signature. Only a digest algorithm of SHA-256, SHA-384 or > > + SHA-512 is > > accepted. > > > > // > > > > // According to PKCS#7 Definition (https://www.rfc- > editor.org/rfc/rfc2315): > > > > // SignedData ::= SEQUENCE { > > > > @@ -1972,14 +2133,9 @@ VerifyTimeBasedPayload ( > > // > > > > // Example generated with: > > https://wiki.archlinux.org/title/Unified_Extensible_Firmware_Interface > > /Secure_ > > Boot#Manual_process > > > > // > > > > + HashAlgId = FindHashAlgorithmIndex (SigData, SigDataSize); > > > > if ((Attributes & > > EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS) != 0) { > > > > - if ( ( (SigDataSize >= (13 + sizeof (mSha256OidValue))) > > > > - && ( ((*(SigData + 1) & TWO_BYTE_ENCODE) != TWO_BYTE_ENCODE) > > > > - || (CompareMem (SigData + 13, &mSha256OidValue, sizeof > > (mSha256OidValue)) != 0))) > > > > - && ( (SigDataSize >= (32 + sizeof (mSha256OidValue))) > > > > - && ( ((*(SigData + 20) & TWO_BYTE_ENCODE) != > TWO_BYTE_ENCODE) > > > > - || (CompareMem (SigData + 32, &mSha256OidValue, sizeof > > (mSha256OidValue)) != 0)))) > > > > - { > > > > + if (HashAlgId >= (sizeof (mHashInfo) / sizeof (EFI_HASH_INFO))) { > > > > return EFI_SECURITY_VIOLATION; > > > > } > > > > } > > > > @@ -2170,19 +2326,20 @@ VerifyTimeBasedPayload ( > > goto Exit; > > > > } > > > > > > > > - if (CertsSizeinDb == SHA256_DIGEST_SIZE) { > > > > + if ((HashAlgId < (sizeof (mHashInfo) / sizeof (EFI_HASH_INFO))) > > + && > > (CertsSizeinDb == mHashInfo[HashAlgId].HashSize)) { > > > > // > > > > // Check hash of signer cert CommonName + Top-level issuer > > tbsCertificate against data in CertDb > > > > // > > > > CertDataPtr = (EFI_CERT_DATA *)(SignerCerts + 1); > > > > - Status = CalculatePrivAuthVarSignChainSHA256Digest ( > > > > + Status = CalculatePrivAuthVarSignChainSHADigest ( > > > > + HashAlgId, > > > > CertDataPtr->CertDataBuffer, > > > > ReadUnaligned32 ((UINT32 > > *)&(CertDataPtr->CertDataLength)), > > > > TopLevelCert, > > > > TopLevelCertSize, > > > > - Sha256Digest > > > > + ShaDigest > > > > ); > > > > - if (EFI_ERROR (Status) || (CompareMem (Sha256Digest, > CertsInCertDb, > > CertsSizeinDb) != 0)) { > > > > + if (EFI_ERROR (Status) || (CompareMem (ShaDigest, > > + CertsInCertDb, > > CertsSizeinDb) != 0)) { > > > > goto Exit; > > > > } > > > > } else { > > > > @@ -2215,6 +2372,7 @@ VerifyTimeBasedPayload ( > > // > > > > CertDataPtr = (EFI_CERT_DATA *)(SignerCerts + 1); > > > > Status = InsertCertsToDb ( > > > > + HashAlgId, > > > > VariableName, > > > > VendorGuid, > > > > Attributes, > > > > diff --git a/SecurityPkg/Library/AuthVariableLib/AuthServiceInternal.h > > b/SecurityPkg/Library/AuthVariableLib/AuthServiceInternal.h > > index b202e613bc..f7bf771d55 100644 > > --- a/SecurityPkg/Library/AuthVariableLib/AuthServiceInternal.h > > +++ b/SecurityPkg/Library/AuthVariableLib/AuthServiceInternal.h > > @@ -92,7 +92,9 @@ extern UINT32 mMaxCertDbSize; extern UINT32 > > mPlatformMode; > > > > extern UINT8 mVendorKeyState; > > > > > > > > -extern VOID *mHashCtx; > > > > +extern VOID *mHashSha256Ctx; > > > > +extern VOID *mHashSha384Ctx; > > > > +extern VOID *mHashSha512Ctx; > > > > > > > > extern AUTH_VAR_LIB_CONTEXT_IN *mAuthVarLibContextIn; > > > > > > > > diff --git a/SecurityPkg/Library/AuthVariableLib/AuthVariableLib.c > > b/SecurityPkg/Library/AuthVariableLib/AuthVariableLib.c > > index dc61ae840c..19e0004699 100644 > > --- a/SecurityPkg/Library/AuthVariableLib/AuthVariableLib.c > > +++ b/SecurityPkg/Library/AuthVariableLib/AuthVariableLib.c > > @@ -26,12 +26,14 @@ UINT32 mMaxCertDbSize; > > UINT32 mPlatformMode; > > > > UINT8 mVendorKeyState; > > > > > > > > -EFI_GUID mSignatureSupport[] = { EFI_CERT_SHA1_GUID, > > EFI_CERT_SHA256_GUID, EFI_CERT_RSA2048_GUID, > EFI_CERT_X509_GUID }; > > > > +EFI_GUID mSignatureSupport[] = { EFI_CERT_SHA1_GUID, > > EFI_CERT_SHA256_GUID, EFI_CERT_SHA384_GUID, > EFI_CERT_SHA512_GUID, > > EFI_CERT_RSA2048_GUID, EFI_CERT_RSA3072_GUID, > EFI_CERT_RSA4096_GUID, > > EFI_CERT_X509_GUID }; > > > > > > > > // > > > > // Hash context pointer > > > > // > > > > -VOID *mHashCtx = NULL; > > > > +VOID *mHashSha256Ctx = NULL; > > > > +VOID *mHashSha384Ctx = NULL; > > > > +VOID *mHashSha512Ctx = NULL; > > > > > > > > VARIABLE_ENTRY_PROPERTY mAuthVarEntry[] = { > > > > { > > > > @@ -91,7 +93,7 @@ VARIABLE_ENTRY_PROPERTY mAuthVarEntry[] = { > > }, > > > > }; > > > > > > > > -VOID **mAuthVarAddressPointer[9]; > > > > +VOID **mAuthVarAddressPointer[11]; > > > > > > > > AUTH_VAR_LIB_CONTEXT_IN *mAuthVarLibContextIn = NULL; > > > > > > > > @@ -120,7 +122,6 @@ AuthVariableLibInitialize ( > > UINT32 VarAttr; > > > > UINT8 *Data; > > > > UINTN DataSize; > > > > - UINTN CtxSize; > > > > UINT8 SecureBootMode; > > > > UINT8 SecureBootEnable; > > > > UINT8 CustomMode; > > > > @@ -135,9 +136,18 @@ AuthVariableLibInitialize ( > > // > > > > // Initialize hash context. > > > > // > > > > - CtxSize = Sha256GetContextSize (); > > > > - mHashCtx = AllocateRuntimePool (CtxSize); > > > > - if (mHashCtx == NULL) { > > > > + mHashSha256Ctx = AllocateRuntimePool (Sha256GetContextSize ()); > > > > + if (mHashSha256Ctx == NULL) { > > > > + return EFI_OUT_OF_RESOURCES; > > > > + } > > > > + > > > > + mHashSha384Ctx = AllocateRuntimePool (Sha384GetContextSize ()); > > > > + if (mHashSha384Ctx == NULL) { > > > > + return EFI_OUT_OF_RESOURCES; > > > > + } > > > > + > > > > + mHashSha512Ctx = AllocateRuntimePool (Sha512GetContextSize ()); > > > > + if (mHashSha512Ctx == NULL) { > > > > return EFI_OUT_OF_RESOURCES; > > > > } > > > > > > > > @@ -356,14 +366,16 @@ AuthVariableLibInitialize ( > > AuthVarLibContextOut->AuthVarEntry = mAuthVarEntry; > > > > AuthVarLibContextOut->AuthVarEntryCount = ARRAY_SIZE > (mAuthVarEntry); > > > > mAuthVarAddressPointer[0] = (VOID **)&mCertDbStore; > > > > - mAuthVarAddressPointer[1] = (VOID **)&mHashCtx; > > > > - mAuthVarAddressPointer[2] = (VOID > **)&mAuthVarLibContextIn; > > > > - mAuthVarAddressPointer[3] = (VOID > **)&(mAuthVarLibContextIn- > > >FindVariable), > > > > - mAuthVarAddressPointer[4] = (VOID > **)&(mAuthVarLibContextIn- > > >FindNextVariable), > > > > - mAuthVarAddressPointer[5] = (VOID > **)&(mAuthVarLibContextIn- > > >UpdateVariable), > > > > - mAuthVarAddressPointer[6] = (VOID > **)&(mAuthVarLibContextIn- > > >GetScratchBuffer), > > > > - mAuthVarAddressPointer[7] = (VOID > **)&(mAuthVarLibContextIn- > > >CheckRemainingSpaceForConsistency), > > > > - mAuthVarAddressPointer[8] = (VOID > **)&(mAuthVarLibContextIn- > > >AtRuntime), > > > > + mAuthVarAddressPointer[1] = (VOID **)&mHashSha256Ctx; > > > > + mAuthVarAddressPointer[2] = (VOID **)&mHashSha384Ctx; > > > > + mAuthVarAddressPointer[3] = (VOID **)&mHashSha512Ctx; > > > > + mAuthVarAddressPointer[4] = (VOID > **)&mAuthVarLibContextIn; > > > > + mAuthVarAddressPointer[5] = (VOID > **)&(mAuthVarLibContextIn- > > >FindVariable), > > > > + mAuthVarAddressPointer[6] = (VOID > **)&(mAuthVarLibContextIn- > > >FindNextVariable), > > > > + mAuthVarAddressPointer[7] = (VOID > **)&(mAuthVarLibContextIn- > > >UpdateVariable), > > > > + mAuthVarAddressPointer[8] = (VOID > **)&(mAuthVarLibContextIn- > > >GetScratchBuffer), > > > > + mAuthVarAddressPointer[9] = (VOID > **)&(mAuthVarLibContextIn- > > >CheckRemainingSpaceForConsistency), > > > > + mAuthVarAddressPointer[10] = (VOID > **)&(mAuthVarLibContextIn- > > >AtRuntime), > > > > AuthVarLibContextOut->AddressPointer = mAuthVarAddressPointer; > > > > AuthVarLibContextOut->AddressPointerCount = ARRAY_SIZE > > (mAuthVarAddressPointer); > > > > > > > > diff --git > > a/SecurityPkg/Library/DxeImageVerificationLib/DxeImageVerificationLib. > > c > > b/SecurityPkg/Library/DxeImageVerificationLib/DxeImageVerificationLib. > > c > > index 5d8dbd5468..88b2d3c6c1 100644 > > --- > > a/SecurityPkg/Library/DxeImageVerificationLib/DxeImageVerificationLib. > > c > > +++ b/SecurityPkg/Library/DxeImageVerificationLib/DxeImageVerification > > +++ Lib.c > > @@ -1620,7 +1620,7 @@ Done: > > in the security database "db", and no valid signature nor any > > hash value of the image may > > > > be reflected in the security database "dbx". > > > > Otherwise, the image is not signed, > > > > - The SHA256 hash value of the image must match a record in the > security > > database "db", and > > > > + The hash value of the image must match a record in the security > > + database > > "db", and > > > > not be reflected in the security data base "dbx". > > > > > > > > Caution: This function may receive untrusted input. > > > > @@ -1690,6 +1690,8 @@ DxeImageVerificationHandler ( > > EFI_STATUS VarStatus; > > > > UINT32 VarAttr; > > > > BOOLEAN IsFound; > > > > + UINT8 HashAlg; > > > > + BOOLEAN IsFoundInDatabase; > > > > > > > > SignatureList = NULL; > > > > SignatureListSize = 0; > > > > @@ -1699,6 +1701,7 @@ DxeImageVerificationHandler ( > > Action = EFI_IMAGE_EXECUTION_AUTH_UNTESTED; > > > > IsVerified = FALSE; > > > > IsFound = FALSE; > > > > + IsFoundInDatabase = FALSE; > > > > > > > > // > > > > // Check the image type and get policy setting. > > > > @@ -1837,40 +1840,50 @@ DxeImageVerificationHandler ( > > // > > > > if ((SecDataDir == NULL) || (SecDataDir->Size == 0)) { > > > > // > > > > - // This image is not signed. The SHA256 hash value of the image must > match a > > record in the security database "db", > > > > + // This image is not signed. The hash value of the image must > > + match a record > > in the security database "db", > > > > // and not be reflected in the security data base "dbx". > > > > // > > > > - if (!HashPeImage (HASHALG_SHA256)) { > > > > - DEBUG ((DEBUG_INFO, "DxeImageVerificationLib: Failed to hash this > image > > using %s.\n", mHashTypeStr)); > > > > - goto Failed; > > > > - } > > > > + HashAlg = sizeof (mHash) / sizeof (HASH_TABLE); > > > > + while (HashAlg > 0) { > > > > + HashAlg--; > > > > + if ((mHash[HashAlg].GetContextSize == NULL) || > > + (mHash[HashAlg].HashInit > > == NULL) || (mHash[HashAlg].HashUpdate == NULL) || > > (mHash[HashAlg].HashFinal == NULL)) { > > > > + continue; > > > > + } > > > > + if (!HashPeImage (HashAlg)) { > > > > + continue; > > > > + } > > > > > > > > - DbStatus = IsSignatureFoundInDatabase ( > > > > - EFI_IMAGE_SECURITY_DATABASE1, > > > > - mImageDigest, > > > > - &mCertType, > > > > - mImageDigestSize, > > > > - &IsFound > > > > - ); > > > > - if (EFI_ERROR (DbStatus) || IsFound) { > > > > - // > > > > - // Image Hash is in forbidden database (DBX). > > > > - // > > > > - DEBUG ((DEBUG_INFO, "DxeImageVerificationLib: Image is not signed > and %s > > hash of image is forbidden by DBX.\n", mHashTypeStr)); > > > > - goto Failed; > > > > + DbStatus = IsSignatureFoundInDatabase ( > > > > + EFI_IMAGE_SECURITY_DATABASE1, > > > > + mImageDigest, > > > > + &mCertType, > > > > + mImageDigestSize, > > > > + &IsFound > > > > + ); > > > > + if (EFI_ERROR (DbStatus) || IsFound) { > > > > + // > > > > + // Image Hash is in forbidden database (DBX). > > > > + // > > > > + DEBUG ((DEBUG_INFO, "DxeImageVerificationLib: Image is not > > + signed > > and %s hash of image is forbidden by DBX.\n", mHashTypeStr)); > > > > + goto Failed; > > > > + } > > > > + > > > > + DbStatus = IsSignatureFoundInDatabase ( > > > > + EFI_IMAGE_SECURITY_DATABASE, > > > > + mImageDigest, > > > > + &mCertType, > > > > + mImageDigestSize, > > > > + &IsFound > > > > + ); > > > > + if (!EFI_ERROR (DbStatus) && IsFound) { > > > > + // > > > > + // Image Hash is in allowed database (DB). > > > > + // > > > > + IsFoundInDatabase = TRUE; > > > > + } > > > > } > > > > > > > > - DbStatus = IsSignatureFoundInDatabase ( > > > > - EFI_IMAGE_SECURITY_DATABASE, > > > > - mImageDigest, > > > > - &mCertType, > > > > - mImageDigestSize, > > > > - &IsFound > > > > - ); > > > > - if (!EFI_ERROR (DbStatus) && IsFound) { > > > > - // > > > > - // Image Hash is in allowed database (DB). > > > > - // > > > > + if (IsFoundInDatabase) { > > > > return EFI_SUCCESS; > > > > } > > > > > > > > diff --git > > > a/SecurityPkg/VariableAuthenticated/SecureBootConfigDxe/SecureBootCon > f > > igDx > > e.inf > > > b/SecurityPkg/VariableAuthenticated/SecureBootConfigDxe/SecureBootCon > f > > igDx > > e.inf > > index 1671d5be7c..cb52a16c09 100644 > > --- > > > a/SecurityPkg/VariableAuthenticated/SecureBootConfigDxe/SecureBootCon > f > > igDx > > e.inf > > +++ > > > b/SecurityPkg/VariableAuthenticated/SecureBootConfigDxe/SecureBootCon > f > > igDx > > e.inf > > @@ -70,6 +70,14 @@ > > ## SOMETIMES_PRODUCES ## GUID # Unique ID for the type of > the > > signature. > > > > gEfiCertRsa2048Guid > > > > > > > > + ## SOMETIMES_CONSUMES ## GUID # Unique ID for the type of > the > > signature. > > > > + ## SOMETIMES_PRODUCES ## GUID # Unique ID for the type of > the > > signature. > > > > + gEfiCertRsa3072Guid > > > > + > > > > + ## SOMETIMES_CONSUMES ## GUID # Unique ID for the type of > the > > signature. > > > > + ## SOMETIMES_PRODUCES ## GUID # Unique ID for the type of > the > > signature. > > > > + gEfiCertRsa4096Guid > > > > + > > > > ## SOMETIMES_CONSUMES ## GUID # Unique ID for the type of > the > > signature. > > > > ## SOMETIMES_PRODUCES ## GUID # Unique ID for the type of > the > > signature. > > > > gEfiCertX509Guid > > > > @@ -82,6 +90,14 @@ > > ## SOMETIMES_PRODUCES ## GUID # Unique ID for the type of > the > > signature. > > > > gEfiCertSha256Guid > > > > > > > > + ## SOMETIMES_CONSUMES ## GUID # Unique ID for the type of > the > > signature. > > > > + ## SOMETIMES_PRODUCES ## GUID # Unique ID for the type of > the > > signature. > > > > + gEfiCertSha384Guid > > > > + > > > > + ## SOMETIMES_CONSUMES ## GUID # Unique ID for the type of > the > > signature. > > > > + ## SOMETIMES_PRODUCES ## GUID # Unique ID for the type of > the > > signature. > > > > + gEfiCertSha512Guid > > > > + > > > > ## SOMETIMES_CONSUMES ## Variable:L"db" > > > > ## SOMETIMES_PRODUCES ## Variable:L"db" > > > > ## SOMETIMES_CONSUMES ## Variable:L"dbx" > > > > diff --git > > > a/SecurityPkg/VariableAuthenticated/SecureBootConfigDxe/SecureBootCon > f > > igIm > > pl.c > > > b/SecurityPkg/VariableAuthenticated/SecureBootConfigDxe/SecureBootCon > f > > igIm > > pl.c > > index 0e31502b1b..90268d34d3 100644 > > --- > > > a/SecurityPkg/VariableAuthenticated/SecureBootConfigDxe/SecureBootCon > f > > igIm > > pl.c > > +++ > > > b/SecurityPkg/VariableAuthenticated/SecureBootConfigDxe/SecureBootCon > f > > igIm > > pl.c > > @@ -560,7 +560,7 @@ ON_EXIT: > > > > > > **/ > > > > EFI_STATUS > > > > -EnrollRsa2048ToKek ( > > > > +EnrollRsaToKek ( > > > > IN SECUREBOOT_CONFIG_PRIVATE_DATA *Private > > > > ) > > > > { > > > > @@ -603,8 +603,19 @@ EnrollRsa2048ToKek ( > > > > > > ASSERT (KeyBlob != NULL); > > > > KeyInfo = (CPL_KEY_INFO *)KeyBlob; > > > > - if (KeyInfo->KeyLengthInBits / 8 != WIN_CERT_UEFI_RSA2048_SIZE) { > > > > - DEBUG ((DEBUG_ERROR, "Unsupported key length, Only RSA2048 is > > supported.\n")); > > > > + if (KeyInfo->KeyType == 0) { > > > > + switch (KeyInfo->KeyLengthInBits / 8) { > > > > + case WIN_CERT_UEFI_RSA2048_SIZE: > > > > + case WIN_CERT_UEFI_RSA3072_SIZE: > > > > + case WIN_CERT_UEFI_RSA4096_SIZE: > > > > + break; > > > > + default : > > > > + DEBUG ((DEBUG_ERROR, "Unsupported key length, Only RSA2048, > > + RSA3072 > > and RSA4096 are supported.\n")); > > > > + Status = EFI_UNSUPPORTED; > > > > + goto ON_EXIT; > > > > + } > > > > + } else { > > > > + DEBUG ((DEBUG_ERROR, "Unsupported key type : %d, only 0 is > > supported.\n", KeyInfo->KeyType)); > > > > Status = EFI_UNSUPPORTED; > > > > goto ON_EXIT; > > > > } > > > > @@ -632,7 +643,7 @@ EnrollRsa2048ToKek ( > > // > > > > KekSigListSize = sizeof (EFI_SIGNATURE_LIST) > > > > + sizeof (EFI_SIGNATURE_DATA) - 1 > > > > - + WIN_CERT_UEFI_RSA2048_SIZE; > > > > + + KeyLenInBytes; > > > > > > > > KekSigList = (EFI_SIGNATURE_LIST *)AllocateZeroPool > > (KekSigListSize); > > > > if (KekSigList == NULL) { > > > > @@ -642,17 +653,32 @@ EnrollRsa2048ToKek ( > > > > > > KekSigList->SignatureListSize = sizeof (EFI_SIGNATURE_LIST) > > > > + sizeof (EFI_SIGNATURE_DATA) - 1 > > > > - + WIN_CERT_UEFI_RSA2048_SIZE; > > > > + + (UINT32) KeyLenInBytes; > > > > KekSigList->SignatureHeaderSize = 0; > > > > - KekSigList->SignatureSize = sizeof (EFI_SIGNATURE_DATA) - 1 + > > WIN_CERT_UEFI_RSA2048_SIZE; > > > > - CopyGuid (&KekSigList->SignatureType, &gEfiCertRsa2048Guid); > > > > + KekSigList->SignatureSize = sizeof (EFI_SIGNATURE_DATA) - 1 + > (UINT32) > > KeyLenInBytes; > > > > + switch (KeyLenInBytes) { > > > > + case WIN_CERT_UEFI_RSA2048_SIZE: > > > > + CopyGuid (&KekSigList->SignatureType, &gEfiCertRsa2048Guid); > > > > + break; > > > > + case WIN_CERT_UEFI_RSA3072_SIZE: > > > > + CopyGuid (&KekSigList->SignatureType, &gEfiCertRsa3072Guid); > > > > + break; > > > > + case WIN_CERT_UEFI_RSA4096_SIZE: > > > > + CopyGuid (&KekSigList->SignatureType, &gEfiCertRsa4096Guid); > > > > + break; > > > > + break; > > > > + default : > > > > + DEBUG ((DEBUG_ERROR, "Unsupported key length.\n")); > > > > + Status = EFI_UNSUPPORTED; > > > > + goto ON_EXIT; > > > > + } > > > > > > > > KEKSigData = (EFI_SIGNATURE_DATA *)((UINT8 *)KekSigList + sizeof > > (EFI_SIGNATURE_LIST)); > > > > CopyGuid (&KEKSigData->SignatureOwner, Private->SignatureGUID); > > > > CopyMem ( > > > > KEKSigData->SignatureData, > > > > KeyBlob + sizeof (CPL_KEY_INFO), > > > > - WIN_CERT_UEFI_RSA2048_SIZE > > > > + KeyLenInBytes > > > > ); > > > > > > > > // > > > > @@ -890,7 +916,7 @@ EnrollKeyExchangeKey ( > > if (IsDerEncodeCertificate (FilePostFix)) { > > > > return EnrollX509ToKek (Private); > > > > } else if (CompareMem (FilePostFix, L".pbk", 4) == 0) { > > > > - return EnrollRsa2048ToKek (Private); > > > > + return EnrollRsaToKek (Private); > > > > } else { > > > > // > > > > // File type is wrong, simply close it > > > > @@ -1847,7 +1873,7 @@ HashPeImage ( > > SectionHeader = NULL; > > > > Status = FALSE; > > > > > > > > - if (HashAlg != HASHALG_SHA256) { > > > > + if ((HashAlg >= HASHALG_MAX)) { > > > > return FALSE; > > > > } > > > > > > > > @@ -1856,8 +1882,25 @@ HashPeImage ( > > // > > > > ZeroMem (mImageDigest, MAX_DIGEST_SIZE); > > > > > > > > - mImageDigestSize = SHA256_DIGEST_SIZE; > > > > - mCertType = gEfiCertSha256Guid; > > > > + switch (HashAlg) { > > > > + case HASHALG_SHA256: > > > > + mImageDigestSize = SHA256_DIGEST_SIZE; > > > > + mCertType = gEfiCertSha256Guid; > > > > + break; > > > > + > > > > + case HASHALG_SHA384: > > > > + mImageDigestSize = SHA384_DIGEST_SIZE; > > > > + mCertType = gEfiCertSha384Guid; > > > > + break; > > > > + > > > > + case HASHALG_SHA512: > > > > + mImageDigestSize = SHA512_DIGEST_SIZE; > > > > + mCertType = gEfiCertSha512Guid; > > > > + break; > > > > + > > > > + default: > > > > + return FALSE; > > > > + } > > > > > > > > CtxSize = mHash[HashAlg].GetContextSize (); > > > > > > > > @@ -2251,6 +2294,7 @@ EnrollImageSignatureToSigDB ( > > UINT32 Attr; > > > > WIN_CERTIFICATE_UEFI_GUID *GuidCertData; > > > > EFI_TIME Time; > > > > + UINT32 HashAlg; > > > > > > > > Data = NULL; > > > > GuidCertData = NULL; > > > > @@ -2289,8 +2333,20 @@ EnrollImageSignatureToSigDB ( > > } > > > > > > > > if (mSecDataDir->SizeOfCert == 0) { > > > > - if (!HashPeImage (HASHALG_SHA256)) { > > > > - Status = EFI_SECURITY_VIOLATION; > > > > + Status = EFI_SECURITY_VIOLATION; > > > > + HashAlg = sizeof (mHash) / sizeof (HASH_TABLE); > > > > + while (HashAlg > 0) { > > > > + HashAlg--; > > > > + if ((mHash[HashAlg].GetContextSize == NULL) || > > + (mHash[HashAlg].HashInit > > == NULL) || (mHash[HashAlg].HashUpdate == NULL) || > > (mHash[HashAlg].HashFinal == NULL)) { > > > > + continue; > > > > + } > > > > + if (HashPeImage (HashAlg)) { > > > > + Status = EFI_SUCCESS; > > > > + break; > > > > + } > > > > + } > > > > + if (EFI_ERROR (Status)) { > > > > + DEBUG ((DEBUG_ERROR, "Fail to get hash digest: %r", Status)); > > > > goto ON_EXIT; > > > > } > > > > } else { > > > > @@ -2589,6 +2645,10 @@ UpdateDeletePage ( > > while ((ItemDataSize > 0) && (ItemDataSize >= > > CertList->SignatureListSize)) { > > > > if (CompareGuid (&CertList->SignatureType, &gEfiCertRsa2048Guid)) > > { > > > > Help = STRING_TOKEN (STR_CERT_TYPE_RSA2048_SHA256_GUID); > > > > + } else if (CompareGuid (&CertList->SignatureType, > > + &gEfiCertRsa3072Guid)) { > > > > + Help = STRING_TOKEN (STR_CERT_TYPE_RSA3072_SHA384_GUID); > > > > + } else if (CompareGuid (&CertList->SignatureType, > > + &gEfiCertRsa4096Guid)) { > > > > + Help = STRING_TOKEN (STR_CERT_TYPE_RSA4096_SHA512_GUID); > > > > } else if (CompareGuid (&CertList->SignatureType, > > &gEfiCertX509Guid)) { > > > > Help = STRING_TOKEN (STR_CERT_TYPE_PCKS7_GUID); > > > > } else if (CompareGuid (&CertList->SignatureType, > > &gEfiCertSha1Guid)) { > > > > @@ -2750,6 +2810,8 @@ DeleteKeyExchangeKey ( > > GuidIndex = 0; > > > > while ((KekDataSize > 0) && (KekDataSize >= > > CertList->SignatureListSize)) { > > > > if (CompareGuid (&CertList->SignatureType, &gEfiCertRsa2048Guid) > > || > > > > + CompareGuid (&CertList->SignatureType, &gEfiCertRsa3072Guid) > > + || > > > > + CompareGuid (&CertList->SignatureType, &gEfiCertRsa4096Guid) > > + || > > > > CompareGuid (&CertList->SignatureType, &gEfiCertX509Guid)) > > > > { > > > > CopyMem (Data + Offset, CertList, (sizeof (EFI_SIGNATURE_LIST) > > + CertList- > > >SignatureHeaderSize)); > > > > @@ -2952,6 +3014,8 @@ DeleteSignature ( > > GuidIndex = 0; > > > > while ((ItemDataSize > 0) && (ItemDataSize >= > > CertList->SignatureListSize)) { > > > > if (CompareGuid (&CertList->SignatureType, &gEfiCertRsa2048Guid) > > || > > > > + CompareGuid (&CertList->SignatureType, &gEfiCertRsa3072Guid) > > + || > > > > + CompareGuid (&CertList->SignatureType, &gEfiCertRsa4096Guid) > > + || > > > > CompareGuid (&CertList->SignatureType, &gEfiCertX509Guid) || > > > > CompareGuid (&CertList->SignatureType, &gEfiCertSha1Guid) || > > > > CompareGuid (&CertList->SignatureType, &gEfiCertSha256Guid) > > || > > > > @@ -3758,12 +3822,20 @@ LoadSignatureList ( > > while ((RemainingSize > 0) && (RemainingSize >= > > ListWalker->SignatureListSize)) { > > > > if (CompareGuid (&ListWalker->SignatureType, > > &gEfiCertRsa2048Guid)) { > > > > ListType = STRING_TOKEN (STR_LIST_TYPE_RSA2048_SHA256); > > > > + } else if (CompareGuid (&ListWalker->SignatureType, > > + &gEfiCertRsa3072Guid)) > > { > > > > + ListType = STRING_TOKEN (STR_LIST_TYPE_RSA3072_SHA384); > > > > + } else if (CompareGuid (&ListWalker->SignatureType, > > + &gEfiCertRsa4096Guid)) > > { > > > > + ListType = STRING_TOKEN (STR_LIST_TYPE_RSA4096_SHA512); > > > > } else if (CompareGuid (&ListWalker->SignatureType, > > &gEfiCertX509Guid)) { > > > > ListType = STRING_TOKEN (STR_LIST_TYPE_X509); > > > > } else if (CompareGuid (&ListWalker->SignatureType, > > &gEfiCertSha1Guid)) { > > > > ListType = STRING_TOKEN (STR_LIST_TYPE_SHA1); > > > > } else if (CompareGuid (&ListWalker->SignatureType, > > &gEfiCertSha256Guid)) { > > > > ListType = STRING_TOKEN (STR_LIST_TYPE_SHA256); > > > > + } else if (CompareGuid (&ListWalker->SignatureType, > > + &gEfiCertSha384Guid)) { > > > > + ListType = STRING_TOKEN (STR_LIST_TYPE_SHA384); > > > > + } else if (CompareGuid (&ListWalker->SignatureType, > > + &gEfiCertSha512Guid)) { > > > > + ListType = STRING_TOKEN (STR_LIST_TYPE_SHA512); > > > > } else if (CompareGuid (&ListWalker->SignatureType, > > &gEfiCertX509Sha256Guid)) { > > > > ListType = STRING_TOKEN (STR_LIST_TYPE_X509_SHA256); > > > > } else if (CompareGuid (&ListWalker->SignatureType, > > &gEfiCertX509Sha384Guid)) { > > > > @@ -4001,6 +4073,14 @@ FormatHelpInfo ( > > ListTypeId = STRING_TOKEN (STR_LIST_TYPE_RSA2048_SHA256); > > > > DataSize = ListEntry->SignatureSize - sizeof (EFI_GUID); > > > > IsCert = TRUE; > > > > + } else if (CompareGuid (&ListEntry->SignatureType, > > + &gEfiCertRsa3072Guid)) { > > > > + ListTypeId = STRING_TOKEN (STR_LIST_TYPE_RSA3072_SHA384); > > > > + DataSize = ListEntry->SignatureSize - sizeof (EFI_GUID); > > > > + IsCert = TRUE; > > > > + } else if (CompareGuid (&ListEntry->SignatureType, > > + &gEfiCertRsa4096Guid)) { > > > > + ListTypeId = STRING_TOKEN (STR_LIST_TYPE_RSA4096_SHA512); > > > > + DataSize = ListEntry->SignatureSize - sizeof (EFI_GUID); > > > > + IsCert = TRUE; > > > > } else if (CompareGuid (&ListEntry->SignatureType, > > &gEfiCertX509Guid)) { > > > > ListTypeId = STRING_TOKEN (STR_LIST_TYPE_X509); > > > > DataSize = ListEntry->SignatureSize - sizeof (EFI_GUID); > > > > @@ -4011,6 +4091,12 @@ FormatHelpInfo ( > > } else if (CompareGuid (&ListEntry->SignatureType, > > &gEfiCertSha256Guid)) { > > > > ListTypeId = STRING_TOKEN (STR_LIST_TYPE_SHA256); > > > > DataSize = 32; > > > > + } else if (CompareGuid (&ListEntry->SignatureType, > > + &gEfiCertSha384Guid)) { > > > > + ListTypeId = STRING_TOKEN (STR_LIST_TYPE_SHA384); > > > > + DataSize = 48; > > > > + } else if (CompareGuid (&ListEntry->SignatureType, > > + &gEfiCertSha512Guid)) { > > > > + ListTypeId = STRING_TOKEN (STR_LIST_TYPE_SHA512); > > > > + DataSize = 64; > > > > } else if (CompareGuid (&ListEntry->SignatureType, > > &gEfiCertX509Sha256Guid)) { > > > > ListTypeId = STRING_TOKEN (STR_LIST_TYPE_X509_SHA256); > > > > DataSize = 32; > > > > diff --git > > > a/SecurityPkg/VariableAuthenticated/SecureBootConfigDxe/SecureBootCon > f > > igIm > > pl.h > > > b/SecurityPkg/VariableAuthenticated/SecureBootConfigDxe/SecureBootCon > f > > igIm > > pl.h > > index 37c66f1b95..ae50d929a7 100644 > > --- > > > a/SecurityPkg/VariableAuthenticated/SecureBootConfigDxe/SecureBootCon > f > > igIm > > pl.h > > +++ > > > b/SecurityPkg/VariableAuthenticated/SecureBootConfigDxe/SecureBootCon > f > > igIm > > pl.h > > @@ -82,6 +82,8 @@ extern EFI_IFR_GUID_LABEL *mEndLabel; #define > > MAX_DIGEST_SIZE SHA512_DIGEST_SIZE > > > > > > > > #define WIN_CERT_UEFI_RSA2048_SIZE 256 > > > > +#define WIN_CERT_UEFI_RSA3072_SIZE 384 > > > > +#define WIN_CERT_UEFI_RSA4096_SIZE 512 > > > > > > > > // > > > > // Support hash types > > > > diff --git > > > a/SecurityPkg/VariableAuthenticated/SecureBootConfigDxe/SecureBootCon > f > > igStr > > ings.uni > > > b/SecurityPkg/VariableAuthenticated/SecureBootConfigDxe/SecureBootCon > f > > igStr > > ings.uni > > index 0d01701de7..1b48acc800 100644 > > --- > > > a/SecurityPkg/VariableAuthenticated/SecureBootConfigDxe/SecureBootCon > f > > igStr > > ings.uni > > +++ > > > b/SecurityPkg/VariableAuthenticated/SecureBootConfigDxe/SecureBootCon > f > > igStr > > ings.uni > > @@ -113,6 +113,8 @@ SPDX-License-Identifier: BSD-2-Clause-Patent > > #string STR_FORM_ENROLL_KEK_FROM_FILE_TITLE_HELP #language en- > US > > "Read the public key of KEK from file" > > > > #string STR_FILE_EXPLORER_TITLE #language en-US "File > Explorer" > > > > #string STR_CERT_TYPE_RSA2048_SHA256_GUID #language en-US > > "RSA2048_SHA256_GUID" > > > > +#string STR_CERT_TYPE_RSA3072_SHA384_GUID #language en-US > > "RSA3072_SHA384_GUID" > > > > +#string STR_CERT_TYPE_RSA4096_SHA512_GUID #language en-US > > "RSA4096_SHA512_GUID" > > > > #string STR_CERT_TYPE_PCKS7_GUID #language en-US > "PKCS7_GUID" > > > > #string STR_CERT_TYPE_SHA1_GUID #language en-US > "SHA1_GUID" > > > > #string STR_CERT_TYPE_SHA256_GUID #language en-US > > "SHA256_GUID" > > > > @@ -121,9 +123,13 @@ SPDX-License-Identifier: BSD-2-Clause-Patent > > #string STR_CERT_TYPE_X509_SHA512_GUID #language en-US > > "X509_SHA512_GUID" > > > > > > > > #string STR_LIST_TYPE_RSA2048_SHA256 #language en-US > > "RSA2048_SHA256" > > > > +#string STR_LIST_TYPE_RSA3072_SHA384 #language en-US > > "RSA3072_SHA384" > > > > +#string STR_LIST_TYPE_RSA4096_SHA512 #language en-US > > "RSA4096_SHA512" > > > > #string STR_LIST_TYPE_X509 #language en-US "X509" > > > > #string STR_LIST_TYPE_SHA1 #language en-US "SHA1" > > > > #string STR_LIST_TYPE_SHA256 #language en-US "SHA256" > > > > +#string STR_LIST_TYPE_SHA384 #language en-US "SHA384" > > > > +#string STR_LIST_TYPE_SHA512 #language en-US "SHA512" > > > > #string STR_LIST_TYPE_X509_SHA256 #language en-US > "X509_SHA256" > > > > #string STR_LIST_TYPE_X509_SHA384 #language en-US > "X509_SHA384" > > > > #string STR_LIST_TYPE_X509_SHA512 #language en-US > "X509_SHA512" > > > > -- > > 2.26.2.windows.1 -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#107219): https://edk2.groups.io/g/devel/message/107219 Mute This Topic: https://groups.io/mt/99981532/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-