diff options
author | Donald Stufft <donald@stufft.io> | 2013-10-18 17:35:07 -0700 |
---|---|---|
committer | Donald Stufft <donald@stufft.io> | 2013-10-18 17:35:07 -0700 |
commit | f6c61eb4a475a8579885d015e54aa65b8528083b (patch) | |
tree | d2421ebcab14687d06104dd44bfec22a8a09244a | |
parent | c1061753ef6a7276c33f76df954f7097c8b78303 (diff) | |
parent | 87cd0db396e157b3fb160b8b6fd770e2c661ace2 (diff) | |
download | cryptography-f6c61eb4a475a8579885d015e54aa65b8528083b.tar.gz cryptography-f6c61eb4a475a8579885d015e54aa65b8528083b.tar.bz2 cryptography-f6c61eb4a475a8579885d015e54aa65b8528083b.zip |
Merge pull request #121 from reaperhulk/hash-saga-loaders
hash vector loader and tests (Hash Saga Part 2)
-rw-r--r-- | tests/test_utils.py | 58 | ||||
-rw-r--r-- | tests/utils.py | 35 |
2 files changed, 92 insertions, 1 deletions
diff --git a/tests/test_utils.py b/tests/test_utils.py index 28e7407b..a9bb6a87 100644 --- a/tests/test_utils.py +++ b/tests/test_utils.py @@ -13,9 +13,12 @@ import textwrap +import pytest + from .utils import (load_nist_vectors, load_nist_vectors_from_file, load_cryptrec_vectors, load_cryptrec_vectors_from_file, - load_openssl_vectors, load_openssl_vectors_from_file) + load_openssl_vectors, load_openssl_vectors_from_file, load_hash_vectors, + load_hash_vectors_from_file) def test_load_nist_vectors_encrypt(): @@ -360,3 +363,56 @@ def test_load_openssl_vectors_from_file(): "ciphertext": b"D776379BE0E50825E681DA1A4C980E8E", }, ] + + +def test_load_hash_vectors(): + vector_data = textwrap.dedent(""" + + # http://tools.ietf.org/html/rfc1321 + [irrelevant] + + Len = 0 + Msg = 00 + MD = d41d8cd98f00b204e9800998ecf8427e + + Len = 8 + Msg = 61 + MD = 0cc175b9c0f1b6a831c399e269772661 + + Len = 24 + Msg = 616263 + MD = 900150983cd24fb0d6963f7d28e17f72 + + Len = 112 + Msg = 6d65737361676520646967657374 + MD = f96b697d7cb7938d525a2f31aaf161d0 + """).splitlines() + assert load_hash_vectors(vector_data) == [ + (b"", "d41d8cd98f00b204e9800998ecf8427e"), + (b"61", "0cc175b9c0f1b6a831c399e269772661"), + (b"616263", "900150983cd24fb0d6963f7d28e17f72"), + (b"6d65737361676520646967657374", "f96b697d7cb7938d525a2f31aaf161d0"), + ] + + +def test_load_hash_vectors_bad_data(): + vector_data = textwrap.dedent(""" + # http://tools.ietf.org/html/rfc1321 + + Len = 0 + Msg = 00 + UNKNOWN=Hello World + """).splitlines() + with pytest.raises(ValueError): + load_hash_vectors(vector_data) + + +def test_load_hash_vectors_from_file(): + test_list = load_hash_vectors_from_file("RFC/MD5/rfc-1321.txt") + assert len(test_list) == 7 + assert test_list[:4] == [ + (b"", "d41d8cd98f00b204e9800998ecf8427e"), + (b"61", "0cc175b9c0f1b6a831c399e269772661"), + (b"616263", "900150983cd24fb0d6963f7d28e17f72"), + (b"6d65737361676520646967657374", "f96b697d7cb7938d525a2f31aaf161d0"), + ] diff --git a/tests/utils.py b/tests/utils.py index 6b1cfd79..03b780f8 100644 --- a/tests/utils.py +++ b/tests/utils.py @@ -119,3 +119,38 @@ def load_openssl_vectors(vector_data): "ciphertext": vector[4].encode("ascii"), }) return vectors + + +def load_hash_vectors(vector_data): + vectors = [] + + for line in vector_data: + line = line.strip() + + if not line or line.startswith("#") or line.startswith("["): + continue + + if line.startswith("Len"): + length = int(line.split(" = ")[1]) + elif line.startswith("Msg"): + """ + In the NIST vectors they have chosen to represent an empty + string as hex 00, which is of course not actually an empty + string. So we parse the provided length and catch this edge case. + """ + msg = line.split(" = ")[1].encode("ascii") if length > 0 else b"" + elif line.startswith("MD"): + md = line.split(" = ")[1] + # after MD is found the Msg+MD tuple is complete + vectors.append((msg, md)) + else: + raise ValueError("Unknown line in hash vector") + return vectors + + +def load_hash_vectors_from_file(filename): + base = os.path.join( + os.path.dirname(__file__), "primitives", "vectors" + ) + with open(os.path.join(base, filename), "r") as vector_file: + return load_hash_vectors(vector_file) |