diff options
-rw-r--r-- | cryptography/bindings/__init__.py | 17 | ||||
-rw-r--r-- | cryptography/primitives/block/base.py | 14 | ||||
-rw-r--r-- | tests/conftest.py | 5 | ||||
-rw-r--r-- | tests/primitives/test_block.py | 25 | ||||
-rw-r--r-- | tests/primitives/test_nist.py | 36 | ||||
-rw-r--r-- | tox.ini | 7 |
6 files changed, 76 insertions, 28 deletions
diff --git a/cryptography/bindings/__init__.py b/cryptography/bindings/__init__.py index e69de29b..8b165009 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..b84ca9c4 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,15 @@ class _Operation(Enum): class BlockCipher(object): - def __init__(self, cipher, mode): + def __init__(self, cipher, mode, api=None): super(BlockCipher, self).__init__() + + if api is None: + api = _default_api + self.cipher = cipher self.mode = mode + self._api = api self._ctx = api.create_block_cipher_context(cipher, mode) self._operation = None @@ -48,14 +52,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..774885fa 100644 --- a/tests/primitives/test_block.py +++ b/tests/primitives/test_block.py @@ -23,18 +23,27 @@ 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_instantiate_without_api(self): cipher = BlockCipher( ciphers.AES(binascii.unhexlify(b"0" * 32)), modes.CBC(binascii.unhexlify(b"0" * 32)) ) + assert cipher.name == "AES-128-CBC" + + def test_use_after_finalize(self, api): + cipher = BlockCipher( + ciphers.AES(binascii.unhexlify(b"0" * 32)), + modes.CBC(binascii.unhexlify(b"0" * 32)), + api + ) cipher.encrypt(b"a" * 16) cipher.finalize() with pytest.raises(ValueError): @@ -42,20 +51,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() @@ -3,9 +3,12 @@ envlist = py26,py27,pypy,py32,py33,docs,pep8 [testenv] deps = - pytest-cov + pytest + coverage pretend -commands = py.test --cov=cryptography/ --cov=tests/ +commands = + coverage run --source=cryptography/,tests/ -m pytest + coverage report -m [testenv:docs] deps = sphinx |