Branch data Line data Source code
# 1 : : // Copyright (c) 2020 The Bitcoin Core developers # 2 : : // Distributed under the MIT software license, see the accompanying # 3 : : // file COPYING or http://www.opensource.org/licenses/mit-license.php. # 4 : : # 5 : : #ifndef BITCOIN_CRYPTO_SHA3_H # 6 : : #define BITCOIN_CRYPTO_SHA3_H # 7 : : # 8 : : #include <span.h> # 9 : : # 10 : : #include <stdint.h> # 11 : : #include <stdlib.h> # 12 : : # 13 : : //! The Keccak-f[1600] transform. # 14 : : void KeccakF(uint64_t (&st)[25]); # 15 : : # 16 : : class SHA3_256 # 17 : : { # 18 : : private: # 19 : : uint64_t m_state[25] = {0}; # 20 : : unsigned char m_buffer[8]; # 21 : : unsigned m_bufsize = 0; # 22 : : unsigned m_pos = 0; # 23 : : # 24 : : //! Sponge rate in bits. # 25 : : static constexpr unsigned RATE_BITS = 1088; # 26 : : # 27 : : //! Sponge rate expressed as a multiple of the buffer size. # 28 : : static constexpr unsigned RATE_BUFFERS = RATE_BITS / (8 * sizeof(m_buffer)); # 29 : : # 30 : : static_assert(RATE_BITS % (8 * sizeof(m_buffer)) == 0, "Rate must be a multiple of 8 bytes"); # 31 : : # 32 : : public: # 33 : : static constexpr size_t OUTPUT_SIZE = 32; # 34 : : # 35 : 138 : SHA3_256() {} # 36 : : SHA3_256& Write(Span<const unsigned char> data); # 37 : : SHA3_256& Finalize(Span<unsigned char> output); # 38 : : SHA3_256& Reset(); # 39 : : }; # 40 : : # 41 : : #endif // BITCOIN_CRYPTO_SHA3_H