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 : 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 236522 : SHA3_256() = default;
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
|