diff options
author | michael-hart <michael.hart1994@gmail.com> | 2014-09-23 23:10:32 +0100 |
---|---|---|
committer | michael-hart <michael.hart1994@gmail.com> | 2014-09-26 18:40:26 +0100 |
commit | b45731b94d7a50b4b4ca39e6a571fc5c19f509b4 (patch) | |
tree | 56b9b08a8209bb5ca68298754e87cb46db3e8aeb /cryptography | |
parent | 0520a2512d461b100ce1988ad094f76a219528b5 (diff) | |
download | cryptography-b45731b94d7a50b4b4ca39e6a571fc5c19f509b4.tar.gz cryptography-b45731b94d7a50b4b4ca39e6a571fc5c19f509b4.tar.bz2 cryptography-b45731b94d7a50b4b4ca39e6a571fc5c19f509b4.zip |
Part 1 of rebase, with corrections for pep8
Diffstat (limited to 'cryptography')
-rw-r--r-- | cryptography/hazmat/backends/interfaces.py | 6 | ||||
-rw-r--r-- | cryptography/hazmat/backends/multibackend.py | 11 | ||||
-rw-r--r-- | cryptography/hazmat/backends/openssl/backend.py | 29 | ||||
-rw-r--r-- | cryptography/hazmat/primitives/serialization.py | 4 |
4 files changed, 48 insertions, 2 deletions
diff --git a/cryptography/hazmat/backends/interfaces.py b/cryptography/hazmat/backends/interfaces.py index 3761e254..187d7fc5 100644 --- a/cryptography/hazmat/backends/interfaces.py +++ b/cryptography/hazmat/backends/interfaces.py @@ -281,6 +281,12 @@ class PEMSerializationBackend(object): if the data is encrypted. """ + @abc.abstractmethod + def load_pem_public_key(self, data, password): + """ + Loads a public key from PEM encoded data. + """ + @six.add_metaclass(abc.ABCMeta) class TraditionalOpenSSLSerializationBackend(object): diff --git a/cryptography/hazmat/backends/multibackend.py b/cryptography/hazmat/backends/multibackend.py index 221f1a1e..925e762d 100644 --- a/cryptography/hazmat/backends/multibackend.py +++ b/cryptography/hazmat/backends/multibackend.py @@ -187,14 +187,12 @@ class MultiBackend(object): def load_rsa_private_numbers(self, numbers): for b in self._filtered_backends(RSABackend): return b.load_rsa_private_numbers(numbers) - raise UnsupportedAlgorithm("RSA is not supported by the backend", _Reasons.UNSUPPORTED_PUBLIC_KEY_ALGORITHM) def load_rsa_public_numbers(self, numbers): for b in self._filtered_backends(RSABackend): return b.load_rsa_public_numbers(numbers) - raise UnsupportedAlgorithm("RSA is not supported by the backend", _Reasons.UNSUPPORTED_PUBLIC_KEY_ALGORITHM) @@ -329,6 +327,15 @@ class MultiBackend(object): _Reasons.UNSUPPORTED_SERIALIZATION ) + def load_pem_public_key(self, data): + for b in self._filtered_backends(PEMSerializationBackend): + return b.load_pem_public_key(data) + + raise UnsupportedAlgorithm( + "This backend does not support this key serialization.", + _Reasons.UNSUPPORTED_SERIALIZATION + ) + def load_pkcs8_pem_private_key(self, data, password): for b in self._filtered_backends(PKCS8SerializationBackend): return b.load_pkcs8_pem_private_key(data, password) diff --git a/cryptography/hazmat/backends/openssl/backend.py b/cryptography/hazmat/backends/openssl/backend.py index cb988ac9..dd50fd3b 100644 --- a/cryptography/hazmat/backends/openssl/backend.py +++ b/cryptography/hazmat/backends/openssl/backend.py @@ -483,6 +483,27 @@ class Backend(object): else: raise UnsupportedAlgorithm("Unsupported key type.") + def _evp_pkey_to_public_key(self, evp_pkey): + """ + Return the appropriate type of PublicKey given an evp_pkey cdata + pointer. + """ + + type = evp_pkey.type + + if type == self._lib.EVP_PKEY_RSA: + rsa_cdata = self._lib.EVP_PKEY_get1_RSA(evp_pkey) + assert rsa_cdata != self._ffi.NULL + rsa_cdata = self._ffi.gc(rsa_cdata, self._lib.RSA_free) + return _RSAPublicKey(self, rsa_cdata) + elif type == self._lib.EVP_PKEY_DSA: + dsa_cdata = self._lib.EVP_PKEY_get1_DSA(evp_pkey) + assert dsa_cdata != self._ffi.NULL + dsa_cdata = self._ffi.gc(dsa_cdata, self._lib.DSA_free) + return _DSAPublicKey(self, dsa_cdata) + else: + raise UnsupportedAlgorithm("Unsupported key type.") + def _pem_password_cb(self, password): """ Generate a pem_password_cb function pointer that copied the password to @@ -787,6 +808,14 @@ class Backend(object): password, ) + def load_pem_public_key(self, data): + return self._load_key( + self._lib.PEM_read_bio_PUBKEY, + self._evp_pkey_to_public_key, + data, + None, + ) + def load_traditional_openssl_pem_private_key(self, data, password): warnings.warn( "load_traditional_openssl_pem_private_key is deprecated and will " diff --git a/cryptography/hazmat/primitives/serialization.py b/cryptography/hazmat/primitives/serialization.py index cf1ca8ec..0fb560e0 100644 --- a/cryptography/hazmat/primitives/serialization.py +++ b/cryptography/hazmat/primitives/serialization.py @@ -44,3 +44,7 @@ def load_pem_pkcs8_private_key(data, password, backend): def load_pem_private_key(data, password, backend): return backend.load_pem_private_key(data, password) + + +def load_pem_public_key(data, backend): + return backend.load_pem_public_key(data) |