diff options
-rw-r--r-- | cryptography/hazmat/bindings/openssl/backend.py | 36 | ||||
-rw-r--r-- | tests/hazmat/bindings/test_openssl.py | 7 |
2 files changed, 30 insertions, 13 deletions
diff --git a/cryptography/hazmat/bindings/openssl/backend.py b/cryptography/hazmat/bindings/openssl/backend.py index 32adfed9..7367818a 100644 --- a/cryptography/hazmat/bindings/openssl/backend.py +++ b/cryptography/hazmat/bindings/openssl/backend.py @@ -55,17 +55,31 @@ class Backend(object): "x509v3", ] + ffi = None + lib = None + def __init__(self): - self.ffi = cffi.FFI() + self._ensure_ffi_initialized() + + self.ciphers = Ciphers(self) + self.hashes = Hashes(self) + self.hmacs = HMACs(self) + + @classmethod + def _ensure_ffi_initialized(cls): + if cls.ffi is not None and cls.lib is not None: + return + + ffi = cffi.FFI() includes = [] functions = [] macros = [] - for name in self._modules: + for name in cls._modules: module_name = "cryptography.hazmat.bindings.openssl." + name __import__(module_name) module = sys.modules[module_name] - self.ffi.cdef(module.TYPES) + ffi.cdef(module.TYPES) macros.append(module.MACROS) functions.append(module.FUNCTIONS) @@ -75,9 +89,9 @@ class Backend(object): # so we can set interdependent types in different files and still # have them all defined before we parse the funcs & macros for func in functions: - self.ffi.cdef(func) + ffi.cdef(func) for macro in macros: - self.ffi.cdef(macro) + ffi.cdef(macro) # We include functions here so that if we got any of their definitions # wrong, the underlying C compiler will explode. In C you are allowed @@ -87,17 +101,15 @@ class Backend(object): # is legal, but the following will fail to compile: # int foo(int); # int foo(short); - self.lib = self.ffi.verify( + lib = ffi.verify( source="\n".join(includes + functions), libraries=["crypto", "ssl"], ) - self.lib.OpenSSL_add_all_algorithms() - self.lib.SSL_load_error_strings() - - self.ciphers = Ciphers(self) - self.hashes = Hashes(self) - self.hmacs = HMACs(self) + cls.ffi = ffi + cls.lib = lib + cls.lib.OpenSSL_add_all_algorithms() + cls.lib.SSL_load_error_strings() def openssl_version_text(self): """ diff --git a/tests/hazmat/bindings/test_openssl.py b/tests/hazmat/bindings/test_openssl.py index 9ce882e4..fb01c10a 100644 --- a/tests/hazmat/bindings/test_openssl.py +++ b/tests/hazmat/bindings/test_openssl.py @@ -13,7 +13,7 @@ import pytest -from cryptography.hazmat.bindings.openssl.backend import backend +from cryptography.hazmat.bindings.openssl.backend import backend, Backend from cryptography.hazmat.primitives.block.ciphers import AES from cryptography.hazmat.primitives.block.modes import CBC @@ -39,3 +39,8 @@ class TestOpenSSL(object): def test_register_duplicate_cipher_adapter(self): with pytest.raises(ValueError): backend.ciphers.register_cipher_adapter(AES, CBC, None) + + def test_instances_share_ffi(self): + b = Backend() + assert b.ffi is backend.ffi + assert b.lib is backend.lib |