diff options
-rw-r--r-- | cryptography/hazmat/backends/__init__.py | 24 | ||||
-rw-r--r-- | cryptography/hazmat/bindings/commoncrypto/binding.py | 8 | ||||
-rw-r--r-- | cryptography/hazmat/bindings/openssl/binding.py | 6 | ||||
-rw-r--r-- | setup.py | 26 | ||||
-rw-r--r-- | tests/hazmat/backends/test_commoncrypto.py | 5 | ||||
-rw-r--r-- | tests/hazmat/bindings/test_commoncrypto.py | 4 | ||||
-rw-r--r-- | tests/hazmat/bindings/test_openssl.py | 3 |
7 files changed, 38 insertions, 38 deletions
diff --git a/cryptography/hazmat/backends/__init__.py b/cryptography/hazmat/backends/__init__.py index ae78822c..b0f663fe 100644 --- a/cryptography/hazmat/backends/__init__.py +++ b/cryptography/hazmat/backends/__init__.py @@ -13,13 +13,9 @@ from __future__ import absolute_import, division, print_function +import pkg_resources + from cryptography.hazmat.backends.multibackend import MultiBackend -from cryptography.hazmat.bindings.commoncrypto.binding import ( - Binding as CommonCryptoBinding -) -from cryptography.hazmat.bindings.openssl.binding import ( - Binding as OpenSSLBinding -) _available_backends_list = None @@ -29,19 +25,15 @@ def _available_backends(): global _available_backends_list if _available_backends_list is None: - _available_backends_list = [] - - if CommonCryptoBinding.is_available(): - from cryptography.hazmat.backends import commoncrypto - _available_backends_list.append(commoncrypto.backend) - - if OpenSSLBinding.is_available(): - from cryptography.hazmat.backends import openssl - _available_backends_list.append(openssl.backend) + _available_backends_list = [ + backend.load(require=False) + for backend in pkg_resources.iter_entry_points( + "cryptography.backends" + ) + ] return _available_backends_list - _default_backend = None diff --git a/cryptography/hazmat/bindings/commoncrypto/binding.py b/cryptography/hazmat/bindings/commoncrypto/binding.py index ee7378ad..ee09bebd 100644 --- a/cryptography/hazmat/bindings/commoncrypto/binding.py +++ b/cryptography/hazmat/bindings/commoncrypto/binding.py @@ -13,9 +13,6 @@ from __future__ import absolute_import, division, print_function -import platform -import sys - from cryptography.hazmat.bindings.utils import build_ffi @@ -53,8 +50,3 @@ class Binding(object): modules=cls._modules, extra_link_args=["-framework", "Security"] ) - - @classmethod - def is_available(cls): - return sys.platform == "darwin" and list(map( - int, platform.mac_ver()[0].split("."))) >= [10, 8, 0] diff --git a/cryptography/hazmat/bindings/openssl/binding.py b/cryptography/hazmat/bindings/openssl/binding.py index 4cbe3c5b..37891f6b 100644 --- a/cryptography/hazmat/bindings/openssl/binding.py +++ b/cryptography/hazmat/bindings/openssl/binding.py @@ -116,12 +116,6 @@ class Binding(object): assert res != 0 @classmethod - def is_available(cls): - # For now, OpenSSL is considered our "default" binding, so we treat it - # as always available. - return True - - @classmethod def init_static_locks(cls): with cls._lock_init_lock: cls._ensure_ffi_initialized() @@ -14,6 +14,7 @@ from __future__ import absolute_import, division, print_function import os +import platform import subprocess import sys from distutils.command.build import build @@ -32,13 +33,15 @@ with open(os.path.join(base_dir, "cryptography", "__about__.py")) as f: exec(f.read(), about) +SETUPTOOLS_DEPENDENCY = "setuptools" CFFI_DEPENDENCY = "cffi>=0.8" SIX_DEPENDENCY = "six>=1.4.1" VECTORS_DEPENDENCY = "cryptography_vectors=={0}".format(about['__version__']) requirements = [ CFFI_DEPENDENCY, - SIX_DEPENDENCY + SIX_DEPENDENCY, + SETUPTOOLS_DEPENDENCY ] # If you add a new dep here you probably need to add it in the tox.ini as well @@ -55,6 +58,21 @@ if not os.path.exists(os.path.join(base_dir, "vectors/setup.py")): test_requirements.append(VECTORS_DEPENDENCY) +def cc_is_available(): + return sys.platform == "darwin" and list(map( + int, platform.mac_ver()[0].split("."))) >= [10, 8, 0] + + +backends = [ + "openssl = cryptography.hazmat.backends.openssl:backend" +] + +if cc_is_available(): + backends.append( + "commoncrypto = cryptography.hazmat.backends.commoncrypto:backend", + ) + + def get_ext_modules(): from cryptography.hazmat.bindings.commoncrypto.binding import ( Binding as CommonCryptoBinding @@ -69,7 +87,7 @@ def get_ext_modules(): constant_time._ffi.verifier.get_extension(), padding._ffi.verifier.get_extension() ] - if CommonCryptoBinding.is_available(): + if cc_is_available(): ext_modules.append(CommonCryptoBinding().ffi.verifier.get_extension()) return ext_modules @@ -173,5 +191,9 @@ setup( "build": CFFIBuild, "install": CFFIInstall, "test": PyTest, + }, + + entry_points={ + "cryptography.backends": backends, } ) diff --git a/tests/hazmat/backends/test_commoncrypto.py b/tests/hazmat/backends/test_commoncrypto.py index e2c6f4a0..28d1a6ca 100644 --- a/tests/hazmat/backends/test_commoncrypto.py +++ b/tests/hazmat/backends/test_commoncrypto.py @@ -17,7 +17,7 @@ import pytest from cryptography import utils from cryptography.exceptions import InternalError, _Reasons -from cryptography.hazmat.bindings.commoncrypto.binding import Binding +from cryptography.hazmat.backends import _available_backends from cryptography.hazmat.primitives import interfaces from cryptography.hazmat.primitives.ciphers.algorithms import AES from cryptography.hazmat.primitives.ciphers.base import Cipher @@ -32,7 +32,8 @@ class DummyCipher(object): block_size = 128 -@pytest.mark.skipif(not Binding.is_available(), +@pytest.mark.skipif("commoncrypto" not in + [i.name for i in _available_backends()], reason="CommonCrypto not available") class TestCommonCrypto(object): def test_supports_cipher(self): diff --git a/tests/hazmat/bindings/test_commoncrypto.py b/tests/hazmat/bindings/test_commoncrypto.py index 0332674b..71c832ef 100644 --- a/tests/hazmat/bindings/test_commoncrypto.py +++ b/tests/hazmat/bindings/test_commoncrypto.py @@ -15,10 +15,12 @@ from __future__ import absolute_import, division, print_function import pytest +from cryptography.hazmat.backends import _available_backends from cryptography.hazmat.bindings.commoncrypto.binding import Binding -@pytest.mark.skipif(not Binding.is_available(), +@pytest.mark.skipif("commoncrypto" not in + [i.name for i in _available_backends()], reason="CommonCrypto not available") class TestCommonCrypto(object): def test_binding_loads(self): diff --git a/tests/hazmat/bindings/test_openssl.py b/tests/hazmat/bindings/test_openssl.py index d22c4fd2..ca6e9ab0 100644 --- a/tests/hazmat/bindings/test_openssl.py +++ b/tests/hazmat/bindings/test_openssl.py @@ -27,9 +27,6 @@ class TestOpenSSL(object): assert binding.lib assert binding.ffi - def test_is_available(self): - assert Binding.is_available() is True - def test_crypto_lock_init(self): b = Binding() b.init_static_locks() |