/** @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 "crypto/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; | |
} |