5#ifndef DIGESTPP_PROVIDERS_BLAKE2P_HPP
6#define DIGESTPP_PROVIDERS_BLAKE2P_HPP
21template<
typename T, blake2_type type,
size_t HS = 0>
27 template<size_t hss=HS, typename std::enable_if<hss == 0>::type* =
nullptr>
29 : main(hashsize), hs(hashsize), squeezing(false)
31 static_assert(
sizeof(T) == 8 ||
sizeof(T) == 4,
"Invalid T size");
38 main.set_blake2p_params(P, 1, 0);
40 for (
size_t p = 0; p < P; p++)
43 leaf[p].set_blake2p_params(
static_cast<uint8_t
>(P), 0,
static_cast<uint8_t
>(p));
47 template<size_t hss=HS, typename std::enable_if<hss != 0>::type* =
nullptr>
49 : main(), hs(hss), squeezing(false)
51 static_assert(
sizeof(T) == 8 ||
sizeof(T) == 4,
"Invalid T size");
54 static_assert(hss <= limit && hss > 0 && hss % 8 == 0);
56 main.set_blake2p_params(P, 1, 0);
58 for (
size_t p = 0; p < P; p++)
60 leaf[p].set_blake2p_params(
static_cast<uint8_t
>(P), 0,
static_cast<uint8_t
>(p));
76 for (
size_t p = 0; p < P; p++)
82 inline void update(
const unsigned char* data,
size_t len)
85 [
this](
const unsigned char* data,
size_t len) { transform(data, len); });
88 inline void set_key(
const std::string& key)
91 for (
size_t p = 0; p < P; p++)
95 inline void set_salt(
const unsigned char* salt,
size_t salt_len)
97 main.set_salt(salt, salt_len);
98 for (
size_t p = 0; p < P; p++)
104 main.set_personalization(personalization, personalization_len);
105 for (
size_t p = 0; p < P; p++)
111 size_t processed = 0;
117 main.squeeze(
hash, hs);
120 inline void final(
unsigned char*
hash)
136 for (
size_t p = 0; p < P; p++)
144 inline void finalize()
147 memset(&m[pos], 0, 512 - pos);
148 for (
size_t i = 0; i < P; i++)
150 if (pos > i *
sizeof(T) * 16)
152 size_t prev = i *
sizeof(T) * 16;
153 size_t next = prev +
sizeof(T) * 16;
154 size_t len = pos < next ? pos - prev :
sizeof(T) * 16;
155 leaf[i].update(&m[i *
sizeof(T) * 16], len);
158 leaf[i].final(buf, N);
159 main.update(buf,
sizeof(buf));
163 inline void transform(
const unsigned char* data,
size_t num_blks)
166#pragma omp parallel for
168 for (
int i = 0; i < static_cast<int>(P); i++)
170 for (
size_t blk = 0; blk < num_blks; blk++)
172 leaf[i].update(data + blk * 512 + i * 16 *
sizeof(T),
sizeof(T) * 16);
177 constexpr static size_t N =
sizeof(T) == 8 ? 512 : 256;
178 constexpr static size_t P =
sizeof(T) == 8 ? 4 : 8;
179 blake2_provider<T, type, HS> main;
180 std::array<blake2_provider<T, type, HS>, P> leaf;
181 std::array<unsigned char, 512> m;
Definition blake2_provider.hpp:116
Definition blake2p_provider.hpp:23
void set_salt(const unsigned char *salt, size_t salt_len)
Definition blake2p_provider.hpp:95
void init()
Definition blake2p_provider.hpp:69
void set_personalization(const unsigned char *personalization, size_t personalization_len)
Definition blake2p_provider.hpp:102
blake2p_provider()
Definition blake2p_provider.hpp:48
~blake2p_provider()
Definition blake2p_provider.hpp:64
size_t hash_size() const
Definition blake2p_provider.hpp:140
blake2p_provider(size_t hashsize=N)
Definition blake2p_provider.hpp:28
void clear()
Definition blake2p_provider.hpp:132
void set_key(const std::string &key)
Definition blake2p_provider.hpp:88
void update(const unsigned char *data, size_t len)
Definition blake2p_provider.hpp:82
void squeeze(unsigned char *hash, size_t hs)
Definition blake2p_provider.hpp:109
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