net-ssh 5.2.0 → 6.0.0.beta1

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