python: remove openssl support, use ape/libsec for cryptographics hash functions

This commit is contained in:
cinap_lenrek 2016-04-11 20:31:14 +02:00
parent 8f4db30e78
commit 4e04698ab6
6 changed files with 400 additions and 96 deletions

View file

@ -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"