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