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