From 91ef616b5613b8b8d19ce6d74aa775ff0030852b Mon Sep 17 00:00:00 2001 From: Andrew Kozlik Date: Thu, 10 Aug 2023 17:25:07 +0200 Subject: [PATCH] feat(crypto): Implement sha384_Raw(). --- crypto/sha2.c | 33 ++++++++++++++++++++++++++++++++- crypto/sha2.h | 3 +++ 2 files changed, 35 insertions(+), 1 deletion(-) diff --git a/crypto/sha2.c b/crypto/sha2.c index 42c7efb10..5d9c18817 100644 --- a/crypto/sha2.c +++ b/crypto/sha2.c @@ -273,6 +273,18 @@ const sha2_word64 sha512_initial_hash_value[8] = { 0x5be0cd19137e2179ULL }; +/* Initial hash value H for SHA-384 */ +const sha2_word64 sha384_initial_hash_value[8] = { + 0xcbbb9d5dc1059ed8ULL, + 0x629a292a367cd507ULL, + 0x9159015a3070dd17ULL, + 0x152fecd8f70e5939ULL, + 0x67332667ffc00b31ULL, + 0x8eb44a8768581511ULL, + 0xdb0c2e0d64f98fa7ULL, + 0x47b5481dbefa4fa4ULL +}; + /* * Constant used by SHA256/384/512_End() functions for converting the * digest to a readable hexadecimal character string: @@ -984,7 +996,7 @@ char* sha256_Data(const sha2_byte* data, size_t len, char digest[SHA256_DIGEST_S } -/*** SHA-512: *********************************************************/ +/*** SHA-512 and SHA-384: *********************************************/ void sha512_Init(SHA512_CTX* context) { if (context == (SHA512_CTX*)0) { return; @@ -994,6 +1006,15 @@ void sha512_Init(SHA512_CTX* context) { context->bitcount[0] = context->bitcount[1] = 0; } +static void sha384_Init(SHA512_CTX* context) { + if (context == (SHA512_CTX*)0) { + return; + } + MEMCPY_BCOPY(context->state, sha384_initial_hash_value, SHA512_DIGEST_LENGTH); + memzero(context->buffer, SHA512_BLOCK_LENGTH); + context->bitcount[0] = context->bitcount[1] = 0; +} + #ifdef SHA2_UNROLL_TRANSFORM /* Unrolled SHA-512 round macros: */ @@ -1284,6 +1305,16 @@ void sha512_Raw(const sha2_byte* data, size_t len, uint8_t digest[SHA512_DIGEST_ sha512_Final(&context, digest); } +void sha384_Raw(const sha2_byte* data, size_t len, uint8_t digest[SHA384_DIGEST_LENGTH]) { + uint8_t full_digest[SHA512_DIGEST_LENGTH] = {0}; + SHA512_CTX context = {0}; + sha384_Init(&context); + sha512_Update(&context, data, len); + sha512_Final(&context, full_digest); + memcpy(digest, full_digest, SHA384_DIGEST_LENGTH); + memzero(full_digest, sizeof(full_digest)); +} + char* sha512_Data(const sha2_byte* data, size_t len, char digest[SHA512_DIGEST_STRING_LENGTH]) { SHA512_CTX context = {0}; diff --git a/crypto/sha2.h b/crypto/sha2.h index d310120f4..5149b8dae 100644 --- a/crypto/sha2.h +++ b/crypto/sha2.h @@ -41,6 +41,7 @@ #define SHA256_BLOCK_LENGTH 64 #define SHA256_DIGEST_LENGTH 32 #define SHA256_DIGEST_STRING_LENGTH (SHA256_DIGEST_LENGTH * 2 + 1) +#define SHA384_DIGEST_LENGTH 48 #define SHA512_BLOCK_LENGTH 128 #define SHA512_DIGEST_LENGTH 64 #define SHA512_DIGEST_STRING_LENGTH (SHA512_DIGEST_LENGTH * 2 + 1) @@ -81,6 +82,8 @@ char* sha256_End(SHA256_CTX*, char[SHA256_DIGEST_STRING_LENGTH]); void sha256_Raw(const uint8_t*, size_t, uint8_t[SHA256_DIGEST_LENGTH]); char* sha256_Data(const uint8_t*, size_t, char[SHA256_DIGEST_STRING_LENGTH]); +void sha384_Raw(const uint8_t*, size_t, uint8_t[SHA384_DIGEST_LENGTH]); + void sha512_Transform(const uint64_t* state_in, const uint64_t* data, uint64_t* state_out); void sha512_Init(SHA512_CTX*); void sha512_Update(SHA512_CTX*, const uint8_t*, size_t);