From a92388bd08317bfb80e68f5855559be98c94aba0 Mon Sep 17 00:00:00 2001 From: Matt David Date: Wed, 20 Apr 2016 09:32:00 -0700 Subject: [PATCH] Add SHA224 support to BRHash --- .gitignore | 2 ++ BRHash.c | 21 +++++++++++++++++++++ BRHash.h | 2 ++ 3 files changed, 25 insertions(+) diff --git a/.gitignore b/.gitignore index 9bd268e7e..77efe9de8 100644 --- a/.gitignore +++ b/.gitignore @@ -34,3 +34,5 @@ # IDE files *.xcworkspace *.xcodeproj + +.idea/ \ No newline at end of file diff --git a/BRHash.c b/BRHash.c index b2082bd73..a654d05bb 100644 --- a/BRHash.c +++ b/BRHash.c @@ -117,6 +117,27 @@ static void _BRSHA256Compress(uint32_t *r, uint32_t *x) memset(w, 0, sizeof(w)); } +void BRSHA224(void *md28, const void *data, size_t len) { + size_t i; + uint32_t x[16], buf[] = {0xc1059ed8, 0x367cd507, 0x3070dd17, 0xf70e5939, 0xffc00b31, 0x68581511, + 0x64f98fa7, 0xbefa4fa4}; // initial buffer values + + for (i = 0; i < len; i += 64) { // process data in 64 byte blocks + memcpy(x, (const uint8_t *)data + i, (i + 64 < len) ? 64 : len - i); + if (i + 64 > len) break; + _BRSHA256Compress(buf, x); + } + + memset((uint8_t *)x + (len - i), 0, 64 - (len - i)); // clear remainder of x + ((uint8_t *)x)[len - i] = 0x80; // append padding + if (len - i >= 56) _BRSHA256Compress(buf, x), memset(x, 0, 64); // length goes to next block + *(uint64_t *)&x[14] = be64((uint64_t)len*8); // append length in bits + _BRSHA256Compress(buf, x); // finalize + for (i = 0; i < 7; i++) ((uint32_t *)md28)[i] = be32(buf[i]); // write to md + memset(x, 0, sizeof(x)); + memset(buf, 0, sizeof(buf)); +} + void BRSHA256(void *md32, const void *data, size_t len) { size_t i; diff --git a/BRHash.h b/BRHash.h index be45bd116..5e6c3a270 100644 --- a/BRHash.h +++ b/BRHash.h @@ -36,6 +36,8 @@ void BRSHA1(void *md20, const void *data, size_t len); void BRSHA256(void *md32, const void *data, size_t len); +void BRSHA224(void *md28, const void *data, size_t len); + // double-sha-256 = sha-256(sha-256(x)) void BRSHA256_2(void *md32, const void *data, size_t len);