xref: /plan9/sys/src/libsec/port/sha1block.c (revision 9a747e4fd48b9f4522c70c07e8f882a15030f964)
180ee5cbfSDavid du Colombier #include "os.h"
280ee5cbfSDavid du Colombier 
380ee5cbfSDavid du Colombier void
_sha1block(uchar * p,ulong len,u32int * s)480ee5cbfSDavid du Colombier _sha1block(uchar *p, ulong len, u32int *s)
580ee5cbfSDavid du Colombier {
680ee5cbfSDavid du Colombier 	u32int a, b, c, d, e, x;
780ee5cbfSDavid du Colombier 	uchar *end;
880ee5cbfSDavid du Colombier 	u32int *wp, *wend;
980ee5cbfSDavid du Colombier 	u32int w[80];
1080ee5cbfSDavid du Colombier 
11*9a747e4fSDavid du Colombier 	/* at this point, we have a multiple of 64 bytes */
1280ee5cbfSDavid du Colombier 	for(end = p+len; p < end;){
1380ee5cbfSDavid du Colombier 		a = s[0];
1480ee5cbfSDavid du Colombier 		b = s[1];
1580ee5cbfSDavid du Colombier 		c = s[2];
1680ee5cbfSDavid du Colombier 		d = s[3];
1780ee5cbfSDavid du Colombier 		e = s[4];
1880ee5cbfSDavid du Colombier 
1980ee5cbfSDavid du Colombier 		wend = w + 15;
2080ee5cbfSDavid du Colombier 		for(wp = w; wp < wend; wp += 5){
2180ee5cbfSDavid du Colombier 			wp[0] = (p[0]<<24) | (p[1]<<16) | (p[2]<<8) | p[3];
2280ee5cbfSDavid du Colombier 			e += ((a<<5) | (a>>27)) + wp[0];
2380ee5cbfSDavid du Colombier 			e += 0x5a827999 + (((c^d)&b)^d);
2480ee5cbfSDavid du Colombier 			b = (b<<30)|(b>>2);
2580ee5cbfSDavid du Colombier 
2680ee5cbfSDavid du Colombier 			wp[1] = (p[4]<<24) | (p[5]<<16) | (p[6]<<8) | p[7];
2780ee5cbfSDavid du Colombier 			d += ((e<<5) | (e>>27)) + wp[1];
2880ee5cbfSDavid du Colombier 			d += 0x5a827999 + (((b^c)&a)^c);
2980ee5cbfSDavid du Colombier 			a = (a<<30)|(a>>2);
3080ee5cbfSDavid du Colombier 
3180ee5cbfSDavid du Colombier 			wp[2] = (p[8]<<24) | (p[9]<<16) | (p[10]<<8) | p[11];
3280ee5cbfSDavid du Colombier 			c += ((d<<5) | (d>>27)) + wp[2];
3380ee5cbfSDavid du Colombier 			c += 0x5a827999 + (((a^b)&e)^b);
3480ee5cbfSDavid du Colombier 			e = (e<<30)|(e>>2);
3580ee5cbfSDavid du Colombier 
3680ee5cbfSDavid du Colombier 			wp[3] = (p[12]<<24) | (p[13]<<16) | (p[14]<<8) | p[15];
3780ee5cbfSDavid du Colombier 			b += ((c<<5) | (c>>27)) + wp[3];
3880ee5cbfSDavid du Colombier 			b += 0x5a827999 + (((e^a)&d)^a);
3980ee5cbfSDavid du Colombier 			d = (d<<30)|(d>>2);
4080ee5cbfSDavid du Colombier 
4180ee5cbfSDavid du Colombier 			wp[4] = (p[16]<<24) | (p[17]<<16) | (p[18]<<8) | p[19];
4280ee5cbfSDavid du Colombier 			a += ((b<<5) | (b>>27)) + wp[4];
4380ee5cbfSDavid du Colombier 			a += 0x5a827999 + (((d^e)&c)^e);
4480ee5cbfSDavid du Colombier 			c = (c<<30)|(c>>2);
4580ee5cbfSDavid du Colombier 
4680ee5cbfSDavid du Colombier 			p += 20;
4780ee5cbfSDavid du Colombier 		}
4880ee5cbfSDavid du Colombier 
4980ee5cbfSDavid du Colombier 		wp[0] = (p[0]<<24) | (p[1]<<16) | (p[2]<<8) | p[3];
5080ee5cbfSDavid du Colombier 		e += ((a<<5) | (a>>27)) + wp[0];
5180ee5cbfSDavid du Colombier 		e += 0x5a827999 + (((c^d)&b)^d);
5280ee5cbfSDavid du Colombier 		b = (b<<30)|(b>>2);
5380ee5cbfSDavid du Colombier 
5480ee5cbfSDavid du Colombier 		x = wp[-2] ^ wp[-7] ^ wp[-13] ^ wp[-15];
5580ee5cbfSDavid du Colombier 		wp[1] = (x<<1) | (x>>31);
5680ee5cbfSDavid du Colombier 		d += ((e<<5) | (e>>27)) + wp[1];
5780ee5cbfSDavid du Colombier 		d += 0x5a827999 + (((b^c)&a)^c);
5880ee5cbfSDavid du Colombier 		a = (a<<30)|(a>>2);
5980ee5cbfSDavid du Colombier 
6080ee5cbfSDavid du Colombier 		x = wp[-1] ^ wp[-6] ^ wp[-12] ^ wp[-14];
6180ee5cbfSDavid du Colombier 		wp[2] = (x<<1) | (x>>31);
6280ee5cbfSDavid du Colombier 		c += ((d<<5) | (d>>27)) + wp[2];
6380ee5cbfSDavid du Colombier 		c += 0x5a827999 + (((a^b)&e)^b);
6480ee5cbfSDavid du Colombier 		e = (e<<30)|(e>>2);
6580ee5cbfSDavid du Colombier 
6680ee5cbfSDavid du Colombier 		x = wp[0] ^ wp[-5] ^ wp[-11] ^ wp[-13];
6780ee5cbfSDavid du Colombier 		wp[3] = (x<<1) | (x>>31);
6880ee5cbfSDavid du Colombier 		b += ((c<<5) | (c>>27)) + wp[3];
6980ee5cbfSDavid du Colombier 		b += 0x5a827999 + (((e^a)&d)^a);
7080ee5cbfSDavid du Colombier 		d = (d<<30)|(d>>2);
7180ee5cbfSDavid du Colombier 
7280ee5cbfSDavid du Colombier 		x = wp[1] ^ wp[-4] ^ wp[-10] ^ wp[-12];
7380ee5cbfSDavid du Colombier 		wp[4] = (x<<1) | (x>>31);
7480ee5cbfSDavid du Colombier 		a += ((b<<5) | (b>>27)) + wp[4];
7580ee5cbfSDavid du Colombier 		a += 0x5a827999 + (((d^e)&c)^e);
7680ee5cbfSDavid du Colombier 		c = (c<<30)|(c>>2);
7780ee5cbfSDavid du Colombier 
7880ee5cbfSDavid du Colombier 		wp += 5;
7980ee5cbfSDavid du Colombier 		p += 4;
8080ee5cbfSDavid du Colombier 
8180ee5cbfSDavid du Colombier 		wend = w + 40;
8280ee5cbfSDavid du Colombier 		for(; wp < wend; wp += 5){
8380ee5cbfSDavid du Colombier 			x = wp[-3] ^ wp[-8] ^ wp[-14] ^ wp[-16];
8480ee5cbfSDavid du Colombier 			wp[0] = (x<<1) | (x>>31);
8580ee5cbfSDavid du Colombier 			e += ((a<<5) | (a>>27)) + wp[0];
8680ee5cbfSDavid du Colombier 			e += 0x6ed9eba1 + (b^c^d);
8780ee5cbfSDavid du Colombier 			b = (b<<30)|(b>>2);
8880ee5cbfSDavid du Colombier 
8980ee5cbfSDavid du Colombier 			x = wp[-2] ^ wp[-7] ^ wp[-13] ^ wp[-15];
9080ee5cbfSDavid du Colombier 			wp[1] = (x<<1) | (x>>31);
9180ee5cbfSDavid du Colombier 			d += ((e<<5) | (e>>27)) + wp[1];
9280ee5cbfSDavid du Colombier 			d += 0x6ed9eba1 + (a^b^c);
9380ee5cbfSDavid du Colombier 			a = (a<<30)|(a>>2);
9480ee5cbfSDavid du Colombier 
9580ee5cbfSDavid du Colombier 			x = wp[-1] ^ wp[-6] ^ wp[-12] ^ wp[-14];
9680ee5cbfSDavid du Colombier 			wp[2] = (x<<1) | (x>>31);
9780ee5cbfSDavid du Colombier 			c += ((d<<5) | (d>>27)) + wp[2];
9880ee5cbfSDavid du Colombier 			c += 0x6ed9eba1 + (e^a^b);
9980ee5cbfSDavid du Colombier 			e = (e<<30)|(e>>2);
10080ee5cbfSDavid du Colombier 
10180ee5cbfSDavid du Colombier 			x = wp[0] ^ wp[-5] ^ wp[-11] ^ wp[-13];
10280ee5cbfSDavid du Colombier 			wp[3] = (x<<1) | (x>>31);
10380ee5cbfSDavid du Colombier 			b += ((c<<5) | (c>>27)) + wp[3];
10480ee5cbfSDavid du Colombier 			b += 0x6ed9eba1 + (d^e^a);
10580ee5cbfSDavid du Colombier 			d = (d<<30)|(d>>2);
10680ee5cbfSDavid du Colombier 
10780ee5cbfSDavid du Colombier 			x = wp[1] ^ wp[-4] ^ wp[-10] ^ wp[-12];
10880ee5cbfSDavid du Colombier 			wp[4] = (x<<1) | (x>>31);
10980ee5cbfSDavid du Colombier 			a += ((b<<5) | (b>>27)) + wp[4];
11080ee5cbfSDavid du Colombier 			a += 0x6ed9eba1 + (c^d^e);
11180ee5cbfSDavid du Colombier 			c = (c<<30)|(c>>2);
11280ee5cbfSDavid du Colombier 		}
11380ee5cbfSDavid du Colombier 
11480ee5cbfSDavid du Colombier 		wend = w + 60;
11580ee5cbfSDavid du Colombier 		for(; wp < wend; wp += 5){
11680ee5cbfSDavid du Colombier 			x = wp[-3] ^ wp[-8] ^ wp[-14] ^ wp[-16];
11780ee5cbfSDavid du Colombier 			wp[0] = (x<<1) | (x>>31);
11880ee5cbfSDavid du Colombier 			e += ((a<<5) | (a>>27)) + wp[0];
11980ee5cbfSDavid du Colombier 			e += 0x8f1bbcdc + ((b&c)|((b|c)&d));
12080ee5cbfSDavid du Colombier 			b = (b<<30)|(b>>2);
12180ee5cbfSDavid du Colombier 
12280ee5cbfSDavid du Colombier 			x = wp[-2] ^ wp[-7] ^ wp[-13] ^ wp[-15];
12380ee5cbfSDavid du Colombier 			wp[1] = (x<<1) | (x>>31);
12480ee5cbfSDavid du Colombier 			d += ((e<<5) | (e>>27)) + wp[1];
12580ee5cbfSDavid du Colombier 			d += 0x8f1bbcdc + ((a&b)|((a|b)&c));
12680ee5cbfSDavid du Colombier 			a = (a<<30)|(a>>2);
12780ee5cbfSDavid du Colombier 
12880ee5cbfSDavid du Colombier 			x = wp[-1] ^ wp[-6] ^ wp[-12] ^ wp[-14];
12980ee5cbfSDavid du Colombier 			wp[2] = (x<<1) | (x>>31);
13080ee5cbfSDavid du Colombier 			c += ((d<<5) | (d>>27)) + wp[2];
13180ee5cbfSDavid du Colombier 			c += 0x8f1bbcdc + ((e&a)|((e|a)&b));
13280ee5cbfSDavid du Colombier 			e = (e<<30)|(e>>2);
13380ee5cbfSDavid du Colombier 
13480ee5cbfSDavid du Colombier 			x = wp[0] ^ wp[-5] ^ wp[-11] ^ wp[-13];
13580ee5cbfSDavid du Colombier 			wp[3] = (x<<1) | (x>>31);
13680ee5cbfSDavid du Colombier 			b += ((c<<5) | (c>>27)) + wp[3];
13780ee5cbfSDavid du Colombier 			b += 0x8f1bbcdc + ((d&e)|((d|e)&a));
13880ee5cbfSDavid du Colombier 			d = (d<<30)|(d>>2);
13980ee5cbfSDavid du Colombier 
14080ee5cbfSDavid du Colombier 			x = wp[1] ^ wp[-4] ^ wp[-10] ^ wp[-12];
14180ee5cbfSDavid du Colombier 			wp[4] = (x<<1) | (x>>31);
14280ee5cbfSDavid du Colombier 			a += ((b<<5) | (b>>27)) + wp[4];
14380ee5cbfSDavid du Colombier 			a += 0x8f1bbcdc + ((c&d)|((c|d)&e));
14480ee5cbfSDavid du Colombier 			c = (c<<30)|(c>>2);
14580ee5cbfSDavid du Colombier 		}
14680ee5cbfSDavid du Colombier 
14780ee5cbfSDavid du Colombier 		wend = w + 80;
14880ee5cbfSDavid du Colombier 		for(; wp < wend; wp += 5){
14980ee5cbfSDavid du Colombier 			x = wp[-3] ^ wp[-8] ^ wp[-14] ^ wp[-16];
15080ee5cbfSDavid du Colombier 			wp[0] = (x<<1) | (x>>31);
15180ee5cbfSDavid du Colombier 			e += ((a<<5) | (a>>27)) + wp[0];
15280ee5cbfSDavid du Colombier 			e += 0xca62c1d6 + (b^c^d);
15380ee5cbfSDavid du Colombier 			b = (b<<30)|(b>>2);
15480ee5cbfSDavid du Colombier 
15580ee5cbfSDavid du Colombier 			x = wp[-2] ^ wp[-7] ^ wp[-13] ^ wp[-15];
15680ee5cbfSDavid du Colombier 			wp[1] = (x<<1) | (x>>31);
15780ee5cbfSDavid du Colombier 			d += ((e<<5) | (e>>27)) + wp[1];
15880ee5cbfSDavid du Colombier 			d += 0xca62c1d6 + (a^b^c);
15980ee5cbfSDavid du Colombier 			a = (a<<30)|(a>>2);
16080ee5cbfSDavid du Colombier 
16180ee5cbfSDavid du Colombier 			x = wp[-1] ^ wp[-6] ^ wp[-12] ^ wp[-14];
16280ee5cbfSDavid du Colombier 			wp[2] = (x<<1) | (x>>31);
16380ee5cbfSDavid du Colombier 			c += ((d<<5) | (d>>27)) + wp[2];
16480ee5cbfSDavid du Colombier 			c += 0xca62c1d6 + (e^a^b);
16580ee5cbfSDavid du Colombier 			e = (e<<30)|(e>>2);
16680ee5cbfSDavid du Colombier 
16780ee5cbfSDavid du Colombier 			x = wp[0] ^ wp[-5] ^ wp[-11] ^ wp[-13];
16880ee5cbfSDavid du Colombier 			wp[3] = (x<<1) | (x>>31);
16980ee5cbfSDavid du Colombier 			b += ((c<<5) | (c>>27)) + wp[3];
17080ee5cbfSDavid du Colombier 			b += 0xca62c1d6 + (d^e^a);
17180ee5cbfSDavid du Colombier 			d = (d<<30)|(d>>2);
17280ee5cbfSDavid du Colombier 
17380ee5cbfSDavid du Colombier 			x = wp[1] ^ wp[-4] ^ wp[-10] ^ wp[-12];
17480ee5cbfSDavid du Colombier 			wp[4] = (x<<1) | (x>>31);
17580ee5cbfSDavid du Colombier 			a += ((b<<5) | (b>>27)) + wp[4];
17680ee5cbfSDavid du Colombier 			a += 0xca62c1d6 + (c^d^e);
17780ee5cbfSDavid du Colombier 			c = (c<<30)|(c>>2);
17880ee5cbfSDavid du Colombier 		}
17980ee5cbfSDavid du Colombier 
18080ee5cbfSDavid du Colombier 		/* save state */
18180ee5cbfSDavid du Colombier 		s[0] += a;
18280ee5cbfSDavid du Colombier 		s[1] += b;
18380ee5cbfSDavid du Colombier 		s[2] += c;
18480ee5cbfSDavid du Colombier 		s[3] += d;
18580ee5cbfSDavid du Colombier 		s[4] += e;
18680ee5cbfSDavid du Colombier 	}
18780ee5cbfSDavid du Colombier }
188