blob: cbf1dda7bcff2d4121ef2cc537ffa09356ee9381 [file] [log] [blame]
/** @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;
}