Hello Christopher,

On 09/16/20 02:59, Zurcher, Christopher J wrote:
> BZ: https://bugzilla.tianocore.org/show_bug.cgi?id=2545
> 
> The EVP interface should be used in place of discrete digest function
> calls.
> 
> Cc: Laszlo Ersek <ler...@redhat.com>
> Cc: Jiewen Yao <jiewen....@intel.com>
> Cc: Jian J Wang <jian.j.w...@intel.com>
> Cc: Xiaoyu Lu <xiaoyux...@intel.com>
> Signed-off-by: Christopher J Zurcher <christopher.j.zurc...@intel.com>
> ---
>  CryptoPkg/Library/BaseCryptLib/BaseCryptLib.inf         |   1 +
>  CryptoPkg/Library/BaseCryptLib/PeiCryptLib.inf          |   1 +
>  CryptoPkg/Library/BaseCryptLib/RuntimeCryptLib.inf      |   1 +
>  CryptoPkg/Library/BaseCryptLib/SmmCryptLib.inf          |   1 +
>  CryptoPkg/Library/BaseCryptLibNull/BaseCryptLibNull.inf |   1 +
>  CryptoPkg/Include/Library/BaseCryptLib.h                | 129 ++++++++++
>  CryptoPkg/Library/BaseCryptLib/Evp/CryptEvpMd.c         | 257 
> ++++++++++++++++++++
>  CryptoPkg/Library/BaseCryptLib/Evp/CryptEvpMdNull.c     | 128 ++++++++++
>  CryptoPkg/Library/BaseCryptLibNull/Evp/CryptEvpMdNull.c | 128 ++++++++++
>  9 files changed, 647 insertions(+)

I agree that "CryptoPkg/Library/BaseCryptLibNull/Evp/CryptEvpMdNull.c"
is necessary. (If I understand correctly, that file was missing from
your v2 posting.)

But "CryptoPkg/Library/BaseCryptLib/Evp/CryptEvpMdNull.c" seems
superfluous. This file is never referenced in the INF files.

The point of this file would be to allow *some* of the Base / Pei /
Runtime / Smm instances to "stub out" the EVP MD functions (i.e. provide
only stub implementations). But this isn't what's happening -- all of
the Base / Pei / Runtime / Smm instances are getting the real deal
("CryptoPkg/Library/BaseCryptLib/Evp/CryptEvpMd.c").

(1) So I think "CryptoPkg/Library/BaseCryptLib/Evp/CryptEvpMdNull.c"
should be dropped. Only the Null instance of the library needs null
versions of the new functions. The Base / Pei / Runtime / Smm instances
don't.

> 
> diff --git a/CryptoPkg/Library/BaseCryptLib/BaseCryptLib.inf 
> b/CryptoPkg/Library/BaseCryptLib/BaseCryptLib.inf
> index 4aae2aba95..3968f29412 100644
> --- a/CryptoPkg/Library/BaseCryptLib/BaseCryptLib.inf
> +++ b/CryptoPkg/Library/BaseCryptLib/BaseCryptLib.inf
> @@ -50,6 +50,7 @@
>    Pk/CryptAuthenticode.c
>    Pk/CryptTs.c
>    Pem/CryptPem.c
> +  Evp/CryptEvpMd.c
>  
>    SysCall/CrtWrapper.c
>    SysCall/TimerWrapper.c
> diff --git a/CryptoPkg/Library/BaseCryptLib/PeiCryptLib.inf 
> b/CryptoPkg/Library/BaseCryptLib/PeiCryptLib.inf
> index dc28e3a11d..d0b91716d0 100644
> --- a/CryptoPkg/Library/BaseCryptLib/PeiCryptLib.inf
> +++ b/CryptoPkg/Library/BaseCryptLib/PeiCryptLib.inf
> @@ -57,6 +57,7 @@
>    Pk/CryptTsNull.c
>    Pem/CryptPemNull.c
>    Rand/CryptRandNull.c
> +  Evp/CryptEvpMd.c
>  
>    SysCall/CrtWrapper.c
>    SysCall/ConstantTimeClock.c
> diff --git a/CryptoPkg/Library/BaseCryptLib/RuntimeCryptLib.inf 
> b/CryptoPkg/Library/BaseCryptLib/RuntimeCryptLib.inf
> index 5005beed02..9f3accd35b 100644
> --- a/CryptoPkg/Library/BaseCryptLib/RuntimeCryptLib.inf
> +++ b/CryptoPkg/Library/BaseCryptLib/RuntimeCryptLib.inf
> @@ -56,6 +56,7 @@
>    Pk/CryptAuthenticodeNull.c
>    Pk/CryptTsNull.c
>    Pem/CryptPem.c
> +  Evp/CryptEvpMd.c
>  
>    SysCall/CrtWrapper.c
>    SysCall/TimerWrapper.c
> diff --git a/CryptoPkg/Library/BaseCryptLib/SmmCryptLib.inf 
> b/CryptoPkg/Library/BaseCryptLib/SmmCryptLib.inf
> index 91ec3e03bf..420623cdc6 100644
> --- a/CryptoPkg/Library/BaseCryptLib/SmmCryptLib.inf
> +++ b/CryptoPkg/Library/BaseCryptLib/SmmCryptLib.inf
> @@ -54,6 +54,7 @@
>    Pk/CryptAuthenticodeNull.c
>    Pk/CryptTsNull.c
>    Pem/CryptPem.c
> +  Evp/CryptEvpMd.c
>  
>    SysCall/CrtWrapper.c
>    SysCall/ConstantTimeClock.c
> diff --git a/CryptoPkg/Library/BaseCryptLibNull/BaseCryptLibNull.inf 
> b/CryptoPkg/Library/BaseCryptLibNull/BaseCryptLibNull.inf
> index 689af4fedd..542ac2e2e1 100644
> --- a/CryptoPkg/Library/BaseCryptLibNull/BaseCryptLibNull.inf
> +++ b/CryptoPkg/Library/BaseCryptLibNull/BaseCryptLibNull.inf
> @@ -50,6 +50,7 @@
>    Pk/CryptTsNull.c
>    Pem/CryptPemNull.c
>    Rand/CryptRandNull.c
> +  Evp/CryptEvpMdNull.c
>  
>  [Packages]
>    MdePkg/MdePkg.dec
> diff --git a/CryptoPkg/Include/Library/BaseCryptLib.h 
> b/CryptoPkg/Include/Library/BaseCryptLib.h
> index ae9bde9e37..5e1b408b54 100644
> --- a/CryptoPkg/Include/Library/BaseCryptLib.h
> +++ b/CryptoPkg/Include/Library/BaseCryptLib.h
> @@ -1012,6 +1012,135 @@ HmacSha256Final (
>    OUT     UINT8  *HmacValue
>    );
>  
> +//=====================================================================================
> +//    EVP (Envelope) Primitive
> +//=====================================================================================
> +
> +/**
> +  Allocates and initializes one EVP_MD_CTX context for subsequent EVP_MD use.
> +
> +  If DigestName is NULL, then return FALSE.
> +
> +  @param[in]    DigestName    Pointer to the digest name as a 
> NULL-terminated ASCII string.
> +                              Valid digest names are:
> +                              MD5, SHA1, SHA224, SHA256, SHA384, SHA512
> +                              SHA3-224, SHA3-256, SHA3-384, SHA3-512
> +                              SM3
> +
> +  @return  Pointer to the EVP_MD_CTX context that has been allocated and 
> initialized.
> +           If DigestName is invalid, returns NULL.
> +           If the allocations fails, returns NULL.
> +           If initialization fails, returns NULL.
> +
> +**/
> +VOID *
> +EFIAPI
> +EvpMdInit (
> +  IN  CONST CHAR8   *DigestName
> +  );
> +
> +/**
> +  Makes a copy of an existing EVP_MD context.
> +
> +  If EvpMdContext is NULL, then return FALSE.
> +  If NewEvpMdContext is NULL, then return FALSE.
> +
> +  @param[in]  EvpMdContext     Pointer to EVP_MD context being copied.
> +  @param[out] NewEvpMdContext  Pointer to new EVP_MD context.
> +
> +  @retval TRUE   EVP_MD context copy succeeded.
> +  @retval FALSE  EVP_MD context copy failed.
> +
> +**/
> +BOOLEAN
> +EFIAPI
> +EvpMdDuplicate (
> +  IN  CONST VOID    *EvpMdContext,
> +  OUT VOID          *NewEvpMdContext
> +  );
> +
> +/**
> +  Digests the input data and updates EVP_MD context.
> +
> +  This function performs EVP 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.
> +  EVP_MD context should be already correctly initialized by EvpMdInit(), and 
> should not
> +  be finalized by EvpMdFinal(). Behavior with invalid context is undefined.
> +
> +  If EvpMdContext is NULL, then return FALSE.
> +  If Data is NULL and DataSize is not zero, return FALSE.
> +
> +  @param[in, out]  EvpMdContext       Pointer to the EVP_MD context.
> +  @param[in]       Data               Pointer to the buffer containing the 
> data to be digested.
> +  @param[in]       DataSize           Size of Data buffer in bytes.
> +
> +  @retval TRUE   EVP data digest succeeded.
> +  @retval FALSE  EVP data digest failed.
> +
> +**/
> +BOOLEAN
> +EFIAPI
> +EvpMdUpdate (
> +  IN OUT  VOID        *EvpMdContext,
> +  IN      CONST VOID  *Data,
> +  IN      UINTN       DataSize
> +  );
> +
> +/**
> +  Completes computation of the EVP digest value.
> +  Releases the specified EVP_MD_CTX context.
> +
> +  This function completes EVP hash computation and retrieves the digest 
> value into
> +  the specified memory. After this function has been called, the EVP context 
> cannot
> +  be used again.
> +  EVP context should be already correctly initialized by EvpMdInit(), and 
> should
> +  not be finalized by EvpMdFinal(). Behavior with invalid EVP context is 
> undefined.
> +
> +  If EvpMdContext is NULL, then return FALSE.
> +  If DigestValue is NULL, free the Context then return FALSE.
> +
> +  @param[in, out]  EvpMdContext   Pointer to the EVP context.
> +  @param[out]      Digest         Pointer to a buffer that receives the EVP 
> digest value.

(2) Please extend the comment on Digest with the following:

  The caller is responsible for providing enough storage for the digest
  algorithm selected with EvpMdInit(). Providing EVP_MAX_MD_SIZE bytes
  will suffice for storing the digest regardless of the algorithm chosen
  in EvpMdInit().

(EVP_MAX_MD_SIZE is a public OpenSSL macro and I think we should openly
advertise it to consumers in edk2.)

> +
> +  @retval TRUE   EVP digest computation succeeded.
> +  @retval FALSE  EVP digest computation failed.
> +
> +**/
> +BOOLEAN
> +EFIAPI
> +EvpMdFinal (
> +  IN OUT  VOID   *EvpMdContext,
> +  OUT     UINT8  *DigestValue

(3) DigestValue should be marked OPTIONAL in my opinion, as NULL is
deliberately permitted (for just freeing the context).

> +  );
> +
> +/**
> +  Computes the message digest of an input data buffer.
> +
> +  This function performs the message digest of a given data buffer, and 
> places
> +  the digest value into the specified memory.
> +
> +  If DigestName is NULL, return FALSE.
> +  If Data is NULL and DataSize is not zero, return FALSE.
> +  If HashValue is NULL, return FALSE.
> +
> +  @param[in]    DigestName    Pointer to the digest name.
> +  @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 digest 
> value.
> +
> +  @retval TRUE   Digest computation succeeded.
> +  @retval FALSE  Digest computation failed.
> +
> +**/
> +BOOLEAN
> +EFIAPI
> +EvpMdHashAll (
> +  IN  CONST CHAR8   *DigestName,
> +  IN  CONST VOID    *Data,
> +  IN  UINTN         DataSize,
> +  OUT UINT8         *HashValue
> +  );
> +
>  
> //=====================================================================================
>  //    Symmetric Cryptography Primitive
>  
> //=====================================================================================
> diff --git a/CryptoPkg/Library/BaseCryptLib/Evp/CryptEvpMd.c 
> b/CryptoPkg/Library/BaseCryptLib/Evp/CryptEvpMd.c
> new file mode 100644
> index 0000000000..b2770a9186
> --- /dev/null
> +++ b/CryptoPkg/Library/BaseCryptLib/Evp/CryptEvpMd.c
> @@ -0,0 +1,257 @@
> +/** @file
> +  EVP MD Wrapper Implementation for OpenSSL.
> +
> +Copyright (c) 2020, Intel Corporation. All rights reserved.<BR>
> +SPDX-License-Identifier: BSD-2-Clause-Patent
> +
> +**/
> +
> +#include "InternalCryptLib.h"
> +#include <openssl/evp.h>
> +
> +/**
> +  Allocates and initializes one EVP_MD_CTX context for subsequent EVP_MD use.
> +
> +  If DigestName is NULL, then return FALSE.
> +
> +  @param[in]    DigestName    Pointer to the digest name as a 
> NULL-terminated ASCII string.
> +                              Valid digest names are:
> +                              MD5, SHA1, SHA224, SHA256, SHA384, SHA512
> +                              SHA3-224, SHA3-256, SHA3-384, SHA3-512
> +                              SM3
> +
> +  @return  Pointer to the EVP_MD_CTX context that has been allocated and 
> initialized.
> +           If DigestName is invalid, returns NULL.
> +           If the allocations fails, returns NULL.
> +           If initialization fails, returns NULL.
> +
> +**/
> +VOID *
> +EFIAPI
> +EvpMdInit (
> +  IN  CONST CHAR8   *DigestName
> +  )
> +{
> +  EVP_MD    *Digest;
> +  VOID      *EvpMdContext;
> +
> +  //
> +  // Check input parameters.
> +  //
> +  if (DigestName == NULL) {
> +    return NULL;
> +  }
> +
> +  //
> +  // Allocate EVP_MD_CTX Context
> +  //
> +  EvpMdContext = EVP_MD_CTX_new ();
> +  if (EvpMdContext == NULL) {
> +    return NULL;
> +  }
> +
> +  Digest = EVP_get_digestbyname (DigestName);

I think this may not compile with gcc (and correctly so). The pointer
returned by EVP_get_digestbyname() is const-qualified, but with the
assignment, we're throwing away the const-ness.

(4) Please const-qualify the "Digest" local pointer.

> +  if (Digest == NULL) {
> +    return NULL;
> +  }

(5) This is a memory leak I believe; "EvpMdContext" is leaked.

For keeping the control flow simple, consider moving
EVP_get_digestbyname() above EVP_MD_CTX_new().

> +
> +  //
> +  // Initialize Context
> +  //
> +  if (EVP_DigestInit_ex (EvpMdContext, Digest, NULL) != 1) {
> +    EVP_MD_CTX_free (EvpMdContext);
> +    return NULL;
> +  }
> +
> +  return EvpMdContext;
> +}
> +
> +/**
> +  Makes a copy of an existing EVP_MD context.
> +
> +  If EvpMdContext is NULL, then return FALSE.
> +  If NewEvpMdContext is NULL, then return FALSE.
> +
> +  @param[in]  EvpMdContext     Pointer to EVP_MD context being copied.
> +  @param[out] NewEvpMdContext  Pointer to new EVP_MD context.
> +
> +  @retval TRUE   EVP_MD context copy succeeded.
> +  @retval FALSE  EVP_MD context copy failed.
> +
> +**/
> +BOOLEAN
> +EFIAPI
> +EvpMdDuplicate (
> +  IN  CONST VOID    *EvpMdContext,
> +  OUT VOID          *NewEvpMdContext
> +  )
> +{
> +  //
> +  // Check input parameters.
> +  //
> +  if (EvpMdContext == NULL || NewEvpMdContext == NULL) {
> +    return FALSE;
> +  }
> +
> +  if (EVP_MD_CTX_copy (NewEvpMdContext, EvpMdContext) != 1) {
> +    return FALSE;
> +  }
> +
> +  return TRUE;
> +}

(6) Can you please confirm that the caller is supposed to initialize
"NewEvpMdContext" with EvpMdInit() first, before calling EvpMdDuplicate()?

> +
> +/**
> +  Digests the input data and updates EVP_MD context.
> +
> +  This function performs EVP 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.
> +  EVP_MD context should be already correctly initialized by EvpMdInit(), and 
> should not
> +  be finalized by EvpMdFinal(). Behavior with invalid context is undefined.
> +
> +  If EvpMdContext is NULL, then return FALSE.
> +  If Data is NULL and DataSize is not zero, return FALSE.
> +
> +  @param[in, out]  EvpMdContext       Pointer to the EVP_MD context.
> +  @param[in]       Data               Pointer to the buffer containing the 
> data to be digested.
> +  @param[in]       DataSize           Size of Data buffer in bytes.
> +
> +  @retval TRUE   EVP data digest succeeded.
> +  @retval FALSE  EVP data digest failed.
> +
> +**/
> +BOOLEAN
> +EFIAPI
> +EvpMdUpdate (
> +  IN OUT  VOID        *EvpMdContext,
> +  IN      CONST VOID  *Data,
> +  IN      UINTN       DataSize
> +  )
> +{
> +  //
> +  // Check input parameters.
> +  //
> +  if (EvpMdContext == NULL) {
> +    return FALSE;
> +  }
> +
> +  //
> +  // Check invalid parameters, in case only DataLength was checked in OpenSSL
> +  //
> +  if (Data == NULL && DataSize != 0) {
> +    return FALSE;
> +  }
> +
> +  //
> +  // OpenSSL EVP digest update
> +  //
> +  if (EVP_DigestUpdate (EvpMdContext, Data, DataSize) != 1) {
> +    return FALSE;
> +  }
> +
> +  return TRUE;
> +}
> +
> +/**
> +  Completes computation of the EVP digest value.
> +  Releases the specified EVP_MD_CTX context.
> +
> +  This function completes EVP hash computation and retrieves the digest 
> value into
> +  the specified memory. After this function has been called, the EVP context 
> cannot
> +  be used again.
> +  EVP context should be already correctly initialized by EvpMdInit(), and 
> should
> +  not be finalized by EvpMdFinal(). Behavior with invalid EVP context is 
> undefined.
> +
> +  If EvpMdContext is NULL, then return FALSE.
> +  If DigestValue is NULL, free the Context then return FALSE.
> +
> +  @param[in, out]  EvpMdContext   Pointer to the EVP context.
> +  @param[out]      Digest         Pointer to a buffer that receives the EVP 
> digest value.
> +
> +  @retval TRUE   EVP digest computation succeeded.
> +  @retval FALSE  EVP digest computation failed.
> +
> +**/
> +BOOLEAN
> +EFIAPI
> +EvpMdFinal (
> +  IN OUT  VOID   *EvpMdContext,
> +  OUT     UINT8  *DigestValue
> +  )
> +{
> +  UINT32    Length;
> +  BOOLEAN   ReturnValue;
> +
> +  ReturnValue = TRUE;
> +
> +  //
> +  // Check input parameters.
> +  //
> +  if (EvpMdContext == NULL) {
> +    return FALSE;
> +  }
> +  if (DigestValue == NULL) {
> +    EVP_MD_CTX_free (EvpMdContext);
> +    return FALSE;
> +  }
> +
> +  //
> +  // OpenSSL EVP digest finalization
> +  //
> +  if (EVP_DigestFinal_ex (EvpMdContext, DigestValue, &Length) != 1) {
> +    ReturnValue = FALSE;
> +  }


(7) I suggest dropping the "Length" local variable. EVP_DigestFinal_ex()
deals fine with the third parameter being NULL, according to the docs
(and the code).


> +
> +  //
> +  // Free OpenSSL EVP_MD_CTX Context
> +  //
> +  EVP_MD_CTX_free (EvpMdContext);
> +
> +  return ReturnValue;
> +}
> +
> +/**
> +  Computes the message digest of an input data buffer.
> +
> +  This function performs the message digest of a given data buffer, and 
> places
> +  the digest value into the specified memory.
> +
> +  If DigestName is NULL, return FALSE.
> +  If Data is NULL and DataSize is not zero, return FALSE.
> +  If HashValue is NULL, return FALSE.
> +
> +  @param[in]    DigestName    Pointer to the digest name.
> +  @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 digest 
> value.
> +
> +  @retval TRUE   Digest computation succeeded.
> +  @retval FALSE  Digest computation failed.
> +
> +**/
> +BOOLEAN
> +EFIAPI
> +EvpMdHashAll (
> +  IN  CONST CHAR8   *DigestName,
> +  IN  CONST VOID    *Data,
> +  IN  UINTN         DataSize,
> +  OUT UINT8         *HashValue
> +  )
> +{
> +  BOOLEAN   Result;
> +  VOID      *EvpMdContext;
> +
> +  EvpMdContext = EvpMdInit (DigestName);
> +  if (EvpMdContext == NULL) {
> +    return FALSE;
> +  }
> +
> +  Result = EvpMdUpdate (EvpMdContext, Data, DataSize);
> +  if (Result == FALSE) {

(8) Style: please write (!Result).


> +    EvpMdFinal (EvpMdContext, NULL);
> +    return FALSE;
> +  }
> +
> +  Result = EvpMdFinal (EvpMdContext, HashValue);
> +
> +  return Result;
> +}
> diff --git a/CryptoPkg/Library/BaseCryptLib/Evp/CryptEvpMdNull.c 
> b/CryptoPkg/Library/BaseCryptLib/Evp/CryptEvpMdNull.c
> new file mode 100644
> index 0000000000..038f63801f
> --- /dev/null
> +++ b/CryptoPkg/Library/BaseCryptLib/Evp/CryptEvpMdNull.c
> @@ -0,0 +1,128 @@
> +/** @file
> +  EVP MD Wrapper Null Library.
> +
> +Copyright (c) 2020, Intel Corporation. All rights reserved.<BR>
> +SPDX-License-Identifier: BSD-2-Clause-Patent
> +
> +**/
> +
> +#include "InternalCryptLib.h"
> +
> +/**
> +  Allocates and initializes one EVP_MD_CTX context for subsequent EVP_MD use.
> +
> +  Return FALSE to indicate this interface is not supported.
> +
> +  @param[in]    DigestName    Pointer to the digest name as a 
> NULL-terminated ASCII string.
> +                              Valid digest names are:
> +                              MD5, SHA1, SHA224, SHA256, SHA384, SHA512
> +                              SHA3-224, SHA3-256, SHA3-384, SHA3-512
> +                              SM3
> +
> +  @return NULL  This interface is not supported.
> +
> +**/
> +VOID *
> +EFIAPI
> +EvpMdInit (
> +  IN  CONST CHAR8   *DigestName
> +  )
> +{
> +  ASSERT (FALSE);
> +  return NULL;
> +}
> +
> +/**
> +  Makes a copy of an existing EVP_MD context.
> +
> +  Return FALSE to indicate this interface is not supported.
> +
> +  @param[in]  EvpMdContext     Pointer to EVP_MD context being copied.
> +  @param[out] NewEvpMdContext  Pointer to new EVP_MD context.
> +
> +  @retval FALSE  This interface is not supported.
> +
> +**/
> +BOOLEAN
> +EFIAPI
> +EvpMdDuplicate (
> +  IN  CONST VOID    *EvpMdContext,
> +  OUT VOID          *NewEvpMdContext
> +  )
> +{
> +  ASSERT (FALSE);
> +  return FALSE;
> +}
> +
> +/**
> +  Digests the input data and updates EVP_MD context.
> +
> +  Return FALSE to indicate this interface is not supported.
> +
> +  @param[in, out]  EvpMdContext       Pointer to the EVP_MD context.
> +  @param[in]       Data               Pointer to the buffer containing the 
> data to be digested.
> +  @param[in]       DataSize           Size of Data buffer in bytes.
> +
> +  @retval FALSE  This interface is not supported.
> +
> +**/
> +BOOLEAN
> +EFIAPI
> +EvpMdUpdate (
> +  IN OUT  VOID        *EvpMdContext,
> +  IN      CONST VOID  *Data,
> +  IN      UINTN       DataSize
> +  )
> +{
> +  ASSERT (FALSE);
> +  return FALSE;
> +}
> +
> +/**
> +  Completes computation of the EVP digest value.
> +  Releases the specified EVP_MD_CTX context.
> +
> +  Return FALSE to indicate this interface is not supported.
> +
> +  @param[in, out]  EvpMdContext   Pointer to the EVP context.
> +  @param[out]      Digest         Pointer to a buffer that receives the EVP 
> digest value.
> +
> +  @retval FALSE  This interface is not supported.
> +
> +**/
> +BOOLEAN
> +EFIAPI
> +EvpMdFinal (
> +  IN OUT  VOID   *EvpMdContext,
> +  OUT     UINT8  *DigestValue
> +  )
> +{
> +  ASSERT (FALSE);
> +  return FALSE;
> +}
> +
> +/**
> +  Computes the message digest of an input data buffer.
> +
> +  Return FALSE to indicate this interface is not supported.
> +
> +  @param[in]    DigestName    Pointer to the digest name.
> +  @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 digest 
> value.
> +
> +  @retval FALSE  This interface is not supported.
> +
> +**/
> +BOOLEAN
> +EFIAPI
> +EvpMdHashAll (
> +  IN  CONST CHAR8   *DigestName,
> +  IN  CONST VOID    *Data,
> +  IN  UINTN         DataSize,
> +  OUT UINT8         *HashValue
> +  )
> +{
> +  ASSERT (FALSE);
> +  return FALSE;
> +}
> diff --git a/CryptoPkg/Library/BaseCryptLibNull/Evp/CryptEvpMdNull.c 
> b/CryptoPkg/Library/BaseCryptLibNull/Evp/CryptEvpMdNull.c
> new file mode 100644
> index 0000000000..038f63801f
> --- /dev/null
> +++ b/CryptoPkg/Library/BaseCryptLibNull/Evp/CryptEvpMdNull.c
> @@ -0,0 +1,128 @@
> +/** @file
> +  EVP MD Wrapper Null Library.
> +
> +Copyright (c) 2020, Intel Corporation. All rights reserved.<BR>
> +SPDX-License-Identifier: BSD-2-Clause-Patent
> +
> +**/
> +
> +#include "InternalCryptLib.h"
> +
> +/**
> +  Allocates and initializes one EVP_MD_CTX context for subsequent EVP_MD use.
> +
> +  Return FALSE to indicate this interface is not supported.
> +
> +  @param[in]    DigestName    Pointer to the digest name as a 
> NULL-terminated ASCII string.
> +                              Valid digest names are:
> +                              MD5, SHA1, SHA224, SHA256, SHA384, SHA512
> +                              SHA3-224, SHA3-256, SHA3-384, SHA3-512
> +                              SM3
> +
> +  @return NULL  This interface is not supported.
> +
> +**/
> +VOID *
> +EFIAPI
> +EvpMdInit (
> +  IN  CONST CHAR8   *DigestName
> +  )
> +{
> +  ASSERT (FALSE);
> +  return NULL;
> +}
> +
> +/**
> +  Makes a copy of an existing EVP_MD context.
> +
> +  Return FALSE to indicate this interface is not supported.
> +
> +  @param[in]  EvpMdContext     Pointer to EVP_MD context being copied.
> +  @param[out] NewEvpMdContext  Pointer to new EVP_MD context.
> +
> +  @retval FALSE  This interface is not supported.
> +
> +**/
> +BOOLEAN
> +EFIAPI
> +EvpMdDuplicate (
> +  IN  CONST VOID    *EvpMdContext,
> +  OUT VOID          *NewEvpMdContext
> +  )
> +{
> +  ASSERT (FALSE);
> +  return FALSE;
> +}
> +
> +/**
> +  Digests the input data and updates EVP_MD context.
> +
> +  Return FALSE to indicate this interface is not supported.
> +
> +  @param[in, out]  EvpMdContext       Pointer to the EVP_MD context.
> +  @param[in]       Data               Pointer to the buffer containing the 
> data to be digested.
> +  @param[in]       DataSize           Size of Data buffer in bytes.
> +
> +  @retval FALSE  This interface is not supported.
> +
> +**/
> +BOOLEAN
> +EFIAPI
> +EvpMdUpdate (
> +  IN OUT  VOID        *EvpMdContext,
> +  IN      CONST VOID  *Data,
> +  IN      UINTN       DataSize
> +  )
> +{
> +  ASSERT (FALSE);
> +  return FALSE;
> +}
> +
> +/**
> +  Completes computation of the EVP digest value.
> +  Releases the specified EVP_MD_CTX context.
> +
> +  Return FALSE to indicate this interface is not supported.
> +
> +  @param[in, out]  EvpMdContext   Pointer to the EVP context.
> +  @param[out]      Digest         Pointer to a buffer that receives the EVP 
> digest value.
> +
> +  @retval FALSE  This interface is not supported.
> +
> +**/
> +BOOLEAN
> +EFIAPI
> +EvpMdFinal (
> +  IN OUT  VOID   *EvpMdContext,
> +  OUT     UINT8  *DigestValue
> +  )
> +{
> +  ASSERT (FALSE);
> +  return FALSE;
> +}
> +
> +/**
> +  Computes the message digest of an input data buffer.
> +
> +  Return FALSE to indicate this interface is not supported.
> +
> +  @param[in]    DigestName    Pointer to the digest name.
> +  @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 digest 
> value.
> +
> +  @retval FALSE  This interface is not supported.
> +
> +**/
> +BOOLEAN
> +EFIAPI
> +EvpMdHashAll (
> +  IN  CONST CHAR8   *DigestName,
> +  IN  CONST VOID    *Data,
> +  IN  UINTN         DataSize,
> +  OUT UINT8         *HashValue
> +  )
> +{
> +  ASSERT (FALSE);
> +  return FALSE;
> +}
> 

Thanks,
Laszlo


-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.

View/Reply Online (#65320): https://edk2.groups.io/g/devel/message/65320
Mute This Topic: https://groups.io/mt/76878643/21656
Group Owner: devel+ow...@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub  [arch...@mail-archive.com]
-=-=-=-=-=-=-=-=-=-=-=-

Reply via email to