summaryrefslogtreecommitdiff
path: root/paramiko/ecdsakey.py
diff options
context:
space:
mode:
authorJared Hobbs <jared@pyhacker.com>2018-11-27 17:22:59 -0700
committerJared Hobbs <jared@pyhacker.com>2018-11-27 17:22:59 -0700
commiteff204faf5624c51b7ac96b9b93e4ce9622f853a (patch)
tree8cfd853320df944d7fd9ca7b272c22079af277e7 /paramiko/ecdsakey.py
parent6656f5453cedf9d9e497a6f49a25f8fc683b8551 (diff)
downloadparamiko-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.py22
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()