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