Explicitly pass around the API, and run all tests under all available APIs
diff --git a/cryptography/bindings/__init__.py b/cryptography/bindings/__init__.py
index e69de29..b4dc6bf 100644
--- a/cryptography/bindings/__init__.py
+++ b/cryptography/bindings/__init__.py
@@ -0,0 +1,17 @@
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#    http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+# implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+from cryptography.bindings.openssl import api
+
+
+default_api = api
diff --git a/cryptography/primitives/block/base.py b/cryptography/primitives/block/base.py
index b4137fd..833ebe9 100644
--- a/cryptography/primitives/block/base.py
+++ b/cryptography/primitives/block/base.py
@@ -15,8 +15,7 @@
 
 from enum import Enum
 
-# TODO: which binding is used should be an option somewhere
-from cryptography.bindings.openssl import api
+from cryptography.bindings import default_api
 
 
 class _Operation(Enum):
@@ -25,10 +24,11 @@
 
 
 class BlockCipher(object):
-    def __init__(self, cipher, mode):
+    def __init__(self, cipher, mode, api=default_api):
         super(BlockCipher, self).__init__()
         self.cipher = cipher
         self.mode = mode
+        self._api = api
         self._ctx = api.create_block_cipher_context(cipher, mode)
         self._operation = None
 
@@ -48,14 +48,14 @@
             raise ValueError("BlockCipher cannot encrypt when the operation is"
                              " set to %s" % self._operation.name)
 
-        return api.update_encrypt_context(self._ctx, plaintext)
+        return self._api.update_encrypt_context(self._ctx, plaintext)
 
     def finalize(self):
         if self._ctx is None:
             raise ValueError("BlockCipher was already finalized")
 
         if self._operation is _Operation.encrypt:
-            result = api.finalize_encrypt_context(self._ctx)
+            result = self._api.finalize_encrypt_context(self._ctx)
         else:
             raise ValueError("BlockCipher cannot finalize the unknown "
                              "operation %s" % self._operation.name)
diff --git a/tests/conftest.py b/tests/conftest.py
new file mode 100644
index 0000000..d16be3b
--- /dev/null
+++ b/tests/conftest.py
@@ -0,0 +1,5 @@
+def pytest_generate_tests(metafunc):
+    from cryptography.bindings.openssl import api
+
+    if "api" in metafunc.fixturenames:
+        metafunc.parametrize("api", [api])
diff --git a/tests/primitives/test_block.py b/tests/primitives/test_block.py
index 774409c..92fd31a 100644
--- a/tests/primitives/test_block.py
+++ b/tests/primitives/test_block.py
@@ -23,17 +23,19 @@
 
 
 class TestBlockCipher(object):
-    def test_cipher_name(self):
+    def test_cipher_name(self, api):
         cipher = BlockCipher(
             ciphers.AES(binascii.unhexlify(b"0" * 32)),
-            modes.CBC(binascii.unhexlify(b"0" * 32))
+            modes.CBC(binascii.unhexlify(b"0" * 32)),
+            api
         )
         assert cipher.name == "AES-128-CBC"
 
-    def test_use_after_finalize(self):
+    def test_use_after_finalize(self, api):
         cipher = BlockCipher(
             ciphers.AES(binascii.unhexlify(b"0" * 32)),
-            modes.CBC(binascii.unhexlify(b"0" * 32))
+            modes.CBC(binascii.unhexlify(b"0" * 32)),
+            api
         )
         cipher.encrypt(b"a" * 16)
         cipher.finalize()
@@ -42,20 +44,22 @@
         with pytest.raises(ValueError):
             cipher.finalize()
 
-    def test_encrypt_with_invalid_operation(self):
+    def test_encrypt_with_invalid_operation(self, api):
         cipher = BlockCipher(
             ciphers.AES(binascii.unhexlify(b"0" * 32)),
-            modes.CBC(binascii.unhexlify(b"0" * 32))
+            modes.CBC(binascii.unhexlify(b"0" * 32)),
+            api
         )
         cipher._operation = _Operation.decrypt
 
         with pytest.raises(ValueError):
             cipher.encrypt(b"b" * 16)
 
-    def test_finalize_with_invalid_operation(self):
+    def test_finalize_with_invalid_operation(self, api):
         cipher = BlockCipher(
             ciphers.AES(binascii.unhexlify(b"0" * 32)),
-            modes.CBC(binascii.unhexlify(b"0" * 32))
+            modes.CBC(binascii.unhexlify(b"0" * 32)),
+            api
         )
         cipher._operation = pretend.stub(name="wat")
 
diff --git a/tests/primitives/test_nist.py b/tests/primitives/test_nist.py
index 1e5d239..261bbd1 100644
--- a/tests/primitives/test_nist.py
+++ b/tests/primitives/test_nist.py
@@ -60,10 +60,11 @@
             "CBCVarTxt256.rsp",
         ]
     )
-    def test_KAT(self, key, iv, plaintext, ciphertext):
+    def test_KAT(self, key, iv, plaintext, ciphertext, api):
         cipher = BlockCipher(
             ciphers.AES(binascii.unhexlify(key)),
             modes.CBC(binascii.unhexlify(iv)),
+            api
         )
         actual_ciphertext = cipher.encrypt(binascii.unhexlify(plaintext))
         actual_ciphertext += cipher.finalize()
@@ -78,10 +79,11 @@
             "CBCMMT256.rsp",
         ]
     )
-    def test_MMT(self, key, iv, plaintext, ciphertext):
+    def test_MMT(self, key, iv, plaintext, ciphertext, api):
         cipher = BlockCipher(
             ciphers.AES(binascii.unhexlify(key)),
             modes.CBC(binascii.unhexlify(iv)),
+            api
         )
         actual_ciphertext = cipher.encrypt(binascii.unhexlify(plaintext))
         actual_ciphertext += cipher.finalize()
@@ -107,10 +109,11 @@
             "ECBVarTxt256.rsp",
         ]
     )
-    def test_KAT(self, key, plaintext, ciphertext):
+    def test_KAT(self, key, plaintext, ciphertext, api):
         cipher = BlockCipher(
             ciphers.AES(binascii.unhexlify(key)),
-            modes.ECB()
+            modes.ECB(),
+            api
         )
         actual_ciphertext = cipher.encrypt(binascii.unhexlify(plaintext))
         actual_ciphertext += cipher.finalize()
@@ -125,10 +128,11 @@
             "ECBMMT256.rsp",
         ]
     )
-    def test_MMT(self, key, plaintext, ciphertext):
+    def test_MMT(self, key, plaintext, ciphertext, api):
         cipher = BlockCipher(
             ciphers.AES(binascii.unhexlify(key)),
-            modes.ECB()
+            modes.ECB(),
+            api
         )
         actual_ciphertext = cipher.encrypt(binascii.unhexlify(plaintext))
         actual_ciphertext += cipher.finalize()
@@ -154,10 +158,11 @@
             "OFBVarTxt256.rsp",
         ]
     )
-    def test_KAT(self, key, iv, plaintext, ciphertext):
+    def test_KAT(self, key, iv, plaintext, ciphertext, api):
         cipher = BlockCipher(
             ciphers.AES(binascii.unhexlify(key)),
-            modes.OFB(binascii.unhexlify(iv))
+            modes.OFB(binascii.unhexlify(iv)),
+            api
         )
         actual_ciphertext = cipher.encrypt(binascii.unhexlify(plaintext))
         actual_ciphertext += cipher.finalize()
@@ -172,10 +177,11 @@
             "OFBMMT256.rsp",
         ]
     )
-    def test_MMT(self, key, iv, plaintext, ciphertext):
+    def test_MMT(self, key, iv, plaintext, ciphertext, api):
         cipher = BlockCipher(
             ciphers.AES(binascii.unhexlify(key)),
-            modes.OFB(binascii.unhexlify(iv))
+            modes.OFB(binascii.unhexlify(iv)),
+            api
         )
         actual_ciphertext = cipher.encrypt(binascii.unhexlify(plaintext))
         actual_ciphertext += cipher.finalize()
@@ -201,10 +207,11 @@
             "CFB128VarTxt256.rsp",
         ]
     )
-    def test_KAT(self, key, iv, plaintext, ciphertext):
+    def test_KAT(self, key, iv, plaintext, ciphertext, api):
         cipher = BlockCipher(
             ciphers.AES(binascii.unhexlify(key)),
-            modes.CFB(binascii.unhexlify(iv))
+            modes.CFB(binascii.unhexlify(iv)),
+            api
         )
         actual_ciphertext = cipher.encrypt(binascii.unhexlify(plaintext))
         actual_ciphertext += cipher.finalize()
@@ -219,10 +226,11 @@
             "CFB128MMT256.rsp",
         ]
     )
-    def test_MMT(self, key, iv, plaintext, ciphertext):
+    def test_MMT(self, key, iv, plaintext, ciphertext, api):
         cipher = BlockCipher(
             ciphers.AES(binascii.unhexlify(key)),
-            modes.CFB(binascii.unhexlify(iv))
+            modes.CFB(binascii.unhexlify(iv)),
+            api
         )
         actual_ciphertext = cipher.encrypt(binascii.unhexlify(plaintext))
         actual_ciphertext += cipher.finalize()