"""
from ctypes import c_int, c_char_p, c_void_p, POINTER, c_long, c_longlong
from ctypes import create_string_buffer, byref
-from ctypescrypto import libcrypto
+from ctypescrypto import libcrypto,pyver, bintype
from ctypescrypto.exception import LibCryptoError
from ctypescrypto.oid import Oid
DIGEST_ALGORITHMS = ("MD5", "SHA1", "SHA224", "SHA256", "SHA384", "SHA512")
self.digest_name = digest_name.longname()
else:
self.digest_name = str(digest_name)
- self.digest = libcrypto.EVP_get_digestbyname(self.digest_name)
+ self.digest = libcrypto.EVP_get_digestbyname(self.digest_name.encode('us-ascii'))
if self.digest is None:
raise DigestError("Unknown digest: %s" % self.digest_name)
"""
Initializes digest using given type.
"""
- self.ctx = libcrypto.EVP_MD_CTX_create()
+ self.ctx = self.newctx()
if self.ctx is None:
raise DigestError("Unable to create digest context")
self.digest_out = None
"""
if self.digest_finalized:
raise DigestError("No updates allowed")
- if not isinstance(data, str):
- raise TypeError("A string is expected")
+ if not isinstance(data, bintype):
+ raise TypeError("A byte string is expected")
if length is None:
length = len(data)
elif length > len(data):
"""
try:
if self.ctx is not None:
- libcrypto.EVP_MD_CTX_destroy(self.ctx)
+ libcrypto.EVP_MD_CTX_free(self.ctx)
del self.ctx
except AttributeError:
pass
with hashlib
"""
from base64 import b16encode
- return b16encode(self.digest(data))
+ if pyver == 2:
+ return b16encode(self.digest(data))
+ else:
+ return b16encode(self.digest(data)).decode('us-ascii')
# Declare function result and argument types
libcrypto.EVP_get_digestbyname.restype = c_void_p
libcrypto.EVP_get_digestbyname.argtypes = (c_char_p, )
-libcrypto.EVP_MD_CTX_create.restype = c_void_p
+# These two functions are renamed in OpenSSL 1.1.0
+if hasattr(libcrypto,"EVP_MD_CTX_create"):
+ Digest.newctx = libcrypto.EVP_MD_CTX_create
+ Digest.freectx = libcrypto.EVP_MD_CTX_destroy
+else:
+ Digest.newctx = libcrypto.EVP_MD_CTX_new
+ Digest.freectx = libcrypto.EVP_MD_CTX_free
+Digest.newctx.restype = c_void_p
+Digest.freectx.argtypes = (c_void_p, )
# libcrypto.EVP_MD_CTX_create has no arguments
-libcrypto.EVP_DigestInit_ex.restupe = c_int
+libcrypto.EVP_DigestInit_ex.restype = c_int
libcrypto.EVP_DigestInit_ex.argtypes = (c_void_p, c_void_p, c_void_p)
libcrypto.EVP_DigestUpdate.restype = c_int
libcrypto.EVP_DigestUpdate.argtypes = (c_void_p, c_char_p, c_longlong)
libcrypto.EVP_DigestFinal_ex.restype = c_int
libcrypto.EVP_DigestFinal_ex.argtypes = (c_void_p, c_char_p, POINTER(c_long))
-libcrypto.EVP_MD_CTX_destroy.argtypes = (c_void_p, )
libcrypto.EVP_MD_CTX_copy.restype = c_int
libcrypto.EVP_MD_CTX_copy.argtypes = (c_void_p, c_void_p)
libcrypto.EVP_MD_type.argtypes = (c_void_p, )