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 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