64 lines
1.9 KiB
Python
64 lines
1.9 KiB
Python
"""Script to generate MC tests for Closure SHA functions"""
|
|
|
|
from binascii import hexlify
|
|
from hashlib import sha1, sha224, sha256, sha384, sha512
|
|
|
|
from Crypto.Cipher import AES
|
|
|
|
C = AES.new('Closure Library SHA KATs ')
|
|
MC_START = ''.join(C.encrypt(('MC' * 15) + '\x00' + chr(i)) for i in range(16))
|
|
|
|
|
|
TEST_TEMPLATE = '''\
|
|
function test{shatitle}() {{
|
|
var sha = new goog.crypt.{shatitle}();
|
|
var initial_state = '{initial_state}';
|
|
var count = {count};
|
|
var state = goog.crypt.stringToByteArray(initial_state);
|
|
var digest;
|
|
for (var i = 0; i < count; i++) {{
|
|
sha.reset();
|
|
sha.update(state);
|
|
digest = sha.digest();
|
|
state = goog.array.concat(digest, state);
|
|
}}
|
|
assertEquals({lenfinal}, state.length);
|
|
assertEquals('{expected}',
|
|
goog.crypt.byteArrayToHex(digest));
|
|
sha.reset();
|
|
for (var i = 0; i < ({lenfinal} + 10); i++) {{
|
|
sha.update(state, i);
|
|
}}
|
|
assertEquals('{expected2}',
|
|
goog.crypt.byteArrayToHex(sha.digest()));
|
|
}}
|
|
'''
|
|
|
|
def genmc(sha, name, blocklen, digestlen):
|
|
"""Generate a Monte Carlo test for each SHA instance."""
|
|
count = (2 ** 15) // digestlen
|
|
state = name
|
|
for i in range(count):
|
|
digest = sha(state).digest()
|
|
state = digest + state
|
|
final_state = state
|
|
lenfinal = len(final_state)
|
|
h = sha()
|
|
for i in range(len(final_state) + 10):
|
|
h.update(final_state[:i])
|
|
print(TEST_TEMPLATE.format(initial_state=name, count=count,
|
|
lenfinal=len(final_state),
|
|
expected=hexlify(digest),
|
|
shatitle=name,
|
|
expected2=hexlify(h.digest())))
|
|
|
|
|
|
SHAS = [(sha1, 'Sha1', 64, 160//8),
|
|
(sha224, 'Sha224', 64, 224//8),
|
|
(sha256, 'Sha256', 64, 256//8),
|
|
(sha384, 'Sha384', 128, 384//8),
|
|
(sha512, 'Sha512', 128, 512//8)]
|
|
|
|
for s in SHAS:
|
|
genmc(*s)
|