forked from wolfSSL/wolfssl
Merge pull request #4389 from SparkiDev/sha512_rework
SHA512: Tidy up and have Sha512_224/256 FinalRaw return smaller digest
This commit is contained in:
@ -245,7 +245,7 @@ static int InitSha512(wc_Sha512* sha512)
|
||||
* Initialize given wc_Sha512 structure with value specific to sha512/224.
|
||||
* Note that sha512/224 has different initial hash value from sha512.
|
||||
* The initial hash value consists of eight 64bit words. They are given
|
||||
* in FIPS180-4.
|
||||
* in FIPS180-4.
|
||||
*/
|
||||
static int InitSha512_224(wc_Sha512* sha512)
|
||||
{
|
||||
@ -294,7 +294,7 @@ static int InitSha512_224(wc_Sha512* sha512)
|
||||
* Initialize given wc_Sha512 structure with value specific to sha512/256.
|
||||
* Note that sha512/256 has different initial hash value from sha512.
|
||||
* The initial hash value consists of eight 64bit words. They are given
|
||||
* in FIPS180-4.
|
||||
* in FIPS180-4.
|
||||
*/
|
||||
static int InitSha512_256(wc_Sha512* sha512)
|
||||
{
|
||||
@ -522,7 +522,7 @@ static int InitSha512_256(wc_Sha512* sha512)
|
||||
#ifdef WOLFSSL_SHA512
|
||||
|
||||
static int InitSha512_Family(wc_Sha512* sha512, void* heap, int devId,
|
||||
enum wc_HashType type)
|
||||
int (*initfp)(wc_Sha512*))
|
||||
{
|
||||
int ret = 0;
|
||||
|
||||
@ -538,24 +538,7 @@ static int InitSha512_Family(wc_Sha512* sha512, void* heap, int devId,
|
||||
sha512->devCtx = NULL;
|
||||
#endif
|
||||
|
||||
if (type == WC_HASH_TYPE_SHA512) {
|
||||
ret = InitSha512(sha512);
|
||||
}
|
||||
#if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)
|
||||
#if !defined(WOLFSSL_NOSHA512_224)
|
||||
else if (type == WC_HASH_TYPE_SHA512_224) {
|
||||
ret = InitSha512_224(sha512);
|
||||
}
|
||||
#endif
|
||||
#if !defined(WOLFSSL_NOSHA512_256)
|
||||
else if (type == WC_HASH_TYPE_SHA512_256) {
|
||||
ret = InitSha512_256(sha512);
|
||||
}
|
||||
#endif
|
||||
#endif /* !HAVE_FIPS && !HAVE_SELFTEST */
|
||||
else
|
||||
ret = BAD_FUNC_ARG;
|
||||
|
||||
ret = initfp(sha512);
|
||||
if (ret != 0)
|
||||
return ret;
|
||||
|
||||
@ -571,19 +554,19 @@ static int InitSha512_Family(wc_Sha512* sha512, void* heap, int devId,
|
||||
(void)devId;
|
||||
#endif /* WOLFSSL_ASYNC_CRYPT */
|
||||
|
||||
return ret;
|
||||
return ret;
|
||||
}
|
||||
|
||||
int wc_InitSha512_ex(wc_Sha512* sha512, void* heap, int devId)
|
||||
{
|
||||
return InitSha512_Family(sha512, heap, devId, WC_HASH_TYPE_SHA512);
|
||||
return InitSha512_Family(sha512, heap, devId, InitSha512);
|
||||
}
|
||||
|
||||
#if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)
|
||||
#if !defined(WOLFSSL_NOSHA512_224)
|
||||
int wc_InitSha512_224_ex(wc_Sha512* sha512, void* heap, int devId)
|
||||
{
|
||||
return InitSha512_Family(sha512, heap, devId, WC_HASH_TYPE_SHA512_224);
|
||||
return InitSha512_Family(sha512, heap, devId, InitSha512_224);
|
||||
}
|
||||
#endif /* !WOLFSSL_NOSHA512_224 */
|
||||
#endif /* !HAVE_FIPS && !HAVE_SELFTEST */
|
||||
@ -592,7 +575,7 @@ int wc_InitSha512_224_ex(wc_Sha512* sha512, void* heap, int devId)
|
||||
#if !defined(WOLFSSL_NOSHA512_256)
|
||||
int wc_InitSha512_256_ex(wc_Sha512* sha512, void* heap, int devId)
|
||||
{
|
||||
return InitSha512_Family(sha512, heap, devId, WC_HASH_TYPE_SHA512_256);
|
||||
return InitSha512_Family(sha512, heap, devId, InitSha512_256);
|
||||
}
|
||||
#endif /* !WOLFSSL_NOSHA512_256 */
|
||||
#endif /* !HAVE_FIPS && !HAVE_SELFTEST */
|
||||
@ -1012,8 +995,7 @@ static WC_INLINE int Sha512Final(wc_Sha512* sha512)
|
||||
}
|
||||
|
||||
#ifdef WOLFSSL_SHA512
|
||||
|
||||
int wc_Sha512FinalRaw(wc_Sha512* sha512, byte* hash)
|
||||
static int Sha512FinalRaw(wc_Sha512* sha512, byte* hash, int digestSz)
|
||||
{
|
||||
#ifdef LITTLE_ENDIAN_ORDER
|
||||
word64 digest[WC_SHA512_DIGEST_SIZE / sizeof(word64)];
|
||||
@ -1026,47 +1008,27 @@ int wc_Sha512FinalRaw(wc_Sha512* sha512, byte* hash)
|
||||
#ifdef LITTLE_ENDIAN_ORDER
|
||||
ByteReverseWords64((word64*)digest, (word64*)sha512->digest,
|
||||
WC_SHA512_DIGEST_SIZE);
|
||||
XMEMCPY(hash, digest, WC_SHA512_DIGEST_SIZE);
|
||||
XMEMCPY(hash, digest, digestSz);
|
||||
#else
|
||||
XMEMCPY(hash, sha512->digest, WC_SHA512_DIGEST_SIZE);
|
||||
XMEMCPY(hash, sha512->digest, digestSz);
|
||||
#endif
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int Sha512_Family_Final(wc_Sha512* sha512, byte* hash,
|
||||
enum wc_HashType type)
|
||||
int wc_Sha512FinalRaw(wc_Sha512* sha512, byte* hash)
|
||||
{
|
||||
return Sha512FinalRaw(sha512, hash, WC_SHA512_DIGEST_SIZE);
|
||||
}
|
||||
|
||||
static int Sha512_Family_Final(wc_Sha512* sha512, byte* hash, int digestSz,
|
||||
int (*initfp)(wc_Sha512*))
|
||||
{
|
||||
int ret;
|
||||
int digestSz;
|
||||
int (*initfp)(wc_Sha512*);
|
||||
|
||||
(void)initfp;
|
||||
|
||||
if (sha512 == NULL || hash == NULL) {
|
||||
return BAD_FUNC_ARG;
|
||||
}
|
||||
|
||||
if (type == WC_HASH_TYPE_SHA512) {
|
||||
initfp = InitSha512;
|
||||
digestSz = WC_SHA512_DIGEST_SIZE;
|
||||
}
|
||||
#if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)
|
||||
#if !defined(WOLFSSL_NOSHA512_224)
|
||||
else if (type == WC_HASH_TYPE_SHA512_224) {
|
||||
initfp = InitSha512_224;
|
||||
digestSz = WC_SHA512_224_DIGEST_SIZE;
|
||||
}
|
||||
#endif
|
||||
#if !defined(WOLFSSL_NOSHA512_256)
|
||||
else if (type == WC_HASH_TYPE_SHA512_256) {
|
||||
initfp = InitSha512_256;
|
||||
digestSz = WC_SHA512_256_DIGEST_SIZE;
|
||||
}
|
||||
#endif
|
||||
#endif /* !HAVE_FIPS && !HAVE_SELFTEST */
|
||||
else
|
||||
return BAD_FUNC_ARG;
|
||||
|
||||
#ifdef WOLF_CRYPTO_CB
|
||||
if (sha512->devId != INVALID_DEVID) {
|
||||
@ -1091,15 +1053,12 @@ static int Sha512_Family_Final(wc_Sha512* sha512, byte* hash,
|
||||
XMEMCPY(hash, sha512->digest, digestSz);
|
||||
|
||||
/* initialize Sha512 structure for the next use */
|
||||
if (initfp != NULL) {
|
||||
ret = initfp(sha512);
|
||||
}
|
||||
return ret;
|
||||
return initfp(sha512);
|
||||
}
|
||||
|
||||
int wc_Sha512Final(wc_Sha512* sha512, byte* hash)
|
||||
{
|
||||
return Sha512_Family_Final(sha512, hash, WC_HASH_TYPE_SHA512);
|
||||
return Sha512_Family_Final(sha512, hash, WC_SHA512_DIGEST_SIZE, InitSha512);
|
||||
}
|
||||
|
||||
int wc_InitSha512(wc_Sha512* sha512)
|
||||
@ -1161,7 +1120,7 @@ int wc_Sha512Transform(wc_Sha512* sha, const unsigned char* data)
|
||||
if (!IS_INTEL_AVX1(intel_flags) && !IS_INTEL_AVX2(intel_flags))
|
||||
#endif
|
||||
{
|
||||
ByteReverseWords64((word64*)data, (word64*)data,
|
||||
ByteReverseWords64((word64*)data, (word64*)data,
|
||||
WC_SHA512_BLOCK_SIZE);
|
||||
}
|
||||
#endif /* !LITTLE_ENDIAN_ORDER */
|
||||
@ -1382,34 +1341,15 @@ void wc_Sha384Free(wc_Sha384* sha384)
|
||||
|
||||
#ifdef WOLFSSL_SHA512
|
||||
|
||||
static int Sha512_Family_GetHash(wc_Sha512* sha512, byte* hash,
|
||||
enum wc_HashType type )
|
||||
static int Sha512_Family_GetHash(wc_Sha512* sha512, byte* hash,
|
||||
int (*finalfp)(wc_Sha512*, byte*))
|
||||
{
|
||||
int (*finalfp)(wc_Sha512*, byte*);
|
||||
int ret;
|
||||
wc_Sha512 tmpSha512;
|
||||
|
||||
if (sha512 == NULL || hash == NULL)
|
||||
return BAD_FUNC_ARG;
|
||||
|
||||
if (type == WC_HASH_TYPE_SHA512)
|
||||
finalfp = wc_Sha512Final;
|
||||
#if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST)
|
||||
#if !defined(WOLFSSL_NOSHA512_224)
|
||||
else if (type == WC_HASH_TYPE_SHA512_224)
|
||||
finalfp = wc_Sha512_224Final;
|
||||
#endif
|
||||
#if !defined(WOLFSSL_NOSHA512_256)
|
||||
else if (type == WC_HASH_TYPE_SHA512_256)
|
||||
finalfp = wc_Sha512_256Final;
|
||||
#endif
|
||||
#endif /* !HAVE_FIPS && !HAVE_SELFTEST */
|
||||
else
|
||||
finalfp = NULL;
|
||||
|
||||
if (finalfp == NULL)
|
||||
return BAD_FUNC_ARG;
|
||||
|
||||
#if defined(WOLFSSL_ESP32WROOM32_CRYPT) && \
|
||||
!defined(NO_WOLFSSL_ESP32WROOM32_CRYPT_HASH)
|
||||
if(sha512->ctx.mode == ESP32_SHA_INIT) {
|
||||
@ -1433,7 +1373,7 @@ static int Sha512_Family_GetHash(wc_Sha512* sha512, byte* hash,
|
||||
|
||||
int wc_Sha512GetHash(wc_Sha512* sha512, byte* hash)
|
||||
{
|
||||
return Sha512_Family_GetHash(sha512, hash, WC_HASH_TYPE_SHA512);
|
||||
return Sha512_Family_GetHash(sha512, hash, wc_Sha512Final);
|
||||
}
|
||||
|
||||
int wc_Sha512Copy(wc_Sha512* src, wc_Sha512* dst)
|
||||
@ -1499,11 +1439,12 @@ int wc_Sha512_224Update(wc_Sha512* sha, const byte* data, word32 len)
|
||||
}
|
||||
int wc_Sha512_224FinalRaw(wc_Sha512* sha, byte* hash)
|
||||
{
|
||||
return wc_Sha512FinalRaw(sha, hash);
|
||||
return Sha512FinalRaw(sha, hash, WC_SHA512_224_DIGEST_SIZE);
|
||||
}
|
||||
int wc_Sha512_224Final(wc_Sha512* sha512, byte* hash)
|
||||
{
|
||||
return Sha512_Family_Final(sha512, hash, WC_HASH_TYPE_SHA512_224);
|
||||
return Sha512_Family_Final(sha512, hash, WC_SHA512_224_DIGEST_SIZE,
|
||||
InitSha512_224);
|
||||
}
|
||||
void wc_Sha512_224Free(wc_Sha512* sha)
|
||||
{
|
||||
@ -1511,7 +1452,7 @@ void wc_Sha512_224Free(wc_Sha512* sha)
|
||||
}
|
||||
int wc_Sha512_224GetHash(wc_Sha512* sha512, byte* hash)
|
||||
{
|
||||
return Sha512_Family_GetHash(sha512, hash, WC_HASH_TYPE_SHA512_224);
|
||||
return Sha512_Family_GetHash(sha512, hash, wc_Sha512_224Final);
|
||||
}
|
||||
int wc_Sha512_224Copy(wc_Sha512* src, wc_Sha512* dst)
|
||||
{
|
||||
@ -1534,7 +1475,7 @@ int wc_Sha512_224Transform(wc_Sha512* sha, const unsigned char* data)
|
||||
{
|
||||
return wc_Sha512Transform(sha, data);
|
||||
}
|
||||
#endif /* OPENSSL_EXTRA */
|
||||
#endif /* OPENSSL_EXTRA */
|
||||
|
||||
#endif /* !WOLFSSL_NOSHA512_224 */
|
||||
|
||||
@ -1549,11 +1490,12 @@ int wc_Sha512_256Update(wc_Sha512* sha, const byte* data, word32 len)
|
||||
}
|
||||
int wc_Sha512_256FinalRaw(wc_Sha512* sha, byte* hash)
|
||||
{
|
||||
return wc_Sha512FinalRaw(sha, hash);
|
||||
return Sha512FinalRaw(sha, hash, WC_SHA512_256_DIGEST_SIZE);
|
||||
}
|
||||
int wc_Sha512_256Final(wc_Sha512* sha512, byte* hash)
|
||||
{
|
||||
return Sha512_Family_Final(sha512, hash, WC_HASH_TYPE_SHA512_256);
|
||||
return Sha512_Family_Final(sha512, hash, WC_SHA512_256_DIGEST_SIZE,
|
||||
InitSha512_256);
|
||||
}
|
||||
void wc_Sha512_256Free(wc_Sha512* sha)
|
||||
{
|
||||
@ -1561,7 +1503,7 @@ void wc_Sha512_256Free(wc_Sha512* sha)
|
||||
}
|
||||
int wc_Sha512_256GetHash(wc_Sha512* sha512, byte* hash)
|
||||
{
|
||||
return Sha512_Family_GetHash(sha512, hash, WC_HASH_TYPE_SHA512_256);
|
||||
return Sha512_Family_GetHash(sha512, hash, wc_Sha512_256Final);
|
||||
}
|
||||
int wc_Sha512_256Copy(wc_Sha512* src, wc_Sha512* dst)
|
||||
{
|
||||
@ -1584,7 +1526,7 @@ int wc_Sha512_256Transform(wc_Sha512* sha, const unsigned char* data)
|
||||
{
|
||||
return wc_Sha512Transform(sha, data);
|
||||
}
|
||||
#endif /* OPENSSL_EXTRA */
|
||||
#endif /* OPENSSL_EXTRA */
|
||||
|
||||
#endif /* !WOLFSSL_NOSHA512_224 */
|
||||
#endif /* !HAVE_FIPS && !HAVE_SELFTEST */
|
||||
|
Reference in New Issue
Block a user