| /** @file | |
| TdxMeasurement Common Functions | |
| Copyright (c) 2025, Intel Corporation. All rights reserved.<BR> | |
| SPDX-License-Identifier: BSD-2-Clause-Patent | |
| **/ | |
| #include <PiPei.h> | |
| #include <Ppi/CcMeasurement.h> | |
| #include <Library/DebugLib.h> | |
| #include <Library/PeiServicesLib.h> | |
| #include <Library/TdxLib.h> | |
| #include <Library/BaseMemoryLib.h> | |
| #include <Library/BaseCryptLib.h> | |
| #include <Library/TdxMeasurementLib.h> | |
| /** | |
| According to UEFI Spec 2.10 Section 38.4.1: | |
| The following table shows the TPM PCR index mapping and CC event log measurement | |
| register index interpretation for Intel TDX, where MRTD means Trust Domain Measurement | |
| Register and RTMR means Runtime Measurement Register | |
| // TPM PCR Index | CC Measurement Register Index | TDX-measurement register | |
| // ------------------------------------------------------------------------ | |
| // 0 | 0 | MRTD | |
| // 1, 7 | 1 | RTMR[0] | |
| // 2~6 | 2 | RTMR[1] | |
| // 8~15 | 3 | RTMR[2] | |
| @param[in] PCRIndex Index of the TPM PCR | |
| @retval UINT32 Index of the CC Event Log Measurement Register Index | |
| @retval CC_MR_INDEX_INVALID Invalid MR Index | |
| **/ | |
| UINT32 | |
| EFIAPI | |
| TdxMeasurementMapPcrToMrIndex ( | |
| IN UINT32 PCRIndex | |
| ) | |
| { | |
| UINT32 MrIndex; | |
| if (PCRIndex > 15) { | |
| ASSERT (FALSE); | |
| return CC_MR_INDEX_INVALID; | |
| } | |
| MrIndex = 0; | |
| if (PCRIndex == 0) { | |
| MrIndex = CC_MR_INDEX_0_MRTD; | |
| } else if ((PCRIndex == 1) || (PCRIndex == 7)) { | |
| MrIndex = CC_MR_INDEX_1_RTMR0; | |
| } else if ((PCRIndex >= 2) && (PCRIndex <= 6)) { | |
| MrIndex = CC_MR_INDEX_2_RTMR1; | |
| } else if ((PCRIndex >= 8) && (PCRIndex <= 15)) { | |
| MrIndex = CC_MR_INDEX_3_RTMR2; | |
| } | |
| return MrIndex; | |
| } | |
| /** | |
| * Calculate the sha384 of input Data and extend it to RTMR register. | |
| * | |
| * @param RtmrIndex Index of the RTMR register | |
| * @param DataToHash Data to be hashed | |
| * @param DataToHashLen Length of the data | |
| * @param Digest Hash value of the input data | |
| * @param DigestLen Length of the hash value | |
| * | |
| * @retval EFI_SUCCESS Successfully hash and extend to RTMR | |
| * @retval Others Other errors as indicated | |
| */ | |
| EFI_STATUS | |
| EFIAPI | |
| TdxMeasurementHashAndExtendToRtmr ( | |
| IN UINT32 RtmrIndex, | |
| IN VOID *DataToHash, | |
| IN UINTN DataToHashLen, | |
| OUT UINT8 *Digest, | |
| IN UINTN DigestLen | |
| ) | |
| { | |
| EFI_STATUS Status; | |
| if ((DataToHash == NULL) || (DataToHashLen == 0)) { | |
| return EFI_INVALID_PARAMETER; | |
| } | |
| if ((Digest == NULL) || (DigestLen != SHA384_DIGEST_SIZE)) { | |
| return EFI_INVALID_PARAMETER; | |
| } | |
| // | |
| // Calculate the sha384 of the data | |
| // | |
| if (!Sha384HashAll (DataToHash, DataToHashLen, Digest)) { | |
| return EFI_ABORTED; | |
| } | |
| // | |
| // Extend to RTMR | |
| // | |
| Status = TdExtendRtmr ( | |
| (UINT32 *)Digest, | |
| SHA384_DIGEST_SIZE, | |
| (UINT8)RtmrIndex | |
| ); | |
| ASSERT (!EFI_ERROR (Status)); | |
| return Status; | |
| } |