Merged revisions 74479 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk ........ r74479 | gregory.p.smith | 2009-08-16 14:54:45 -0700 (Sun, 16 Aug 2009) | 2 lines Clean up the C library import code (based on suggestions in issue6281). ........
This commit is contained in:
parent
176834327f
commit
d8fe8bf67e
|
@ -53,6 +53,12 @@ More condensed:
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
# This tuple and __get_builtin_constructor() must be modified if a new
|
||||||
|
# always available algorithm is added.
|
||||||
|
__always_supported = ('md5', 'sha1', 'sha224', 'sha256', 'sha384', 'sha512')
|
||||||
|
|
||||||
|
__all__ = __always_supported + ('new',)
|
||||||
|
|
||||||
|
|
||||||
def __get_builtin_constructor(name):
|
def __get_builtin_constructor(name):
|
||||||
if name in ('SHA1', 'sha1'):
|
if name in ('SHA1', 'sha1'):
|
||||||
|
@ -76,7 +82,19 @@ def __get_builtin_constructor(name):
|
||||||
elif bs == '384':
|
elif bs == '384':
|
||||||
return _sha512.sha384
|
return _sha512.sha384
|
||||||
|
|
||||||
raise ValueError("unsupported hash type")
|
raise ValueError('unsupported hash type %s' % name)
|
||||||
|
|
||||||
|
|
||||||
|
def __get_openssl_constructor(name):
|
||||||
|
try:
|
||||||
|
f = getattr(_hashlib, 'openssl_' + name)
|
||||||
|
# Allow the C module to raise ValueError. The function will be
|
||||||
|
# defined but the hash not actually available thanks to OpenSSL.
|
||||||
|
f()
|
||||||
|
# Use the C function directly (very fast)
|
||||||
|
return f
|
||||||
|
except (AttributeError, ValueError):
|
||||||
|
return __get_builtin_constructor(name)
|
||||||
|
|
||||||
|
|
||||||
def __py_new(name, data=b''):
|
def __py_new(name, data=b''):
|
||||||
|
@ -102,39 +120,21 @@ def __hash_new(name, data=b''):
|
||||||
|
|
||||||
try:
|
try:
|
||||||
import _hashlib
|
import _hashlib
|
||||||
# use the wrapper of the C implementation
|
|
||||||
new = __hash_new
|
new = __hash_new
|
||||||
|
__get_hash = __get_openssl_constructor
|
||||||
for opensslFuncName in filter(lambda n: n.startswith('openssl_'), dir(_hashlib)):
|
|
||||||
funcName = opensslFuncName[len('openssl_'):]
|
|
||||||
try:
|
|
||||||
# try them all, some may not work due to the OpenSSL
|
|
||||||
# version not supporting that algorithm.
|
|
||||||
f = getattr(_hashlib, opensslFuncName)
|
|
||||||
f()
|
|
||||||
# Use the C function directly (very fast)
|
|
||||||
exec(funcName + ' = f')
|
|
||||||
except ValueError:
|
|
||||||
try:
|
|
||||||
# Use the builtin implementation directly (fast)
|
|
||||||
exec(funcName + ' = __get_builtin_constructor(funcName)')
|
|
||||||
except ValueError:
|
|
||||||
# this one has no builtin implementation, don't define it
|
|
||||||
pass
|
|
||||||
# clean up our locals
|
|
||||||
del f
|
|
||||||
del opensslFuncName
|
|
||||||
del funcName
|
|
||||||
|
|
||||||
except ImportError:
|
except ImportError:
|
||||||
# We don't have the _hashlib OpenSSL module?
|
|
||||||
# use the built in legacy interfaces via a wrapper function
|
|
||||||
new = __py_new
|
new = __py_new
|
||||||
|
__get_hash = __get_builtin_constructor
|
||||||
|
|
||||||
# lookup the C function to use directly for the named constructors
|
for __func_name in __always_supported:
|
||||||
md5 = __get_builtin_constructor('md5')
|
# try them all, some may not work due to the OpenSSL
|
||||||
sha1 = __get_builtin_constructor('sha1')
|
# version not supporting that algorithm.
|
||||||
sha224 = __get_builtin_constructor('sha224')
|
try:
|
||||||
sha256 = __get_builtin_constructor('sha256')
|
globals()[__func_name] = __get_hash(__func_name)
|
||||||
sha384 = __get_builtin_constructor('sha384')
|
except ValueError:
|
||||||
sha512 = __get_builtin_constructor('sha512')
|
import logging
|
||||||
|
logging.exception('code for hash %s was not found.', __func_name)
|
||||||
|
|
||||||
|
# Cleanup locals()
|
||||||
|
del __always_supported, __func_name, __get_hash
|
||||||
|
del __py_new, __hash_new, __get_openssl_constructor
|
||||||
|
|
Loading…
Reference in New Issue