31static const uint32_t blake2s_IV[8] = { 0x6A09E667UL, 0xBB67AE85UL, 0x3C6EF372UL, 0xA54FF53AUL,
32 0x510E527FUL, 0x9B05688CUL, 0x1F83D9ABUL, 0x5BE0CD19UL };
34static const uint8_t blake2s_sigma[10][16] = {
35 { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 }, { 14, 10, 4, 8, 9, 15, 13, 6, 1, 12, 0, 2, 11, 7, 5, 3 },
36 { 11, 8, 12, 0, 5, 2, 15, 13, 10, 14, 3, 6, 7, 1, 9, 4 }, { 7, 9, 3, 1, 13, 12, 11, 14, 2, 6, 5, 10, 4, 0, 15, 8 },
37 { 9, 0, 5, 7, 2, 4, 10, 15, 14, 1, 11, 12, 6, 8, 3, 13 }, { 2, 12, 6, 10, 0, 11, 8, 3, 4, 13, 7, 5, 15, 14, 1, 9 },
38 { 12, 5, 1, 15, 14, 13, 4, 10, 0, 7, 6, 3, 9, 2, 8, 11 }, { 13, 11, 7, 14, 12, 1, 3, 9, 5, 0, 15, 4, 8, 6, 2, 10 },
39 { 6, 15, 14, 9, 11, 3, 0, 8, 12, 2, 13, 7, 1, 4, 10, 5 }, { 10, 2, 8, 4, 7, 6, 1, 5, 15, 11, 9, 14, 3, 12, 13, 0 },
44 S->f[1] = (uint32_t)-1;
56 blake2s_set_lastnode(S);
58 S->f[0] = (uint32_t)-1;
61static void blake2s_increment_counter(
blake2s_state* S,
const uint32_t inc)
64 S->t[1] += (S->t[0] < inc);
72 for (i = 0; i < 8; ++i)
73 S->h[i] = blake2s_IV[i];
79 const unsigned char* p = (
const unsigned char*)(P);
85 for (i = 0; i < 8; ++i)
86 S->
h[i] ^= load32(&p[i * 4]);
88 S->
outlen = P->digest_length;
101 P->digest_length = (uint8_t)outlen;
105 store32(&P->leaf_length, 0);
106 store32(&P->node_offset, 0);
107 store16(&P->xof_length, 0);
111 memset(P->salt, 0,
sizeof(P->salt));
112 memset(P->personal, 0,
sizeof(P->personal));
116#define G(r, i, a, b, c, d) \
118 a = a + b + m[blake2s_sigma[r][2 * i + 0]]; \
119 d = rotr32(d ^ a, 16); \
121 b = rotr32(b ^ c, 12); \
122 a = a + b + m[blake2s_sigma[r][2 * i + 1]]; \
123 d = rotr32(d ^ a, 8); \
125 b = rotr32(b ^ c, 7); \
130 G(r, 0, v[0], v[4], v[8], v[12]); \
131 G(r, 1, v[1], v[5], v[9], v[13]); \
132 G(r, 2, v[2], v[6], v[10], v[14]); \
133 G(r, 3, v[3], v[7], v[11], v[15]); \
134 G(r, 4, v[0], v[5], v[10], v[15]); \
135 G(r, 5, v[1], v[6], v[11], v[12]); \
136 G(r, 6, v[2], v[7], v[8], v[13]); \
137 G(r, 7, v[3], v[4], v[9], v[14]); \
146 for (i = 0; i < 16; ++i) {
147 m[i] = load32(in + i *
sizeof(m[i]));
150 for (i = 0; i < 8; ++i) {
154 v[8] = blake2s_IV[0];
155 v[9] = blake2s_IV[1];
156 v[10] = blake2s_IV[2];
157 v[11] = blake2s_IV[3];
158 v[12] = S->t[0] ^ blake2s_IV[4];
159 v[13] = S->t[1] ^ blake2s_IV[5];
160 v[14] = S->f[0] ^ blake2s_IV[6];
161 v[15] = S->f[1] ^ blake2s_IV[7];
174 for (i = 0; i < 8; ++i) {
175 S->h[i] = S->h[i] ^ v[i] ^ v[i + 8];
184 const unsigned char* in = (
const unsigned char*)pin;
190 memcpy(S->
buf + left, in, fill);
192 blake2s_compress(S, S->
buf);
197 blake2s_compress(S, in);
213 if (out == NULL || outlen < S->outlen)
216 if (blake2s_is_lastblock(S))
219 blake2s_increment_counter(S, (uint32_t)S->
buflen);
220 blake2s_set_lastblock(S);
222 blake2s_compress(S, S->
buf);
224 for (i = 0; i < 8; ++i)
225 store32(
buffer +
sizeof(S->
h[i]) * i, S->
h[i]);
227 memcpy(out,
buffer, outlen);
uint8_t buffer[RANDOM_BUFFER_SIZE]
int blake2s_update(blake2s_state *S, const void *pin, size_t inlen)
struct blake2s_param__ blake2s_param
int blake2s_init(blake2s_state *S, size_t outlen)
std::array< uint8_t, BLAKE2S_OUTBYTES > blake2s(std::vector< uint8_t > const &input)
int blake2s_init_param(blake2s_state *S, const blake2s_param *P)
struct bb::crypto::blake2s_state__ blake2s_state
int blake2s_final(blake2s_state *S, void *out, size_t outlen)
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
uint8_t buf[BLAKE2S_BLOCKBYTES]