mirror of
https://github.com/oxen-io/lokinet.git
synced 2024-11-17 15:25:35 +00:00
97 lines
2.8 KiB
C
97 lines
2.8 KiB
C
|
|
#include <stdint.h>
|
|
#include <string.h>
|
|
|
|
#include "blake2.h"
|
|
#include <sodium/private/common.h>
|
|
|
|
CRYPTO_ALIGN(64)
|
|
static const uint64_t blake2b_IV[8] = {
|
|
0x6a09e667f3bcc908ULL, 0xbb67ae8584caa73bULL, 0x3c6ef372fe94f82bULL,
|
|
0xa54ff53a5f1d36f1ULL, 0x510e527fade682d1ULL, 0x9b05688c2b3e6c1fULL,
|
|
0x1f83d9abfb41bd6bULL, 0x5be0cd19137e2179ULL};
|
|
|
|
static const uint8_t blake2b_sigma[12][16] = {
|
|
{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},
|
|
{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},
|
|
{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},
|
|
{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},
|
|
{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},
|
|
{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}};
|
|
|
|
int
|
|
blake2b_compress_ref(blake2b_state *S, const uint8_t block[BLAKE2B_BLOCKBYTES])
|
|
{
|
|
uint64_t m[16];
|
|
uint64_t v[16];
|
|
int i;
|
|
|
|
for(i = 0; i < 16; ++i)
|
|
{
|
|
m[i] = LOAD64_LE(block + i * sizeof(m[i]));
|
|
}
|
|
for(i = 0; i < 8; ++i)
|
|
{
|
|
v[i] = S->h[i];
|
|
}
|
|
v[8] = blake2b_IV[0];
|
|
v[9] = blake2b_IV[1];
|
|
v[10] = blake2b_IV[2];
|
|
v[11] = blake2b_IV[3];
|
|
v[12] = S->t[0] ^ blake2b_IV[4];
|
|
v[13] = S->t[1] ^ blake2b_IV[5];
|
|
v[14] = S->f[0] ^ blake2b_IV[6];
|
|
v[15] = S->f[1] ^ blake2b_IV[7];
|
|
#define G(r, i, a, b, c, d) \
|
|
do \
|
|
{ \
|
|
a = a + b + m[blake2b_sigma[r][2 * i + 0]]; \
|
|
d = ROTR64(d ^ a, 32); \
|
|
c = c + d; \
|
|
b = ROTR64(b ^ c, 24); \
|
|
a = a + b + m[blake2b_sigma[r][2 * i + 1]]; \
|
|
d = ROTR64(d ^ a, 16); \
|
|
c = c + d; \
|
|
b = ROTR64(b ^ c, 63); \
|
|
} while(0)
|
|
#define ROUND(r) \
|
|
do \
|
|
{ \
|
|
G(r, 0, v[0], v[4], v[8], v[12]); \
|
|
G(r, 1, v[1], v[5], v[9], v[13]); \
|
|
G(r, 2, v[2], v[6], v[10], v[14]); \
|
|
G(r, 3, v[3], v[7], v[11], v[15]); \
|
|
G(r, 4, v[0], v[5], v[10], v[15]); \
|
|
G(r, 5, v[1], v[6], v[11], v[12]); \
|
|
G(r, 6, v[2], v[7], v[8], v[13]); \
|
|
G(r, 7, v[3], v[4], v[9], v[14]); \
|
|
} while(0)
|
|
ROUND(0);
|
|
ROUND(1);
|
|
ROUND(2);
|
|
ROUND(3);
|
|
ROUND(4);
|
|
ROUND(5);
|
|
ROUND(6);
|
|
ROUND(7);
|
|
ROUND(8);
|
|
ROUND(9);
|
|
ROUND(10);
|
|
ROUND(11);
|
|
|
|
for(i = 0; i < 8; ++i)
|
|
{
|
|
S->h[i] = S->h[i] ^ v[i] ^ v[i + 8];
|
|
}
|
|
|
|
#undef G
|
|
#undef ROUND
|
|
return 0;
|
|
}
|