X-Git-Url: https://git.proxmox.com/?a=blobdiff_plain;f=SecurityPkg%2FLibrary%2FDxeTpmMeasurementLib%2FDxeTpmMeasurementLib.c;fp=SecurityPkg%2FLibrary%2FDxeTpmMeasurementLib%2FDxeTpmMeasurementLib.c;h=6f287b31fc77a64ba60dae2c1c876d99dc3aa817;hb=8c06c53b585a7443b1e0e6c0eff45a62d56472cc;hp=d014ea4aec081392deabbb4e665867ed75ac84ad;hpb=a124cd4ef92a349a6c823ea6701fcfd3a17db255;p=mirror_edk2.git diff --git a/SecurityPkg/Library/DxeTpmMeasurementLib/DxeTpmMeasurementLib.c b/SecurityPkg/Library/DxeTpmMeasurementLib/DxeTpmMeasurementLib.c index d014ea4aec..6f287b31fc 100644 --- a/SecurityPkg/Library/DxeTpmMeasurementLib/DxeTpmMeasurementLib.c +++ b/SecurityPkg/Library/DxeTpmMeasurementLib/DxeTpmMeasurementLib.c @@ -1,5 +1,6 @@ /** @file - This library is used by other modules to measure data to TPM. + This library is used by other modules to measure data to TPM and Confidential + Computing (CC) measure registers. Copyright (c) 2012 - 2018, Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent @@ -19,6 +20,7 @@ SPDX-License-Identifier: BSD-2-Clause-Patent #include #include +#include /** Tpm12 measure and log data, and extend the measurement result into a specific PCR. @@ -35,6 +37,7 @@ SPDX-License-Identifier: BSD-2-Clause-Patent @retval EFI_OUT_OF_RESOURCES Out of memory. @retval EFI_DEVICE_ERROR The operation was unsuccessful. **/ +STATIC EFI_STATUS Tpm12MeasureAndLogData ( IN UINT32 PcrIndex, @@ -101,6 +104,7 @@ Tpm12MeasureAndLogData ( @retval EFI_OUT_OF_RESOURCES Out of memory. @retval EFI_DEVICE_ERROR The operation was unsuccessful. **/ +STATIC EFI_STATUS Tpm20MeasureAndLogData ( IN UINT32 PcrIndex, @@ -147,6 +151,73 @@ Tpm20MeasureAndLogData ( return Status; } +/** + Cc measure and log data, and extend the measurement result into a + specific CC MR. + + @param[in] CcProtocol Instance of CC measurement protocol + @param[in] PcrIndex PCR Index. + @param[in] EventType Event type. + @param[in] EventLog Measurement event log. + @param[in] LogLen Event log length in bytes. + @param[in] HashData The start of the data buffer to be hashed, extended. + @param[in] HashDataLen The length, in bytes, of the buffer referenced by HashData + + @retval EFI_SUCCESS Operation completed successfully. + @retval EFI_UNSUPPORTED CC guest not available. + @retval EFI_OUT_OF_RESOURCES Out of memory. + @retval EFI_DEVICE_ERROR The operation was unsuccessful. + @retval EFI_INVALID_PARAMETER The input parameter is invalid. +**/ +STATIC +EFI_STATUS +CcMeasureAndLogData ( + IN EFI_CC_MEASUREMENT_PROTOCOL *CcProtocol, + IN UINT32 PcrIndex, + IN UINT32 EventType, + IN VOID *EventLog, + IN UINT32 LogLen, + IN VOID *HashData, + IN UINT64 HashDataLen + ) +{ + EFI_STATUS Status; + EFI_CC_EVENT *EfiCcEvent; + EFI_CC_MR_INDEX MrIndex; + + if (CcProtocol == NULL) { + return EFI_INVALID_PARAMETER; + } + + Status = CcProtocol->MapPcrToMrIndex (CcProtocol, PcrIndex, &MrIndex); + if (EFI_ERROR (Status)) { + return Status; + } + + EfiCcEvent = (EFI_CC_EVENT *)AllocateZeroPool (LogLen + sizeof (EFI_CC_EVENT)); + if (EfiCcEvent == NULL) { + return EFI_OUT_OF_RESOURCES; + } + + EfiCcEvent->Size = (UINT32)LogLen + sizeof (EFI_CC_EVENT) - sizeof (EfiCcEvent->Event); + EfiCcEvent->Header.HeaderSize = sizeof (EFI_CC_EVENT_HEADER); + EfiCcEvent->Header.HeaderVersion = EFI_CC_EVENT_HEADER_VERSION; + EfiCcEvent->Header.MrIndex = MrIndex; + EfiCcEvent->Header.EventType = EventType; + CopyMem (&EfiCcEvent->Event[0], EventLog, LogLen); + + Status = CcProtocol->HashLogExtendEvent ( + CcProtocol, + 0, + (EFI_PHYSICAL_ADDRESS)(UINTN)HashData, + HashDataLen, + EfiCcEvent + ); + FreePool (EfiCcEvent); + + return Status; +} + /** Tpm measure and log data, and extend the measurement result into a specific PCR. @@ -173,25 +244,16 @@ TpmMeasureAndLogData ( IN UINT64 HashDataLen ) { - EFI_STATUS Status; - - // - // Try to measure using Tpm20 protocol - // - Status = Tpm20MeasureAndLogData ( - PcrIndex, - EventType, - EventLog, - LogLen, - HashData, - HashDataLen - ); + EFI_STATUS Status; + EFI_CC_MEASUREMENT_PROTOCOL *CcProtocol; - if (EFI_ERROR (Status)) { + Status = gBS->LocateProtocol (&gEfiCcMeasurementProtocolGuid, NULL, (VOID **)&CcProtocol); + if (!EFI_ERROR (Status)) { // - // Try to measure using Tpm1.2 protocol + // Try to measure using Cc measurement protocol // - Status = Tpm12MeasureAndLogData ( + Status = CcMeasureAndLogData ( + CcProtocol, PcrIndex, EventType, EventLog, @@ -199,6 +261,32 @@ TpmMeasureAndLogData ( HashData, HashDataLen ); + } else { + // + // Try to measure using Tpm20 protocol + // + Status = Tpm20MeasureAndLogData ( + PcrIndex, + EventType, + EventLog, + LogLen, + HashData, + HashDataLen + ); + + if (EFI_ERROR (Status)) { + // + // Try to measure using Tpm1.2 protocol + // + Status = Tpm12MeasureAndLogData ( + PcrIndex, + EventType, + EventLog, + LogLen, + HashData, + HashDataLen + ); + } } return Status;