1*8ccd4a63SDavid du Colombier #include "os.h"
29b943567SDavid du Colombier
39b943567SDavid du Colombier void
_sha1block(uchar * p,ulong len,u32int * s)49b943567SDavid du Colombier _sha1block(uchar *p, ulong len, u32int *s)
59b943567SDavid du Colombier {
69b943567SDavid du Colombier u32int a, b, c, d, e, x;
79b943567SDavid du Colombier uchar *end;
89b943567SDavid du Colombier u32int *wp, *wend;
99b943567SDavid du Colombier u32int w[80];
109b943567SDavid du Colombier
119b943567SDavid du Colombier /* at this point, we have a multiple of 64 bytes */
129b943567SDavid du Colombier for(end = p+len; p < end;){
139b943567SDavid du Colombier a = s[0];
149b943567SDavid du Colombier b = s[1];
159b943567SDavid du Colombier c = s[2];
169b943567SDavid du Colombier d = s[3];
179b943567SDavid du Colombier e = s[4];
189b943567SDavid du Colombier
199b943567SDavid du Colombier wend = w + 15;
209b943567SDavid du Colombier for(wp = w; wp < wend; wp += 5){
219b943567SDavid du Colombier wp[0] = (p[0]<<24) | (p[1]<<16) | (p[2]<<8) | p[3];
229b943567SDavid du Colombier e += ((a<<5) | (a>>27)) + wp[0];
239b943567SDavid du Colombier e += 0x5a827999 + (((c^d)&b)^d);
249b943567SDavid du Colombier b = (b<<30)|(b>>2);
259b943567SDavid du Colombier
269b943567SDavid du Colombier wp[1] = (p[4]<<24) | (p[5]<<16) | (p[6]<<8) | p[7];
279b943567SDavid du Colombier d += ((e<<5) | (e>>27)) + wp[1];
289b943567SDavid du Colombier d += 0x5a827999 + (((b^c)&a)^c);
299b943567SDavid du Colombier a = (a<<30)|(a>>2);
309b943567SDavid du Colombier
319b943567SDavid du Colombier wp[2] = (p[8]<<24) | (p[9]<<16) | (p[10]<<8) | p[11];
329b943567SDavid du Colombier c += ((d<<5) | (d>>27)) + wp[2];
339b943567SDavid du Colombier c += 0x5a827999 + (((a^b)&e)^b);
349b943567SDavid du Colombier e = (e<<30)|(e>>2);
359b943567SDavid du Colombier
369b943567SDavid du Colombier wp[3] = (p[12]<<24) | (p[13]<<16) | (p[14]<<8) | p[15];
379b943567SDavid du Colombier b += ((c<<5) | (c>>27)) + wp[3];
389b943567SDavid du Colombier b += 0x5a827999 + (((e^a)&d)^a);
399b943567SDavid du Colombier d = (d<<30)|(d>>2);
409b943567SDavid du Colombier
419b943567SDavid du Colombier wp[4] = (p[16]<<24) | (p[17]<<16) | (p[18]<<8) | p[19];
429b943567SDavid du Colombier a += ((b<<5) | (b>>27)) + wp[4];
439b943567SDavid du Colombier a += 0x5a827999 + (((d^e)&c)^e);
449b943567SDavid du Colombier c = (c<<30)|(c>>2);
459b943567SDavid du Colombier
469b943567SDavid du Colombier p += 20;
479b943567SDavid du Colombier }
489b943567SDavid du Colombier
499b943567SDavid du Colombier wp[0] = (p[0]<<24) | (p[1]<<16) | (p[2]<<8) | p[3];
509b943567SDavid du Colombier e += ((a<<5) | (a>>27)) + wp[0];
519b943567SDavid du Colombier e += 0x5a827999 + (((c^d)&b)^d);
529b943567SDavid du Colombier b = (b<<30)|(b>>2);
539b943567SDavid du Colombier
549b943567SDavid du Colombier x = wp[-2] ^ wp[-7] ^ wp[-13] ^ wp[-15];
559b943567SDavid du Colombier wp[1] = (x<<1) | (x>>31);
569b943567SDavid du Colombier d += ((e<<5) | (e>>27)) + wp[1];
579b943567SDavid du Colombier d += 0x5a827999 + (((b^c)&a)^c);
589b943567SDavid du Colombier a = (a<<30)|(a>>2);
599b943567SDavid du Colombier
609b943567SDavid du Colombier x = wp[-1] ^ wp[-6] ^ wp[-12] ^ wp[-14];
619b943567SDavid du Colombier wp[2] = (x<<1) | (x>>31);
629b943567SDavid du Colombier c += ((d<<5) | (d>>27)) + wp[2];
639b943567SDavid du Colombier c += 0x5a827999 + (((a^b)&e)^b);
649b943567SDavid du Colombier e = (e<<30)|(e>>2);
659b943567SDavid du Colombier
669b943567SDavid du Colombier x = wp[0] ^ wp[-5] ^ wp[-11] ^ wp[-13];
679b943567SDavid du Colombier wp[3] = (x<<1) | (x>>31);
689b943567SDavid du Colombier b += ((c<<5) | (c>>27)) + wp[3];
699b943567SDavid du Colombier b += 0x5a827999 + (((e^a)&d)^a);
709b943567SDavid du Colombier d = (d<<30)|(d>>2);
719b943567SDavid du Colombier
729b943567SDavid du Colombier x = wp[1] ^ wp[-4] ^ wp[-10] ^ wp[-12];
739b943567SDavid du Colombier wp[4] = (x<<1) | (x>>31);
749b943567SDavid du Colombier a += ((b<<5) | (b>>27)) + wp[4];
759b943567SDavid du Colombier a += 0x5a827999 + (((d^e)&c)^e);
769b943567SDavid du Colombier c = (c<<30)|(c>>2);
779b943567SDavid du Colombier
789b943567SDavid du Colombier wp += 5;
799b943567SDavid du Colombier p += 4;
809b943567SDavid du Colombier
819b943567SDavid du Colombier wend = w + 40;
829b943567SDavid du Colombier for(; wp < wend; wp += 5){
839b943567SDavid du Colombier x = wp[-3] ^ wp[-8] ^ wp[-14] ^ wp[-16];
849b943567SDavid du Colombier wp[0] = (x<<1) | (x>>31);
859b943567SDavid du Colombier e += ((a<<5) | (a>>27)) + wp[0];
869b943567SDavid du Colombier e += 0x6ed9eba1 + (b^c^d);
879b943567SDavid du Colombier b = (b<<30)|(b>>2);
889b943567SDavid du Colombier
899b943567SDavid du Colombier x = wp[-2] ^ wp[-7] ^ wp[-13] ^ wp[-15];
909b943567SDavid du Colombier wp[1] = (x<<1) | (x>>31);
919b943567SDavid du Colombier d += ((e<<5) | (e>>27)) + wp[1];
929b943567SDavid du Colombier d += 0x6ed9eba1 + (a^b^c);
939b943567SDavid du Colombier a = (a<<30)|(a>>2);
949b943567SDavid du Colombier
959b943567SDavid du Colombier x = wp[-1] ^ wp[-6] ^ wp[-12] ^ wp[-14];
969b943567SDavid du Colombier wp[2] = (x<<1) | (x>>31);
979b943567SDavid du Colombier c += ((d<<5) | (d>>27)) + wp[2];
989b943567SDavid du Colombier c += 0x6ed9eba1 + (e^a^b);
999b943567SDavid du Colombier e = (e<<30)|(e>>2);
1009b943567SDavid du Colombier
1019b943567SDavid du Colombier x = wp[0] ^ wp[-5] ^ wp[-11] ^ wp[-13];
1029b943567SDavid du Colombier wp[3] = (x<<1) | (x>>31);
1039b943567SDavid du Colombier b += ((c<<5) | (c>>27)) + wp[3];
1049b943567SDavid du Colombier b += 0x6ed9eba1 + (d^e^a);
1059b943567SDavid du Colombier d = (d<<30)|(d>>2);
1069b943567SDavid du Colombier
1079b943567SDavid du Colombier x = wp[1] ^ wp[-4] ^ wp[-10] ^ wp[-12];
1089b943567SDavid du Colombier wp[4] = (x<<1) | (x>>31);
1099b943567SDavid du Colombier a += ((b<<5) | (b>>27)) + wp[4];
1109b943567SDavid du Colombier a += 0x6ed9eba1 + (c^d^e);
1119b943567SDavid du Colombier c = (c<<30)|(c>>2);
1129b943567SDavid du Colombier }
1139b943567SDavid du Colombier
1149b943567SDavid du Colombier wend = w + 60;
1159b943567SDavid du Colombier for(; wp < wend; wp += 5){
1169b943567SDavid du Colombier x = wp[-3] ^ wp[-8] ^ wp[-14] ^ wp[-16];
1179b943567SDavid du Colombier wp[0] = (x<<1) | (x>>31);
1189b943567SDavid du Colombier e += ((a<<5) | (a>>27)) + wp[0];
1199b943567SDavid du Colombier e += 0x8f1bbcdc + ((b&c)|((b|c)&d));
1209b943567SDavid du Colombier b = (b<<30)|(b>>2);
1219b943567SDavid du Colombier
1229b943567SDavid du Colombier x = wp[-2] ^ wp[-7] ^ wp[-13] ^ wp[-15];
1239b943567SDavid du Colombier wp[1] = (x<<1) | (x>>31);
1249b943567SDavid du Colombier d += ((e<<5) | (e>>27)) + wp[1];
1259b943567SDavid du Colombier d += 0x8f1bbcdc + ((a&b)|((a|b)&c));
1269b943567SDavid du Colombier a = (a<<30)|(a>>2);
1279b943567SDavid du Colombier
1289b943567SDavid du Colombier x = wp[-1] ^ wp[-6] ^ wp[-12] ^ wp[-14];
1299b943567SDavid du Colombier wp[2] = (x<<1) | (x>>31);
1309b943567SDavid du Colombier c += ((d<<5) | (d>>27)) + wp[2];
1319b943567SDavid du Colombier c += 0x8f1bbcdc + ((e&a)|((e|a)&b));
1329b943567SDavid du Colombier e = (e<<30)|(e>>2);
1339b943567SDavid du Colombier
1349b943567SDavid du Colombier x = wp[0] ^ wp[-5] ^ wp[-11] ^ wp[-13];
1359b943567SDavid du Colombier wp[3] = (x<<1) | (x>>31);
1369b943567SDavid du Colombier b += ((c<<5) | (c>>27)) + wp[3];
1379b943567SDavid du Colombier b += 0x8f1bbcdc + ((d&e)|((d|e)&a));
1389b943567SDavid du Colombier d = (d<<30)|(d>>2);
1399b943567SDavid du Colombier
1409b943567SDavid du Colombier x = wp[1] ^ wp[-4] ^ wp[-10] ^ wp[-12];
1419b943567SDavid du Colombier wp[4] = (x<<1) | (x>>31);
1429b943567SDavid du Colombier a += ((b<<5) | (b>>27)) + wp[4];
1439b943567SDavid du Colombier a += 0x8f1bbcdc + ((c&d)|((c|d)&e));
1449b943567SDavid du Colombier c = (c<<30)|(c>>2);
1459b943567SDavid du Colombier }
1469b943567SDavid du Colombier
1479b943567SDavid du Colombier wend = w + 80;
1489b943567SDavid du Colombier for(; wp < wend; wp += 5){
1499b943567SDavid du Colombier x = wp[-3] ^ wp[-8] ^ wp[-14] ^ wp[-16];
1509b943567SDavid du Colombier wp[0] = (x<<1) | (x>>31);
1519b943567SDavid du Colombier e += ((a<<5) | (a>>27)) + wp[0];
1529b943567SDavid du Colombier e += 0xca62c1d6 + (b^c^d);
1539b943567SDavid du Colombier b = (b<<30)|(b>>2);
1549b943567SDavid du Colombier
1559b943567SDavid du Colombier x = wp[-2] ^ wp[-7] ^ wp[-13] ^ wp[-15];
1569b943567SDavid du Colombier wp[1] = (x<<1) | (x>>31);
1579b943567SDavid du Colombier d += ((e<<5) | (e>>27)) + wp[1];
1589b943567SDavid du Colombier d += 0xca62c1d6 + (a^b^c);
1599b943567SDavid du Colombier a = (a<<30)|(a>>2);
1609b943567SDavid du Colombier
1619b943567SDavid du Colombier x = wp[-1] ^ wp[-6] ^ wp[-12] ^ wp[-14];
1629b943567SDavid du Colombier wp[2] = (x<<1) | (x>>31);
1639b943567SDavid du Colombier c += ((d<<5) | (d>>27)) + wp[2];
1649b943567SDavid du Colombier c += 0xca62c1d6 + (e^a^b);
1659b943567SDavid du Colombier e = (e<<30)|(e>>2);
1669b943567SDavid du Colombier
1679b943567SDavid du Colombier x = wp[0] ^ wp[-5] ^ wp[-11] ^ wp[-13];
1689b943567SDavid du Colombier wp[3] = (x<<1) | (x>>31);
1699b943567SDavid du Colombier b += ((c<<5) | (c>>27)) + wp[3];
1709b943567SDavid du Colombier b += 0xca62c1d6 + (d^e^a);
1719b943567SDavid du Colombier d = (d<<30)|(d>>2);
1729b943567SDavid du Colombier
1739b943567SDavid du Colombier x = wp[1] ^ wp[-4] ^ wp[-10] ^ wp[-12];
1749b943567SDavid du Colombier wp[4] = (x<<1) | (x>>31);
1759b943567SDavid du Colombier a += ((b<<5) | (b>>27)) + wp[4];
1769b943567SDavid du Colombier a += 0xca62c1d6 + (c^d^e);
1779b943567SDavid du Colombier c = (c<<30)|(c>>2);
1789b943567SDavid du Colombier }
1799b943567SDavid du Colombier
1809b943567SDavid du Colombier /* save state */
1819b943567SDavid du Colombier s[0] += a;
1829b943567SDavid du Colombier s[1] += b;
1839b943567SDavid du Colombier s[2] += c;
1849b943567SDavid du Colombier s[3] += d;
1859b943567SDavid du Colombier s[4] += e;
1869b943567SDavid du Colombier }
1879b943567SDavid du Colombier }
188