Ported openssl vector tests
diff --git a/tests/primitives/test_cryptrec.py b/tests/primitives/test_cryptrec.py
index c8e0af0..59d8b24 100644
--- a/tests/primitives/test_cryptrec.py
+++ b/tests/primitives/test_cryptrec.py
@@ -18,6 +18,7 @@
 from __future__ import absolute_import, division, print_function
 
 import binascii
+import os
 
 from cryptography.primitives.block import ciphers, modes
 
@@ -28,8 +29,7 @@
 class TestCamelliaECB(object):
     test_NTT = generate_encrypt_test(
         load_cryptrec_vectors_from_file,
-        "Camellia",
-        "NTT",
+        os.path.join("Camellia", "NTT"),
         ["camellia-128-ecb", "camellia-192-ecb", "camellia-256"],
         lambda key: ciphers.Camellia(binascii.unhexlify((key))),
         lambda key: modes.EBC(),
diff --git a/tests/primitives/test_nist.py b/tests/primitives/test_nist.py
index 0c9569f..e7778f1 100644
--- a/tests/primitives/test_nist.py
+++ b/tests/primitives/test_nist.py
@@ -18,6 +18,7 @@
 from __future__ import absolute_import, division, print_function
 
 import binascii
+import os
 
 from cryptography.primitives.block import ciphers, modes
 
@@ -28,8 +29,7 @@
 class TestAES_CBC(object):
     test_KAT = generate_encrypt_test(
         lambda path: load_nist_vectors_from_file(path, "ENCRYPT"),
-        "AES",
-        "KAT",
+        os.path.join("AES", "KAT"),
         [
             "CBCGFSbox128.rsp",
             "CBCGFSbox192.rsp",
@@ -50,8 +50,7 @@
 
     test_MMT = generate_encrypt_test(
         lambda path: load_nist_vectors_from_file(path, "ENCRYPT"),
-        "AES",
-        "MMT",
+        os.path.join("AES", "MMT"),
         [
             "CBCMMT128.rsp",
             "CBCMMT192.rsp",
@@ -65,8 +64,7 @@
 class TestAES_ECB(object):
     test_KAT = generate_encrypt_test(
         lambda path: load_nist_vectors_from_file(path, "ENCRYPT"),
-        "AES",
-        "KAT",
+        os.path.join("AES", "KAT"),
         [
             "ECBGFSbox128.rsp",
             "ECBGFSbox192.rsp",
@@ -87,8 +85,7 @@
 
     test_MMT = generate_encrypt_test(
         lambda path: load_nist_vectors_from_file(path, "ENCRYPT"),
-        "AES",
-        "MMT",
+        os.path.join("AES", "MMT"),
         [
             "ECBMMT128.rsp",
             "ECBMMT192.rsp",
@@ -102,8 +99,7 @@
 class TestAES_OFB(object):
     test_KAT = generate_encrypt_test(
         lambda path: load_nist_vectors_from_file(path, "ENCRYPT"),
-        "AES",
-        "KAT",
+        os.path.join("AES", "KAT"),
         [
             "OFBGFSbox128.rsp",
             "OFBGFSbox192.rsp",
@@ -124,8 +120,7 @@
 
     test_MMT = generate_encrypt_test(
         lambda path: load_nist_vectors_from_file(path, "ENCRYPT"),
-        "AES",
-        "MMT",
+        os.path.join("AES", "MMT"),
         [
             "OFBMMT128.rsp",
             "OFBMMT192.rsp",
@@ -139,8 +134,7 @@
 class TestAES_CFB(object):
     test_KAT = generate_encrypt_test(
         lambda path: load_nist_vectors_from_file(path, "ENCRYPT"),
-        "AES",
-        "KAT",
+        os.path.join("AES", "KAT"),
         [
             "CFB128GFSbox128.rsp",
             "CFB128GFSbox192.rsp",
@@ -162,8 +156,7 @@
 
     test_MMT = generate_encrypt_test(
         lambda path: load_nist_vectors_from_file(path, "ENCRYPT"),
-        "AES",
-        "MMT",
+        os.path.join("AES", "MMT"),
         [
             "CFB128MMT128.rsp",
             "CFB128MMT192.rsp",
diff --git a/tests/primitives/test_openssl_vectors.py b/tests/primitives/test_openssl_vectors.py
index d30efa5..f9c4e1f 100644
--- a/tests/primitives/test_openssl_vectors.py
+++ b/tests/primitives/test_openssl_vectors.py
@@ -23,78 +23,40 @@
 
 import pytest
 
-from cryptography.primitives.block import BlockCipher, ciphers, modes
+from cryptography.primitives.block import ciphers, modes
 
+from .utils import generate_encrypt_test
 from ..utils import load_openssl_vectors_from_file
 
 
-def parameterize_encrypt_test(cipher, params, fnames):
-    return pytest.mark.parametrize(params,
-        list(itertools.chain.from_iterable(
-            load_openssl_vectors_from_file(os.path.join(cipher, fname))
-            for fname in fnames
-        ))
-    )
-
-
 class TestCamelliaCBC(object):
-
-    @parameterize_encrypt_test(
+    test_OpenSSL = generate_encrypt_test(
+        load_openssl_vectors_from_file,
         "Camellia",
-        ("key", "iv", "plaintext", "ciphertext"),
-        [
-            "camellia-cbc.txt",
-        ]
+        ["camellia-cbc.txt"],
+        lambda key, iv: ciphers.Camellia(binascii.unhexlify(key)),
+        lambda key, iv: modes.CBC(binascii.unhexlify(iv)),
+        only_if=lambda api: api.supports_cipher("camellia-128-cbc")
     )
-    def test_OpenSSL(self, key, iv, plaintext, ciphertext, api):
-        if not api.supports_cipher("camellia-128-cbc"):
-            pytest.skip("Does not support Camellia CBC")  # pragma: no cover
-        cipher = BlockCipher(
-            ciphers.Camellia(binascii.unhexlify(key)),
-            modes.CBC(binascii.unhexlify(iv)),
-        )
-        actual_ciphertext = cipher.encrypt(binascii.unhexlify(plaintext))
-        actual_ciphertext += cipher.finalize()
-        assert binascii.hexlify(actual_ciphertext).upper() == ciphertext
 
 
 class TestCamelliaOFB(object):
-
-    @parameterize_encrypt_test(
+    test_OpenSSL = generate_encrypt_test(
+        load_openssl_vectors_from_file,
         "Camellia",
-        ("key", "iv", "plaintext", "ciphertext"),
-        [
-            "camellia-ofb.txt",
-        ]
+        ["camellia-ofb.txt"],
+        lambda key, iv: ciphers.Camellia(binascii.unhexlify(key)),
+        lambda key, iv: modes.OFB(binascii.unhexlify(iv)),
+        only_if=lambda api: api.supports_cipher("camellia-128-ofb")
     )
-    def test_OpenSSL(self, key, iv, plaintext, ciphertext, api):
-        if not api.supports_cipher("camellia-128-ofb"):
-            pytest.skip("Does not support Camellia OFB")  # pragma: no cover
-        cipher = BlockCipher(
-            ciphers.Camellia(binascii.unhexlify(key)),
-            modes.OFB(binascii.unhexlify(iv)),
-        )
-        actual_ciphertext = cipher.encrypt(binascii.unhexlify(plaintext))
-        actual_ciphertext += cipher.finalize()
-        assert binascii.hexlify(actual_ciphertext).upper() == ciphertext
 
 
 class TestCamelliaCFB(object):
-
-    @parameterize_encrypt_test(
+    test_OpenSSL = generate_encrypt_test(
+        load_openssl_vectors_from_file,
         "Camellia",
-        ("key", "iv", "plaintext", "ciphertext"),
-        [
-            "camellia-cfb.txt",
-        ]
+        ["camellia-cfb.txt"],
+        lambda key, iv: ciphers.Camellia(binascii.unhexlify(key)),
+        lambda key, iv: modes.CFB(binascii.unhexlify(iv)),
+        only_if=lambda api: api.supports_cipher("camellia-128-cfb")
     )
-    def test_OpenSSL(self, key, iv, plaintext, ciphertext, api):
-        if not api.supports_cipher("camellia-128-cfb"):
-            pytest.skip("Does not support Camellia CFB")  # pragma: no cover
-        cipher = BlockCipher(
-            ciphers.Camellia(binascii.unhexlify(key)),
-            modes.CFB(binascii.unhexlify(iv)),
-        )
-        actual_ciphertext = cipher.encrypt(binascii.unhexlify(plaintext))
-        actual_ciphertext += cipher.finalize()
-        assert binascii.hexlify(actual_ciphertext).upper() == ciphertext
diff --git a/tests/primitives/utils.py b/tests/primitives/utils.py
index e35c915..13bf0d8 100644
--- a/tests/primitives/utils.py
+++ b/tests/primitives/utils.py
@@ -7,18 +7,15 @@
 from cryptography.primitives.block import BlockCipher
 
 
-def generate_encrypt_test(param_loader, cipher_name, vector_type, file_names,
-                          cipher_factory, mode_factory,
-                          only_if=lambda api: True):
+def generate_encrypt_test(param_loader, path, file_names, cipher_factory,
+                          mode_factory, only_if=lambda api: True):
     def test_encryption(self):
         for api in [openssl.api]:
             if not only_if(api):
                 yield encrypt_skipped
             else:
                 for file_name in file_names:
-                    for params in param_loader(
-                        os.path.join(cipher_name, vector_type, file_name)
-                    ):
+                    for params in param_loader(os.path.join(path, file_name)):
                         yield encrypt_test, api, cipher_factory, mode_factory, params
     return test_encryption