summaryrefslogtreecommitdiff
path: root/lib/net/ssh/buffer.rb
diff options
context:
space:
mode:
authorMiklos Fazekas <mfazekas@szemafor.com>2018-12-12 14:37:28 +0100
committerMiklos Fazekas <mfazekas@szemafor.com>2018-12-12 15:02:16 +0100
commit7f10b7b5b82008033d592d96c6eaeec7f4b7acf6 (patch)
treeb7fea67532cc1a751671d7a843aee9047be16291 /lib/net/ssh/buffer.rb
parentc00a9dfcdbc7b6b81da94150e68e7ad8a29edc0d (diff)
downloadnet-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.rb40
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)