Subversion Repositories planix.SVN

Rev

Rev 22 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 22 Rev 26
Line 1... Line 1...
1
#include "os.h"
1
#include "os.h"
-
 
2
 
-
 
3
#define ROTL(x,n)	(((x)<<n)|((x)>>32-n))
-
 
4
 
-
 
5
#define F0(x,y,z)	(0x5a827999 + ((z) ^ ((x) & ((y) ^ (z)))))
-
 
6
#define F1(x,y,z)	(0x6ed9eba1 + ((x) ^ (y) ^ (z)))
-
 
7
#define F2(x,y,z)	(0x8f1bbcdc + (((x) & (y)) | (((x) | (y)) & (z))))
-
 
8
#define F3(x,y,z)	(0xca62c1d6 + ((x) ^ (y) ^ (z)))
2
 
9
 
3
void
10
void
4
_sha1block(uchar *p, ulong len, u32int *s)
11
_sha1block(uchar *p, ulong len, u32int *s)
5
{
12
{
6
	u32int a, b, c, d, e, x;
13
	u32int w[16], a, b, c, d, e;
7
	uchar *end;
14
	uchar *end;
8
	u32int *wp, *wend;
-
 
9
	u32int w[80];
-
 
10
 
15
 
11
	/* at this point, we have a multiple of 64 bytes */
16
	/* at this point, we have a multiple of 64 bytes */
12
	for(end = p+len; p < end;){
17
	for(end = p+len; p < end;){
13
		a = s[0];
18
		a = s[0];
14
		b = s[1];
19
		b = s[1];
15
		c = s[2];
20
		c = s[2];
16
		d = s[3];
21
		d = s[3];
17
		e = s[4];
22
		e = s[4];
18
 
23
 
19
		wend = w + 15;
-
 
20
		for(wp = w; wp < wend; wp += 5){
-
 
21
			wp[0] = (p[0]<<24) | (p[1]<<16) | (p[2]<<8) | p[3];
-
 
22
			e += ((a<<5) | (a>>27)) + wp[0];
-
 
23
			e += 0x5a827999 + (((c^d)&b)^d);
-
 
24
			b = (b<<30)|(b>>2);
-
 
25
 
-
 
26
			wp[1] = (p[4]<<24) | (p[5]<<16) | (p[6]<<8) | p[7];
-
 
27
			d += ((e<<5) | (e>>27)) + wp[1];
-
 
28
			d += 0x5a827999 + (((b^c)&a)^c);
-
 
29
			a = (a<<30)|(a>>2);
-
 
30
 
-
 
31
			wp[2] = (p[8]<<24) | (p[9]<<16) | (p[10]<<8) | p[11];
-
 
32
			c += ((d<<5) | (d>>27)) + wp[2];
-
 
33
			c += 0x5a827999 + (((a^b)&e)^b);
-
 
34
			e = (e<<30)|(e>>2);
24
#define STEP(a,b,c,d,e,f,i) \
35
 
-
 
36
			wp[3] = (p[12]<<24) | (p[13]<<16) | (p[14]<<8) | p[15];
-
 
37
			b += ((c<<5) | (c>>27)) + wp[3];
-
 
38
			b += 0x5a827999 + (((e^a)&d)^a);
-
 
39
			d = (d<<30)|(d>>2);
-
 
40
 
-
 
41
			wp[4] = (p[16]<<24) | (p[17]<<16) | (p[18]<<8) | p[19];
-
 
42
			a += ((b<<5) | (b>>27)) + wp[4];
-
 
43
			a += 0x5a827999 + (((d^e)&c)^e);
-
 
44
			c = (c<<30)|(c>>2);
-
 
45
			
-
 
46
			p += 20;
25
	if(i < 16) {\
47
		}
-
 
48
 
-
 
49
		wp[0] = (p[0]<<24) | (p[1]<<16) | (p[2]<<8) | p[3];
26
		w[i] = p[0]<<24 | p[1]<<16 | p[2]<<8 | p[3]; \
50
		e += ((a<<5) | (a>>27)) + wp[0];
-
 
51
		e += 0x5a827999 + (((c^d)&b)^d);
-
 
52
		b = (b<<30)|(b>>2);
-
 
53
 
-
 
54
		x = wp[-2] ^ wp[-7] ^ wp[-13] ^ wp[-15];
-
 
55
		wp[1] = (x<<1) | (x>>31);
-
 
56
		d += ((e<<5) | (e>>27)) + wp[1];
-
 
57
		d += 0x5a827999 + (((b^c)&a)^c);
-
 
58
		a = (a<<30)|(a>>2);
-
 
59
 
-
 
60
		x = wp[-1] ^ wp[-6] ^ wp[-12] ^ wp[-14];
-
 
61
		wp[2] = (x<<1) | (x>>31);
-
 
62
		c += ((d<<5) | (d>>27)) + wp[2];
-
 
63
		c += 0x5a827999 + (((a^b)&e)^b);
-
 
64
		e = (e<<30)|(e>>2);
-
 
65
 
-
 
66
		x = wp[0] ^ wp[-5] ^ wp[-11] ^ wp[-13];
-
 
67
		wp[3] = (x<<1) | (x>>31);
-
 
68
		b += ((c<<5) | (c>>27)) + wp[3];
-
 
69
		b += 0x5a827999 + (((e^a)&d)^a);
-
 
70
		d = (d<<30)|(d>>2);
-
 
71
 
-
 
72
		x = wp[1] ^ wp[-4] ^ wp[-10] ^ wp[-12];
-
 
73
		wp[4] = (x<<1) | (x>>31);
-
 
74
		a += ((b<<5) | (b>>27)) + wp[4];
-
 
75
		a += 0x5a827999 + (((d^e)&c)^e);
-
 
76
		c = (c<<30)|(c>>2);
-
 
77
 
-
 
78
		wp += 5;
-
 
79
		p += 4;
27
		p += 4; \
80
 
-
 
81
		wend = w + 40;
28
	} else { \
82
		for(; wp < wend; wp += 5){
-
 
83
			x = wp[-3] ^ wp[-8] ^ wp[-14] ^ wp[-16];
29
		u32int x = w[i-3&15] ^ w[i-8&15] ^ w[i-14&15] ^ w[i-16&15]; \
84
			wp[0] = (x<<1) | (x>>31);
-
 
85
			e += ((a<<5) | (a>>27)) + wp[0];
-
 
86
			e += 0x6ed9eba1 + (b^c^d);
-
 
87
			b = (b<<30)|(b>>2);
-
 
88
 
-
 
89
			x = wp[-2] ^ wp[-7] ^ wp[-13] ^ wp[-15];
-
 
90
			wp[1] = (x<<1) | (x>>31);
30
		w[i&15] = ROTL(x, 1); \
91
			d += ((e<<5) | (e>>27)) + wp[1];
-
 
92
			d += 0x6ed9eba1 + (a^b^c);
-
 
93
			a = (a<<30)|(a>>2);
-
 
94
 
-
 
95
			x = wp[-1] ^ wp[-6] ^ wp[-12] ^ wp[-14];
-
 
96
			wp[2] = (x<<1) | (x>>31);
-
 
97
			c += ((d<<5) | (d>>27)) + wp[2];
-
 
98
			c += 0x6ed9eba1 + (e^a^b);
-
 
99
			e = (e<<30)|(e>>2);
-
 
100
 
-
 
101
			x = wp[0] ^ wp[-5] ^ wp[-11] ^ wp[-13];
-
 
102
			wp[3] = (x<<1) | (x>>31);
-
 
103
			b += ((c<<5) | (c>>27)) + wp[3];
-
 
104
			b += 0x6ed9eba1 + (d^e^a);
-
 
105
			d = (d<<30)|(d>>2);
-
 
106
 
-
 
107
			x = wp[1] ^ wp[-4] ^ wp[-10] ^ wp[-12];
-
 
108
			wp[4] = (x<<1) | (x>>31);
-
 
109
			a += ((b<<5) | (b>>27)) + wp[4];
-
 
110
			a += 0x6ed9eba1 + (c^d^e);
-
 
111
			c = (c<<30)|(c>>2);
-
 
112
		}
31
	} \
113
 
-
 
114
		wend = w + 60;
-
 
115
		for(; wp < wend; wp += 5){
-
 
116
			x = wp[-3] ^ wp[-8] ^ wp[-14] ^ wp[-16];
-
 
117
			wp[0] = (x<<1) | (x>>31);
-
 
118
			e += ((a<<5) | (a>>27)) + wp[0];
-
 
119
			e += 0x8f1bbcdc + ((b&c)|((b|c)&d));
32
	e += ROTL(a, 5) + w[i&15] + f(b,c,d); \
120
			b = (b<<30)|(b>>2);
33
	b = ROTL(b, 30);
121
 
-
 
122
			x = wp[-2] ^ wp[-7] ^ wp[-13] ^ wp[-15];
-
 
123
			wp[1] = (x<<1) | (x>>31);
-
 
124
			d += ((e<<5) | (e>>27)) + wp[1];
-
 
125
			d += 0x8f1bbcdc + ((a&b)|((a|b)&c));
-
 
126
			a = (a<<30)|(a>>2);
-
 
127
 
-
 
128
			x = wp[-1] ^ wp[-6] ^ wp[-12] ^ wp[-14];
-
 
129
			wp[2] = (x<<1) | (x>>31);
-
 
130
			c += ((d<<5) | (d>>27)) + wp[2];
-
 
131
			c += 0x8f1bbcdc + ((e&a)|((e|a)&b));
-
 
132
			e = (e<<30)|(e>>2);
-
 
133
 
-
 
134
			x = wp[0] ^ wp[-5] ^ wp[-11] ^ wp[-13];
-
 
135
			wp[3] = (x<<1) | (x>>31);
-
 
136
			b += ((c<<5) | (c>>27)) + wp[3];
-
 
137
			b += 0x8f1bbcdc + ((d&e)|((d|e)&a));
-
 
138
			d = (d<<30)|(d>>2);
-
 
139
 
-
 
140
			x = wp[1] ^ wp[-4] ^ wp[-10] ^ wp[-12];
-
 
141
			wp[4] = (x<<1) | (x>>31);
-
 
142
			a += ((b<<5) | (b>>27)) + wp[4];
-
 
143
			a += 0x8f1bbcdc + ((c&d)|((c|d)&e));
-
 
144
			c = (c<<30)|(c>>2);
-
 
145
		}
-
 
146
 
-
 
147
		wend = w + 80;
-
 
148
		for(; wp < wend; wp += 5){
-
 
149
			x = wp[-3] ^ wp[-8] ^ wp[-14] ^ wp[-16];
-
 
150
			wp[0] = (x<<1) | (x>>31);
-
 
151
			e += ((a<<5) | (a>>27)) + wp[0];
-
 
152
			e += 0xca62c1d6 + (b^c^d);
-
 
153
			b = (b<<30)|(b>>2);
-
 
154
 
-
 
155
			x = wp[-2] ^ wp[-7] ^ wp[-13] ^ wp[-15];
-
 
156
			wp[1] = (x<<1) | (x>>31);
-
 
157
			d += ((e<<5) | (e>>27)) + wp[1];
-
 
158
			d += 0xca62c1d6 + (a^b^c);
-
 
159
			a = (a<<30)|(a>>2);
-
 
160
 
-
 
161
			x = wp[-1] ^ wp[-6] ^ wp[-12] ^ wp[-14];
-
 
162
			wp[2] = (x<<1) | (x>>31);
-
 
163
			c += ((d<<5) | (d>>27)) + wp[2];
-
 
164
			c += 0xca62c1d6 + (e^a^b);
-
 
165
			e = (e<<30)|(e>>2);
-
 
166
 
-
 
167
			x = wp[0] ^ wp[-5] ^ wp[-11] ^ wp[-13];
-
 
168
			wp[3] = (x<<1) | (x>>31);
-
 
169
			b += ((c<<5) | (c>>27)) + wp[3];
-
 
170
			b += 0xca62c1d6 + (d^e^a);
-
 
171
			d = (d<<30)|(d>>2);
-
 
172
 
34
 
-
 
35
		STEP(a,b,c,d,e,F0,0);
-
 
36
		STEP(e,a,b,c,d,F0,1);
-
 
37
		STEP(d,e,a,b,c,F0,2);
-
 
38
		STEP(c,d,e,a,b,F0,3);
-
 
39
		STEP(b,c,d,e,a,F0,4);
-
 
40
	
-
 
41
		STEP(a,b,c,d,e,F0,5);
-
 
42
		STEP(e,a,b,c,d,F0,6);
-
 
43
		STEP(d,e,a,b,c,F0,7);
-
 
44
		STEP(c,d,e,a,b,F0,8);
-
 
45
		STEP(b,c,d,e,a,F0,9);
-
 
46
	
-
 
47
		STEP(a,b,c,d,e,F0,10);
-
 
48
		STEP(e,a,b,c,d,F0,11);
173
			x = wp[1] ^ wp[-4] ^ wp[-10] ^ wp[-12];
49
		STEP(d,e,a,b,c,F0,12);
-
 
50
		STEP(c,d,e,a,b,F0,13);
-
 
51
		STEP(b,c,d,e,a,F0,14);
-
 
52
	
-
 
53
		STEP(a,b,c,d,e,F0,15);
-
 
54
		STEP(e,a,b,c,d,F0,16);
-
 
55
		STEP(d,e,a,b,c,F0,17);
-
 
56
		STEP(c,d,e,a,b,F0,18);
-
 
57
		STEP(b,c,d,e,a,F0,19);
-
 
58
	
-
 
59
		STEP(a,b,c,d,e,F1,20);
-
 
60
		STEP(e,a,b,c,d,F1,21);
-
 
61
		STEP(d,e,a,b,c,F1,22);
-
 
62
		STEP(c,d,e,a,b,F1,23);
-
 
63
		STEP(b,c,d,e,a,F1,24);
-
 
64
	
-
 
65
		STEP(a,b,c,d,e,F1,25);
-
 
66
		STEP(e,a,b,c,d,F1,26);
-
 
67
		STEP(d,e,a,b,c,F1,27);
-
 
68
		STEP(c,d,e,a,b,F1,28);
-
 
69
		STEP(b,c,d,e,a,F1,29);
-
 
70
	
-
 
71
		STEP(a,b,c,d,e,F1,30);
174
			wp[4] = (x<<1) | (x>>31);
72
		STEP(e,a,b,c,d,F1,31);
-
 
73
		STEP(d,e,a,b,c,F1,32);
-
 
74
		STEP(c,d,e,a,b,F1,33);
-
 
75
		STEP(b,c,d,e,a,F1,34);
-
 
76
	
-
 
77
		STEP(a,b,c,d,e,F1,35);
-
 
78
		STEP(e,a,b,c,d,F1,36);
-
 
79
		STEP(d,e,a,b,c,F1,37);
-
 
80
		STEP(c,d,e,a,b,F1,38);
-
 
81
		STEP(b,c,d,e,a,F1,39);
-
 
82
	
-
 
83
		STEP(a,b,c,d,e,F2,40);
-
 
84
		STEP(e,a,b,c,d,F2,41);
-
 
85
		STEP(d,e,a,b,c,F2,42);
-
 
86
		STEP(c,d,e,a,b,F2,43);
-
 
87
		STEP(b,c,d,e,a,F2,44);
-
 
88
	
-
 
89
		STEP(a,b,c,d,e,F2,45);
-
 
90
		STEP(e,a,b,c,d,F2,46);
-
 
91
		STEP(d,e,a,b,c,F2,47);
-
 
92
		STEP(c,d,e,a,b,F2,48);
-
 
93
		STEP(b,c,d,e,a,F2,49);
-
 
94
	
-
 
95
		STEP(a,b,c,d,e,F2,50);
-
 
96
		STEP(e,a,b,c,d,F2,51);
-
 
97
		STEP(d,e,a,b,c,F2,52);
-
 
98
		STEP(c,d,e,a,b,F2,53);
175
			a += ((b<<5) | (b>>27)) + wp[4];
99
		STEP(b,c,d,e,a,F2,54);
-
 
100
	
-
 
101
		STEP(a,b,c,d,e,F2,55);
-
 
102
		STEP(e,a,b,c,d,F2,56);
-
 
103
		STEP(d,e,a,b,c,F2,57);
-
 
104
		STEP(c,d,e,a,b,F2,58);
-
 
105
		STEP(b,c,d,e,a,F2,59);
-
 
106
	
-
 
107
		STEP(a,b,c,d,e,F3,60);
-
 
108
		STEP(e,a,b,c,d,F3,61);
-
 
109
		STEP(d,e,a,b,c,F3,62);
-
 
110
		STEP(c,d,e,a,b,F3,63);
-
 
111
		STEP(b,c,d,e,a,F3,64);
-
 
112
	
-
 
113
		STEP(a,b,c,d,e,F3,65);
-
 
114
		STEP(e,a,b,c,d,F3,66);
-
 
115
		STEP(d,e,a,b,c,F3,67);
-
 
116
		STEP(c,d,e,a,b,F3,68);
-
 
117
		STEP(b,c,d,e,a,F3,69);
-
 
118
	
176
			a += 0xca62c1d6 + (c^d^e);
119
		STEP(a,b,c,d,e,F3,70);
-
 
120
		STEP(e,a,b,c,d,F3,71);
177
			c = (c<<30)|(c>>2);
121
		STEP(d,e,a,b,c,F3,72);
-
 
122
		STEP(c,d,e,a,b,F3,73);
-
 
123
		STEP(b,c,d,e,a,F3,74);
178
		}
124
	
-
 
125
		STEP(a,b,c,d,e,F3,75);
-
 
126
		STEP(e,a,b,c,d,F3,76);
-
 
127
		STEP(d,e,a,b,c,F3,77);
-
 
128
		STEP(c,d,e,a,b,F3,78);
-
 
129
		STEP(b,c,d,e,a,F3,79);
179
 
130
 
180
		/* save state */
-
 
181
		s[0] += a;
131
		s[0] += a;
182
		s[1] += b;
132
		s[1] += b;
183
		s[2] += c;
133
		s[2] += c;
184
		s[3] += d;
134
		s[3] += d;
185
		s[4] += e;
135
		s[4] += e;