|
|
|
@ -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};
|
|
|
|
|
|
|
|
|
|