Warning: Attempt to read property "date" on null in /usr/local/www/websvn.planix.org/blame.php on line 247

Warning: Attempt to read property "msg" on null in /usr/local/www/websvn.planix.org/blame.php on line 247
WebSVN – planix.SVN – Blame – /os/branches/feature_posix/sys/src/libsec/port/scrypt.c – Rev 33

Subversion Repositories planix.SVN

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
26 7u83 1
#include "os.h"
2
#include <libsec.h>
3
 
4
#define movw(w, S, D)	memmove(D, S, (w)*4)
5
 
6
static void
7
xorw(ulong w, u32int *S, u32int *D)
8
{
9
	for(w /= 8; w; w--, D += 8, S += 8){
10
		D[0] ^= S[0];
11
		D[1] ^= S[1];
12
		D[2] ^= S[2];
13
		D[3] ^= S[3];
14
		D[4] ^= S[4];
15
		D[5] ^= S[5];
16
		D[6] ^= S[6];
17
		D[7] ^= S[7];
18
	}
19
}
20
 
21
static void
22
scryptBlockMix(ulong R, u32int *B, u32int *Y)
23
{
24
	u32int X[16];
25
	ulong i;
26
 
27
	R *= 2;
28
	movw(16, &B[(R-1)*16], X);
29
	for(i = 0; i < R; i += 2){
30
		xorw(16, &B[i*16], X);
31
		salsa_core(X, X, 8);
32
		movw(16, X, &Y[i*8]);
33
 
34
		xorw(16, &B[(i+1)*16], X);
35
		salsa_core(X, X, 8);
36
		movw(16, X, &Y[i*8 + R*8]);
37
	}
38
}
39
 
40
static void
41
scryptROMix(ulong R, ulong N, u32int *V, u32int *X, uchar *B)
42
{
43
	ulong w, i, d;
44
	u32int *Y;
45
 
46
	w = R*32;
47
	for(i=0; i<w; i++, B+=4)
48
		X[i] = B[0] | (B[1]<<8) | (B[2]<<16) | (B[3]<<24);
49
 
50
	Y = &X[w];
51
	for(i=0; i<N; i += 2){
52
		movw(w, X, &V[i*w]);
53
		scryptBlockMix(R, X, Y);
54
 
55
		movw(w, Y, &V[(i+1)*w]);
56
		scryptBlockMix(R, Y, X);
57
	}
58
	for(i=0; i<N; i += 2){
59
		xorw(w, &V[(X[w-16] & (N-1))*w], X);
60
		scryptBlockMix(R, X, Y);
61
 
62
		xorw(w, &V[(Y[w-16] & (N-1))*w], Y);
63
		scryptBlockMix(R, Y, X);
64
	}
65
 
66
	B -= w*4;
67
	for(i=0; i<w; i++, B+=4)
68
		d = X[i], B[0]=d, B[1]=d>>8, B[2]=d>>16, B[3]=d>>24;
69
}
70
 
71
char*
72
scrypt(p, plen, s, slen, N, R, P, d, dlen)
73
	ulong plen, slen, dlen, N, R, P;
74
	uchar *p, *s, *d;
75
{
76
	static char oom[] = "out of memory";
77
 
78
	ulong rb, i;
79
	u32int *V, *X;
80
	uchar *B;
81
 
82
	if(P < 1)
83
		return "invalid parallelization parameter P";
84
	if(R < 1 || R >= (1UL<<(31-7))/P)
85
		return "invalid block size parameter R";
86
	if(N < 2 || (N & (N-1)) != 0 || N >= (1UL<<(31-7))/R)
87
		return "invalid cpu/memory cost parameter N";
88
 
89
	rb = R<<7;
90
	if((B = malloc(P*rb)) == nil)
91
		return oom;
92
	if((V = malloc(N*rb)) == nil){
93
		free(B);
94
		return oom;
95
	}
96
	if((X = malloc(2*rb)) == nil){
97
		free(V);
98
		free(B);
99
		return oom;
100
	}
101
 
102
	pbkdf2_x(p, plen, s, slen, 1, B, P*rb, hmac_sha2_256, SHA2_256dlen);
103
 
104
	for(i=0; i<P; i++)
105
		scryptROMix(R, N, V, X, &B[i*rb]);
106
 
107
	memset(X, 0, 2*rb);
108
	free(X);
109
 
110
	memset(V, 0, N*rb);
111
	free(V);
112
 
113
	pbkdf2_x(p, plen, B, P*rb, 1, d, dlen, hmac_sha2_256, SHA2_256dlen);
114
 
115
	memset(B, 0, P*rb);
116
	free(B);
117
 
118
	return nil;
119
}