5#ifndef DIGESTPP_PROVIDERS_SKEIN_HPP
6#define DIGESTPP_PROVIDERS_SKEIN_HPP
28 template<
size_t r>
static inline void GTv4(uint64_t* G)
39 static inline void KStRv4(uint64_t* G, uint64_t* keys, uint64_t* tweaks)
41 G[0] += keys[(r + 0 + 1) % 5];
42 G[1] += keys[(r + 1 + 1) % 5] + tweaks[(r + 1) % 3];
43 G[2] += keys[(r + 2 + 1) % 5] + tweaks[(r + 2) % 3];
44 G[3] += keys[(r + 3 + 1) % 5] + r + 1;
48 static inline void G8(uint64_t* G, uint64_t* keys, uint64_t* tweaks)
54 KStRv4<r>(G, keys, tweaks);
59 KStRv4<r + 1>(G, keys, tweaks);
66 template<
size_t r>
static inline void GTv4(uint64_t* G)
83 static inline void KStRv4(uint64_t* G, uint64_t* keys, uint64_t* tweaks)
85 G[0] += keys[(r + 0 + 1) % 9];
86 G[1] += keys[(r + 1 + 1) % 9];
87 G[2] += keys[(r + 2 + 1) % 9];
88 G[3] += keys[(r + 3 + 1) % 9];
89 G[4] += keys[(r + 4 + 1) % 9];
90 G[5] += keys[(r + 5 + 1) % 9] + tweaks[(r + 1) % 3];
91 G[6] += keys[(r + 6 + 1) % 9] + tweaks[(r + 2) % 3];
92 G[7] += keys[(r + 7 + 1) % 9] + r + 1;
96 static inline void G8(uint64_t* G, uint64_t* keys, uint64_t* tweaks)
102 KStRv4<r>(G, keys, tweaks);
107 KStRv4<r + 1>(G, keys, tweaks);
115 template<
size_t r>
static inline void GTv4(uint64_t* G)
144 static inline void KStRv4(uint64_t* G, uint64_t* keys, uint64_t* tweaks)
146 G[0] += keys[(r + 0 + 1) % 17];
147 G[1] += keys[(r + 1 + 1) % 17];
148 G[2] += keys[(r + 2 + 1) % 17];
149 G[3] += keys[(r + 3 + 1) % 17];
150 G[4] += keys[(r + 4 + 1) % 17];
151 G[5] += keys[(r + 5 + 1) % 17];
152 G[6] += keys[(r + 6 + 1) % 17];
153 G[7] += keys[(r + 7 + 1) % 17];
154 G[8] += keys[(r + 8 + 1) % 17];
155 G[9] += keys[(r + 9 + 1) % 17];
156 G[10] += keys[(r + 10 + 1) % 17];
157 G[11] += keys[(r + 11 + 1) % 17];
158 G[12] += keys[(r + 12 + 1) % 17];
159 G[13] += keys[(r + 13 + 1) % 17] + tweaks[(r + 1) % 3];
160 G[14] += keys[(r + 14 + 1) % 17] + tweaks[(r + 2) % 3];
161 G[15] += keys[(r + 15 + 1) % 17] + r + 1;
165 static inline void G8(uint64_t* G, uint64_t* keys, uint64_t* tweaks)
171 KStRv4<r>(G, keys, tweaks);
176 KStRv4<r + 1>(G, keys, tweaks);
180template<
size_t N,
bool XOF,
size_t HS = 0>
186 template<size_t hss=HS, typename std::enable_if<hss == 0>::type* =
nullptr>
193 template<size_t hss=HS, typename std::enable_if<hss != 0>::type* =
nullptr>
197 static_assert(hss > 0 && hss % 8 == 0);
227 inject_parameter(k, 0ULL);
228 tweak[1] = (1ULL << 62) | (4ULL << 56) | (1ULL << 63);
235 uint64_t size64 = XOF ?
static_cast<uint64_t
>(-1) : hs;
236 memcpy(&m[8], &size64, 8);
237 transform(m.data(), 1, 32);
241 tweak[1] = (1ULL << 62) | (48ULL << 56);
242 inject_parameter(p, 8ULL);
243 inject_parameter(n, 20ULL);
247 inline void update(
const unsigned char* data,
size_t len)
250 [
this](
const unsigned char* data,
size_t len) { transform(data, len, N / 8); });
255 size_t processed = 0;
259 tweak[1] |= 1ull << 63;
261 memset(&m[pos], 0, N / 8 - pos);
263 transform(m.data(), 1, pos);
264 memset(&m[0], 0, N / 8);
265 memcpy(&hbk[0], H.data(), N / 8);
269 else if (pos < N / 8)
271 size_t to_copy = std::min(hs, N / 8 - pos);
272 memcpy(
hash,
reinterpret_cast<unsigned char*
>(H.data()) + pos, to_copy);
273 processed += to_copy;
276 while (processed < hs)
278 pos = std::min(hs - processed, N / 8);
280 tweak[1] = 255ULL << 56;
281 memcpy(&m[0], &total, 8);
282 memcpy(&H[0], hbk.data(), N / 8);
283 transform(m.data(), 1, 8);
284 memcpy(
hash + processed, H.data(), pos);
290 inline void final(
unsigned char*
hash)
315 inline void transform(
const unsigned char* mp, uint64_t num_blks,
size_t reallen)
317 uint64_t keys[N / 64 + 1];
320 for (uint64_t b = 0; b < num_blks; b++)
324 for (uint64_t i = 0; i < N / 64; i++)
326 M[i] = (
reinterpret_cast<const uint64_t*
>(mp)[b * N / 64 + i]);
328 memcpy(keys, H.data(),
sizeof(uint64_t) * N / 64);
329 memcpy(tweaks, tweak.data(),
sizeof(uint64_t) * 2);
330 tweaks[0] += reallen;
331 tweaks[2] = tweaks[0] ^ tweaks[1];
332 keys[N / 64] = 0x1BD11BDAA9FC1A22ULL;
333 for (
int i = 0; i < N / 64; i++)
335 keys[N / 64] ^= keys[i];
336 G[i] = M[i] + keys[i];
338 G[N / 64 - 3] += tweaks[0];
339 G[N / 64 - 2] += tweaks[1];
341 skein_functions<N / 64>::template G8<0>(G, keys, tweaks);
342 skein_functions<N / 64>::template G8<2>(G, keys, tweaks);
343 skein_functions<N / 64>::template G8<4>(G, keys, tweaks);
344 skein_functions<N / 64>::template G8<6>(G, keys, tweaks);
345 skein_functions<N / 64>::template G8<8>(G, keys, tweaks);
346 skein_functions<N / 64>::template G8<10>(G, keys, tweaks);
347 skein_functions<N / 64>::template G8<12>(G, keys, tweaks);
348 skein_functions<N / 64>::template G8<14>(G, keys, tweaks);
349 skein_functions<N / 64>::template G8<16>(G, keys, tweaks);
351 skein_functions<N / 64>::template G8<18>(G, keys, tweaks);
353 tweaks[1] &= ~(64ULL << 56);
354 tweak[0] = tweaks[0];
355 tweak[1] = tweaks[1];
357 for (
int i = 0; i < N / 64; i++)
362 inline void inject_parameter(
const std::string& p, uint64_t code)
367 tweak[1] = (1ULL << 62) | (code << 56);
368 update(
reinterpret_cast<const unsigned char*
>(p.data()), p.length());
369 tweak[1] |= 1ull << 63;
371 memset(&m[pos], 0, N / 8 - pos);
372 transform(m.data(), 1, pos);
377 tweak[1] = (1ULL << 62) | (48ULL << 56);
380 std::array<uint64_t, N / 64> H, hbk;
381 std::array<
unsigned char, N / 8> m;
384 std::array<uint64_t, 2> tweak;
Definition skein_provider.hpp:182
void update(const unsigned char *data, size_t len)
Definition skein_provider.hpp:247
void squeeze(unsigned char *hash, size_t hs)
Definition skein_provider.hpp:253
skein_provider(size_t hashsize=N)
Definition skein_provider.hpp:187
void set_key(const std::string &key)
Definition skein_provider.hpp:215
size_t hash_size() const
Definition skein_provider.hpp:295
void clear()
Definition skein_provider.hpp:300
void set_nonce(const std::string &nonce)
Definition skein_provider.hpp:210
void set_personalization(const std::string &personalization)
Definition skein_provider.hpp:205
void init()
Definition skein_provider.hpp:220
~skein_provider()
Definition skein_provider.hpp:200
void validate_hash_size(size_t hs, std::initializer_list< size_t > set)
Definition validate_hash_size.hpp:14
uint32_t rotate_left(uint32_t x, unsigned n)
Definition functions.hpp:67
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 skein_constants.hpp:16
static void GTv4(uint64_t *G)
Definition skein_provider.hpp:115
static void KStRv4(uint64_t *G, uint64_t *keys, uint64_t *tweaks)
Definition skein_provider.hpp:144
static void G8(uint64_t *G, uint64_t *keys, uint64_t *tweaks)
Definition skein_provider.hpp:165
static void GTv4(uint64_t *G)
Definition skein_provider.hpp:28
static void G8(uint64_t *G, uint64_t *keys, uint64_t *tweaks)
Definition skein_provider.hpp:48
static void KStRv4(uint64_t *G, uint64_t *keys, uint64_t *tweaks)
Definition skein_provider.hpp:39
static void GTv4(uint64_t *G)
Definition skein_provider.hpp:66
static void G8(uint64_t *G, uint64_t *keys, uint64_t *tweaks)
Definition skein_provider.hpp:96
static void KStRv4(uint64_t *G, uint64_t *keys, uint64_t *tweaks)
Definition skein_provider.hpp:83
Definition skein_provider.hpp:22