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 "os.h"
2
 
3
void
4
_sha1block(uchar *p, ulong len, u32int *s)
5
{
6
	u32int a, b, c, d, e, x;
7
	uchar *end;
8
	u32int *wp, *wend;
9
	u32int w[80];
10
 
11
	/* at this point, we have a multiple of 64 bytes */
12
	for(end = p+len; p < end;){
13
		a = s[0];
14
		b = s[1];
15
		c = s[2];
16
		d = s[3];
17
		e = s[4];
18
 
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);
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;
47
		}
48
 
49
		wp[0] = (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;
80
 
81
		wend = w + 40;
82
		for(; wp < wend; wp += 5){
83
			x = wp[-3] ^ wp[-8] ^ wp[-14] ^ wp[-16];
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);
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
		}
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));
120
			b = (b<<30)|(b>>2);
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
 
173
			x = wp[1] ^ wp[-4] ^ wp[-10] ^ wp[-12];
174
			wp[4] = (x<<1) | (x>>31);
175
			a += ((b<<5) | (b>>27)) + wp[4];
176
			a += 0xca62c1d6 + (c^d^e);
177
			c = (c<<30)|(c>>2);
178
		}
179
 
180
		/* save state */
181
		s[0] += a;
182
		s[1] += b;
183
		s[2] += c;
184
		s[3] += d;
185
		s[4] += e;
186
	}
187
}