Branch data Line data Source code
1 : : // Copyright (c) 2020-2022 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 <cstdlib> 11 : : #include <stdint.h> 12 : : 13 : : //! The Keccak-f[1600] transform. 14 : : void KeccakF(uint64_t (&st)[25]); 15 : : 16 : : class SHA3_256 17 : : { 18 : : private: 19 : 0 : uint64_t m_state[25] = {0}; 20 : : unsigned char m_buffer[8]; 21 : 0 : unsigned m_bufsize = 0; 22 : 0 : 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 : 0 : 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