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