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