X-Git-Url: http://www.wagner.pp.ru/gitweb/?a=blobdiff_plain;f=ctypescrypto%2Fcipher.py;h=edbcca674f6746792fd53ddf5f3d1ed6f4c9d359;hb=HEAD;hp=d4035c1a34a8a5ec909578491b19a7cc5670138b;hpb=287e8a5b1d7f5a8129619f733adbfc8b2de3e4c7;p=oss%2Fctypescrypto.git diff --git a/ctypescrypto/cipher.py b/ctypescrypto/cipher.py index d4035c1..edbcca6 100644 --- a/ctypescrypto/cipher.py +++ b/ctypescrypto/cipher.py @@ -4,7 +4,7 @@ access to symmetric ciphers from libcrypto """ from ctypes import create_string_buffer, c_char_p, c_void_p, c_int from ctypes import byref, POINTER -from ctypescrypto import libcrypto +from ctypescrypto import libcrypto, pyver, bintype from ctypescrypto.exception import LibCryptoError from ctypescrypto.oid import Oid @@ -46,6 +46,8 @@ class CipherType(object): Constructs cipher algortihm using textual name as in openssl command line """ + if pyver > 2: + cipher_name = cipher_name.encode('utf-8') self.cipher = libcrypto.EVP_get_cipherbyname(cipher_name) if self.cipher is None: raise CipherError("Unknown cipher: %s" % cipher_name) @@ -190,8 +192,8 @@ class Cipher(object): """ if self.cipher_finalized: raise CipherError("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 len(data) == 0: return "" outbuf = create_string_buffer(self.block_size+len(data)) @@ -221,7 +223,7 @@ class Cipher(object): if outlen.value > 0: return outbuf.raw[:int(outlen.value)] else: - return "" + return b"" def _clean_ctx(self): """ @@ -229,7 +231,7 @@ class Cipher(object): """ try: if self.ctx is not None: - libcrypto.EVP_CIPHER_CTX_cleanup(self.ctx) + self.__ctxcleanup(self.ctx) libcrypto.EVP_CIPHER_CTX_free(self.ctx) del self.ctx except AttributeError: @@ -241,7 +243,14 @@ class Cipher(object): # Used C function block_size # libcrypto.EVP_CIPHER_block_size.argtypes = (c_void_p, ) -libcrypto.EVP_CIPHER_CTX_cleanup.argtypes = (c_void_p, ) + +#Function EVP_CIPHER_CTX_cleanup renamed to EVP_CIPHER_CTX_reset +# in the OpenSSL 1.1.0 +if hasattr(libcrypto,"EVP_CIPHER_CTX_cleanup"): + Cipher.__ctxcleanup = libcrypto.EVP_CIPHER_CTX_cleanup +else: + Cipher.__ctxcleanup = libcrypto.EVP_CIPHER_CTX_reset +Cipher.__ctxcleanup.argtypes = (c_void_p, ) libcrypto.EVP_CIPHER_CTX_free.argtypes = (c_void_p, ) libcrypto.EVP_CIPHER_CTX_new.restype = c_void_p libcrypto.EVP_CIPHER_CTX_set_padding.argtypes = (c_void_p, c_int)