Add a test utility functions to read & process NIST vector files
diff --git a/tests/test_utils.py b/tests/test_utils.py
new file mode 100644
index 0000000..acb36d4
--- /dev/null
+++ b/tests/test_utils.py
@@ -0,0 +1,193 @@
+import textwrap
+
+from .utils import load_nist_vectors, load_nist_vectors_from_file
+
+
+def test_load_nist_vectors_encrypt():
+    vector_data = textwrap.dedent("""
+    # CAVS 11.1
+    # Config info for aes_values
+    # AESVS GFSbox test data for CBC
+    # State : Encrypt and Decrypt
+    # Key Length : 128
+    # Generated on Fri Apr 22 15:11:33 2011
+
+    [ENCRYPT]
+
+    COUNT = 0
+    KEY = 00000000000000000000000000000000
+    IV = 00000000000000000000000000000000
+    PLAINTEXT = f34481ec3cc627bacd5dc3fb08f273e6
+    CIPHERTEXT = 0336763e966d92595a567cc9ce537f5e
+
+    COUNT = 1
+    KEY = 00000000000000000000000000000000
+    IV = 00000000000000000000000000000000
+    PLAINTEXT = 9798c4640bad75c7c3227db910174e72
+    CIPHERTEXT = a9a1631bf4996954ebc093957b234589
+
+    [DECRYPT]
+
+    COUNT = 0
+    KEY = 00000000000000000000000000000000
+    IV = 00000000000000000000000000000000
+    CIPHERTEXT = 0336763e966d92595a567cc9ce537f5e
+    PLAINTEXT = f34481ec3cc627bacd5dc3fb08f273e6
+
+    COUNT = 1
+    KEY = 00000000000000000000000000000000
+    IV = 00000000000000000000000000000000
+    CIPHERTEXT = a9a1631bf4996954ebc093957b234589
+    PLAINTEXT = 9798c4640bad75c7c3227db910174e72
+    """).splitlines()
+
+    assert load_nist_vectors(vector_data, "ENCRYPT",
+        ["key", "iv", "plaintext", "ciphertext"],
+    ) == [
+        (
+            "00000000000000000000000000000000",
+            "00000000000000000000000000000000",
+            "f34481ec3cc627bacd5dc3fb08f273e6",
+            "0336763e966d92595a567cc9ce537f5e",
+        ),
+        (
+            "00000000000000000000000000000000",
+            "00000000000000000000000000000000",
+            "9798c4640bad75c7c3227db910174e72",
+            "a9a1631bf4996954ebc093957b234589",
+        ),
+    ]
+
+
+def test_load_nist_vectors_decrypt():
+    vector_data = textwrap.dedent("""
+    # CAVS 11.1
+    # Config info for aes_values
+    # AESVS GFSbox test data for CBC
+    # State : Encrypt and Decrypt
+    # Key Length : 128
+    # Generated on Fri Apr 22 15:11:33 2011
+
+    [ENCRYPT]
+
+    COUNT = 0
+    KEY = 00000000000000000000000000000000
+    IV = 00000000000000000000000000000000
+    PLAINTEXT = f34481ec3cc627bacd5dc3fb08f273e6
+    CIPHERTEXT = 0336763e966d92595a567cc9ce537f5e
+
+    COUNT = 1
+    KEY = 00000000000000000000000000000000
+    IV = 00000000000000000000000000000000
+    PLAINTEXT = 9798c4640bad75c7c3227db910174e72
+    CIPHERTEXT = a9a1631bf4996954ebc093957b234589
+
+    [DECRYPT]
+
+    COUNT = 0
+    KEY = 00000000000000000000000000000000
+    IV = 00000000000000000000000000000000
+    CIPHERTEXT = 0336763e966d92595a567cc9ce537f5e
+    PLAINTEXT = f34481ec3cc627bacd5dc3fb08f273e6
+
+    COUNT = 1
+    KEY = 00000000000000000000000000000000
+    IV = 00000000000000000000000000000000
+    CIPHERTEXT = a9a1631bf4996954ebc093957b234589
+    PLAINTEXT = 9798c4640bad75c7c3227db910174e72
+    """).splitlines()
+
+    assert load_nist_vectors(vector_data, "DECRYPT",
+        ["key", "iv", "ciphertext", "plaintext"],
+    ) == [
+        (
+            "00000000000000000000000000000000",
+            "00000000000000000000000000000000",
+            "0336763e966d92595a567cc9ce537f5e",
+            "f34481ec3cc627bacd5dc3fb08f273e6",
+        ),
+        (
+            "00000000000000000000000000000000",
+            "00000000000000000000000000000000",
+            "a9a1631bf4996954ebc093957b234589",
+            "9798c4640bad75c7c3227db910174e72",
+        ),
+    ]
+
+
+def test_load_nist_vectors_from_file_encrypt():
+    assert load_nist_vectors_from_file(
+        "AES/KAT/CBCGFSbox256.rsp",
+        "ENCRYPT",
+        ["key", "iv", "plaintext", "ciphertext"],
+    ) == [
+        (
+            "0000000000000000000000000000000000000000000000000000000000000000",
+            "00000000000000000000000000000000",
+            "014730f80ac625fe84f026c60bfd547d",
+            "5c9d844ed46f9885085e5d6a4f94c7d7",
+        ),
+        (
+            "0000000000000000000000000000000000000000000000000000000000000000",
+            "00000000000000000000000000000000",
+            "0b24af36193ce4665f2825d7b4749c98",
+            "a9ff75bd7cf6613d3731c77c3b6d0c04",
+        ),
+        (
+            "0000000000000000000000000000000000000000000000000000000000000000",
+            "00000000000000000000000000000000",
+            "761c1fe41a18acf20d241650611d90f1",
+            "623a52fcea5d443e48d9181ab32c7421",
+        ),
+        (
+            "0000000000000000000000000000000000000000000000000000000000000000",
+            "00000000000000000000000000000000",
+            "8a560769d605868ad80d819bdba03771",
+            "38f2c7ae10612415d27ca190d27da8b4",
+        ),
+        (
+            "0000000000000000000000000000000000000000000000000000000000000000",
+            "00000000000000000000000000000000",
+            "91fbef2d15a97816060bee1feaa49afe",
+            "1bc704f1bce135ceb810341b216d7abe",
+        ),
+    ]
+
+
+def test_load_nist_vectors_from_file_decypt():
+    assert load_nist_vectors_from_file(
+        "AES/KAT/CBCGFSbox256.rsp",
+        "DECRYPT",
+        ["key", "iv", "ciphertext", "plaintext"],
+    ) == [
+        (
+            "0000000000000000000000000000000000000000000000000000000000000000",
+            "00000000000000000000000000000000",
+            "5c9d844ed46f9885085e5d6a4f94c7d7",
+            "014730f80ac625fe84f026c60bfd547d",
+        ),
+        (
+            "0000000000000000000000000000000000000000000000000000000000000000",
+            "00000000000000000000000000000000",
+            "a9ff75bd7cf6613d3731c77c3b6d0c04",
+            "0b24af36193ce4665f2825d7b4749c98",
+        ),
+        (
+            "0000000000000000000000000000000000000000000000000000000000000000",
+            "00000000000000000000000000000000",
+            "623a52fcea5d443e48d9181ab32c7421",
+            "761c1fe41a18acf20d241650611d90f1",
+        ),
+        (
+            "0000000000000000000000000000000000000000000000000000000000000000",
+            "00000000000000000000000000000000",
+            "38f2c7ae10612415d27ca190d27da8b4",
+            "8a560769d605868ad80d819bdba03771",
+        ),
+        (
+            "0000000000000000000000000000000000000000000000000000000000000000",
+            "00000000000000000000000000000000",
+            "1bc704f1bce135ceb810341b216d7abe",
+            "91fbef2d15a97816060bee1feaa49afe",
+        ),
+    ]