aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--cryptography/hazmat/bindings/openssl/binding.py8
-rw-r--r--cryptography/hazmat/bindings/utils.py8
-rw-r--r--tests/hazmat/bindings/test_bindings.py32
-rw-r--r--tests/hazmat/bindings/test_openssl.py3
4 files changed, 50 insertions, 1 deletions
diff --git a/cryptography/hazmat/bindings/openssl/binding.py b/cryptography/hazmat/bindings/openssl/binding.py
index 4f6b99ae..2a1e1184 100644
--- a/cryptography/hazmat/bindings/openssl/binding.py
+++ b/cryptography/hazmat/bindings/openssl/binding.py
@@ -13,7 +13,9 @@
from __future__ import absolute_import, division, print_function
-from cryptography.hazmat.bindings.utils import build_ffi
+from cryptography.hazmat.bindings.utils import (
+ build_ffi, binding_available
+)
_OSX_PRE_INCLUDE = """
#ifdef __APPLE__
@@ -79,3 +81,7 @@ class Binding(object):
cls.ffi, cls.lib = build_ffi(cls._module_prefix, cls._modules,
_OSX_PRE_INCLUDE, _OSX_POST_INCLUDE,
["crypto", "ssl"])
+
+ @classmethod
+ def is_available(cls):
+ return binding_available(cls._ensure_ffi_initialized)
diff --git a/cryptography/hazmat/bindings/utils.py b/cryptography/hazmat/bindings/utils.py
index 9e1d3937..9141c155 100644
--- a/cryptography/hazmat/bindings/utils.py
+++ b/cryptography/hazmat/bindings/utils.py
@@ -86,3 +86,11 @@ def build_ffi(module_prefix, modules, pre_include, post_include, libraries):
delattr(lib, name)
return ffi, lib
+
+
+def binding_available(initializer):
+ try:
+ initializer()
+ return True
+ except cffi.VerificationError:
+ return False
diff --git a/tests/hazmat/bindings/test_bindings.py b/tests/hazmat/bindings/test_bindings.py
new file mode 100644
index 00000000..7af1d581
--- /dev/null
+++ b/tests/hazmat/bindings/test_bindings.py
@@ -0,0 +1,32 @@
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+# implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+from __future__ import absolute_import, division, print_function
+
+import cffi
+
+from cryptography.hazmat.bindings.utils import binding_available
+from cryptography.hazmat.bindings.openssl.binding import Binding
+
+
+def dummy_initializer():
+ ffi = cffi.FFI()
+ ffi.verify(source="#include <fake_header.h>")
+
+
+def test_binding_available():
+ assert binding_available(Binding._ensure_ffi_initialized) is True
+
+
+def test_binding_unavailable():
+ assert binding_available(dummy_initializer) is False
diff --git a/tests/hazmat/bindings/test_openssl.py b/tests/hazmat/bindings/test_openssl.py
index 31f736ab..d1e85058 100644
--- a/tests/hazmat/bindings/test_openssl.py
+++ b/tests/hazmat/bindings/test_openssl.py
@@ -20,3 +20,6 @@ class TestOpenSSL(object):
assert binding
assert binding.lib
assert binding.ffi
+
+ def test_is_available(self):
+ assert Binding.is_available() is True