mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-02-03 09:56:38 -05:00
hash: add HashedSourceWriter
This class is the counterpart to CHashVerifier, in that it writes data to an underlying source stream, while keeping a hash of the written data.
This commit is contained in:
parent
32834034a3
commit
da6c7aeca3
2 changed files with 39 additions and 0 deletions
25
src/hash.h
25
src/hash.h
|
@ -6,6 +6,7 @@
|
||||||
#ifndef BITCOIN_HASH_H
|
#ifndef BITCOIN_HASH_H
|
||||||
#define BITCOIN_HASH_H
|
#define BITCOIN_HASH_H
|
||||||
|
|
||||||
|
#include <attributes.h>
|
||||||
#include <crypto/common.h>
|
#include <crypto/common.h>
|
||||||
#include <crypto/ripemd160.h>
|
#include <crypto/ripemd160.h>
|
||||||
#include <crypto/sha256.h>
|
#include <crypto/sha256.h>
|
||||||
|
@ -199,6 +200,30 @@ public:
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/** Writes data to an underlying source stream, while hashing the written data. */
|
||||||
|
template <typename Source>
|
||||||
|
class HashedSourceWriter : public CHashWriter
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
Source& m_source;
|
||||||
|
|
||||||
|
public:
|
||||||
|
explicit HashedSourceWriter(Source& source LIFETIMEBOUND) : CHashWriter{source.GetType(), source.GetVersion()}, m_source{source} {}
|
||||||
|
|
||||||
|
void write(Span<const std::byte> src)
|
||||||
|
{
|
||||||
|
m_source.write(src);
|
||||||
|
CHashWriter::write(src);
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
HashedSourceWriter& operator<<(const T& obj)
|
||||||
|
{
|
||||||
|
::Serialize(*this, obj);
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
/** Compute the 256-bit hash of an object's serialization. */
|
/** Compute the 256-bit hash of an object's serialization. */
|
||||||
template<typename T>
|
template<typename T>
|
||||||
uint256 SerializeHash(const T& obj, int nType=SER_GETHASH, int nVersion=PROTOCOL_VERSION)
|
uint256 SerializeHash(const T& obj, int nType=SER_GETHASH, int nVersion=PROTOCOL_VERSION)
|
||||||
|
|
|
@ -500,4 +500,18 @@ BOOST_AUTO_TEST_CASE(streams_buffered_file_rand)
|
||||||
fs::remove(streams_test_filename);
|
fs::remove(streams_test_filename);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
BOOST_AUTO_TEST_CASE(streams_hashed)
|
||||||
|
{
|
||||||
|
CDataStream stream(SER_NETWORK, INIT_PROTO_VERSION);
|
||||||
|
HashedSourceWriter hash_writer{stream};
|
||||||
|
const std::string data{"bitcoin"};
|
||||||
|
hash_writer << data;
|
||||||
|
|
||||||
|
CHashVerifier hash_verifier{&stream};
|
||||||
|
std::string result;
|
||||||
|
hash_verifier >> result;
|
||||||
|
BOOST_CHECK_EQUAL(data, result);
|
||||||
|
BOOST_CHECK_EQUAL(hash_writer.GetHash(), hash_verifier.GetHash());
|
||||||
|
}
|
||||||
|
|
||||||
BOOST_AUTO_TEST_SUITE_END()
|
BOOST_AUTO_TEST_SUITE_END()
|
||||||
|
|
Loading…
Add table
Reference in a new issue