ssh_data 1.1.0 → 1.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/ssh_data/certificate.rb +9 -7
- data/lib/ssh_data/encoding.rb +31 -12
- data/lib/ssh_data/error.rb +6 -5
- data/lib/ssh_data/public_key/ecdsa.rb +5 -1
- data/lib/ssh_data/public_key/ed25519.rb +6 -2
- data/lib/ssh_data/public_key/skecdsa.rb +46 -0
- data/lib/ssh_data/public_key/sked25519.rb +35 -0
- data/lib/ssh_data/public_key.rb +15 -7
- data/lib/ssh_data/version.rb +1 -1
- metadata +16 -14
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e2a37d746413f208ac72e4dca430d8e9ad71646cdab1a86a4beb1939d538ca00
|
4
|
+
data.tar.gz: 37c066043665eb883f68f1a0bbff2c7b814a6c11a32dcef02d19cb24a7fd9b17
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2e32a7671a4bebef2e1a9035a9be8692af5f8274e9b6e8ca8043421ed8adf620eb88878a8a55deca82d9b1c1fad725d6018230c5bd7a75a8bec727a39e8823f8
|
7
|
+
data.tar.gz: e0b84d38f45eb30d9ac0a1940e26b70a83677f68bb399c206f6a599194ffddd77a9a77f18e27b2cad94de5004c67e7bf63f009f621ab9b9dabc2637fba85f1ad
|
data/lib/ssh_data/certificate.rb
CHANGED
@@ -12,16 +12,18 @@ module SSHData
|
|
12
12
|
TYPE_HOST = 2
|
13
13
|
|
14
14
|
# Certificate algorithm identifiers
|
15
|
-
ALGO_RSA
|
16
|
-
ALGO_DSA
|
17
|
-
ALGO_ECDSA256
|
18
|
-
ALGO_ECDSA384
|
19
|
-
ALGO_ECDSA521
|
20
|
-
ALGO_ED25519
|
15
|
+
ALGO_RSA = "ssh-rsa-cert-v01@openssh.com"
|
16
|
+
ALGO_DSA = "ssh-dss-cert-v01@openssh.com"
|
17
|
+
ALGO_ECDSA256 = "ecdsa-sha2-nistp256-cert-v01@openssh.com"
|
18
|
+
ALGO_ECDSA384 = "ecdsa-sha2-nistp384-cert-v01@openssh.com"
|
19
|
+
ALGO_ECDSA521 = "ecdsa-sha2-nistp521-cert-v01@openssh.com"
|
20
|
+
ALGO_ED25519 = "ssh-ed25519-cert-v01@openssh.com"
|
21
|
+
ALGO_SKECDSA256 = "sk-ecdsa-sha2-nistp256-cert-v01@openssh.com"
|
22
|
+
ALGO_SKED25519 = "sk-ssh-ed25519-cert-v01@openssh.com"
|
21
23
|
|
22
24
|
ALGOS = [
|
23
25
|
ALGO_RSA, ALGO_DSA, ALGO_ECDSA256, ALGO_ECDSA384, ALGO_ECDSA521,
|
24
|
-
ALGO_ED25519
|
26
|
+
ALGO_ED25519, ALGO_SKECDSA256, ALGO_SKED25519
|
25
27
|
]
|
26
28
|
|
27
29
|
CRITICAL_OPTION_FORCE_COMMAND = "force-command"
|
data/lib/ssh_data/encoding.rb
CHANGED
@@ -62,27 +62,44 @@ module SSHData
|
|
62
62
|
[:public_key, :string]
|
63
63
|
]
|
64
64
|
|
65
|
+
# Fields in an SK-ECDSA public key
|
66
|
+
SKECDSA_KEY_FIELDS = [
|
67
|
+
[:curve, :string],
|
68
|
+
[:public_key, :string],
|
69
|
+
[:application, :string]
|
70
|
+
]
|
71
|
+
|
65
72
|
# Fields in a ED25519 public key
|
66
73
|
ED25519_KEY_FIELDS = [
|
67
74
|
[:pk, :string]
|
68
75
|
]
|
69
76
|
|
77
|
+
# Fields in a SK-ED25519 public key
|
78
|
+
SKED25519_KEY_FIELDS = [
|
79
|
+
[:pk, :string],
|
80
|
+
[:application, :string]
|
81
|
+
]
|
82
|
+
|
70
83
|
PUBLIC_KEY_ALGO_BY_CERT_ALGO = {
|
71
|
-
Certificate::ALGO_RSA
|
72
|
-
Certificate::ALGO_DSA
|
73
|
-
Certificate::ALGO_ECDSA256
|
74
|
-
Certificate::ALGO_ECDSA384
|
75
|
-
Certificate::ALGO_ECDSA521
|
76
|
-
Certificate::ALGO_ED25519
|
84
|
+
Certificate::ALGO_RSA => PublicKey::ALGO_RSA,
|
85
|
+
Certificate::ALGO_DSA => PublicKey::ALGO_DSA,
|
86
|
+
Certificate::ALGO_ECDSA256 => PublicKey::ALGO_ECDSA256,
|
87
|
+
Certificate::ALGO_ECDSA384 => PublicKey::ALGO_ECDSA384,
|
88
|
+
Certificate::ALGO_ECDSA521 => PublicKey::ALGO_ECDSA521,
|
89
|
+
Certificate::ALGO_ED25519 => PublicKey::ALGO_ED25519,
|
90
|
+
Certificate::ALGO_SKECDSA256 => PublicKey::ALGO_SKECDSA256,
|
91
|
+
Certificate::ALGO_SKED25519 => PublicKey::ALGO_SKED25519,
|
77
92
|
}
|
78
93
|
|
79
94
|
CERT_ALGO_BY_PUBLIC_KEY_ALGO = {
|
80
|
-
PublicKey::ALGO_RSA
|
81
|
-
PublicKey::ALGO_DSA
|
82
|
-
PublicKey::ALGO_ECDSA256
|
83
|
-
PublicKey::ALGO_ECDSA384
|
84
|
-
PublicKey::ALGO_ECDSA521
|
85
|
-
PublicKey::ALGO_ED25519
|
95
|
+
PublicKey::ALGO_RSA => Certificate::ALGO_RSA,
|
96
|
+
PublicKey::ALGO_DSA => Certificate::ALGO_DSA,
|
97
|
+
PublicKey::ALGO_ECDSA256 => Certificate::ALGO_ECDSA256,
|
98
|
+
PublicKey::ALGO_ECDSA384 => Certificate::ALGO_ECDSA384,
|
99
|
+
PublicKey::ALGO_ECDSA521 => Certificate::ALGO_ECDSA521,
|
100
|
+
PublicKey::ALGO_ED25519 => Certificate::ALGO_ED25519,
|
101
|
+
PublicKey::ALGO_SKECDSA256 => Certificate::ALGO_SKECDSA256,
|
102
|
+
PublicKey::ALGO_SKED25519 => Certificate::ALGO_SKED25519,
|
86
103
|
}
|
87
104
|
|
88
105
|
KEY_FIELDS_BY_PUBLIC_KEY_ALGO = {
|
@@ -92,6 +109,8 @@ module SSHData
|
|
92
109
|
PublicKey::ALGO_ECDSA384 => ECDSA_KEY_FIELDS,
|
93
110
|
PublicKey::ALGO_ECDSA521 => ECDSA_KEY_FIELDS,
|
94
111
|
PublicKey::ALGO_ED25519 => ED25519_KEY_FIELDS,
|
112
|
+
PublicKey::ALGO_SKED25519 => SKED25519_KEY_FIELDS,
|
113
|
+
PublicKey::ALGO_SKECDSA256 => SKECDSA_KEY_FIELDS,
|
95
114
|
}
|
96
115
|
|
97
116
|
KEY_FIELDS_BY_PRIVATE_KEY_ALGO = {
|
data/lib/ssh_data/error.rb
CHANGED
@@ -1,7 +1,8 @@
|
|
1
1
|
module SSHData
|
2
|
-
Error
|
3
|
-
DecodeError
|
4
|
-
VerifyError
|
5
|
-
AlgorithmError
|
6
|
-
DecryptError
|
2
|
+
Error = Class.new(StandardError)
|
3
|
+
DecodeError = Class.new(Error)
|
4
|
+
VerifyError = Class.new(Error)
|
5
|
+
AlgorithmError = Class.new(Error)
|
6
|
+
DecryptError = Class.new(Error)
|
7
|
+
UnsupportedError = Class.new(Error)
|
7
8
|
end
|
@@ -65,7 +65,7 @@ module SSHData
|
|
65
65
|
[Encoding.encode_mpint(r.value), Encoding.encode_mpint(s.value)].join
|
66
66
|
end
|
67
67
|
|
68
|
-
def
|
68
|
+
def self.check_algorithm!(algo, curve)
|
69
69
|
unless [ALGO_ECDSA256, ALGO_ECDSA384, ALGO_ECDSA521].include?(algo)
|
70
70
|
raise DecodeError, "bad algorithm: #{algo.inspect}"
|
71
71
|
end
|
@@ -73,6 +73,10 @@ module SSHData
|
|
73
73
|
unless algo == "ecdsa-sha2-#{curve}"
|
74
74
|
raise DecodeError, "bad curve: #{curve.inspect}"
|
75
75
|
end
|
76
|
+
end
|
77
|
+
|
78
|
+
def initialize(algo:, curve:, public_key:)
|
79
|
+
self.class.check_algorithm!(algo, curve)
|
76
80
|
|
77
81
|
@curve = curve
|
78
82
|
@public_key_bytes = public_key
|
@@ -16,8 +16,12 @@ module SSHData
|
|
16
16
|
raise AlgorithmError, "the ed25519 gem is not loaded" unless enabled?
|
17
17
|
end
|
18
18
|
|
19
|
+
def self.algorithm_identifier
|
20
|
+
ALGO_ED25519
|
21
|
+
end
|
22
|
+
|
19
23
|
def initialize(algo:, pk:)
|
20
|
-
unless algo ==
|
24
|
+
unless algo == self.class.algorithm_identifier
|
21
25
|
raise DecodeError, "bad algorithm: #{algo.inspect}"
|
22
26
|
end
|
23
27
|
|
@@ -40,7 +44,7 @@ module SSHData
|
|
40
44
|
self.class.ed25519_gem_required!
|
41
45
|
|
42
46
|
sig_algo, raw_sig, _ = Encoding.decode_signature(signature)
|
43
|
-
if sig_algo !=
|
47
|
+
if sig_algo != self.class.algorithm_identifier
|
44
48
|
raise DecodeError, "bad signature algorithm: #{sig_algo.inspect}"
|
45
49
|
end
|
46
50
|
|
@@ -0,0 +1,46 @@
|
|
1
|
+
module SSHData
|
2
|
+
module PublicKey
|
3
|
+
class SKECDSA < ECDSA
|
4
|
+
attr_reader :application
|
5
|
+
|
6
|
+
OPENSSL_CURVE_NAME_FOR_CURVE = {
|
7
|
+
NISTP256 => "prime256v1",
|
8
|
+
}
|
9
|
+
|
10
|
+
def self.check_algorithm!(algo, curve)
|
11
|
+
unless algo == ALGO_SKECDSA256
|
12
|
+
raise DecodeError, "bad algorithm: #{algo.inspect}"
|
13
|
+
end
|
14
|
+
|
15
|
+
unless algo == "sk-ecdsa-sha2-#{curve}@openssh.com"
|
16
|
+
raise DecodeError, "bad curve: #{curve.inspect}"
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def initialize(algo:, curve:, public_key:, application:)
|
21
|
+
@application = application
|
22
|
+
super(algo: algo, curve: curve, public_key: public_key)
|
23
|
+
end
|
24
|
+
|
25
|
+
# RFC4253 binary encoding of the public key.
|
26
|
+
#
|
27
|
+
# Returns a binary String.
|
28
|
+
def rfc4253
|
29
|
+
Encoding.encode_fields(
|
30
|
+
[:string, algo],
|
31
|
+
[:string, curve],
|
32
|
+
[:string, public_key_bytes],
|
33
|
+
[:string, application],
|
34
|
+
)
|
35
|
+
end
|
36
|
+
|
37
|
+
def verify(signed_data, signature)
|
38
|
+
raise UnsupportedError, "SK-ECDSA verification is not supported."
|
39
|
+
end
|
40
|
+
|
41
|
+
def ==(other)
|
42
|
+
super && other.application == application
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
module SSHData
|
2
|
+
module PublicKey
|
3
|
+
class SKED25519 < ED25519
|
4
|
+
attr_reader :application
|
5
|
+
|
6
|
+
def initialize(algo:, pk:, application:)
|
7
|
+
@application = application
|
8
|
+
super(algo: algo, pk: pk)
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.algorithm_identifier
|
12
|
+
ALGO_SKED25519
|
13
|
+
end
|
14
|
+
|
15
|
+
# RFC4253 binary encoding of the public key.
|
16
|
+
#
|
17
|
+
# Returns a binary String.
|
18
|
+
def rfc4253
|
19
|
+
Encoding.encode_fields(
|
20
|
+
[:string, algo],
|
21
|
+
[:string, pk],
|
22
|
+
[:string, application],
|
23
|
+
)
|
24
|
+
end
|
25
|
+
|
26
|
+
def verify(signed_data, signature)
|
27
|
+
raise UnsupportedError, "SK-Ed25519 verification is not supported."
|
28
|
+
end
|
29
|
+
|
30
|
+
def ==(other)
|
31
|
+
super && other.application == application
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
data/lib/ssh_data/public_key.rb
CHANGED
@@ -1,12 +1,14 @@
|
|
1
1
|
module SSHData
|
2
2
|
module PublicKey
|
3
3
|
# Public key algorithm identifiers
|
4
|
-
ALGO_RSA
|
5
|
-
ALGO_DSA
|
6
|
-
ALGO_ECDSA256
|
7
|
-
ALGO_ECDSA384
|
8
|
-
ALGO_ECDSA521
|
9
|
-
ALGO_ED25519
|
4
|
+
ALGO_RSA = "ssh-rsa"
|
5
|
+
ALGO_DSA = "ssh-dss"
|
6
|
+
ALGO_ECDSA256 = "ecdsa-sha2-nistp256"
|
7
|
+
ALGO_ECDSA384 = "ecdsa-sha2-nistp384"
|
8
|
+
ALGO_ECDSA521 = "ecdsa-sha2-nistp521"
|
9
|
+
ALGO_ED25519 = "ssh-ed25519"
|
10
|
+
ALGO_SKED25519 = "sk-ssh-ed25519@openssh.com"
|
11
|
+
ALGO_SKECDSA256 = "sk-ecdsa-sha2-nistp256@openssh.com"
|
10
12
|
|
11
13
|
# RSA SHA2 *signature* algorithms used with ALGO_RSA keys.
|
12
14
|
# https://tools.ietf.org/html/draft-rsa-dsa-sha2-256-02
|
@@ -15,7 +17,7 @@ module SSHData
|
|
15
17
|
|
16
18
|
ALGOS = [
|
17
19
|
ALGO_RSA, ALGO_DSA, ALGO_ECDSA256, ALGO_ECDSA384, ALGO_ECDSA521,
|
18
|
-
ALGO_ED25519
|
20
|
+
ALGO_ED25519, ALGO_SKECDSA256, ALGO_SKED25519
|
19
21
|
]
|
20
22
|
|
21
23
|
# Parse an OpenSSH public key in authorized_keys format (see sshd(8) manual
|
@@ -64,6 +66,10 @@ module SSHData
|
|
64
66
|
ECDSA.new(**data)
|
65
67
|
when ALGO_ED25519
|
66
68
|
ED25519.new(**data)
|
69
|
+
when ALGO_SKED25519
|
70
|
+
SKED25519.new(**data)
|
71
|
+
when ALGO_SKECDSA256
|
72
|
+
SKECDSA.new(**data)
|
67
73
|
else
|
68
74
|
raise DecodeError, "unkown algo: #{data[:algo].inspect}"
|
69
75
|
end
|
@@ -76,3 +82,5 @@ require "ssh_data/public_key/rsa"
|
|
76
82
|
require "ssh_data/public_key/dsa"
|
77
83
|
require "ssh_data/public_key/ecdsa"
|
78
84
|
require "ssh_data/public_key/ed25519"
|
85
|
+
require "ssh_data/public_key/sked25519"
|
86
|
+
require "ssh_data/public_key/skecdsa"
|
data/lib/ssh_data/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ssh_data
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- mastahyeti
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-12-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: ed25519
|
@@ -30,43 +30,43 @@ dependencies:
|
|
30
30
|
requirements:
|
31
31
|
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: '0.
|
33
|
+
version: '0.14'
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: '0.
|
40
|
+
version: '0.14'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: rspec
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
45
|
- - "~>"
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: '3.
|
47
|
+
version: '3.10'
|
48
48
|
type: :development
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
52
|
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version: '3.
|
54
|
+
version: '3.10'
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: rspec-mocks
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
59
|
- - "~>"
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version: '3.
|
61
|
+
version: '3.10'
|
62
62
|
type: :development
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
66
|
- - "~>"
|
67
67
|
- !ruby/object:Gem::Version
|
68
|
-
version: '3.
|
69
|
-
description:
|
68
|
+
version: '3.10'
|
69
|
+
description:
|
70
70
|
email: opensource+ssh_data@github.com
|
71
71
|
executables: []
|
72
72
|
extensions: []
|
@@ -89,18 +89,20 @@ files:
|
|
89
89
|
- "./lib/ssh_data/public_key/ecdsa.rb"
|
90
90
|
- "./lib/ssh_data/public_key/ed25519.rb"
|
91
91
|
- "./lib/ssh_data/public_key/rsa.rb"
|
92
|
+
- "./lib/ssh_data/public_key/skecdsa.rb"
|
93
|
+
- "./lib/ssh_data/public_key/sked25519.rb"
|
92
94
|
- "./lib/ssh_data/version.rb"
|
93
95
|
homepage: https://github.com/github/ssh_data
|
94
96
|
licenses:
|
95
97
|
- MIT
|
96
98
|
metadata: {}
|
97
|
-
post_install_message:
|
99
|
+
post_install_message:
|
98
100
|
rdoc_options: []
|
99
101
|
require_paths:
|
100
102
|
- lib
|
101
103
|
required_ruby_version: !ruby/object:Gem::Requirement
|
102
104
|
requirements:
|
103
|
-
- - "
|
105
|
+
- - ">="
|
104
106
|
- !ruby/object:Gem::Version
|
105
107
|
version: '2.3'
|
106
108
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
@@ -109,8 +111,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
109
111
|
- !ruby/object:Gem::Version
|
110
112
|
version: '0'
|
111
113
|
requirements: []
|
112
|
-
rubygems_version: 3.
|
113
|
-
signing_key:
|
114
|
+
rubygems_version: 3.1.2
|
115
|
+
signing_key:
|
114
116
|
specification_version: 4
|
115
117
|
summary: Library for parsing SSH certificates
|
116
118
|
test_files: []
|