/Users/eugenesiegel/btc/bitcoin/src/crypto/sha3.h
Line | Count | Source |
1 | | // Copyright (c) 2020-present 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 | 718 | SHA3_256() = default; |
36 | | SHA3_256& Write(std::span<const unsigned char> data); |
37 | | SHA3_256& Finalize(std::span<unsigned char> output); |
38 | | SHA3_256& Reset(); |
39 | | }; |
40 | | |
41 | | #endif // BITCOIN_CRYPTO_SHA3_H |