github.com/grumpyhome/grumpy@v0.3.1-0.20201208125205-7b775405bdf1/grumpy-runtime-src/third_party/pypy/_sha512.py (about) 1 """ 2 This code was Ported from CPython's sha512module.c 3 """ 4 5 import _struct as struct 6 7 SHA_BLOCKSIZE = 128 8 SHA_DIGESTSIZE = 64 9 10 11 def new_shaobject(): 12 return { 13 'digest': [0]*8, 14 'count_lo': 0, 15 'count_hi': 0, 16 'data': [0]* SHA_BLOCKSIZE, 17 'local': 0, 18 'digestsize': 0 19 } 20 21 ROR64 = lambda x, y: (((x & 0xffffffffffffffff) >> (y & 63)) | (x << (64 - (y & 63)))) & 0xffffffffffffffff 22 Ch = lambda x, y, z: (z ^ (x & (y ^ z))) 23 Maj = lambda x, y, z: (((x | y) & z) | (x & y)) 24 S = lambda x, n: ROR64(x, n) 25 R = lambda x, n: (x & 0xffffffffffffffff) >> n 26 Sigma0 = lambda x: (S(x, 28) ^ S(x, 34) ^ S(x, 39)) 27 Sigma1 = lambda x: (S(x, 14) ^ S(x, 18) ^ S(x, 41)) 28 Gamma0 = lambda x: (S(x, 1) ^ S(x, 8) ^ R(x, 7)) 29 Gamma1 = lambda x: (S(x, 19) ^ S(x, 61) ^ R(x, 6)) 30 31 def sha_transform(sha_info): 32 W = [] 33 34 d = sha_info['data'] 35 for i in xrange(0,16): 36 W.append( (d[8*i]<<56) + (d[8*i+1]<<48) + (d[8*i+2]<<40) + (d[8*i+3]<<32) + (d[8*i+4]<<24) + (d[8*i+5]<<16) + (d[8*i+6]<<8) + d[8*i+7]) 37 38 for i in xrange(16,80): 39 W.append( (Gamma1(W[i - 2]) + W[i - 7] + Gamma0(W[i - 15]) + W[i - 16]) & 0xffffffffffffffff ) 40 41 ss = sha_info['digest'][:] 42 43 def RND(a,b,c,d,e,f,g,h,i,ki): 44 t0 = (h + Sigma1(e) + Ch(e, f, g) + ki + W[i]) & 0xffffffffffffffff 45 t1 = (Sigma0(a) + Maj(a, b, c)) & 0xffffffffffffffff 46 d = (d + t0) & 0xffffffffffffffff 47 h = (t0 + t1) & 0xffffffffffffffff 48 return d & 0xffffffffffffffff, h & 0xffffffffffffffff 49 50 ss[3], ss[7] = RND(ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],0,0x428a2f98d728ae22) 51 ss[2], ss[6] = RND(ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],1,0x7137449123ef65cd) 52 ss[1], ss[5] = RND(ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],2,0xb5c0fbcfec4d3b2f) 53 ss[0], ss[4] = RND(ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],3,0xe9b5dba58189dbbc) 54 ss[7], ss[3] = RND(ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],4,0x3956c25bf348b538) 55 ss[6], ss[2] = RND(ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],5,0x59f111f1b605d019) 56 ss[5], ss[1] = RND(ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],6,0x923f82a4af194f9b) 57 ss[4], ss[0] = RND(ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],7,0xab1c5ed5da6d8118) 58 ss[3], ss[7] = RND(ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],8,0xd807aa98a3030242) 59 ss[2], ss[6] = RND(ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],9,0x12835b0145706fbe) 60 ss[1], ss[5] = RND(ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],10,0x243185be4ee4b28c) 61 ss[0], ss[4] = RND(ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],11,0x550c7dc3d5ffb4e2) 62 ss[7], ss[3] = RND(ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],12,0x72be5d74f27b896f) 63 ss[6], ss[2] = RND(ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],13,0x80deb1fe3b1696b1) 64 ss[5], ss[1] = RND(ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],14,0x9bdc06a725c71235) 65 ss[4], ss[0] = RND(ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],15,0xc19bf174cf692694) 66 ss[3], ss[7] = RND(ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],16,0xe49b69c19ef14ad2) 67 ss[2], ss[6] = RND(ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],17,0xefbe4786384f25e3) 68 ss[1], ss[5] = RND(ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],18,0x0fc19dc68b8cd5b5) 69 ss[0], ss[4] = RND(ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],19,0x240ca1cc77ac9c65) 70 ss[7], ss[3] = RND(ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],20,0x2de92c6f592b0275) 71 ss[6], ss[2] = RND(ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],21,0x4a7484aa6ea6e483) 72 ss[5], ss[1] = RND(ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],22,0x5cb0a9dcbd41fbd4) 73 ss[4], ss[0] = RND(ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],23,0x76f988da831153b5) 74 ss[3], ss[7] = RND(ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],24,0x983e5152ee66dfab) 75 ss[2], ss[6] = RND(ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],25,0xa831c66d2db43210) 76 ss[1], ss[5] = RND(ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],26,0xb00327c898fb213f) 77 ss[0], ss[4] = RND(ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],27,0xbf597fc7beef0ee4) 78 ss[7], ss[3] = RND(ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],28,0xc6e00bf33da88fc2) 79 ss[6], ss[2] = RND(ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],29,0xd5a79147930aa725) 80 ss[5], ss[1] = RND(ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],30,0x06ca6351e003826f) 81 ss[4], ss[0] = RND(ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],31,0x142929670a0e6e70) 82 ss[3], ss[7] = RND(ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],32,0x27b70a8546d22ffc) 83 ss[2], ss[6] = RND(ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],33,0x2e1b21385c26c926) 84 ss[1], ss[5] = RND(ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],34,0x4d2c6dfc5ac42aed) 85 ss[0], ss[4] = RND(ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],35,0x53380d139d95b3df) 86 ss[7], ss[3] = RND(ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],36,0x650a73548baf63de) 87 ss[6], ss[2] = RND(ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],37,0x766a0abb3c77b2a8) 88 ss[5], ss[1] = RND(ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],38,0x81c2c92e47edaee6) 89 ss[4], ss[0] = RND(ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],39,0x92722c851482353b) 90 ss[3], ss[7] = RND(ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],40,0xa2bfe8a14cf10364) 91 ss[2], ss[6] = RND(ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],41,0xa81a664bbc423001) 92 ss[1], ss[5] = RND(ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],42,0xc24b8b70d0f89791) 93 ss[0], ss[4] = RND(ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],43,0xc76c51a30654be30) 94 ss[7], ss[3] = RND(ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],44,0xd192e819d6ef5218) 95 ss[6], ss[2] = RND(ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],45,0xd69906245565a910) 96 ss[5], ss[1] = RND(ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],46,0xf40e35855771202a) 97 ss[4], ss[0] = RND(ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],47,0x106aa07032bbd1b8) 98 ss[3], ss[7] = RND(ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],48,0x19a4c116b8d2d0c8) 99 ss[2], ss[6] = RND(ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],49,0x1e376c085141ab53) 100 ss[1], ss[5] = RND(ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],50,0x2748774cdf8eeb99) 101 ss[0], ss[4] = RND(ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],51,0x34b0bcb5e19b48a8) 102 ss[7], ss[3] = RND(ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],52,0x391c0cb3c5c95a63) 103 ss[6], ss[2] = RND(ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],53,0x4ed8aa4ae3418acb) 104 ss[5], ss[1] = RND(ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],54,0x5b9cca4f7763e373) 105 ss[4], ss[0] = RND(ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],55,0x682e6ff3d6b2b8a3) 106 ss[3], ss[7] = RND(ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],56,0x748f82ee5defb2fc) 107 ss[2], ss[6] = RND(ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],57,0x78a5636f43172f60) 108 ss[1], ss[5] = RND(ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],58,0x84c87814a1f0ab72) 109 ss[0], ss[4] = RND(ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],59,0x8cc702081a6439ec) 110 ss[7], ss[3] = RND(ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],60,0x90befffa23631e28) 111 ss[6], ss[2] = RND(ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],61,0xa4506cebde82bde9) 112 ss[5], ss[1] = RND(ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],62,0xbef9a3f7b2c67915) 113 ss[4], ss[0] = RND(ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],63,0xc67178f2e372532b) 114 ss[3], ss[7] = RND(ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],64,0xca273eceea26619c) 115 ss[2], ss[6] = RND(ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],65,0xd186b8c721c0c207) 116 ss[1], ss[5] = RND(ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],66,0xeada7dd6cde0eb1e) 117 ss[0], ss[4] = RND(ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],67,0xf57d4f7fee6ed178) 118 ss[7], ss[3] = RND(ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],68,0x06f067aa72176fba) 119 ss[6], ss[2] = RND(ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],69,0x0a637dc5a2c898a6) 120 ss[5], ss[1] = RND(ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],70,0x113f9804bef90dae) 121 ss[4], ss[0] = RND(ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],71,0x1b710b35131c471b) 122 ss[3], ss[7] = RND(ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],72,0x28db77f523047d84) 123 ss[2], ss[6] = RND(ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],73,0x32caab7b40c72493) 124 ss[1], ss[5] = RND(ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],74,0x3c9ebe0a15c9bebc) 125 ss[0], ss[4] = RND(ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],75,0x431d67c49c100d4c) 126 ss[7], ss[3] = RND(ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],76,0x4cc5d4becb3e42b6) 127 ss[6], ss[2] = RND(ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],77,0x597f299cfc657e2a) 128 ss[5], ss[1] = RND(ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],78,0x5fcb6fab3ad6faec) 129 ss[4], ss[0] = RND(ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],79,0x6c44198c4a475817) 130 131 dig = [] 132 for i, x in enumerate(sha_info['digest']): 133 dig.append( (x + ss[i]) & 0xffffffffffffffff ) 134 sha_info['digest'] = dig 135 136 def sha_init(): 137 sha_info = new_shaobject() 138 sha_info['digest'] = [ 0x6a09e667f3bcc908, 0xbb67ae8584caa73b, 0x3c6ef372fe94f82b, 0xa54ff53a5f1d36f1, 0x510e527fade682d1, 0x9b05688c2b3e6c1f, 0x1f83d9abfb41bd6b, 0x5be0cd19137e2179] 139 sha_info['count_lo'] = 0 140 sha_info['count_hi'] = 0 141 sha_info['local'] = 0 142 sha_info['digestsize'] = 64 143 return sha_info 144 145 def sha384_init(): 146 sha_info = new_shaobject() 147 sha_info['digest'] = [ 0xcbbb9d5dc1059ed8, 0x629a292a367cd507, 0x9159015a3070dd17, 0x152fecd8f70e5939, 0x67332667ffc00b31, 0x8eb44a8768581511, 0xdb0c2e0d64f98fa7, 0x47b5481dbefa4fa4] 148 sha_info['count_lo'] = 0 149 sha_info['count_hi'] = 0 150 sha_info['local'] = 0 151 sha_info['digestsize'] = 48 152 return sha_info 153 154 def getbuf(s): 155 if isinstance(s, str): 156 return s 157 elif isinstance(s, unicode): 158 return str(s) 159 else: 160 return buffer(s) 161 162 def sha_update(sha_info, buffer): 163 count = len(buffer) 164 buffer_idx = 0 165 clo = (sha_info['count_lo'] + (count << 3)) & 0xffffffff 166 if clo < sha_info['count_lo']: 167 sha_info['count_hi'] += 1 168 sha_info['count_lo'] = clo 169 170 sha_info['count_hi'] += (count >> 29) 171 172 if sha_info['local']: 173 i = SHA_BLOCKSIZE - sha_info['local'] 174 if i > count: 175 i = count 176 177 # copy buffer 178 for x in enumerate(buffer[buffer_idx:buffer_idx+i]): 179 sha_info['data'][sha_info['local']+x[0]] = struct.unpack('B', x[1])[0] 180 181 count -= i 182 buffer_idx += i 183 184 sha_info['local'] += i 185 if sha_info['local'] == SHA_BLOCKSIZE: 186 sha_transform(sha_info) 187 sha_info['local'] = 0 188 else: 189 return 190 191 while count >= SHA_BLOCKSIZE: 192 # copy buffer 193 sha_info['data'] = [struct.unpack('B',c)[0] for c in buffer[buffer_idx:buffer_idx + SHA_BLOCKSIZE]] 194 count -= SHA_BLOCKSIZE 195 buffer_idx += SHA_BLOCKSIZE 196 sha_transform(sha_info) 197 198 # copy buffer 199 pos = sha_info['local'] 200 sha_info['data'][pos:pos+count] = [struct.unpack('B',c)[0] for c in buffer[buffer_idx:buffer_idx + count]] 201 sha_info['local'] = count 202 203 def sha_final(sha_info): 204 lo_bit_count = sha_info['count_lo'] 205 hi_bit_count = sha_info['count_hi'] 206 count = (lo_bit_count >> 3) & 0x7f 207 sha_info['data'][count] = 0x80; 208 count += 1 209 if count > SHA_BLOCKSIZE - 16: 210 # zero the bytes in data after the count 211 sha_info['data'] = sha_info['data'][:count] + ([0] * (SHA_BLOCKSIZE - count)) 212 sha_transform(sha_info) 213 # zero bytes in data 214 sha_info['data'] = [0] * SHA_BLOCKSIZE 215 else: 216 sha_info['data'] = sha_info['data'][:count] + ([0] * (SHA_BLOCKSIZE - count)) 217 218 sha_info['data'][112] = 0; 219 sha_info['data'][113] = 0; 220 sha_info['data'][114] = 0; 221 sha_info['data'][115] = 0; 222 sha_info['data'][116] = 0; 223 sha_info['data'][117] = 0; 224 sha_info['data'][118] = 0; 225 sha_info['data'][119] = 0; 226 227 sha_info['data'][120] = (hi_bit_count >> 24) & 0xff 228 sha_info['data'][121] = (hi_bit_count >> 16) & 0xff 229 sha_info['data'][122] = (hi_bit_count >> 8) & 0xff 230 sha_info['data'][123] = (hi_bit_count >> 0) & 0xff 231 sha_info['data'][124] = (lo_bit_count >> 24) & 0xff 232 sha_info['data'][125] = (lo_bit_count >> 16) & 0xff 233 sha_info['data'][126] = (lo_bit_count >> 8) & 0xff 234 sha_info['data'][127] = (lo_bit_count >> 0) & 0xff 235 236 sha_transform(sha_info) 237 238 dig = [] 239 for i in sha_info['digest']: 240 dig.extend([ ((i>>56) & 0xff), ((i>>48) & 0xff), ((i>>40) & 0xff), ((i>>32) & 0xff), ((i>>24) & 0xff), ((i>>16) & 0xff), ((i>>8) & 0xff), (i & 0xff) ]) 241 return ''.join([chr(i) for i in dig]) 242 243 class sha512(object): 244 digest_size = digestsize = SHA_DIGESTSIZE 245 block_size = SHA_BLOCKSIZE 246 247 def __init__(self, s=None): 248 self._sha = sha_init() 249 if s: 250 sha_update(self._sha, getbuf(s)) 251 252 def update(self, s): 253 sha_update(self._sha, getbuf(s)) 254 255 def digest(self): 256 return sha_final(self._sha.copy())[:self._sha['digestsize']] 257 258 def hexdigest(self): 259 return ''.join([('0%x' % ord(i))[-2:] for i in self.digest()]) 260 261 def copy(self): 262 new = sha512.__new__(sha512) 263 new._sha = self._sha.copy() 264 return new 265 266 class sha384(sha512): 267 digest_size = digestsize = 48 268 269 def __init__(self, s=None): 270 self._sha = sha384_init() 271 if s: 272 sha_update(self._sha, getbuf(s)) 273 274 def copy(self): 275 new = sha384.__new__(sha384) 276 new._sha = self._sha.copy() 277 return new 278 279 def test(): 280 # import _sha512 281 282 a_str = "just a test string" 283 284 assert sha512().hexdigest() == sha512().hexdigest() 285 assert sha512(a_str).hexdigest() == sha512(a_str).hexdigest() 286 assert sha512(a_str*7).hexdigest() == sha512(a_str*7).hexdigest() 287 288 s = sha512(a_str) 289 s.update(a_str) 290 assert sha512(a_str+a_str).hexdigest() == s.hexdigest() 291 292 if __name__ == "__main__": 293 test()