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.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -0
- data/.gitignore +1 -0
- data/.rubocop.yml +7 -4
- data/.rubocop_todo.yml +389 -379
- data/.travis.yml +13 -14
- data/CHANGES.txt +7 -0
- data/README.md +286 -0
- data/Rakefile +1 -2
- data/appveyor.yml +4 -2
- data/lib/net/ssh/authentication/key_manager.rb +7 -3
- data/lib/net/ssh/authentication/methods/keyboard_interactive.rb +3 -1
- data/lib/net/ssh/authentication/pub_key_fingerprint.rb +0 -1
- data/lib/net/ssh/authentication/session.rb +2 -6
- data/lib/net/ssh/buffer.rb +1 -9
- data/lib/net/ssh/config.rb +25 -10
- data/lib/net/ssh/connection/channel.rb +7 -3
- data/lib/net/ssh/connection/session.rb +7 -3
- data/lib/net/ssh/key_factory.rb +6 -8
- data/lib/net/ssh/known_hosts.rb +26 -29
- data/lib/net/ssh/service/forward.rb +2 -1
- data/lib/net/ssh/test.rb +3 -2
- data/lib/net/ssh/transport/algorithms.rb +67 -42
- data/lib/net/ssh/transport/cipher_factory.rb +11 -27
- data/lib/net/ssh/transport/constants.rb +10 -6
- data/lib/net/ssh/transport/ctr.rb +1 -7
- data/lib/net/ssh/transport/hmac.rb +15 -13
- data/lib/net/ssh/transport/hmac/abstract.rb +16 -0
- data/lib/net/ssh/transport/hmac/sha2_256.rb +7 -11
- data/lib/net/ssh/transport/hmac/sha2_256_96.rb +4 -8
- data/lib/net/ssh/transport/hmac/sha2_256_etm.rb +12 -0
- data/lib/net/ssh/transport/hmac/sha2_512.rb +6 -9
- data/lib/net/ssh/transport/hmac/sha2_512_96.rb +4 -8
- data/lib/net/ssh/transport/hmac/sha2_512_etm.rb +12 -0
- data/lib/net/ssh/transport/kex.rb +13 -11
- data/lib/net/ssh/transport/kex/abstract.rb +123 -0
- data/lib/net/ssh/transport/kex/abstract5656.rb +72 -0
- data/lib/net/ssh/transport/kex/curve25519_sha256.rb +38 -0
- data/lib/net/ssh/transport/kex/curve25519_sha256_loader.rb +30 -0
- data/lib/net/ssh/transport/kex/diffie_hellman_group14_sha1.rb +1 -15
- data/lib/net/ssh/transport/kex/diffie_hellman_group1_sha1.rb +9 -118
- data/lib/net/ssh/transport/kex/diffie_hellman_group_exchange_sha1.rb +0 -6
- data/lib/net/ssh/transport/kex/diffie_hellman_group_exchange_sha256.rb +5 -9
- data/lib/net/ssh/transport/kex/ecdh_sha2_nistp256.rb +18 -79
- data/lib/net/ssh/transport/kex/ecdh_sha2_nistp384.rb +5 -4
- data/lib/net/ssh/transport/kex/ecdh_sha2_nistp521.rb +5 -4
- data/lib/net/ssh/transport/openssl.rb +104 -107
- data/lib/net/ssh/transport/packet_stream.rb +44 -10
- data/lib/net/ssh/transport/state.rb +1 -1
- data/lib/net/ssh/version.rb +3 -3
- data/net-ssh.gemspec +8 -6
- metadata +35 -16
- metadata.gz.sig +0 -0
- data/Gemfile.noed25519.lock +0 -41
- data/README.rdoc +0 -194
- data/support/arcfour_check.rb +0 -20
@@ -1,8 +1,9 @@
|
|
1
|
-
|
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
|
-
|
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
|
-
|
102
|
-
|
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
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
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
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
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
|
-
|
164
|
-
|
154
|
+
return key
|
155
|
+
rescue OpenSSL::PKey::ECError
|
156
|
+
raise NotImplementedError, "unsupported key type `#{type}'"
|
165
157
|
end
|
158
|
+
end
|
166
159
|
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
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
|
-
|
183
|
+
end
|
184
|
+
private :digester
|
182
185
|
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
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
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
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
|
-
|
197
|
-
|
198
|
-
|
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
|
-
|
201
|
-
|
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
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
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
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
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
|
-
|
218
|
-
|
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
|
-
|
224
|
-
|
229
|
+
Net::SSH::Buffer.from(:bignum, sig_r, :bignum, sig_s).to_s
|
230
|
+
end
|
225
231
|
|
226
|
-
|
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
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
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
|
-
|
150
|
-
|
149
|
+
if client.hmac.etm
|
150
|
+
debug { "using encrypt-then-mac" }
|
151
151
|
|
152
|
-
|
153
|
-
|
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
|
-
|
206
|
-
|
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.
|
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
|
data/lib/net/ssh/version.rb
CHANGED
@@ -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 =
|
49
|
+
MAJOR = 6
|
50
50
|
|
51
51
|
# The minor component of this version of the Net::SSH library
|
52
|
-
MINOR =
|
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 =
|
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)
|
data/net-ssh.gemspec
CHANGED
@@ -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.
|
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.
|
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", "
|
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.
|
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:
|
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-
|
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.
|
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.
|
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.
|
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.
|
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.
|
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.
|
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.
|
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:
|
285
|
+
version: 1.3.1
|
267
286
|
requirements: []
|
268
287
|
rubyforge_project:
|
269
288
|
rubygems_version: 2.6.8
|