Hi, Michael
I carefully think about your comments and study the PCD. This PCD is to 
enable/disable families and individual services produced by the EDK2 crypto 
Protocols/PPIs. 
SecCryptoLib is designed to be called in SEC phase and there is no 
Protocol/PPIs in SEC phase. Shall we still use the PCD to make an SEC version 
like below? (Currently only SHA384 is needed)

!if $(CRYPTO_SERVICES) == MIN_SEC
  gEfiCryptoPkgTokenSpaceGuid.PcdCryptoServiceFamilyEnable.Sha384.Family        
           | PCD_CRYPTO_SERVICE_ENABLE_FAMILY
!endif

Thanks
Min
> -----Original Message-----
> From: Kinney, Michael D <michael.d.kin...@intel.com>
> Sent: Monday, April 18, 2022 11:32 PM
> To: devel@edk2.groups.io; Xu, Min M <min.m...@intel.com>; Kinney,
> Michael D <michael.d.kin...@intel.com>
> Cc: Yao, Jiewen <jiewen....@intel.com>; Wang, Jian J
> <jian.j.w...@intel.com>; Lu, Xiaoyu1 <xiaoyu1...@intel.com>; Jiang,
> Guomin <guomin.ji...@intel.com>; Gerd Hoffmann <kra...@redhat.com>
> Subject: RE: [edk2-devel] [PATCH V3 2/9] CryptoPkg: Add SecCryptLib
> 
> Hi,
> 
> Did you evaluate the use of the following PCD to make an SEC version?
> 
>   ## Enable/Disable the families and individual services produced by the
>   #  EDK II Crypto Protocols/PPIs.  The default is all services disabled.
>   #  This Structured PCD is associated with
> PCD_CRYPTO_SERVICE_FAMILY_ENABLE
>   #  structure that is defined in Include/Pcd/PcdCryptoServiceFamilyEnable.h.
>   # @Prompt Enable/Disable EDK II Crypto Protocol/PPI services
> 
> gEfiCryptoPkgTokenSpaceGuid.PcdCryptoServiceFamilyEnable|{0x00}|PCD_
> CRYPTO_SERVICE_FAMILY_ENABLE|0x00000002 {
>     <Packages>
>       CryptoPkg/CryptoPkg.dec
>     <HeaderFiles>
>       Pcd/PcdCryptoServiceFamilyEnable.h
>   }
> 
> 
> CryptoPkg.dsc has different PCD settings for different FW phases to configure
> only the crypto services required in each phase.  You can extend for SEC.
> Here is the setting for the minimum for PEI phase.
> 
> !if $(CRYPTO_SERVICES) == MIN_PEI
> 
> gEfiCryptoPkgTokenSpaceGuid.PcdCryptoServiceFamilyEnable.HmacSha256.
> Family               | PCD_CRYPTO_SERVICE_ENABLE_FAMILY
>   gEfiCryptoPkgTokenSpaceGuid.PcdCryptoServiceFamilyEnable.Sha1.Family
> | PCD_CRYPTO_SERVICE_ENABLE_FAMILY
> 
> gEfiCryptoPkgTokenSpaceGuid.PcdCryptoServiceFamilyEnable.Sha256.Famil
> y                   | PCD_CRYPTO_SERVICE_ENABLE_FAMILY
> 
> gEfiCryptoPkgTokenSpaceGuid.PcdCryptoServiceFamilyEnable.Sha384.Famil
> y                   | PCD_CRYPTO_SERVICE_ENABLE_FAMILY
> 
> gEfiCryptoPkgTokenSpaceGuid.PcdCryptoServiceFamilyEnable.Sha512.Famil
> y                   | PCD_CRYPTO_SERVICE_ENABLE_FAMILY
>   gEfiCryptoPkgTokenSpaceGuid.PcdCryptoServiceFamilyEnable.Sm3.Family
> | PCD_CRYPTO_SERVICE_ENABLE_FAMILY
> 
> gEfiCryptoPkgTokenSpaceGuid.PcdCryptoServiceFamilyEnable.Rsa.Services.
> Pkcs1Verify        | TRUE
> 
> gEfiCryptoPkgTokenSpaceGuid.PcdCryptoServiceFamilyEnable.Rsa.Services.
> New                | TRUE
> 
> gEfiCryptoPkgTokenSpaceGuid.PcdCryptoServiceFamilyEnable.Rsa.Services.F
> ree               | TRUE
> 
> gEfiCryptoPkgTokenSpaceGuid.PcdCryptoServiceFamilyEnable.Rsa.Services.S
> etKey             | TRUE
> 
> gEfiCryptoPkgTokenSpaceGuid.PcdCryptoServiceFamilyEnable.Pkcs.Services.
> Pkcs5HashPassword | TRUE !endif
> 
> The complete set of settings is isn the
> PCD_CRYPTO_SERVICE_FAMILY_ENABLE structure:
> 
>       https://github.com/tianocore/edk2/blob/master/CryptoPkg/Include
> /Pcd/PcdCryptoServiceFamilyEnable.h
> 
> Mike
> 
> > -----Original Message-----
> > From: devel@edk2.groups.io <devel@edk2.groups.io> On Behalf Of Min
> Xu
> > Sent: Sunday, April 17, 2022 5:00 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>; Lu,
> > Xiaoyu1 <xiaoyu1...@intel.com>; Jiang, Guomin
> > <guomin.ji...@intel.com>; Gerd Hoffmann <kra...@redhat.com>
> > Subject: [edk2-devel] [PATCH V3 2/9] CryptoPkg: Add SecCryptLib
> >
> > RFC: https://bugzilla.tianocore.org/show_bug.cgi?id=3853
> >
> > This is the Cryptographic library instance for SEC. The motivation of
> > this library is to support SHA384 in SEC phase for Td guest. So only
> > Hash/CryptSha512.c is included which supports SHA384 and SHA512.
> Other
> > cryptographics are added with the null version, such as CryptMd5Null.c.
> >
> > Cc: Jiewen Yao <jiewen....@intel.com>
> > Cc: Jian J Wang <jian.j.w...@intel.com>
> > Cc: Xiaoyu Lu <xiaoyu1...@intel.com>
> > Cc: Guomin Jiang <guomin.ji...@intel.com>
> > Cc: Gerd Hoffmann <kra...@redhat.com>
> > Signed-off-by: Min Xu <min.m...@intel.com>
> > ---
> >  CryptoPkg/CryptoPkg.dsc                       |   4 +
> >  .../Library/BaseCryptLib/Hash/CryptMd5Null.c  | 163 +++++++++++++++++
> > .../Library/BaseCryptLib/Hash/CryptSha1Null.c | 166 ++++++++++++++++++
> >  .../BaseCryptLib/Hash/CryptSha256Null.c       | 162 +++++++++++++++++
> >  .../Library/BaseCryptLib/Hash/CryptSm3Null.c  | 164 +++++++++++++++++
> > .../BaseCryptLib/Pk/CryptPkcs7VerifyEkuNull.c | 152 ++++++++++++++++
> >  .../BaseCryptLib/Pk/CryptRsaBasicNull.c       | 121 +++++++++++++
> >  .../Library/BaseCryptLib/SecCryptLib.inf      |  91 ++++++++++
> >  8 files changed, 1023 insertions(+)
> >  create mode 100644
> CryptoPkg/Library/BaseCryptLib/Hash/CryptMd5Null.c
> >  create mode 100644
> > CryptoPkg/Library/BaseCryptLib/Hash/CryptSha1Null.c
> >  create mode 100644
> > CryptoPkg/Library/BaseCryptLib/Hash/CryptSha256Null.c
> >  create mode 100644
> CryptoPkg/Library/BaseCryptLib/Hash/CryptSm3Null.c
> >  create mode 100644
> > CryptoPkg/Library/BaseCryptLib/Pk/CryptPkcs7VerifyEkuNull.c
> >  create mode 100644
> > CryptoPkg/Library/BaseCryptLib/Pk/CryptRsaBasicNull.c
> >  create mode 100644 CryptoPkg/Library/BaseCryptLib/SecCryptLib.inf
> >
> > diff --git a/CryptoPkg/CryptoPkg.dsc b/CryptoPkg/CryptoPkg.dsc index
> > 0aa72ed87846..b814e9616454 100644
> > --- a/CryptoPkg/CryptoPkg.dsc
> > +++ b/CryptoPkg/CryptoPkg.dsc
> > @@ -109,6 +109,9 @@
> >  [LibraryClasses.ARM]
> >    ArmSoftFloatLib|ArmPkg/Library/ArmSoftFloatLib/ArmSoftFloatLib.inf
> >
> > +[LibraryClasses.common.SEC]
> > +  BaseCryptLib|CryptoPkg/Library/BaseCryptLib/SecCryptLib.inf
> > +
> >  [LibraryClasses.common.PEIM]
> >    PcdLib|MdePkg/Library/PeiPcdLib/PeiPcdLib.inf
> >
> >
> ReportStatusCodeLib|MdeModulePkg/Library/PeiReportStatusCodeLib/PeiR
> ep
> > ortStatusCodeLib.inf
> > @@ -236,6 +239,7 @@
> >  !if $(CRYPTO_SERVICES) == PACKAGE
> >  [Components]
> >    CryptoPkg/Library/BaseCryptLib/BaseCryptLib.inf
> > +  CryptoPkg/Library/BaseCryptLib/SecCryptLib.inf
> >    CryptoPkg/Library/BaseCryptLib/PeiCryptLib.inf
> >    CryptoPkg/Library/BaseCryptLib/SmmCryptLib.inf
> >    CryptoPkg/Library/BaseCryptLib/RuntimeCryptLib.inf
> > diff --git a/CryptoPkg/Library/BaseCryptLib/Hash/CryptMd5Null.c
> > b/CryptoPkg/Library/BaseCryptLib/Hash/CryptMd5Null.c
> > new file mode 100644
> > index 000000000000..893a2302a6de
> > --- /dev/null
> > +++ b/CryptoPkg/Library/BaseCryptLib/Hash/CryptMd5Null.c
> > @@ -0,0 +1,163 @@
> > +/** @file
> > +
> > +MD5 Digest Wrapper Null Implementation.
> > +
> > +Copyright (c) Microsoft Corporation. All rights reserved.
> > +SPDX-License-Identifier: BSD-2-Clause-Patent
> > +
> > +**/
> > +
> > +#include "InternalCryptLib.h"
> > +
> > +/**
> > +  Retrieves the size, in bytes, of the context buffer required for MD5 hash
> operations.
> > +
> > +  @return  The size, in bytes, of the context buffer required for MD5 hash
> operations.
> > +
> > +**/
> > +UINTN
> > +EFIAPI
> > +Md5GetContextSize (
> > +  VOID
> > +  )
> > +{
> > +  ASSERT (FALSE);
> > +  return 0;
> > +}
> > +
> > +/**
> > +  Initializes user-supplied memory pointed by Md5Context as MD5 hash
> > +context for
> > +  subsequent use.
> > +
> > +  If Md5Context is NULL, then return FALSE.
> > +
> > +  @param[out]  Md5Context  Pointer to MD5 context being initialized.
> > +
> > +  @retval TRUE   MD5 context initialization succeeded.
> > +  @retval FALSE  MD5 context initialization failed.
> > +
> > +**/
> > +BOOLEAN
> > +EFIAPI
> > +Md5Init (
> > +  OUT  VOID  *Md5Context
> > +  )
> > +{
> > +  ASSERT (FALSE);
> > +  return FALSE;
> > +}
> > +
> > +/**
> > +  Makes a copy of an existing MD5 context.
> > +
> > +  If Md5Context is NULL, then return FALSE.
> > +  If NewMd5Context is NULL, then return FALSE.
> > +
> > +  @param[in]  Md5Context     Pointer to MD5 context being copied.
> > +  @param[out] NewMd5Context  Pointer to new MD5 context.
> > +
> > +  @retval TRUE   MD5 context copy succeeded.
> > +  @retval FALSE  MD5 context copy failed.
> > +
> > +**/
> > +BOOLEAN
> > +EFIAPI
> > +Md5Duplicate (
> > +  IN   CONST VOID  *Md5Context,
> > +  OUT  VOID        *NewMd5Context
> > +  )
> > +{
> > +  ASSERT (FALSE);
> > +  return FALSE;
> > +}
> > +
> > +/**
> > +  Digests the input data and updates MD5 context.
> > +
> > +  This function performs MD5 digest on a data buffer of the specified size.
> > +  It can be called multiple times to compute the digest of long or
> discontinuous data streams.
> > +  MD5 context should be already correctly intialized by Md5Init(),
> > + and should not be finalized  by Md5Final(). Behavior with invalid context
> is undefined.
> > +
> > +  If Md5Context is NULL, then return FALSE.
> > +
> > +  @param[in, out]  Md5Context  Pointer to the MD5 context.
> > +  @param[in]       Data        Pointer to the buffer containing the data 
> > to be
> hashed.
> > +  @param[in]       DataSize    Size of Data buffer in bytes.
> > +
> > +  @retval TRUE   MD5 data digest succeeded.
> > +  @retval FALSE  MD5 data digest failed.
> > +
> > +**/
> > +BOOLEAN
> > +EFIAPI
> > +Md5Update (
> > +  IN OUT  VOID        *Md5Context,
> > +  IN      CONST VOID  *Data,
> > +  IN      UINTN       DataSize
> > +  )
> > +{
> > +  ASSERT (FALSE);
> > +  return FALSE;
> > +}
> > +
> > +/**
> > +  Completes computation of the MD5 digest value.
> > +
> > +  This function completes MD5 hash computation and retrieves the
> > + digest value into  the specified memory. After this function has
> > + been called, the MD5 context cannot  be used again.
> > +  MD5 context should be already correctly intialized by Md5Init(),
> > + and should not be  finalized by Md5Final(). Behavior with invalid MD5
> context is undefined.
> > +
> > +  If Md5Context is NULL, then return FALSE.
> > +  If HashValue is NULL, then return FALSE.
> > +
> > +  @param[in, out]  Md5Context  Pointer to the MD5 context.
> > +  @param[out]      HashValue   Pointer to a buffer that receives the MD5
> digest
> > +                               value (16 bytes).
> > +
> > +  @retval TRUE   MD5 digest computation succeeded.
> > +  @retval FALSE  MD5 digest computation failed.
> > +
> > +**/
> > +BOOLEAN
> > +EFIAPI
> > +Md5Final (
> > +  IN OUT  VOID   *Md5Context,
> > +  OUT     UINT8  *HashValue
> > +  )
> > +{
> > +  ASSERT (FALSE);
> > +  return FALSE;
> > +}
> > +
> > +/**
> > +Computes the MD5 message digest of a input data buffer.
> > +
> > +This function performs the MD5 message digest of a given data buffer,
> > +and places the digest value into the specified memory.
> > +
> > +If this interface is not supported, then return FALSE.
> > +
> > +@param[in]   Data        Pointer to the buffer containing the data to be
> hashed.
> > +@param[in]   DataSize    Size of Data buffer in bytes.
> > +@param[out]  HashValue   Pointer to a buffer that receives the MD5
> digest
> > +value (16 bytes).
> > +
> > +@retval TRUE   MD5 digest computation succeeded.
> > +@retval FALSE  MD5 digest computation failed.
> > +@retval FALSE  This interface is not supported.
> > +
> > +**/
> > +BOOLEAN
> > +EFIAPI
> > +Md5HashAll (
> > +  IN   CONST VOID  *Data,
> > +  IN   UINTN       DataSize,
> > +  OUT  UINT8       *HashValue
> > +  )
> > +{
> > +  ASSERT (FALSE);
> > +  return FALSE;
> > +}
> > diff --git a/CryptoPkg/Library/BaseCryptLib/Hash/CryptSha1Null.c
> > b/CryptoPkg/Library/BaseCryptLib/Hash/CryptSha1Null.c
> > new file mode 100644
> > index 000000000000..d9b4610af0e0
> > --- /dev/null
> > +++ b/CryptoPkg/Library/BaseCryptLib/Hash/CryptSha1Null.c
> > @@ -0,0 +1,166 @@
> > +/** @file
> > +  SHA-1 Digest Wrapper Null Implementation.
> > +
> > +Copyright (c) 2009 - 2016, Intel Corporation. All rights
> > +reserved.<BR>
> > +SPDX-License-Identifier: BSD-2-Clause-Patent
> > +
> > +**/
> > +
> > +#include "InternalCryptLib.h"
> > +
> > +/**
> > +  Retrieves the size, in bytes, of the context buffer required for SHA-1 
> > hash
> operations.
> > +
> > +  @return  The size, in bytes, of the context buffer required for SHA-1 
> > hash
> operations.
> > +
> > +**/
> > +UINTN
> > +EFIAPI
> > +Sha1GetContextSize (
> > +  VOID
> > +  )
> > +{
> > +  //
> > +  // Retrieves SHA Context Size
> > +  //
> > +  ASSERT (FALSE);
> > +  return 0;
> > +}
> > +
> > +/**
> > +  Initializes user-supplied memory pointed by Sha1Context as SHA-1
> > +hash context for
> > +  subsequent use.
> > +
> > +  If Sha1Context is NULL, then return FALSE.
> > +
> > +  @param[out]  Sha1Context  Pointer to SHA-1 context being initialized.
> > +
> > +  @retval TRUE   SHA-1 context initialization succeeded.
> > +  @retval FALSE  SHA-1 context initialization failed.
> > +
> > +**/
> > +BOOLEAN
> > +EFIAPI
> > +Sha1Init (
> > +  OUT  VOID  *Sha1Context
> > +  )
> > +{
> > +  ASSERT (FALSE);
> > +  return FALSE;
> > +}
> > +
> > +/**
> > +  Makes a copy of an existing SHA-1 context.
> > +
> > +  If Sha1Context is NULL, then return FALSE.
> > +  If NewSha1Context is NULL, then return FALSE.
> > +
> > +  @param[in]  Sha1Context     Pointer to SHA-1 context being copied.
> > +  @param[out] NewSha1Context  Pointer to new SHA-1 context.
> > +
> > +  @retval TRUE   SHA-1 context copy succeeded.
> > +  @retval FALSE  SHA-1 context copy failed.
> > +
> > +**/
> > +BOOLEAN
> > +EFIAPI
> > +Sha1Duplicate (
> > +  IN   CONST VOID  *Sha1Context,
> > +  OUT  VOID        *NewSha1Context
> > +  )
> > +{
> > +  ASSERT (FALSE);
> > +
> > +  return FALSE;
> > +}
> > +
> > +/**
> > +  Digests the input data and updates SHA-1 context.
> > +
> > +  This function performs SHA-1 digest on a data buffer of the specified 
> > size.
> > +  It can be called multiple times to compute the digest of long or
> discontinuous data streams.
> > +  SHA-1 context should be already correctly initialized by
> > + Sha1Init(), and should not be finalized  by Sha1Final(). Behavior with
> invalid context is undefined.
> > +
> > +  If Sha1Context is NULL, then return FALSE.
> > +
> > +  @param[in, out]  Sha1Context  Pointer to the SHA-1 context.
> > +  @param[in]       Data         Pointer to the buffer containing the data 
> > to be
> hashed.
> > +  @param[in]       DataSize     Size of Data buffer in bytes.
> > +
> > +  @retval TRUE   SHA-1 data digest succeeded.
> > +  @retval FALSE  SHA-1 data digest failed.
> > +
> > +**/
> > +BOOLEAN
> > +EFIAPI
> > +Sha1Update (
> > +  IN OUT  VOID        *Sha1Context,
> > +  IN      CONST VOID  *Data,
> > +  IN      UINTN       DataSize
> > +  )
> > +{
> > +  ASSERT (FALSE);
> > +  return FALSE;
> > +}
> > +
> > +/**
> > +  Completes computation of the SHA-1 digest value.
> > +
> > +  This function completes SHA-1 hash computation and retrieves the
> > + digest value into  the specified memory. After this function has
> > + been called, the SHA-1 context cannot  be used again.
> > +  SHA-1 context should be already correctly initialized by
> > + Sha1Init(), and should not be  finalized by Sha1Final(). Behavior with
> invalid SHA-1 context is undefined.
> > +
> > +  If Sha1Context is NULL, then return FALSE.
> > +  If HashValue is NULL, then return FALSE.
> > +
> > +  @param[in, out]  Sha1Context  Pointer to the SHA-1 context.
> > +  @param[out]      HashValue    Pointer to a buffer that receives the SHA-1
> digest
> > +                                value (20 bytes).
> > +
> > +  @retval TRUE   SHA-1 digest computation succeeded.
> > +  @retval FALSE  SHA-1 digest computation failed.
> > +
> > +**/
> > +BOOLEAN
> > +EFIAPI
> > +Sha1Final (
> > +  IN OUT  VOID   *Sha1Context,
> > +  OUT     UINT8  *HashValue
> > +  )
> > +{
> > +  ASSERT (FALSE);
> > +  return FALSE;
> > +}
> > +
> > +/**
> > +  Computes the SHA-1 message digest of a input data buffer.
> > +
> > +  This function performs the SHA-1 message digest of a given data
> > + buffer, and places  the digest value into the specified memory.
> > +
> > +  If this interface is not supported, then return FALSE.
> > +
> > +  @param[in]   Data        Pointer to the buffer containing the data to be
> hashed.
> > +  @param[in]   DataSize    Size of Data buffer in bytes.
> > +  @param[out]  HashValue   Pointer to a buffer that receives the SHA-1
> digest
> > +                           value (20 bytes).
> > +
> > +  @retval TRUE   SHA-1 digest computation succeeded.
> > +  @retval FALSE  SHA-1 digest computation failed.
> > +  @retval FALSE  This interface is not supported.
> > +
> > +**/
> > +BOOLEAN
> > +EFIAPI
> > +Sha1HashAll (
> > +  IN   CONST VOID  *Data,
> > +  IN   UINTN       DataSize,
> > +  OUT  UINT8       *HashValue
> > +  )
> > +{
> > +  ASSERT (FALSE);
> > +  return FALSE;
> > +}
> > diff --git a/CryptoPkg/Library/BaseCryptLib/Hash/CryptSha256Null.c
> > b/CryptoPkg/Library/BaseCryptLib/Hash/CryptSha256Null.c
> > new file mode 100644
> > index 000000000000..cf994e8e0664
> > --- /dev/null
> > +++ b/CryptoPkg/Library/BaseCryptLib/Hash/CryptSha256Null.c
> > @@ -0,0 +1,162 @@
> > +/** @file
> > +  SHA-256 Digest Wrapper Null Implementation.
> > +
> > +Copyright (c) 2009 - 2016, Intel Corporation. All rights
> > +reserved.<BR>
> > +SPDX-License-Identifier: BSD-2-Clause-Patent
> > +
> > +**/
> > +
> > +#include "InternalCryptLib.h"
> > +
> > +/**
> > +  Retrieves the size, in bytes, of the context buffer required for SHA-256
> hash operations.
> > +
> > +  @return  The size, in bytes, of the context buffer required for SHA-256
> hash operations.
> > +
> > +**/
> > +UINTN
> > +EFIAPI
> > +Sha256GetContextSize (
> > +  VOID
> > +  )
> > +{
> > +  ASSERT (FALSE);
> > +  return 0;
> > +}
> > +
> > +/**
> > +  Initializes user-supplied memory pointed by Sha256Context as
> > +SHA-256 hash context for
> > +  subsequent use.
> > +
> > +  If Sha256Context is NULL, then return FALSE.
> > +
> > +  @param[out]  Sha256Context  Pointer to SHA-256 context being
> initialized.
> > +
> > +  @retval TRUE   SHA-256 context initialization succeeded.
> > +  @retval FALSE  SHA-256 context initialization failed.
> > +
> > +**/
> > +BOOLEAN
> > +EFIAPI
> > +Sha256Init (
> > +  OUT  VOID  *Sha256Context
> > +  )
> > +{
> > +  ASSERT (FALSE);
> > +  return FALSE;
> > +}
> > +
> > +/**
> > +  Makes a copy of an existing SHA-256 context.
> > +
> > +  If Sha256Context is NULL, then return FALSE.
> > +  If NewSha256Context is NULL, then return FALSE.
> > +
> > +  @param[in]  Sha256Context     Pointer to SHA-256 context being copied.
> > +  @param[out] NewSha256Context  Pointer to new SHA-256 context.
> > +
> > +  @retval TRUE   SHA-256 context copy succeeded.
> > +  @retval FALSE  SHA-256 context copy failed.
> > +
> > +**/
> > +BOOLEAN
> > +EFIAPI
> > +Sha256Duplicate (
> > +  IN   CONST VOID  *Sha256Context,
> > +  OUT  VOID        *NewSha256Context
> > +  )
> > +{
> > +  ASSERT (FALSE);
> > +  return FALSE;
> > +}
> > +
> > +/**
> > +  Digests the input data and updates SHA-256 context.
> > +
> > +  This function performs SHA-256 digest on a data buffer of the specified
> size.
> > +  It can be called multiple times to compute the digest of long or
> discontinuous data streams.
> > +  SHA-256 context should be already correctly initialized by
> > + Sha256Init(), and should not be finalized  by Sha256Final(). Behavior with
> invalid context is undefined.
> > +
> > +  If Sha256Context is NULL, then return FALSE.
> > +
> > +  @param[in, out]  Sha256Context  Pointer to the SHA-256 context.
> > +  @param[in]       Data           Pointer to the buffer containing the 
> > data to be
> hashed.
> > +  @param[in]       DataSize       Size of Data buffer in bytes.
> > +
> > +  @retval TRUE   SHA-256 data digest succeeded.
> > +  @retval FALSE  SHA-256 data digest failed.
> > +
> > +**/
> > +BOOLEAN
> > +EFIAPI
> > +Sha256Update (
> > +  IN OUT  VOID        *Sha256Context,
> > +  IN      CONST VOID  *Data,
> > +  IN      UINTN       DataSize
> > +  )
> > +{
> > +  ASSERT (FALSE);
> > +  return FALSE;
> > +}
> > +
> > +/**
> > +  Completes computation of the SHA-256 digest value.
> > +
> > +  This function completes SHA-256 hash computation and retrieves the
> > + digest value into  the specified memory. After this function has
> > + been called, the SHA-256 context cannot  be used again.
> > +  SHA-256 context should be already correctly initialized by
> > + Sha256Init(), and should not be  finalized by Sha256Final(). Behavior with
> invalid SHA-256 context is undefined.
> > +
> > +  If Sha256Context is NULL, then return FALSE.
> > +  If HashValue is NULL, then return FALSE.
> > +
> > +  @param[in, out]  Sha256Context  Pointer to the SHA-256 context.
> > +  @param[out]      HashValue      Pointer to a buffer that receives the 
> > SHA-
> 256 digest
> > +                                  value (32 bytes).
> > +
> > +  @retval TRUE   SHA-256 digest computation succeeded.
> > +  @retval FALSE  SHA-256 digest computation failed.
> > +
> > +**/
> > +BOOLEAN
> > +EFIAPI
> > +Sha256Final (
> > +  IN OUT  VOID   *Sha256Context,
> > +  OUT     UINT8  *HashValue
> > +  )
> > +{
> > +  ASSERT (FALSE);
> > +  return FALSE;
> > +}
> > +
> > +/**
> > +  Computes the SHA-256 message digest of a input data buffer.
> > +
> > +  This function performs the SHA-256 message digest of a given data
> > + buffer, and places  the digest value into the specified memory.
> > +
> > +  If this interface is not supported, then return FALSE.
> > +
> > +  @param[in]   Data        Pointer to the buffer containing the data to be
> hashed.
> > +  @param[in]   DataSize    Size of Data buffer in bytes.
> > +  @param[out]  HashValue   Pointer to a buffer that receives the SHA-256
> digest
> > +                           value (32 bytes).
> > +
> > +  @retval TRUE   SHA-256 digest computation succeeded.
> > +  @retval FALSE  SHA-256 digest computation failed.
> > +  @retval FALSE  This interface is not supported.
> > +
> > +**/
> > +BOOLEAN
> > +EFIAPI
> > +Sha256HashAll (
> > +  IN   CONST VOID  *Data,
> > +  IN   UINTN       DataSize,
> > +  OUT  UINT8       *HashValue
> > +  )
> > +{
> > +  ASSERT (FALSE);
> > +  return FALSE;
> > +}
> > diff --git a/CryptoPkg/Library/BaseCryptLib/Hash/CryptSm3Null.c
> > b/CryptoPkg/Library/BaseCryptLib/Hash/CryptSm3Null.c
> > new file mode 100644
> > index 000000000000..0f3c89b46517
> > --- /dev/null
> > +++ b/CryptoPkg/Library/BaseCryptLib/Hash/CryptSm3Null.c
> > @@ -0,0 +1,164 @@
> > +/** @file
> > +  SM3 Digest Wrapper Null Implementation.
> > +
> > +Copyright (c) 2019, Intel Corporation. All rights reserved.<BR>
> > +SPDX-License-Identifier: BSD-2-Clause-Patent
> > +
> > +**/
> > +
> > +#include "InternalCryptLib.h"
> > +
> > +/**
> > +  Retrieves the size, in bytes, of the context buffer required for SM3 hash
> operations.
> > +
> > +  @return  The size, in bytes, of the context buffer required for SM3 hash
> operations.
> > +
> > +**/
> > +UINTN
> > +EFIAPI
> > +Sm3GetContextSize (
> > +  VOID
> > +  )
> > +{
> > +  ASSERT (FALSE);
> > +  return 0;
> > +}
> > +
> > +/**
> > +  Initializes user-supplied memory pointed by Sm3Context as SM3 hash
> > +context for
> > +  subsequent use.
> > +
> > +  If Sm3Context is NULL, then return FALSE.
> > +
> > +  @param[out]  Sm3Context  Pointer to SM3 context being initialized.
> > +
> > +  @retval TRUE   SM3 context initialization succeeded.
> > +  @retval FALSE  SM3 context initialization failed.
> > +
> > +**/
> > +BOOLEAN
> > +EFIAPI
> > +Sm3Init (
> > +  OUT  VOID  *Sm3Context
> > +  )
> > +{
> > +  ASSERT (FALSE);
> > +  return FALSE;
> > +}
> > +
> > +/**
> > +  Makes a copy of an existing SM3 context.
> > +
> > +  If Sm3Context is NULL, then return FALSE.
> > +  If NewSm3Context is NULL, then return FALSE.
> > +  If this interface is not supported, then return FALSE.
> > +
> > +  @param[in]  Sm3Context     Pointer to SM3 context being copied.
> > +  @param[out] NewSm3Context  Pointer to new SM3 context.
> > +
> > +  @retval TRUE   SM3 context copy succeeded.
> > +  @retval FALSE  SM3 context copy failed.
> > +  @retval FALSE  This interface is not supported.
> > +
> > +**/
> > +BOOLEAN
> > +EFIAPI
> > +Sm3Duplicate (
> > +  IN   CONST VOID  *Sm3Context,
> > +  OUT  VOID        *NewSm3Context
> > +  )
> > +{
> > +  ASSERT (FALSE);
> > +  return FALSE;
> > +}
> > +
> > +/**
> > +  Digests the input data and updates SM3 context.
> > +
> > +  This function performs SM3 digest on a data buffer of the specified size.
> > +  It can be called multiple times to compute the digest of long or
> discontinuous data streams.
> > +  SM3 context should be already correctly initialized by Sm3Init(),
> > + and should not be finalized  by Sm3Final(). Behavior with invalid context
> is undefined.
> > +
> > +  If Sm3Context is NULL, then return FALSE.
> > +
> > +  @param[in, out]  Sm3Context     Pointer to the SM3 context.
> > +  @param[in]       Data           Pointer to the buffer containing the 
> > data to be
> hashed.
> > +  @param[in]       DataSize       Size of Data buffer in bytes.
> > +
> > +  @retval TRUE   SM3 data digest succeeded.
> > +  @retval FALSE  SM3 data digest failed.
> > +
> > +**/
> > +BOOLEAN
> > +EFIAPI
> > +Sm3Update (
> > +  IN OUT  VOID        *Sm3Context,
> > +  IN      CONST VOID  *Data,
> > +  IN      UINTN       DataSize
> > +  )
> > +{
> > +  ASSERT (FALSE);
> > +  return FALSE;
> > +}
> > +
> > +/**
> > +  Completes computation of the SM3 digest value.
> > +
> > +  This function completes SM3 hash computation and retrieves the
> > + digest value into  the specified memory. After this function has
> > + been called, the SM3 context cannot  be used again.
> > +  SM3 context should be already correctly initialized by Sm3Init(),
> > + and should not be  finalized by Sm3Final(). Behavior with invalid SM3
> context is undefined.
> > +
> > +  If Sm3Context is NULL, then return FALSE.
> > +  If HashValue is NULL, then return FALSE.
> > +
> > +  @param[in, out]  Sm3Context     Pointer to the SM3 context.
> > +  @param[out]      HashValue      Pointer to a buffer that receives the SM3
> digest
> > +                                  value (32 bytes).
> > +
> > +  @retval TRUE   SM3 digest computation succeeded.
> > +  @retval FALSE  SM3 digest computation failed.
> > +
> > +**/
> > +BOOLEAN
> > +EFIAPI
> > +Sm3Final (
> > +  IN OUT  VOID   *Sm3Context,
> > +  OUT     UINT8  *HashValue
> > +  )
> > +{
> > +  ASSERT (FALSE);
> > +  return FALSE;
> > +}
> > +
> > +/**
> > +  Computes the SM3 message digest of a input data buffer.
> > +
> > +  This function performs the SM3 message digest of a given data
> > + buffer, and places  the digest value into the specified memory.
> > +
> > +  If this interface is not supported, then return FALSE.
> > +
> > +  @param[in]   Data        Pointer to the buffer containing the data to be
> hashed.
> > +  @param[in]   DataSize    Size of Data buffer in bytes.
> > +  @param[out]  HashValue   Pointer to a buffer that receives the SM3
> digest
> > +                           value (32 bytes).
> > +
> > +  @retval TRUE   SM3 digest computation succeeded.
> > +  @retval FALSE  SM3 digest computation failed.
> > +  @retval FALSE  This interface is not supported.
> > +
> > +**/
> > +BOOLEAN
> > +EFIAPI
> > +Sm3HashAll (
> > +  IN   CONST VOID  *Data,
> > +  IN   UINTN       DataSize,
> > +  OUT  UINT8       *HashValue
> > +  )
> > +{
> > +  ASSERT (FALSE);
> > +  return FALSE;
> > +}
> > diff --git
> > a/CryptoPkg/Library/BaseCryptLib/Pk/CryptPkcs7VerifyEkuNull.c
> > b/CryptoPkg/Library/BaseCryptLib/Pk/CryptPkcs7VerifyEkuNull.c
> > new file mode 100644
> > index 000000000000..c1d9837c5129
> > --- /dev/null
> > +++ b/CryptoPkg/Library/BaseCryptLib/Pk/CryptPkcs7VerifyEkuNull.c
> > @@ -0,0 +1,152 @@
> > +/** @file
> > +  PKCS7 Verify Null implementation.
> > +
> > +  Copyright (C) Microsoft Corporation. All Rights Reserved.
> > +  Copyright (c) 2019, Intel Corporation. All rights reserved.<BR>
> > +
> > +  SPDX-License-Identifier: BSD-2-Clause-Patent
> > +
> > +**/
> > +
> > +#include "InternalCryptLib.h"
> > +
> > +/**
> > +  This function will return the leaf signer certificate in a chain.
> > +This is
> > +  required because certificate chains are not guaranteed to have the
> > +  certificates in the order that they were issued.
> > +
> > +  A typical certificate chain looks like this:
> > +
> > +
> > +                 ----------------------------
> > +                |            Root            |
> > +                 ----------------------------
> > +                               ^
> > +                               |
> > +                 ----------------------------
> > +                |          Policy CA         | <-- Typical Trust Anchor.
> > +                 ----------------------------
> > +                               ^
> > +                               |
> > +                 ----------------------------
> > +                |         Issuing CA         |
> > +                 ----------------------------
> > +                               ^
> > +                               |
> > +                 -----------------------------
> > +                /  End-Entity (leaf) signer  / <-- Bottom certificate.
> > +                -----------------------------  EKU: 
> > "1.3.6.1.4.1.311.76.9.21.1"
> > +                                                    (Firmware
> > + Signing)
> > +
> > +
> > +  @param[in]   CertChain            Certificate chain.
> > +
> > +  @param[out]  SignerCert           Last certificate in the chain.  For 
> > PKCS7
> signatures,
> > +                                    this will be the end-entity (leaf) 
> > signer cert.
> > +
> > +  @retval EFI_SUCCESS               The required EKUs were found in the
> signature.
> > +  @retval EFI_INVALID_PARAMETER     A parameter was invalid.
> > +  @retval EFI_NOT_FOUND             The number of signers found was not 1.
> > +
> > +**/
> > +EFI_STATUS
> > +GetSignerCertificate (
> > +  IN CONST VOID  *CertChain,
> > +  OUT VOID       **SignerCert
> > +  )
> > +{
> > +  ASSERT (FALSE);
> > +  return EFI_NOT_READY;
> > +}
> > +
> > +/**
> > +  Determines if the specified EKU represented in ASN1 form is present
> > +  in a given certificate.
> > +
> > +  @param[in]  Cert                  The certificate to check.
> > +
> > +  @param[in]  Asn1ToFind            The EKU to look for.
> > +
> > +  @retval EFI_SUCCESS               We successfully identified the signing 
> > type.
> > +  @retval EFI_INVALID_PARAMETER     A parameter was invalid.
> > +  @retval EFI_NOT_FOUND             One or more EKU's were not found in
> the signature.
> > +
> > +**/
> > +EFI_STATUS
> > +IsEkuInCertificate (
> > +  IN CONST VOID  *Cert,
> > +  IN VOID        *Asn1ToFind
> > +  )
> > +{
> > +  ASSERT (FALSE);
> > +  return EFI_NOT_READY;
> > +}
> > +
> > +/**
> > +  Determines if the specified EKUs are present in a signing certificate.
> > +
> > +  @param[in]  SignerCert            The certificate to check.
> > +  @param[in]  RequiredEKUs          The EKUs to look for.
> > +  @param[in]  RequiredEKUsSize      The number of EKUs
> > +  @param[in]  RequireAllPresent     If TRUE, then all the specified EKUs
> > +                                    must be present in the certificate.
> > +
> > +  @retval EFI_SUCCESS               We successfully identified the signing 
> > type.
> > +  @retval EFI_INVALID_PARAMETER     A parameter was invalid.
> > +  @retval EFI_NOT_FOUND             One or more EKU's were not found in
> the signature.
> > +**/
> > +EFI_STATUS
> > +CheckEKUs (
> > +  IN CONST VOID    *SignerCert,
> > +  IN CONST CHAR8   *RequiredEKUs[],
> > +  IN CONST UINT32  RequiredEKUsSize,
> > +  IN BOOLEAN       RequireAllPresent
> > +  )
> > +{
> > +  ASSERT (FALSE);
> > +  return EFI_NOT_READY;
> > +}
> > +
> > +/**
> > +  This function receives a PKCS#7 formatted signature blob,
> > +  looks for the EKU SEQUENCE blob, and if found then looks
> > +  for all the required EKUs. This function was created so that
> > +  the Surface team can cut down on the number of Certificate
> > +  Authorities (CA's) by checking EKU's on leaf signers for
> > +  a specific product. This prevents one product's certificate
> > +  from signing another product's firmware or unlock blobs.
> > +
> > +  Note that this function does not validate the certificate chain.
> > +  That needs to be done before using this function.
> > +
> > +  @param[in]  Pkcs7Signature       The PKCS#7 signed information content
> block. An array
> > +                                   containing the content block with both 
> > the signature,
> > +                                   the signer's certificate, and any 
> > necessary intermediate
> > +                                   certificates.
> > +  @param[in]  Pkcs7SignatureSize   Number of bytes in Pkcs7Signature.
> > +  @param[in]  RequiredEKUs         Array of null-terminated strings listing
> OIDs of
> > +                                   required EKUs that must be present in 
> > the signature.
> > +  @param[in]  RequiredEKUsSize     Number of elements in the
> RequiredEKUs string array.
> > +  @param[in]  RequireAllPresent    If this is TRUE, then all of the 
> > specified
> EKU's
> > +                                   must be present in the leaf signer.  If 
> > it is
> > +                                   FALSE, then we will succeed if we find 
> > any
> > +                                   of the specified EKU's.
> > +
> > +  @retval EFI_SUCCESS              The required EKUs were found in the
> signature.
> > +  @retval EFI_INVALID_PARAMETER    A parameter was invalid.
> > +  @retval EFI_NOT_FOUND            One or more EKU's were not found in the
> signature.
> > +
> > +**/
> > +EFI_STATUS
> > +EFIAPI
> > +VerifyEKUsInPkcs7Signature (
> > +  IN CONST UINT8   *Pkcs7Signature,
> > +  IN CONST UINT32  SignatureSize,
> > +  IN CONST CHAR8   *RequiredEKUs[],
> > +  IN CONST UINT32  RequiredEKUsSize,
> > +  IN BOOLEAN       RequireAllPresent
> > +  )
> > +{
> > +  ASSERT (FALSE);
> > +  return EFI_NOT_READY;
> > +}
> > diff --git a/CryptoPkg/Library/BaseCryptLib/Pk/CryptRsaBasicNull.c
> > b/CryptoPkg/Library/BaseCryptLib/Pk/CryptRsaBasicNull.c
> > new file mode 100644
> > index 000000000000..fd352e32dd93
> > --- /dev/null
> > +++ b/CryptoPkg/Library/BaseCryptLib/Pk/CryptRsaBasicNull.c
> > @@ -0,0 +1,121 @@
> > +/** @file
> > +  RSA Asymmetric Cipher Wrapper Null Implementation.
> > +
> > +  This file implements following APIs which provide basic capabilities for
> RSA:
> > +  1) RsaNew
> > +  2) RsaFree
> > +  3) RsaSetKey
> > +  4) RsaPkcs1Verify
> > +
> > +Copyright (c) 2009 - 2018, Intel Corporation. All rights
> > +reserved.<BR>
> > +SPDX-License-Identifier: BSD-2-Clause-Patent
> > +
> > +**/
> > +
> > +#include "InternalCryptLib.h"
> > +
> > +/**
> > +  Allocates and initializes one RSA context for subsequent use.
> > +
> > +  @return  Pointer to the RSA context that has been initialized.
> > +           If the allocations fails, RsaNew() returns NULL.
> > +
> > +**/
> > +VOID *
> > +EFIAPI
> > +RsaNew (
> > +  VOID
> > +  )
> > +{
> > +  //
> > +  // Allocates & Initializes RSA Context
> > +  //
> > +  ASSERT (FALSE);
> > +  return NULL;
> > +}
> > +
> > +/**
> > +  Release the specified RSA context.
> > +
> > +  @param[in]  RsaContext  Pointer to the RSA context to be released.
> > +
> > +**/
> > +VOID
> > +EFIAPI
> > +RsaFree (
> > +  IN  VOID  *RsaContext
> > +  )
> > +{
> > +  //
> > +  // Free RSA Context
> > +  //
> > +  ASSERT (FALSE);
> > +}
> > +
> > +/**
> > +  Sets the tag-designated key component into the established RSA context.
> > +
> > +  This function sets the tag-designated RSA key component into the
> > + established  RSA context from the user-specified non-negative
> > + integer (octet string format  represented in RSA PKCS#1).
> > +  If BigNumber is NULL, then the specified key component in RSA context
> is cleared.
> > +
> > +  If RsaContext is NULL, then return FALSE.
> > +
> > +  @param[in, out]  RsaContext  Pointer to RSA context being set.
> > +  @param[in]       KeyTag      Tag of RSA key component being set.
> > +  @param[in]       BigNumber   Pointer to octet integer buffer.
> > +                               If NULL, then the specified key component 
> > in RSA
> > +                               context is cleared.
> > +  @param[in]       BnSize      Size of big number buffer in bytes.
> > +                               If BigNumber is NULL, then it is ignored.
> > +
> > +  @retval  TRUE   RSA key component was set successfully.
> > +  @retval  FALSE  Invalid RSA key component tag.
> > +
> > +**/
> > +BOOLEAN
> > +EFIAPI
> > +RsaSetKey (
> > +  IN OUT  VOID         *RsaContext,
> > +  IN      RSA_KEY_TAG  KeyTag,
> > +  IN      CONST UINT8  *BigNumber,
> > +  IN      UINTN        BnSize
> > +  )
> > +{
> > +  ASSERT (FALSE);
> > +  return FALSE;
> > +}
> > +
> > +/**
> > +  Verifies the RSA-SSA signature with EMSA-PKCS1-v1_5 encoding scheme
> > +defined in
> > +  RSA PKCS#1.
> > +
> > +  If RsaContext is NULL, then return FALSE.
> > +  If MessageHash is NULL, then return FALSE.
> > +  If Signature is NULL, then return FALSE.
> > +  If HashSize is not equal to the size of MD5, SHA-1 or SHA-256 digest, 
> > then
> return FALSE.
> > +
> > +  @param[in]  RsaContext   Pointer to RSA context for signature
> verification.
> > +  @param[in]  MessageHash  Pointer to octet message hash to be checked.
> > +  @param[in]  HashSize     Size of the message hash in bytes.
> > +  @param[in]  Signature    Pointer to RSA PKCS1-v1_5 signature to be
> verified.
> > +  @param[in]  SigSize      Size of signature in bytes.
> > +
> > +  @retval  TRUE   Valid signature encoded in PKCS1-v1_5.
> > +  @retval  FALSE  Invalid signature or invalid RSA context.
> > +
> > +**/
> > +BOOLEAN
> > +EFIAPI
> > +RsaPkcs1Verify (
> > +  IN  VOID         *RsaContext,
> > +  IN  CONST UINT8  *MessageHash,
> > +  IN  UINTN        HashSize,
> > +  IN  CONST UINT8  *Signature,
> > +  IN  UINTN        SigSize
> > +  )
> > +{
> > +  ASSERT (FALSE);
> > +  return FALSE;
> > +}
> > diff --git a/CryptoPkg/Library/BaseCryptLib/SecCryptLib.inf
> > b/CryptoPkg/Library/BaseCryptLib/SecCryptLib.inf
> > new file mode 100644
> > index 000000000000..070b44447e74
> > --- /dev/null
> > +++ b/CryptoPkg/Library/BaseCryptLib/SecCryptLib.inf
> > @@ -0,0 +1,91 @@
> > +## @file
> > +#  Cryptographic Library Instance for SEC.
> > +#
> > +#  Caution: This module requires additional review when modified.
> > +#  This library will have external input - signature.
> > +#  This external input must be validated carefully to avoid security
> > +issues such as #  buffer overflow or integer overflow.
> > +#
> > +#  Copyright (c) 2021, Intel Corporation. All rights reserved.<BR> #
> > +SPDX-License-Identifier: BSD-2-Clause-Patent # ##
> > +
> > +[Defines]
> > +  INF_VERSION                    = 0x00010005
> > +  BASE_NAME                      = SecCryptLib
> > +  FILE_GUID                      = 3689D343-0D32-4284-8053-BF10537990E8
> > +  MODULE_TYPE                    = BASE
> > +  VERSION_STRING                 = 1.0
> > +  LIBRARY_CLASS                  = BaseCryptLib|SEC
> > +
> > +#
> > +# The following information is for reference only and not required by the
> build tools.
> > +#
> > +#  VALID_ARCHITECTURES           = IA32 X64
> > +#
> > +
> > +[Sources]
> > +  InternalCryptLib.h
> > +  Hash/CryptSha512.c
> > +
> > +  Hash/CryptMd5Null.c
> > +  Hash/CryptSha1Null.c
> > +  Hash/CryptSha256Null.c
> > +  Hash/CryptSm3Null.c
> > +  Hash/CryptParallelHashNull.c
> > +  Hmac/CryptHmacSha256Null.c
> > +  Kdf/CryptHkdfNull.c
> > +  Cipher/CryptAesNull.c
> > +  Pk/CryptRsaBasicNull.c
> > +  Pk/CryptRsaExtNull.c
> > +  Pk/CryptPkcs1OaepNull.c
> > +  Pk/CryptPkcs5Pbkdf2Null.c
> > +  Pk/CryptPkcs7SignNull.c
> > +  Pk/CryptPkcs7VerifyNull.c
> > +  Pk/CryptPkcs7VerifyEkuNull.c
> > +  Pk/CryptDhNull.c
> > +  Pk/CryptX509Null.c
> > +  Pk/CryptAuthenticodeNull.c
> > +  Pk/CryptTsNull.c
> > +  Pem/CryptPemNull.c
> > +  Rand/CryptRandNull.c
> > +  Pk/CryptRsaPssNull.c
> > +  Pk/CryptRsaPssSignNull.c
> > +
> > +  SysCall/CrtWrapper.c
> > +  SysCall/ConstantTimeClock.c
> > +  SysCall/BaseMemAllocation.c
> > +
> > +[Packages]
> > +  MdePkg/MdePkg.dec
> > +  CryptoPkg/CryptoPkg.dec
> > +
> > +[LibraryClasses]
> > +  BaseLib
> > +  BaseMemoryLib
> > +  MemoryAllocationLib
> > +  DebugLib
> > +  OpensslLib
> > +  IntrinsicLib
> > +
> > +#
> > +# Remove these [BuildOptions] after this library is cleaned up #
> > +[BuildOptions]
> > +  #
> > +  # suppress the following warnings so we do not break the build with
> warnings-as-errors:
> > +  # C4090: 'function' : different 'const' qualifiers
> > +  # C4718: 'function call' : recursive call has no side effects,
> > +deleting
> > +  #
> > +  MSFT:*_*_*_CC_FLAGS = /wd4090 /wd4718
> > +
> > +  # -JCryptoPkg/Include : To disable the use of the system includes
> provided by RVCT
> > +  # --diag_remark=1     : Reduce severity of "#1-D: last line of file ends
> without a newline"
> > +  RVCT:*_*_ARM_CC_FLAGS = -JCryptoPkg/Include --diag_remark=1
> > +
> > +  GCC:*_CLANG35_*_CC_FLAGS = -std=c99  GCC:*_CLANG38_*_CC_FLAGS
> =
> > + -std=c99  GCC:*_CLANGPDB_*_CC_FLAGS = -std=c99
> > + -Wno-error=incompatible-pointer-types
> > +
> > +  XCODE:*_*_*_CC_FLAGS = -std=c99
> > --
> > 2.29.2.windows.2
> >
> >
> >
> > 
> >



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


Reply via email to