21 [&]<uint64_t... I>(std::index_sequence<I...>) __attribute__((always_inline)) { \
23 } (std::make_index_sequence<(F)>());
34template <std::
size_t m_mode>
36 alignas(32) uint64_t s[
b >> 6] = {0};
42 return (
b - (m_mode << 1)) >> 3;
53 void update(
const void* __restrict in,
const uint64_t sz) {
54 alignas(32) uint64_t c[5], t[25];
55 for (uint64_t i{}; i < sz; i +=
block_size()) {
56 UNROLL(s[I] ^= ((
const uint64_t* __restrict)&((
char*)in)[i])[I],
block_size() >> 3);
57 for (uint64_t rnd{}; rnd <
nr; rnd++) {
58 UNROLL(c[I] = s[I] ^ s[I + 5] ^ s[I + 10] ^ s[I + 15] ^ s[I + 20], 5);
59 UNROLL(s[I] ^= (c[(I + 1) % 5] << 1 | c[(I + 1) % 5] >> 63) ^ c[(I + 4) % 5], 25);
61 UNROLL(s[I] = (~t[I / 5 * 5 + (I + 1) % 5] & t[I / 5 * 5 + (I + 2) % 5]) ^ t[I], 25);
75 void finalize(
void* __restrict out,
const void* __restrict in,
const uint64_t sz) {
82 memcpy(buff, &((
char*)in)[sz - resid], resid);
84 memcpy(out, s, m_mode >> 3);
85 memset(s, 0,
sizeof(s));
92 return finalize(std::forward<
decltype(args)>(args)...);
99template <std::
size_t m_mode>
SHA-3 hash main class.
Definition sha3.hpp:35
auto operator()(auto &&... args)
wrapper for calling a class as a functor
Definition sha3.hpp:91
void finalize(void *__restrict out, const void *__restrict in, const uint64_t sz)
complete the hash calculation with the remaining data
Definition sha3.hpp:75
static constexpr auto block_size()
calculate block size based on selected hash mode
Definition sha3.hpp:41
void update(const void *__restrict in, const uint64_t sz)
update the hash state with intermediate chunk
Definition sha3.hpp:53
Constants for SHA-3 hash functions.
constexpr uint8_t pi[]
pi substitution array
Definition constant.hh:33
constexpr uint64_t rc[]
round constants
Definition constant.hh:16
constexpr uint8_t rot[]
rotate (permutation) array
Definition constant.hh:27
constexpr uint64_t nr
number of transform rounds (= 24 from standard)
Definition constant.hh:35
constexpr uint64_t b
internal register (state) bitwidth
Definition constant.hh:36
void sha3(auto &&... args)
wrapper for calling a SHA-3 class as a function
Definition sha3.hpp:100
#define UNROLL(A, F)
macro for compile-time for unroll
Definition sha3.hpp:20