module SSHData::PrivateKey

Constants

DSA_PEM_TYPE
ECDSA_PEM_TYPE
ENCRYPTED_PEM_TYPE
OPENSSH_PEM_TYPE
RSA_PEM_TYPE

Public Class Methods

from_data(data) click to toggle source
# File lib/ssh_data/private_key.rb, line 50
def self.from_data(data)
  data[:private_keys].map do |priv|
    case priv[:algo]
    when PublicKey::ALGO_RSA
      RSA.new(**priv)
    when PublicKey::ALGO_DSA
      DSA.new(**priv)
    when PublicKey::ALGO_ECDSA256, PublicKey::ALGO_ECDSA384, PublicKey::ALGO_ECDSA521
      ECDSA.new(**priv)
    when PublicKey::ALGO_ED25519
      ED25519.new(**priv)
    else
      raise DecodeError, "unkown algo: #{priv[:algo].inspect}"
    end
  end
end
parse(key) click to toggle source

Parse an SSH private key.

key - A PEM or OpenSSH encoded private key.

Returns an Array of PrivateKey::Base subclass instances.

# File lib/ssh_data/private_key.rb, line 14
def self.parse(key)
  pem_type = Encoding.pem_type(key)
  case pem_type
  when OPENSSH_PEM_TYPE
    parse_openssh(key)
  when RSA_PEM_TYPE
    [RSA.from_openssl(OpenSSL::PKey::RSA.new(key, ""))]
  when DSA_PEM_TYPE
    [DSA.from_openssl(OpenSSL::PKey::DSA.new(key, ""))]
  when ECDSA_PEM_TYPE
    [ECDSA.from_openssl(OpenSSL::PKey::EC.new(key, ""))]
  when ENCRYPTED_PEM_TYPE
    raise DecryptError, "cannot decode encrypted private keys"
  else
    raise AlgorithmError, "unknown PEM type: #{pem_type.inspect}"
  end
rescue OpenSSL::PKey::PKeyError => e
  raise DecodeError, "bad private key. maybe encrypted?"
end
parse_openssh(key) click to toggle source

Parse an OpenSSH formatted private key.

key - An OpenSSH encoded private key.

Returns an Array of PrivateKey::Base subclass instances.

# File lib/ssh_data/private_key.rb, line 39
def self.parse_openssh(key)
  raw = Encoding.decode_pem(key, OPENSSH_PEM_TYPE)

  data, read = Encoding.decode_openssh_private_key(raw)
  unless read == raw.bytesize
    raise DecodeError, "unexpected trailing data"
  end

  from_data(data)
end