aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPaul Kehrer <paul.l.kehrer@gmail.com>2017-07-09 07:34:58 -0500
committerAlex Gaynor <alex.gaynor@gmail.com>2017-07-09 08:34:58 -0400
commit9d5fc3e5dbe581e1fea9303e684ec9248936df55 (patch)
tree6a769a585ba9c2c5e121bb55c169dba17a814c77
parent0c9aed91697c5bc1eb16c2254406149e2395fdae (diff)
downloadcryptography-9d5fc3e5dbe581e1fea9303e684ec9248936df55.tar.gz
cryptography-9d5fc3e5dbe581e1fea9303e684ec9248936df55.tar.bz2
cryptography-9d5fc3e5dbe581e1fea9303e684ec9248936df55.zip
use an instance in aead_cipher_supported (#3772)
* use an instance in aead_cipher_supported * test for chacha20poly1305 compatibility via init exception * pep8
-rw-r--r--src/cryptography/hazmat/backends/openssl/aead.py19
-rw-r--r--src/cryptography/hazmat/backends/openssl/backend.py4
-rw-r--r--src/cryptography/hazmat/primitives/ciphers/aead.py6
-rw-r--r--tests/hazmat/primitives/test_aead.py24
4 files changed, 28 insertions, 25 deletions
diff --git a/src/cryptography/hazmat/backends/openssl/aead.py b/src/cryptography/hazmat/backends/openssl/aead.py
index 53b10e99..4fde6eae 100644
--- a/src/cryptography/hazmat/backends/openssl/aead.py
+++ b/src/cryptography/hazmat/backends/openssl/aead.py
@@ -11,12 +11,11 @@ _ENCRYPT = 1
_DECRYPT = 0
-def _aead_cipher_name(cls, key_length):
+def _aead_cipher_name(cipher):
from cryptography.hazmat.primitives.ciphers.aead import (
ChaCha20Poly1305
)
- assert cls is ChaCha20Poly1305
- assert key_length == 32 or key_length is None
+ assert isinstance(cipher, ChaCha20Poly1305)
return b"chacha20-poly1305"
@@ -78,11 +77,10 @@ def _process_data(backend, ctx, data):
return backend._ffi.buffer(buf, outlen[0])[:]
-def _encrypt(backend, cipher_cls, key, nonce, data, associated_data,
- tag_length):
- cipher_name = _aead_cipher_name(cipher_cls, len(key))
+def _encrypt(backend, cipher, nonce, data, associated_data, tag_length):
+ cipher_name = _aead_cipher_name(cipher)
ctx = _aead_setup(
- backend, cipher_name, key, nonce, None, tag_length, _ENCRYPT
+ backend, cipher_name, cipher._key, nonce, None, tag_length, _ENCRYPT
)
_process_aad(backend, ctx, associated_data)
@@ -101,15 +99,14 @@ def _encrypt(backend, cipher_cls, key, nonce, data, associated_data,
return processed_data + tag
-def _decrypt(backend, cipher_cls, key, nonce, data, associated_data,
- tag_length):
+def _decrypt(backend, cipher, nonce, data, associated_data, tag_length):
if len(data) < tag_length:
raise InvalidTag
tag = data[-tag_length:]
data = data[:-tag_length]
- cipher_name = _aead_cipher_name(cipher_cls, len(key))
+ cipher_name = _aead_cipher_name(cipher)
ctx = _aead_setup(
- backend, cipher_name, key, nonce, tag, tag_length, _DECRYPT
+ backend, cipher_name, cipher._key, nonce, tag, tag_length, _DECRYPT
)
_process_aad(backend, ctx, associated_data)
processed_data = _process_data(backend, ctx, data)
diff --git a/src/cryptography/hazmat/backends/openssl/backend.py b/src/cryptography/hazmat/backends/openssl/backend.py
index 28760aa8..878bbe43 100644
--- a/src/cryptography/hazmat/backends/openssl/backend.py
+++ b/src/cryptography/hazmat/backends/openssl/backend.py
@@ -1924,8 +1924,8 @@ class Backend(object):
self.openssl_assert(res == 1)
return self._ffi.buffer(buf)[:]
- def aead_cipher_supported(self, cls):
- cipher_name = aead._aead_cipher_name(cls, None)
+ def aead_cipher_supported(self, cipher):
+ cipher_name = aead._aead_cipher_name(cipher)
return (
self._lib.EVP_get_cipherbyname(cipher_name) != self._ffi.NULL
)
diff --git a/src/cryptography/hazmat/primitives/ciphers/aead.py b/src/cryptography/hazmat/primitives/ciphers/aead.py
index 7d2103d3..8df55fab 100644
--- a/src/cryptography/hazmat/primitives/ciphers/aead.py
+++ b/src/cryptography/hazmat/primitives/ciphers/aead.py
@@ -13,7 +13,7 @@ from cryptography.hazmat.backends.openssl.backend import backend
class ChaCha20Poly1305(object):
def __init__(self, key):
- if not backend.aead_cipher_supported(type(self)):
+ if not backend.aead_cipher_supported(self):
raise exceptions.UnsupportedAlgorithm(
"ChaCha20Poly1305 is not supported by this version of OpenSSL",
exceptions._Reasons.UNSUPPORTED_CIPHER
@@ -35,7 +35,7 @@ class ChaCha20Poly1305(object):
self._check_params(nonce, data, associated_data)
return aead._encrypt(
- backend, type(self), self._key, nonce, data, associated_data, 16
+ backend, self, nonce, data, associated_data, 16
)
def decrypt(self, nonce, data, associated_data):
@@ -44,7 +44,7 @@ class ChaCha20Poly1305(object):
self._check_params(nonce, data, associated_data)
return aead._decrypt(
- backend, type(self), self._key, nonce, data, associated_data, 16
+ backend, self, nonce, data, associated_data, 16
)
def _check_params(self, nonce, data, associated_data):
diff --git a/tests/hazmat/primitives/test_aead.py b/tests/hazmat/primitives/test_aead.py
index bf1e8208..a1ca5ae7 100644
--- a/tests/hazmat/primitives/test_aead.py
+++ b/tests/hazmat/primitives/test_aead.py
@@ -9,7 +9,7 @@ import os
import pytest
-from cryptography.exceptions import InvalidTag, _Reasons
+from cryptography.exceptions import InvalidTag, UnsupportedAlgorithm, _Reasons
from cryptography.hazmat.backends.interfaces import CipherBackend
from cryptography.hazmat.primitives.ciphers.aead import ChaCha20Poly1305
@@ -18,11 +18,17 @@ from ...utils import (
)
-@pytest.mark.supported(
- only_if=lambda backend: (
- not backend.aead_cipher_supported(ChaCha20Poly1305)
- ),
- skip_message="Requires OpenSSL without ChaCha20Poly1305 support"
+def _chacha20poly1305_supported():
+ try:
+ ChaCha20Poly1305(b"0" * 32)
+ return True
+ except UnsupportedAlgorithm:
+ return False
+
+
+@pytest.mark.skipif(
+ _chacha20poly1305_supported(),
+ reason="Requires OpenSSL without ChaCha20Poly1305 support"
)
@pytest.mark.requires_backend_interface(interface=CipherBackend)
def test_chacha20poly1305_unsupported_on_older_openssl(backend):
@@ -30,9 +36,9 @@ def test_chacha20poly1305_unsupported_on_older_openssl(backend):
ChaCha20Poly1305(ChaCha20Poly1305.generate_key())
-@pytest.mark.supported(
- only_if=lambda backend: backend.aead_cipher_supported(ChaCha20Poly1305),
- skip_message="Does not support ChaCha20Poly1305"
+@pytest.mark.skipif(
+ not _chacha20poly1305_supported(),
+ reason="Does not support ChaCha20Poly1305"
)
@pytest.mark.requires_backend_interface(interface=CipherBackend)
class TestChaCha20Poly1305(object):