Repository: pyca/cryptography

Issue:
Binding.is_avaialble can print to stderr
Specifically it'll print an error message, you can see this if you run `tests/hazmat/bindings/test_bindings.py`



Discussion:
One way to fix this is just to avoid it. If we change the verify from an include that doesn't exist to invalid C then it'll fail with a VerificationError and not print to stderr.

As noted in 409, I should really remember to pass `-s` if I'm going to test directly. Invalid syntax isn't going to stop this.

This is probably more of a problem for usage outside of the tests?

Yes, I'd think so. When we have bindings that aren't available everywhere,
users shouldn't have to see it.

On Sun, Jan 5, 2014 at 9:37 AM, Alex Stapleton notifications@github.comwrote:

> This is probably more of a problem for usage outside of the tests?
> 
> —
> Reply to this email directly or view it on GitHubhttps://github.com/pyca/cryptography/issues/408#issuecomment-31609992
> .

## 

"I disapprove of what you say, but I will defend to the death your right to
say it." -- Evelyn Beatrice Hall (summarizing Voltaire)
"The people's good is the highest law." -- Cicero
GPG Key fingerprint: 125F 5C67 DFE9 4084

So, I think we should rethink the implementation here. I think for now `is_avialable` should be `return True` on OpenSSL -- we need it. And when we do common crypto it should be `sys.platform == "drawin"`. Right now it can mask errors.


Resolving patch:
diff --git a/cryptography/hazmat/bindings/openssl/binding.py b/cryptography/hazmat/bindings/openssl/binding.py
--- a/cryptography/hazmat/bindings/openssl/binding.py
+++ b/cryptography/hazmat/bindings/openssl/binding.py
@@ -13,9 +13,8 @@
 
 from __future__ import absolute_import, division, print_function
 
-from cryptography.hazmat.bindings.utils import (
-    build_ffi, binding_available
-)
+from cryptography.hazmat.bindings.utils import build_ffi
+
 
 _OSX_PRE_INCLUDE = """
 #ifdef __APPLE__
@@ -84,4 +83,5 @@ def _ensure_ffi_initialized(cls):
 
     @classmethod
     def is_available(cls):
-        return binding_available(cls._ensure_ffi_initialized)
+        # OpenSSL is the only binding so for now it must always be available
+        return True
diff --git a/cryptography/hazmat/bindings/utils.py b/cryptography/hazmat/bindings/utils.py
--- a/cryptography/hazmat/bindings/utils.py
+++ b/cryptography/hazmat/bindings/utils.py
@@ -87,11 +87,3 @@ 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


Test patch:
diff --git a/tests/hazmat/bindings/test_bindings.py b/tests/hazmat/bindings/test_bindings.py
deleted file mode 100644
--- a/tests/hazmat/bindings/test_bindings.py
+++ /dev/null
@@ -1,32 +0,0 @@
-# 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