+/**\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