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