5#ifndef DIGESTPP_PROVIDERS_JH_HPP
6#define DIGESTPP_PROVIDERS_JH_HPP
22 static inline void bitswap(uint64_t& x, uint64_t mask,
int shift)
24 x = ((x & mask) << shift) | ((x & ~mask) >> shift);
27 static inline void bitswap(std::array<uint64_t, 16>& H, uint64_t mask,
int shift)
39 static inline void Sbitsli(uint64_t& x0a, uint64_t& x0b, uint64_t& x1a, uint64_t& x1b, uint64_t& x2a, uint64_t& x2b,
40 uint64_t& x3a, uint64_t& x3b, uint64_t ca, uint64_t cb)
46 uint64_t ta = ca ^ (x0a & x1a);
47 uint64_t tb = cb ^ (x0b & x1b);
66 static inline void Lbitsli(std::array<uint64_t, 16>& H)
72 H[10] ^= H[12] ^ H[0];
73 H[11] ^= H[13] ^ H[1];
86 static inline void round(std::array<uint64_t, 16>& H,
int r, uint64_t mask,
int shift)
98template<
size_t HS = 0>
104 template<size_t hss=HS, typename std::enable_if<hss == 0>::type* =
nullptr>
111 template<size_t hss=HS, typename std::enable_if<hss != 0>::type* =
nullptr>
115 static_assert(hss <= 512 && hss > 0 && hss % 8 == 0);
129 H[0] =
byteswap(
static_cast<uint16_t
>(hs));
131 unsigned char msg[64];
132 memset(msg, 0,
sizeof(msg));
136 inline void update(
const unsigned char* data,
size_t len)
139 [
this](
const unsigned char* data,
size_t len) { transform(data, len); });
142 inline void final(
unsigned char*
hash)
149 memset(&m[pos], 0, 64 - pos);
153 memset(&m[0] + pos, 0, 56 - pos);
155 memcpy(&m[0] + (64 - 8), &mlen, 64 / 8);
170 inline void transform(
const unsigned char* mp,
size_t num_blks)
172 for (uint64_t blk = 0; blk < num_blks; blk++)
174 const uint64_t* M = (
const uint64_t*)(((
const unsigned char*)mp) + blk * 64);
185 for (
int r = 0; r < 42; r += 7)
195 std::swap(H[2], H[3]);
196 std::swap(H[6], H[7]);
197 std::swap(H[10], H[11]);
198 std::swap(H[14], H[15]);
212 std::array<uint64_t, 16> H;
213 std::array<unsigned char, 64> m;
Definition jh_provider.hpp:100
size_t hash_size() const
Definition jh_provider.hpp:167
void init()
Definition jh_provider.hpp:123
void clear()
Definition jh_provider.hpp:161
jh_provider()
Definition jh_provider.hpp:112
jh_provider(size_t hashsize=512)
Definition jh_provider.hpp:105
void update(const unsigned char *data, size_t len)
Definition jh_provider.hpp:136
~jh_provider()
Definition jh_provider.hpp:118
static void bitswap(uint64_t &x, uint64_t mask, int shift)
Definition jh_provider.hpp:22
static void Lbitsli(std::array< uint64_t, 16 > &H)
Definition jh_provider.hpp:66
static void round(std::array< uint64_t, 16 > &H, int r, uint64_t mask, int shift)
Definition jh_provider.hpp:86
static void Sbitsli(uint64_t &x0a, uint64_t &x0b, uint64_t &x1a, uint64_t &x1b, uint64_t &x2a, uint64_t &x2b, uint64_t &x3a, uint64_t &x3b, uint64_t ca, uint64_t cb)
Definition jh_provider.hpp:39
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 jh_constants.hpp:16