sshkey 1.9.0 → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- 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