python: remove openssl support, use ape/libsec for cryptographics hash functions
This commit is contained in:
parent
8f4db30e78
commit
4e04698ab6
6 changed files with 400 additions and 96 deletions
|
@ -51,88 +51,24 @@ More condensed:
|
|||
|
||||
"""
|
||||
|
||||
import _sechash
|
||||
|
||||
def __get_builtin_constructor(name):
|
||||
if name in ('SHA1', 'sha1'):
|
||||
import _sha
|
||||
return _sha.new
|
||||
elif name in ('MD5', 'md5'):
|
||||
import _md5
|
||||
return _md5.new
|
||||
elif name in ('SHA256', 'sha256', 'SHA224', 'sha224'):
|
||||
import _sha256
|
||||
bs = name[3:]
|
||||
if bs == '256':
|
||||
return _sha256.sha256
|
||||
elif bs == '224':
|
||||
return _sha256.sha224
|
||||
# elif name in ('SHA512', 'sha512', 'SHA384', 'sha384'):
|
||||
# import _sha512
|
||||
# bs = name[3:]
|
||||
# if bs == '512':
|
||||
# return _sha512.sha512
|
||||
# elif bs == '384':
|
||||
# return _sha512.sha384
|
||||
md5 = _sechash.md5
|
||||
sha1 = _sechash.sha1
|
||||
sha224 = _sechash.sha224
|
||||
sha256 = _sechash.sha256
|
||||
sha384 = _sechash.sha384
|
||||
sha512 = _sechash.sha512
|
||||
|
||||
raise ValueError, "unsupported hash type"
|
||||
algs = dict()
|
||||
for a in [md5, sha1, sha224, sha256, sha384, sha512]:
|
||||
algs[a().name.lower()] = a
|
||||
|
||||
|
||||
def __py_new(name, string=''):
|
||||
"""new(name, string='') - Return a new hashing object using the named algorithm;
|
||||
optionally initialized with a string.
|
||||
"""
|
||||
return __get_builtin_constructor(name)(string)
|
||||
|
||||
|
||||
def __hash_new(name, string=''):
|
||||
"""new(name, string='') - Return a new hashing object using the named algorithm;
|
||||
optionally initialized with a string.
|
||||
"""
|
||||
try:
|
||||
return _hashlib.new(name, string)
|
||||
except ValueError:
|
||||
# If the _hashlib module (OpenSSL) doesn't support the named
|
||||
# hash, try using our builtin implementations.
|
||||
# This allows for SHA224/256 and SHA384/512 support even though
|
||||
# the OpenSSL library prior to 0.9.8 doesn't provide them.
|
||||
return __get_builtin_constructor(name)(string)
|
||||
|
||||
|
||||
try:
|
||||
import _hashlib
|
||||
# use the wrapper of the C implementation
|
||||
new = __hash_new
|
||||
|
||||
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:
|
||||
# We don't have the _hashlib OpenSSL module?
|
||||
# use the built in legacy interfaces via a wrapper function
|
||||
new = __py_new
|
||||
|
||||
# lookup the C function to use directly for the named constructors
|
||||
md5 = __get_builtin_constructor('md5')
|
||||
sha1 = __get_builtin_constructor('sha1')
|
||||
sha224 = __get_builtin_constructor('sha224')
|
||||
sha256 = __get_builtin_constructor('sha256')
|
||||
sha384 = __get_builtin_constructor('sha384')
|
||||
sha512 = __get_builtin_constructor('sha512')
|
||||
def new(name, string=''):
|
||||
"""new(name, string='') - Return a new hashing object using the named algorithm;
|
||||
optionally initialized with a string.
|
||||
"""
|
||||
a = algs[name.lower()]
|
||||
if a != None:
|
||||
return a(string)
|
||||
raise ValueError, "unsupported hash type"
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue