29 0x6A09E667UL, 0xBB67AE85UL, 0x3C6EF372UL, 0xA54FF53AUL,
30 0x510E527FUL, 0x9B05688CUL, 0x1F83D9ABUL, 0x5BE0CD19UL
34 {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15},
35 {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},
37 {7, 9, 3, 1, 13, 12, 11, 14, 2, 6, 5, 10, 4, 0, 15, 8},
38 {9, 0, 5, 7, 2, 4, 10, 15, 14, 1, 11, 12, 6, 8, 3, 13},
39 {2, 12, 6, 10, 0, 11, 8, 3, 4, 13, 7, 5, 15, 14, 1, 9},
40 {12, 5, 1, 15, 14, 13, 4, 10, 0, 7, 6, 3, 9, 2, 8, 11},
41 {13, 11, 7, 14, 12, 1, 3, 9, 5, 0, 15, 4, 8, 6, 2, 10},
42 {6, 15, 14, 9, 11, 3, 0, 8, 12, 2, 13, 7, 1, 4, 10, 5},
43 {10, 2, 8, 4, 7, 6, 1, 5, 15, 11, 9, 14, 3, 12, 13, 0},
49 S->
f[1] = (uint32_t) - 1;
65 S->
f[0] = (uint32_t) - 1;
72 S->
t[1] += (S->
t[0] < inc);
81 for (i = 0; i < 8; ++
i)
89 const unsigned char *p = (
const unsigned char *) (P);
95 for (i = 0; i < 8; ++
i)
98 S->
outlen = P->digest_length;
113 P->digest_length = (uint8_t) outlen;
123 memset (P->salt, 0, sizeof (P->salt));
124 memset (P->personal, 0, sizeof (P->personal));
140 P->digest_length = (uint8_t) outlen;
141 P->key_length = (uint8_t) keylen;
150 memset (P->salt, 0, sizeof (P->salt));
151 memset (P->personal, 0, sizeof (P->personal));
159 memcpy (block, key, keylen);
166 #define G(r,i,a,b,c,d) \ 168 a = a + b + m[blake2s_sigma[r][2*i+0]]; \ 169 d = rotr32(d ^ a, 16); \ 171 b = rotr32(b ^ c, 12); \ 172 a = a + b + m[blake2s_sigma[r][2*i+1]]; \ 173 d = rotr32(d ^ a, 8); \ 175 b = rotr32(b ^ c, 7); \ 180 G(r,0,v[ 0],v[ 4],v[ 8],v[12]); \ 181 G(r,1,v[ 1],v[ 5],v[ 9],v[13]); \ 182 G(r,2,v[ 2],v[ 6],v[10],v[14]); \ 183 G(r,3,v[ 3],v[ 7],v[11],v[15]); \ 184 G(r,4,v[ 0],v[ 5],v[10],v[15]); \ 185 G(r,5,v[ 1],v[ 6],v[11],v[12]); \ 186 G(r,6,v[ 2],v[ 7],v[ 8],v[13]); \ 187 G(r,7,v[ 3],v[ 4],v[ 9],v[14]); \ 197 for (i = 0; i < 16; ++
i)
199 m[
i] =
load32 (in + i *
sizeof (m[i]));
202 for (i = 0; i < 8; ++
i)
227 for (i = 0; i < 8; ++
i)
229 S->
h[
i] = S->
h[
i] ^ v[
i] ^ v[i + 8];
239 const unsigned char *in = (
const unsigned char *) pin;
247 memcpy (S->
buf + left, in, fill);
272 if (out == NULL || outlen < S->outlen)
283 for (i = 0; i < 8; ++
i)
284 store32 (buffer +
sizeof (S->
h[i]) * i, S->
h[i]);
286 memcpy (out, buffer, outlen);
292 blake2s (
void *out,
size_t outlen,
const void *in,
size_t inlen,
293 const void *
key,
size_t keylen)
298 if (NULL == in && inlen > 0)
304 if (NULL == key && keylen > 0)
static void blake2s_increment_counter(blake2s_state_t *S, const uint32_t inc)
static int blake2s_is_lastblock(const blake2s_state_t *S)
Optimized string handling code, including c11-compliant "safe C library" variants.
struct blake2s_param blake2s_param_t
static void blake2s_init0(blake2s_state_t *S)
static void blake2s_compress(blake2s_state_t *S, const uint8_t in[BLAKE2S_BLOCK_BYTES])
static const uint32_t blake2s_IV[8]
int blake2s_init_key(blake2s_state_t *S, size_t outlen, const void *key, size_t keylen)
static const uint8_t blake2s_sigma[10][16]
static BLAKE2_INLINE void store32(void *dst, uint32_t w)
static BLAKE2_INLINE uint32_t load32(const void *src)
static BLAKE2_INLINE void store16(void *dst, uint16_t w)
sll srl srl sll sra u16x4 i
static void blake2s_set_lastnode(blake2s_state_t *S)
int blake2s_init_param(blake2s_state_t *S, const blake2s_param_t *P)
static void blake2s_set_lastblock(blake2s_state_t *S)
int blake2s_final(blake2s_state_t *S, void *out, size_t outlen)
int blake2s(void *out, size_t outlen, const void *in, size_t inlen, const void *key, size_t keylen)
int blake2s_update(blake2s_state_t *S, const void *pin, size_t inlen)
int blake2s_init(blake2s_state_t *S, size_t outlen)
uint8_t buf[BLAKE2S_BLOCK_BYTES]
static BLAKE2_INLINE void secure_zero_memory(void *v, size_t n)