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/rsakey.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/rsakey.py')
-rw-r--r-- | paramiko/rsakey.py | 30 |
1 files changed, 24 insertions, 6 deletions
diff --git a/paramiko/rsakey.py b/paramiko/rsakey.py index 442bfe1f..3ff601ec 100644 --- a/paramiko/rsakey.py +++ b/paramiko/rsakey.py @@ -180,12 +180,30 @@ class RSAKey(PKey): self._decode_key(data) def _decode_key(self, data): - try: - key = serialization.load_der_private_key( - data, password=None, backend=default_backend() + 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 as e: + raise SSHException(str(e)) + elif pkformat == self.PRIVATE_KEY_FORMAT_OPENSSH: + n, e, d, iqmp, q, p = self._uint32_cstruct_unpack(data, 'iiiiii') + public_numbers = rsa.RSAPublicNumbers( + e=e, + n=n, ) - except ValueError as e: - raise SSHException(str(e)) - + key = rsa.RSAPrivateNumbers( + p=p, + q=q, + d=d, + dmp1=d % (p - 1), + dmq1=d % (q - 1), + iqmp=iqmp, + public_numbers=public_numbers, + ).private_key(default_backend()) + else: + raise SSHException('unknown private key format.') assert isinstance(key, rsa.RSAPrivateKey) self.key = key |