5#ifndef DIGESTPP_PROVIDERS_GROESTL_HPP
6#define DIGESTPP_PROVIDERS_GROESTL_HPP
20namespace groestl_functions
23 static inline void roundP(uint64_t* x, uint64_t* y, uint64_t i)
25 for (
int idx = 0; idx < R; idx++)
26 x[idx] ^= (
static_cast<uint64_t
>(idx) << 4) ^ i;
28 for (
int c = R - 1; c >= 0; c--)
40 static inline void roundQ(uint64_t* x, uint64_t* y, uint64_t i)
42 for (
int idx = 0; idx < R; idx++)
43 x[idx] ^= (0xffffffffffffffffull - (
static_cast<uint64_t
>(idx) << 60)) ^ i;
45 for (
int c = R - 1; c >= 0; c--)
57 static inline void transform(uint64_t* h,
const uint64_t* m)
59 uint64_t AQ1[R], AQ2[R], AP1[R], AP2[R];
61 for (
int column = 0; column < R; column++)
63 AP1[column] = h[column] ^ m[column];
64 AQ1[column] = m[column];
67 for (uint64_t r = 0; r < (R == 16 ? 14 : 10); r += 2)
75 for (
int column = 0; column < R; column++)
77 h[column] = AP1[column] ^ AQ1[column] ^ h[column];
87 for (
int column = 0; column < R; column++) {
88 t1[column] = h[column];
91 for (uint64_t r = 0; r < (R == 16 ? 14 : 10); r += 2) {
96 for (
int column = 0; column < R; column++) {
97 h[column] ^= t1[column];
103template<
size_t HS = 0>
109 template<size_t hss=HS, typename std::enable_if<hss == 0>::type* =
nullptr>
116 template<size_t hss=HS, typename std::enable_if<hss != 0>::type* =
nullptr>
120 static_assert(hss <= 512 && hss > 0 && hss % 8 == 0);
132 memset(&h[0], 0,
sizeof(uint64_t)*16);
133 uint64_t hss =
static_cast<uint64_t
>(
hash_size());
134 h[hss > 256 ? 15 : 7] =
byteswap(hss);
137 inline void update(
const unsigned char* data,
size_t len)
140 [
this](
const unsigned char* data,
size_t len) { transform(data, len); });
143 inline void final(
unsigned char*
hash)
147 size_t limit = block_bytes();
151 memset(&m[pos], 0, limit - pos);
152 transform(m.data(), 1);
153 total += (block_bytes() - pos) * 8;
156 memset(&m[pos], 0, limit - 8 - pos);
157 total += (block_bytes() - pos) * 8;
158 uint64_t mlen =
byteswap(total / 8 / block_bytes());
159 memcpy(&m[limit - 8], &mlen, 64 / 8);
160 transform(m.data(), 1);
163 const unsigned char* s =
reinterpret_cast<const unsigned char*
>(h.data());
164 for (
size_t i = limit -
hash_size() / 8, j = 0; i < limit; i++, j++) {
178 inline size_t block_bytes()
const {
return hs > 256 ? 128 : 64; }
180 inline void outputTransform()
188 inline void transform(
const unsigned char* mp,
size_t num_blks)
190 for (
size_t blk = 0; blk < num_blks; blk++)
199 std::array<uint64_t, 16> h;
200 std::array<unsigned char, 128> m;
Definition groestl_provider.hpp:105
size_t hash_size() const
Definition groestl_provider.hpp:175
groestl_provider(size_t hashsize)
Definition groestl_provider.hpp:110
void clear()
Definition groestl_provider.hpp:169
void update(const unsigned char *data, size_t len)
Definition groestl_provider.hpp:137
~groestl_provider()
Definition groestl_provider.hpp:123
void init()
Definition groestl_provider.hpp:128
groestl_provider()
Definition groestl_provider.hpp:117
static void roundP(uint64_t *x, uint64_t *y, uint64_t i)
Definition groestl_provider.hpp:23
static void roundQ(uint64_t *x, uint64_t *y, uint64_t i)
Definition groestl_provider.hpp:40
static void transform(uint64_t *h, const uint64_t *m)
Definition groestl_provider.hpp:57
static void outputTransform(uint64_t *h)
Definition groestl_provider.hpp:82
uint16_t byteswap(uint16_t val)
Definition functions.hpp:16
void validate_hash_size(size_t hs, std::initializer_list< size_t > set)
Definition validate_hash_size.hpp:14
void zero_memory(void *v, size_t n)
Definition functions.hpp:85
void absorb_bytes(const unsigned char *data, size_t len, size_t bs, size_t bschk, unsigned char *m, size_t &pos, T &total, TF transform)
Definition absorb_data.hpp:16
digestpp namespace
Definition ascon.hpp:14
Definition groestl_constants.hpp:16