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 1584 : uint64_t m_state[25] = {0}; 20 : unsigned char m_buffer[8]; 21 66 : unsigned m_bufsize = 0; 22 66 : 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 198 : 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