summaryrefslogtreecommitdiff
path: root/paramiko/rsakey.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/rsakey.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/rsakey.py')
-rw-r--r--paramiko/rsakey.py30
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