33 #include <openssl/sha.h>
40 static inline void be32enc(
void *pp, uint32_t x)
42 uint8_t *p = (uint8_t *)pp;
44 p[2] = (x >> 8) & 0xff;
45 p[1] = (x >> 16) & 0xff;
46 p[0] = (x >> 24) & 0xff;
59 unsigned char pad[64];
60 unsigned char khash[32];
61 const unsigned char *K = (
const unsigned char *)_K;
66 SHA256_Init(&ctx->
ictx);
67 SHA256_Update(&ctx->
ictx, K, Klen);
68 SHA256_Final(khash, &ctx->
ictx);
74 SHA256_Init(&ctx->
ictx);
75 memset(pad, 0x36, 64);
76 for (i = 0; i < Klen; i++)
78 SHA256_Update(&ctx->
ictx, pad, 64);
81 SHA256_Init(&ctx->
octx);
82 memset(pad, 0x5c, 64);
83 for (i = 0; i < Klen; i++)
85 SHA256_Update(&ctx->
octx, pad, 64);
96 SHA256_Update(&ctx->
ictx, in, len);
103 unsigned char ihash[32];
106 SHA256_Final(ihash, &ctx->
ictx);
109 SHA256_Update(&ctx->
octx, ihash, 32);
112 SHA256_Final(digest, &ctx->
octx);
115 memset(ihash, 0, 32);
125 size_t saltlen, uint64_t c, uint8_t *buf,
size_t dkLen)
137 HMAC_SHA256_Init(&PShctx, passwd, passwdlen);
138 HMAC_SHA256_Update(&PShctx, salt, saltlen);
141 for (i = 0; i * 32 < dkLen; i++) {
143 be32enc(ivec, (uint32_t)(i + 1));
147 HMAC_SHA256_Update(&hctx, ivec, 4);
148 HMAC_SHA256_Final(U, &hctx);
153 for (j = 2; j <= c; j++) {
155 HMAC_SHA256_Init(&hctx, passwd, passwdlen);
156 HMAC_SHA256_Update(&hctx, U, 32);
157 HMAC_SHA256_Final(U, &hctx);
160 for (k = 0; k < 32; k++)
165 clen = dkLen - i * 32;
168 memcpy(&buf[i * 32], T, clen);
175 static inline uint32_t
176 le32dec_2(
const void * pp)
178 const uint8_t * p = (uint8_t
const *)pp;
180 return ((uint32_t)(p[0]) + ((uint32_t)(p[1]) << 8) +
181 ((uint32_t)(p[2]) << 16) + ((uint32_t)(p[3]) << 24));
185 le32enc_2(
void * pp, uint32_t x)
187 uint8_t * p = (uint8_t *)pp;
190 p[1] = (x >> 8) & 0xff;
191 p[2] = (x >> 16) & 0xff;
192 p[3] = (x >> 24) & 0xff;
196 blkcpy(
void * dest,
const void * src,
size_t len)
198 size_t * D = (
size_t*)dest;
199 const size_t *
S = (
size_t*)src;
200 size_t L = len /
sizeof(size_t);
203 for (i = 0; i <
L; i++)
208 blkxor(
void * dest,
const void * src,
size_t len)
210 size_t * D = (
size_t*)dest;
211 const size_t*
S = (
size_t*)src;
212 size_t L = len /
sizeof(size_t);
215 for (i = 0; i <
L; i++)
224 salsa20_8(uint32_t B[16])
230 for (i = 0; i < 8; i += 2) {
231 #define R(a,b) (((a) << (b)) | ((a) >> (32 - (b))))
233 x[ 4] ^=
R(x[ 0]+x[12], 7); x[ 8] ^=
R(x[ 4]+x[ 0], 9);
234 x[12] ^=
R(x[ 8]+x[ 4],13); x[ 0] ^=
R(x[12]+x[ 8],18);
236 x[ 9] ^=
R(x[ 5]+x[ 1], 7); x[13] ^=
R(x[ 9]+x[ 5], 9);
237 x[ 1] ^=
R(x[13]+x[ 9],13); x[ 5] ^=
R(x[ 1]+x[13],18);
239 x[14] ^=
R(x[10]+x[ 6], 7); x[ 2] ^=
R(x[14]+x[10], 9);
240 x[ 6] ^=
R(x[ 2]+x[14],13); x[10] ^=
R(x[ 6]+x[ 2],18);
242 x[ 3] ^=
R(x[15]+x[11], 7); x[ 7] ^=
R(x[ 3]+x[15], 9);
243 x[11] ^=
R(x[ 7]+x[ 3],13); x[15] ^=
R(x[11]+x[ 7],18);
246 x[ 1] ^=
R(x[ 0]+x[ 3], 7); x[ 2] ^=
R(x[ 1]+x[ 0], 9);
247 x[ 3] ^=
R(x[ 2]+x[ 1],13); x[ 0] ^=
R(x[ 3]+x[ 2],18);
249 x[ 6] ^=
R(x[ 5]+x[ 4], 7); x[ 7] ^=
R(x[ 6]+x[ 5], 9);
250 x[ 4] ^=
R(x[ 7]+x[ 6],13); x[ 5] ^=
R(x[ 4]+x[ 7],18);
252 x[11] ^=
R(x[10]+x[ 9], 7); x[ 8] ^=
R(x[11]+x[10], 9);
253 x[ 9] ^=
R(x[ 8]+x[11],13); x[10] ^=
R(x[ 9]+x[ 8],18);
255 x[12] ^=
R(x[15]+x[14], 7); x[13] ^=
R(x[12]+x[15], 9);
256 x[14] ^=
R(x[13]+x[12],13); x[15] ^=
R(x[14]+x[13],18);
259 for (i = 0; i < 16; i++)
270 blockmix_salsa8(
const uint32_t * Bin, uint32_t * Bout, uint32_t *
X,
size_t r)
275 blkcpy(
X, &Bin[(2 *
r - 1) * 16], 64);
278 for (i = 0; i < 2 *
r; i += 2) {
280 blkxor(
X, &Bin[i * 16], 64);
285 blkcpy(&Bout[i * 8],
X, 64);
288 blkxor(
X, &Bin[i * 16 + 16], 64);
293 blkcpy(&Bout[i * 8 +
r * 16],
X, 64);
302 integerify(
const void * B,
size_t r)
304 const uint32_t *
X = (
const uint32_t*)((uintptr_t)(B) + (2 *
r - 1) * 64);
306 return (((uint64_t)(
X[1]) << 32) +
X[0]);
309 void SMix(uint8_t *B,
unsigned int r,
unsigned int N,
void* _V,
void* XY)
312 uint32_t*
X = (uint32_t*)XY;
313 uint32_t* Y = (uint32_t*)((uint8_t*)(XY) + 128 *
r);
314 uint32_t* Z = (uint32_t*)((uint8_t *)(XY) + 256 *
r);
315 uint32_t * V = (uint32_t*)_V;
320 for (k = 0; k < 32 *
r; k++)
321 X[k] = le32dec_2(&B[4 * k]);
324 for (
unsigned int i = 0; i < N; i += 2)
327 blkcpy(&V[i * (32 *
r)],
X, 128 *
r);
330 blockmix_salsa8(
X, Y, Z,
r);
333 blkcpy(&V[(i + 1) * (32 *
r)], Y, 128 *
r);
336 blockmix_salsa8(Y,
X, Z,
r);
340 for (
unsigned int i = 0; i < N; i += 2)
343 j = integerify(
X,
r) & (N - 1);
346 blkxor(
X, &V[j * (32 *
r)], 128 *
r);
347 blockmix_salsa8(
X, Y, Z,
r);
350 j = integerify(Y,
r) & (N - 1);
353 blkxor(Y, &V[j * (32 *
r)], 128 *
r);
354 blockmix_salsa8(Y,
X, Z,
r);
358 for (k = 0; k < 32 *
r; k++)
359 le32enc_2(&B[4 * k],
X[k]);
362 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)
365 void* V0 = malloc(128 *
r * N + 63);
366 void* XY0 = malloc(256 *
r + 64 + 63);
367 void* B1 = malloc(128 *
r * p + 63);
368 uint8_t* B = (uint8_t *)(((uintptr_t)(B1) + 63) & ~ (uintptr_t)(63));
369 uint32_t* V = (uint32_t *)(((uintptr_t)(V0) + 63) & ~ (uintptr_t)(63));
370 uint32_t* XY = (uint32_t *)(((uintptr_t)(XY0) + 63) & ~ (uintptr_t)(63));
372 PBKDF2_SHA256((
const uint8_t *)pass, pLen, (
const uint8_t *)salt, sLen, 1, B, p * 128 *
r);
374 for(
unsigned int i = 0; i < p; i++)
376 SMix(&B[i * 128 *
r],
r, N, V, XY);
379 PBKDF2_SHA256((
const uint8_t *)pass, pLen, B, p * 128 *
r, 1, (uint8_t *)output, dkLen);