]>
jfr.im git - irc/quakenet/newserv.git/blob - chanserv/batcher/sha256.py
2 __author__
= 'Thomas Dixon'
5 import copy
, struct
, sys
11 _k
= (0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5,
12 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,
13 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3,
14 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,
15 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc,
16 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,
17 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7,
18 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,
19 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13,
20 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,
21 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3,
22 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,
23 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5,
24 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,
25 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208,
26 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2)
27 _h
= (0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a,
28 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19)
34 def __init__(self
, m
=None):
39 if type(m
) is not str:
40 raise TypeError, '%s() argument 1 must be string, not %s' % (self
.__class
__.__name
__, type(m
).__name
__)
43 def _rotr(self
, x
, y
):
44 return ((x
>> y
) |
(x
<< (32-y
))) & 0xFFFFFFFF
46 def _sha256_process(self
, c
):
48 w
[0:15] = struct
.unpack('!16L', c
)
50 for i
in range(16, 64):
51 s0
= self
._rotr
(w
[i
-15], 7) ^ self
._rotr
(w
[i
-15], 18) ^
(w
[i
-15] >> 3)
52 s1
= self
._rotr
(w
[i
-2], 17) ^ self
._rotr
(w
[i
-2], 19) ^
(w
[i
-2] >> 10)
53 w
[i
] = (w
[i
-16] + s0
+ w
[i
-7] + s1
) & 0xFFFFFFFF
55 a
,b
,c
,d
,e
,f
,g
,h
= self
._h
58 s0
= self
._rotr
(a
, 2) ^ self
._rotr
(a
, 13) ^ self
._rotr
(a
, 22)
59 maj
= (a
& b
) ^
(a
& c
) ^
(b
& c
)
61 s1
= self
._rotr
(e
, 6) ^ self
._rotr
(e
, 11) ^ self
._rotr
(e
, 25)
62 ch
= (e
& f
) ^
((~e
) & g
)
63 t1
= h
+ s1
+ ch
+ self
._k
[i
] + w
[i
]
68 e
= (d
+ t1
) & 0xFFFFFFFF
72 a
= (t1
+ t2
) & 0xFFFFFFFF
74 self
._h
= [(x
+y
) & 0xFFFFFFFF for x
,y
in zip(self
._h
, [a
,b
,c
,d
,e
,f
,g
,h
])]
79 if type(m
) is not str:
80 raise TypeError, '%s() argument 1 must be string, not %s' % (sys
._getframe
().f_code
.co_name
, type(m
).__name
__)
83 self
._counter
+= len(m
)
85 while len(self
._buffer
) >= 64:
86 self
._sha
256_process
(self
._buffer
[:64])
87 self
._buffer
= self
._buffer
[64:]
90 mdi
= self
._counter
& 0x3F
91 length
= struct
.pack('!Q', self
._counter
<<3)
99 r
.update('\x80'+('\x00'*padlen
)+length
)
100 return ''.join([struct
.pack('!L', i
) for i
in r
._h
[:self
._output
_size
]])
103 return self
.digest().encode('hex')
106 return copy
.deepcopy(self
)
108 digest_size
= new().digest_size