diff options
author | Miklos Fazekas <mfazekas@szemafor.com> | 2018-12-12 14:37:28 +0100 |
---|---|---|
committer | Miklos Fazekas <mfazekas@szemafor.com> | 2018-12-12 15:02:16 +0100 |
commit | 7f10b7b5b82008033d592d96c6eaeec7f4b7acf6 (patch) | |
tree | b7fea67532cc1a751671d7a843aee9047be16291 /lib/net/ssh/buffer.rb | |
parent | c00a9dfcdbc7b6b81da94150e68e7ad8a29edc0d (diff) | |
download | net-ssh-7f10b7b5b82008033d592d96c6eaeec7f4b7acf6.tar.gz |
Fixed private key read from new type ssh format
Diffstat (limited to 'lib/net/ssh/buffer.rb')
-rw-r--r-- | lib/net/ssh/buffer.rb | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/lib/net/ssh/buffer.rb b/lib/net/ssh/buffer.rb index 8bdf65a..4ca6e3e 100644 --- a/lib/net/ssh/buffer.rb +++ b/lib/net/ssh/buffer.rb @@ -249,6 +249,46 @@ module Net return (type ? read_keyblob(type) : nil) end + def read_private_keyblob(type) + case type + when /^ssh-rsa$/ + key = OpenSSL::PKey::RSA.new + n = read_bignum + e = read_bignum + d = read_bignum + iqmp = read_bignum + p = read_bignum + q = read_bignum + _unkown1 = read_bignum + _unkown2 = read_bignum + dmp1 = d % (p - 1) + dmq1 = d % (q - 1) + if key.respond_to?(:set_key) + key.set_key(n, e, d) + else + key.e = e + key.n = n + key.d = d + end + if key.respond_to?(:set_factors) + key.set_factors(p, q) + else + key.p = p + key.q = q + end + if key.respond_to?(:set_crt_params) + key.set_crt_params(dmp1, dmq1, iqmp) + else + key.dmp1 = dmp1 + key.dmq1 = dmq1 + key.iqmp = iqmp + end + key + else + raise Exception, "Cannot decode private key of type #{type}" + end + end + # Read a keyblob of the given type from the buffer, and return it as # a key. Only RSA, DSA, and ECDSA keys are supported. def read_keyblob(type) |