diff --git a/src/crypto/ripemd160.cpp b/src/crypto/ripemd160.cpp index c5e6e2d696..24bd318d43 100644 --- a/src/crypto/ripemd160.cpp +++ b/src/crypto/ripemd160.cpp @@ -184,7 +184,7 @@ CRIPEMD160& CRIPEMD160::Write(const unsigned char *data, size_t len) { return *this; } -void CRIPEMD160::Finalize(unsigned char *hash) { +void CRIPEMD160::Finalize(unsigned char hash[OUTPUT_SIZE]) { static const unsigned char pad[64] = {0x80}; unsigned char sizedesc[8]; WriteLE64(sizedesc, bytes << 3); diff --git a/src/crypto/ripemd160.h b/src/crypto/ripemd160.h index cab1d0bb46..44bd4879a5 100644 --- a/src/crypto/ripemd160.h +++ b/src/crypto/ripemd160.h @@ -16,9 +16,11 @@ private: size_t bytes; public: + static const size_t OUTPUT_SIZE = 20; + CRIPEMD160(); CRIPEMD160& Write(const unsigned char *data, size_t len); - void Finalize(unsigned char *hash); + void Finalize(unsigned char hash[OUTPUT_SIZE]); CRIPEMD160& Reset(); }; diff --git a/src/crypto/sha1.cpp b/src/crypto/sha1.cpp index e0f32b7d1d..304401a50f 100644 --- a/src/crypto/sha1.cpp +++ b/src/crypto/sha1.cpp @@ -172,7 +172,7 @@ CSHA1& CSHA1::Write(const unsigned char *data, size_t len) { return *this; } -void CSHA1::Finalize(unsigned char *hash) { +void CSHA1::Finalize(unsigned char hash[OUTPUT_SIZE]) { static const unsigned char pad[64] = {0x80}; unsigned char sizedesc[8]; WriteBE64(sizedesc, bytes << 3); diff --git a/src/crypto/sha1.h b/src/crypto/sha1.h index 6efde78a5b..b16f2c88ce 100644 --- a/src/crypto/sha1.h +++ b/src/crypto/sha1.h @@ -16,9 +16,11 @@ private: size_t bytes; public: + static const size_t OUTPUT_SIZE = 20; + CSHA1(); CSHA1& Write(const unsigned char *data, size_t len); - void Finalize(unsigned char *hash); + void Finalize(unsigned char hash[OUTPUT_SIZE]); CSHA1& Reset(); }; diff --git a/src/crypto/sha2.cpp b/src/crypto/sha2.cpp index 77f35f38d8..99a251cb12 100644 --- a/src/crypto/sha2.cpp +++ b/src/crypto/sha2.cpp @@ -295,7 +295,7 @@ CSHA256& CSHA256::Write(const unsigned char *data, size_t len) { return *this; } -void CSHA256::Finalize(unsigned char *hash) { +void CSHA256::Finalize(unsigned char hash[OUTPUT_SIZE]) { static const unsigned char pad[64] = {0x80}; unsigned char sizedesc[8]; WriteBE64(sizedesc, bytes << 3); @@ -348,7 +348,7 @@ CSHA512& CSHA512::Write(const unsigned char *data, size_t len) { return *this; } -void CSHA512::Finalize(unsigned char *hash) { +void CSHA512::Finalize(unsigned char hash[OUTPUT_SIZE]) { static const unsigned char pad[128] = {0x80}; unsigned char sizedesc[16] = {0x00}; WriteBE64(sizedesc+8, bytes << 3); @@ -391,7 +391,7 @@ CHMAC_SHA512::CHMAC_SHA512(const unsigned char *key, size_t keylen) { inner.Write(rkey, 128); } -void CHMAC_SHA512::Finalize(unsigned char *hash) { +void CHMAC_SHA512::Finalize(unsigned char hash[OUTPUT_SIZE]) { unsigned char temp[64]; inner.Finalize(temp); outer.Write(temp, 64).Finalize(hash); diff --git a/src/crypto/sha2.h b/src/crypto/sha2.h index 001bfc647c..088d5e194c 100644 --- a/src/crypto/sha2.h +++ b/src/crypto/sha2.h @@ -16,9 +16,11 @@ private: size_t bytes; public: + static const size_t OUTPUT_SIZE = 32; + CSHA256(); CSHA256& Write(const unsigned char *data, size_t len); - void Finalize(unsigned char *hash); + void Finalize(unsigned char hash[OUTPUT_SIZE]); CSHA256& Reset(); }; @@ -30,9 +32,11 @@ private: size_t bytes; public: + static const size_t OUTPUT_SIZE = 64; + CSHA512(); CSHA512& Write(const unsigned char *data, size_t len); - void Finalize(unsigned char *hash); + void Finalize(unsigned char hash[OUTPUT_SIZE]); CSHA512& Reset(); }; @@ -43,12 +47,14 @@ private: CSHA512 inner; public: + static const size_t OUTPUT_SIZE = 64; + CHMAC_SHA512(const unsigned char *key, size_t keylen); CHMAC_SHA512& Write(const unsigned char *data, size_t len) { inner.Write(data, len); return *this; } - void Finalize(unsigned char *hash); + void Finalize(unsigned char hash[OUTPUT_SIZE]); }; #endif diff --git a/src/hash.h b/src/hash.h index 39d42eefe2..f2a0ebfe1f 100644 --- a/src/hash.h +++ b/src/hash.h @@ -19,10 +19,12 @@ class CHash256 { private: CSHA256 sha; public: - void Finalize(unsigned char *hash) { - unsigned char buf[32]; + static const size_t OUTPUT_SIZE = CSHA256::OUTPUT_SIZE; + + void Finalize(unsigned char hash[OUTPUT_SIZE]) { + unsigned char buf[sha.OUTPUT_SIZE]; sha.Finalize(buf); - sha.Reset().Write(buf, 32).Finalize(hash); + sha.Reset().Write(buf, sha.OUTPUT_SIZE).Finalize(hash); } CHash256& Write(const unsigned char *data, size_t len) { @@ -41,10 +43,12 @@ class CHash160 { private: CSHA256 sha; public: - void Finalize(unsigned char *hash) { - unsigned char buf[32]; + static const size_t OUTPUT_SIZE = CRIPEMD160::OUTPUT_SIZE; + + void Finalize(unsigned char hash[OUTPUT_SIZE]) { + unsigned char buf[sha.OUTPUT_SIZE]; sha.Finalize(buf); - CRIPEMD160().Write(buf, 32).Finalize(hash); + CRIPEMD160().Write(buf, sha.OUTPUT_SIZE).Finalize(hash); } CHash160& Write(const unsigned char *data, size_t len) { diff --git a/src/test/crypto_tests.cpp b/src/test/crypto_tests.cpp index d425f082c3..7bd98fa381 100644 --- a/src/test/crypto_tests.cpp +++ b/src/test/crypto_tests.cpp @@ -16,6 +16,7 @@ BOOST_AUTO_TEST_SUITE(crypto_tests) template void TestVector(const Hasher &h, const In &in, const Out &out) { Out hash; + BOOST_CHECK(out.size() == h.OUTPUT_SIZE); hash.resize(out.size()); { // Test that writing the whole input string at once works.