diff --git a/src/Serializer.cpp b/src/Serializer.cpp index 09536bb557..51fd734668 100644 --- a/src/Serializer.cpp +++ b/src/Serializer.cpp @@ -1,9 +1,15 @@ + #include "Serializer.h" -#include "key.h" + #include + #include #include +#include + +#include "key.h" + int Serializer::addZeros(size_t uBytes) { int ret = mData.size(); @@ -238,6 +244,24 @@ uint256 Serializer::getSHA512Half(const std::string& strData) return getSHA512Half(reinterpret_cast(strData.c_str()), strData.size()); } +uint256 Serializer::getPrefixHash(uint32 prefix, const unsigned char *data, int len) +{ + char be_prefix[4]; + be_prefix[0] = static_cast(prefix >> 24); + be_prefix[1] = static_cast((prefix >> 16) & 0xff); + be_prefix[2] = static_cast((prefix >> 8) & 0xff); + be_prefix[3] = static_cast(prefix & 0xff); + + uint256 j[2]; + SHA512_CTX ctx; + SHA512_Init(&ctx); + SHA512_Update(&ctx, &be_prefix[0], 4); + SHA512_Update(&ctx, data, len); + SHA512_Final(reinterpret_cast(&j[0]), &ctx); + + return j[0]; +} + bool Serializer::checkSignature(int pubkeyOffset, int signatureOffset) const { std::vector pubkey, signature; @@ -593,4 +617,23 @@ std::vector SerializerIterator::getRaw(int iLength) return mSerializer.getRaw(iPos, iLength); } +BOOST_AUTO_TEST_SUITE(Serializer_suite) + +BOOST_AUTO_TEST_CASE( Serializer_PrefixHash_test ) +{ + Serializer s1; + s1.add32(3); + s1.add256(uint256()); + + Serializer s2; + s2.add32(0x12345600); + s2.addRaw(s1.peekData()); + + if (s1.getPrefixHash(0x12345600) != s2.getSHA512Half()) + BOOST_FAIL("Prefix hash does not work"); +} + + +BOOST_AUTO_TEST_SUITE_END(); + // vim:ts=4 diff --git a/src/Serializer.h b/src/Serializer.h index 40613dd52b..a0962c43a4 100644 --- a/src/Serializer.h +++ b/src/Serializer.h @@ -67,7 +67,7 @@ public: bool getTaggedList(std::list&, int offset, int& length) const; bool getTaggedList(std::vector&, int offset, int& length) const; - // hash functions + // normal hash functions uint160 getRIPEMD160(int size=-1) const; uint256 getSHA256(int size=-1) const; uint256 getSHA512Half(int size=-1) const; @@ -75,6 +75,15 @@ public: static uint256 getSHA512Half(const unsigned char *data, int len); static uint256 getSHA512Half(const std::string& strData); + // prefix hash functions + static uint256 getPrefixHash(uint32 prefix, const unsigned char *data, int len); + uint256 getPrefixHash(uint32 prefix) const + { return getPrefixHash(prefix, &(mData.front()), mData.size()); } + static uint256 getPrefixHash(uint32 prefix, const std::vector& data) + { return getPrefixHash(prefix, &(data.front()), data.size()); } + static uint256 getPrefixHash(uint32 prefix, const std::string& strData) + { return getPrefixHash(prefix, reinterpret_cast(strData.c_str()), strData.size()); } + // totality functions int getCapacity() const { return mData.capacity(); } int getDataLength() const { return mData.size(); }