aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--cryptography/bindings/__init__.py17
-rw-r--r--cryptography/primitives/block/base.py14
-rw-r--r--tests/conftest.py5
-rw-r--r--tests/primitives/test_block.py25
-rw-r--r--tests/primitives/test_nist.py36
-rw-r--r--tox.ini7
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()
diff --git a/tox.ini b/tox.ini
index 4d17ebe8..0a28af15 100644
--- a/tox.ini
+++ b/tox.ini
@@ -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