Reviewed-by: Nate DeSimone <nathaniel.l.desim...@intel.com>

-----Original Message-----
From: Gonzalez Del Cueto, Rodrigo <rodrigo.gonzalez.del.cu...@intel.com> 
Sent: Thursday, November 14, 2019 1:05 PM
To: devel@edk2.groups.io.
Cc: Gonzalez Del Cueto, Rodrigo <rodrigo.gonzalez.del.cu...@intel.com>; 
Kubacki, Michael A <michael.a.kuba...@intel.com>; Chiu, Chasel 
<chasel.c...@intel.com>; Desimone, Nathaniel L 
<nathaniel.l.desim...@intel.com>; Gao, Liming <liming....@intel.com>
Subject: [edk2-platforms][Patch V5 1/2] MinPlatformPkg: Library for customizing 
TPM platform hierarchy

BZ: https://bugzilla.tianocore.org/show_bug.cgi?id=2331

In V5:
  + Fixed build of MinPlatformPkg

This change is split into two commits:
  1) This commit: Add new library class TpmPlatformHierarchyLib
  2) Second commit: Add usage in Tcg2PlatformDxe

In order to enable some TPM use cases BIOS should enable to customize the 
configuration of the TPM platform, provisioning of endorsement, platform and 
storage hierarchy.

Cc: Michael Kubacki <michael.a.kuba...@intel.com>
Cc: Chasel Chiu <chasel.c...@intel.com>
Cc: Nate DeSimone <nathaniel.l.desim...@intel.com>
Cc: Liming Gao <liming....@intel.com>

Signed-off-by: Rodrigo Gonzalez del Cueto <rodrigo.gonzalez.del.cu...@intel.com>
---
 .../Include/Library/TpmPlatformHierarchyLib.h |  29 +++
 .../Intel/MinPlatformPkg/MinPlatformPkg.dec   |   2 +
 .../Intel/MinPlatformPkg/MinPlatformPkg.dsc   |   1 +
 .../TpmPlatformHierarchyLib.c                 | 214 ++++++++++++++++++
 .../TpmPlatformHierarchyLib.inf               |  45 ++++
 5 files changed, 291 insertions(+)
 create mode 100644 
Platform/Intel/MinPlatformPkg/Include/Library/TpmPlatformHierarchyLib.h
 create mode 100644 
Platform/Intel/MinPlatformPkg/Tcg/Library/TpmPlatformHierarchyLib/TpmPlatformHierarchyLib.c
 create mode 100644 
Platform/Intel/MinPlatformPkg/Tcg/Library/TpmPlatformHierarchyLib/TpmPlatformHierarchyLib.inf

diff --git 
a/Platform/Intel/MinPlatformPkg/Include/Library/TpmPlatformHierarchyLib.h 
b/Platform/Intel/MinPlatformPkg/Include/Library/TpmPlatformHierarchyLib.h
new file mode 100644
index 000000000000..ed9709b24a73
--- /dev/null
+++ b/Platform/Intel/MinPlatformPkg/Include/Library/TpmPlatformHierarchy
+++ Lib.h
@@ -0,0 +1,29 @@
+/** @file+    TPM Platform Hierarchy configuration library.++    This library 
provides functions for customizing the TPM's Platform Hierarchy+    
Authorization Value (platformAuth) and Platform Hierarchy Authorization+    
Policy (platformPolicy) can be defined through this function.++Copyright (c) 
2019, Intel Corporation. All rights reserved.<BR>+SPDX-License-Identifier: 
BSD-2-Clause-Patent++**/++#ifndef _TPM_PLATFORM_HIERARCHY_LIB_H_+#define 
_TPM_PLATFORM_HIERARCHY_LIB_H_++#include <PiDxe.h>+#include <Uefi.h>++/**+   
This service will perform the TPM Platform Hierarchy configuration at the 
SmmReadyToLock event.++**/+VOID+EFIAPI+ConfigureTpmPlatformHierarchy (+  VOID+  
);++#endifdiff --git a/Platform/Intel/MinPlatformPkg/MinPlatformPkg.dec 
b/Platform/Intel/MinPlatformPkg/MinPlatformPkg.dec
index a851021c0b79..92bda3784ffc 100644
--- a/Platform/Intel/MinPlatformPkg/MinPlatformPkg.dec
+++ b/Platform/Intel/MinPlatformPkg/MinPlatformPkg.dec
@@ -62,6 +62,8 @@ BoardInitLib|Include/Library/BoardInitLib.h
 MultiBoardInitSupportLib|Include/Library/MultiBoardInitSupportLib.h 
SecBoardInitLib|Include/Library/SecBoardInitLib.h 
+TpmPlatformHierarchyLib|Include/Library/TpmPlatformHierarchyLib.h+ 
TestPointLib|Include/Library/TestPointLib.h 
TestPointCheckLib|Include/Library/TestPointCheckLib.h diff --git 
a/Platform/Intel/MinPlatformPkg/MinPlatformPkg.dsc 
b/Platform/Intel/MinPlatformPkg/MinPlatformPkg.dsc
index 5f9363ff3228..a01f229a891d 100644
--- a/Platform/Intel/MinPlatformPkg/MinPlatformPkg.dsc
+++ b/Platform/Intel/MinPlatformPkg/MinPlatformPkg.dsc
@@ -102,6 +102,7 @@
   
FspWrapperPlatformLib|MinPlatformPkg/FspWrapper/Library/DxeFspWrapperPlatformLib/DxeFspWrapperPlatformLib.inf
   
TestPointCheckLib|MinPlatformPkg/Test/Library/TestPointCheckLib/DxeTestPointCheckLib.inf
   TestPointLib|MinPlatformPkg/Test/Library/TestPointLib/DxeTestPointLib.inf+  
TpmPlatformHierarchyLib|MinPlatformPkg/Tcg/Library/TpmPlatformHierarchyLib/TpmPlatformHierarchyLib.inf
  [LibraryClasses.common.DXE_SMM_DRIVER]   
SpiFlashCommonLib|MinPlatformPkg/Flash/Library/SpiFlashCommonLibNull/SpiFlashCommonLibNull.infdiff
 --git 
a/Platform/Intel/MinPlatformPkg/Tcg/Library/TpmPlatformHierarchyLib/TpmPlatformHierarchyLib.c
 
b/Platform/Intel/MinPlatformPkg/Tcg/Library/TpmPlatformHierarchyLib/TpmPlatformHierarchyLib.c
new file mode 100644
index 000000000000..41ddb26f4046
--- /dev/null
+++ b/Platform/Intel/MinPlatformPkg/Tcg/Library/TpmPlatformHierarchyLib/
+++ TpmPlatformHierarchyLib.c
@@ -0,0 +1,214 @@
+/** @file+    TPM Platform Hierarchy configuration library.++    This library 
provides functions for customizing the TPM's Platform Hierarchy+    
Authorization Value (platformAuth) and Platform Hierarchy Authorization+    
Policy (platformPolicy) can be defined through this function.++    Copyright 
(c) 2019, Intel Corporation. All rights reserved.<BR>+    
SPDX-License-Identifier: BSD-2-Clause-Patent++    @par Specification 
Reference:+    
https://trustedcomputinggroup.org/resource/tcg-tpm-v2-0-provisioning-guidance/+**/++#include
 <PiDxe.h>++#include <Library/DebugLib.h>+#include 
<Library/BaseMemoryLib.h>+#include 
<Library/UefiBootServicesTableLib.h>+#include 
<Library/MemoryAllocationLib.h>+#include <Library/Tpm2CommandLib.h>+#include 
<Library/RngLib.h>+#include <Library/UefiLib.h>+#include 
<Protocol/DxeSmmReadyToLock.h>++//+// The authorization value may be no larger 
than the digest produced by the hash+//   algorithm used for context 
integrity.+//+#define      MAX_NEW_AUTHORIZATION_SIZE 
SHA512_DIGEST_SIZE++UINT16       mAuthSize;++/**+  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;+}++/**+  This function 
returns the maximum size of TPM2B_AUTH; this structure is used for an 
authorization value+  and limits an authValue to being no larger than the 
largest digest produced by a TPM.++  @param[out] AuthSize                 Tpm2 
Auth size++  @retval EFI_SUCCESS                  Auth size returned.+  @retval 
EFI_DEVICE_ERROR             Can not return platform auth due to device 
error.++**/+EFI_STATUS+EFIAPI+GetAuthSize (+  OUT UINT16            *AuthSize+  
)+{+  EFI_STATUS            Status;+  TPML_PCR_SELECTION    Pcrs;+  UINTN       
          Index;+  UINT16                DigestSize;++  Status = EFI_SUCCESS;++ 
 while (mAuthSize == 0) {++    mAuthSize = SHA1_DIGEST_SIZE;+    ZeroMem 
(&Pcrs, sizeof (TPML_PCR_SELECTION));+    Status = Tpm2GetCapabilityPcrs 
(&Pcrs);++    if (EFI_ERROR (Status)) {+      DEBUG ((DEBUG_ERROR, 
"Tpm2GetCapabilityPcrs fail!\n"));+      break;+    }++    DEBUG ((DEBUG_ERROR, 
"Tpm2GetCapabilityPcrs - %08x\n", Pcrs.count));++    for (Index = 0; Index < 
Pcrs.count; Index++) {+      DEBUG ((DEBUG_ERROR, "alg - %x\n", 
Pcrs.pcrSelections[Index].hash));++      switch 
(Pcrs.pcrSelections[Index].hash) {+      case TPM_ALG_SHA1:+        DigestSize 
= SHA1_DIGEST_SIZE;+        break;+      case TPM_ALG_SHA256:+        
DigestSize = SHA256_DIGEST_SIZE;+        break;+      case TPM_ALG_SHA384:+     
   DigestSize = SHA384_DIGEST_SIZE;+        break;+      case TPM_ALG_SHA512:+  
      DigestSize = SHA512_DIGEST_SIZE;+        break;+      case 
TPM_ALG_SM3_256:+        DigestSize = SM3_256_DIGEST_SIZE;+        break;+      
default:+        DigestSize = SHA1_DIGEST_SIZE;+        break;+      }++      
if (DigestSize > mAuthSize) {+        mAuthSize = DigestSize;+      }+    }+    
break;+  }++  *AuthSize = mAuthSize;+  return Status;+}++/**+  Set PlatformAuth 
to random value.+**/+VOID+RandomizePlatformAuth (+  VOID+  )+{+  EFI_STATUS     
                   Status;+  UINT16                            AuthSize;+  
UINT8                             *Rand;+  UINTN                             
RandSize;+  TPM2B_AUTH                        NewPlatformAuth;++  //+  // Send 
Tpm2HierarchyChange Auth with random value to avoid PlatformAuth being null+  
//++  GetAuthSize (&AuthSize);++  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 
service defines the configuration of the Platform Hierarchy Authorization Value 
(platformAuth)+   and Platform Hierarchy Authorization Policy 
(platformPolicy)++**/+VOID+EFIAPI+ConfigureTpmPlatformHierarchy (+  )+{+  //+  
// Send Tpm2HierarchyChange Auth with random value to avoid PlatformAuth being 
null+  //+  RandomizePlatformAuth ();+}diff --git 
a/Platform/Intel/MinPlatformPkg/Tcg/Library/TpmPlatformHierarchyLib/TpmPlatformHierarchyLib.inf
 
b/Platform/Intel/MinPlatformPkg/Tcg/Library/TpmPlatformHierarchyLib/TpmPlatformHierarchyLib.inf
new file mode 100644
index 000000000000..0911bdffa01f
--- /dev/null
+++ b/Platform/Intel/MinPlatformPkg/Tcg/Library/TpmPlatformHierarchyLib/
+++ TpmPlatformHierarchyLib.inf
@@ -0,0 +1,45 @@
+### @file+#+#   TPM Platform Hierarchy configuration library.+#+#   This 
library provides functions for customizing the TPM's Platform Hierarchy+#   
Authorization Value (platformAuth) and Platform Hierarchy Authorization+#   
Policy (platformPolicy) can be defined through this function.+#+# Copyright (c) 
2019, Intel Corporation. All rights reserved.<BR>+#+# SPDX-License-Identifier: 
BSD-2-Clause-Patent+#+###++[Defines]+  INF_VERSION                    = 
0x00010005+  BASE_NAME                      = TpmPlatformHierarchyLib+  
FILE_GUID                      = 7794F92C-4E8E-4E57-9E4A-49A0764C7D73+  
MODULE_TYPE                    = DXE_DRIVER+  VERSION_STRING                 = 
1.0+  LIBRARY_CLASS                  = 
TpmPlatformHierarchyLib++[LibraryClasses]+  MemoryAllocationLib+  BaseLib+  
UefiBootServicesTableLib+  UefiDriverEntryPoint+  BaseMemoryLib+  DebugLib+  
Tpm2CommandLib+  Tpm2DeviceLib+  RngLib+  UefiLib++[Packages]+  
MdePkg/MdePkg.dec+  MdeModulePkg/MdeModulePkg.dec+  
SecurityPkg/SecurityPkg.dec+  CryptoPkg/CryptoPkg.dec++[Sources]+  
TpmPlatformHierarchyLib.c++[Depex]+  gEfiTcg2ProtocolGuid-- 
2.22.0.windows.1


-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.

View/Reply Online (#50711): https://edk2.groups.io/g/devel/message/50711
Mute This Topic: https://groups.io/mt/58213054/21656
Group Owner: devel+ow...@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub  [arch...@mail-archive.com]
-=-=-=-=-=-=-=-=-=-=-=-

Reply via email to