From: "Wang, Jian J" <jian.j.wang@intel.com>
To: "Lu, XiaoyuX" <xiaoyux.lu@intel.com>,
"devel@edk2.groups.io" <devel@edk2.groups.io>
Subject: Re: [PATCH v2 1/1] CryptoPkg/BaseCryptLib: Wrap OpenSSL SM3 algorithm
Date: Fri, 7 Jun 2019 21:21:20 +0000 [thread overview]
Message-ID: <D827630B58408649ACB04F44C510003625912257@SHSMSX107.ccr.corp.intel.com> (raw)
In-Reply-To: <1559290402-22919-1-git-send-email-xiaoyux.lu@intel.com>
Pushed at f0718d1d6b47745a4249f4006807a45f2245dba1
Regards,
Jian
> -----Original Message-----
> From: Lu, XiaoyuX
> Sent: Friday, May 31, 2019 4:13 PM
> To: devel@edk2.groups.io
> Cc: Lu, XiaoyuX <xiaoyux.lu@intel.com>; Wang, Jian J <jian.j.wang@intel.com>
> Subject: [PATCH v2 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@intel.com>
> Signed-off-by: Xiaoyu Lu <xiaoyux.lu@intel.com>
> Reviewed-by: Jian J Wang <jian.j.wang@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 | 234
> +++++++++++++++++++++
> 6 files changed, 374 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..ef3e59ccd8f9
> --- /dev/null
> +++ b/CryptoPkg/Library/BaseCryptLib/Hash/CryptSm3.c
> @@ -0,0 +1,234 @@
> +/** @file
> + SM3 Digest Wrapper Implementations over openssl.
> +
> +Copyright (c) 2019, Intel Corporation. All rights reserved.<BR>
> +SPDX-License-Identifier: BSD-2-Clause-Patent
> +
> +**/
> +
> +#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
> + )
> +{
> + SM3_CTX Ctx;
> +
> + //
> + // Check input parameters.
> + //
> + if (HashValue == NULL) {
> + return FALSE;
> + }
> + if (Data == NULL && DataSize != 0) {
> + return FALSE;
> + }
> +
> + //
> + // SM3 Hash Computation.
> + //
> + sm3_init(&Ctx);
> +
> + sm3_update(&Ctx, Data, DataSize);
> +
> + sm3_final(HashValue, &Ctx);
> +
> + return TRUE;
> +}
> --
> 2.7.4
prev parent reply other threads:[~2019-06-07 21:21 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-05-31 8:13 [PATCH v2 1/1] CryptoPkg/BaseCryptLib: Wrap OpenSSL SM3 algorithm Xiaoyu Lu
2019-06-07 21:21 ` Wang, Jian J [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-list from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=D827630B58408649ACB04F44C510003625912257@SHSMSX107.ccr.corp.intel.com \
--to=devel@edk2.groups.io \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox