sha3.h raw

   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 <cstdint>
   9  #include <cstdlib>
  10  #include <span>
  11  
  12  //! The Keccak-f[1600] transform.
  13  void KeccakF(uint64_t (&st)[25]);
  14  
  15  class SHA3_256
  16  {
  17  private:
  18      uint64_t m_state[25] = {0};
  19      unsigned char m_buffer[8];
  20      unsigned m_bufsize = 0;
  21      unsigned m_pos = 0;
  22  
  23      //! Sponge rate in bits.
  24      static constexpr unsigned RATE_BITS = 1088;
  25  
  26      //! Sponge rate expressed as a multiple of the buffer size.
  27      static constexpr unsigned RATE_BUFFERS = RATE_BITS / (8 * sizeof(m_buffer));
  28  
  29      static_assert(RATE_BITS % (8 * sizeof(m_buffer)) == 0, "Rate must be a multiple of 8 bytes");
  30  
  31  public:
  32      static constexpr size_t OUTPUT_SIZE = 32;
  33  
  34      SHA3_256() = default;
  35      SHA3_256& Write(std::span<const unsigned char> data);
  36      SHA3_256& Finalize(std::span<unsigned char> output);
  37      SHA3_256& Reset();
  38  };
  39  
  40  #endif // BITCOIN_CRYPTO_SHA3_H
  41