aboutsummaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
authorPaul Kehrer <paul.l.kehrer@gmail.com>2013-10-18 18:08:49 -0500
committerPaul Kehrer <paul.l.kehrer@gmail.com>2013-10-18 18:08:49 -0500
commitbde6fb52129909cf319157dba95d65fb557d5013 (patch)
treebf8b7f02ec9560fd5446239cc0bd27ac995e3a3f /tests
parent87cd0db396e157b3fb160b8b6fd770e2c661ace2 (diff)
downloadcryptography-bde6fb52129909cf319157dba95d65fb557d5013.tar.gz
cryptography-bde6fb52129909cf319157dba95d65fb557d5013.tar.bz2
cryptography-bde6fb52129909cf319157dba95d65fb557d5013.zip
Hash Saga Part 3 - API changes + SHA1 support + tests
Diffstat (limited to 'tests')
-rw-r--r--tests/primitives/test_hash_vectors.py35
-rw-r--r--tests/primitives/test_hashes.py28
-rw-r--r--tests/primitives/test_utils.py24
-rw-r--r--tests/primitives/utils.py55
4 files changed, 141 insertions, 1 deletions
diff --git a/tests/primitives/test_hash_vectors.py b/tests/primitives/test_hash_vectors.py
new file mode 100644
index 00000000..4b71ad70
--- /dev/null
+++ b/tests/primitives/test_hash_vectors.py
@@ -0,0 +1,35 @@
+# 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 os
+
+from cryptography.primitives import hashes
+
+from .utils import generate_hash_test
+from ..utils import load_hash_vectors_from_file
+
+
+class TestSHA1(object):
+ test_SHA1 = generate_hash_test(
+ load_hash_vectors_from_file,
+ os.path.join("NIST", "SHABYTE"),
+ [
+ "SHA1LongMsg.rsp",
+ "SHA1ShortMsg.rsp",
+ ],
+ lambda api: hashes.SHA1(api=api),
+ only_if=lambda api: api.supports_hash("sha1"),
+ skip_message="Does not support SHA1",
+ )
diff --git a/tests/primitives/test_hashes.py b/tests/primitives/test_hashes.py
new file mode 100644
index 00000000..3419b14d
--- /dev/null
+++ b/tests/primitives/test_hashes.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
+
+from cryptography.primitives import hashes
+
+from .utils import generate_base_hash_test
+
+
+class TestSHA1(object):
+ test_SHA1 = generate_base_hash_test(
+ lambda api: hashes.SHA1(api=api),
+ digest_size=20,
+ block_size=64,
+ only_if=lambda api: api.supports_hash("sha1"),
+ skip_message="Does not support SHA1",
+ )
diff --git a/tests/primitives/test_utils.py b/tests/primitives/test_utils.py
index 4666ece7..43ec8a71 100644
--- a/tests/primitives/test_utils.py
+++ b/tests/primitives/test_utils.py
@@ -1,6 +1,6 @@
import pytest
-from .utils import encrypt_test
+from .utils import encrypt_test, hash_test, base_hash_test
class TestEncryptTest(object):
@@ -12,3 +12,25 @@ class TestEncryptTest(object):
skip_message="message!"
)
assert exc_info.value.args[0] == "message!"
+
+
+class TestHashTest(object):
+ def test_skips_if_only_if_returns_false(self):
+ with pytest.raises(pytest.skip.Exception) as exc_info:
+ hash_test(
+ None, None, None,
+ only_if=lambda api: False,
+ skip_message="message!"
+ )
+ assert exc_info.value.args[0] == "message!"
+
+
+class TestBaseHashTest(object):
+ def test_skips_if_only_if_returns_false(self):
+ with pytest.raises(pytest.skip.Exception) as exc_info:
+ base_hash_test(
+ None, None, None, None,
+ only_if=lambda api: False,
+ skip_message="message!"
+ )
+ assert exc_info.value.args[0] == "message!"
diff --git a/tests/primitives/utils.py b/tests/primitives/utils.py
index 3cf08c28..f301199c 100644
--- a/tests/primitives/utils.py
+++ b/tests/primitives/utils.py
@@ -40,3 +40,58 @@ def encrypt_test(api, cipher_factory, mode_factory, params, only_if,
actual_ciphertext = cipher.encrypt(binascii.unhexlify(plaintext))
actual_ciphertext += cipher.finalize()
assert actual_ciphertext == binascii.unhexlify(ciphertext)
+
+
+def generate_hash_test(param_loader, path, file_names, hash_factory,
+ only_if=lambda api: True, skip_message=None):
+ def test_hash(self):
+ for api in _ALL_APIS:
+ for file_name in file_names:
+ for params in param_loader(os.path.join(path, file_name)):
+ yield (
+ hash_test,
+ api,
+ hash_factory,
+ params,
+ only_if,
+ skip_message
+ )
+ return test_hash
+
+
+def hash_test(api, hash_factory, params, only_if, skip_message):
+ if not only_if(api):
+ pytest.skip(skip_message)
+ msg = params[0]
+ md = params[1]
+ m = hash_factory(api)
+ m.update(binascii.unhexlify(msg))
+ assert m.hexdigest() == md.replace(" ", "").lower()
+
+
+def generate_base_hash_test(hash_factory, digest_size, block_size,
+ only_if=lambda api: True, skip_message=None):
+ def test_base_hash(self):
+ for api in _ALL_APIS:
+ yield (
+ base_hash_test,
+ api,
+ hash_factory,
+ digest_size,
+ block_size,
+ only_if,
+ skip_message,
+ )
+ return test_base_hash
+
+
+def base_hash_test(api, hash_factory, digest_size, block_size, only_if,
+ skip_message):
+ if not only_if(api):
+ pytest.skip(skip_message)
+ m = hash_factory(api=api)
+ assert m.digest_size == digest_size
+ assert m.block_size == block_size
+ m_copy = m.copy()
+ assert m != m_copy
+ assert m._ctx != m_copy._ctx