sshkey 1.9.0 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.travis.yml +8 -7
- data/Gemfile +1 -3
- data/README.md +8 -6
- data/lib/sshkey.rb +45 -7
- data/lib/sshkey/version.rb +1 -1
- data/test/sshkey_test.rb +36 -5
- metadata +3 -4
- data/lib/sshkey/exception.rb +0 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b6e9c3f40bf3a5b7a9f80cadd7d98e8c4e9b41d4
|
4
|
+
data.tar.gz: 362495eb1d46d0befe4c932c94318ce1e40c8ec2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7f99fe44852eb551a34ff7fc8ca2dcab7e51a222e9e2bb7c9708115419e1e1e08444ca03973692547b2ce5d83d4dda593b95baa3bca19b1def9df3037bae127c
|
7
|
+
data.tar.gz: 846c9b1966e56c5f405897254619367867d34855c9ebaa65f7d863ad271763427d574589c22b6570c790642a352e8fb39fb055a56ce446c18d717f17cf943f42
|
data/.travis.yml
CHANGED
@@ -1,12 +1,13 @@
|
|
1
1
|
language: ruby
|
2
2
|
|
3
3
|
rvm:
|
4
|
-
-
|
5
|
-
- 2.
|
6
|
-
- 2.
|
7
|
-
- 2.
|
8
|
-
- 2.
|
9
|
-
- 2.
|
4
|
+
- 2.0
|
5
|
+
- 2.1
|
6
|
+
- 2.2
|
7
|
+
- 2.3
|
8
|
+
- 2.4
|
9
|
+
- 2.5
|
10
|
+
- 2.6
|
10
11
|
- ruby-head
|
11
12
|
- jruby
|
12
13
|
- jruby-head
|
@@ -17,4 +18,4 @@ matrix:
|
|
17
18
|
- rvm: jruby-head
|
18
19
|
|
19
20
|
sudo: required
|
20
|
-
dist:
|
21
|
+
dist: xenial
|
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -6,11 +6,11 @@ Generate private and public SSH keys (RSA and DSA supported) using pure Ruby.
|
|
6
6
|
|
7
7
|
## Requirements
|
8
8
|
|
9
|
-
Tested / supported on CRuby
|
9
|
+
Tested / supported on CRuby 2.0.0+ and JRuby.
|
10
10
|
|
11
11
|
## Installation
|
12
12
|
|
13
|
-
|
13
|
+
gem install sshkey
|
14
14
|
|
15
15
|
## Usage
|
16
16
|
|
@@ -35,7 +35,8 @@ k = SSHKey.generate(
|
|
35
35
|
Return an SSHKey object from an existing RSA or DSA private key (provided as a string).
|
36
36
|
|
37
37
|
```ruby
|
38
|
-
|
38
|
+
f = File.read(File.expand_path("~/.ssh/id_rsa"))
|
39
|
+
k = SSHKey.new(f, comment: "foo@bar.com")
|
39
40
|
```
|
40
41
|
|
41
42
|
### The SSHKey object
|
@@ -90,6 +91,7 @@ k.ssh_public_key
|
|
90
91
|
k.ssh2_public_key
|
91
92
|
# => "---- BEGIN SSH2 PUBLIC KEY ----\nComment: me@me.com\nAAAAB3NzaC1yc2EAAAADAQABAAABAQC9HuXvYJPtQE/o/7TYi63yAopsrJ6TP+lDGdyQ+n\nVVp+5ojAIy9h8/h99UlNxjkiFT2YhI3Fl/pgNDRO4PVo6tlgb3CwiAZjSdeE5RnF79Dkj5\nXsM4j+FLMoXtbRw0K9ok9RKjz6ygIs1JDmaOdXexFnq4nAYU3fSLUa6WoccqTHe8bFuJoA\nv1gbnx09Js8YcVMD96mpTJ3V/MK5YfIv10dbtrDhGug3IS1V2J+0BB9orbQja554N+4S0I\n9rFBgVCpvPmQqddDHd/AdGkLv/zjEfGytjnvp68bEfDinkQkPfuxw01yd5MbcvLv39VVIC\nWtKbqW263HT5LvSxwKorR7\n---- END SSH2 PUBLIC KEY ----"
|
92
93
|
```
|
94
|
+
|
93
95
|
#### Bit length
|
94
96
|
|
95
97
|
Determine the strength of the key in bits as an integer.
|
@@ -179,7 +181,7 @@ SSHKey.valid_ssh_public_key? "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC9HuXvYJPtQE
|
|
179
181
|
|
180
182
|
#### Bit length
|
181
183
|
|
182
|
-
Determine the strength of the key in bits as an integer.
|
184
|
+
Determine the strength of the key in bits as an integer. Returns `SSHKey::PublicKeyError` if bits cannot be determined.
|
183
185
|
|
184
186
|
```ruby
|
185
187
|
SSHKey.ssh_public_key_bits "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC9HuXvYJPtQE/o/7TYi63yAopsrJ6TP+lDGdyQ+nVVp+5ojAIy9h8/h99UlNxjkiFT2YhI3Fl/pgNDRO4PVo6tlgb3CwiAZjSdeE5RnF79Dkj5XsM4j+FLMoXtbRw0K9ok9RKjz6ygIs1JDmaOdXexFnq4nAYU3fSLUa6WoccqTHe8bFuJoAv1gbnx09Js8YcVMD96mpTJ3V/MK5YfIv10dbtrDhGug3IS1V2J+0BB9orbQja554N+4S0I9rFBgVCpvPmQqddDHd/AdGkLv/zjEfGytjnvp68bEfDinkQkPfuxw01yd5MbcvLv39VVICWtKbqW263HT5LvSxwKorR7"
|
@@ -202,7 +204,7 @@ SSHKey.sha256_fingerprint "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC9HuXvYJPtQE/o/
|
|
202
204
|
|
203
205
|
#### Convert to SSH2 Public Key
|
204
206
|
|
205
|
-
Convert an existing SSH Public Key into an SSH2 Public key.
|
207
|
+
Convert an existing SSH Public Key into an SSH2 Public key. Returns `SSHKey::PublicKeyError` if a valid key cannot be generated.
|
206
208
|
|
207
209
|
```ruby
|
208
210
|
SSHKey.ssh_public_key_to_ssh2_public_key "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC9HuXvYJPtQE/o/7TYi63yAopsrJ6TP+lDGdyQ+nVVp+5ojAIy9h8/h99UlNxjkiFT2YhI3Fl/pgNDRO4PVo6tlgb3CwiAZjSdeE5RnF79Dkj5XsM4j+FLMoXtbRw0K9ok9RKjz6ygIs1JDmaOdXexFnq4nAYU3fSLUa6WoccqTHe8bFuJoAv1gbnx09Js8YcVMD96mpTJ3V/MK5YfIv10dbtrDhGug3IS1V2J+0BB9orbQja554N+4S0I9rFBgVCpvPmQqddDHd/AdGkLv/zjEfGytjnvp68bEfDinkQkPfuxw01yd5MbcvLv39VVICWtKbqW263HT5LvSxwKorR7 me@me.com"
|
@@ -211,4 +213,4 @@ SSHKey.ssh_public_key_to_ssh2_public_key "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQ
|
|
211
213
|
|
212
214
|
## Copyright
|
213
215
|
|
214
|
-
Copyright (c) 2011-
|
216
|
+
Copyright (c) 2011-2019 James Miller
|
data/lib/sshkey.rb
CHANGED
@@ -1,10 +1,8 @@
|
|
1
|
-
$:.unshift File.dirname(__FILE__)
|
2
|
-
|
3
1
|
require 'openssl'
|
4
2
|
require 'base64'
|
5
3
|
require 'digest/md5'
|
6
4
|
require 'digest/sha1'
|
7
|
-
require '
|
5
|
+
require 'digest/sha2'
|
8
6
|
|
9
7
|
class SSHKey
|
10
8
|
SSH_TYPES = {
|
@@ -15,6 +13,13 @@ class SSHKey
|
|
15
13
|
"ecdsa-sha2-nistp384" => "ecdsa",
|
16
14
|
"ecdsa-sha2-nistp521" => "ecdsa",
|
17
15
|
}
|
16
|
+
|
17
|
+
SSHFP_TYPES = {
|
18
|
+
"rsa" => 1,
|
19
|
+
"dsa" => 2,
|
20
|
+
"ecdsa" => 3,
|
21
|
+
"ed25519" => 4,
|
22
|
+
}
|
18
23
|
SSH_CONVERSION = {"rsa" => ["e", "n"], "dsa" => ["p", "q", "g", "pub_key"]}
|
19
24
|
SSH2_LINE_LENGTH = 70 # +1 (for line wrap '/' character) must be <= 72
|
20
25
|
|
@@ -38,7 +43,7 @@ class SSHKey
|
|
38
43
|
default_bits = type == "rsa" ? 2048 : 1024
|
39
44
|
|
40
45
|
bits = options[:bits] || default_bits
|
41
|
-
cipher = OpenSSL::Cipher
|
46
|
+
cipher = OpenSSL::Cipher.new("AES-128-CBC") if options[:passphrase]
|
42
47
|
|
43
48
|
case type.downcase
|
44
49
|
when "rsa" then new(OpenSSL::PKey::RSA.generate(bits).to_pem(cipher, options[:passphrase]), options)
|
@@ -62,7 +67,7 @@ class SSHKey
|
|
62
67
|
when "ssh-rsa", "ssh-dss"
|
63
68
|
sections.size == SSH_CONVERSION[SSH_TYPES[ssh_type]].size
|
64
69
|
when "ssh-ed25519"
|
65
|
-
sections.size == 1
|
70
|
+
sections.size == 1 # https://tools.ietf.org/id/draft-bjh21-ssh-ed25519-00.html#rfc.section.4
|
66
71
|
when "ecdsa-sha2-nistp256", "ecdsa-sha2-nistp384", "ecdsa-sha2-nistp521"
|
67
72
|
sections.size == 2 # https://tools.ietf.org/html/rfc5656#section-3.1
|
68
73
|
else
|
@@ -115,6 +120,16 @@ class SSHKey
|
|
115
120
|
end
|
116
121
|
end
|
117
122
|
|
123
|
+
# SSHFP records for the given SSH key
|
124
|
+
def sshfp(hostname, key)
|
125
|
+
if key.match(/PRIVATE/)
|
126
|
+
new(key).sshfp hostname
|
127
|
+
else
|
128
|
+
type, encoded_key = parse_ssh_public_key(key)
|
129
|
+
format_sshfp_record(hostname, SSH_TYPES[type], Base64.decode64(encoded_key))
|
130
|
+
end
|
131
|
+
end
|
132
|
+
|
118
133
|
# Convert an existing SSH public key to SSH2 (RFC4716) public key
|
119
134
|
#
|
120
135
|
# ==== Parameters
|
@@ -124,7 +139,7 @@ class SSHKey
|
|
124
139
|
def ssh_public_key_to_ssh2_public_key(ssh_public_key, headers = nil)
|
125
140
|
raise PublicKeyError, "invalid ssh public key" unless SSHKey.valid_ssh_public_key?(ssh_public_key)
|
126
141
|
|
127
|
-
|
142
|
+
_source_format, source_key = parse_ssh_public_key(ssh_public_key)
|
128
143
|
|
129
144
|
# Add a 'Comment' Header Field unless others are explicitly passed in
|
130
145
|
if source_comment = ssh_public_key.split(source_key)[1]
|
@@ -138,6 +153,13 @@ class SSHKey
|
|
138
153
|
ssh2_key << "\n---- END SSH2 PUBLIC KEY ----"
|
139
154
|
end
|
140
155
|
|
156
|
+
def format_sshfp_record(hostname, type, key)
|
157
|
+
[[Digest::SHA1, 1], [Digest::SHA256, 2]].map { |f, num|
|
158
|
+
fpr = f.hexdigest(key)
|
159
|
+
"#{hostname} IN SSHFP #{SSHFP_TYPES[type]} #{num} #{fpr}"
|
160
|
+
}.join("\n")
|
161
|
+
end
|
162
|
+
|
141
163
|
private
|
142
164
|
|
143
165
|
def unpacked_byte_array(ssh_type, encoded_key)
|
@@ -149,16 +171,26 @@ class SSHKey
|
|
149
171
|
raise PublicKeyError, "validation error"
|
150
172
|
end
|
151
173
|
|
174
|
+
byte_count = 0
|
152
175
|
data = []
|
153
176
|
until decoded.empty?
|
154
177
|
front = decoded.slice!(0,4)
|
155
178
|
size = front.unpack("N").first
|
156
179
|
segment = decoded.slice!(0, size)
|
180
|
+
byte_count += segment.length
|
157
181
|
unless front.length == 4 && segment.length == size
|
158
182
|
raise PublicKeyError, "byte array too short"
|
159
183
|
end
|
160
184
|
data << OpenSSL::BN.new(segment, 2)
|
161
185
|
end
|
186
|
+
|
187
|
+
|
188
|
+
if ssh_type == "ssh-ed25519"
|
189
|
+
unless byte_count == 32
|
190
|
+
raise PublicKeyError, "validation error, ed25519 key length not OK"
|
191
|
+
end
|
192
|
+
end
|
193
|
+
|
162
194
|
return data
|
163
195
|
end
|
164
196
|
|
@@ -234,7 +266,7 @@ class SSHKey
|
|
234
266
|
# If no passphrase is set, returns the unencrypted private key
|
235
267
|
def encrypted_private_key
|
236
268
|
return private_key unless passphrase
|
237
|
-
key_object.to_pem(OpenSSL::Cipher
|
269
|
+
key_object.to_pem(OpenSSL::Cipher.new("AES-128-CBC"), passphrase)
|
238
270
|
end
|
239
271
|
|
240
272
|
# Fetch the RSA/DSA public key
|
@@ -344,6 +376,10 @@ class SSHKey
|
|
344
376
|
output
|
345
377
|
end
|
346
378
|
|
379
|
+
def sshfp(hostname)
|
380
|
+
self.class.format_sshfp_record(hostname, @type, ssh_public_key_conversion)
|
381
|
+
end
|
382
|
+
|
347
383
|
def directives=(directives)
|
348
384
|
@directives = Array[directives].flatten.compact
|
349
385
|
end
|
@@ -384,4 +420,6 @@ class SSHKey
|
|
384
420
|
pubkeystr + [data.length].pack("N") + data
|
385
421
|
end
|
386
422
|
end
|
423
|
+
|
424
|
+
class PublicKeyError < StandardError; end
|
387
425
|
end
|
data/lib/sshkey/version.rb
CHANGED
data/test/sshkey_test.rb
CHANGED
@@ -79,7 +79,9 @@ EOF
|
|
79
79
|
SSH_PUBLIC_KEY2 = 'AAAAB3NzaC1yc2EAAAABIwAAAQEAxl6TpN7uFiY/JZ8qDnD7UrxDP+ABeh2PVg8Du1LEgXNk0+YWCeP5S6oHklqaWeDlbmAs1oHsBwCMAVpMa5tgONOLvz4JgwgkiqQEbKR8ofWJ+LADUElvqRVGmGiNEMLI6GJWeneL4sjmbb8d6U+M53c6iWG0si9XE5m7teBQSsCl0Tk3qMIkQGw5zpJeCXjZ8KpJhIJRYgexFkGgPlYRV+UYIhxpUW90t0Ra5i6JOFYwq98k5S/6SJIZQ/A9F4JNzwLw3eVxZj0yVHWxkGz1+TyELNY1kOyMxnZaqSfGzSQJTrnIXpdweVHuYh1LtOgedRQhCyiELeSMGwio1vRPKw=='
|
80
80
|
SSH_PUBLIC_KEY3 = 'AAAAB3NzaC1kc3MAAACBALyVy5dwVwgL3CxXzsvo8DBh58qArQLBNIPW/f9pptmy7jD5QXzOw+12w0/z4lZ86ncoVutRMf44OABcX9ovhRl+luxB7jjpkVXy/p2ZaqPbeyTQUtdTmXa2y4n053Jd61VeMG+iLP7+viT+Ib96y9aVUYQfCrl5heBDUZ9cAFjdAAAAFQDFXnO7JJpFKwkeoor4GWGHtz0D2QAAAIEAqel0RUBO0MY5b3DZ69J/mRzUifN1O6twk4er2ph0JpryuUwZohLpcVZwqoGWmPQy/ZHmV1b3RtT9GWUa+HUqKdMhFVOx/iq1khVfLi83whjMMvXj3ecqd0yzGxGHnSsjVKefa2ywCLHrh4nlUVIaXI5gQpgMyVbMcromDe1WZzoAAACBAIwTRPAEcroqOzaebiVspFcmsXxDQ4wXQZQdho1ExW6FKS8s7/6pItmZYXTvJDwLXgq2/iK1fRRcKk2PJEaSuJR7WeNGsJKfWmQ2UbOhqA3wWLDazIZtcMKjFzD0hM4E8qgjHjMvKDE6WgT6SFP+tqx3nnh7pJWwsbGjSMQexpyR'
|
81
81
|
|
82
|
-
SSH_PUBLIC_KEY_ED25519
|
82
|
+
SSH_PUBLIC_KEY_ED25519 = 'AAAAC3NzaC1lZDI1NTE5AAAAIBrNsRCISAtKXV5OVxqV6unVcdis5Uh3oiC6B7CMB7HQ'
|
83
|
+
SSH_PUBLIC_KEY_ED25519_0_BYTE = 'AAAAC3NzaC1lZDI1NTE5AAAAIADK9x9t3yQQH7h4OEJpUa7l2j7mcmKf4LAsNXHxNbSm'
|
84
|
+
|
83
85
|
SSH_PUBLIC_KEY_ECDSA_256 = 'AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBHJFDZ5qymZfIzoJcxYeu3C9HjJ08QAbqR28C2zSMLwcb3ZzWdRApnj6wEgRvizsBmr9zyPKb2u5Rp0vjJtQcZo='
|
84
86
|
SSH_PUBLIC_KEY_ECDSA_384 = 'AAAAE2VjZHNhLXNoYTItbmlzdHAzODQAAAAIbmlzdHAzODQAAABhBP+GtUCOR8aW7xTtpkbJS0qqNZ98PgbUNtTFhE+Oe+khgoFMX+o0JG5bckVuvtkRl8dr+63kUK0QPTtzP9O5yixB9CYnB8CgCgYo1FCXZuJIImf12wW5nWKglrCH4kV1Qg=='
|
85
87
|
SSH_PUBLIC_KEY_ECDSA_521 = 'AAAAE2VjZHNhLXNoYTItbmlzdHA1MjEAAAAIbmlzdHA1MjEAAACFBACsunidnIZ77AjCHSDp/xknLGDW3M0Ia7nxLdImmp0XGbxtbwYm2ga5XUzV9dMO9wF9ICC3OuH6g9DtGOBNPru1PwFDjaPISGgm0vniEzWazLsvjJVLThOA3VyYLxmtjm0WfS+/DfxgWVS6oeCTnDjjoVVpwU/fDbUbYPPRZI84/hOGNA=='
|
@@ -142,6 +144,21 @@ EOF
|
|
142
144
|
| |
|
143
145
|
| |
|
144
146
|
+-----------------+
|
147
|
+
EOF
|
148
|
+
|
149
|
+
KEY1_SSHFP = <<-EOF.rstrip
|
150
|
+
localhost IN SSHFP 1 1 e4f979f2fed6be2def2ec2faaaf8b01734fe0dc0
|
151
|
+
localhost IN SSHFP 1 2 8ecde59457a1968c427ec56e0f0e71bb736d4bd00e03171763c58beaf90322db
|
152
|
+
EOF
|
153
|
+
|
154
|
+
KEY2_SSHFP = <<-EOF.rstrip
|
155
|
+
localhost IN SSHFP 1 1 9a52782b6bcb39b785ed908a2862aab39888e607
|
156
|
+
localhost IN SSHFP 1 2 db77ffe94fcb771205c7509014a1f2970efa9fe2c81d8a18e2747129c168a2ce
|
157
|
+
EOF
|
158
|
+
|
159
|
+
KEY3_SSHFP = <<-EOF.rstrip
|
160
|
+
localhost IN SSHFP 2 1 1568c672ac18d1fcaba2b7b58cd1fe8fb9aea947
|
161
|
+
localhost IN SSHFP 2 2 98fa843d094e3c6391ad326b535eec3dac758cea9ebad6636ba30eb0521c6bef
|
145
162
|
EOF
|
146
163
|
|
147
164
|
SSH2_PUBLIC_KEY1 = <<-EOF.rstrip
|
@@ -261,9 +278,6 @@ EOF
|
|
261
278
|
expected1 = SSH2_PUBLIC_KEY1
|
262
279
|
expected2 = SSH2_PUBLIC_KEY2
|
263
280
|
expected3 = SSH2_PUBLIC_KEY3
|
264
|
-
public_key1 = "ssh-rsa #{SSH_PUBLIC_KEY1} me@example.com"
|
265
|
-
public_key2 = "ssh-rsa #{SSH_PUBLIC_KEY2}"
|
266
|
-
public_key3 = "ssh-rsa #{SSH_PUBLIC_KEY3} 1024-bit DSA with provided comment"
|
267
281
|
|
268
282
|
assert_equal expected1, @key1.ssh2_public_key
|
269
283
|
assert_equal expected2, @key2.ssh2_public_key({})
|
@@ -324,6 +338,7 @@ EOF
|
|
324
338
|
|
325
339
|
def test_ssh_public_key_validation_elliptic
|
326
340
|
assert SSHKey.valid_ssh_public_key?("ssh-ed25519 #{SSH_PUBLIC_KEY_ED25519} me@example.com")
|
341
|
+
assert SSHKey.valid_ssh_public_key?("ssh-ed25519 #{SSH_PUBLIC_KEY_ED25519_0_BYTE} me@example.com")
|
327
342
|
assert SSHKey.valid_ssh_public_key?("ecdsa-sha2-nistp256 #{SSH_PUBLIC_KEY_ECDSA_256}")
|
328
343
|
assert SSHKey.valid_ssh_public_key?("ecdsa-sha2-nistp384 #{SSH_PUBLIC_KEY_ECDSA_384} me@example.com")
|
329
344
|
assert SSHKey.valid_ssh_public_key?(%Q{from="trusted.eng.cam.ac.uk",no-port-forwarding,no-pty ecdsa-sha2-nistp521 #{SSH_PUBLIC_KEY_ECDSA_521} me@example.com})
|
@@ -352,6 +367,15 @@ EOF
|
|
352
367
|
assert !SSHKey.valid_ssh_public_key?(invalid4)
|
353
368
|
end
|
354
369
|
|
370
|
+
def test_ssh_public_key_sshfp
|
371
|
+
assert_equal KEY1_SSHFP, SSHKey.sshfp("localhost", "ssh-rsa #{SSH_PUBLIC_KEY1}\n")
|
372
|
+
assert_equal KEY2_SSHFP, SSHKey.sshfp("localhost", "ssh-rsa #{SSH_PUBLIC_KEY2}\n")
|
373
|
+
assert_equal KEY3_SSHFP, SSHKey.sshfp("localhost", "ssh-dss #{SSH_PUBLIC_KEY3}\n")
|
374
|
+
assert_equal KEY1_SSHFP, SSHKey.sshfp("localhost", SSH_PRIVATE_KEY1)
|
375
|
+
assert_equal KEY2_SSHFP, SSHKey.sshfp("localhost", SSH_PRIVATE_KEY2)
|
376
|
+
assert_equal KEY3_SSHFP, SSHKey.sshfp("localhost", SSH_PRIVATE_KEY3)
|
377
|
+
end
|
378
|
+
|
355
379
|
def test_ssh_public_key_bits
|
356
380
|
expected1 = "ssh-rsa #{SSH_PUBLIC_KEY1} me@example.com"
|
357
381
|
expected2 = "ssh-rsa #{SSH_PUBLIC_KEY2} me@example.com"
|
@@ -385,7 +409,7 @@ EOF
|
|
385
409
|
assert_equal(SSH2_PUBLIC_KEY2, SSHKey.ssh_public_key_to_ssh2_public_key(public_key2))
|
386
410
|
assert_equal(SSH2_PUBLIC_KEY2, SSHKey.ssh_public_key_to_ssh2_public_key(public_key2, {}))
|
387
411
|
assert_equal(SSH2_PUBLIC_KEY3, SSHKey.ssh_public_key_to_ssh2_public_key(public_key3, {'Comment' => '1024-bit DSA with provided comment', 'x-private-use-header' => 'some value that is long enough to go to wrap around to a new line.'}))
|
388
|
-
end
|
412
|
+
end
|
389
413
|
|
390
414
|
def test_exponent
|
391
415
|
assert_equal 35, @key1.key_object.e.to_i
|
@@ -451,6 +475,13 @@ end
|
|
451
475
|
assert_equal KEY2_RANDOMART, @key2.randomart
|
452
476
|
assert_equal KEY3_RANDOMART, @key3.randomart
|
453
477
|
end
|
478
|
+
|
479
|
+
def test_sshfp
|
480
|
+
assert_equal KEY1_SSHFP, @key1.sshfp("localhost")
|
481
|
+
assert_equal KEY2_SSHFP, @key2.sshfp("localhost")
|
482
|
+
assert_equal KEY3_SSHFP, @key3.sshfp("localhost")
|
483
|
+
end
|
484
|
+
|
454
485
|
end
|
455
486
|
|
456
487
|
class SSHKeyEncryptedTest < Test::Unit::TestCase
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sshkey
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 2.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- James Miller
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2019-02-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|
@@ -52,7 +52,6 @@ files:
|
|
52
52
|
- README.md
|
53
53
|
- Rakefile
|
54
54
|
- lib/sshkey.rb
|
55
|
-
- lib/sshkey/exception.rb
|
56
55
|
- lib/sshkey/version.rb
|
57
56
|
- sshkey.gemspec
|
58
57
|
- test/sshkey_test.rb
|
@@ -76,7 +75,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
76
75
|
version: '0'
|
77
76
|
requirements: []
|
78
77
|
rubyforge_project: sshkey
|
79
|
-
rubygems_version: 2.
|
78
|
+
rubygems_version: 2.5.2.3
|
80
79
|
signing_key:
|
81
80
|
specification_version: 4
|
82
81
|
summary: SSH private/public key generator in Ruby
|
data/lib/sshkey/exception.rb
DELETED