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