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