public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
From: "Kubacki, Michael A" <michael.a.kubacki@intel.com>
To: "Gonzalez Del Cueto,
	Rodrigo" <rodrigo.gonzalez.del.cueto@intel.com>,
	"devel@edk2.groups.io" <devel@edk2.groups.io>
Cc: "Chiu, Chasel" <chasel.chiu@intel.com>,
	"Desimone, Nathaniel L" <nathaniel.l.desimone@intel.com>,
	"Gao, Liming" <liming.gao@intel.com>
Subject: Re: [edk2-platforms][Patch V2] MinPlatformPkg: Library for customizing TPM platform auth
Date: Tue, 12 Nov 2019 00:23:45 +0000	[thread overview]
Message-ID: <BY5PR11MB4484B7940D258A7277EC5835B5770@BY5PR11MB4484.namprd11.prod.outlook.com> (raw)
In-Reply-To: <20191111094230.6414-1-rodrigo.gonzalez.del.cueto@intel.com>

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


      reply	other threads:[~2019-11-12  0:24 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
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 message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-list from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=BY5PR11MB4484B7940D258A7277EC5835B5770@BY5PR11MB4484.namprd11.prod.outlook.com \
    --to=devel@edk2.groups.io \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox