diff options
author | Jared Hobbs <jared@pyhacker.com> | 2018-11-27 17:22:59 -0700 |
---|---|---|
committer | Jared Hobbs <jared@pyhacker.com> | 2018-11-27 17:22:59 -0700 |
commit | eff204faf5624c51b7ac96b9b93e4ce9622f853a (patch) | |
tree | 8cfd853320df944d7fd9ca7b272c22079af277e7 /paramiko/ecdsakey.py | |
parent | 6656f5453cedf9d9e497a6f49a25f8fc683b8551 (diff) | |
download | paramiko-eff204faf5624c51b7ac96b9b93e4ce9622f853a.tar.gz |
add support for new OpenSSH private key format
This work is based off the work done in https://github.com/paramiko/paramiko/pull/618
Diffstat (limited to 'paramiko/ecdsakey.py')
-rw-r--r-- | paramiko/ecdsakey.py | 22 |
1 files changed, 16 insertions, 6 deletions
diff --git a/paramiko/ecdsakey.py b/paramiko/ecdsakey.py index b73a969e..c3ef8e4d 100644 --- a/paramiko/ecdsakey.py +++ b/paramiko/ecdsakey.py @@ -283,12 +283,22 @@ class ECDSAKey(PKey): self._decode_key(data) def _decode_key(self, data): - try: - key = serialization.load_der_private_key( - data, password=None, backend=default_backend() - ) - except (ValueError, AssertionError) as e: - raise SSHException(str(e)) + pkformat, data = data + if pkformat == self.PRIVATE_KEY_FORMAT_ORIGINAL: + try: + key = serialization.load_der_private_key( + data, password=None, backend=default_backend() + ) + except (ValueError, AssertionError) as e: + raise SSHException(str(e)) + elif pkformat == self.PRIVATE_KEY_FORMAT_OPENSSH: + curve, verkey, sigkey = self._uint32_cstruct_unpack(data, 'sss') + try: + key = ec.derive_private_key(sigkey, curve, default_backend()) + except TypeError as e: + raise SSHException(str(e)) + else: + raise SSHException('unknown private key format.') self.signing_key = key self.verifying_key = key.public_key() |