14710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# Test hashlib module 24710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# 34710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# $Id$ 44710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# 54710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# Copyright (C) 2005-2010 Gregory P. Smith (greg@krypto.org) 64710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# Licensed to PSF under a Contributor Agreement. 74710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# 84710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 94710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmimport array 104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmimport hashlib 114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmimport itertools 124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmimport sys 134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmtry: 144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm import threading 154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmexcept ImportError: 164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm threading = None 174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmimport unittest 184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmimport warnings 194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmfrom test import test_support 204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmfrom test.test_support import _4G, precisionbigmemtest 214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm# Were we compiled --with-pydebug or with #define Py_DEBUG? 234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmCOMPILED_WITH_PYDEBUG = hasattr(sys, 'gettotalrefcount') 244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdef hexstr(s): 274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm import string 284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm h = string.hexdigits 294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm r = '' 304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for c in s: 314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm i = ord(c) 324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm r = r + h[(i >> 4) & 0xF] + h[i & 0xF] 334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return r 344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmclass HashLibTestCase(unittest.TestCase): 374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm supported_hash_names = ( 'md5', 'MD5', 'sha1', 'SHA1', 384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 'sha224', 'SHA224', 'sha256', 'SHA256', 394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 'sha384', 'SHA384', 'sha512', 'SHA512' ) 404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm _warn_on_extension_import = COMPILED_WITH_PYDEBUG 424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def _conditional_import_module(self, module_name): 444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm """Import a module and return a reference to it or None on failure.""" 454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm try: 464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm exec('import '+module_name) 474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm except ImportError, error: 484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if self._warn_on_extension_import: 494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm warnings.warn('Did a C extension fail to compile? %s' % error) 504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return locals().get(module_name) 514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def __init__(self, *args, **kwargs): 534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm algorithms = set() 544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for algorithm in self.supported_hash_names: 554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm algorithms.add(algorithm.lower()) 564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.constructors_to_test = {} 574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for algorithm in algorithms: 584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.constructors_to_test[algorithm] = set() 594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # For each algorithm, test the direct constructor and the use 614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # of hashlib.new given the algorithm name. 624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for algorithm, constructors in self.constructors_to_test.items(): 634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm constructors.add(getattr(hashlib, algorithm)) 644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def _test_algorithm_via_hashlib_new(data=None, _alg=algorithm): 654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if data is None: 664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return hashlib.new(_alg) 674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm return hashlib.new(_alg, data) 684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm constructors.add(_test_algorithm_via_hashlib_new) 694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm _hashlib = self._conditional_import_module('_hashlib') 714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if _hashlib: 724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # These two algorithms should always be present when this module 734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # is compiled. If not, something was compiled wrong. 744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm assert hasattr(_hashlib, 'openssl_md5') 754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm assert hasattr(_hashlib, 'openssl_sha1') 764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for algorithm, constructors in self.constructors_to_test.items(): 774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm constructor = getattr(_hashlib, 'openssl_'+algorithm, None) 784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if constructor: 794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm constructors.add(constructor) 804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm _md5 = self._conditional_import_module('_md5') 824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if _md5: 834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.constructors_to_test['md5'].add(_md5.new) 844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm _sha = self._conditional_import_module('_sha') 854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if _sha: 864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.constructors_to_test['sha1'].add(_sha.new) 874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm _sha256 = self._conditional_import_module('_sha256') 884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if _sha256: 894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.constructors_to_test['sha224'].add(_sha256.sha224) 904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.constructors_to_test['sha256'].add(_sha256.sha256) 914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm _sha512 = self._conditional_import_module('_sha512') 924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if _sha512: 934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.constructors_to_test['sha384'].add(_sha512.sha384) 944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.constructors_to_test['sha512'].add(_sha512.sha512) 954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm super(HashLibTestCase, self).__init__(*args, **kwargs) 974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_hash_array(self): 994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm a = array.array("b", range(10)) 1004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm constructors = self.constructors_to_test.itervalues() 1014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for cons in itertools.chain.from_iterable(constructors): 1024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm c = cons(a) 1034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm c.hexdigest() 1044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_algorithms_attribute(self): 1064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(hashlib.algorithms, 1074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm tuple([_algo for _algo in self.supported_hash_names if 1084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm _algo.islower()])) 1094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_unknown_hash(self): 1114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm try: 1124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm hashlib.new('spam spam spam spam spam') 1134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm except ValueError: 1144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm pass 1154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else: 1164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertTrue(0 == "hashlib didn't reject bogus hash name") 1174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_get_builtin_constructor(self): 1194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm get_builtin_constructor = hashlib.__dict__[ 1204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm '__get_builtin_constructor'] 1214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertRaises(ValueError, get_builtin_constructor, 'test') 1224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm try: 1234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm import _md5 1244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm except ImportError: 1254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm pass 1264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # This forces an ImportError for "import _md5" statements 1274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm sys.modules['_md5'] = None 1284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm try: 1294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertRaises(ValueError, get_builtin_constructor, 'md5') 1304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm finally: 1314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if '_md5' in locals(): 1324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm sys.modules['_md5'] = _md5 1334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm else: 1344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm del sys.modules['_md5'] 1354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_hexdigest(self): 1374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for name in self.supported_hash_names: 1384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm h = hashlib.new(name) 1394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertTrue(hexstr(h.digest()) == h.hexdigest()) 1404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_large_update(self): 1424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm aas = 'a' * 128 1434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm bees = 'b' * 127 1444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm cees = 'c' * 126 1454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm abcs = aas + bees + cees 1464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for name in self.supported_hash_names: 1484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm m1 = hashlib.new(name) 1494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm m1.update(aas) 1504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm m1.update(bees) 1514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm m1.update(cees) 1524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm m2 = hashlib.new(name) 1544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm m2.update(abcs) 1554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(m1.digest(), m2.digest(), name+' update problem.') 1564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm m3 = hashlib.new(name, abcs) 1584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(m1.digest(), m3.digest(), name+' new problem.') 1594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def check(self, name, data, digest): 1614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm constructors = self.constructors_to_test[name] 1624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # 2 is for hashlib.name(...) and hashlib.new(name, ...) 1634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertGreaterEqual(len(constructors), 2) 1644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for hash_object_constructor in constructors: 1654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm computed = hash_object_constructor(data).hexdigest() 1664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual( 1674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm computed, digest, 1684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "Hash algorithm %s constructed using %s returned hexdigest" 1694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm " %r for %d byte input data that should have hashed to %r." 1704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm % (name, hash_object_constructor, 1714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm computed, len(data), digest)) 1724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def check_unicode(self, algorithm_name): 1744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # Unicode objects are not allowed as input. 1754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm expected = hashlib.new(algorithm_name, str(u'spam')).hexdigest() 1764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.check(algorithm_name, u'spam', expected) 1774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_unicode(self): 1794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # In python 2.x unicode is auto-encoded to the system default encoding 1804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # when passed to hashlib functions. 1814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.check_unicode('md5') 1824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.check_unicode('sha1') 1834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.check_unicode('sha224') 1844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.check_unicode('sha256') 1854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.check_unicode('sha384') 1864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.check_unicode('sha512') 1874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_case_md5_0(self): 1894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.check('md5', '', 'd41d8cd98f00b204e9800998ecf8427e') 1904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_case_md5_1(self): 1924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.check('md5', 'abc', '900150983cd24fb0d6963f7d28e17f72') 1934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_case_md5_2(self): 1954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.check('md5', 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789', 1964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 'd174ab98d277d9f5a5611c2c9f419d9f') 1974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 1984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm @precisionbigmemtest(size=_4G + 5, memuse=1) 1994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_case_md5_huge(self, size): 2004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if size == _4G + 5: 2014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm try: 2024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.check('md5', 'A'*size, 'c9af2dff37468ce5dfee8f2cfc0a9c6d') 2034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm except OverflowError: 2044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm pass # 32-bit arch 2054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm @precisionbigmemtest(size=_4G - 1, memuse=1) 2074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_case_md5_uintmax(self, size): 2084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm if size == _4G - 1: 2094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm try: 2104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.check('md5', 'A'*size, '28138d306ff1b8281f1a9067e1a1a2b3') 2114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm except OverflowError: 2124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm pass # 32-bit arch 2134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # use the three examples from Federal Information Processing Standards 2154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # Publication 180-1, Secure Hash Standard, 1995 April 17 2164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # http://www.itl.nist.gov/div897/pubs/fip180-1.htm 2174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_case_sha1_0(self): 2194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.check('sha1', "", 2204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "da39a3ee5e6b4b0d3255bfef95601890afd80709") 2214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_case_sha1_1(self): 2234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.check('sha1', "abc", 2244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "a9993e364706816aba3e25717850c26c9cd0d89d") 2254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_case_sha1_2(self): 2274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.check('sha1', "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq", 2284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "84983e441c3bd26ebaae4aa1f95129e5e54670f1") 2294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_case_sha1_3(self): 2314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.check('sha1', "a" * 1000000, 2324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "34aa973cd4c4daa4f61eeb2bdbad27316534016f") 2334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # use the examples from Federal Information Processing Standards 2364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # Publication 180-2, Secure Hash Standard, 2002 August 1 2374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # http://csrc.nist.gov/publications/fips/fips180-2/fips180-2.pdf 2384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_case_sha224_0(self): 2404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.check('sha224', "", 2414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "d14a028c2a3a2bc9476102bb288234c415a2b01f828ea62ac5b3e42f") 2424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_case_sha224_1(self): 2444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.check('sha224', "abc", 2454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "23097d223405d8228642a477bda255b32aadbce4bda0b3f7e36c9da7") 2464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_case_sha224_2(self): 2484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.check('sha224', 2494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq", 2504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "75388b16512776cc5dba5da1fd890150b0c6455cb4f58b1952522525") 2514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_case_sha224_3(self): 2534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.check('sha224', "a" * 1000000, 2544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "20794655980c91d8bbb4c1ea97618a4bf03f42581948b2ee4ee7ad67") 2554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_case_sha256_0(self): 2584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.check('sha256', "", 2594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855") 2604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_case_sha256_1(self): 2624710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.check('sha256', "abc", 2634710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad") 2644710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2654710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_case_sha256_2(self): 2664710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.check('sha256', 2674710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq", 2684710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "248d6a61d20638b8e5c026930c3e6039a33ce45964ff2167f6ecedd419db06c1") 2694710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2704710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_case_sha256_3(self): 2714710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.check('sha256', "a" * 1000000, 2724710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "cdc76e5c9914fb9281a1c7e284d73e67f1809a48a497200e046d39ccc7112cd0") 2734710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2744710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2754710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_case_sha384_0(self): 2764710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.check('sha384', "", 2774710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "38b060a751ac96384cd9327eb1b1e36a21fdb71114be07434c0cc7bf63f6e1da"+ 2784710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "274edebfe76f65fbd51ad2f14898b95b") 2794710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2804710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_case_sha384_1(self): 2814710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.check('sha384', "abc", 2824710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "cb00753f45a35e8bb5a03d699ac65007272c32ab0eded1631a8b605a43ff5bed"+ 2834710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "8086072ba1e7cc2358baeca134c825a7") 2844710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2854710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_case_sha384_2(self): 2864710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.check('sha384', 2874710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmn"+ 2884710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "hijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu", 2894710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "09330c33f71147e83d192fc782cd1b4753111b173b3b05d22fa08086e3b0f712"+ 2904710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "fcc7c71a557e2db966c3e9fa91746039") 2914710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2924710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_case_sha384_3(self): 2934710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.check('sha384', "a" * 1000000, 2944710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "9d0e1809716474cb086e834e310a4a1ced149e9c00f248527972cec5704c2a5b"+ 2954710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "07b8b3dc38ecc4ebae97ddd87f3d8985") 2964710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2974710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 2984710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_case_sha512_0(self): 2994710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.check('sha512', "", 3004710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce"+ 3014710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e") 3024710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3034710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_case_sha512_1(self): 3044710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.check('sha512', "abc", 3054710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "ddaf35a193617abacc417349ae20413112e6fa4e89a97ea20a9eeee64b55d39a"+ 3064710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "2192992a274fc1a836ba3c23a3feebbd454d4423643ce80e2a9ac94fa54ca49f") 3074710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3084710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_case_sha512_2(self): 3094710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.check('sha512', 3104710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmn"+ 3114710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "hijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu", 3124710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "8e959b75dae313da8cf4f72814fc143f8f7779c6eb9f7fa17299aeadb6889018"+ 3134710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "501d289e4900f7e4331b99dec4b5433ac7d329eeb6dd26545e96e55b874be909") 3144710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3154710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_case_sha512_3(self): 3164710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.check('sha512', "a" * 1000000, 3174710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "e718483d0ce769644e2e42c7bc15b4638e1f98b13b2044285632a803afa973eb"+ 3184710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm "de0ff244877ea60a4cb0432ce577c31beb009c5c2c49aa2e4eadb217ad8cc09b") 3194710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3204710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm @unittest.skipUnless(threading, 'Threading required for this test.') 3214710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm @test_support.reap_threads 3224710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def test_threaded_hashing(self): 3234710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # Updating the same hash object from several threads at once 3244710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # using data chunk sizes containing the same byte sequences. 3254710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # 3264710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # If the internal locks are working to prevent multiple 3274710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # updates on the same object from running at once, the resulting 3284710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm # hash will be the same as doing it single threaded upfront. 3294710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm hasher = hashlib.sha1() 3304710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm num_threads = 5 3314710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm smallest_data = 'swineflu' 3324710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm data = smallest_data*200000 3334710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm expected_hash = hashlib.sha1(data*num_threads).hexdigest() 3344710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3354710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm def hash_in_chunks(chunk_size, event): 3364710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm index = 0 3374710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm while index < len(data): 3384710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm hasher.update(data[index:index+chunk_size]) 3394710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm index += chunk_size 3404710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm event.set() 3414710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3424710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm events = [] 3434710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for threadnum in xrange(num_threads): 3444710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm chunk_size = len(data) // (10**threadnum) 3454710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm assert chunk_size > 0 3464710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm assert chunk_size % len(smallest_data) == 0 3474710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm event = threading.Event() 3484710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm events.append(event) 3494710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm threading.Thread(target=hash_in_chunks, 3504710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm args=(chunk_size, event)).start() 3514710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3524710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm for event in events: 3534710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm event.wait() 3544710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3554710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm self.assertEqual(expected_hash, hasher.hexdigest()) 3564710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3574710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmdef test_main(): 3584710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm test_support.run_unittest(HashLibTestCase) 3594710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm 3604710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylmif __name__ == "__main__": 3614710c53dcad1ebf3755f3efb9e80ac24bd72a9b2darylm test_main() 362