sha3.h raw
1 // Copyright (c) 2020-2022 The Limenka 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 LIMENKA_CRYPTO_SHA3_H
6 #define LIMENKA_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 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 // LIMENKA_CRYPTO_SHA3_H
42