Module: SSHData::PublicKey

Defined in:
lib/ssh_data/public_key.rb,
lib/ssh_data/public_key/dsa.rb,
lib/ssh_data/public_key/rsa.rb,
lib/ssh_data/public_key/base.rb,
lib/ssh_data/public_key/ecdsa.rb,
lib/ssh_data/public_key/ed25519.rb,
lib/ssh_data/public_key/skecdsa.rb,
lib/ssh_data/public_key/sked25519.rb,
lib/ssh_data/public_key/security_key.rb

Defined Under Namespace

Modules: SecurityKey Classes: Base, DSA, ECDSA, ED25519, RSA, SKECDSA, SKED25519

Constant Summary collapse

ALGO_RSA =

Public key algorithm identifiers

"ssh-rsa"
ALGO_DSA =
"ssh-dss"
ALGO_ECDSA256 =
"ecdsa-sha2-nistp256"
ALGO_ECDSA384 =
"ecdsa-sha2-nistp384"
ALGO_ECDSA521 =
"ecdsa-sha2-nistp521"
ALGO_ED25519 =
"ssh-ed25519"
ALGO_SKED25519 =
"[email protected]"
ALGO_SKECDSA256 =
"[email protected]"
ALGO_RSA_SHA2_256 =

RSA SHA2 signature algorithms used with ALGO_RSA keys. tools.ietf.org/html/draft-rsa-dsa-sha2-256-02

"rsa-sha2-256"
ALGO_RSA_SHA2_512 =
"rsa-sha2-512"
ALGOS =
[
  ALGO_RSA, ALGO_DSA, ALGO_ECDSA256, ALGO_ECDSA384, ALGO_ECDSA521,
  ALGO_ED25519, ALGO_SKECDSA256, ALGO_SKED25519
]

Class Method Summary collapse

Class Method Details

.from_data(data) ⇒ Object



59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
# File 'lib/ssh_data/public_key.rb', line 59

def self.from_data(data)
  case data[:algo]
  when ALGO_RSA
    RSA.new(**data)
  when ALGO_DSA
    DSA.new(**data)
  when ALGO_ECDSA256, ALGO_ECDSA384, ALGO_ECDSA521
    ECDSA.new(**data)
  when ALGO_ED25519
    ED25519.new(**data)
  when ALGO_SKED25519
    SKED25519.new(**data)
  when ALGO_SKECDSA256
    SKECDSA.new(**data)
  else
    raise DecodeError, "unkown algo: #{data[:algo].inspect}"
  end
end

.parse_openssh(key) ⇒ Object

Parse an OpenSSH public key in authorized_keys format (see sshd(8) manual page).

key - An OpenSSH formatted public key, including algo, base64 encoded key

and optional comment.

Returns a PublicKey::Base subclass instance.



30
31
32
33
34
35
36
37
38
39
# File 'lib/ssh_data/public_key.rb', line 30

def self.parse_openssh(key)
  algo, raw, _ = SSHData.key_parts(key)
  parsed = parse_rfc4253(raw)

  if parsed.algo != algo
    raise DecodeError, "algo mismatch: #{parsed.algo.inspect}!=#{algo.inspect}"
  end

  parsed
end

.parse_rfc4253(raw) ⇒ Object

Parse an RFC 4253 binary SSH public key.

key - A RFC 4253 binary public key String.

Returns a PublicKey::Base subclass instance.



49
50
51
52
53
54
55
56
57
# File 'lib/ssh_data/public_key.rb', line 49

def self.parse_rfc4253(raw)
  data, read = Encoding.decode_public_key(raw)

  if read != raw.bytesize
    raise DecodeError, "unexpected trailing data"
  end

  from_data(data)
end