Use the NIST KAT vectors to test AES-CBC w/ no padding
diff --git a/tests/primitives/test_nist.py b/tests/primitives/test_nist.py
new file mode 100644
index 0000000..651f041
--- /dev/null
+++ b/tests/primitives/test_nist.py
@@ -0,0 +1,193 @@
+"""
+Test using the NIST Test Vectors
+"""
+import binascii
+
+import pytest
+
+from cryptography.primitives.block import BlockCipher, ciphers, modes, padding
+
+from ..utils import load_nist_vectors_from_file
+
+
+class TestAES_CBC:
+
+    @pytest.mark.parametrize(("key", "iv", "plaintext", "ciphertext"),
+        load_nist_vectors_from_file(
+            "AES/KAT/CBCGFSbox128.rsp",
+            "ENCRYPT",
+            ["key", "iv", "plaintext", "ciphertext"],
+        ),
+    )
+    def test_KAT_GFSbox_128_encrypt(self, key, iv, plaintext, ciphertext):
+        cipher = BlockCipher(
+            ciphers.AES(binascii.unhexlify(key)),
+            modes.CBC(binascii.unhexlify(iv), padding.NoPadding())
+        )
+        actual_ciphertext = cipher.encrypt(plaintext) + cipher.finalize()
+        assert binascii.hexlify(actual_ciphertext) == ciphertext
+
+    @pytest.mark.parametrize(("key", "iv", "plaintext", "ciphertext"),
+        load_nist_vectors_from_file(
+            "AES/KAT/CBCGFSbox192.rsp",
+            "ENCRYPT",
+            ["key", "iv", "plaintext", "ciphertext"],
+        ),
+    )
+    def test_KAT_GFSbox_192_encrypt(self, key, iv, plaintext, ciphertext):
+        cipher = BlockCipher(
+            ciphers.AES(binascii.unhexlify(key)),
+            modes.CBC(binascii.unhexlify(iv), padding.NoPadding())
+        )
+        actual_ciphertext = cipher.encrypt(plaintext) + cipher.finalize()
+        assert binascii.hexlify(actual_ciphertext) == ciphertext
+
+    @pytest.mark.parametrize(("key", "iv", "plaintext", "ciphertext"),
+        load_nist_vectors_from_file(
+            "AES/KAT/CBCGFSbox256.rsp",
+            "ENCRYPT",
+            ["key", "iv", "plaintext", "ciphertext"],
+        ),
+    )
+    def test_KAT_GFSbox_256_encrypt(self, key, iv, plaintext, ciphertext):
+        cipher = BlockCipher(
+            ciphers.AES(binascii.unhexlify(key)),
+            modes.CBC(binascii.unhexlify(iv), padding.NoPadding())
+        )
+        actual_ciphertext = cipher.encrypt(plaintext) + cipher.finalize()
+        assert binascii.hexlify(actual_ciphertext) == ciphertext
+
+    @pytest.mark.parametrize(("key", "iv", "plaintext", "ciphertext"),
+        load_nist_vectors_from_file(
+            "AES/KAT/CBCKeySbox128.rsp",
+            "ENCRYPT",
+            ["key", "iv", "plaintext", "ciphertext"],
+        ),
+    )
+    def test_KAT_KeySbox_128_encrypt(self, key, iv, plaintext, ciphertext):
+        cipher = BlockCipher(
+            ciphers.AES(binascii.unhexlify(key)),
+            modes.CBC(binascii.unhexlify(iv), padding.NoPadding())
+        )
+        actual_ciphertext = cipher.encrypt(plaintext) + cipher.finalize()
+        assert binascii.hexlify(actual_ciphertext) == ciphertext
+
+    @pytest.mark.parametrize(("key", "iv", "plaintext", "ciphertext"),
+        load_nist_vectors_from_file(
+            "AES/KAT/CBCKeySbox192.rsp",
+            "ENCRYPT",
+            ["key", "iv", "plaintext", "ciphertext"],
+        ),
+    )
+    def test_KAT_KeySbox_192_encrypt(self, key, iv, plaintext, ciphertext):
+        cipher = BlockCipher(
+            ciphers.AES(binascii.unhexlify(key)),
+            modes.CBC(binascii.unhexlify(iv), padding.NoPadding())
+        )
+        actual_ciphertext = cipher.encrypt(plaintext) + cipher.finalize()
+        assert binascii.hexlify(actual_ciphertext) == ciphertext
+
+    @pytest.mark.parametrize(("key", "iv", "plaintext", "ciphertext"),
+        load_nist_vectors_from_file(
+            "AES/KAT/CBCKeySbox256.rsp",
+            "ENCRYPT",
+            ["key", "iv", "plaintext", "ciphertext"],
+        ),
+    )
+    def test_KAT_KeySbox_256_encrypt(self, key, iv, plaintext, ciphertext):
+        cipher = BlockCipher(
+            ciphers.AES(binascii.unhexlify(key)),
+            modes.CBC(binascii.unhexlify(iv), padding.NoPadding())
+        )
+        actual_ciphertext = cipher.encrypt(plaintext) + cipher.finalize()
+        assert binascii.hexlify(actual_ciphertext) == ciphertext
+
+    @pytest.mark.parametrize(("key", "iv", "plaintext", "ciphertext"),
+        load_nist_vectors_from_file(
+            "AES/KAT/CBCVarKey128.rsp",
+            "ENCRYPT",
+            ["key", "iv", "plaintext", "ciphertext"],
+        ),
+    )
+    def test_KAT_VarKey_128_encrypt(self, key, iv, plaintext, ciphertext):
+        cipher = BlockCipher(
+            ciphers.AES(binascii.unhexlify(key)),
+            modes.CBC(binascii.unhexlify(iv), padding.NoPadding())
+        )
+        actual_ciphertext = cipher.encrypt(plaintext) + cipher.finalize()
+        assert binascii.hexlify(actual_ciphertext) == ciphertext
+
+    @pytest.mark.parametrize(("key", "iv", "plaintext", "ciphertext"),
+        load_nist_vectors_from_file(
+            "AES/KAT/CBCVarKey192.rsp",
+            "ENCRYPT",
+            ["key", "iv", "plaintext", "ciphertext"],
+        ),
+    )
+    def test_KAT_VarKey_192_encrypt(self, key, iv, plaintext, ciphertext):
+        cipher = BlockCipher(
+            ciphers.AES(binascii.unhexlify(key)),
+            modes.CBC(binascii.unhexlify(iv), padding.NoPadding())
+        )
+        actual_ciphertext = cipher.encrypt(plaintext) + cipher.finalize()
+        assert binascii.hexlify(actual_ciphertext) == ciphertext
+
+    @pytest.mark.parametrize(("key", "iv", "plaintext", "ciphertext"),
+        load_nist_vectors_from_file(
+            "AES/KAT/CBCVarKey256.rsp",
+            "ENCRYPT",
+            ["key", "iv", "plaintext", "ciphertext"],
+        ),
+    )
+    def test_KAT_VarKey_256_encrypt(self, key, iv, plaintext, ciphertext):
+        cipher = BlockCipher(
+            ciphers.AES(binascii.unhexlify(key)),
+            modes.CBC(binascii.unhexlify(iv), padding.NoPadding())
+        )
+        actual_ciphertext = cipher.encrypt(plaintext) + cipher.finalize()
+        assert binascii.hexlify(actual_ciphertext) == ciphertext
+
+    @pytest.mark.parametrize(("key", "iv", "plaintext", "ciphertext"),
+        load_nist_vectors_from_file(
+            "AES/KAT/CBCVarTxt128.rsp",
+            "ENCRYPT",
+            ["key", "iv", "plaintext", "ciphertext"],
+        ),
+    )
+    def test_KAT_VarTxt_128_encrypt(self, key, iv, plaintext, ciphertext):
+        cipher = BlockCipher(
+            ciphers.AES(binascii.unhexlify(key)),
+            modes.CBC(binascii.unhexlify(iv), padding.NoPadding())
+        )
+        actual_ciphertext = cipher.encrypt(plaintext) + cipher.finalize()
+        assert binascii.hexlify(actual_ciphertext) == ciphertext
+
+    @pytest.mark.parametrize(("key", "iv", "plaintext", "ciphertext"),
+        load_nist_vectors_from_file(
+            "AES/KAT/CBCVarTxt192.rsp",
+            "ENCRYPT",
+            ["key", "iv", "plaintext", "ciphertext"],
+        ),
+    )
+    def test_KAT_VarTxt_192_encrypt(self, key, iv, plaintext, ciphertext):
+        cipher = BlockCipher(
+            ciphers.AES(binascii.unhexlify(key)),
+            modes.CBC(binascii.unhexlify(iv), padding.NoPadding())
+        )
+        actual_ciphertext = cipher.encrypt(plaintext) + cipher.finalize()
+        assert binascii.hexlify(actual_ciphertext) == ciphertext
+
+    @pytest.mark.parametrize(("key", "iv", "plaintext", "ciphertext"),
+        load_nist_vectors_from_file(
+            "AES/KAT/CBCVarTxt256.rsp",
+            "ENCRYPT",
+            ["key", "iv", "plaintext", "ciphertext"],
+        ),
+    )
+    def test_KAT_VarTxt_256_encrypt(self, key, iv, plaintext, ciphertext):
+        cipher = BlockCipher(
+            ciphers.AES(binascii.unhexlify(key)),
+            modes.CBC(binascii.unhexlify(iv), padding.NoPadding())
+        )
+        actual_ciphertext = cipher.encrypt(plaintext) + cipher.finalize()
+        assert binascii.hexlify(actual_ciphertext) == ciphertext