lib/net/ssh/buffer.rb in net-ssh-5.0.2 vs lib/net/ssh/buffer.rb in net-ssh-5.1.0.rc1

- old
+ new

@@ -247,9 +247,49 @@ def read_key type = read_string 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) case type when /^(.*)-cert-v01@openssh\.com$/