diff options
author | Alex Gaynor <alex.gaynor@gmail.com> | 2013-10-03 09:24:58 -0700 |
---|---|---|
committer | Alex Gaynor <alex.gaynor@gmail.com> | 2013-10-03 09:24:58 -0700 |
commit | 814efab2a71a869d362c0b488b6c51bb590f0d23 (patch) | |
tree | ecb2eefd8b37a8ee2135130a720ca8134cafea52 | |
parent | 14fdcd186c9f6c7ccc1e6388347cd584822bc041 (diff) | |
download | cryptography-814efab2a71a869d362c0b488b6c51bb590f0d23.tar.gz cryptography-814efab2a71a869d362c0b488b6c51bb590f0d23.tar.bz2 cryptography-814efab2a71a869d362c0b488b6c51bb590f0d23.zip |
Explicitly pass around the API, and run all tests under all available APIs
-rw-r--r-- | cryptography/bindings/__init__.py | 17 | ||||
-rw-r--r-- | cryptography/primitives/block/base.py | 10 | ||||
-rw-r--r-- | tests/conftest.py | 5 | ||||
-rw-r--r-- | tests/primitives/test_block.py | 20 | ||||
-rw-r--r-- | tests/primitives/test_nist.py | 36 |
5 files changed, 61 insertions, 27 deletions
diff --git a/cryptography/bindings/__init__.py b/cryptography/bindings/__init__.py index e69de29b..b4dc6bf1 100644 --- a/cryptography/bindings/__init__.py +++ b/cryptography/bindings/__init__.py @@ -0,0 +1,17 @@ +# 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 cryptography.bindings.openssl import api + + +default_api = api diff --git a/cryptography/primitives/block/base.py b/cryptography/primitives/block/base.py index b4137fd4..833ebe9b 100644 --- a/cryptography/primitives/block/base.py +++ b/cryptography/primitives/block/base.py @@ -15,8 +15,7 @@ from __future__ import absolute_import, division, print_function from enum import Enum -# TODO: which binding is used should be an option somewhere -from cryptography.bindings.openssl import api +from cryptography.bindings import default_api class _Operation(Enum): @@ -25,10 +24,11 @@ class _Operation(Enum): class BlockCipher(object): - def __init__(self, cipher, mode): + def __init__(self, cipher, mode, api=default_api): super(BlockCipher, self).__init__() self.cipher = cipher self.mode = mode + self._api = api self._ctx = api.create_block_cipher_context(cipher, mode) self._operation = None @@ -48,14 +48,14 @@ class BlockCipher(object): raise ValueError("BlockCipher cannot encrypt when the operation is" " set to %s" % self._operation.name) - return api.update_encrypt_context(self._ctx, plaintext) + return self._api.update_encrypt_context(self._ctx, plaintext) def finalize(self): if self._ctx is None: raise ValueError("BlockCipher was already finalized") if self._operation is _Operation.encrypt: - result = api.finalize_encrypt_context(self._ctx) + result = self._api.finalize_encrypt_context(self._ctx) else: raise ValueError("BlockCipher cannot finalize the unknown " "operation %s" % self._operation.name) diff --git a/tests/conftest.py b/tests/conftest.py new file mode 100644 index 00000000..d16be3b6 --- /dev/null +++ b/tests/conftest.py @@ -0,0 +1,5 @@ +def pytest_generate_tests(metafunc): + from cryptography.bindings.openssl import api + + if "api" in metafunc.fixturenames: + metafunc.parametrize("api", [api]) diff --git a/tests/primitives/test_block.py b/tests/primitives/test_block.py index 774409ca..92fd31a3 100644 --- a/tests/primitives/test_block.py +++ b/tests/primitives/test_block.py @@ -23,17 +23,19 @@ from cryptography.primitives.block.base import _Operation class TestBlockCipher(object): - def test_cipher_name(self): + def test_cipher_name(self, api): cipher = BlockCipher( ciphers.AES(binascii.unhexlify(b"0" * 32)), - modes.CBC(binascii.unhexlify(b"0" * 32)) + modes.CBC(binascii.unhexlify(b"0" * 32)), + api ) assert cipher.name == "AES-128-CBC" - def test_use_after_finalize(self): + def test_use_after_finalize(self, api): cipher = BlockCipher( ciphers.AES(binascii.unhexlify(b"0" * 32)), - modes.CBC(binascii.unhexlify(b"0" * 32)) + modes.CBC(binascii.unhexlify(b"0" * 32)), + api ) cipher.encrypt(b"a" * 16) cipher.finalize() @@ -42,20 +44,22 @@ class TestBlockCipher(object): with pytest.raises(ValueError): cipher.finalize() - def test_encrypt_with_invalid_operation(self): + def test_encrypt_with_invalid_operation(self, api): cipher = BlockCipher( ciphers.AES(binascii.unhexlify(b"0" * 32)), - modes.CBC(binascii.unhexlify(b"0" * 32)) + modes.CBC(binascii.unhexlify(b"0" * 32)), + api ) cipher._operation = _Operation.decrypt with pytest.raises(ValueError): cipher.encrypt(b"b" * 16) - def test_finalize_with_invalid_operation(self): + def test_finalize_with_invalid_operation(self, api): cipher = BlockCipher( ciphers.AES(binascii.unhexlify(b"0" * 32)), - modes.CBC(binascii.unhexlify(b"0" * 32)) + modes.CBC(binascii.unhexlify(b"0" * 32)), + api ) cipher._operation = pretend.stub(name="wat") diff --git a/tests/primitives/test_nist.py b/tests/primitives/test_nist.py index 1e5d2396..261bbd1d 100644 --- a/tests/primitives/test_nist.py +++ b/tests/primitives/test_nist.py @@ -60,10 +60,11 @@ class TestAES_CBC(object): "CBCVarTxt256.rsp", ] ) - def test_KAT(self, key, iv, plaintext, ciphertext): + def test_KAT(self, key, iv, plaintext, ciphertext, api): cipher = BlockCipher( ciphers.AES(binascii.unhexlify(key)), modes.CBC(binascii.unhexlify(iv)), + api ) actual_ciphertext = cipher.encrypt(binascii.unhexlify(plaintext)) actual_ciphertext += cipher.finalize() @@ -78,10 +79,11 @@ class TestAES_CBC(object): "CBCMMT256.rsp", ] ) - def test_MMT(self, key, iv, plaintext, ciphertext): + def test_MMT(self, key, iv, plaintext, ciphertext, api): cipher = BlockCipher( ciphers.AES(binascii.unhexlify(key)), modes.CBC(binascii.unhexlify(iv)), + api ) actual_ciphertext = cipher.encrypt(binascii.unhexlify(plaintext)) actual_ciphertext += cipher.finalize() @@ -107,10 +109,11 @@ class TestAES_ECB(object): "ECBVarTxt256.rsp", ] ) - def test_KAT(self, key, plaintext, ciphertext): + def test_KAT(self, key, plaintext, ciphertext, api): cipher = BlockCipher( ciphers.AES(binascii.unhexlify(key)), - modes.ECB() + modes.ECB(), + api ) actual_ciphertext = cipher.encrypt(binascii.unhexlify(plaintext)) actual_ciphertext += cipher.finalize() @@ -125,10 +128,11 @@ class TestAES_ECB(object): "ECBMMT256.rsp", ] ) - def test_MMT(self, key, plaintext, ciphertext): + def test_MMT(self, key, plaintext, ciphertext, api): cipher = BlockCipher( ciphers.AES(binascii.unhexlify(key)), - modes.ECB() + modes.ECB(), + api ) actual_ciphertext = cipher.encrypt(binascii.unhexlify(plaintext)) actual_ciphertext += cipher.finalize() @@ -154,10 +158,11 @@ class TestAES_OFB(object): "OFBVarTxt256.rsp", ] ) - def test_KAT(self, key, iv, plaintext, ciphertext): + def test_KAT(self, key, iv, plaintext, ciphertext, api): cipher = BlockCipher( ciphers.AES(binascii.unhexlify(key)), - modes.OFB(binascii.unhexlify(iv)) + modes.OFB(binascii.unhexlify(iv)), + api ) actual_ciphertext = cipher.encrypt(binascii.unhexlify(plaintext)) actual_ciphertext += cipher.finalize() @@ -172,10 +177,11 @@ class TestAES_OFB(object): "OFBMMT256.rsp", ] ) - def test_MMT(self, key, iv, plaintext, ciphertext): + def test_MMT(self, key, iv, plaintext, ciphertext, api): cipher = BlockCipher( ciphers.AES(binascii.unhexlify(key)), - modes.OFB(binascii.unhexlify(iv)) + modes.OFB(binascii.unhexlify(iv)), + api ) actual_ciphertext = cipher.encrypt(binascii.unhexlify(plaintext)) actual_ciphertext += cipher.finalize() @@ -201,10 +207,11 @@ class TestAES_CFB(object): "CFB128VarTxt256.rsp", ] ) - def test_KAT(self, key, iv, plaintext, ciphertext): + def test_KAT(self, key, iv, plaintext, ciphertext, api): cipher = BlockCipher( ciphers.AES(binascii.unhexlify(key)), - modes.CFB(binascii.unhexlify(iv)) + modes.CFB(binascii.unhexlify(iv)), + api ) actual_ciphertext = cipher.encrypt(binascii.unhexlify(plaintext)) actual_ciphertext += cipher.finalize() @@ -219,10 +226,11 @@ class TestAES_CFB(object): "CFB128MMT256.rsp", ] ) - def test_MMT(self, key, iv, plaintext, ciphertext): + def test_MMT(self, key, iv, plaintext, ciphertext, api): cipher = BlockCipher( ciphers.AES(binascii.unhexlify(key)), - modes.CFB(binascii.unhexlify(iv)) + modes.CFB(binascii.unhexlify(iv)), + api ) actual_ciphertext = cipher.encrypt(binascii.unhexlify(plaintext)) actual_ciphertext += cipher.finalize() |