Subversion Repositories planix.SVN

Rev

Rev 2 | Details | Compare with Previous | Last modification | View Log | RSS feed

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