xref: /plan9/sys/src/cmd/unix/drawterm/posix-port/sha1block.c (revision 96cbc34f1b36a29efdcfd47b10e70703a690febc)
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