I am not sure if we really need router here.
TDX only supports SHA384. What if we just provide HashLibTdx?


If we really want to provide a router, then it should be HashLibCCRouter. And 
TDX should be the NULL instance.

Thank you
Yao Jiewen


> -----Original Message-----
> From: Xu, Min M <min.m...@intel.com>
> Sent: Friday, April 8, 2022 2:39 PM
> To: devel@edk2.groups.io
> Cc: Xu, Min M <min.m...@intel.com>; Yao, Jiewen <jiewen....@intel.com>;
> Wang, Jian J <jian.j.w...@intel.com>; Gerd Hoffmann <kra...@redhat.com>
> Subject: [PATCH V2 1/8] Security: Add HashLibBaseCryptoRouterTdx
> 
> RFC: https://bugzilla.tianocore.org/show_bug.cgi?id=3853
> 
> This library provides hash service by registered hash handler in Td
> guest. It redirects hash request to each individual hash handler
> (currently only SHA384 is supported). After that the hash value is
> extended to Td RTMR registers which is similar to TPM PCRs.
> 
> Cc: Jiewen Yao <jiewen....@intel.com>
> Cc: Jian J Wang <jian.j.w...@intel.com>
> Cc: Gerd Hoffmann <kra...@redhat.com>
> Signed-off-by: Min Xu <min.m...@intel.com>
> ---
>  .../HashLibBaseCryptoRouterTdx.c              | 214 ++++++++++++++++++
>  .../HashLibBaseCryptoRouterTdx.inf            |  41 ++++
>  SecurityPkg/SecurityPkg.dsc                   |  10 +
>  3 files changed, 265 insertions(+)
>  create mode 100644
> SecurityPkg/Library/HashLibBaseCryptoRouter/HashLibBaseCryptoRouterTdx.c
>  create mode 100644
> SecurityPkg/Library/HashLibBaseCryptoRouter/HashLibBaseCryptoRouterTdx.inf
> 
> diff --git
> a/SecurityPkg/Library/HashLibBaseCryptoRouter/HashLibBaseCryptoRouterTdx.
> c
> b/SecurityPkg/Library/HashLibBaseCryptoRouter/HashLibBaseCryptoRouterTdx.
> c
> new file mode 100644
> index 000000000000..77e2a14c19be
> --- /dev/null
> +++
> b/SecurityPkg/Library/HashLibBaseCryptoRouter/HashLibBaseCryptoRouterTdx.
> c
> @@ -0,0 +1,214 @@
> +/** @file
> +  This library is BaseCrypto router for Tdx.
> +
> +Copyright (c) 2021 - 2022, Intel Corporation. All rights reserved. <BR>
> +SPDX-License-Identifier: BSD-2-Clause-Patent
> +
> +**/
> +
> +#include <PiPei.h>
> +#include <Library/BaseLib.h>
> +#include <Library/BaseMemoryLib.h>
> +#include <Library/DebugLib.h>
> +#include <Library/PcdLib.h>
> +#include <Library/HashLib.h>
> +#include <Library/TdxLib.h>
> +#include <Protocol/CcMeasurement.h>
> +#include "HashLibBaseCryptoRouterCommon.h"
> +
> +//
> +// Currently TDX supports SHA384.
> +//
> +#define TDX_HASH_COUNT  1
> +HASH_INTERFACE  mHashInterface[TDX_HASH_COUNT] = {
> +  {
> +    { 0 }, NULL, NULL, NULL
> +  }
> +};
> +
> +UINTN        mHashInterfaceCount      = 0;
> +HASH_HANDLE  mHashCtx[TDX_HASH_COUNT] = { 0 };
> +
> +/**
> +  Start hash sequence.
> +
> +  @param HashHandle Hash handle.
> +
> +  @retval EFI_SUCCESS          Hash sequence start and HandleHandle returned.
> +  @retval EFI_OUT_OF_RESOURCES No enough resource to start hash.
> +**/
> +EFI_STATUS
> +EFIAPI
> +HashStart (
> +  OUT HASH_HANDLE  *HashHandle
> +  )
> +{
> +  HASH_HANDLE  *HashCtx;
> +
> +  if (mHashInterfaceCount == 0) {
> +    ASSERT (FALSE);
> +    return EFI_UNSUPPORTED;
> +  }
> +
> +  HashCtx = mHashCtx;
> +  mHashInterface[0].HashInit (&HashCtx[0]);
> +
> +  *HashHandle = (HASH_HANDLE)HashCtx;
> +
> +  return EFI_SUCCESS;
> +}
> +
> +/**
> +  Update hash sequence data.
> +
> +  @param HashHandle    Hash handle.
> +  @param DataToHash    Data to be hashed.
> +  @param DataToHashLen Data size.
> +
> +  @retval EFI_SUCCESS     Hash sequence updated.
> +**/
> +EFI_STATUS
> +EFIAPI
> +HashUpdate (
> +  IN HASH_HANDLE  HashHandle,
> +  IN VOID         *DataToHash,
> +  IN UINTN        DataToHashLen
> +  )
> +{
> +  HASH_HANDLE  *HashCtx;
> +
> +  if (mHashInterfaceCount == 0) {
> +    ASSERT (FALSE);
> +    return EFI_UNSUPPORTED;
> +  }
> +
> +  HashCtx = (HASH_HANDLE *)HashHandle;
> +  mHashInterface[0].HashUpdate (HashCtx[0], DataToHash, DataToHashLen);
> +
> +  return EFI_SUCCESS;
> +}
> +
> +/**
> +  Hash sequence complete and extend to PCR.
> +
> +  @param HashHandle    Hash handle.
> +  @param PcrIndex      PCR to be extended.
> +  @param DataToHash    Data to be hashed.
> +  @param DataToHashLen Data size.
> +  @param DigestList    Digest list.
> +
> +  @retval EFI_SUCCESS     Hash sequence complete and DigestList is returned.
> +**/
> +EFI_STATUS
> +EFIAPI
> +HashCompleteAndExtend (
> +  IN HASH_HANDLE          HashHandle,
> +  IN TPMI_DH_PCR          PcrIndex,
> +  IN VOID                 *DataToHash,
> +  IN UINTN                DataToHashLen,
> +  OUT TPML_DIGEST_VALUES  *DigestList
> +  )
> +{
> +  TPML_DIGEST_VALUES  Digest;
> +  HASH_HANDLE         *HashCtx;
> +  EFI_STATUS          Status;
> +
> +  if (mHashInterfaceCount == 0) {
> +    ASSERT (FALSE);
> +    return EFI_UNSUPPORTED;
> +  }
> +
> +  HashCtx = (HASH_HANDLE *)HashHandle;
> +  ZeroMem (DigestList, sizeof (*DigestList));
> +
> +  mHashInterface[0].HashUpdate (HashCtx[0], DataToHash, DataToHashLen);
> +  mHashInterface[0].HashFinal (HashCtx[0], &Digest);
> +  Tpm2SetHashToDigestList (DigestList, &Digest);
> +
> +  ASSERT (DigestList->count == 1 && DigestList->digests[0].hashAlg ==
> TPM_ALG_SHA384);
> +
> +  Status = TdExtendRtmr (
> +             (UINT32 *)DigestList->digests[0].digest.sha384,
> +             SHA384_DIGEST_SIZE,
> +             (UINT8)PcrIndex
> +             );
> +
> +  ASSERT (!EFI_ERROR (Status));
> +  return Status;
> +}
> +
> +/**
> +  Hash data and extend to RTMR.
> +
> +  @param PcrIndex      PCR to be extended.
> +  @param DataToHash    Data to be hashed.
> +  @param DataToHashLen Data size.
> +  @param DigestList    Digest list.
> +
> +  @retval EFI_SUCCESS     Hash data and DigestList is returned.
> +**/
> +EFI_STATUS
> +EFIAPI
> +HashAndExtend (
> +  IN TPMI_DH_PCR          PcrIndex,
> +  IN VOID                 *DataToHash,
> +  IN UINTN                DataToHashLen,
> +  OUT TPML_DIGEST_VALUES  *DigestList
> +  )
> +{
> +  HASH_HANDLE  HashHandle;
> +  EFI_STATUS   Status;
> +
> +  if (mHashInterfaceCount == 0) {
> +    ASSERT (FALSE);
> +    return EFI_UNSUPPORTED;
> +  }
> +
> +  ASSERT (TdIsEnabled ());
> +
> +  HashStart (&HashHandle);
> +  HashUpdate (HashHandle, DataToHash, DataToHashLen);
> +  Status = HashCompleteAndExtend (HashHandle, PcrIndex, NULL, 0, DigestList);
> +
> +  return Status;
> +}
> +
> +/**
> +  This service register Hash.
> +
> +  @param HashInterface  Hash interface
> +
> +  @retval EFI_SUCCESS          This hash interface is registered 
> successfully.
> +  @retval EFI_UNSUPPORTED      System does not support register this 
> interface.
> +  @retval EFI_ALREADY_STARTED  System already register this interface.
> +**/
> +EFI_STATUS
> +EFIAPI
> +RegisterHashInterfaceLib (
> +  IN HASH_INTERFACE  *HashInterface
> +  )
> +{
> +  UINT32  HashMask;
> +
> +  ASSERT (TdIsEnabled ());
> +
> +  //
> +  // Check allow
> +  //
> +  HashMask = Tpm2GetHashMaskFromAlgo (&HashInterface->HashGuid);
> +  ASSERT (HashMask == HASH_ALG_SHA384);
> +
> +  if (HashMask != HASH_ALG_SHA384) {
> +    return EFI_UNSUPPORTED;
> +  }
> +
> +  if (mHashInterfaceCount >= ARRAY_SIZE (mHashInterface)) {
> +    ASSERT (FALSE);
> +    return EFI_OUT_OF_RESOURCES;
> +  }
> +
> +  CopyMem (&mHashInterface[mHashInterfaceCount], HashInterface, sizeof
> (*HashInterface));
> +  mHashInterfaceCount++;
> +
> +  return EFI_SUCCESS;
> +}
> diff --git
> a/SecurityPkg/Library/HashLibBaseCryptoRouter/HashLibBaseCryptoRouterTdx.i
> nf
> b/SecurityPkg/Library/HashLibBaseCryptoRouter/HashLibBaseCryptoRouterTdx.i
> nf
> new file mode 100644
> index 000000000000..f6b1353d0041
> --- /dev/null
> +++
> b/SecurityPkg/Library/HashLibBaseCryptoRouter/HashLibBaseCryptoRouterTdx.i
> nf
> @@ -0,0 +1,41 @@
> +## @file
> +#  Provides hash service by registered hash handler in Tdx.
> +#
> +#  This library is BaseCrypto router. It will redirect hash request to each
> individual
> +#  hash handler registered. Currently only SHA384 is supported in this 
> router.
> +#
> +# Copyright (c) 2020 - 2021, Intel Corporation. All rights reserved.<BR>
> +# SPDX-License-Identifier: BSD-2-Clause-Patent
> +#
> +##
> +
> +[Defines]
> +  INF_VERSION                    = 0x00010005
> +  BASE_NAME                      = HashLibBaseCryptoRouterTdx
> +  MODULE_UNI_FILE                = HashLibBaseCryptoRouter.uni
> +  FILE_GUID                      = 77F6EA3E-1ABA-4467-A447-926E8CEB2D13
> +  MODULE_TYPE                    = BASE
> +  VERSION_STRING                 = 1.0
> +  LIBRARY_CLASS                  = HashLib|SEC DXE_DRIVER
> +
> +#
> +# The following information is for reference only and not required by the 
> build
> tools.
> +#
> +#  VALID_ARCHITECTURES           = X64
> +#
> +
> +[Sources]
> +  HashLibBaseCryptoRouterCommon.h
> +  HashLibBaseCryptoRouterCommon.c
> +  HashLibBaseCryptoRouterTdx.c
> +
> +[Packages]
> +  MdePkg/MdePkg.dec
> +  SecurityPkg/SecurityPkg.dec
> +
> +[LibraryClasses]
> +  BaseLib
> +  BaseMemoryLib
> +  DebugLib
> +  PcdLib
> +  TdxLib
> diff --git a/SecurityPkg/SecurityPkg.dsc b/SecurityPkg/SecurityPkg.dsc
> index 73a93c2285b1..b23701ad124e 100644
> --- a/SecurityPkg/SecurityPkg.dsc
> +++ b/SecurityPkg/SecurityPkg.dsc
> @@ -72,6 +72,7 @@
> 
> MmUnblockMemoryLib|MdePkg/Library/MmUnblockMemoryLib/MmUnblockM
> emoryLibNull.inf
> 
> SecureBootVariableLib|SecurityPkg/Library/SecureBootVariableLib/SecureBoot
> VariableLib.inf
> 
> SecureBootVariableProvisionLib|SecurityPkg/Library/SecureBootVariableProvisi
> onLib/SecureBootVariableProvisionLib.inf
> +  TdxLib|MdePkg/Library/TdxLib/TdxLib.inf
> 
>  [LibraryClasses.ARM, LibraryClasses.AARCH64]
>    #
> @@ -92,6 +93,12 @@
>  [LibraryClasses.RISCV64]
>    RngLib|MdePkg/Library/BaseRngLibTimerLib/BaseRngLibTimerLib.inf
> 
> +[LibraryClasses.X64.SEC]
> +
> HashLib|SecurityPkg/Library/HashLibBaseCryptoRouter/HashLibBaseCryptoRout
> erTdx.inf
> +
> +[LibraryClasses.X64.DXE_DRIVER]
> +
> HashLib|SecurityPkg/Library/HashLibBaseCryptoRouter/HashLibBaseCryptoRout
> erTdx.inf
> +
>  [LibraryClasses.common.PEIM]
>    PeimEntryPoint|MdePkg/Library/PeimEntryPoint/PeimEntryPoint.inf
>    PeiServicesLib|MdePkg/Library/PeiServicesLib/PeiServicesLib.inf
> @@ -283,6 +290,9 @@
>    #
>    SecurityPkg/RandomNumberGenerator/RngDxe/RngDxe.inf
> 
> +[Components.X64]
> +
> SecurityPkg/Library/HashLibBaseCryptoRouter/HashLibBaseCryptoRouterTdx.inf
> +
>  [Components.IA32, Components.X64]
> 
> SecurityPkg/VariableAuthenticated/SecureBootConfigDxe/SecureBootConfigDx
> e.inf
> 
> --
> 2.29.2.windows.2



-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.
View/Reply Online (#88596): https://edk2.groups.io/g/devel/message/88596
Mute This Topic: https://groups.io/mt/90330662/21656
Group Owner: devel+ow...@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com]
-=-=-=-=-=-=-=-=-=-=-=-


Reply via email to