Fixes Issue #12059: Properly handle missing hash functions even when
the expected builtin modules are not present. This includes a unittest for __get_builtin_constructor() in the face of such an error.
This commit is contained in:
parent
e670c889cc
commit
12c9d028ed
|
@ -64,26 +64,29 @@ __all__ = __always_supported + ('new', 'algorithms_guaranteed',
|
||||||
|
|
||||||
|
|
||||||
def __get_builtin_constructor(name):
|
def __get_builtin_constructor(name):
|
||||||
if name in ('SHA1', 'sha1'):
|
try:
|
||||||
import _sha1
|
if name in ('SHA1', 'sha1'):
|
||||||
return _sha1.sha1
|
import _sha1
|
||||||
elif name in ('MD5', 'md5'):
|
return _sha1.sha1
|
||||||
import _md5
|
elif name in ('MD5', 'md5'):
|
||||||
return _md5.md5
|
import _md5
|
||||||
elif name in ('SHA256', 'sha256', 'SHA224', 'sha224'):
|
return _md5.md5
|
||||||
import _sha256
|
elif name in ('SHA256', 'sha256', 'SHA224', 'sha224'):
|
||||||
bs = name[3:]
|
import _sha256
|
||||||
if bs == '256':
|
bs = name[3:]
|
||||||
return _sha256.sha256
|
if bs == '256':
|
||||||
elif bs == '224':
|
return _sha256.sha256
|
||||||
return _sha256.sha224
|
elif bs == '224':
|
||||||
elif name in ('SHA512', 'sha512', 'SHA384', 'sha384'):
|
return _sha256.sha224
|
||||||
import _sha512
|
elif name in ('SHA512', 'sha512', 'SHA384', 'sha384'):
|
||||||
bs = name[3:]
|
import _sha512
|
||||||
if bs == '512':
|
bs = name[3:]
|
||||||
return _sha512.sha512
|
if bs == '512':
|
||||||
elif bs == '384':
|
return _sha512.sha512
|
||||||
return _sha512.sha384
|
elif bs == '384':
|
||||||
|
return _sha512.sha384
|
||||||
|
except ImportError:
|
||||||
|
pass # no extension module, this hash is unsupported.
|
||||||
|
|
||||||
raise ValueError('unsupported hash type %s' % name)
|
raise ValueError('unsupported hash type %s' % name)
|
||||||
|
|
||||||
|
|
|
@ -118,6 +118,24 @@ class HashLibTestCase(unittest.TestCase):
|
||||||
else:
|
else:
|
||||||
self.assertTrue(0 == "hashlib didn't reject bogus hash name")
|
self.assertTrue(0 == "hashlib didn't reject bogus hash name")
|
||||||
|
|
||||||
|
def test_get_builtin_constructor(self):
|
||||||
|
get_builtin_constructor = hashlib.__dict__[
|
||||||
|
'__get_builtin_constructor']
|
||||||
|
self.assertRaises(ValueError, get_builtin_constructor, 'test')
|
||||||
|
try:
|
||||||
|
import _md5
|
||||||
|
except ImportError:
|
||||||
|
pass
|
||||||
|
# This forces an ImportError for "import _md5" statements
|
||||||
|
sys.modules['_md5'] = None
|
||||||
|
try:
|
||||||
|
self.assertRaises(ValueError, get_builtin_constructor, 'md5')
|
||||||
|
finally:
|
||||||
|
if '_md5' in locals():
|
||||||
|
sys.modules['_md5'] = _md5
|
||||||
|
else:
|
||||||
|
del sys.modules['_md5']
|
||||||
|
|
||||||
def test_hexdigest(self):
|
def test_hexdigest(self):
|
||||||
for name in self.supported_hash_names:
|
for name in self.supported_hash_names:
|
||||||
h = hashlib.new(name)
|
h = hashlib.new(name)
|
||||||
|
|
Loading…
Reference in New Issue