IN TPMI_ALG_HASH HashAlgo\r
);\r
\r
+/**\r
+ Copy TPML_DIGEST_VALUES into a buffer\r
+\r
+ @param[in,out] Buffer Buffer to hold TPML_DIGEST_VALUES.\r
+ @param[in] DigestList TPML_DIGEST_VALUES to be copied.\r
+ @param[in] HashAlgorithmMask HASH bits corresponding to the desired digests to copy.\r
+\r
+ @return The end of buffer to hold TPML_DIGEST_VALUES.\r
+**/\r
+VOID *\r
+EFIAPI\r
+CopyDigestListToBuffer(\r
+ IN OUT VOID *Buffer,\r
+ IN TPML_DIGEST_VALUES *DigestList,\r
+ IN UINT32 HashAlgorithmMask\r
+ );\r
+\r
/**\r
Get TPML_DIGEST_VALUES data size.\r
\r
return (UINT32)(UINTN)(Buffer - (UINT8 *)AuthSessionIn);\r
}\r
\r
+/**\r
+ Return if hash alg is supported in HashAlgorithmMask.\r
+\r
+ @param HashAlg Hash algorithm to be checked.\r
+ @param HashAlgorithmMask Bitfield of allowed hash algorithms.\r
+\r
+ @retval TRUE Hash algorithm is supported.\r
+ @retval FALSE Hash algorithm is not supported.\r
+**/\r
+BOOLEAN\r
+IsHashAlgSupportedInHashAlgorithmMask(\r
+ IN TPMI_ALG_HASH HashAlg,\r
+ IN UINT32 HashAlgorithmMask\r
+ )\r
+{\r
+ switch (HashAlg) {\r
+ case TPM_ALG_SHA1:\r
+ if ((HashAlgorithmMask & HASH_ALG_SHA1) != 0) {\r
+ return TRUE;\r
+ }\r
+ break;\r
+ case TPM_ALG_SHA256:\r
+ if ((HashAlgorithmMask & HASH_ALG_SHA256) != 0) {\r
+ return TRUE;\r
+ }\r
+ break;\r
+ case TPM_ALG_SHA384:\r
+ if ((HashAlgorithmMask & HASH_ALG_SHA384) != 0) {\r
+ return TRUE;\r
+ }\r
+ break;\r
+ case TPM_ALG_SHA512:\r
+ if ((HashAlgorithmMask & HASH_ALG_SHA512) != 0) {\r
+ return TRUE;\r
+ }\r
+ break;\r
+ case TPM_ALG_SM3_256:\r
+ if ((HashAlgorithmMask & HASH_ALG_SM3_256) != 0) {\r
+ return TRUE;\r
+ }\r
+ break;\r
+ }\r
+\r
+ return FALSE;\r
+}\r
+\r
+/**\r
+ Copy TPML_DIGEST_VALUES into a buffer\r
+\r
+ @param[in,out] Buffer Buffer to hold TPML_DIGEST_VALUES.\r
+ @param[in] DigestList TPML_DIGEST_VALUES to be copied.\r
+ @param[in] HashAlgorithmMask HASH bits corresponding to the desired digests to copy.\r
+\r
+ @return The end of buffer to hold TPML_DIGEST_VALUES.\r
+**/\r
+VOID *\r
+EFIAPI\r
+CopyDigestListToBuffer (\r
+ IN OUT VOID *Buffer,\r
+ IN TPML_DIGEST_VALUES *DigestList,\r
+ IN UINT32 HashAlgorithmMask\r
+ )\r
+{\r
+ UINTN Index;\r
+ UINT16 DigestSize;\r
+\r
+ CopyMem (Buffer, &DigestList->count, sizeof(DigestList->count));\r
+ Buffer = (UINT8 *)Buffer + sizeof(DigestList->count);\r
+ for (Index = 0; Index < DigestList->count; Index++) {\r
+ if (!IsHashAlgSupportedInHashAlgorithmMask(DigestList->digests[Index].hashAlg, HashAlgorithmMask)) {\r
+ DEBUG ((EFI_D_ERROR, "WARNING: TPM2 Event log has HashAlg unsupported by PCR bank (0x%x)\n", DigestList->digests[Index].hashAlg));\r
+ continue;\r
+ }\r
+ CopyMem (Buffer, &DigestList->digests[Index].hashAlg, sizeof(DigestList->digests[Index].hashAlg));\r
+ Buffer = (UINT8 *)Buffer + sizeof(DigestList->digests[Index].hashAlg);\r
+ DigestSize = GetHashSizeFromAlgo (DigestList->digests[Index].hashAlg);\r
+ CopyMem (Buffer, &DigestList->digests[Index].digest, DigestSize);\r
+ Buffer = (UINT8 *)Buffer + DigestSize;\r
+ }\r
+\r
+ return Buffer;\r
+}\r
+\r
/**\r
Get TPML_DIGEST_VALUES data size.\r
\r
return TotalSize;\r
}\r
\r
-/**\r
- Return if hash alg is supported in TPM PCR bank.\r
-\r
- @param HashAlg Hash algorithm to be checked.\r
-\r
- @retval TRUE Hash algorithm is supported.\r
- @retval FALSE Hash algorithm is not supported.\r
-**/\r
-BOOLEAN\r
-IsHashAlgSupportedInPcrBank (\r
- IN TPMI_ALG_HASH HashAlg\r
- )\r
-{\r
- switch (HashAlg) {\r
- case TPM_ALG_SHA1:\r
- if ((mTcgDxeData.BsCap.ActivePcrBanks & EFI_TCG2_BOOT_HASH_ALG_SHA1) != 0) {\r
- return TRUE;\r
- }\r
- break;\r
- case TPM_ALG_SHA256:\r
- if ((mTcgDxeData.BsCap.ActivePcrBanks & EFI_TCG2_BOOT_HASH_ALG_SHA256) != 0) {\r
- return TRUE;\r
- }\r
- break;\r
- case TPM_ALG_SHA384:\r
- if ((mTcgDxeData.BsCap.ActivePcrBanks & EFI_TCG2_BOOT_HASH_ALG_SHA384) != 0) {\r
- return TRUE;\r
- }\r
- break;\r
- case TPM_ALG_SHA512:\r
- if ((mTcgDxeData.BsCap.ActivePcrBanks & EFI_TCG2_BOOT_HASH_ALG_SHA512) != 0) {\r
- return TRUE;\r
- }\r
- break;\r
- case TPM_ALG_SM3_256:\r
- if ((mTcgDxeData.BsCap.ActivePcrBanks & EFI_TCG2_BOOT_HASH_ALG_SM3_256) != 0) {\r
- return TRUE;\r
- }\r
- break;\r
- }\r
-\r
- return FALSE;\r
-}\r
-\r
-/**\r
- Copy TPML_DIGEST_VALUES into a buffer\r
-\r
- @param[in,out] Buffer Buffer to hold TPML_DIGEST_VALUES.\r
- @param[in] DigestList TPML_DIGEST_VALUES to be copied.\r
-\r
- @return The end of buffer to hold TPML_DIGEST_VALUES.\r
-**/\r
-VOID *\r
-CopyDigestListToBuffer (\r
- IN OUT VOID *Buffer,\r
- IN TPML_DIGEST_VALUES *DigestList\r
- )\r
-{\r
- UINTN Index;\r
- UINT16 DigestSize;\r
-\r
- CopyMem (Buffer, &DigestList->count, sizeof(DigestList->count));\r
- Buffer = (UINT8 *)Buffer + sizeof(DigestList->count);\r
- for (Index = 0; Index < DigestList->count; Index++) {\r
- if (!IsHashAlgSupportedInPcrBank (DigestList->digests[Index].hashAlg)) {\r
- DEBUG ((EFI_D_ERROR, "WARNING: TPM2 Event log has HashAlg unsupported by PCR bank (0x%x)\n", DigestList->digests[Index].hashAlg));\r
- continue;\r
- }\r
- CopyMem (Buffer, &DigestList->digests[Index].hashAlg, sizeof(DigestList->digests[Index].hashAlg));\r
- Buffer = (UINT8 *)Buffer + sizeof(DigestList->digests[Index].hashAlg);\r
- DigestSize = GetHashSizeFromAlgo (DigestList->digests[Index].hashAlg);\r
- CopyMem (Buffer, &DigestList->digests[Index].digest, DigestSize);\r
- Buffer = (UINT8 *)Buffer + DigestSize;\r
- }\r
-\r
- return Buffer;\r
-}\r
-\r
/**\r
Add a new entry to the Event Log.\r
\r
TcgPcrEvent2.PCRIndex = NewEventHdr->PCRIndex;\r
TcgPcrEvent2.EventType = NewEventHdr->EventType;\r
DigestBuffer = (UINT8 *)&TcgPcrEvent2.Digest;\r
- DigestBuffer = CopyDigestListToBuffer (DigestBuffer, DigestList);\r
+ DigestBuffer = CopyDigestListToBuffer (DigestBuffer, DigestList, mTcgDxeData.BsCap.ActivePcrBanks);\r
CopyMem (DigestBuffer, &NewEventHdr->EventSize, sizeof(NewEventHdr->EventSize));\r
DigestBuffer = DigestBuffer + sizeof(NewEventHdr->EventSize);\r
\r
return EFI_SUCCESS;\r
}\r
\r
-/**\r
- Return if hash alg is supported in TPM PCR bank.\r
-\r
- @param HashAlg Hash algorithm to be checked.\r
-\r
- @retval TRUE Hash algorithm is supported.\r
- @retval FALSE Hash algorithm is not supported.\r
-**/\r
-BOOLEAN\r
-IsHashAlgSupportedInPcrBank (\r
- IN TPMI_ALG_HASH HashAlg\r
- )\r
-{\r
- UINT32 ActivePcrBanks;\r
-\r
- ActivePcrBanks = PcdGet32 (PcdTpm2HashMask);\r
- switch (HashAlg) {\r
- case TPM_ALG_SHA1:\r
- if ((ActivePcrBanks & EFI_TCG2_BOOT_HASH_ALG_SHA1) != 0) {\r
- return TRUE;\r
- }\r
- break;\r
- case TPM_ALG_SHA256:\r
- if ((ActivePcrBanks & EFI_TCG2_BOOT_HASH_ALG_SHA256) != 0) {\r
- return TRUE;\r
- }\r
- break;\r
- case TPM_ALG_SHA384:\r
- if ((ActivePcrBanks & EFI_TCG2_BOOT_HASH_ALG_SHA384) != 0) {\r
- return TRUE;\r
- }\r
- break;\r
- case TPM_ALG_SHA512:\r
- if ((ActivePcrBanks & EFI_TCG2_BOOT_HASH_ALG_SHA512) != 0) {\r
- return TRUE;\r
- }\r
- break;\r
- case TPM_ALG_SM3_256:\r
- if ((ActivePcrBanks & EFI_TCG2_BOOT_HASH_ALG_SM3_256) != 0) {\r
- return TRUE;\r
- }\r
- break;\r
- }\r
-\r
- return FALSE;\r
-}\r
-\r
-/**\r
- Copy TPML_DIGEST_VALUES into a buffer\r
-\r
- @param[in,out] Buffer Buffer to hold TPML_DIGEST_VALUES.\r
- @param[in] DigestList TPML_DIGEST_VALUES to be copied.\r
-\r
- @return The end of buffer to hold TPML_DIGEST_VALUES.\r
-**/\r
-VOID *\r
-CopyDigestListToBuffer (\r
- IN OUT VOID *Buffer,\r
- IN TPML_DIGEST_VALUES *DigestList\r
- )\r
-{\r
- UINTN Index;\r
- UINT16 DigestSize;\r
-\r
- CopyMem (Buffer, &DigestList->count, sizeof(DigestList->count));\r
- Buffer = (UINT8 *)Buffer + sizeof(DigestList->count);\r
- for (Index = 0; Index < DigestList->count; Index++) {\r
- if (!IsHashAlgSupportedInPcrBank (DigestList->digests[Index].hashAlg)) {\r
- DEBUG ((EFI_D_ERROR, "WARNING: TPM2 Event log has HashAlg unsupported by PCR bank (0x%x)\n", DigestList->digests[Index].hashAlg));\r
- continue;\r
- }\r
- CopyMem (Buffer, &DigestList->digests[Index].hashAlg, sizeof(DigestList->digests[Index].hashAlg));\r
- Buffer = (UINT8 *)Buffer + sizeof(DigestList->digests[Index].hashAlg);\r
- DigestSize = GetHashSizeFromAlgo (DigestList->digests[Index].hashAlg);\r
- CopyMem (Buffer, &DigestList->digests[Index].digest, DigestSize);\r
- Buffer = (UINT8 *)Buffer + DigestSize;\r
- }\r
-\r
- return Buffer;\r
-}\r
-\r
/**\r
Set Tpm2HashMask PCD value according to TPM2 PCR bank.\r
**/\r
TcgPcrEvent2->PCRIndex = NewEventHdr->PCRIndex;\r
TcgPcrEvent2->EventType = NewEventHdr->EventType;\r
DigestBuffer = (UINT8 *)&TcgPcrEvent2->Digest;\r
- DigestBuffer = CopyDigestListToBuffer (DigestBuffer, DigestList);\r
+ DigestBuffer = CopyDigestListToBuffer (DigestBuffer, DigestList, PcdGet32 (PcdTpm2HashMask));\r
CopyMem (DigestBuffer, &NewEventHdr->EventSize, sizeof(TcgPcrEvent2->EventSize));\r
DigestBuffer = DigestBuffer + sizeof(TcgPcrEvent2->EventSize);\r
CopyMem (DigestBuffer, NewEventData, NewEventHdr->EventSize);\r