[edk2-devel] [PATCH v1 1/1] CryptoPkg/BaseCryptLib: Wrap OpenSSL SM3 algorithm

Wang, Jian J jian.j.wang at intel.com
Fri May 31 07:33:35 UTC 2019


Xiaoyu,

Two small issues below. With them fixed,

    Reviewed-by: Jian J Wang <jian.j.wang at intel.com>

> -----Original Message-----
> From: Lu, XiaoyuX
> Sent: Thursday, May 30, 2019 4:24 PM
> To: devel at edk2.groups.io
> Cc: Wang, Jian J <jian.j.wang at intel.com>
> Subject: [PATCH v1 1/1] CryptoPkg/BaseCryptLib: Wrap OpenSSL SM3 algorithm
> 
> REF: https://bugzilla.tianocore.org/show_bug.cgi?id=1861
> 
> 1. Implement OpenSSL SM3 wrapped functions in CryptSm3.c file.
> 2. Add wrapped SM3 functions declaration to BaseCryptLib.h file.
> 3. Add CryptSm3.c to each module information file.
> 
> Cc: Jian J Wang <jian.j.wang at intel.com>
> Signed-off-by: Xiaoyu Lu <xiaoyux.lu at 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/Include/Library/BaseCryptLib.h           | 136 ++++++++++++
>  CryptoPkg/Library/BaseCryptLib/Hash/CryptSm3.c     | 240
> +++++++++++++++++++++
>  6 files changed, 380 insertions(+)
>  create mode 100644 CryptoPkg/Library/BaseCryptLib/Hash/CryptSm3.c
> 
> diff --git a/CryptoPkg/Library/BaseCryptLib/BaseCryptLib.inf
> b/CryptoPkg/Library/BaseCryptLib/BaseCryptLib.inf
> index 2a581ceac70c..964e6db73161 100644
> --- a/CryptoPkg/Library/BaseCryptLib/BaseCryptLib.inf
> +++ b/CryptoPkg/Library/BaseCryptLib/BaseCryptLib.inf
> @@ -33,6 +33,7 @@ [Sources]
>    Hash/CryptSha1.c
>    Hash/CryptSha256.c
>    Hash/CryptSha512.c
> +  Hash/CryptSm3.c
>    Hmac/CryptHmacMd5.c
>    Hmac/CryptHmacSha1.c
>    Hmac/CryptHmacSha256.c
> diff --git a/CryptoPkg/Library/BaseCryptLib/PeiCryptLib.inf
> b/CryptoPkg/Library/BaseCryptLib/PeiCryptLib.inf
> index 8fdc6920ec2e..b469334b11d0 100644
> --- a/CryptoPkg/Library/BaseCryptLib/PeiCryptLib.inf
> +++ b/CryptoPkg/Library/BaseCryptLib/PeiCryptLib.inf
> @@ -38,6 +38,7 @@ [Sources]
>    Hash/CryptMd5.c
>    Hash/CryptSha1.c
>    Hash/CryptSha256.c
> +  Hash/CryptSm3.c
>    Hash/CryptSha512.c
>    Hmac/CryptHmacMd5Null.c
>    Hmac/CryptHmacSha1Null.c
> diff --git a/CryptoPkg/Library/BaseCryptLib/RuntimeCryptLib.inf
> b/CryptoPkg/Library/BaseCryptLib/RuntimeCryptLib.inf
> index 9d639fd01eae..fdae33a1a52b 100644
> --- a/CryptoPkg/Library/BaseCryptLib/RuntimeCryptLib.inf
> +++ b/CryptoPkg/Library/BaseCryptLib/RuntimeCryptLib.inf
> @@ -37,6 +37,7 @@ [Sources]
>    Hash/CryptMd5.c
>    Hash/CryptSha1.c
>    Hash/CryptSha256.c
> +  Hash/CryptSm3.c
>    Hash/CryptSha512Null.c
>    Hmac/CryptHmacMd5Null.c
>    Hmac/CryptHmacSha1Null.c
> diff --git a/CryptoPkg/Library/BaseCryptLib/SmmCryptLib.inf
> b/CryptoPkg/Library/BaseCryptLib/SmmCryptLib.inf
> index c9f4abb22aea..f3255ebc7e95 100644
> --- a/CryptoPkg/Library/BaseCryptLib/SmmCryptLib.inf
> +++ b/CryptoPkg/Library/BaseCryptLib/SmmCryptLib.inf
> @@ -37,6 +37,7 @@ [Sources]
>    Hash/CryptMd5.c
>    Hash/CryptSha1.c
>    Hash/CryptSha256.c
> +  Hash/CryptSm3.c
>    Hash/CryptSha512Null.c
>    Hmac/CryptHmacMd5Null.c
>    Hmac/CryptHmacSha1Null.c
> diff --git a/CryptoPkg/Include/Library/BaseCryptLib.h
> b/CryptoPkg/Include/Library/BaseCryptLib.h
> index 84374b283b7a..19d1afe3c8c0 100644
> --- a/CryptoPkg/Include/Library/BaseCryptLib.h
> +++ b/CryptoPkg/Include/Library/BaseCryptLib.h
> @@ -45,6 +45,11 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
>  #define SHA512_DIGEST_SIZE  64
> 
>  ///
> +/// SM3 digest size in bytes
> +///
> +#define SM3_256_DIGEST_SIZE 32
> +
> +///
>  /// TDES block size in bytes
>  ///
>  #define TDES_BLOCK_SIZE     8
> @@ -885,6 +890,137 @@ Sha512HashAll (
>    OUT  UINT8       *HashValue
>    );
> 
> +/**
> +  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
> +  );
> +
> +/**
> +  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
> +  );
> +
> +/**
> +  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
> +  );
> +
> +/**
> +  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
> +  );
> +
> +/**
> +  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
> +  );
> +
> +/**
> +  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
> +  );
> +
> 
> //===============================================================
> ======================
>  //    MAC (Message Authentication Code) Primitive
> 
> //===============================================================
> ======================
> diff --git a/CryptoPkg/Library/BaseCryptLib/Hash/CryptSm3.c
> b/CryptoPkg/Library/BaseCryptLib/Hash/CryptSm3.c
> new file mode 100644
> index 000000000000..ed9a50c82bce
> --- /dev/null
> +++ b/CryptoPkg/Library/BaseCryptLib/Hash/CryptSm3.c
> @@ -0,0 +1,240 @@
> +/** @file
> +  SM3 Digest Wrapper Implementations over openssl.
> +
> +Copyright (c) 2019, Intel Corporation. All rights reserved.<BR>
> +This program and the accompanying materials
> +are licensed and made available under the terms and conditions of the BSD
> License
> +which accompanies this distribution.  The full text of the license may be found
> at
> +http://opensource.org/licenses/bsd-license.php
> +
> +THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
> +WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS
> OR IMPLIED.
> +
> +**/

License header here is not correct. Please use the 2-clause one.

> +
> +#include "InternalCryptLib.h"
> +#include "internal/sm3.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
> +  )
> +{
> +  //
> +  // Retrieves Openssl SM3 Context Size
> +  //
> +  return (UINTN) (sizeof (SM3_CTX));
> +}
> +
> +/**
> +  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
> +  )
> +{
> +  //
> +  // Check input parameters.
> +  //
> +  if (Sm3Context == NULL) {
> +    return FALSE;
> +  }
> +
> +  //
> +  // Openssl SM3 Context Initialization
> +  //
> +  sm3_init ((SM3_CTX *) Sm3Context);
> +  return TRUE;
> +}
> +
> +/**
> +  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
> +  )
> +{
> +  //
> +  // Check input parameters.
> +  //
> +  if (Sm3Context == NULL || NewSm3Context == NULL) {
> +    return FALSE;
> +  }
> +
> +  CopyMem (NewSm3Context, Sm3Context, sizeof (SM3_CTX));
> +
> +  return TRUE;
> +}
> +
> +/**
> +  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
> +  )
> +{
> +  //
> +  // Check input parameters.
> +  //
> +  if (Sm3Context == NULL) {
> +    return FALSE;
> +  }
> +
> +  //
> +  // Check invalid parameters, in case that only DataLength was checked in
> Openssl
> +  //
> +  if (Data == NULL && DataSize != 0) {
> +    return FALSE;
> +  }
> +
> +  //
> +  // Openssl SM3 Hash Update
> +  //
> +  sm3_update ((SM3_CTX *) Sm3Context, Data, DataSize);
> +
> +  return TRUE;
> +}
> +
> +/**
> +  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
> +  )
> +{
> +  //
> +  // Check input parameters.
> +  //
> +  if (Sm3Context == NULL || HashValue == NULL) {
> +    return FALSE;
> +  }
> +
> +  //
> +  // Openssl SM3 Hash Finalization
> +  //
> +  sm3_final (HashValue, (SM3_CTX *) Sm3Context);
> +
> +  return TRUE;
> +}
> +
> +/**
> +  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
> +  )
> +{
> +  //
> +  // Check input parameters.
> +  //
> +  if (HashValue == NULL) {
> +    return FALSE;
> +  }
> +  if (Data == NULL && DataSize != 0) {
> +    return FALSE;
> +  }
> +
> +  //
> +  // SM3 Hash Computation.
> +  //
> +  SM3_CTX ctx;
> +

Please put the local variable declaration at the beginning of this function.

Regards,
Jian

> +  sm3_init(&ctx);
> +
> +  sm3_update(&ctx, Data, DataSize);
> +
> +  sm3_final(HashValue, &ctx);
> +
> +  return TRUE;
> +}
> --
> 2.7.4


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

View/Reply Online (#41716): https://edk2.groups.io/g/devel/message/41716
Mute This Topic: https://groups.io/mt/31866725/1813853
Group Owner: devel+owner at edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub  [edk2-devel-archive at redhat.com]
-=-=-=-=-=-=-=-=-=-=-=-





More information about the edk2-devel-archive mailing list