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