Blob


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