Skip to content

Commit

Permalink
Add TPM Replay FW CFG Input Channel library instance
Browse files Browse the repository at this point in the history
Adds a new library instance for QEMU platforms that allows a TPM
Replay event log to optionally be passed from the QEMU command
line.

See https://github.com/microsoft/mu_tiano_platforms/blob/main/Platforms/Docs/Q35/Features/feature_tpm_replay.md
for more information about passing a TPM Replay log through the
FW CFG interface.

Signed-off-by: Michael Kubacki <[email protected]>
  • Loading branch information
makubacki committed Nov 6, 2023
1 parent b1920ed commit 267f857
Show file tree
Hide file tree
Showing 4 changed files with 119 additions and 3 deletions.
15 changes: 13 additions & 2 deletions Platforms/QemuQ35Pkg/QemuQ35Pkg.dsc
Original file line number Diff line number Diff line change
Expand Up @@ -967,6 +967,7 @@ QemuQ35Pkg/Library/ResetSystemLib/StandaloneMmResetSystemLib.inf
TpmTestingPkg/TpmReplayPei/Pei/TpmReplayPei.inf {
<LibraryClasses>
FvMeasurementExclusionLib|QemuQ35Pkg/Library/PeiFvMeasurementExclusionLib/PeiFvMeasurementExclusionLib.inf
InputChannelLib|QemuPkg/Library/BaseFwCfgInputChannelLib/BaseFwCfgInputChannelLib.inf
Tpm2DeviceLib|SecurityPkg/Library/Tpm2DeviceLibDTpm/Tpm2DeviceLibDTpm.inf
<PcdsPatchableInModule>
gEfiMdePkgTokenSpaceGuid.PcdDebugPropertyMask|0x3F
Expand Down Expand Up @@ -1510,10 +1511,19 @@ QemuQ35Pkg/Library/ResetSystemLib/StandaloneMmResetSystemLib.inf
#
!if $(TPM_ENABLE) == TRUE
!if $(TPM_REPLAY_ENABLED) == TRUE
TpmTestingPkg/Overrides/Tcg2Dxe/Tcg2Dxe.inf
TpmTestingPkg/Overrides/Tcg2Dxe/Tcg2Dxe.inf {
<LibraryClasses>
Tpm2DeviceLib|SecurityPkg/Library/Tpm2DeviceLibRouter/Tpm2DeviceLibRouterDxe.inf
NULL|SecurityPkg/Library/Tpm2DeviceLibDTpm/Tpm2InstanceLibDTpm.inf
HashLib|SecurityPkg/Library/HashLibBaseCryptoRouter/HashLibBaseCryptoRouterDxe.inf
NULL|SecurityPkg/Library/HashInstanceLibSha1/HashInstanceLibSha1.inf
NULL|SecurityPkg/Library/HashInstanceLibSha256/HashInstanceLibSha256.inf
NULL|SecurityPkg/Library/HashInstanceLibSha384/HashInstanceLibSha384.inf
NULL|SecurityPkg/Library/HashInstanceLibSha512/HashInstanceLibSha512.inf
NULL|SecurityPkg/Library/HashInstanceLibSm3/HashInstanceLibSm3.inf
}
!else
SecurityPkg/Tcg/Tcg2Dxe/Tcg2Dxe.inf {
!endif
<LibraryClasses>
Tpm2DeviceLib|SecurityPkg/Library/Tpm2DeviceLibRouter/Tpm2DeviceLibRouterDxe.inf
NULL|SecurityPkg/Library/Tpm2DeviceLibDTpm/Tpm2InstanceLibDTpm.inf
Expand All @@ -1525,6 +1535,7 @@ QemuQ35Pkg/Library/ResetSystemLib/StandaloneMmResetSystemLib.inf
NULL|SecurityPkg/Library/HashInstanceLibSm3/HashInstanceLibSm3.inf
}
!endif
!endif
!if $(TPM_CONFIG_ENABLE) == TRUE AND $(TPM_ENABLE) == TRUE
SecurityPkg/Tcg/Tcg2Config/Tcg2ConfigDxe.inf
!endif
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
/** @file
QEMU FW CFG TPM Event Log Input Channel Library
Allows a TPM replay log to be passed through the FW CFG interface on QEMU.
Copyright (c) Microsoft Corporation.
SPDX-License-Identifier: BSD-2-Clause-Patent
**/

#include <Uefi.h>

#include <IndustryStandard/QemuFwCfg.h>

#include <Library/DebugLib.h>
#include <Library/InputChannelLib.h>
#include <Library/MemoryAllocationLib.h>
#include <Library/QemuFwCfgLib.h>

/**
Retrieves a TPM Replay Event Log through a custom interface.
This library instance returns a log from the QEMU FW CFG interface.
https://www.qemu.org/docs/master/specs/fw_cfg.html
@param[out] ReplayEventLog A pointer to a pointer to the buffer to hold the event log data.
@param[out] ReplayEventLogSize The size of the data placed in the buffer.
@retval EFI_SUCCESS The TPM Replay event log was returned successfully.
@retval EFI_INVALID_PARAMETER A pointer argument given is NULL.
@retval EFI_UNSUPPORTED The function is not implemented yet. The arguments are not used.
@retval EFI_COMPROMISED_DATA The event log data found is not valid.
@retval EFI_NOT_FOUND The event log data was not found.
**/
EFI_STATUS
EFIAPI
GetReplayEventLogFromCustomInterface (
OUT VOID **ReplayEventLog,
OUT UINTN *ReplayEventLogSize
)
{
EFI_STATUS Status;
FIRMWARE_CONFIG_ITEM LogItem;
UINTN LogSize;
UINTN LogPageCount;
VOID *LogBase;

if ((ReplayEventLog == NULL) || (ReplayEventLogSize == NULL)) {
return EFI_INVALID_PARAMETER;
}

Status = QemuFwCfgFindFile ("opt/tpmreplay", &LogItem, &LogSize);
if (EFI_ERROR (Status)) {
DEBUG ((DEBUG_ERROR, "[%a] - TPM Replay FW CFG event log not found (%r).\n", __func__, Status));
return EFI_NOT_FOUND;
}

DEBUG ((DEBUG_INFO, "[%a] - TPM Replay FW CFG log found. Item 0x%x of size 0x%x.\n", __func__, LogItem, LogSize));

LogPageCount = EFI_SIZE_TO_PAGES (LogSize);
LogBase = AllocatePages (LogPageCount);
if (LogBase == NULL) {
ASSERT (LogBase != NULL);
return EFI_OUT_OF_RESOURCES;
}

QemuFwCfgSelectItem (LogItem);
QemuFwCfgReadBytes (LogSize, LogBase);

*ReplayEventLog = LogBase;
*ReplayEventLogSize = LogSize;

return EFI_SUCCESS;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
## @file
# FW CFG TPM Event Log Input Channel Library
#
# Copyright (c) Microsoft Corporation.
#
# SPDX-License-Identifier: BSD-2-Clause-Patent
#
##

[Defines]
INF_VERSION = 0x00010005
BASE_NAME = BaseFwCfgInputChannelLib
FILE_GUID = 8B3828C5-DC85-49F0-8AF2-0F50391EC0BC
MODULE_TYPE = BASE
VERSION_STRING = 1.0
LIBRARY_CLASS = InputChannelLib

[Packages]
MdePkg/MdePkg.dec
SecurityPkg/SecurityPkg.dec
QemuPkg/QemuPkg.dec
TpmTestingPkg/TpmTestingPkg.dec

[LibraryClasses]
DebugLib
MemoryAllocationLib
QemuFwCfgLib

[Sources]
BaseFwCfgInputChannelLib.c

0 comments on commit 267f857

Please sign in to comment.