aboutsummaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
authorPaul Kehrer <paul.l.kehrer@gmail.com>2013-10-18 17:28:39 -0500
committerPaul Kehrer <paul.l.kehrer@gmail.com>2013-10-18 18:02:20 -0500
commit69e0652b1a48815c7d61fed8b625264419ac2796 (patch)
treeace44cc14dabe10ab7e83d0522a47130ffc86043 /tests
parent4e542de6f58b55b1324e70c213c0d43f9aee319c (diff)
downloadcryptography-69e0652b1a48815c7d61fed8b625264419ac2796.tar.gz
cryptography-69e0652b1a48815c7d61fed8b625264419ac2796.tar.bz2
cryptography-69e0652b1a48815c7d61fed8b625264419ac2796.zip
hash vector loader and tests
Diffstat (limited to 'tests')
-rw-r--r--tests/test_utils.py57
-rw-r--r--tests/utils.py35
2 files changed, 91 insertions, 1 deletions
diff --git a/tests/test_utils.py b/tests/test_utils.py
index 28e7407b..b56e106e 100644
--- a/tests/test_utils.py
+++ b/tests/test_utils.py
@@ -11,11 +11,14 @@
# See the License for the specific language governing permissions and
# limitations under the License.
+import pytest
+
import textwrap
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,55 @@ 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
+
+ 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) == [
+ ('', 'd41d8cd98f00b204e9800998ecf8427e'),
+ ('61', '0cc175b9c0f1b6a831c399e269772661'),
+ ('616263', '900150983cd24fb0d6963f7d28e17f72'),
+ ('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] == [
+ ('', 'd41d8cd98f00b204e9800998ecf8427e'),
+ ('61', '0cc175b9c0f1b6a831c399e269772661'),
+ ('616263', '900150983cd24fb0d6963f7d28e17f72'),
+ ('6d65737361676520646967657374', 'f96b697d7cb7938d525a2f31aaf161d0'),
+ ]
diff --git a/tests/utils.py b/tests/utils.py
index 6b1cfd79..cf255334 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("#"):
+ 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)