Merge branch 'master' into triple-des

Also moved most of the tests to the new format except for one which doesn't yet
have an obvious translation

Conflicts:
	cryptography/primitives/block/ciphers.py
	tests/primitives/test_nist.py
diff --git a/tests/primitives/test_nist.py b/tests/primitives/test_nist.py
index bc44419..ceecd57 100644
--- a/tests/primitives/test_nist.py
+++ b/tests/primitives/test_nist.py
@@ -18,33 +18,18 @@
 from __future__ import absolute_import, division, print_function
 
 import binascii
-import itertools
 import os
 
-import pytest
+from cryptography.primitives.block import ciphers, modes
 
-from cryptography.primitives.block import BlockCipher, ciphers, modes
-
+from .utils import generate_encrypt_test
 from ..utils import load_nist_vectors_from_file
 
 
-def parameterize_encrypt_test(cipher, vector_type, params, fnames):
-    return pytest.mark.parametrize(params,
-        list(itertools.chain.from_iterable(
-            load_nist_vectors_from_file(
-                os.path.join(cipher, vector_type, fname),
-                "ENCRYPT",
-                params
-            )
-            for fname in fnames
-        ))
-    )
-
-
 class TestAES_CBC(object):
-    @parameterize_encrypt_test(
-        "AES", "KAT",
-        ("key", "iv", "plaintext", "ciphertext"),
+    test_KAT = generate_encrypt_test(
+        lambda path: load_nist_vectors_from_file(path, "ENCRYPT"),
+        os.path.join("AES", "KAT"),
         [
             "CBCGFSbox128.rsp",
             "CBCGFSbox192.rsp",
@@ -58,75 +43,156 @@
             "CBCVarTxt128.rsp",
             "CBCVarTxt192.rsp",
             "CBCVarTxt256.rsp",
-        ]
+        ],
+        lambda key, iv: ciphers.AES(binascii.unhexlify(key)),
+        lambda key, iv: modes.CBC(binascii.unhexlify(iv)),
     )
-    def test_KAT(self, key, iv, plaintext, ciphertext):
-        cipher = BlockCipher(
-            ciphers.AES(binascii.unhexlify(key)),
-            modes.CBC(binascii.unhexlify(iv)),
-        )
-        actual_ciphertext = cipher.encrypt(binascii.unhexlify(plaintext))
-        actual_ciphertext += cipher.finalize()
-        assert binascii.hexlify(actual_ciphertext) == ciphertext
 
-    @parameterize_encrypt_test(
-        "AES", "MMT",
-        ("key", "iv", "plaintext", "ciphertext"),
+    test_MMT = generate_encrypt_test(
+        lambda path: load_nist_vectors_from_file(path, "ENCRYPT"),
+        os.path.join("AES", "MMT"),
         [
             "CBCMMT128.rsp",
             "CBCMMT192.rsp",
             "CBCMMT256.rsp",
-        ]
+        ],
+        lambda key, iv: ciphers.AES(binascii.unhexlify(key)),
+        lambda key, iv: modes.CBC(binascii.unhexlify(iv)),
     )
-    def test_MMT(self, key, iv, plaintext, ciphertext):
-        cipher = BlockCipher(
-            ciphers.AES(binascii.unhexlify(key)),
-            modes.CBC(binascii.unhexlify(iv)),
-        )
-        actual_ciphertext = cipher.encrypt(binascii.unhexlify(plaintext))
-        actual_ciphertext += cipher.finalize()
-        assert binascii.hexlify(actual_ciphertext) == ciphertext
+
+
+class TestAES_ECB(object):
+    test_KAT = generate_encrypt_test(
+        lambda path: load_nist_vectors_from_file(path, "ENCRYPT"),
+        os.path.join("AES", "KAT"),
+        [
+            "ECBGFSbox128.rsp",
+            "ECBGFSbox192.rsp",
+            "ECBGFSbox256.rsp",
+            "ECBKeySbox128.rsp",
+            "ECBKeySbox192.rsp",
+            "ECBKeySbox256.rsp",
+            "ECBVarKey128.rsp",
+            "ECBVarKey192.rsp",
+            "ECBVarKey256.rsp",
+            "ECBVarTxt128.rsp",
+            "ECBVarTxt192.rsp",
+            "ECBVarTxt256.rsp",
+        ],
+        lambda key: ciphers.AES(binascii.unhexlify(key)),
+        lambda key: modes.ECB(),
+    )
+
+    test_MMT = generate_encrypt_test(
+        lambda path: load_nist_vectors_from_file(path, "ENCRYPT"),
+        os.path.join("AES", "MMT"),
+        [
+            "ECBMMT128.rsp",
+            "ECBMMT192.rsp",
+            "ECBMMT256.rsp",
+        ],
+        lambda key: ciphers.AES(binascii.unhexlify(key)),
+        lambda key: modes.ECB(),
+    )
+
+
+class TestAES_OFB(object):
+    test_KAT = generate_encrypt_test(
+        lambda path: load_nist_vectors_from_file(path, "ENCRYPT"),
+        os.path.join("AES", "KAT"),
+        [
+            "OFBGFSbox128.rsp",
+            "OFBGFSbox192.rsp",
+            "OFBGFSbox256.rsp",
+            "OFBKeySbox128.rsp",
+            "OFBKeySbox192.rsp",
+            "OFBKeySbox256.rsp",
+            "OFBVarKey128.rsp",
+            "OFBVarKey192.rsp",
+            "OFBVarKey256.rsp",
+            "OFBVarTxt128.rsp",
+            "OFBVarTxt192.rsp",
+            "OFBVarTxt256.rsp",
+        ],
+        lambda key, iv: ciphers.AES(binascii.unhexlify(key)),
+        lambda key, iv: modes.OFB(binascii.unhexlify(iv)),
+    )
+
+    test_MMT = generate_encrypt_test(
+        lambda path: load_nist_vectors_from_file(path, "ENCRYPT"),
+        os.path.join("AES", "MMT"),
+        [
+            "OFBMMT128.rsp",
+            "OFBMMT192.rsp",
+            "OFBMMT256.rsp",
+        ],
+        lambda key, iv: ciphers.AES(binascii.unhexlify(key)),
+        lambda key, iv: modes.OFB(binascii.unhexlify(iv)),
+    )
+
+
+class TestAES_CFB(object):
+    test_KAT = generate_encrypt_test(
+        lambda path: load_nist_vectors_from_file(path, "ENCRYPT"),
+        os.path.join("AES", "KAT"),
+        [
+            "CFB128GFSbox128.rsp",
+            "CFB128GFSbox192.rsp",
+            "CFB128GFSbox256.rsp",
+            "CFB128KeySbox128.rsp",
+            "CFB128KeySbox192.rsp",
+            "CFB128KeySbox256.rsp",
+            "CFB128VarKey128.rsp",
+            "CFB128VarKey192.rsp",
+            "CFB128VarKey256.rsp",
+            "CFB128VarTxt128.rsp",
+            "CFB128VarTxt192.rsp",
+            "CFB128VarTxt256.rsp",
+        ],
+        lambda key, iv: ciphers.AES(binascii.unhexlify(key)),
+        lambda key, iv: modes.CFB(binascii.unhexlify(iv)),
+    )
+
+    test_MMT = generate_encrypt_test(
+        lambda path: load_nist_vectors_from_file(path, "ENCRYPT"),
+        os.path.join("AES", "MMT"),
+        [
+            "CFB128MMT128.rsp",
+            "CFB128MMT192.rsp",
+            "CFB128MMT256.rsp",
+        ],
+        lambda key, iv: ciphers.AES(binascii.unhexlify(key)),
+        lambda key, iv: modes.CFB(binascii.unhexlify(iv)),
+    )
 
 
 class TestTripleDES_CBC(object):
-    @parameterize_encrypt_test(
-        "3DES", "KAT",
-        ("keys", "iv", "plaintext", "ciphertext"),
+    test_KAT1 = generate_encrypt_test(
+        lambda path: load_nist_vectors_from_file(path, "ENCRYPT"),
+        os.path.join("3DES", "KAT"),
         [
             "TCBCinvperm.rsp",
             "TCBCpermop.rsp",
             "TCBCsubtab.rsp",
             "TCBCvarkey.rsp",
             "TCBCvartext.rsp",
-        ]
+        ],
+        lambda keys, iv: ciphers.TripleDES(binascii.unhexlify(keys)),
+        lambda keys, iv: modes.CBC(iv),
     )
-    def test_KAT_1(self, keys, iv, plaintext, ciphertext):
-        cipher = BlockCipher(
-            ciphers.TripleDES(binascii.unhexlify(keys)),
-            modes.CBC(binascii.unhexlify(iv)),
-        )
-        actual_ciphertext = cipher.encrypt(binascii.unhexlify(plaintext))
-        actual_ciphertext += cipher.finalize()
-        assert binascii.hexlify(actual_ciphertext) == ciphertext
 
-    @parameterize_encrypt_test(
-        "3DES", "KAT",
-        ("keys", "iv1", "iv2", "iv3", "plaintext", "ciphertext3"),
+    test_KAT2 = generate_encrypt_test(
+        lambda path: load_nist_vectors_from_file(path, "ENCRYPT"),
+        os.path.join("3DES", "KAT"),
         [
             "TCBCIpermop.rsp",
             "TCBCIsubtab.rsp",
             "TCBCIvarkey.rsp",
             "TCBCIvartext.rsp",
-        ]
+        ],
+        lambda keys, iv1, iv2, iv3: ciphers.TripleDES(binascii.unhexlify(keys)),
+        lambda keys, iv1, iv2, iv3: modes.CBC(iv1 + iv2 + iv3),
     )
-    def test_KAT_2(self, keys, iv1, iv2, iv3, plaintext, ciphertext3):
-        cipher = BlockCipher(
-            ciphers.TripleDES(binascii.unhexlify(keys)),
-            modes.CBC(binascii.unhexlify(iv1 + iv2 + iv3)),
-        )
-        actual_ciphertext = cipher.encrypt(binascii.unhexlify(plaintext))
-        actual_ciphertext += cipher.finalize()
-        assert binascii.hexlify(actual_ciphertext) == ciphertext3
 
     @parameterize_encrypt_test(
         "3DES", "KAT",
@@ -144,38 +210,26 @@
         actual_ciphertext += cipher.finalize()
         assert binascii.hexlify(actual_ciphertext) == ciphertext3
 
-    @parameterize_encrypt_test(
-        "3DES", "MMT",
-        ("key1", "key2", "key3", "iv1", "iv2", "iv3", "plaintext", "ciphertext"),
+    test_MMT1 = generate_encrypt_test(
+        lambda path: load_nist_vectors_from_file(path, "ENCRYPT"),
+        os.path.join("3DES", "MMT"),
         [
             "TCBCIMMT1.rsp",
             "TCBCIMMT2.rsp",
             "TCBCIMMT3.rsp",
-        ]
+        ],
+        lambda key1, key2, key3, iv1, iv2, iv3: ciphers.TripleDES(binascii.unhexlify(key1 + key2 + key3)),
+        lambda key1, key2, key3, iv1, iv2, iv3: modes.CBC(iv1 + iv2 + iv3),
     )
-    def test_MMT_1(self, key1, key2, key3, iv1, iv2, iv3, plaintext, ciphertext):
-        cipher = BlockCipher(
-            ciphers.TripleDES(binascii.unhexlify(key1 + key2 + key3)),
-            modes.CBC(binascii.unhexlify(iv1 + iv2 + iv3)),
-        )
-        actual_ciphertext = cipher.encrypt(binascii.unhexlify(plaintext))
-        actual_ciphertext += cipher.finalize()
-        assert binascii.hexlify(actual_ciphertext) == ciphertext
 
-    @parameterize_encrypt_test(
-        "3DES", "MMT",
-        ("key1", "key2", "key3", "iv", "plaintext", "ciphertext"),
+    test_MMT1 = generate_encrypt_test(
+        lambda path: load_nist_vectors_from_file(path, "ENCRYPT"),
+        os.path.join("3DES", "MMT"),
         [
             "TCBCMMT1.rsp",
             "TCBCMMT2.rsp",
             "TCBCMMT3.rsp",
-        ]
+        ],
+        lambda key1, key2, key3, iv: ciphers.TripleDES(binascii.unhexlify(key1 + key2 + key3)),
+        lambda key1, key2, key3, iv: modes.CBC(iv),
     )
-    def test_MMT_2(self, key1, key2, key3, iv, plaintext, ciphertext):
-        cipher = BlockCipher(
-            ciphers.TripleDES(binascii.unhexlify(key1 + key2 + key3)),
-            modes.CBC(binascii.unhexlify(iv)),
-        )
-        actual_ciphertext = cipher.encrypt(binascii.unhexlify(plaintext))
-        actual_ciphertext += cipher.finalize()
-        assert binascii.hexlify(actual_ciphertext) == ciphertext