43 static inline void be32enc(
void *pp, uint32_t x)
45 uint8_t *p = (uint8_t *)pp;
47 p[2] = (x >> 8) & 0xff;
48 p[1] = (x >> 16) & 0xff;
49 p[0] = (x >> 24) & 0xff;
60 PBKDF2_SHA256(
const uint8_t *passwd,
size_t passwdlen,
const uint8_t *salt,
61 size_t saltlen, uint64_t c, uint8_t *buf,
size_t dkLen)
75 for (i = 0; i * 32 < dkLen; i++) {
77 be32enc(ivec, (uint32_t)(i + 1));
85 for (j = 2; j <= c; j++) {
90 for (k = 0; k < 32; k++)
95 clen = dkLen - i * 32;
103 static inline uint32_t
104 le32dec_2(
const void * pp)
106 const uint8_t * p = (uint8_t
const *)pp;
108 return ((uint32_t)(p[0]) + ((uint32_t)(p[1]) << 8) +
109 ((uint32_t)(p[2]) << 16) + ((uint32_t)(p[3]) << 24));
113 le32enc_2(
void * pp, uint32_t x)
115 uint8_t * p = (uint8_t *)pp;
118 p[1] = (x >> 8) & 0xff;
119 p[2] = (x >> 16) & 0xff;
120 p[3] = (x >> 24) & 0xff;
124 blkcpy(
void * dest,
const void * src,
size_t len)
126 size_t * D = (
size_t*)dest;
127 const size_t *
S = (
size_t*)src;
128 size_t L = len /
sizeof(size_t);
131 for (i = 0; i <
L; i++)
136 blkxor(
void * dest,
const void * src,
size_t len)
138 size_t * D = (
size_t*)dest;
139 const size_t*
S = (
size_t*)src;
140 size_t L = len /
sizeof(size_t);
143 for (i = 0; i <
L; i++)
152 salsa20_8(uint32_t
B[16])
158 for (i = 0; i < 8; i += 2) {
159 #define R(a,b) (((a) << (b)) | ((a) >> (32 - (b))))
161 x[ 4] ^=
R(x[ 0]+x[12], 7); x[ 8] ^=
R(x[ 4]+x[ 0], 9);
162 x[12] ^=
R(x[ 8]+x[ 4],13); x[ 0] ^=
R(x[12]+x[ 8],18);
164 x[ 9] ^=
R(x[ 5]+x[ 1], 7); x[13] ^=
R(x[ 9]+x[ 5], 9);
165 x[ 1] ^=
R(x[13]+x[ 9],13); x[ 5] ^=
R(x[ 1]+x[13],18);
167 x[14] ^=
R(x[10]+x[ 6], 7); x[ 2] ^=
R(x[14]+x[10], 9);
168 x[ 6] ^=
R(x[ 2]+x[14],13); x[10] ^=
R(x[ 6]+x[ 2],18);
170 x[ 3] ^=
R(x[15]+x[11], 7); x[ 7] ^=
R(x[ 3]+x[15], 9);
171 x[11] ^=
R(x[ 7]+x[ 3],13); x[15] ^=
R(x[11]+x[ 7],18);
174 x[ 1] ^=
R(x[ 0]+x[ 3], 7); x[ 2] ^=
R(x[ 1]+x[ 0], 9);
175 x[ 3] ^=
R(x[ 2]+x[ 1],13); x[ 0] ^=
R(x[ 3]+x[ 2],18);
177 x[ 6] ^=
R(x[ 5]+x[ 4], 7); x[ 7] ^=
R(x[ 6]+x[ 5], 9);
178 x[ 4] ^=
R(x[ 7]+x[ 6],13); x[ 5] ^=
R(x[ 4]+x[ 7],18);
180 x[11] ^=
R(x[10]+x[ 9], 7); x[ 8] ^=
R(x[11]+x[10], 9);
181 x[ 9] ^=
R(x[ 8]+x[11],13); x[10] ^=
R(x[ 9]+x[ 8],18);
183 x[12] ^=
R(x[15]+x[14], 7); x[13] ^=
R(x[12]+x[15], 9);
184 x[14] ^=
R(x[13]+x[12],13); x[15] ^=
R(x[14]+x[13],18);
187 for (i = 0; i < 16; i++)
198 blockmix_salsa8(
const uint32_t * Bin, uint32_t * Bout, uint32_t *
X,
size_t r)
203 blkcpy(
X, &Bin[(2 * r - 1) * 16], 64);
206 for (i = 0; i < 2 * r; i += 2) {
208 blkxor(
X, &Bin[i * 16], 64);
213 blkcpy(&Bout[i * 8],
X, 64);
216 blkxor(
X, &Bin[i * 16 + 16], 64);
221 blkcpy(&Bout[i * 8 + r * 16],
X, 64);
230 integerify(
const void *
B,
size_t r)
232 const uint32_t *
X = (
const uint32_t*)((uintptr_t)(
B) + (2 * r - 1) * 64);
234 return (((uint64_t)(
X[1]) << 32) +
X[0]);
237 void SMix(uint8_t *
B,
unsigned int r,
unsigned int N,
void* _V,
void* XY)
240 uint32_t*
X = (uint32_t*)XY;
241 uint32_t* Y = (uint32_t*)((uint8_t*)(XY) + 128 * r);
242 uint32_t* Z = (uint32_t*)((uint8_t *)(XY) + 256 * r);
243 uint32_t * V = (uint32_t*)_V;
248 for (k = 0; k < 32 * r; k++)
249 X[k] = le32dec_2(&
B[4 * k]);
252 for (
unsigned int i = 0; i < N; i += 2)
255 blkcpy(&V[i * (32 * r)],
X, 128 * r);
258 blockmix_salsa8(
X, Y, Z, r);
261 blkcpy(&V[(i + 1) * (32 * r)], Y, 128 * r);
264 blockmix_salsa8(Y,
X, Z, r);
268 for (
unsigned int i = 0; i < N; i += 2)
271 j = integerify(
X, r) & (N - 1);
274 blkxor(
X, &V[j * (32 * r)], 128 * r);
275 blockmix_salsa8(
X, Y, Z, r);
278 j = integerify(Y, r) & (N - 1);
281 blkxor(Y, &V[j * (32 * r)], 128 * r);
282 blockmix_salsa8(Y,
X, Z, r);
286 for (k = 0; k < 32 * r; k++)
287 le32enc_2(&
B[4 * k],
X[k]);
290 void scrypt(
const char* pass,
unsigned int pLen,
const char* salt,
unsigned int sLen,
char *output,
unsigned int N,
unsigned int r,
unsigned int p,
unsigned int dkLen)
293 void* V0 = malloc(128 * r * N + 63);
294 void* XY0 = malloc(256 * r + 64 + 63);
295 void* B1 = malloc(128 * r * p + 63);
296 uint8_t*
B = (uint8_t *)(((uintptr_t)(B1) + 63) & ~ (uintptr_t)(63));
297 uint32_t* V = (uint32_t *)(((uintptr_t)(V0) + 63) & ~ (uintptr_t)(63));
298 uint32_t* XY = (uint32_t *)(((uintptr_t)(XY0) + 63) & ~ (uintptr_t)(63));
300 PBKDF2_SHA256((
const uint8_t *)pass, pLen, (
const uint8_t *)salt, sLen, 1,
B, p * 128 * r);
302 for(
unsigned int i = 0; i < p; i++)
304 SMix(&
B[i * 128 * r], r, N, V, XY);
307 PBKDF2_SHA256((
const uint8_t *)pass, pLen,
B, p * 128 * r, 1, (uint8_t *)output, dkLen);
A hasher class for HMAC-SHA-256.
void Finalize(unsigned char hash[OUTPUT_SIZE])
CHMAC_SHA256 & Write(const unsigned char *data, size_t len)
void * memcpy(void *a, const void *b, size_t c)
#define T(expected, seed, data)
#define S(x0, x1, x2, x3, cb, r)
#define L(x0, x1, x2, x3, x4, x5, x6, x7)
void scrypt(const char *pass, unsigned int pLen, const char *salt, unsigned int sLen, char *output, unsigned int N, unsigned int r, unsigned int p, unsigned int dkLen)
void SMix(uint8_t *B, unsigned int r, unsigned int N, void *_V, void *XY)
void PBKDF2_SHA256(const uint8_t *passwd, size_t passwdlen, const uint8_t *salt, size_t saltlen, uint64_t c, uint8_t *buf, size_t dkLen)
PBKDF2_SHA256(passwd, passwdlen, salt, saltlen, c, buf, dkLen): Compute PBKDF2(passwd,...