<div dir="ltr"><div dir="ltr">Hi<br></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Tue, Aug 10, 2021 at 9:22 PM Stefan Berger <<a href="mailto:stefanb@linux.vnet.ibm.com">stefanb@linux.vnet.ibm.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Import PeiDxeTpmPlatformHierarchyLib.c from edk2-platforms. Modify it so<br>
that ConfigureTpmPlatformHierarchy() is the only public function provided<br>
by this file.<br>
<br>
Signed-off-by: Stefan Berger <<a href="mailto:stefanb@linux.ibm.com" target="_blank">stefanb@linux.ibm.com</a>><br>
---<br>
 .../Include/Library/TpmPlatformHierarchyLib.h |  27 +++<br>
 .../PeiDxeTpmPlatformHierarchyLib.c           | 210 ++++++++++++++++++<br>
 .../PeiDxeTpmPlatformHierarchyLib.inf         |  40 ++++<br>
 3 files changed, 277 insertions(+)<br>
 create mode 100644 OvmfPkg/Include/Library/TpmPlatformHierarchyLib.h<br>
 create mode 100644 OvmfPkg/Library/PeiDxeTpmPlatformHierarchyLib/PeiDxeTpmPlatformHierarchyLib.c<br>
 create mode 100644 OvmfPkg/Library/PeiDxeTpmPlatformHierarchyLib/PeiDxeTpmPlatformHierarchyLib.inf<br>
<br>
diff --git a/OvmfPkg/Include/Library/TpmPlatformHierarchyLib.h b/OvmfPkg/Include/Library/TpmPlatformHierarchyLib.h<br>
new file mode 100644<br>
index 0000000000..a872fa09dc<br>
--- /dev/null<br>
+++ b/OvmfPkg/Include/Library/TpmPlatformHierarchyLib.h<br>
@@ -0,0 +1,27 @@<br>
+/** @file<br>
+    TPM Platform Hierarchy configuration library.<br>
+<br>
+    This library provides functions for customizing the TPM's Platform Hierarchy<br>
+    Authorization Value (platformAuth) and Platform Hierarchy Authorization<br>
+    Policy (platformPolicy) can be defined through this function.<br>
+<br>
+Copyright (c) 2019, Intel Corporation. All rights reserved.<BR><br>
+Copyright (c) Microsoft Corporation.<BR><br>
+SPDX-License-Identifier: BSD-2-Clause-Patent<br>
+<br>
+**/<br>
+<br>
+#ifndef _TPM_PLATFORM_HIERARCHY_LIB_H_<br>
+#define _TPM_PLATFORM_HIERARCHY_LIB_H_<br>
+<br>
+/**<br>
+   This service will perform the TPM Platform Hierarchy configuration at the SmmReadyToLock event.<br>
+<br>
+**/<br>
+VOID<br>
+EFIAPI<br>
+ConfigureTpmPlatformHierarchy (<br>
+  VOID<br>
+  );<br>
+<br>
+#endif<br>
diff --git a/OvmfPkg/Library/PeiDxeTpmPlatformHierarchyLib/PeiDxeTpmPlatformHierarchyLib.c b/OvmfPkg/Library/PeiDxeTpmPlatformHierarchyLib/PeiDxeTpmPlatformHierarchyLib.c<br>
new file mode 100644<br>
index 0000000000..ba2d99bb53<br>
--- /dev/null<br>
+++ b/OvmfPkg/Library/PeiDxeTpmPlatformHierarchyLib/PeiDxeTpmPlatformHierarchyLib.c<br>
@@ -0,0 +1,210 @@<br>
+/** @file<br>
+    TPM Platform Hierarchy configuration library.<br>
+<br>
+    This library provides functions for customizing the TPM's Platform Hierarchy<br>
+    Authorization Value (platformAuth) and Platform Hierarchy Authorization<br>
+    Policy (platformPolicy) can be defined through this function.<br>
+<br>
+    Copyright (c) 2019, Intel Corporation. All rights reserved.<BR><br>
+    Copyright (c) Microsoft Corporation.<BR><br>
+    SPDX-License-Identifier: BSD-2-Clause-Patent<br>
+<br>
+    @par Specification Reference:<br>
+    <a href="https://trustedcomputinggroup.org/resource/tcg-tpm-v2-0-provisioning-guidance/" rel="noreferrer" target="_blank">https://trustedcomputinggroup.org/resource/tcg-tpm-v2-0-provisioning-guidance/</a><br>
+**/<br>
+<br>
+#include <Uefi.h><br>
+<br>
+#include <Library/BaseMemoryLib.h><br>
+#include <Library/DebugLib.h><br>
+#include <Library/MemoryAllocationLib.h><br>
+#include <Library/RngLib.h><br>
+#include <Library/Tpm2CommandLib.h><br>
+#include <Library/Tpm2DeviceLib.h><br>
+<br>
+//<br>
+// The authorization value may be no larger than the digest produced by the hash<br>
+//   algorithm used for context integrity.<br>
+//<br>
+#define      MAX_NEW_AUTHORIZATION_SIZE SHA512_DIGEST_SIZE<br>
+<br>
+UINT16       mAuthSize;<br>
+<br>
+/**<br>
+  Generate high-quality entropy source through RDRAND.<br>
+<br>
+  @param[in]   Length        Size of the buffer, in bytes, to fill with.<br>
+  @param[out]  Entropy       Pointer to the buffer to store the entropy data.<br>
+<br>
+  @retval EFI_SUCCESS        Entropy generation succeeded.<br>
+  @retval EFI_NOT_READY      Failed to request random data.<br>
+<br>
+**/<br>
+EFI_STATUS<br>
+EFIAPI<br>
+RdRandGenerateEntropy (<br>
+  IN UINTN         Length,<br>
+  OUT UINT8        *Entropy<br>
+  )<br>
+{<br>
+  EFI_STATUS  Status;<br>
+  UINTN       BlockCount;<br>
+  UINT64      Seed[2];<br>
+  UINT8       *Ptr;<br>
+<br>
+  Status = EFI_NOT_READY;<br>
+  BlockCount = Length / 64;<br>
+  Ptr = (UINT8 *)Entropy;<br>
+<br>
+  //<br>
+  // Generate high-quality seed for DRBG Entropy<br>
+  //<br>
+  while (BlockCount > 0) {<br>
+    Status = GetRandomNumber128 (Seed);<br>
+    if (EFI_ERROR (Status)) {<br>
+      return Status;<br>
+    }<br>
+    CopyMem (Ptr, Seed, 64);<br></blockquote><div><br></div><div>This looks like it's copying past the Seed buffer, which is 2 * sizeof(u64) = 16.<br></div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
+<br>
+    BlockCount--;<br>
+    Ptr = Ptr + 64;<br>
+  }<br>
+<br>
+  //<br>
+  // Populate the remained data as request.<br>
+  //<br>
+  Status = GetRandomNumber128 (Seed);<br>
+  if (EFI_ERROR (Status)) {<br>
+    return Status;<br>
+  }<br>
+  CopyMem (Ptr, Seed, (Length % 64));<br></blockquote><div><br></div><div>And then again.</div><div><br></div><div>Isn't there a better way to fill a buffer with random data in edk2?</div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
+<br>
+  return Status;<br>
+}<br>
+<br>
+/**<br>
+  This function returns the maximum size of TPM2B_AUTH; this structure is used for an authorization value<br>
+  and limits an authValue to being no larger than the largest digest produced by a TPM.<br>
+<br>
+  @param[out] AuthSize                 Tpm2 Auth size<br>
+<br>
+  @retval EFI_SUCCESS                  Auth size returned.<br>
+  @retval EFI_DEVICE_ERROR             Can not return platform auth due to device error.<br>
+<br>
+**/<br>
+EFI_STATUS<br>
+EFIAPI<br>
+GetAuthSize (<br>
+  OUT UINT16            *AuthSize<br>
+  )<br>
+{<br>
+  EFI_STATUS            Status;<br>
+  TPML_PCR_SELECTION    Pcrs;<br>
+  UINTN                 Index;<br>
+  UINT16                DigestSize;<br>
+<br>
+  Status = EFI_SUCCESS;<br>
+<br>
+  while (mAuthSize == 0) {<br></blockquote><div><br></div><div>This is a bit odd, but ok.</div><div> <br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
+<br>
+    mAuthSize = SHA1_DIGEST_SIZE;<br>
+    ZeroMem (&Pcrs, sizeof (TPML_PCR_SELECTION));<br>
+    Status = Tpm2GetCapabilityPcrs (&Pcrs);<br>
+<br>
+    if (EFI_ERROR (Status)) {<br>
+      DEBUG ((DEBUG_ERROR, "Tpm2GetCapabilityPcrs fail!\n"));<br>
+      break;<br>
+    }<br>
+<br>
+    DEBUG ((DEBUG_ERROR, "Tpm2GetCapabilityPcrs - %08x\n", Pcrs.count));<br>
+<br>
+    for (Index = 0; Index < Pcrs.count; Index++) {<br>
+      DEBUG ((DEBUG_ERROR, "alg - %x\n", Pcrs.pcrSelections[Index].hash));<br>
+<br>
+      switch (Pcrs.pcrSelections[Index].hash) {<br>
+      case TPM_ALG_SHA1:<br>
+        DigestSize = SHA1_DIGEST_SIZE;<br>
+        break;<br>
+      case TPM_ALG_SHA256:<br>
+        DigestSize = SHA256_DIGEST_SIZE;<br>
+        break;<br>
+      case TPM_ALG_SHA384:<br>
+        DigestSize = SHA384_DIGEST_SIZE;<br>
+        break;<br>
+      case TPM_ALG_SHA512:<br>
+        DigestSize = SHA512_DIGEST_SIZE;<br>
+        break;<br>
+      case TPM_ALG_SM3_256:<br>
+        DigestSize = SM3_256_DIGEST_SIZE;<br>
+        break;<br>
+      default:<br>
+        DigestSize = SHA1_DIGEST_SIZE;<br>
+        break;<br>
+      }<br>
+<br>
+      if (DigestSize > mAuthSize) {<br>
+        mAuthSize = DigestSize;<br>
+      }<br>
+    }<br>
+    break;<br>
+  }<br>
+<br>
+  *AuthSize = mAuthSize;<br>
+  return Status;<br>
+}<br>
+<br>
+/**<br>
+  Set PlatformAuth to random value.<br>
+**/<br>
+VOID<br>
+RandomizePlatformAuth (<br>
+  VOID<br>
+  )<br>
+{<br>
+  EFI_STATUS                        Status;<br>
+  UINT16                            AuthSize;<br>
+  UINT8                             *Rand;<br>
+  UINTN                             RandSize;<br>
+  TPM2B_AUTH                        NewPlatformAuth;<br>
+<br>
+  //<br>
+  // Send Tpm2HierarchyChange Auth with random value to avoid PlatformAuth being null<br>
+  //<br>
+<br>
+  GetAuthSize (&AuthSize);<br>
+<br>
+  ZeroMem (NewPlatformAuth.buffer, AuthSize);<br>
+  NewPlatformAuth.size = AuthSize;<br>
+<br>
+  //<br>
+  // Allocate one buffer to store random data.<br>
+  //<br>
+  RandSize = MAX_NEW_AUTHORIZATION_SIZE;<br>
+  Rand = AllocatePool (RandSize);<br>
+<br>
+  RdRandGenerateEntropy (RandSize, Rand);<br>
+  CopyMem (NewPlatformAuth.buffer, Rand, AuthSize);<br></blockquote><div><br></div><div>Why generate random data for MAX_NEW_AUTHORIZATION to only copy a subset after?</div><div> <br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
+<br>
+  FreePool (Rand);<br>
+<br>
+  //<br>
+  // Send Tpm2HierarchyChangeAuth command with the new Auth value<br>
+  //<br>
+  Status = Tpm2HierarchyChangeAuth (TPM_RH_PLATFORM, NULL, &NewPlatformAuth);<br>
+  DEBUG ((DEBUG_INFO, "Tpm2HierarchyChangeAuth Result: - %r\n", Status));<br>
+  ZeroMem (NewPlatformAuth.buffer, AuthSize);<br>
+  ZeroMem (Rand, RandSize);<br></blockquote><div><br></div><div>Isn't Rand free at this point?</div><div> <br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
+}<br>
+<br>
+/**<br>
+   This service defines the configuration of the Platform Hierarchy Authorization Value (platformAuth)<br>
+   and Platform Hierarchy Authorization Policy (platformPolicy)<br>
+<br>
+**/<br>
+VOID<br>
+EFIAPI<br>
+ConfigureTpmPlatformHierarchy (<br>
+  )<br>
+{<br>
+  RandomizePlatformAuth ();<br>
+}<br>
diff --git a/OvmfPkg/Library/PeiDxeTpmPlatformHierarchyLib/PeiDxeTpmPlatformHierarchyLib.inf b/OvmfPkg/Library/PeiDxeTpmPlatformHierarchyLib/PeiDxeTpmPlatformHierarchyLib.inf<br>
new file mode 100644<br>
index 0000000000..a413e02302<br>
--- /dev/null<br>
+++ b/OvmfPkg/Library/PeiDxeTpmPlatformHierarchyLib/PeiDxeTpmPlatformHierarchyLib.inf<br>
@@ -0,0 +1,40 @@<br>
+### @file<br>
+#<br>
+#   TPM Platform Hierarchy configuration library.<br>
+#<br>
+#   This library provides functions for customizing the TPM's Platform Hierarchy<br>
+#   Authorization Value (platformAuth) and Platform Hierarchy Authorization<br>
+#   Policy (platformPolicy) can be defined through this function.<br>
+#<br>
+# Copyright (c) 2019, Intel Corporation. All rights reserved.<BR><br>
+# Copyright (c) Microsoft Corporation.<BR><br>
+#<br>
+# SPDX-License-Identifier: BSD-2-Clause-Patent<br>
+#<br>
+###<br>
+<br>
+[Defines]<br>
+  INF_VERSION                    = 0x00010005<br>
+  BASE_NAME                      = PeiDxeTpmPlatformHierarchyLib<br>
+  FILE_GUID                      = 7794F92C-4E8E-4E57-9E4A-49A0764C7D73<br>
+  MODULE_TYPE                    = PEIM<br>
+  VERSION_STRING                 = 1.0<br>
+  LIBRARY_CLASS                  = TpmPlatformHierarchyLib|PEIM DXE_DRIVER<br>
+<br>
+[LibraryClasses]<br>
+  BaseLib<br>
+  BaseMemoryLib<br>
+  DebugLib<br>
+  MemoryAllocationLib<br>
+  RngLib<br>
+  Tpm2CommandLib<br>
+  Tpm2DeviceLib<br>
+<br>
+[Packages]<br>
+  MdePkg/MdePkg.dec<br>
+  MdeModulePkg/MdeModulePkg.dec<br>
+  SecurityPkg/SecurityPkg.dec<br>
+  CryptoPkg/CryptoPkg.dec<br>
+<br>
+[Sources]<br>
+  PeiDxeTpmPlatformHierarchyLib.c<br>
-- <br>
2.31.1<br>
<br>
</blockquote></div></div>


 <div width="1" style="color:white;clear:both">_._,_._,_</div> <hr>   Groups.io Links:<p>   You receive all messages sent to this group.    <p> <a target="_blank" href="https://edk2.groups.io/g/devel/message/79182">View/Reply Online (#79182)</a> |    |  <a target="_blank" href="https://groups.io/mt/84798631/1813853">Mute This Topic</a>  | <a href="https://edk2.groups.io/g/devel/post">New Topic</a><br>    <a href="https://edk2.groups.io/g/devel/editsub/1813853">Your Subscription</a> | <a href="mailto:devel+owner@edk2.groups.io">Contact Group Owner</a> |  <a href="https://edk2.groups.io/g/devel/unsub">Unsubscribe</a>  [edk2-devel-archive@redhat.com]<br> <div width="1" style="color:white;clear:both">_._,_._,_</div>