aboutsummaryrefslogtreecommitdiffstats
path: root/cryptography
diff options
context:
space:
mode:
authorDavid Reid <dreid@dreid.org>2014-02-03 16:46:48 -0800
committerDavid Reid <dreid@dreid.org>2014-02-03 16:46:48 -0800
commitba5fcd97baf193259a156caa5b5cbc107ee46794 (patch)
treecf0243617ef483300973442a55e7a1fdc02ff1ff /cryptography
parent59ca2fc4a93ed398e5c2674b7c98a81ed95e0930 (diff)
parentdb80954cf1448f88fae78568dbd3d833da04054a (diff)
downloadcryptography-ba5fcd97baf193259a156caa5b5cbc107ee46794.tar.gz
cryptography-ba5fcd97baf193259a156caa5b5cbc107ee46794.tar.bz2
cryptography-ba5fcd97baf193259a156caa5b5cbc107ee46794.zip
Merge pull request #536 from alex/prioritized-multi-backend
Initial work on a prioritized multibackend for which implements CipherBackend
Diffstat (limited to 'cryptography')
-rw-r--r--cryptography/hazmat/backends/__init__.py4
-rw-r--r--cryptography/hazmat/backends/multibackend.py103
2 files changed, 105 insertions, 2 deletions
diff --git a/cryptography/hazmat/backends/__init__.py b/cryptography/hazmat/backends/__init__.py
index cb1fee90..d1b95f2a 100644
--- a/cryptography/hazmat/backends/__init__.py
+++ b/cryptography/hazmat/backends/__init__.py
@@ -13,12 +13,12 @@
from cryptography.hazmat.backends import openssl
from cryptography.hazmat.bindings.commoncrypto.binding import (
- Binding as CCBinding
+ Binding as CommonCryptoBinding
)
_ALL_BACKENDS = [openssl.backend]
-if CCBinding.is_available():
+if CommonCryptoBinding.is_available():
from cryptography.hazmat.backends import commoncrypto
_ALL_BACKENDS.append(commoncrypto.backend)
diff --git a/cryptography/hazmat/backends/multibackend.py b/cryptography/hazmat/backends/multibackend.py
new file mode 100644
index 00000000..49a4014d
--- /dev/null
+++ b/cryptography/hazmat/backends/multibackend.py
@@ -0,0 +1,103 @@
+# 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 __future__ import absolute_import, division, print_function
+
+from cryptography import utils
+from cryptography.exceptions import UnsupportedAlgorithm
+from cryptography.hazmat.backends.interfaces import (
+ CipherBackend, HashBackend, HMACBackend, PBKDF2HMACBackend
+)
+
+
+@utils.register_interface(CipherBackend)
+@utils.register_interface(HashBackend)
+@utils.register_interface(HMACBackend)
+@utils.register_interface(PBKDF2HMACBackend)
+class MultiBackend(object):
+ name = "multibackend"
+
+ def __init__(self, backends):
+ self._backends = backends
+
+ def _filtered_backends(self, interface):
+ for b in self._backends:
+ if isinstance(b, interface):
+ yield b
+
+ def cipher_supported(self, algorithm, mode):
+ return any(
+ b.cipher_supported(algorithm, mode)
+ for b in self._filtered_backends(CipherBackend)
+ )
+
+ def create_symmetric_encryption_ctx(self, algorithm, mode):
+ for b in self._filtered_backends(CipherBackend):
+ try:
+ return b.create_symmetric_encryption_ctx(algorithm, mode)
+ except UnsupportedAlgorithm:
+ pass
+ raise UnsupportedAlgorithm
+
+ def create_symmetric_decryption_ctx(self, algorithm, mode):
+ for b in self._filtered_backends(CipherBackend):
+ try:
+ return b.create_symmetric_decryption_ctx(algorithm, mode)
+ except UnsupportedAlgorithm:
+ pass
+ raise UnsupportedAlgorithm
+
+ def hash_supported(self, algorithm):
+ return any(
+ b.hash_supported(algorithm)
+ for b in self._filtered_backends(HashBackend)
+ )
+
+ def create_hash_ctx(self, algorithm):
+ for b in self._filtered_backends(HashBackend):
+ try:
+ return b.create_hash_ctx(algorithm)
+ except UnsupportedAlgorithm:
+ pass
+ raise UnsupportedAlgorithm
+
+ def hmac_supported(self, algorithm):
+ return any(
+ b.hmac_supported(algorithm)
+ for b in self._filtered_backends(HMACBackend)
+ )
+
+ def create_hmac_ctx(self, key, algorithm):
+ for b in self._filtered_backends(HMACBackend):
+ try:
+ return b.create_hmac_ctx(key, algorithm)
+ except UnsupportedAlgorithm:
+ pass
+ raise UnsupportedAlgorithm
+
+ def pbkdf2_hmac_supported(self, algorithm):
+ return any(
+ b.pbkdf2_hmac_supported(algorithm)
+ for b in self._filtered_backends(PBKDF2HMACBackend)
+ )
+
+ def derive_pbkdf2_hmac(self, algorithm, length, salt, iterations,
+ key_material):
+ for b in self._filtered_backends(PBKDF2HMACBackend):
+ try:
+ return b.derive_pbkdf2_hmac(
+ algorithm, length, salt, iterations, key_material
+ )
+ except UnsupportedAlgorithm:
+ pass
+ raise UnsupportedAlgorithm