From 0b717d42fb3ee27bf77c31c60ba5eef182e6fa84 Mon Sep 17 00:00:00 2001 From: Paul Kehrer Date: Sun, 9 Mar 2014 18:55:56 -0400 Subject: workaround for cffi issue 140. refs #762 --- cryptography/hazmat/bindings/utils.py | 36 ++++++++++++++++++++++++++++------- 1 file changed, 29 insertions(+), 7 deletions(-) diff --git a/cryptography/hazmat/bindings/utils.py b/cryptography/hazmat/bindings/utils.py index b8253483..1d07cd97 100644 --- a/cryptography/hazmat/bindings/utils.py +++ b/cryptography/hazmat/bindings/utils.py @@ -13,6 +13,8 @@ from __future__ import absolute_import, division, print_function +import binascii + import sys import cffi @@ -60,14 +62,16 @@ def build_ffi(module_prefix, modules, pre_include, post_include, libraries): # is legal, but the following will fail to compile: # int foo(int); # int foo(short); + source = "\n".join( + [pre_include] + + includes + + [post_include] + + functions + + customizations + ) lib = ffi.verify( - source="\n".join( - [pre_include] + - includes + - [post_include] + - functions + - customizations - ), + source=source, + modulename=create_modulename(ffi, source), libraries=libraries, ext_package="cryptography", ) @@ -81,3 +85,21 @@ def build_ffi(module_prefix, modules, pre_include, post_include, libraries): delattr(lib, name) return ffi, lib + + +def create_modulename(ffi, source): + """ + cffi creates a modulename internally that incorporates the cffi version. + This will cause cryptography's wheels to break when the version of cffi + the user has does not match what was used when building the wheel. To + resolve this we build our own modulename that uses most of the same code + from cffi but elides the version key. + """ + key = '\x00'.join([sys.version[:3], source] + ffi._cdefsources) + if sys.version_info >= (3,): + key = key.encode('utf-8') + k1 = hex(binascii.crc32(key[0::2]) & 0xffffffff) + k1 = k1.lstrip('0x').rstrip('L') + k2 = hex(binascii.crc32(key[1::2]) & 0xffffffff) + k2 = k2.lstrip('0').rstrip('L') + return '_cffi_{0}{1}'.format(k1, k2) -- cgit v1.2.3 From 2d1d3bbc49ab3a15069591fac36f8fd59f424233 Mon Sep 17 00:00:00 2001 From: Paul Kehrer Date: Thu, 13 Mar 2014 13:46:10 -0400 Subject: make create_modulename private, add test --- cryptography/hazmat/bindings/utils.py | 12 ++++++++---- tests/hazmat/bindings/test_utils.py | 28 ++++++++++++++++++++++++++++ 2 files changed, 36 insertions(+), 4 deletions(-) create mode 100644 tests/hazmat/bindings/test_utils.py diff --git a/cryptography/hazmat/bindings/utils.py b/cryptography/hazmat/bindings/utils.py index 1d07cd97..3da0412e 100644 --- a/cryptography/hazmat/bindings/utils.py +++ b/cryptography/hazmat/bindings/utils.py @@ -71,7 +71,11 @@ def build_ffi(module_prefix, modules, pre_include, post_include, libraries): ) lib = ffi.verify( source=source, - modulename=create_modulename(ffi, source), + modulename=_create_modulename( + ffi, source, + sys.version, + sys.version_info + ), libraries=libraries, ext_package="cryptography", ) @@ -87,7 +91,7 @@ def build_ffi(module_prefix, modules, pre_include, post_include, libraries): return ffi, lib -def create_modulename(ffi, source): +def _create_modulename(ffi, source, sys_version, sys_version_info): """ cffi creates a modulename internally that incorporates the cffi version. This will cause cryptography's wheels to break when the version of cffi @@ -95,8 +99,8 @@ def create_modulename(ffi, source): resolve this we build our own modulename that uses most of the same code from cffi but elides the version key. """ - key = '\x00'.join([sys.version[:3], source] + ffi._cdefsources) - if sys.version_info >= (3,): + key = '\x00'.join([sys_version[:3], source] + ffi._cdefsources) + if sys_version_info >= (3,): key = key.encode('utf-8') k1 = hex(binascii.crc32(key[0::2]) & 0xffffffff) k1 = k1.lstrip('0x').rstrip('L') diff --git a/tests/hazmat/bindings/test_utils.py b/tests/hazmat/bindings/test_utils.py new file mode 100644 index 00000000..d458972e --- /dev/null +++ b/tests/hazmat/bindings/test_utils.py @@ -0,0 +1,28 @@ +# 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 sys + +import pretend + +from cryptography.hazmat.bindings import utils + + +def test_create_modulename(): + pretend_ffi = pretend.stub(_cdefsources=["cdef sources go here"]) + source = "source code" + name = utils._create_modulename(pretend_ffi, source, sys.version, + sys.version_info) + assert name == "_cffi_bcba7f4bx4a14b588" -- cgit v1.2.3 From 738707729b64ead86ebf71ba6a87a5c1d690b309 Mon Sep 17 00:00:00 2001 From: Paul Kehrer Date: Thu, 13 Mar 2014 14:11:04 -0400 Subject: be less dumb --- cryptography/hazmat/bindings/utils.py | 11 +++-------- tests/hazmat/bindings/test_utils.py | 7 +++---- 2 files changed, 6 insertions(+), 12 deletions(-) diff --git a/cryptography/hazmat/bindings/utils.py b/cryptography/hazmat/bindings/utils.py index 3da0412e..f79d0cb5 100644 --- a/cryptography/hazmat/bindings/utils.py +++ b/cryptography/hazmat/bindings/utils.py @@ -71,11 +71,7 @@ def build_ffi(module_prefix, modules, pre_include, post_include, libraries): ) lib = ffi.verify( source=source, - modulename=_create_modulename( - ffi, source, - sys.version, - sys.version_info - ), + modulename=_create_modulename(ffi, source, sys.version), libraries=libraries, ext_package="cryptography", ) @@ -91,7 +87,7 @@ def build_ffi(module_prefix, modules, pre_include, post_include, libraries): return ffi, lib -def _create_modulename(ffi, source, sys_version, sys_version_info): +def _create_modulename(ffi, source, sys_version): """ cffi creates a modulename internally that incorporates the cffi version. This will cause cryptography's wheels to break when the version of cffi @@ -100,8 +96,7 @@ def _create_modulename(ffi, source, sys_version, sys_version_info): from cffi but elides the version key. """ key = '\x00'.join([sys_version[:3], source] + ffi._cdefsources) - if sys_version_info >= (3,): - key = key.encode('utf-8') + key = key.encode('utf-8') k1 = hex(binascii.crc32(key[0::2]) & 0xffffffff) k1 = k1.lstrip('0x').rstrip('L') k2 = hex(binascii.crc32(key[1::2]) & 0xffffffff) diff --git a/tests/hazmat/bindings/test_utils.py b/tests/hazmat/bindings/test_utils.py index d458972e..2ba391ec 100644 --- a/tests/hazmat/bindings/test_utils.py +++ b/tests/hazmat/bindings/test_utils.py @@ -13,8 +13,6 @@ from __future__ import absolute_import, division, print_function -import sys - import pretend from cryptography.hazmat.bindings import utils @@ -23,6 +21,7 @@ from cryptography.hazmat.bindings import utils def test_create_modulename(): pretend_ffi = pretend.stub(_cdefsources=["cdef sources go here"]) source = "source code" - name = utils._create_modulename(pretend_ffi, source, sys.version, - sys.version_info) + name = utils._create_modulename(pretend_ffi, source, "2.7") assert name == "_cffi_bcba7f4bx4a14b588" + name = utils._create_modulename(pretend_ffi, source, "3.2") + assert name == "_cffi_a7462526x4a14b588" -- cgit v1.2.3 From 0b3257d1cbd577dc530acbd731bb8cf609c5d0bc Mon Sep 17 00:00:00 2001 From: Paul Kehrer Date: Mon, 17 Mar 2014 17:36:15 -0400 Subject: address review comments --- cryptography/hazmat/bindings/utils.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/cryptography/hazmat/bindings/utils.py b/cryptography/hazmat/bindings/utils.py index f79d0cb5..318b82bb 100644 --- a/cryptography/hazmat/bindings/utils.py +++ b/cryptography/hazmat/bindings/utils.py @@ -52,7 +52,8 @@ def build_ffi(module_prefix, modules, pre_include, post_include, libraries): includes.append(module.INCLUDES) customizations.append(module.CUSTOMIZATIONS) - ffi.cdef("\n".join(types + functions + macros)) + cdef_sources = types + functions + macros + ffi.cdef("\n".join(cdef_sources)) # 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 @@ -71,7 +72,7 @@ def build_ffi(module_prefix, modules, pre_include, post_include, libraries): ) lib = ffi.verify( source=source, - modulename=_create_modulename(ffi, source, sys.version), + modulename=_create_modulename(cdef_sources, source, sys.version), libraries=libraries, ext_package="cryptography", ) @@ -87,7 +88,7 @@ def build_ffi(module_prefix, modules, pre_include, post_include, libraries): return ffi, lib -def _create_modulename(ffi, source, sys_version): +def _create_modulename(cdef_sources, source, sys_version): """ cffi creates a modulename internally that incorporates the cffi version. This will cause cryptography's wheels to break when the version of cffi @@ -95,10 +96,10 @@ def _create_modulename(ffi, source, sys_version): resolve this we build our own modulename that uses most of the same code from cffi but elides the version key. """ - key = '\x00'.join([sys_version[:3], source] + ffi._cdefsources) + key = '\x00'.join([sys_version[:3], source] + cdef_sources) key = key.encode('utf-8') k1 = hex(binascii.crc32(key[0::2]) & 0xffffffff) k1 = k1.lstrip('0x').rstrip('L') k2 = hex(binascii.crc32(key[1::2]) & 0xffffffff) k2 = k2.lstrip('0').rstrip('L') - return '_cffi_{0}{1}'.format(k1, k2) + return '_Cryptography_cffi_{0}{1}'.format(k1, k2) -- cgit v1.2.3 From 5b143b42ae4ebcb43cd1a52d361dd0e2e46ca2d6 Mon Sep 17 00:00:00 2001 From: Paul Kehrer Date: Mon, 17 Mar 2014 17:58:42 -0400 Subject: should probably update the test too --- tests/hazmat/bindings/test_utils.py | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/tests/hazmat/bindings/test_utils.py b/tests/hazmat/bindings/test_utils.py index 2ba391ec..0d5b34de 100644 --- a/tests/hazmat/bindings/test_utils.py +++ b/tests/hazmat/bindings/test_utils.py @@ -13,15 +13,13 @@ from __future__ import absolute_import, division, print_function -import pretend - from cryptography.hazmat.bindings import utils def test_create_modulename(): - pretend_ffi = pretend.stub(_cdefsources=["cdef sources go here"]) + cdef_sources = ["cdef sources go here"] source = "source code" - name = utils._create_modulename(pretend_ffi, source, "2.7") - assert name == "_cffi_bcba7f4bx4a14b588" - name = utils._create_modulename(pretend_ffi, source, "3.2") - assert name == "_cffi_a7462526x4a14b588" + name = utils._create_modulename(cdef_sources, source, "2.7") + assert name == "_Cryptography_cffi_bcba7f4bx4a14b588" + name = utils._create_modulename(cdef_sources, source, "3.2") + assert name == "_Cryptography_cffi_a7462526x4a14b588" -- cgit v1.2.3