net-ssh 5.2.0 → 6.0.0.beta1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (57) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data.tar.gz.sig +0 -0
  4. data/.gitignore +1 -0
  5. data/.rubocop.yml +7 -4
  6. data/.rubocop_todo.yml +389 -379
  7. data/.travis.yml +13 -14
  8. data/CHANGES.txt +7 -0
  9. data/README.md +286 -0
  10. data/Rakefile +1 -2
  11. data/appveyor.yml +4 -2
  12. data/lib/net/ssh/authentication/key_manager.rb +7 -3
  13. data/lib/net/ssh/authentication/methods/keyboard_interactive.rb +3 -1
  14. data/lib/net/ssh/authentication/pub_key_fingerprint.rb +0 -1
  15. data/lib/net/ssh/authentication/session.rb +2 -6
  16. data/lib/net/ssh/buffer.rb +1 -9
  17. data/lib/net/ssh/config.rb +25 -10
  18. data/lib/net/ssh/connection/channel.rb +7 -3
  19. data/lib/net/ssh/connection/session.rb +7 -3
  20. data/lib/net/ssh/key_factory.rb +6 -8
  21. data/lib/net/ssh/known_hosts.rb +26 -29
  22. data/lib/net/ssh/service/forward.rb +2 -1
  23. data/lib/net/ssh/test.rb +3 -2
  24. data/lib/net/ssh/transport/algorithms.rb +67 -42
  25. data/lib/net/ssh/transport/cipher_factory.rb +11 -27
  26. data/lib/net/ssh/transport/constants.rb +10 -6
  27. data/lib/net/ssh/transport/ctr.rb +1 -7
  28. data/lib/net/ssh/transport/hmac.rb +15 -13
  29. data/lib/net/ssh/transport/hmac/abstract.rb +16 -0
  30. data/lib/net/ssh/transport/hmac/sha2_256.rb +7 -11
  31. data/lib/net/ssh/transport/hmac/sha2_256_96.rb +4 -8
  32. data/lib/net/ssh/transport/hmac/sha2_256_etm.rb +12 -0
  33. data/lib/net/ssh/transport/hmac/sha2_512.rb +6 -9
  34. data/lib/net/ssh/transport/hmac/sha2_512_96.rb +4 -8
  35. data/lib/net/ssh/transport/hmac/sha2_512_etm.rb +12 -0
  36. data/lib/net/ssh/transport/kex.rb +13 -11
  37. data/lib/net/ssh/transport/kex/abstract.rb +123 -0
  38. data/lib/net/ssh/transport/kex/abstract5656.rb +72 -0
  39. data/lib/net/ssh/transport/kex/curve25519_sha256.rb +38 -0
  40. data/lib/net/ssh/transport/kex/curve25519_sha256_loader.rb +30 -0
  41. data/lib/net/ssh/transport/kex/diffie_hellman_group14_sha1.rb +1 -15
  42. data/lib/net/ssh/transport/kex/diffie_hellman_group1_sha1.rb +9 -118
  43. data/lib/net/ssh/transport/kex/diffie_hellman_group_exchange_sha1.rb +0 -6
  44. data/lib/net/ssh/transport/kex/diffie_hellman_group_exchange_sha256.rb +5 -9
  45. data/lib/net/ssh/transport/kex/ecdh_sha2_nistp256.rb +18 -79
  46. data/lib/net/ssh/transport/kex/ecdh_sha2_nistp384.rb +5 -4
  47. data/lib/net/ssh/transport/kex/ecdh_sha2_nistp521.rb +5 -4
  48. data/lib/net/ssh/transport/openssl.rb +104 -107
  49. data/lib/net/ssh/transport/packet_stream.rb +44 -10
  50. data/lib/net/ssh/transport/state.rb +1 -1
  51. data/lib/net/ssh/version.rb +3 -3
  52. data/net-ssh.gemspec +8 -6
  53. metadata +35 -16
  54. metadata.gz.sig +0 -0
  55. data/Gemfile.noed25519.lock +0 -41
  56. data/README.rdoc +0 -194
  57. data/support/arcfour_check.rb +0 -20
@@ -1,8 +1,9 @@
1
- module Net
2
- module SSH
3
- module Transport
4
- module Kex
1
+ require 'net/ssh/transport/kex/ecdh_sha2_nistp256'
5
2
 
3
+ module Net
4
+ module SSH
5
+ module Transport
6
+ module Kex
6
7
  # A key-exchange service implementing the "ecdh-sha2-nistp256"
7
8
  # key-exchange algorithm. (defined in RFC 5656)
8
9
  class EcdhSHA2NistP384 < EcdhSHA2NistP256
@@ -1,8 +1,9 @@
1
- module Net
2
- module SSH
3
- module Transport
4
- module Kex
1
+ require 'net/ssh/transport/kex/ecdh_sha2_nistp256'
5
2
 
3
+ module Net
4
+ module SSH
5
+ module Transport
6
+ module Kex
6
7
  # A key-exchange service implementing the "ecdh-sha2-nistp521"
7
8
  # key-exchange algorithm. (defined in RFC 5656)
8
9
  class EcdhSHA2NistP521 < EcdhSHA2NistP256
@@ -98,9 +98,9 @@ module OpenSSL
98
98
  sig_r = sig[0,20].unpack("H*")[0].to_i(16)
99
99
  sig_s = sig[20,20].unpack("H*")[0].to_i(16)
100
100
  a1sig = OpenSSL::ASN1::Sequence([
101
- OpenSSL::ASN1::Integer(sig_r),
102
- OpenSSL::ASN1::Integer(sig_s)
103
- ])
101
+ OpenSSL::ASN1::Integer(sig_r),
102
+ OpenSSL::ASN1::Integer(sig_s)
103
+ ])
104
104
  return verify(OpenSSL::Digest::SHA1.new, a1sig.to_der, data)
105
105
  end
106
106
 
@@ -121,132 +121,129 @@ module OpenSSL
121
121
  end
122
122
  end
123
123
 
124
- if defined?(OpenSSL::PKey::EC)
125
- # This class is originally defined in the OpenSSL module. As needed, methods
126
- # have been added to it by the Net::SSH module for convenience in dealing
127
- # with SSH functionality.
128
- class EC
129
- CurveNameAlias = {
130
- "nistp256" => "prime256v1",
131
- "nistp384" => "secp384r1",
132
- "nistp521" => "secp521r1"
133
- }
134
-
135
- CurveNameAliasInv = {
136
- "prime256v1" => "nistp256",
137
- "secp384r1" => "nistp384",
138
- "secp521r1" => "nistp521"
139
- }
140
-
141
- def self.read_keyblob(curve_name_in_type, buffer)
142
- curve_name_in_key = buffer.read_string
143
- raise Net::SSH::Exception, "curve name mismatched (`#{curve_name_in_key}' with `#{curve_name_in_type}')" unless curve_name_in_type == curve_name_in_key
144
- public_key_oct = buffer.read_string
145
- begin
146
- key = OpenSSL::PKey::EC.new(OpenSSL::PKey::EC::CurveNameAlias[curve_name_in_key])
147
- group = key.group
148
- point = OpenSSL::PKey::EC::Point.new(group, OpenSSL::BN.new(public_key_oct, 2))
149
- key.public_key = point
150
-
151
- return key
152
- rescue OpenSSL::PKey::ECError
153
- raise NotImplementedError, "unsupported key type `#{type}'"
154
- end
124
+ # This class is originally defined in the OpenSSL module. As needed, methods
125
+ # have been added to it by the Net::SSH module for convenience in dealing
126
+ # with SSH functionality.
127
+ class EC
128
+ CurveNameAlias = {
129
+ 'nistp256' => 'prime256v1',
130
+ 'nistp384' => 'secp384r1',
131
+ 'nistp521' => 'secp521r1'
132
+ }.freeze
133
+
134
+ CurveNameAliasInv = {
135
+ 'prime256v1' => 'nistp256',
136
+ 'secp384r1' => 'nistp384',
137
+ 'secp521r1' => 'nistp521'
138
+ }.freeze
139
+
140
+ def self.read_keyblob(curve_name_in_type, buffer)
141
+ curve_name_in_key = buffer.read_string
142
+
143
+ unless curve_name_in_type == curve_name_in_key
144
+ raise Net::SSH::Exception, "curve name mismatched (`#{curve_name_in_key}' with `#{curve_name_in_type}')"
155
145
  end
156
146
 
157
- # Returns the description of this key type used by the
158
- # SSH2 protocol, like "ecdsa-sha2-nistp256"
159
- def ssh_type
160
- "ecdsa-sha2-#{CurveNameAliasInv[self.group.curve_name]}"
161
- end
147
+ public_key_oct = buffer.read_string
148
+ begin
149
+ key = OpenSSL::PKey::EC.new(OpenSSL::PKey::EC::CurveNameAlias[curve_name_in_key])
150
+ group = key.group
151
+ point = OpenSSL::PKey::EC::Point.new(group, OpenSSL::BN.new(public_key_oct, 2))
152
+ key.public_key = point
162
153
 
163
- def ssh_signature_type
164
- ssh_type
154
+ return key
155
+ rescue OpenSSL::PKey::ECError
156
+ raise NotImplementedError, "unsupported key type `#{type}'"
165
157
  end
158
+ end
166
159
 
167
- def digester
168
- if self.group.curve_name =~ /^[a-z]+(\d+)\w*\z/
169
- curve_size = $1.to_i
170
- if curve_size <= 256
171
- OpenSSL::Digest::SHA256.new
172
- elsif curve_size <= 384
173
- OpenSSL::Digest::SHA384.new
174
- else
175
- OpenSSL::Digest::SHA512.new
176
- end
177
- else
160
+ # Returns the description of this key type used by the
161
+ # SSH2 protocol, like "ecdsa-sha2-nistp256"
162
+ def ssh_type
163
+ "ecdsa-sha2-#{CurveNameAliasInv[group.curve_name]}"
164
+ end
165
+
166
+ def ssh_signature_type
167
+ ssh_type
168
+ end
169
+
170
+ def digester
171
+ if group.curve_name =~ /^[a-z]+(\d+)\w*\z/
172
+ curve_size = Regexp.last_match(1).to_i
173
+ if curve_size <= 256
178
174
  OpenSSL::Digest::SHA256.new
175
+ elsif curve_size <= 384
176
+ OpenSSL::Digest::SHA384.new
177
+ else
178
+ OpenSSL::Digest::SHA512.new
179
179
  end
180
+ else
181
+ OpenSSL::Digest::SHA256.new
180
182
  end
181
- private :digester
183
+ end
184
+ private :digester
182
185
 
183
- # Converts the key to a blob, according to the SSH2 protocol.
184
- def to_blob
185
- @blob ||= Net::SSH::Buffer.from(:string, ssh_type,
186
- :string, CurveNameAliasInv[self.group.curve_name],
187
- :mstring, self.public_key.to_bn.to_s(2)).to_s
188
- @blob
189
- end
186
+ # Converts the key to a blob, according to the SSH2 protocol.
187
+ def to_blob
188
+ @blob ||= Net::SSH::Buffer.from(:string, ssh_type,
189
+ :string, CurveNameAliasInv[group.curve_name],
190
+ :mstring, public_key.to_bn.to_s(2)).to_s
191
+ @blob
192
+ end
190
193
 
191
- # Verifies the given signature matches the given data.
192
- def ssh_do_verify(sig, data)
193
- digest = digester.digest(data)
194
- a1sig = nil
194
+ # Verifies the given signature matches the given data.
195
+ def ssh_do_verify(sig, data)
196
+ digest = digester.digest(data)
197
+ a1sig = nil
195
198
 
196
- begin
197
- sig_r_len = sig[0,4].unpack("H*")[0].to_i(16)
198
- sig_l_len = sig[4 + sig_r_len,4].unpack("H*")[0].to_i(16)
199
+ begin
200
+ sig_r_len = sig[0, 4].unpack('H*')[0].to_i(16)
201
+ sig_l_len = sig[4 + sig_r_len, 4].unpack('H*')[0].to_i(16)
199
202
 
200
- sig_r = sig[4,sig_r_len].unpack("H*")[0]
201
- sig_s = sig[4 + sig_r_len + 4,sig_l_len].unpack("H*")[0]
203
+ sig_r = sig[4, sig_r_len].unpack('H*')[0]
204
+ sig_s = sig[4 + sig_r_len + 4, sig_l_len].unpack('H*')[0]
202
205
 
203
- a1sig = OpenSSL::ASN1::Sequence([
204
- OpenSSL::ASN1::Integer(sig_r.to_i(16)),
205
- OpenSSL::ASN1::Integer(sig_s.to_i(16))
206
- ])
207
- rescue StandardError
208
- end
206
+ a1sig = OpenSSL::ASN1::Sequence([
207
+ OpenSSL::ASN1::Integer(sig_r.to_i(16)),
208
+ OpenSSL::ASN1::Integer(sig_s.to_i(16))
209
+ ])
210
+ rescue StandardError
211
+ end
209
212
 
210
- if a1sig == nil
211
- return false
212
- else
213
- dsa_verify_asn1(digest, a1sig.to_der)
214
- end
213
+ if a1sig.nil?
214
+ return false
215
+ else
216
+ dsa_verify_asn1(digest, a1sig.to_der)
215
217
  end
218
+ end
219
+
220
+ # Returns the signature for the given data.
221
+ def ssh_do_sign(data)
222
+ digest = digester.digest(data)
223
+ sig = dsa_sign_asn1(digest)
224
+ a1sig = OpenSSL::ASN1.decode(sig)
216
225
 
217
- # Returns the signature for the given data.
218
- def ssh_do_sign(data)
219
- digest = digester.digest(data)
220
- sig = dsa_sign_asn1(digest)
221
- a1sig = OpenSSL::ASN1.decode(sig)
226
+ sig_r = a1sig.value[0].value
227
+ sig_s = a1sig.value[1].value
222
228
 
223
- sig_r = a1sig.value[0].value
224
- sig_s = a1sig.value[1].value
229
+ Net::SSH::Buffer.from(:bignum, sig_r, :bignum, sig_s).to_s
230
+ end
225
231
 
226
- return Net::SSH::Buffer.from(:bignum, sig_r, :bignum, sig_s).to_s
232
+ class Point
233
+ # Returns the description of this key type used by the
234
+ # SSH2 protocol, like "ecdsa-sha2-nistp256"
235
+ def ssh_type
236
+ "ecdsa-sha2-#{CurveNameAliasInv[group.curve_name]}"
227
237
  end
228
238
 
229
- class Point
230
- # Returns the description of this key type used by the
231
- # SSH2 protocol, like "ecdsa-sha2-nistp256"
232
- def ssh_type
233
- "ecdsa-sha2-#{CurveNameAliasInv[self.group.curve_name]}"
234
- end
235
-
236
- # Converts the key to a blob, according to the SSH2 protocol.
237
- def to_blob
238
- @blob ||= Net::SSH::Buffer.from(:string, ssh_type,
239
- :string, CurveNameAliasInv[self.group.curve_name],
240
- :mstring, self.to_bn.to_s(2)).to_s
241
- @blob
242
- end
239
+ # Converts the key to a blob, according to the SSH2 protocol.
240
+ def to_blob
241
+ @blob ||= Net::SSH::Buffer.from(:string, ssh_type,
242
+ :string, CurveNameAliasInv[group.curve_name],
243
+ :mstring, to_bn.to_s(2)).to_s
244
+ @blob
243
245
  end
244
246
  end
245
- else
246
- class OpenSSL::PKey::ECError < RuntimeError
247
- # for compatibility with interpreters
248
- # without EC support (i.e. JRuby)
249
- end
250
247
  end
251
248
  end
252
249
  end
@@ -130,7 +130,7 @@ module Net
130
130
  payload = client.compress(payload)
131
131
 
132
132
  # the length of the packet, minus the padding
133
- actual_length = 4 + payload.bytesize + 1
133
+ actual_length = (client.hmac.etm ? 0 : 4) + payload.bytesize + 1
134
134
 
135
135
  # compute the padding length
136
136
  padding_length = client.block_size - (actual_length % client.block_size)
@@ -146,11 +146,32 @@ module Net
146
146
 
147
147
  padding = Array.new(padding_length) { rand(256) }.pack("C*")
148
148
 
149
- unencrypted_data = [packet_length, padding_length, payload, padding].pack("NCA*A*")
150
- mac = client.hmac.digest([client.sequence_number, unencrypted_data].pack("NA*"))
149
+ if client.hmac.etm
150
+ debug { "using encrypt-then-mac" }
151
151
 
152
- encrypted_data = client.update_cipher(unencrypted_data) << client.final_cipher
153
- message = encrypted_data + mac
152
+ # Encrypt padding_length, payload, and padding. Take MAC
153
+ # from the unencrypted packet_lenght and the encrypted
154
+ # data.
155
+ length_data = [packet_length].pack("N")
156
+
157
+ unencrypted_data = [padding_length, payload, padding].pack("CA*A*")
158
+
159
+ encrypted_data = client.update_cipher(unencrypted_data) << client.final_cipher
160
+
161
+ mac_data = length_data + encrypted_data
162
+
163
+ mac = client.hmac.digest([client.sequence_number, mac_data].pack("NA*"))
164
+
165
+ message = mac_data + mac
166
+ else
167
+ unencrypted_data = [packet_length, padding_length, payload, padding].pack("NCA*A*")
168
+
169
+ mac = client.hmac.digest([client.sequence_number, unencrypted_data].pack("NA*"))
170
+
171
+ encrypted_data = client.update_cipher(unencrypted_data) << client.final_cipher
172
+
173
+ message = encrypted_data + mac
174
+ end
154
175
 
155
176
  debug { "queueing packet nr #{client.sequence_number} type #{payload.getbyte(0)} len #{packet_length}" }
156
177
  enqueue(message)
@@ -196,17 +217,25 @@ module Net
196
217
  # algorithms specified in the server state object, and returned as a
197
218
  # new Packet object.
198
219
  def poll_next_packet
220
+ aad_length = server.hmac.etm ? 4 : 0
221
+
199
222
  if @packet.nil?
200
223
  minimum = server.block_size < 4 ? 4 : server.block_size
201
224
  return nil if available < minimum
202
- data = read_available(minimum)
225
+ data = read_available(minimum + aad_length)
203
226
 
204
227
  # decipher it
205
- @packet = Net::SSH::Buffer.new(server.update_cipher(data))
206
- @packet_length = @packet.read_long
228
+ if server.hmac.etm
229
+ @packet_length = data.unpack("N").first
230
+ @mac_data = data
231
+ @packet = Net::SSH::Buffer.new(server.update_cipher(data[aad_length..-1]))
232
+ else
233
+ @packet = Net::SSH::Buffer.new(server.update_cipher(data))
234
+ @packet_length = @packet.read_long
235
+ end
207
236
  end
208
237
 
209
- need = @packet_length + 4 - server.block_size
238
+ need = @packet_length + 4 - aad_length - server.block_size
210
239
  raise Net::SSH::Exception, "padding error, need #{need} block #{server.block_size}" if need % server.block_size != 0
211
240
 
212
241
  return nil if available < need + server.hmac.mac_length
@@ -214,6 +243,7 @@ module Net
214
243
  if need > 0
215
244
  # read the remainder of the packet and decrypt it.
216
245
  data = read_available(need)
246
+ @mac_data += data if server.hmac.etm
217
247
  @packet.append(server.update_cipher(data))
218
248
  end
219
249
 
@@ -226,7 +256,11 @@ module Net
226
256
 
227
257
  payload = @packet.read(@packet_length - padding_length - 1)
228
258
 
229
- my_computed_hmac = server.hmac.digest([server.sequence_number, @packet.content].pack("NA*"))
259
+ my_computed_hmac = if server.hmac.etm
260
+ server.hmac.digest([server.sequence_number, @mac_data].pack("NA*"))
261
+ else
262
+ server.hmac.digest([server.sequence_number, @packet.content].pack("NA*"))
263
+ end
230
264
  raise Net::SSH::Exception, "corrupted hmac detected" if real_hmac != my_computed_hmac
231
265
 
232
266
  # try to decompress the payload, in case compression is active
@@ -141,7 +141,7 @@ module Net
141
141
 
142
142
  @max_packets ||= 1 << 31
143
143
 
144
- @block_size = cipher.name == "RC4" ? 8 : cipher.block_size
144
+ @block_size = cipher.block_size
145
145
 
146
146
  if max_blocks.nil?
147
147
  # cargo-culted from openssh. the idea is that "the 2^(blocksize*2)
@@ -46,17 +46,17 @@ module Net
46
46
  end
47
47
 
48
48
  # The major component of this version of the Net::SSH library
49
- MAJOR = 5
49
+ MAJOR = 6
50
50
 
51
51
  # The minor component of this version of the Net::SSH library
52
- MINOR = 2
52
+ MINOR = 0
53
53
 
54
54
  # The tiny component of this version of the Net::SSH library
55
55
  TINY = 0
56
56
 
57
57
  # The prerelease component of this version of the Net::SSH library
58
58
  # nil allowed
59
- PRE = nil
59
+ PRE = "beta1"
60
60
 
61
61
  # The current version of the Net::SSH library as a Version instance
62
62
  CURRENT = new(*[MAJOR, MINOR, TINY, PRE].compact)
@@ -1,4 +1,3 @@
1
-
2
1
  require_relative 'lib/net/ssh/version'
3
2
 
4
3
  Gem::Specification.new do |spec|
@@ -16,11 +15,14 @@ Gem::Specification.new do |spec|
16
15
  spec.description = %q{Net::SSH: a pure-Ruby implementation of the SSH2 client protocol. It allows you to write programs that invoke and interact with processes on remote servers, via SSH2.}
17
16
  spec.homepage = "https://github.com/net-ssh/net-ssh"
18
17
  spec.license = "MIT"
19
- spec.required_ruby_version = Gem::Requirement.new(">= 2.2.6")
18
+ spec.required_ruby_version = Gem::Requirement.new(">= 2.3")
19
+ spec.metadata = {
20
+ "changelog_uri" => "https://github.com/net-ssh/net-ssh/blob/master/CHANGES.txt"
21
+ }
20
22
 
21
23
  spec.extra_rdoc_files = [
22
24
  "LICENSE.txt",
23
- "README.rdoc"
25
+ "README.md"
24
26
  ]
25
27
 
26
28
  spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
@@ -31,12 +33,12 @@ Gem::Specification.new do |spec|
31
33
  unless ENV['NET_SSH_NO_ED25519']
32
34
  spec.add_development_dependency("bcrypt_pbkdf", "~> 1.0") unless RUBY_PLATFORM == "java"
33
35
  spec.add_development_dependency("ed25519", "~> 1.2")
36
+ spec.add_development_dependency('x25519') unless RUBY_PLATFORM == 'java'
34
37
  end
35
38
 
36
- spec.add_development_dependency "bundler", "~> 1.11"
37
-
39
+ spec.add_development_dependency "bundler", ">= 1.17"
38
40
  spec.add_development_dependency "minitest", "~> 5.10"
39
41
  spec.add_development_dependency "mocha", ">= 1.2.1"
40
42
  spec.add_development_dependency "rake", "~> 12.0"
41
- spec.add_development_dependency "rubocop", "~> 0.54.0"
43
+ spec.add_development_dependency "rubocop", "~> 0.74.0"
42
44
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: net-ssh
3
3
  version: !ruby/object:Gem::Version
4
- version: 5.2.0
4
+ version: 6.0.0.beta1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jamis Buck
@@ -31,7 +31,7 @@ cert_chain:
31
31
  +MqVFjDxsJA7cDfACke51RypSH1gZoPjzoW6w0sMRAzZT8hU1eGyqtNuBiSZ1UKv
32
32
  B/ztNLEP0OWhpj/NZ1fnGRvo/T0=
33
33
  -----END CERTIFICATE-----
34
- date: 2019-03-11 00:00:00.000000000 Z
34
+ date: 2019-10-25 00:00:00.000000000 Z
35
35
  dependencies:
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: bcrypt_pbkdf
@@ -61,20 +61,34 @@ dependencies:
61
61
  - - "~>"
62
62
  - !ruby/object:Gem::Version
63
63
  version: '1.2'
64
+ - !ruby/object:Gem::Dependency
65
+ name: x25519
66
+ requirement: !ruby/object:Gem::Requirement
67
+ requirements:
68
+ - - ">="
69
+ - !ruby/object:Gem::Version
70
+ version: '0'
71
+ type: :development
72
+ prerelease: false
73
+ version_requirements: !ruby/object:Gem::Requirement
74
+ requirements:
75
+ - - ">="
76
+ - !ruby/object:Gem::Version
77
+ version: '0'
64
78
  - !ruby/object:Gem::Dependency
65
79
  name: bundler
66
80
  requirement: !ruby/object:Gem::Requirement
67
81
  requirements:
68
- - - "~>"
82
+ - - ">="
69
83
  - !ruby/object:Gem::Version
70
- version: '1.11'
84
+ version: '1.17'
71
85
  type: :development
72
86
  prerelease: false
73
87
  version_requirements: !ruby/object:Gem::Requirement
74
88
  requirements:
75
- - - "~>"
89
+ - - ">="
76
90
  - !ruby/object:Gem::Version
77
- version: '1.11'
91
+ version: '1.17'
78
92
  - !ruby/object:Gem::Dependency
79
93
  name: minitest
80
94
  requirement: !ruby/object:Gem::Requirement
@@ -123,14 +137,14 @@ dependencies:
123
137
  requirements:
124
138
  - - "~>"
125
139
  - !ruby/object:Gem::Version
126
- version: 0.54.0
140
+ version: 0.74.0
127
141
  type: :development
128
142
  prerelease: false
129
143
  version_requirements: !ruby/object:Gem::Requirement
130
144
  requirements:
131
145
  - - "~>"
132
146
  - !ruby/object:Gem::Version
133
- version: 0.54.0
147
+ version: 0.74.0
134
148
  description: 'Net::SSH: a pure-Ruby implementation of the SSH2 client protocol. It
135
149
  allows you to write programs that invoke and interact with processes on remote servers,
136
150
  via SSH2.'
@@ -140,7 +154,7 @@ executables: []
140
154
  extensions: []
141
155
  extra_rdoc_files:
142
156
  - LICENSE.txt
143
- - README.rdoc
157
+ - README.md
144
158
  files:
145
159
  - ".gitignore"
146
160
  - ".rubocop.yml"
@@ -149,11 +163,10 @@ files:
149
163
  - CHANGES.txt
150
164
  - Gemfile
151
165
  - Gemfile.noed25519
152
- - Gemfile.noed25519.lock
153
166
  - ISSUE_TEMPLATE.md
154
167
  - LICENSE.txt
155
168
  - Manifest
156
- - README.rdoc
169
+ - README.md
157
170
  - Rakefile
158
171
  - THANKS.txt
159
172
  - appveyor.yml
@@ -220,10 +233,16 @@ files:
220
233
  - lib/net/ssh/transport/hmac/sha1_96.rb
221
234
  - lib/net/ssh/transport/hmac/sha2_256.rb
222
235
  - lib/net/ssh/transport/hmac/sha2_256_96.rb
236
+ - lib/net/ssh/transport/hmac/sha2_256_etm.rb
223
237
  - lib/net/ssh/transport/hmac/sha2_512.rb
224
238
  - lib/net/ssh/transport/hmac/sha2_512_96.rb
239
+ - lib/net/ssh/transport/hmac/sha2_512_etm.rb
225
240
  - lib/net/ssh/transport/identity_cipher.rb
226
241
  - lib/net/ssh/transport/kex.rb
242
+ - lib/net/ssh/transport/kex/abstract.rb
243
+ - lib/net/ssh/transport/kex/abstract5656.rb
244
+ - lib/net/ssh/transport/kex/curve25519_sha256.rb
245
+ - lib/net/ssh/transport/kex/curve25519_sha256_loader.rb
227
246
  - lib/net/ssh/transport/kex/diffie_hellman_group14_sha1.rb
228
247
  - lib/net/ssh/transport/kex/diffie_hellman_group1_sha1.rb
229
248
  - lib/net/ssh/transport/kex/diffie_hellman_group_exchange_sha1.rb
@@ -244,12 +263,12 @@ files:
244
263
  - lib/net/ssh/version.rb
245
264
  - net-ssh-public_cert.pem
246
265
  - net-ssh.gemspec
247
- - support/arcfour_check.rb
248
266
  - support/ssh_tunnel_bug.rb
249
267
  homepage: https://github.com/net-ssh/net-ssh
250
268
  licenses:
251
269
  - MIT
252
- metadata: {}
270
+ metadata:
271
+ changelog_uri: https://github.com/net-ssh/net-ssh/blob/master/CHANGES.txt
253
272
  post_install_message:
254
273
  rdoc_options: []
255
274
  require_paths:
@@ -258,12 +277,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
258
277
  requirements:
259
278
  - - ">="
260
279
  - !ruby/object:Gem::Version
261
- version: 2.2.6
280
+ version: '2.3'
262
281
  required_rubygems_version: !ruby/object:Gem::Requirement
263
282
  requirements:
264
- - - ">="
283
+ - - ">"
265
284
  - !ruby/object:Gem::Version
266
- version: '0'
285
+ version: 1.3.1
267
286
  requirements: []
268
287
  rubyforge_project:
269
288
  rubygems_version: 2.6.8