* [PATCH v2 1/1] CryptoPkg/BaseCryptLib: Wrap OpenSSL SM3 algorithm
@ 2019-05-31 8:13 Xiaoyu Lu
2019-06-07 21:21 ` Wang, Jian J
0 siblings, 1 reply; 2+ messages in thread
From: Xiaoyu Lu @ 2019-05-31 8:13 UTC (permalink / raw)
To: devel; +Cc: Xiaoyu Lu, Jian J Wang
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
^ permalink raw reply related [flat|nested] 2+ messages in thread
* Re: [PATCH v2 1/1] CryptoPkg/BaseCryptLib: Wrap OpenSSL SM3 algorithm
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
0 siblings, 0 replies; 2+ messages in thread
From: Wang, Jian J @ 2019-06-07 21:21 UTC (permalink / raw)
To: Lu, XiaoyuX, devel@edk2.groups.io
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
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2019-06-07 21:21 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
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 is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox