Blame


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