diff --git a/CHANGELOG.rst b/CHANGELOG.rst index b6401aac6..87022e973 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -25,6 +25,8 @@ Changes: - Enable use of CRL (and more) in verify context. `#483 `_ +- ``OpenSSL.crypto.PKey`` can now be constructed from ``cryptography`` objects and also exported as such. + `#439 `_ ---- diff --git a/src/OpenSSL/crypto.py b/src/OpenSSL/crypto.py index ecb992873..1ed1c9eb9 100644 --- a/src/OpenSSL/crypto.py +++ b/src/OpenSSL/crypto.py @@ -171,6 +171,16 @@ def __init__(self): self._initialized = False def to_cryptography_key(self): + """ + Export as a ``cryptography`` key. + + :rtype: One of ``cryptography``'s `key interfaces`_. + + .. _key interfaces: https://cryptography.io/en/latest/hazmat/\ + primitives/asymmetric/rsa/#key-interfaces + + .. versionadded:: 16.1.0 + """ if self._only_public: return backend._evp_pkey_to_public_key(self._pkey) else: @@ -178,6 +188,16 @@ def to_cryptography_key(self): @classmethod def from_cryptography_key(cls, crypto_key): + """ + Construct based on a ``cryptography`` *crypto_key*. + + :param crypto_key: A ``cryptography`` key. + :type crypto_key: One of ``cryptography``'s `key interfaces`_. + + :rtype: PKey + + .. versionadded:: 16.1.0 + """ pkey = cls() pkey._pkey = crypto_key._evp_pkey if isinstance(crypto_key, (rsa.RSAPublicKey, dsa.DSAPublicKey)): diff --git a/tests/test_crypto.py b/tests/test_crypto.py index 3776f52b0..93fb1bb09 100644 --- a/tests/test_crypto.py +++ b/tests/test_crypto.py @@ -762,7 +762,7 @@ class TestPKey(object): def test_convert_from_cryptography_private_key(self): """ - Convert from a cryptography private key to a pyOpenSSL PKey. + PKey.from_cryptography_key creates a proper private PKey. """ key = serialization.load_pem_private_key( intermediate_key_pem, None, backend @@ -776,7 +776,7 @@ def test_convert_from_cryptography_private_key(self): def test_convert_from_cryptography_public_key(self): """ - Convert from a cryptography public key to a pyOpenSSL PKey. + PKey.from_cryptography_key creates a proper public PKey. """ key = serialization.load_pem_public_key(cleartextPublicKeyPEM, backend) pkey = PKey.from_cryptography_key(key) @@ -788,7 +788,7 @@ def test_convert_from_cryptography_public_key(self): def test_convert_public_pkey_to_cryptography_key(self): """ - Convert from a pyOpenSSL PKey to a cryptography public key. + PKey.to_cryptography_key creates a proper cryptography public key. """ pkey = load_publickey(FILETYPE_PEM, cleartextPublicKeyPEM) key = pkey.to_cryptography_key() @@ -798,7 +798,7 @@ def test_convert_public_pkey_to_cryptography_key(self): def test_convert_private_pkey_to_cryptography_key(self): """ - Convert from a pyOpenSSL PKey to a cryptography private key. + PKey.to_cryptography_key creates a proper cryptography private key. """ pkey = load_privatekey(FILETYPE_PEM, cleartextPrivateKeyPEM) key = pkey.to_cryptography_key()