/** @file | |
Extends one of the RTMR measurement registers in TDCS with the provided | |
extension data in memory. | |
Copyright (c) 2020 - 2021, Intel Corporation. All rights reserved.<BR> | |
SPDX-License-Identifier: BSD-2-Clause-Patent | |
**/ | |
#include <Library/BaseLib.h> | |
#include <Library/DebugLib.h> | |
#include <Uefi/UefiBaseType.h> | |
#include <Library/TdxLib.h> | |
#include <Library/BaseMemoryLib.h> | |
#include <IndustryStandard/Tpm20.h> | |
#include <IndustryStandard/Tdx.h> | |
#define RTMR_COUNT 4 | |
#define TD_EXTEND_BUFFER_LEN (64 + 48) | |
UINT8 mExtendBuffer[TD_EXTEND_BUFFER_LEN]; | |
/** | |
This function extends one of the RTMR measurement register | |
in TDCS with the provided extension data in memory. | |
RTMR extending supports SHA384 which length is 48 bytes. | |
@param[in] Data Point to the data to be extended | |
@param[in] DataLen Length of the data. Must be 48 | |
@param[in] Index RTMR index | |
@return EFI_SUCCESS | |
@return EFI_INVALID_PARAMETER | |
@return EFI_DEVICE_ERROR | |
**/ | |
EFI_STATUS | |
EFIAPI | |
TdExtendRtmr ( | |
IN UINT32 *Data, | |
IN UINT32 DataLen, | |
IN UINT8 Index | |
) | |
{ | |
EFI_STATUS Status; | |
UINT64 TdCallStatus; | |
UINT8 *ExtendBuffer; | |
Status = EFI_SUCCESS; | |
ASSERT (Data != NULL); | |
ASSERT (DataLen == SHA384_DIGEST_SIZE); | |
ASSERT (Index < RTMR_COUNT); | |
if ((Data == NULL) || (DataLen != SHA384_DIGEST_SIZE) || (Index >= RTMR_COUNT)) { | |
return EFI_INVALID_PARAMETER; | |
} | |
// TD.RTMR.EXTEND requires 64B-aligned guest physical address of | |
// 48B-extension data. We use ALIGN_POINTER(Pointer, 64) to get | |
// the 64B-aligned guest physical address. | |
ExtendBuffer = ALIGN_POINTER (mExtendBuffer, 64); | |
ASSERT (((UINTN)ExtendBuffer & 0x3f) == 0); | |
ZeroMem (ExtendBuffer, SHA384_DIGEST_SIZE); | |
CopyMem (ExtendBuffer, Data, SHA384_DIGEST_SIZE); | |
TdCallStatus = TdCall (TDCALL_TDEXTENDRTMR, (UINT64)(UINTN)ExtendBuffer, Index, 0, 0); | |
if (TdCallStatus == TDX_EXIT_REASON_SUCCESS) { | |
Status = EFI_SUCCESS; | |
} else if (TdCallStatus == TDX_EXIT_REASON_OPERAND_INVALID) { | |
Status = EFI_INVALID_PARAMETER; | |
} else { | |
Status = EFI_DEVICE_ERROR; | |
} | |
if (Status != EFI_SUCCESS) { | |
DEBUG ((DEBUG_ERROR, "Error returned from TdExtendRtmr call - 0x%lx\n", TdCallStatus)); | |
} | |
return Status; | |
} |