5#ifndef DIGESTPP_PROVIDERS_KUPYNA_HPP
6#define DIGESTPP_PROVIDERS_KUPYNA_HPP
20namespace kupyna_functions
23 static inline void G(uint64_t* x, uint64_t* y)
25 for (
int c = 0; c != R; ++c)
37 static inline void roundP(uint64_t* x, uint64_t* y, uint64_t i)
39 for (
int idx = 0; idx < R; idx++)
40 x[idx] ^= (
static_cast<uint64_t
>(idx) << 4) ^ i;
46 static inline void roundQ(uint64_t* x, uint64_t* y, uint64_t i)
48 for (
int j = 0; j < R; ++j)
49 x[j] += (0x00F0F0F0F0F0F0F3ULL
50 ^ ((
static_cast<uint64_t
>(((R - 1 - j) * 0x10) ^
static_cast<unsigned char>(i))) << 56));
56 static inline void transform(uint64_t* h,
const uint64_t* m)
58 uint64_t AQ1[R], AQ2[R], AP1[R], AP2[R];
60 for (
int column = 0; column < R; column++)
62 AP1[column] = h[column] ^ m[column];
63 AQ1[column] = m[column];
66 for (uint64_t r = 0; r < (R == 16 ? 14 : 10); r += 2)
74 for (
int column = 0; column < R; column++)
76 h[column] = AP1[column] ^ AQ1[column] ^ h[column];
86 for (
int column = 0; column < R; column++) {
87 t1[column] = h[column];
90 for (uint64_t r = 0; r < (R == 16 ? 14 : 10); r += 2) {
95 for (
int column = 0; column < R; column++) {
96 h[column] ^= t1[column];
102template<
size_t HS = 0>
108 template<size_t hss=HS, typename std::enable_if<hss == 0>::type* =
nullptr>
115 template<size_t hss=HS, typename std::enable_if<hss != 0>::type* =
nullptr>
119 static_assert(hss == 256 || hss == 512);
131 memset(&h[0], 0,
sizeof(uint64_t)*16);
132 h[0] = block_bytes();
135 inline void update(
const unsigned char* data,
size_t len)
138 [
this](
const unsigned char* data,
size_t len) { transform(data, len); });
141 inline void final(
unsigned char*
hash)
145 size_t limit = block_bytes();
146 if (pos > limit - 12)
149 memset(&m[pos], 0, limit - pos);
150 transform(m.data(), 1);
153 memset(&m[pos], 0, limit - pos);
154 memcpy(&m[limit - 12], &total,
sizeof(uint64_t));
155 memset(&m[limit - 4], 0, 4);
157 transform(m.data(), 1);
160 memcpy(
hash,
reinterpret_cast<const unsigned char*
>(h.data()) + limit -
hash_size() / 8,
hash_size() / 8);
172 inline size_t block_bytes()
const {
return hs > 256 ? 128 : 64; }
174 inline void outputTransform()
182 inline void transform(
const unsigned char* mp,
size_t num_blks)
184 for (
size_t blk = 0; blk < num_blks; blk++)
193 std::array<uint64_t, 16> h;
194 std::array<unsigned char, 128> m;
Definition kupyna_provider.hpp:104
kupyna_provider()
Definition kupyna_provider.hpp:116
size_t hash_size() const
Definition kupyna_provider.hpp:169
~kupyna_provider()
Definition kupyna_provider.hpp:122
void clear()
Definition kupyna_provider.hpp:163
void update(const unsigned char *data, size_t len)
Definition kupyna_provider.hpp:135
void init()
Definition kupyna_provider.hpp:127
kupyna_provider(size_t hashsize)
Definition kupyna_provider.hpp:109
static void G(uint64_t *x, uint64_t *y)
Definition kupyna_provider.hpp:23
static void roundQ(uint64_t *x, uint64_t *y, uint64_t i)
Definition kupyna_provider.hpp:46
static void transform(uint64_t *h, const uint64_t *m)
Definition kupyna_provider.hpp:56
static void outputTransform(uint64_t *h)
Definition kupyna_provider.hpp:81
static void roundP(uint64_t *x, uint64_t *y, uint64_t i)
Definition kupyna_provider.hpp:37
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 kupyna_constants.hpp:16