| /** @file | |
| TdxMeasurement Functions which are used in SEC and PEI phase | |
| Copyright (c) 2025, Intel Corporation. All rights reserved.<BR> | |
| SPDX-License-Identifier: BSD-2-Clause-Patent | |
| **/ | |
| #include <PiPei.h> | |
| #include <Pi/PiHob.h> | |
| #include <Library/BaseLib.h> | |
| #include <Library/DebugLib.h> | |
| #include <Library/HobLib.h> | |
| #include <Library/BaseMemoryLib.h> | |
| #include <IndustryStandard/Tpm20.h> | |
| #include <IndustryStandard/UefiTcgPlatform.h> | |
| #include <Library/TdxMeasurementLib.h> | |
| /** | |
| * Build GuidHob for Tdx measurement. | |
| * | |
| * Tdx measurement includes the measurement of TdHob and CFV. They're measured | |
| * and extended to RTMR registers in SEC phase. Because at that moment the Hob | |
| * service are not available. So the values of the measurement are saved in | |
| * workarea and will be built into GuidHob after the Hob service is ready. | |
| * | |
| * @param RtmrIndex RTMR index | |
| * @param EventType Event type | |
| * @param EventData Event data | |
| * @param EventSize Size of event data | |
| * @param HashValue Hash value | |
| * @param HashSize Size of hash | |
| * | |
| * @retval EFI_SUCCESS Successfully build the GuidHobs | |
| * @retval Others Other error as indicated | |
| */ | |
| EFI_STATUS | |
| EFIAPI | |
| TdxMeasurementBuildGuidHob ( | |
| UINT32 RtmrIndex, | |
| UINT32 EventType, | |
| UINT8 *EventData, | |
| UINT32 EventSize, | |
| UINT8 *HashValue, | |
| UINT32 HashSize | |
| ) | |
| { | |
| VOID *EventHobData; | |
| UINT8 *Ptr; | |
| TPML_DIGEST_VALUES *TdxDigest; | |
| if (HashSize != SHA384_DIGEST_SIZE) { | |
| return EFI_INVALID_PARAMETER; | |
| } | |
| #define TDX_DIGEST_VALUE_LEN (sizeof (UINT32) + sizeof (TPMI_ALG_HASH) + SHA384_DIGEST_SIZE) | |
| EventHobData = BuildGuidHob ( | |
| &gCcEventEntryHobGuid, | |
| sizeof (TCG_PCRINDEX) + sizeof (TCG_EVENTTYPE) + | |
| TDX_DIGEST_VALUE_LEN + | |
| sizeof (UINT32) + EventSize | |
| ); | |
| if (EventHobData == NULL) { | |
| return EFI_OUT_OF_RESOURCES; | |
| } | |
| Ptr = (UINT8 *)EventHobData; | |
| // | |
| // There are 2 types of measurement registers in TDX: MRTD and RTMR[0-3]. | |
| // According to UEFI Spec 2.10 Section 38.4.1, RTMR[0-3] is mapped to MrIndex[1-4]. | |
| // So RtmrIndex must be increased by 1 before the event log is created. | |
| // | |
| RtmrIndex++; | |
| CopyMem (Ptr, &RtmrIndex, sizeof (UINT32)); | |
| Ptr += sizeof (UINT32); | |
| CopyMem (Ptr, &EventType, sizeof (TCG_EVENTTYPE)); | |
| Ptr += sizeof (TCG_EVENTTYPE); | |
| TdxDigest = (TPML_DIGEST_VALUES *)Ptr; | |
| TdxDigest->count = 1; | |
| TdxDigest->digests[0].hashAlg = TPM_ALG_SHA384; | |
| CopyMem ( | |
| TdxDigest->digests[0].digest.sha384, | |
| HashValue, | |
| SHA384_DIGEST_SIZE | |
| ); | |
| Ptr += TDX_DIGEST_VALUE_LEN; | |
| CopyMem (Ptr, &EventSize, sizeof (UINT32)); | |
| Ptr += sizeof (UINT32); | |
| CopyMem (Ptr, (VOID *)EventData, EventSize); | |
| Ptr += EventSize; | |
| return EFI_SUCCESS; | |
| } |