public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
* [edk2-platforms][Patch V2] MinPlatformPkg: Library for customizing TPM platform auth
@ 2019-11-11  9:42 Rodrigo Gonzalez del Cueto
  2019-11-12  0:23 ` Kubacki, Michael A
  0 siblings, 1 reply; 2+ messages in thread
From: Rodrigo Gonzalez del Cueto @ 2019-11-11  9:42 UTC (permalink / raw)
  To: devel
  Cc: Rodrigo Gonzalez del Cueto, Michael Kubacki, Chasel Chiu,
	Nate DeSimone, Liming Gao

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

In V2:
  + Kept callback function and registration in Tcg2PlatformDxe module.
  + New library defining API function: TpmPlatformAuthReadyToBootHandler
    for configuring the TPM's Platform Hierachy. This is now called
    through Tcg2PlatformDxe's ReadyToLockEventCallBack.
  + Ported GetAuthSize fix to both Tcg2PlatformPei and MinPlatform's
    TpmPlatformAuthLib instance.

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.kubacki@intel.com>
Cc: Chasel Chiu <chasel.chiu@intel.com>
Cc: Nate DeSimone <nathaniel.l.desimone@intel.com>
Cc: Liming Gao <liming.gao@intel.com>

Signed-off-by: Rodrigo Gonzalez del Cueto <rodrigo.gonzalez.del.cueto@intel.com>
---
 .../Include/Library/TpmPlatformAuthLib.h      |  24 ++
 .../Intel/MinPlatformPkg/MinPlatformPkg.dec   |   2 +
 .../Intel/MinPlatformPkg/MinPlatformPkg.dsc   |   5 +-
 .../TpmPlatformAuthLib/TpmPlatformAuthLib.c   | 229 ++++++++++++++++++
 .../TpmPlatformAuthLib/TpmPlatformAuthLib.inf |  49 ++++
 .../Tcg/Tcg2PlatformDxe/Tcg2PlatformDxe.c     | 161 ++----------
 .../Tcg/Tcg2PlatformDxe/Tcg2PlatformDxe.inf   |   6 +-
 .../Tcg/Tcg2PlatformPei/Tcg2PlatformPei.c     | 100 +++++---
 8 files changed, 402 insertions(+), 174 deletions(-)
 create mode 100644 Platform/Intel/MinPlatformPkg/Include/Library/TpmPlatformAuthLib.h
 create mode 100644 Platform/Intel/MinPlatformPkg/Tcg/Library/TpmPlatformAuthLib/TpmPlatformAuthLib.c
 create mode 100644 Platform/Intel/MinPlatformPkg/Tcg/Library/TpmPlatformAuthLib/TpmPlatformAuthLib.inf

diff --git a/Platform/Intel/MinPlatformPkg/Include/Library/TpmPlatformAuthLib.h b/Platform/Intel/MinPlatformPkg/Include/Library/TpmPlatformAuthLib.h
new file mode 100644
index 00000000..f33b67b0
--- /dev/null
+++ b/Platform/Intel/MinPlatformPkg/Include/Library/TpmPlatformAuthLib.h
@@ -0,0 +1,24 @@
+/** @file
+
+Copyright (c) 2019, Intel Corporation. All rights reserved.<BR>
+SPDX-License-Identifier: BSD-2-Clause-Patent
+
+**/
+
+#ifndef _TPM_PLATFORM_AUTH_LIB_H_
+#define _TPM_PLATFORM_AUTH_LIB_H_
+
+#include <PiDxe.h>
+#include <Uefi.h>
+
+/**
+   This service will perform the TPM Platform Auth configuration at the ReadyToBoot event.
+
+**/
+VOID
+EFIAPI
+TpmPlatformAuthReadyToBootHandler (
+  VOID
+  );
+
+#endif
diff --git a/Platform/Intel/MinPlatformPkg/MinPlatformPkg.dec b/Platform/Intel/MinPlatformPkg/MinPlatformPkg.dec
index a851021c..fc5979db 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
 
+TpmPlatformAuthLib|Include/Library/TpmPlatformAuthLib.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 5f9363ff..fbfd1e5d 100644
--- a/Platform/Intel/MinPlatformPkg/MinPlatformPkg.dsc
+++ b/Platform/Intel/MinPlatformPkg/MinPlatformPkg.dsc
@@ -185,7 +185,10 @@
 
 !if gMinPlatformPkgTokenSpaceGuid.PcdTpm2Enable == TRUE
   MinPlatformPkg/Tcg/Tcg2PlatformPei/Tcg2PlatformPei.inf
-  MinPlatformPkg/Tcg/Tcg2PlatformDxe/Tcg2PlatformDxe.inf
+  MinPlatformPkg/Tcg/Tcg2PlatformDxe/Tcg2PlatformDxe.inf {
+    <LibraryClasses>
+    TpmPlatformAuthLib|MinPlatformPkg/Tcg/Library/TpmPlatformAuthLib/TpmPlatformAuthLib.inf
+  }
 !endif
 
 [BuildOptions]
diff --git a/Platform/Intel/MinPlatformPkg/Tcg/Library/TpmPlatformAuthLib/TpmPlatformAuthLib.c b/Platform/Intel/MinPlatformPkg/Tcg/Library/TpmPlatformAuthLib/TpmPlatformAuthLib.c
new file mode 100644
index 00000000..8ac780e1
--- /dev/null
+++ b/Platform/Intel/MinPlatformPkg/Tcg/Library/TpmPlatformAuthLib/TpmPlatformAuthLib.c
@@ -0,0 +1,229 @@
+/** @file
+    TPM Platform Auth configuration library.
+
+    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/UefiRuntimeServicesTableLib.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
+
+/**
+  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;
+  UINT32                            Index;
+  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
+TpmPlatformAuthReadyToBootHandler (
+  )
+{
+  EFI_STATUS   Status;
+  VOID         *Interface;
+
+  //
+  // Send Tpm2HierarchyChange Auth with random value to avoid PlatformAuth being null
+  //
+  RandomizePlatformAuth ();
+}
+
+/**
+   The library constructor.
+
+   @param  ImageHandle   The firmware allocated handle for the EFI image.
+   @param  SystemTable   A pointer to the EFI System Table.
+
+   @retval EFI_SUCCESS   The function always return EFI_SUCCESS.
+**/
+EFI_STATUS
+EFIAPI
+TpmPlatformAuthLibContructor (
+  )
+{
+  return EFI_SUCCESS;
+}
diff --git a/Platform/Intel/MinPlatformPkg/Tcg/Library/TpmPlatformAuthLib/TpmPlatformAuthLib.inf b/Platform/Intel/MinPlatformPkg/Tcg/Library/TpmPlatformAuthLib/TpmPlatformAuthLib.inf
new file mode 100644
index 00000000..8a36f35e
--- /dev/null
+++ b/Platform/Intel/MinPlatformPkg/Tcg/Library/TpmPlatformAuthLib/TpmPlatformAuthLib.inf
@@ -0,0 +1,49 @@
+### @file
+#
+# TPM Platform Auth configuration library.
+#
+# Copyright (c) 2019, Intel Corporation. All rights reserved.<BR>
+#
+# SPDX-License-Identifier: BSD-2-Clause-Patent
+#
+###
+
+[Defines]
+  INF_VERSION                    = 0x00010005
+  BASE_NAME                      = TpmPlatformAuthLib
+  FILE_GUID                      = 7794F92C-4E8E-4E57-9E4A-49A0764C7D73
+  MODULE_TYPE                    = DXE_DRIVER
+  VERSION_STRING                 = 1.0
+  LIBRARY_CLASS                  = TpmPlatformAuthLib
+  CONSTRUCTOR                    = TpmPlatformAuthLibContructor
+
+[LibraryClasses]
+  MemoryAllocationLib
+  BaseLib
+  UefiBootServicesTableLib
+  UefiDriverEntryPoint
+  UefiRuntimeServicesTableLib
+  BaseMemoryLib
+  DebugLib
+  Tpm2CommandLib
+  Tpm2DeviceLib
+  RngLib
+  UefiLib
+
+[Packages]
+  MdePkg/MdePkg.dec
+  MdeModulePkg/MdeModulePkg.dec
+  SecurityPkg/SecurityPkg.dec
+  CryptoPkg/CryptoPkg.dec
+
+[Sources]
+  TpmPlatformAuthLib.c
+
+[Protocols]
+  gEfiDxeSmmReadyToLockProtocolGuid             ## SOMETIMES_CONSUMES ## NOTIFY
+
+[Guids]
+  gEfiEventExitBootServicesGuid                 ## SOMETIMES_CONSUMES ## Event
+
+[Depex]
+  gEfiTcg2ProtocolGuid
diff --git a/Platform/Intel/MinPlatformPkg/Tcg/Tcg2PlatformDxe/Tcg2PlatformDxe.c b/Platform/Intel/MinPlatformPkg/Tcg/Tcg2PlatformDxe/Tcg2PlatformDxe.c
index d0d88b2e..8fb5725c 100644
--- a/Platform/Intel/MinPlatformPkg/Tcg/Tcg2PlatformDxe/Tcg2PlatformDxe.c
+++ b/Platform/Intel/MinPlatformPkg/Tcg/Tcg2PlatformDxe/Tcg2PlatformDxe.c
@@ -1,8 +1,8 @@
 /** @file
-  Platform specific TPM2 component.
+  Platform specific TPM2 component for configuring the Platform Hierarchy.
 
-Copyright (c) 2017, Intel Corporation. All rights reserved.<BR>
-SPDX-License-Identifier: BSD-2-Clause-Patent
+  Copyright (c) 2017 - 2019, Intel Corporation. All rights reserved.<BR>
+  SPDX-License-Identifier: BSD-2-Clause-Patent
 
 **/
 
@@ -13,138 +13,15 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
 #include <Library/UefiRuntimeServicesTableLib.h>
 #include <Library/UefiBootServicesTableLib.h>
 #include <Library/MemoryAllocationLib.h>
-#include <Library/Tpm2CommandLib.h>
-#include <Library/RngLib.h>
 #include <Library/UefiLib.h>
+#include <Library/TpmPlatformAuthLib.h>
 #include <Protocol/DxeSmmReadyToLock.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;
+   This callback function will run at the ReadyToLock event.
 
-  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 is the Event call back function to notify the Library the system is entering
-  run time phase.
+   Configuration of the TPM's Platform Hierarchy Authorization Value (platformAuth)
+   and Platform Hierarchy Authorization Policy (platformPolicy) can be defined through this function.
 
   @param  Event   Pointer to this event
   @param  Context Event hanlder private data
@@ -172,22 +49,20 @@ ReadyToLockEventCallBack (
     return ;
   }
 
-  //
-  // Send Tpm2HierarchyChange Auth with random value to avoid PlatformAuth being null
-  //
-  RandomizePlatformAuth();
+  TpmPlatformAuthReadyToBootHandler ();
 
   gBS->CloseEvent (Event);
 }
 
 /**
-  The driver's entry point.
+   The driver's entry point. Will register a function for callback during ReadyToLock event to
+   configure the TPM's platform authorization.
 
-  @param[in] ImageHandle  The firmware allocated handle for the EFI image.
-  @param[in] SystemTable  A pointer to the EFI System Table.
+   @param[in] ImageHandle  The firmware allocated handle for the EFI image.
+   @param[in] SystemTable  A pointer to the EFI System Table.
 
-  @retval EFI_SUCCESS     The entry point is executed successfully.
-  @retval other           Some error occurs when executing this entry point.
+   @retval EFI_SUCCESS     The entry point is executed successfully.
+   @retval other           Some error occurs when executing this entry point.
 **/
 EFI_STATUS
 EFIAPI
@@ -196,17 +71,19 @@ Tcg2PlatformDxeEntryPoint (
   IN    EFI_SYSTEM_TABLE            *SystemTable
   )
 {
-  VOID                      *Registration;
-  EFI_EVENT                 Event;
+  VOID       *Registration;
+  EFI_EVENT  Event;
 
-  Event = EfiCreateProtocolNotifyEvent  (
+  Event = EfiCreateProtocolNotifyEvent (
             &gEfiDxeSmmReadyToLockProtocolGuid,
             TPL_CALLBACK,
             ReadyToLockEventCallBack,
             NULL,
             &Registration
             );
+
   ASSERT (Event != NULL);
 
   return EFI_SUCCESS;
 }
+
diff --git a/Platform/Intel/MinPlatformPkg/Tcg/Tcg2PlatformDxe/Tcg2PlatformDxe.inf b/Platform/Intel/MinPlatformPkg/Tcg/Tcg2PlatformDxe/Tcg2PlatformDxe.inf
index e8ab5f35..921f7ac6 100644
--- a/Platform/Intel/MinPlatformPkg/Tcg/Tcg2PlatformDxe/Tcg2PlatformDxe.inf
+++ b/Platform/Intel/MinPlatformPkg/Tcg/Tcg2PlatformDxe/Tcg2PlatformDxe.inf
@@ -28,16 +28,14 @@
   UefiRuntimeServicesTableLib
   BaseMemoryLib
   DebugLib
-  Tpm2CommandLib
-  Tpm2DeviceLib
-  RngLib
   UefiLib
+  TpmPlatformAuthLib
 
 [Packages]
   MdePkg/MdePkg.dec
   MdeModulePkg/MdeModulePkg.dec
+  MinPlatformPkg/MinPlatformPkg.dec
   SecurityPkg/SecurityPkg.dec
-  CryptoPkg/CryptoPkg.dec
 
 [Sources]
   Tcg2PlatformDxe.c
diff --git a/Platform/Intel/MinPlatformPkg/Tcg/Tcg2PlatformPei/Tcg2PlatformPei.c b/Platform/Intel/MinPlatformPkg/Tcg/Tcg2PlatformPei/Tcg2PlatformPei.c
index 3a2d7d31..c52547e4 100644
--- a/Platform/Intel/MinPlatformPkg/Tcg/Tcg2PlatformPei/Tcg2PlatformPei.c
+++ b/Platform/Intel/MinPlatformPkg/Tcg/Tcg2PlatformPei/Tcg2PlatformPei.c
@@ -1,7 +1,8 @@
 /** @file
+    Platform specific TPM2 component for configuring the Platform Hierarchy.
 
-Copyright (c) 2017, Intel Corporation. All rights reserved.<BR>
-SPDX-License-Identifier: BSD-2-Clause-Patent
+    Copyright (c) 2017 - 2019, Intel Corporation. All rights reserved.<BR>
+    SPDX-License-Identifier: BSD-2-Clause-Patent
 
 **/
 
@@ -72,52 +73,97 @@ RdRandGenerateEntropy (
 }
 
 /**
-  Set PlatformAuth to random value.
+  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.
+
 **/
-VOID
-RandomizePlatformAuth (
-  VOID
+EFI_STATUS
+EFIAPI
+GetAuthSize (
+  OUT UINT16            *AuthSize
   )
 {
-  EFI_STATUS                        Status;
-  UINT16                            AuthSize;
-  TPML_PCR_SELECTION                Pcrs;
-  UINT32                            Index;
-  UINT8                             *Rand;
-  UINTN                             RandSize;
-  TPM2B_AUTH                        NewPlatformAuth;
+  EFI_STATUS            Status;
+  TPML_PCR_SELECTION    Pcrs;
+  UINTN                 Index;
+  UINT16                DigestSize;
 
-  //
-  // Send Tpm2HierarchyChange Auth with random value to avoid PlatformAuth being null
-  //
-  ZeroMem(&Pcrs, sizeof(TPML_PCR_SELECTION));
-  AuthSize = MAX_NEW_AUTHORIZATION_SIZE;
+  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));
 
-  Status = Tpm2GetCapabilityPcrs(&Pcrs);
-  if (EFI_ERROR(Status)) {
-    DEBUG((EFI_D_ERROR, "Tpm2GetCapabilityPcrs fail!\n"));
-  } else {
     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:
-        AuthSize = SHA1_DIGEST_SIZE;
+        DigestSize = SHA1_DIGEST_SIZE;
         break;
       case TPM_ALG_SHA256:
-        AuthSize = SHA256_DIGEST_SIZE;
+        DigestSize = SHA256_DIGEST_SIZE;
         break;
       case TPM_ALG_SHA384:
-        AuthSize = SHA384_DIGEST_SIZE;
+        DigestSize = SHA384_DIGEST_SIZE;
         break;
       case TPM_ALG_SHA512:
-        AuthSize = SHA512_DIGEST_SIZE;
+        DigestSize = SHA512_DIGEST_SIZE;
         break;
       case TPM_ALG_SM3_256:
-        AuthSize = SM3_256_DIGEST_SIZE;
+        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;
+  UINT32                            Index;
+  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;
 
-- 
2.22.0.windows.1


^ permalink raw reply related	[flat|nested] 2+ messages in thread

* Re: [edk2-platforms][Patch V2] MinPlatformPkg: Library for customizing TPM platform auth
  2019-11-11  9:42 [edk2-platforms][Patch V2] MinPlatformPkg: Library for customizing TPM platform auth Rodrigo Gonzalez del Cueto
@ 2019-11-12  0:23 ` Kubacki, Michael A
  0 siblings, 0 replies; 2+ messages in thread
From: Kubacki, Michael A @ 2019-11-12  0:23 UTC (permalink / raw)
  To: Gonzalez Del Cueto, Rodrigo, devel@edk2.groups.io
  Cc: Chiu, Chasel, Desimone, Nathaniel L, Gao, Liming

Can you please make these changes in V3?

MinPlatformPkg\MinPlatformPkg.dsc
  * It seems like a library class override section for Tcg2PlatformDxe is not necessary. Can the
  TpmPlatformAuthLib library class simply be assigned in the [LibraryClasses] section?

MinPlatformPkg\Tcg\Tcg2PlatformDxe\Tcg2PlatformDxe.c
  * I suggest using "SmmReadyToLock" instead of "ReadyToLock" throughout the file.
  * Can you please check again if all library classes included are required for this implementation?
  For example, I don't see usage of MemoryAllocationLib in the file.

MinPlatformPkg\Include\Library\TpmPlatformAuthLib\TpmPlatformAuthLib.h
  * Please add a file description to the copyright header.

  * ReadyToBoot is not the actual event the function is being invoked upon.
  So TpmPlatformAuthReadyToBootHandler ( ) is not accurate. The function is also not
  directly a notification handler (the function signature does not reflect that of a handler)
  so keeping "Handler" in the name is somewhat misleading.

  Some suggestions are:
    1. TpmPlatformAuthAtSmmReadyToLock ( ) -> Keeps the event point in the name
    2. ConfigureTpmPlatformAuthAtSmmReadyToLock ( ) -> More descriptive; keeps event point in the name
    3. ConfigureTpmPlatformAuth ( ) -> More succinct; allows flexibility for invocation

  Unless there's a strong reason to associate the functionality with SmmReadyToLock, I suggest #3 (or your own name).

MinPlatformPkg\Tcg\Tcg2PlatformPei\Tcg2PlatformPei.c
  * It doesn't seem these changes are directly related to the rest of the patch? Could it be a separate patch?

MinPlatformPkg\Tcg\Library\TpmPlatformAuthLib\TpmPlatformAuthlib.inf
  * The constructor doesn't do anything. Is it actually needed?
  * Typo in function name: TpmPlatformAuthLibContructor

MinPlatformPkg\Tcg\Library\TpmPlatformAuthLib\TpmPlatformAuthlib.c
  * The function description for TpmPlatformAuthLibConstructor ( ) references parameters that don't actually exist
  in the implementation.

Thanks,
Michael

> -----Original Message-----
> From: Gonzalez Del Cueto, Rodrigo <rodrigo.gonzalez.del.cueto@intel.com>
> Sent: Monday, November 11, 2019 1:43 AM
> To: devel@edk2.groups.io
> Cc: Gonzalez Del Cueto, Rodrigo <rodrigo.gonzalez.del.cueto@intel.com>;
> Kubacki, Michael A <michael.a.kubacki@intel.com>; Chiu, Chasel
> <chasel.chiu@intel.com>; Desimone, Nathaniel L
> <nathaniel.l.desimone@intel.com>; Gao, Liming <liming.gao@intel.com>
> Subject: [edk2-platforms][Patch V2] MinPlatformPkg: Library for customizing
> TPM platform auth
> 
> BZ: https://bugzilla.tianocore.org/show_bug.cgi?id=2331
> 
> In V2:
>   + Kept callback function and registration in Tcg2PlatformDxe module.
>   + New library defining API function: TpmPlatformAuthReadyToBootHandler
>     for configuring the TPM's Platform Hierachy. This is now called
>     through Tcg2PlatformDxe's ReadyToLockEventCallBack.
>   + Ported GetAuthSize fix to both Tcg2PlatformPei and MinPlatform's
>     TpmPlatformAuthLib instance.
> 
> 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.kubacki@intel.com>
> Cc: Chasel Chiu <chasel.chiu@intel.com>
> Cc: Nate DeSimone <nathaniel.l.desimone@intel.com>
> Cc: Liming Gao <liming.gao@intel.com>
> 
> Signed-off-by: Rodrigo Gonzalez del Cueto
> <rodrigo.gonzalez.del.cueto@intel.com>
> ---
>  .../Include/Library/TpmPlatformAuthLib.h      |  24 ++
>  .../Intel/MinPlatformPkg/MinPlatformPkg.dec   |   2 +
>  .../Intel/MinPlatformPkg/MinPlatformPkg.dsc   |   5 +-
>  .../TpmPlatformAuthLib/TpmPlatformAuthLib.c   | 229
> ++++++++++++++++++
>  .../TpmPlatformAuthLib/TpmPlatformAuthLib.inf |  49 ++++
>  .../Tcg/Tcg2PlatformDxe/Tcg2PlatformDxe.c     | 161 ++----------
>  .../Tcg/Tcg2PlatformDxe/Tcg2PlatformDxe.inf   |   6 +-
>  .../Tcg/Tcg2PlatformPei/Tcg2PlatformPei.c     | 100 +++++---
>  8 files changed, 402 insertions(+), 174 deletions(-)  create mode 100644
> Platform/Intel/MinPlatformPkg/Include/Library/TpmPlatformAuthLib.h
>  create mode 100644
> Platform/Intel/MinPlatformPkg/Tcg/Library/TpmPlatformAuthLib/TpmPlatfo
> rmAuthLib.c
>  create mode 100644
> Platform/Intel/MinPlatformPkg/Tcg/Library/TpmPlatformAuthLib/TpmPlatfo
> rmAuthLib.inf
> 
> diff --git
> a/Platform/Intel/MinPlatformPkg/Include/Library/TpmPlatformAuthLib.h
> b/Platform/Intel/MinPlatformPkg/Include/Library/TpmPlatformAuthLib.h
> new file mode 100644
> index 00000000..f33b67b0
> --- /dev/null
> +++
> b/Platform/Intel/MinPlatformPkg/Include/Library/TpmPlatformAuthLib.h
> @@ -0,0 +1,24 @@
> +/** @file++Copyright (c) 2019, Intel Corporation. All rights
> reserved.<BR>+SPDX-License-Identifier: BSD-2-Clause-
> Patent++**/++#ifndef _TPM_PLATFORM_AUTH_LIB_H_+#define
> _TPM_PLATFORM_AUTH_LIB_H_++#include <PiDxe.h>+#include
> <Uefi.h>++/**+   This service will perform the TPM Platform Auth
> configuration at the ReadyToBoot
> event.++**/+VOID+EFIAPI+TpmPlatformAuthReadyToBootHandler (+
> VOID+  );++#endifdiff --git
> a/Platform/Intel/MinPlatformPkg/MinPlatformPkg.dec
> b/Platform/Intel/MinPlatformPkg/MinPlatformPkg.dec
> index a851021c..fc5979db 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
> +TpmPlatformAuthLib|Include/Library/TpmPlatformAuthLib.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 5f9363ff..fbfd1e5d 100644
> --- a/Platform/Intel/MinPlatformPkg/MinPlatformPkg.dsc
> +++ b/Platform/Intel/MinPlatformPkg/MinPlatformPkg.dsc
> @@ -185,7 +185,10 @@
>   !if gMinPlatformPkgTokenSpaceGuid.PcdTpm2Enable == TRUE
> MinPlatformPkg/Tcg/Tcg2PlatformPei/Tcg2PlatformPei.inf-
> MinPlatformPkg/Tcg/Tcg2PlatformDxe/Tcg2PlatformDxe.inf+
> MinPlatformPkg/Tcg/Tcg2PlatformDxe/Tcg2PlatformDxe.inf {+
> <LibraryClasses>+
> TpmPlatformAuthLib|MinPlatformPkg/Tcg/Library/TpmPlatformAuthLib/Tp
> mPlatformAuthLib.inf+  } !endif  [BuildOptions]diff --git
> a/Platform/Intel/MinPlatformPkg/Tcg/Library/TpmPlatformAuthLib/TpmPlat
> formAuthLib.c
> b/Platform/Intel/MinPlatformPkg/Tcg/Library/TpmPlatformAuthLib/TpmPlat
> formAuthLib.c
> new file mode 100644
> index 00000000..8ac780e1
> --- /dev/null
> +++
> b/Platform/Intel/MinPlatformPkg/Tcg/Library/TpmPlatformAuthLib/TpmPl
> +++ atformAuthLib.c
> @@ -0,0 +1,229 @@
> +/** @file+    TPM Platform Auth configuration library.++    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/UefiRuntimeServicesTableLib.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++/**+  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;+  UINT32
> Index;+  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+TpmPlatformAuthReadyToBootHandle
> r (+  )+{+  EFI_STATUS   Status;+  VOID         *Interface;++  //+  // Send
> Tpm2HierarchyChange Auth with random value to avoid PlatformAuth being
> null+  //+  RandomizePlatformAuth ();+}++/**+   The library constructor.++
> @param  ImageHandle   The firmware allocated handle for the EFI image.+
> @param  SystemTable   A pointer to the EFI System Table.++   @retval
> EFI_SUCCESS   The function always return
> EFI_SUCCESS.+**/+EFI_STATUS+EFIAPI+TpmPlatformAuthLibContructor (+
> )+{+  return EFI_SUCCESS;+}diff --git
> a/Platform/Intel/MinPlatformPkg/Tcg/Library/TpmPlatformAuthLib/TpmPlat
> formAuthLib.inf
> b/Platform/Intel/MinPlatformPkg/Tcg/Library/TpmPlatformAuthLib/TpmPlat
> formAuthLib.inf
> new file mode 100644
> index 00000000..8a36f35e
> --- /dev/null
> +++
> b/Platform/Intel/MinPlatformPkg/Tcg/Library/TpmPlatformAuthLib/TpmPl
> +++ atformAuthLib.inf
> @@ -0,0 +1,49 @@
> +### @file+#+# TPM Platform Auth configuration library.+#+# Copyright (c)
> 2019, Intel Corporation. All rights reserved.<BR>+#+# SPDX-License-
> Identifier: BSD-2-Clause-Patent+#+###++[Defines]+  INF_VERSION
> = 0x00010005+  BASE_NAME                      = TpmPlatformAuthLib+  FILE_GUID
> = 7794F92C-4E8E-4E57-9E4A-49A0764C7D73+  MODULE_TYPE                    =
> DXE_DRIVER+  VERSION_STRING                 = 1.0+  LIBRARY_CLASS                  =
> TpmPlatformAuthLib+  CONSTRUCTOR                    =
> TpmPlatformAuthLibContructor++[LibraryClasses]+  MemoryAllocationLib+
> BaseLib+  UefiBootServicesTableLib+  UefiDriverEntryPoint+
> UefiRuntimeServicesTableLib+  BaseMemoryLib+  DebugLib+
> Tpm2CommandLib+  Tpm2DeviceLib+  RngLib+  UefiLib++[Packages]+
> MdePkg/MdePkg.dec+  MdeModulePkg/MdeModulePkg.dec+
> SecurityPkg/SecurityPkg.dec+  CryptoPkg/CryptoPkg.dec++[Sources]+
> TpmPlatformAuthLib.c++[Protocols]+
> gEfiDxeSmmReadyToLockProtocolGuid             ## SOMETIMES_CONSUMES ##
> NOTIFY++[Guids]+  gEfiEventExitBootServicesGuid                 ##
> SOMETIMES_CONSUMES ## Event++[Depex]+  gEfiTcg2ProtocolGuiddiff --git
> a/Platform/Intel/MinPlatformPkg/Tcg/Tcg2PlatformDxe/Tcg2PlatformDxe.c
> b/Platform/Intel/MinPlatformPkg/Tcg/Tcg2PlatformDxe/Tcg2PlatformDxe.c
> index d0d88b2e..8fb5725c 100644
> ---
> a/Platform/Intel/MinPlatformPkg/Tcg/Tcg2PlatformDxe/Tcg2PlatformDxe.c
> +++
> b/Platform/Intel/MinPlatformPkg/Tcg/Tcg2PlatformDxe/Tcg2PlatformDxe.
> +++ c
> @@ -1,8 +1,8 @@
>  /** @file-  Platform specific TPM2 component.+  Platform specific TPM2
> component for configuring the Platform Hierarchy. -Copyright (c) 2017, Intel
> Corporation. All rights reserved.<BR>-SPDX-License-Identifier: BSD-2-Clause-
> Patent+  Copyright (c) 2017 - 2019, Intel Corporation. All rights
> reserved.<BR>+  SPDX-License-Identifier: BSD-2-Clause-Patent  **/ @@ -
> 13,138 +13,15 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
>  #include <Library/UefiRuntimeServicesTableLib.h> #include
> <Library/UefiBootServicesTableLib.h> #include
> <Library/MemoryAllocationLib.h>-#include <Library/Tpm2CommandLib.h>-
> #include <Library/RngLib.h> #include <Library/UefiLib.h>+#include
> <Library/TpmPlatformAuthLib.h> #include
> <Protocol/DxeSmmReadyToLock.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;+   This callback
> function will run at the ReadyToLock event. -  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 is the Event call back function to
> notify the Library the system is entering-  run time phase.+   Configuration of
> the TPM's Platform Hierarchy Authorization Value (platformAuth)+   and
> Platform Hierarchy Authorization Policy (platformPolicy) can be defined
> through this function.    @param  Event   Pointer to this event   @param
> Context Event hanlder private data@@ -172,22 +49,20 @@
> ReadyToLockEventCallBack (
>      return ;   } -  //-  // Send Tpm2HierarchyChange Auth with random value to
> avoid PlatformAuth being null-  //-  RandomizePlatformAuth();+
> TpmPlatformAuthReadyToBootHandler ();    gBS->CloseEvent (Event); }  /**-
> The driver's entry point.+   The driver's entry point. Will register a function for
> callback during ReadyToLock event to+   configure the TPM's platform
> authorization. -  @param[in] ImageHandle  The firmware allocated handle for
> the EFI image.-  @param[in] SystemTable  A pointer to the EFI System
> Table.+   @param[in] ImageHandle  The firmware allocated handle for the EFI
> image.+   @param[in] SystemTable  A pointer to the EFI System Table. -
> @retval EFI_SUCCESS     The entry point is executed successfully.-  @retval
> other           Some error occurs when executing this entry point.+   @retval
> EFI_SUCCESS     The entry point is executed successfully.+   @retval other
> Some error occurs when executing this entry point. **/ EFI_STATUS
> EFIAPI@@ -196,17 +71,19 @@ Tcg2PlatformDxeEntryPoint (
>    IN    EFI_SYSTEM_TABLE            *SystemTable   ) {-  VOID
> *Registration;-  EFI_EVENT                 Event;+  VOID       *Registration;+
> EFI_EVENT  Event; -  Event = EfiCreateProtocolNotifyEvent  (+  Event =
> EfiCreateProtocolNotifyEvent (
> &gEfiDxeSmmReadyToLockProtocolGuid,             TPL_CALLBACK,
> ReadyToLockEventCallBack,             NULL,             &Registration             );+
> ASSERT (Event != NULL);    return EFI_SUCCESS; }+diff --git
> a/Platform/Intel/MinPlatformPkg/Tcg/Tcg2PlatformDxe/Tcg2PlatformDxe.in
> f
> b/Platform/Intel/MinPlatformPkg/Tcg/Tcg2PlatformDxe/Tcg2PlatformDxe.in
> f
> index e8ab5f35..921f7ac6 100644
> ---
> a/Platform/Intel/MinPlatformPkg/Tcg/Tcg2PlatformDxe/Tcg2PlatformDxe.in
> f
> +++
> b/Platform/Intel/MinPlatformPkg/Tcg/Tcg2PlatformDxe/Tcg2PlatformDxe.
> +++ inf
> @@ -28,16 +28,14 @@
>    UefiRuntimeServicesTableLib   BaseMemoryLib   DebugLib-
> Tpm2CommandLib-  Tpm2DeviceLib-  RngLib   UefiLib+  TpmPlatformAuthLib
> [Packages]   MdePkg/MdePkg.dec   MdeModulePkg/MdeModulePkg.dec+
> MinPlatformPkg/MinPlatformPkg.dec   SecurityPkg/SecurityPkg.dec-
> CryptoPkg/CryptoPkg.dec  [Sources]   Tcg2PlatformDxe.cdiff --git
> a/Platform/Intel/MinPlatformPkg/Tcg/Tcg2PlatformPei/Tcg2PlatformPei.c
> b/Platform/Intel/MinPlatformPkg/Tcg/Tcg2PlatformPei/Tcg2PlatformPei.c
> index 3a2d7d31..c52547e4 100644
> --- a/Platform/Intel/MinPlatformPkg/Tcg/Tcg2PlatformPei/Tcg2PlatformPei.c
> +++
> b/Platform/Intel/MinPlatformPkg/Tcg/Tcg2PlatformPei/Tcg2PlatformPei.
> +++ c
> @@ -1,7 +1,8 @@
>  /** @file+    Platform specific TPM2 component for configuring the Platform
> Hierarchy. -Copyright (c) 2017, Intel Corporation. All rights reserved.<BR>-
> SPDX-License-Identifier: BSD-2-Clause-Patent+    Copyright (c) 2017 - 2019,
> Intel Corporation. All rights reserved.<BR>+    SPDX-License-Identifier: BSD-2-
> Clause-Patent  **/ @@ -72,52 +73,97 @@ RdRandGenerateEntropy (
>  }  /**-  Set PlatformAuth to random value.+  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.+
> **/-VOID-RandomizePlatformAuth (-
> VOID+EFI_STATUS+EFIAPI+GetAuthSize (+  OUT UINT16            *AuthSize   ) {-
> EFI_STATUS                        Status;-  UINT16                            AuthSize;-
> TPML_PCR_SELECTION                Pcrs;-  UINT32                            Index;-  UINT8
> *Rand;-  UINTN                             RandSize;-  TPM2B_AUTH
> NewPlatformAuth;+  EFI_STATUS            Status;+  TPML_PCR_SELECTION
> Pcrs;+  UINTN                 Index;+  UINT16                DigestSize; -  //-  // Send
> Tpm2HierarchyChange Auth with random value to avoid PlatformAuth being
> null-  //-  ZeroMem(&Pcrs, sizeof(TPML_PCR_SELECTION));-  AuthSize =
> MAX_NEW_AUTHORIZATION_SIZE;+  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)); -  Status =
> Tpm2GetCapabilityPcrs(&Pcrs);-  if (EFI_ERROR(Status)) {-
> DEBUG((EFI_D_ERROR, "Tpm2GetCapabilityPcrs fail!\n"));-  } else {     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:-        AuthSize =
> SHA1_DIGEST_SIZE;+        DigestSize = SHA1_DIGEST_SIZE;         break;       case
> TPM_ALG_SHA256:-        AuthSize = SHA256_DIGEST_SIZE;+        DigestSize =
> SHA256_DIGEST_SIZE;         break;       case TPM_ALG_SHA384:-        AuthSize =
> SHA384_DIGEST_SIZE;+        DigestSize = SHA384_DIGEST_SIZE;         break;
> case TPM_ALG_SHA512:-        AuthSize = SHA512_DIGEST_SIZE;+
> DigestSize = SHA512_DIGEST_SIZE;         break;       case TPM_ALG_SM3_256:-
> AuthSize = SM3_256_DIGEST_SIZE;+        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;+  UINT32                            Index;+
> 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; --
> 2.22.0.windows.1


^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2019-11-12  0:24 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2019-11-11  9:42 [edk2-platforms][Patch V2] MinPlatformPkg: Library for customizing TPM platform auth Rodrigo Gonzalez del Cueto
2019-11-12  0:23 ` Kubacki, Michael A

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox