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