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 : : 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 [ + - ]: 191 : 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
|