Skip to content

Commit 6c0c7f8

Browse files
committed
hashlib: Import pure-Python sha256/512 algos from pypy3-2.4.0-src.tar.bz2 .
1 parent 24d3e81 commit 6c0c7f8

File tree

2 files changed

+540
-0
lines changed

2 files changed

+540
-0
lines changed

hashlib/hashlib/sha256.py

Lines changed: 256 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,256 @@
1+
SHA_BLOCKSIZE = 64
2+
SHA_DIGESTSIZE = 32
3+
4+
5+
def new_shaobject():
6+
return {
7+
'digest': [0]*8,
8+
'count_lo': 0,
9+
'count_hi': 0,
10+
'data': [0]* SHA_BLOCKSIZE,
11+
'local': 0,
12+
'digestsize': 0
13+
}
14+
15+
ROR = lambda x, y: (((x & 0xffffffff) >> (y & 31)) | (x << (32 - (y & 31)))) & 0xffffffff
16+
Ch = lambda x, y, z: (z ^ (x & (y ^ z)))
17+
Maj = lambda x, y, z: (((x | y) & z) | (x & y))
18+
S = lambda x, n: ROR(x, n)
19+
R = lambda x, n: (x & 0xffffffff) >> n
20+
Sigma0 = lambda x: (S(x, 2) ^ S(x, 13) ^ S(x, 22))
21+
Sigma1 = lambda x: (S(x, 6) ^ S(x, 11) ^ S(x, 25))
22+
Gamma0 = lambda x: (S(x, 7) ^ S(x, 18) ^ R(x, 3))
23+
Gamma1 = lambda x: (S(x, 17) ^ S(x, 19) ^ R(x, 10))
24+
25+
def sha_transform(sha_info):
26+
W = []
27+
28+
d = sha_info['data']
29+
for i in range(0,16):
30+
W.append( (d[4*i]<<24) + (d[4*i+1]<<16) + (d[4*i+2]<<8) + d[4*i+3])
31+
32+
for i in range(16,64):
33+
W.append( (Gamma1(W[i - 2]) + W[i - 7] + Gamma0(W[i - 15]) + W[i - 16]) & 0xffffffff )
34+
35+
ss = sha_info['digest'][:]
36+
37+
def RND(a,b,c,d,e,f,g,h,i,ki):
38+
t0 = h + Sigma1(e) + Ch(e, f, g) + ki + W[i];
39+
t1 = Sigma0(a) + Maj(a, b, c);
40+
d += t0;
41+
h = t0 + t1;
42+
return d & 0xffffffff, h & 0xffffffff
43+
44+
ss[3], ss[7] = RND(ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],0,0x428a2f98);
45+
ss[2], ss[6] = RND(ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],1,0x71374491);
46+
ss[1], ss[5] = RND(ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],2,0xb5c0fbcf);
47+
ss[0], ss[4] = RND(ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],3,0xe9b5dba5);
48+
ss[7], ss[3] = RND(ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],4,0x3956c25b);
49+
ss[6], ss[2] = RND(ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],5,0x59f111f1);
50+
ss[5], ss[1] = RND(ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],6,0x923f82a4);
51+
ss[4], ss[0] = RND(ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],7,0xab1c5ed5);
52+
ss[3], ss[7] = RND(ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],8,0xd807aa98);
53+
ss[2], ss[6] = RND(ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],9,0x12835b01);
54+
ss[1], ss[5] = RND(ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],10,0x243185be);
55+
ss[0], ss[4] = RND(ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],11,0x550c7dc3);
56+
ss[7], ss[3] = RND(ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],12,0x72be5d74);
57+
ss[6], ss[2] = RND(ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],13,0x80deb1fe);
58+
ss[5], ss[1] = RND(ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],14,0x9bdc06a7);
59+
ss[4], ss[0] = RND(ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],15,0xc19bf174);
60+
ss[3], ss[7] = RND(ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],16,0xe49b69c1);
61+
ss[2], ss[6] = RND(ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],17,0xefbe4786);
62+
ss[1], ss[5] = RND(ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],18,0x0fc19dc6);
63+
ss[0], ss[4] = RND(ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],19,0x240ca1cc);
64+
ss[7], ss[3] = RND(ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],20,0x2de92c6f);
65+
ss[6], ss[2] = RND(ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],21,0x4a7484aa);
66+
ss[5], ss[1] = RND(ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],22,0x5cb0a9dc);
67+
ss[4], ss[0] = RND(ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],23,0x76f988da);
68+
ss[3], ss[7] = RND(ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],24,0x983e5152);
69+
ss[2], ss[6] = RND(ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],25,0xa831c66d);
70+
ss[1], ss[5] = RND(ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],26,0xb00327c8);
71+
ss[0], ss[4] = RND(ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],27,0xbf597fc7);
72+
ss[7], ss[3] = RND(ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],28,0xc6e00bf3);
73+
ss[6], ss[2] = RND(ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],29,0xd5a79147);
74+
ss[5], ss[1] = RND(ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],30,0x06ca6351);
75+
ss[4], ss[0] = RND(ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],31,0x14292967);
76+
ss[3], ss[7] = RND(ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],32,0x27b70a85);
77+
ss[2], ss[6] = RND(ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],33,0x2e1b2138);
78+
ss[1], ss[5] = RND(ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],34,0x4d2c6dfc);
79+
ss[0], ss[4] = RND(ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],35,0x53380d13);
80+
ss[7], ss[3] = RND(ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],36,0x650a7354);
81+
ss[6], ss[2] = RND(ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],37,0x766a0abb);
82+
ss[5], ss[1] = RND(ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],38,0x81c2c92e);
83+
ss[4], ss[0] = RND(ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],39,0x92722c85);
84+
ss[3], ss[7] = RND(ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],40,0xa2bfe8a1);
85+
ss[2], ss[6] = RND(ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],41,0xa81a664b);
86+
ss[1], ss[5] = RND(ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],42,0xc24b8b70);
87+
ss[0], ss[4] = RND(ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],43,0xc76c51a3);
88+
ss[7], ss[3] = RND(ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],44,0xd192e819);
89+
ss[6], ss[2] = RND(ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],45,0xd6990624);
90+
ss[5], ss[1] = RND(ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],46,0xf40e3585);
91+
ss[4], ss[0] = RND(ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],47,0x106aa070);
92+
ss[3], ss[7] = RND(ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],48,0x19a4c116);
93+
ss[2], ss[6] = RND(ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],49,0x1e376c08);
94+
ss[1], ss[5] = RND(ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],50,0x2748774c);
95+
ss[0], ss[4] = RND(ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],51,0x34b0bcb5);
96+
ss[7], ss[3] = RND(ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],52,0x391c0cb3);
97+
ss[6], ss[2] = RND(ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],53,0x4ed8aa4a);
98+
ss[5], ss[1] = RND(ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],54,0x5b9cca4f);
99+
ss[4], ss[0] = RND(ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],55,0x682e6ff3);
100+
ss[3], ss[7] = RND(ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],56,0x748f82ee);
101+
ss[2], ss[6] = RND(ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],57,0x78a5636f);
102+
ss[1], ss[5] = RND(ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],ss[5],58,0x84c87814);
103+
ss[0], ss[4] = RND(ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],ss[4],59,0x8cc70208);
104+
ss[7], ss[3] = RND(ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],ss[3],60,0x90befffa);
105+
ss[6], ss[2] = RND(ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],ss[2],61,0xa4506ceb);
106+
ss[5], ss[1] = RND(ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],ss[1],62,0xbef9a3f7);
107+
ss[4], ss[0] = RND(ss[1],ss[2],ss[3],ss[4],ss[5],ss[6],ss[7],ss[0],63,0xc67178f2);
108+
109+
dig = []
110+
for i, x in enumerate(sha_info['digest']):
111+
dig.append( (x + ss[i]) & 0xffffffff )
112+
sha_info['digest'] = dig
113+
114+
def sha_init():
115+
sha_info = new_shaobject()
116+
sha_info['digest'] = [0x6A09E667, 0xBB67AE85, 0x3C6EF372, 0xA54FF53A, 0x510E527F, 0x9B05688C, 0x1F83D9AB, 0x5BE0CD19]
117+
sha_info['count_lo'] = 0
118+
sha_info['count_hi'] = 0
119+
sha_info['local'] = 0
120+
sha_info['digestsize'] = 32
121+
return sha_info
122+
123+
def sha224_init():
124+
sha_info = new_shaobject()
125+
sha_info['digest'] = [0xc1059ed8, 0x367cd507, 0x3070dd17, 0xf70e5939, 0xffc00b31, 0x68581511, 0x64f98fa7, 0xbefa4fa4]
126+
sha_info['count_lo'] = 0
127+
sha_info['count_hi'] = 0
128+
sha_info['local'] = 0
129+
sha_info['digestsize'] = 28
130+
return sha_info
131+
132+
def sha_update(sha_info, buffer):
133+
if isinstance(buffer, str):
134+
raise TypeError("Unicode strings must be encoded before hashing")
135+
count = len(buffer)
136+
buffer_idx = 0
137+
clo = (sha_info['count_lo'] + (count << 3)) & 0xffffffff
138+
if clo < sha_info['count_lo']:
139+
sha_info['count_hi'] += 1
140+
sha_info['count_lo'] = clo
141+
142+
sha_info['count_hi'] += (count >> 29)
143+
144+
if sha_info['local']:
145+
i = SHA_BLOCKSIZE - sha_info['local']
146+
if i > count:
147+
i = count
148+
149+
# copy buffer
150+
sha_info['data'][sha_info['local']:sha_info['local']+i] = buffer[buffer_idx:buffer_idx+i]
151+
152+
count -= i
153+
buffer_idx += i
154+
155+
sha_info['local'] += i
156+
if sha_info['local'] == SHA_BLOCKSIZE:
157+
sha_transform(sha_info)
158+
sha_info['local'] = 0
159+
else:
160+
return
161+
162+
while count >= SHA_BLOCKSIZE:
163+
# copy buffer
164+
sha_info['data'] = list(buffer[buffer_idx:buffer_idx + SHA_BLOCKSIZE])
165+
count -= SHA_BLOCKSIZE
166+
buffer_idx += SHA_BLOCKSIZE
167+
sha_transform(sha_info)
168+
169+
170+
# copy buffer
171+
pos = sha_info['local']
172+
sha_info['data'][pos:pos+count] = buffer[buffer_idx:buffer_idx + count]
173+
sha_info['local'] = count
174+
175+
def sha_final(sha_info):
176+
lo_bit_count = sha_info['count_lo']
177+
hi_bit_count = sha_info['count_hi']
178+
count = (lo_bit_count >> 3) & 0x3f
179+
sha_info['data'][count] = 0x80;
180+
count += 1
181+
if count > SHA_BLOCKSIZE - 8:
182+
# zero the bytes in data after the count
183+
sha_info['data'] = sha_info['data'][:count] + ([0] * (SHA_BLOCKSIZE - count))
184+
sha_transform(sha_info)
185+
# zero bytes in data
186+
sha_info['data'] = [0] * SHA_BLOCKSIZE
187+
else:
188+
sha_info['data'] = sha_info['data'][:count] + ([0] * (SHA_BLOCKSIZE - count))
189+
190+
sha_info['data'][56] = (hi_bit_count >> 24) & 0xff
191+
sha_info['data'][57] = (hi_bit_count >> 16) & 0xff
192+
sha_info['data'][58] = (hi_bit_count >> 8) & 0xff
193+
sha_info['data'][59] = (hi_bit_count >> 0) & 0xff
194+
sha_info['data'][60] = (lo_bit_count >> 24) & 0xff
195+
sha_info['data'][61] = (lo_bit_count >> 16) & 0xff
196+
sha_info['data'][62] = (lo_bit_count >> 8) & 0xff
197+
sha_info['data'][63] = (lo_bit_count >> 0) & 0xff
198+
199+
sha_transform(sha_info)
200+
201+
dig = []
202+
for i in sha_info['digest']:
203+
dig.extend([ ((i>>24) & 0xff), ((i>>16) & 0xff), ((i>>8) & 0xff), (i & 0xff) ])
204+
return ''.join([chr(i) for i in dig])
205+
206+
class sha256(object):
207+
digest_size = digestsize = SHA_DIGESTSIZE
208+
block_size = SHA_BLOCKSIZE
209+
210+
def __init__(self, s=None):
211+
self._sha = sha_init()
212+
if s:
213+
sha_update(self._sha, s)
214+
215+
def update(self, s):
216+
sha_update(self._sha, s)
217+
218+
def digest(self):
219+
return sha_final(self._sha.copy())[:self._sha['digestsize']]
220+
221+
def hexdigest(self):
222+
return ''.join(['%.2x' % ord(i) for i in self.digest()])
223+
224+
def copy(self):
225+
new = sha256.__new__(sha256)
226+
new._sha = self._sha.copy()
227+
return new
228+
229+
class sha224(sha256):
230+
digest_size = digestsize = 28
231+
232+
def __init__(self, s=None):
233+
self._sha = sha224_init()
234+
if s:
235+
sha_update(self._sha, s)
236+
237+
def copy(self):
238+
new = sha224.__new__(sha224)
239+
new._sha = self._sha.copy()
240+
return new
241+
242+
def test():
243+
a_str = "just a test string"
244+
245+
assert 'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855' == sha256().hexdigest()
246+
assert 'd7b553c6f09ac85d142415f857c5310f3bbbe7cdd787cce4b985acedd585266f' == sha256(a_str).hexdigest()
247+
assert '8113ebf33c97daa9998762aacafe750c7cefc2b2f173c90c59663a57fe626f21' == sha256(a_str*7).hexdigest()
248+
249+
s = sha256(a_str)
250+
s.update(a_str)
251+
assert '03d9963e05a094593190b6fc794cb1a3e1ac7d7883f0b5855268afeccc70d461' == s.hexdigest()
252+
253+
if __name__ == "__main__":
254+
test()
255+
256+

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy