Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add TPM Replay FW CFG Input Channel library instance #761

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 15 additions & 0 deletions Platforms/Docs/Q35/Features/feature_tpm_replay.md
Original file line number Diff line number Diff line change
Expand Up @@ -147,6 +147,21 @@ The binary can be provided to the firmware three ways:
More details about these are covered in the ["Input Channels"](https://github.com/microsoft/mu_plus/blob/HEAD/TpmTestingPkg/TpmReplayPei/Readme.md#tcg-event-log-input-channels)
section of the main TPM Replay feature documentation.

#### FW CFG Example

This option allows a new log to be passed to QEMU from the host machine easily without rebuilding firmware.

An additional argument to QEMU can be passed in the runner plugin.

- [QemuQ35Pkg QemuRunner.py](https://github.com/microsoft/mu_tiano_platforms/blob/HEAD/Platforms/QemuQ35Pkg/Plugins/QemuRunner/QemuRunner.py)
- [QemuSbsaPkg QemuRunner.py](https://github.com/microsoft/mu_tiano_platforms/blob/HEAD/Platforms/QemuSbsaPkg/Plugins/QemuRunner/QemuRunner.py)

The `args` variable can be updated with the fw_cfg item:

```python
args += " -fw_cfg name=opt/org.mu/tpm_replay/event_log,file=/replaylog.bin"`
```

### Converting a Binary Back to a Human Readable File

It may be useful to view what's in a binary. That is also possible using `TpmReplay.py`.
Expand Down
3 changes: 2 additions & 1 deletion Platforms/QemuQ35Pkg/QemuQ35Pkg.ci.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,8 @@
"MfciPkg/MfciPkg.dec",
"OemPkg/OemPkg.dec",
"QemuPkg/QemuPkg.dec",
"QemuQ35Pkg/QemuQ35Pkg.dec"
"QemuQ35Pkg/QemuQ35Pkg.dec",
"TpmTestingPkg/TpmTestingPkg.dec"
],
# For host based unit tests
"AcceptableDependencies-HOST_APPLICATION":[
Expand Down
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/org.mu/tpm_replay/event_log", &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
TpmTestingPkg/TpmTestingPkg.dec
QemuPkg/QemuPkg.dec

[LibraryClasses]
DebugLib
MemoryAllocationLib
QemuFwCfgLib

[Sources]
BaseFwCfgInputChannelLib.c
2 changes: 2 additions & 0 deletions QemuPkg/QemuPkg.ci.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@
"ShellPkg/ShellPkg.dec",
"EmbeddedPkg/EmbeddedPkg.dec",
"QemuPkg/QemuPkg.dec",
"TpmTestingPkg/TpmTestingPkg.dec"
],
# For host based unit tests
"AcceptableDependencies-HOST_APPLICATION":[],
Expand Down Expand Up @@ -101,6 +102,7 @@
"pointee",
"ramfb",
"rebecca",
"tpmreplay",
"tsegmb"
],
"IgnoreStandardPaths": [], # Standard Plugin defined paths that should be ignore
Expand Down
1 change: 1 addition & 0 deletions QemuPkg/QemuPkg.dsc
Original file line number Diff line number Diff line change
Expand Up @@ -130,6 +130,7 @@
gEfiSecurityPkgTokenSpaceGuid.PcdTpm2HashMask|0

[Components]
QemuPkg/Library/BaseFwCfgInputChannelLib/BaseFwCfgInputChannelLib.inf
QemuPkg/Library/BasePciCapLib/BasePciCapLib.inf
QemuPkg/Library/BasePciCapPciSegmentLib/BasePciCapPciSegmentLib.inf
QemuPkg/Library/ConfigSystemModeLibQemu/ConfigSystemModeLib.inf
Expand Down