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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: e557b4605e1f00d77de9e7b939f79a5ba9601cdf
4
- data.tar.gz: 6764a84f581a544e0adea8958731eb01bd35a550
3
+ metadata.gz: b6e9c3f40bf3a5b7a9f80cadd7d98e8c4e9b41d4
4
+ data.tar.gz: 362495eb1d46d0befe4c932c94318ce1e40c8ec2
5
5
  SHA512:
6
- metadata.gz: dd96a9bacc99265e0f211b40a4c0d4a860ed4f6e5ffb7197277f5fdf11800776f6dbf687288b4c2b4bf3829e02273b2dcaa7b5c8fec662fda8b695b6f5861c5c
7
- data.tar.gz: 8d68590c6f42a5d3868eaa0c39a8880c8c2666c5f63ac9d53df9cee0cba7f7827a3f3f3343166adecdca88e05de7599b0c7c163327ca12f72f3f04f2a0e0b965
6
+ metadata.gz: 7f99fe44852eb551a34ff7fc8ca2dcab7e51a222e9e2bb7c9708115419e1e1e08444ca03973692547b2ce5d83d4dda593b95baa3bca19b1def9df3037bae127c
7
+ data.tar.gz: 846c9b1966e56c5f405897254619367867d34855c9ebaa65f7d863ad271763427d574589c22b6570c790642a352e8fb39fb055a56ce446c18d717f17cf943f42
@@ -1,12 +1,13 @@
1
1
  language: ruby
2
2
 
3
3
  rvm:
4
- - 1.9.3
5
- - 2.0.0
6
- - 2.1.9
7
- - 2.2.6
8
- - 2.3.3
9
- - 2.4.0
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: trusty
21
+ dist: xenial
data/Gemfile CHANGED
@@ -1,7 +1,5 @@
1
1
  source "https://rubygems.org"
2
2
 
3
- gem "jruby-openssl", ">= 0.8.2", :platforms => :jruby
4
- gem "rubysl", "~> 2.0.15", :platforms => :rbx
5
- gem "rubysl-test-unit", "~> 2.0.3", :platforms => :rbx
3
+ gem "jruby-openssl", ">= 0.8.2", platform: :jruby
6
4
 
7
5
  gemspec
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 1.9.3+ and JRuby.
9
+ Tested / supported on CRuby 2.0.0+ and JRuby.
10
10
 
11
11
  ## Installation
12
12
 
13
- gem install sshkey
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
- k = SSHKey.new(File.read("~/.ssh/id_rsa"), comment: "foo@bar.com")
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. Returns `SSHKey::PublicKeyError` if bits cannot be determined.
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. Returns `SSHKey::PublicKeyError` if a valid key cannot be generated.
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-2016 James Miller
216
+ Copyright (c) 2011-2019 James Miller
@@ -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 'sshkey/exception'
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::Cipher.new("AES-128-CBC") if options[:passphrase]
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 && sections[0].num_bytes == 32 # https://tools.ietf.org/id/draft-bjh21-ssh-ed25519-00.html#rfc.section.4
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
- source_format, source_key = parse_ssh_public_key(ssh_public_key)
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::Cipher.new("AES-128-CBC"), passphrase)
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
@@ -1,3 +1,3 @@
1
1
  class SSHKey
2
- VERSION = "1.9.0"
2
+ VERSION = "2.0.0"
3
3
  end
@@ -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 = 'AAAAC3NzaC1lZDI1NTE5AAAAIBrNsRCISAtKXV5OVxqV6unVcdis5Uh3oiC6B7CMB7HQ'
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: 1.9.0
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: 2017-01-25 00:00:00.000000000 Z
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.6.8
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
@@ -1,3 +0,0 @@
1
- class SSHKey
2
- class PublicKeyError < StandardError; end
3
- end