MinPlatformPkg/Tcg2PlatformPei: Use TpmPlatformHierarchyLib

Eliminates code duplication in the module with
TpmPlatformHierarchyLib. Pre-existing behavior of randomzing the
TPM platform auth is retained by calling the implementation of
ConfigureTpmPlatformHierarchy() in TpmPlatformHierarchyLib.

Cc: Chasel Chiu <chasel.chiu@intel.com>
Cc: Nate DeSimone <nathaniel.l.desimone@intel.com>
Cc: Liming Gao <gaoliming@byosoft.com.cn>
Cc: Eric Dong <eric.dong@intel.com>
Signed-off-by: Michael Kubacki <michael.kubacki@microsoft.com>
Reviewed-by: Jiewen Yao <jiewen.yao@intel.com>
Acked-by: Michael D Kinney <michael.d.kinney@intel.com>
This commit is contained in:
Michael Kubacki
2021-06-07 11:24:20 -04:00
committed by Michael D Kinney
parent ae8412ca99
commit 970b621c04
3 changed files with 8 additions and 125 deletions

View File

@@ -98,6 +98,7 @@
TestPointCheckLib|MinPlatformPkg/Test/Library/TestPointCheckLib/PeiTestPointCheckLib.inf
TestPointLib|MinPlatformPkg/Test/Library/TestPointLib/PeiTestPointLib.inf
SetCacheMtrrLib|MinPlatformPkg/Library/SetCacheMtrrLib/SetCacheMtrrLibNull.inf
TpmPlatformHierarchyLib|MinPlatformPkg/Tcg/Library/PeiDxeTpmPlatformHierarchyLib/PeiDxeTpmPlatformHierarchyLib.inf
[LibraryClasses.common.DXE_DRIVER]
#

View File

@@ -1,6 +1,7 @@
/** @file
Copyright (c) 2017, Intel Corporation. All rights reserved.<BR>
Copyright (c) Microsoft Corporation.<BR>
SPDX-License-Identifier: BSD-2-Clause-Patent
**/
@@ -13,134 +14,13 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
#include <Library/HobLib.h>
#include <Library/Tpm2CommandLib.h>
#include <Library/Tpm2DeviceLib.h>
#include <Library/TpmPlatformHierarchyLib.h>
#include <Library/RngLib.h>
#include <Ppi/EndOfPeiPhase.h>
#define MAX_NEW_AUTHORIZATION_SIZE SHA512_DIGEST_SIZE
/**
Generate high-quality entropy source through RDRAND.
@param[in] Length Size of the buffer, in bytes, to fill with.
@param[out] Entropy Pointer to the buffer to store the entropy data.
@retval EFI_SUCCESS Entropy generation succeeded.
@retval EFI_NOT_READY Failed to request random data.
**/
EFI_STATUS
EFIAPI
RdRandGenerateEntropy (
IN UINTN Length,
OUT UINT8 *Entropy
)
{
EFI_STATUS Status;
UINTN BlockCount;
UINT64 Seed[2];
UINT8 *Ptr;
Status = EFI_NOT_READY;
BlockCount = Length / 64;
Ptr = (UINT8 *)Entropy;
//
// Generate high-quality seed for DRBG Entropy
//
while (BlockCount > 0) {
Status = GetRandomNumber128(Seed);
if (EFI_ERROR(Status)) {
return Status;
}
CopyMem(Ptr, Seed, 64);
BlockCount--;
Ptr = Ptr + 64;
}
//
// Populate the remained data as request.
//
Status = GetRandomNumber128(Seed);
if (EFI_ERROR(Status)) {
return Status;
}
CopyMem(Ptr, Seed, (Length % 64));
return Status;
}
/**
Set PlatformAuth to random value.
**/
VOID
RandomizePlatformAuth (
VOID
)
{
EFI_STATUS Status;
UINT16 AuthSize;
TPML_PCR_SELECTION Pcrs;
UINT32 Index;
UINT8 *Rand;
UINTN RandSize;
TPM2B_AUTH NewPlatformAuth;
//
// Send Tpm2HierarchyChange Auth with random value to avoid PlatformAuth being null
//
ZeroMem(&Pcrs, sizeof(TPML_PCR_SELECTION));
AuthSize = MAX_NEW_AUTHORIZATION_SIZE;
Status = Tpm2GetCapabilityPcrs(&Pcrs);
if (EFI_ERROR(Status)) {
DEBUG((EFI_D_ERROR, "Tpm2GetCapabilityPcrs fail!\n"));
} else {
for (Index = 0; Index < Pcrs.count; Index++) {
switch (Pcrs.pcrSelections[Index].hash) {
case TPM_ALG_SHA1:
AuthSize = SHA1_DIGEST_SIZE;
break;
case TPM_ALG_SHA256:
AuthSize = SHA256_DIGEST_SIZE;
break;
case TPM_ALG_SHA384:
AuthSize = SHA384_DIGEST_SIZE;
break;
case TPM_ALG_SHA512:
AuthSize = SHA512_DIGEST_SIZE;
break;
case TPM_ALG_SM3_256:
AuthSize = SM3_256_DIGEST_SIZE;
break;
}
}
}
ZeroMem(NewPlatformAuth.buffer, AuthSize);
NewPlatformAuth.size = AuthSize;
//
// Allocate one buffer to store random data.
//
RandSize = MAX_NEW_AUTHORIZATION_SIZE;
Rand = AllocatePool(RandSize);
RdRandGenerateEntropy(RandSize, Rand);
CopyMem(NewPlatformAuth.buffer, Rand, AuthSize);
FreePool(Rand);
//
// Send Tpm2HierarchyChangeAuth command with the new Auth value
//
Status = Tpm2HierarchyChangeAuth(TPM_RH_PLATFORM, NULL, &NewPlatformAuth);
DEBUG((DEBUG_INFO, "Tpm2HierarchyChangeAuth Result: - %r\n", Status));
ZeroMem(NewPlatformAuth.buffer, AuthSize);
ZeroMem(Rand, RandSize);
}
/**
This function handles PlatformInit task at the end of PEI
@@ -179,9 +59,9 @@ PlatformInitEndOfPei (
//
// If there is S3 error on TPM_SU_STATE and success on TPM_SU_CLEAR,
// Send Tpm2HierarchyChange Auth with random value to avoid PlatformAuth being null
// configure the TPM Platform Hierarchy.
//
RandomizePlatformAuth();
ConfigureTpmPlatformHierarchy ();
return EFI_SUCCESS;
}
@@ -198,7 +78,7 @@ static EFI_PEI_NOTIFY_DESCRIPTOR mEndOfPeiNotifyList = {
@param[in] FileHandle Handle of the file being invoked.
@param[in] PeiServices Pointer to PEI Services table.
@retval EFI_SUCCESS Install function successfully.
@retval EFI_SUCCESS Install function successfully.
**/
EFI_STATUS

View File

@@ -29,11 +29,13 @@
DebugLib
Tpm2DeviceLib
Tpm2CommandLib
TpmPlatformHierarchyLib
RngLib
[Packages]
MdePkg/MdePkg.dec
SecurityPkg/SecurityPkg.dec
MinPlatformPkg/MinPlatformPkg.dec
[Sources]
Tcg2PlatformPei.c