net-ssh 2.0.4 → 2.0.5
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.
- data/CHANGELOG.rdoc +11 -0
- data/lib/net/ssh/authentication/pageant.rb +7 -0
- data/lib/net/ssh/buffer.rb +2 -1
- data/lib/net/ssh/connection/session.rb +6 -6
- data/lib/net/ssh/proxy/socks5.rb +2 -1
- data/lib/net/ssh/service/forward.rb +7 -7
- data/lib/net/ssh/transport/cipher_factory.rb +8 -0
- data/lib/net/ssh/transport/hmac/abstract.rb +43 -19
- data/lib/net/ssh/transport/identity_cipher.rb +10 -0
- data/lib/net/ssh/transport/openssl.rb +1 -1
- data/lib/net/ssh/transport/packet_stream.rb +4 -4
- data/lib/net/ssh/transport/state.rb +29 -18
- data/lib/net/ssh/version.rb +1 -1
- data/net-ssh.gemspec +6 -37
- data/test/authentication/methods/test_hostbased.rb +5 -5
- data/test/authentication/methods/test_keyboard_interactive.rb +20 -20
- data/test/authentication/methods/test_publickey.rb +25 -25
- data/test/connection/test_channel.rb +4 -4
- data/test/connection/test_session.rb +6 -6
- data/test/transport/kex/test_diffie_hellman_group1_sha1.rb +3 -3
- data/test/transport/kex/test_diffie_hellman_group_exchange_sha1.rb +7 -7
- data/test/transport/test_cipher_factory.rb +16 -8
- data/test/transport/test_packet_stream.rb +2 -0
- data/test/transport/test_session.rb +4 -1
- data/test/transport/test_state.rb +1 -1
- metadata +14 -5
data/CHANGELOG.rdoc
CHANGED
@@ -1,3 +1,14 @@
|
|
1
|
+
=== 2.0.5 / 6 December 2008
|
2
|
+
|
3
|
+
* Make the Pageant interface comply with more of the Socket interface to avoid related errors [Jamis Buck]
|
4
|
+
|
5
|
+
* Don't busy-wait on session close for remaining channels to close [Will Bryant]
|
6
|
+
|
7
|
+
* Ruby 1.9 compatibility [Jamis Buck]
|
8
|
+
|
9
|
+
* Fix Cipher#final to correctly flag a need for a cipher reset [Jamis Buck]
|
10
|
+
|
11
|
+
|
1
12
|
=== 2.0.4 / 27 Aug 2008
|
2
13
|
|
3
14
|
* Added Connection::Session#closed? and Transport::Session#closed? [Jamis Buck]
|
@@ -156,6 +156,13 @@ module Net; module SSH; module Authentication
|
|
156
156
|
@pos = 0
|
157
157
|
end
|
158
158
|
|
159
|
+
# Conceptually asks if the socket is closed. As with #close,
|
160
|
+
# this doesn't really do anything significant, but merely
|
161
|
+
# complies with the Socket interface.
|
162
|
+
def closed?
|
163
|
+
@res.nil? && @pos.zero?
|
164
|
+
end
|
165
|
+
|
159
166
|
# Reads +n+ bytes from the cached result of the last query. If +n+
|
160
167
|
# is +nil+, returns all remaining data from the last query.
|
161
168
|
def read(n = nil)
|
data/lib/net/ssh/buffer.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
require 'net/ssh/ruby_compat'
|
1
2
|
require 'net/ssh/transport/openssl'
|
2
3
|
|
3
4
|
module Net; module SSH
|
@@ -203,7 +204,7 @@ module Net; module SSH
|
|
203
204
|
# the end of the buffer.
|
204
205
|
def read_byte
|
205
206
|
b = read(1) or return nil
|
206
|
-
b
|
207
|
+
b.getbyte(0)
|
207
208
|
end
|
208
209
|
|
209
210
|
# Read and return an SSH2-encoded string. The string starts with a long
|
@@ -96,7 +96,7 @@ module Net; module SSH; module Connection
|
|
96
96
|
def close
|
97
97
|
info { "closing remaining channels (#{channels.length} open)" }
|
98
98
|
channels.each { |id, channel| channel.close }
|
99
|
-
loop
|
99
|
+
loop { channels.any? }
|
100
100
|
transport.close
|
101
101
|
end
|
102
102
|
|
@@ -178,7 +178,7 @@ module Net; module SSH; module Connection
|
|
178
178
|
return false unless preprocess(&block)
|
179
179
|
|
180
180
|
r = listeners.keys
|
181
|
-
w = r.select { |
|
181
|
+
w = r.select { |w2| w2.respond_to?(:pending_write?) && w2.pending_write? }
|
182
182
|
readers, writers, = IO.select(r, w, nil, wait)
|
183
183
|
|
184
184
|
postprocess(readers, writers)
|
@@ -302,17 +302,17 @@ module Net; module SSH; module Connection
|
|
302
302
|
channel.exec(command) do |ch, success|
|
303
303
|
raise "could not execute command: #{command.inspect}" unless success
|
304
304
|
|
305
|
-
channel.on_data do |
|
305
|
+
channel.on_data do |ch2, data|
|
306
306
|
if block
|
307
|
-
block.call(
|
307
|
+
block.call(ch2, :stdout, data)
|
308
308
|
else
|
309
309
|
$stdout.print(data)
|
310
310
|
end
|
311
311
|
end
|
312
312
|
|
313
|
-
channel.on_extended_data do |
|
313
|
+
channel.on_extended_data do |ch2, type, data|
|
314
314
|
if block
|
315
|
-
block.call(
|
315
|
+
block.call(ch2, :stderr, data)
|
316
316
|
else
|
317
317
|
$stderr.print(data)
|
318
318
|
end
|
data/lib/net/ssh/proxy/socks5.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'socket'
|
2
|
+
require 'net/ssh/ruby_compat'
|
2
3
|
require 'net/ssh/proxy/errors'
|
3
4
|
|
4
5
|
module Net
|
@@ -95,7 +96,7 @@ module Net
|
|
95
96
|
socket.send packet, 0
|
96
97
|
|
97
98
|
version, reply, = socket.recv(4).unpack("C*")
|
98
|
-
len = socket.recv(1)
|
99
|
+
len = socket.recv(1).getbyte(0)
|
99
100
|
socket.recv(len + 2)
|
100
101
|
|
101
102
|
unless reply == SUCCESS
|
@@ -64,12 +64,12 @@ module Net; module SSH; module Service
|
|
64
64
|
|
65
65
|
@local_forwarded_ports[[local_port, bind_address]] = socket
|
66
66
|
|
67
|
-
session.listen_to(socket) do |
|
68
|
-
client =
|
67
|
+
session.listen_to(socket) do |server|
|
68
|
+
client = server.accept
|
69
69
|
debug { "received connection on #{bind_address}:#{local_port}" }
|
70
70
|
|
71
|
-
channel = session.open_channel("direct-tcpip", :string, remote_host, :long, remote_port, :string, bind_address, :long, local_port) do |
|
72
|
-
|
71
|
+
channel = session.open_channel("direct-tcpip", :string, remote_host, :long, remote_port, :string, bind_address, :long, local_port) do |achannel|
|
72
|
+
achannel.info { "direct channel established" }
|
73
73
|
end
|
74
74
|
|
75
75
|
prepare_client(client, channel, :local)
|
@@ -177,12 +177,12 @@ module Net; module SSH; module Service
|
|
177
177
|
return if @agent_forwarded
|
178
178
|
@agent_forwarded = true
|
179
179
|
|
180
|
-
channel.send_channel_request("auth-agent-req@openssh.com") do |
|
180
|
+
channel.send_channel_request("auth-agent-req@openssh.com") do |achannel, success|
|
181
181
|
if success
|
182
182
|
debug { "authentication agent forwarding is active" }
|
183
183
|
else
|
184
|
-
|
185
|
-
if
|
184
|
+
achannel.send_channel_request("auth-agent-req") do |a2channel, success2|
|
185
|
+
if success2
|
186
186
|
debug { "authentication agent forwarding is active" }
|
187
187
|
else
|
188
188
|
error { "could not establish forwarding of authentication agent" }
|
@@ -18,6 +18,14 @@ module Net; module SSH; module Transport
|
|
18
18
|
"none" => "none"
|
19
19
|
}
|
20
20
|
|
21
|
+
# Returns true if the underlying OpenSSL library supports the given cipher,
|
22
|
+
# and false otherwise.
|
23
|
+
def self.supported?(name)
|
24
|
+
ossl_name = SSH_TO_OSSL[name] or raise NotImplementedError, "unimplemented cipher `#{name}'"
|
25
|
+
return true if ossl_name == "none"
|
26
|
+
return OpenSSL::Cipher.ciphers.include?(ossl_name)
|
27
|
+
end
|
28
|
+
|
21
29
|
# Retrieves a new instance of the named algorithm. The new instance
|
22
30
|
# will be initialized using an iv and key generated from the given
|
23
31
|
# iv, key, shared, hash and digester values. Additionally, the
|
@@ -6,29 +6,53 @@ module Net; module SSH; module Transport; module HMAC
|
|
6
6
|
class Abstract
|
7
7
|
|
8
8
|
class <<self
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
if
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
if v.nil? && superclass.respond_to?(attribute)
|
19
|
-
v = superclass.send(attribute)
|
20
|
-
instance_variable_set("@#{attribute}", v)
|
21
|
-
end
|
22
|
-
v
|
23
|
-
else
|
24
|
-
instance_variable_set("@#{attribute}", v.first)
|
25
|
-
end
|
9
|
+
def key_length(*v)
|
10
|
+
@key_length = nil if !defined?(@key_length)
|
11
|
+
if v.empty?
|
12
|
+
@key_length = superclass.key_length if @key_length.nil? && superclass.respond_to?(:key_length)
|
13
|
+
return @key_length
|
14
|
+
elsif v.length == 1
|
15
|
+
@key_length = v.first
|
16
|
+
else
|
17
|
+
raise ArgumentError, "wrong number of arguments (#{v.length} for 1)"
|
26
18
|
end
|
27
19
|
end
|
20
|
+
|
21
|
+
def mac_length(*v)
|
22
|
+
@mac_length = nil if !defined?(@mac_length)
|
23
|
+
if v.empty?
|
24
|
+
@mac_length = superclass.mac_length if @mac_length.nil? && superclass.respond_to?(:mac_length)
|
25
|
+
return @mac_length
|
26
|
+
elsif v.length == 1
|
27
|
+
@mac_length = v.first
|
28
|
+
else
|
29
|
+
raise ArgumentError, "wrong number of arguments (#{v.length} for 1)"
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def digest_class(*v)
|
34
|
+
@digest_class = nil if !defined?(@digest_class)
|
35
|
+
if v.empty?
|
36
|
+
@digest_class = superclass.digest_class if @digest_class.nil? && superclass.respond_to?(:digest_class)
|
37
|
+
return @digest_class
|
38
|
+
elsif v.length == 1
|
39
|
+
@digest_class = v.first
|
40
|
+
else
|
41
|
+
raise ArgumentError, "wrong number of arguments (#{v.length} for 1)"
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
def key_length
|
47
|
+
self.class.key_length
|
48
|
+
end
|
49
|
+
|
50
|
+
def mac_length
|
51
|
+
self.class.mac_length
|
28
52
|
end
|
29
53
|
|
30
|
-
|
31
|
-
|
54
|
+
def digest_class
|
55
|
+
self.class.digest_class
|
32
56
|
end
|
33
57
|
|
34
58
|
# The key in use for this instance.
|
@@ -137,7 +137,7 @@ module Net; module SSH; module Transport
|
|
137
137
|
encrypted_data = client.update_cipher(unencrypted_data) << client.final_cipher
|
138
138
|
message = encrypted_data + mac
|
139
139
|
|
140
|
-
debug { "queueing packet nr #{client.sequence_number} type #{payload
|
140
|
+
debug { "queueing packet nr #{client.sequence_number} type #{payload.getbyte(0)} len #{packet_length}" }
|
141
141
|
enqueue(message)
|
142
142
|
|
143
143
|
client.increment(packet_length)
|
@@ -169,8 +169,8 @@ module Net; module SSH; module Transport
|
|
169
169
|
# the states and generally prepares the object for use as a packet stream.
|
170
170
|
def initialize_ssh
|
171
171
|
@hints = {}
|
172
|
-
@server = State.new(self)
|
173
|
-
@client = State.new(self)
|
172
|
+
@server = State.new(self, :server)
|
173
|
+
@client = State.new(self, :client)
|
174
174
|
@packet = nil
|
175
175
|
initialize_buffered_io
|
176
176
|
end
|
@@ -218,7 +218,7 @@ module Net; module SSH; module Transport
|
|
218
218
|
# try to decompress the payload, in case compression is active
|
219
219
|
payload = server.decompress(payload)
|
220
220
|
|
221
|
-
debug { "received packet nr #{server.sequence_number} type #{payload
|
221
|
+
debug { "received packet nr #{server.sequence_number} type #{payload.getbyte(0)} len #{@packet_length}" }
|
222
222
|
|
223
223
|
server.increment(@packet_length)
|
224
224
|
@packet = nil
|
@@ -31,6 +31,12 @@ module Net; module SSH; module Transport
|
|
31
31
|
# The number of data blocks processed since the last call to #reset!
|
32
32
|
attr_reader :blocks
|
33
33
|
|
34
|
+
# The cipher algorithm in use for this socket endpoint.
|
35
|
+
attr_reader :cipher
|
36
|
+
|
37
|
+
# The role that this state plays (either :client or :server)
|
38
|
+
attr_reader :role
|
39
|
+
|
34
40
|
# The maximum number of packets that this endpoint wants to process before
|
35
41
|
# needing a rekey.
|
36
42
|
attr_accessor :max_packets
|
@@ -45,15 +51,15 @@ module Net; module SSH; module Transport
|
|
45
51
|
|
46
52
|
# Creates a new state object, belonging to the given socket. Initializes
|
47
53
|
# the algorithms to "none".
|
48
|
-
def initialize(socket)
|
54
|
+
def initialize(socket, role)
|
49
55
|
@socket = socket
|
56
|
+
@role = role
|
50
57
|
@sequence_number = @packets = @blocks = 0
|
51
58
|
@cipher = CipherFactory.get("none")
|
52
59
|
@hmac = HMAC.get("none")
|
53
60
|
@compression = nil
|
54
61
|
@compressor = @decompressor = nil
|
55
|
-
@next_iv =
|
56
|
-
@cipher_needs_reset = false
|
62
|
+
@next_iv = ""
|
57
63
|
end
|
58
64
|
|
59
65
|
# A convenience method for quickly setting multiple values in a single
|
@@ -65,25 +71,16 @@ module Net; module SSH; module Transport
|
|
65
71
|
reset!
|
66
72
|
end
|
67
73
|
|
68
|
-
# The cipher algorithm in use for this socket endpoint.
|
69
|
-
def cipher
|
70
|
-
if @cipher_needs_reset
|
71
|
-
@cipher.reset
|
72
|
-
@cipher.iv = @next_iv
|
73
|
-
@cipher_needs_reset = false
|
74
|
-
end
|
75
|
-
|
76
|
-
@cipher
|
77
|
-
end
|
78
|
-
|
79
74
|
def update_cipher(data)
|
80
|
-
|
81
|
-
|
75
|
+
result = cipher.update(data)
|
76
|
+
update_next_iv(role == :client ? result : data)
|
77
|
+
return result
|
82
78
|
end
|
83
79
|
|
84
80
|
def final_cipher
|
85
|
-
|
86
|
-
|
81
|
+
result = cipher.final
|
82
|
+
update_next_iv(role == :client ? result : "", true)
|
83
|
+
return result
|
87
84
|
end
|
88
85
|
|
89
86
|
# Increments the counters. The sequence number is incremented (and remapped
|
@@ -185,6 +182,20 @@ module Net; module SSH; module Transport
|
|
185
182
|
max_packets && packets > max_packets ||
|
186
183
|
max_blocks && blocks > max_blocks
|
187
184
|
end
|
185
|
+
|
186
|
+
private
|
187
|
+
|
188
|
+
def update_next_iv(data, reset=false)
|
189
|
+
@next_iv << data
|
190
|
+
@next_iv = @next_iv[-cipher.iv_len..-1]
|
191
|
+
|
192
|
+
if reset
|
193
|
+
cipher.reset
|
194
|
+
cipher.iv = @next_iv
|
195
|
+
end
|
196
|
+
|
197
|
+
return data
|
198
|
+
end
|
188
199
|
end
|
189
200
|
|
190
201
|
end; end; end
|
data/lib/net/ssh/version.rb
CHANGED
data/net-ssh.gemspec
CHANGED
@@ -1,14 +1,10 @@
|
|
1
|
-
|
2
|
-
# Gem::Specification for Net-ssh-2.0.4
|
3
|
-
# Originally generated by Echoe
|
4
|
-
|
5
1
|
Gem::Specification.new do |s|
|
6
2
|
s.name = %q{net-ssh}
|
7
|
-
s.version = "2.0.
|
3
|
+
s.version = "2.0.5"
|
8
4
|
|
9
|
-
s.required_rubygems_version = Gem::Requirement.new(">=
|
5
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 1.2") if s.respond_to? :required_rubygems_version=
|
10
6
|
s.authors = ["Jamis Buck"]
|
11
|
-
s.date = %q{2008-
|
7
|
+
s.date = %q{2008-12-06}
|
12
8
|
s.description = %q{a pure-Ruby implementation of the SSH2 client protocol}
|
13
9
|
s.email = %q{jamis@jamisbuck.org}
|
14
10
|
s.extra_rdoc_files = ["CHANGELOG.rdoc", "lib/net/ssh/authentication/agent.rb", "lib/net/ssh/authentication/constants.rb", "lib/net/ssh/authentication/key_manager.rb", "lib/net/ssh/authentication/methods/abstract.rb", "lib/net/ssh/authentication/methods/hostbased.rb", "lib/net/ssh/authentication/methods/keyboard_interactive.rb", "lib/net/ssh/authentication/methods/password.rb", "lib/net/ssh/authentication/methods/publickey.rb", "lib/net/ssh/authentication/pageant.rb", "lib/net/ssh/authentication/session.rb", "lib/net/ssh/buffer.rb", "lib/net/ssh/buffered_io.rb", "lib/net/ssh/config.rb", "lib/net/ssh/connection/channel.rb", "lib/net/ssh/connection/constants.rb", "lib/net/ssh/connection/session.rb", "lib/net/ssh/connection/term.rb", "lib/net/ssh/errors.rb", "lib/net/ssh/key_factory.rb", "lib/net/ssh/known_hosts.rb", "lib/net/ssh/loggable.rb", "lib/net/ssh/packet.rb", "lib/net/ssh/prompt.rb", "lib/net/ssh/proxy/errors.rb", "lib/net/ssh/proxy/http.rb", "lib/net/ssh/proxy/socks4.rb", "lib/net/ssh/proxy/socks5.rb", "lib/net/ssh/service/forward.rb", "lib/net/ssh/test/channel.rb", "lib/net/ssh/test/extensions.rb", "lib/net/ssh/test/kex.rb", "lib/net/ssh/test/local_packet.rb", "lib/net/ssh/test/packet.rb", "lib/net/ssh/test/remote_packet.rb", "lib/net/ssh/test/script.rb", "lib/net/ssh/test/socket.rb", "lib/net/ssh/test.rb", "lib/net/ssh/transport/algorithms.rb", "lib/net/ssh/transport/cipher_factory.rb", "lib/net/ssh/transport/constants.rb", "lib/net/ssh/transport/hmac/abstract.rb", "lib/net/ssh/transport/hmac/md5.rb", "lib/net/ssh/transport/hmac/md5_96.rb", "lib/net/ssh/transport/hmac/none.rb", "lib/net/ssh/transport/hmac/sha1.rb", "lib/net/ssh/transport/hmac/sha1_96.rb", "lib/net/ssh/transport/hmac.rb", "lib/net/ssh/transport/identity_cipher.rb", "lib/net/ssh/transport/kex/diffie_hellman_group1_sha1.rb", "lib/net/ssh/transport/kex/diffie_hellman_group_exchange_sha1.rb", "lib/net/ssh/transport/kex.rb", "lib/net/ssh/transport/openssl.rb", "lib/net/ssh/transport/packet_stream.rb", "lib/net/ssh/transport/server_version.rb", "lib/net/ssh/transport/session.rb", "lib/net/ssh/transport/state.rb", "lib/net/ssh/verifiers/lenient.rb", "lib/net/ssh/verifiers/null.rb", "lib/net/ssh/verifiers/strict.rb", "lib/net/ssh/version.rb", "lib/net/ssh.rb", "README.rdoc", "THANKS.rdoc"]
|
@@ -27,38 +23,11 @@ Gem::Specification.new do |s|
|
|
27
23
|
s.specification_version = 2
|
28
24
|
|
29
25
|
if current_version >= 3 then
|
26
|
+
s.add_development_dependency(%q<echoe>, [">= 0"])
|
30
27
|
else
|
28
|
+
s.add_dependency(%q<echoe>, [">= 0"])
|
31
29
|
end
|
32
30
|
else
|
31
|
+
s.add_dependency(%q<echoe>, [">= 0"])
|
33
32
|
end
|
34
33
|
end
|
35
|
-
|
36
|
-
|
37
|
-
# # Original Rakefile source (requires the Echoe gem):
|
38
|
-
#
|
39
|
-
# require './lib/net/ssh/version'
|
40
|
-
#
|
41
|
-
# begin
|
42
|
-
# require 'echoe'
|
43
|
-
# rescue LoadError
|
44
|
-
# abort "You'll need to have `echoe' installed to use Net::SSH's Rakefile"
|
45
|
-
# end
|
46
|
-
#
|
47
|
-
# version = Net::SSH::Version::STRING.dup
|
48
|
-
# if ENV['SNAPSHOT'].to_i == 1
|
49
|
-
# version << "." << Time.now.utc.strftime("%Y%m%d%H%M%S")
|
50
|
-
# end
|
51
|
-
#
|
52
|
-
# Echoe.new('net-ssh', version) do |p|
|
53
|
-
# p.changelog = "CHANGELOG.rdoc"
|
54
|
-
#
|
55
|
-
# p.author = "Jamis Buck"
|
56
|
-
# p.email = "jamis@jamisbuck.org"
|
57
|
-
# p.summary = "a pure-Ruby implementation of the SSH2 client protocol"
|
58
|
-
# p.url = "http://net-ssh.rubyforge.org/ssh"
|
59
|
-
#
|
60
|
-
# p.need_zip = true
|
61
|
-
# p.include_rakefile = true
|
62
|
-
#
|
63
|
-
# p.rdoc_pattern = /^(lib|README.rdoc|CHANGELOG.rdoc|THANKS.rdoc)/
|
64
|
-
# end
|
@@ -25,11 +25,11 @@ module Authentication; module Methods
|
|
25
25
|
assert_equal "sig-one", packet.read_string
|
26
26
|
t.return(USERAUTH_FAILURE, :string, "hostbased,password")
|
27
27
|
|
28
|
-
t.expect do |
|
29
|
-
assert_equal USERAUTH_REQUEST,
|
30
|
-
assert verify_userauth_request_packet(
|
31
|
-
assert_equal "sig-two",
|
32
|
-
|
28
|
+
t.expect do |t2, packet2|
|
29
|
+
assert_equal USERAUTH_REQUEST, packet2.type
|
30
|
+
assert verify_userauth_request_packet(packet2, keys.last)
|
31
|
+
assert_equal "sig-two", packet2.read_string
|
32
|
+
t2.return(USERAUTH_FAILURE, :string, "hostbased,password")
|
33
33
|
end
|
34
34
|
end
|
35
35
|
|
@@ -29,11 +29,11 @@ module Authentication; module Methods
|
|
29
29
|
transport.expect do |t,packet|
|
30
30
|
assert_equal USERAUTH_REQUEST, packet.type
|
31
31
|
t.return(USERAUTH_INFO_REQUEST, :string, "", :string, "", :string, "", :long, 1, :string, "Password:", :bool, false)
|
32
|
-
t.expect do |
|
33
|
-
assert_equal USERAUTH_INFO_RESPONSE,
|
34
|
-
assert_equal 1,
|
35
|
-
assert_equal "the-password",
|
36
|
-
|
32
|
+
t.expect do |t2,packet2|
|
33
|
+
assert_equal USERAUTH_INFO_RESPONSE, packet2.type
|
34
|
+
assert_equal 1, packet2.read_long
|
35
|
+
assert_equal "the-password", packet2.read_string
|
36
|
+
t2.return(USERAUTH_FAILURE, :string, "publickey")
|
37
37
|
end
|
38
38
|
end
|
39
39
|
|
@@ -44,9 +44,9 @@ module Authentication; module Methods
|
|
44
44
|
transport.expect do |t,packet|
|
45
45
|
assert_equal USERAUTH_REQUEST, packet.type
|
46
46
|
t.return(USERAUTH_INFO_REQUEST, :string, "", :string, "", :string, "", :long, 1, :string, "Password:", :bool, false)
|
47
|
-
t.expect do |
|
48
|
-
assert_equal USERAUTH_INFO_RESPONSE,
|
49
|
-
|
47
|
+
t.expect do |t2,packet2|
|
48
|
+
assert_equal USERAUTH_INFO_RESPONSE, packet2.type
|
49
|
+
t2.return(USERAUTH_SUCCESS)
|
50
50
|
end
|
51
51
|
end
|
52
52
|
|
@@ -57,12 +57,12 @@ module Authentication; module Methods
|
|
57
57
|
transport.expect do |t,packet|
|
58
58
|
assert_equal USERAUTH_REQUEST, packet.type
|
59
59
|
t.return(USERAUTH_INFO_REQUEST, :string, "", :string, "", :string, "", :long, 2, :string, "Password:", :bool, false, :string, "Again:", :bool, false)
|
60
|
-
t.expect do |
|
61
|
-
assert_equal USERAUTH_INFO_RESPONSE,
|
62
|
-
assert_equal 2,
|
63
|
-
assert_equal "the-password",
|
64
|
-
assert_equal "the-password",
|
65
|
-
|
60
|
+
t.expect do |t2,packet2|
|
61
|
+
assert_equal USERAUTH_INFO_RESPONSE, packet2.type
|
62
|
+
assert_equal 2, packet2.read_long
|
63
|
+
assert_equal "the-password", packet2.read_string
|
64
|
+
assert_equal "the-password", packet2.read_string
|
65
|
+
t2.return(USERAUTH_SUCCESS)
|
66
66
|
end
|
67
67
|
end
|
68
68
|
|
@@ -76,12 +76,12 @@ module Authentication; module Methods
|
|
76
76
|
transport.expect do |t,packet|
|
77
77
|
assert_equal USERAUTH_REQUEST, packet.type
|
78
78
|
t.return(USERAUTH_INFO_REQUEST, :string, "", :string, "", :string, "", :long, 2, :string, "Name:", :bool, true, :string, "Password:", :bool, false)
|
79
|
-
t.expect do |
|
80
|
-
assert_equal USERAUTH_INFO_RESPONSE,
|
81
|
-
assert_equal 2,
|
82
|
-
assert_equal "name",
|
83
|
-
assert_equal "password",
|
84
|
-
|
79
|
+
t.expect do |t2,packet2|
|
80
|
+
assert_equal USERAUTH_INFO_RESPONSE, packet2.type
|
81
|
+
assert_equal 2, packet2.read_long
|
82
|
+
assert_equal "name", packet2.read_string
|
83
|
+
assert_equal "password", packet2.read_string
|
84
|
+
t2.return(USERAUTH_SUCCESS)
|
85
85
|
end
|
86
86
|
end
|
87
87
|
|
@@ -21,10 +21,10 @@ module Authentication; module Methods
|
|
21
21
|
assert verify_userauth_request_packet(packet, keys.first, false)
|
22
22
|
t.return(USERAUTH_FAILURE, :string, "hostbased,password")
|
23
23
|
|
24
|
-
t.expect do |
|
25
|
-
assert_equal USERAUTH_REQUEST,
|
26
|
-
assert verify_userauth_request_packet(
|
27
|
-
|
24
|
+
t.expect do |t2, packet2|
|
25
|
+
assert_equal USERAUTH_REQUEST, packet2.type
|
26
|
+
assert verify_userauth_request_packet(packet2, keys.last, false)
|
27
|
+
t2.return(USERAUTH_FAILURE, :string, "hostbased,password")
|
28
28
|
end
|
29
29
|
end
|
30
30
|
|
@@ -40,22 +40,22 @@ module Authentication; module Methods
|
|
40
40
|
assert verify_userauth_request_packet(packet, keys.first, false)
|
41
41
|
t.return(USERAUTH_PK_OK, :string, keys.first.ssh_type, :string, Net::SSH::Buffer.from(:key, keys.first))
|
42
42
|
|
43
|
-
t.expect do |
|
44
|
-
assert_equal USERAUTH_REQUEST,
|
45
|
-
assert verify_userauth_request_packet(
|
46
|
-
assert_equal "sig-one",
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
assert_equal USERAUTH_REQUEST,
|
51
|
-
assert verify_userauth_request_packet(
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
assert_equal USERAUTH_REQUEST,
|
56
|
-
assert verify_userauth_request_packet(
|
57
|
-
assert_equal "sig-two",
|
58
|
-
|
43
|
+
t.expect do |t2,packet2|
|
44
|
+
assert_equal USERAUTH_REQUEST, packet2.type
|
45
|
+
assert verify_userauth_request_packet(packet2, keys.first, true)
|
46
|
+
assert_equal "sig-one", packet2.read_string
|
47
|
+
t2.return(USERAUTH_FAILURE, :string, "hostbased,password")
|
48
|
+
|
49
|
+
t2.expect do |t3, packet3|
|
50
|
+
assert_equal USERAUTH_REQUEST, packet3.type
|
51
|
+
assert verify_userauth_request_packet(packet3, keys.last, false)
|
52
|
+
t3.return(USERAUTH_PK_OK, :string, keys.last.ssh_type, :string, Net::SSH::Buffer.from(:key, keys.last))
|
53
|
+
|
54
|
+
t3.expect do |t4,packet4|
|
55
|
+
assert_equal USERAUTH_REQUEST, packet4.type
|
56
|
+
assert verify_userauth_request_packet(packet4, keys.last, true)
|
57
|
+
assert_equal "sig-two", packet4.read_string
|
58
|
+
t4.return(USERAUTH_FAILURE, :string, "hostbased,password")
|
59
59
|
end
|
60
60
|
end
|
61
61
|
end
|
@@ -72,11 +72,11 @@ module Authentication; module Methods
|
|
72
72
|
assert verify_userauth_request_packet(packet, keys.first, false)
|
73
73
|
t.return(USERAUTH_PK_OK, :string, keys.first.ssh_type, :string, Net::SSH::Buffer.from(:key, keys.first))
|
74
74
|
|
75
|
-
t.expect do |
|
76
|
-
assert_equal USERAUTH_REQUEST,
|
77
|
-
assert verify_userauth_request_packet(
|
78
|
-
assert_equal "sig-one",
|
79
|
-
|
75
|
+
t.expect do |t2,packet2|
|
76
|
+
assert_equal USERAUTH_REQUEST, packet2.type
|
77
|
+
assert verify_userauth_request_packet(packet2, keys.first, true)
|
78
|
+
assert_equal "sig-one", packet2.read_string
|
79
|
+
t2.return(USERAUTH_SUCCESS)
|
80
80
|
end
|
81
81
|
end
|
82
82
|
|
@@ -127,10 +127,10 @@ module Connection
|
|
127
127
|
assert_equal 0, packet[:local_id]
|
128
128
|
assert_equal "hello wo", packet[:data]
|
129
129
|
|
130
|
-
t.expect do |
|
131
|
-
assert_equal CHANNEL_DATA,
|
132
|
-
assert_equal 0,
|
133
|
-
assert_equal "rld",
|
130
|
+
t.expect do |t2,packet2|
|
131
|
+
assert_equal CHANNEL_DATA, packet2.type
|
132
|
+
assert_equal 0, packet2[:local_id]
|
133
|
+
assert_equal "rld", packet2[:data]
|
134
134
|
end
|
135
135
|
end
|
136
136
|
|
@@ -420,27 +420,27 @@ module Connection
|
|
420
420
|
transport.expect do |t, p|
|
421
421
|
assert_equal CHANNEL_OPEN, p.type
|
422
422
|
t.return(CHANNEL_OPEN_CONFIRMATION, :long, p[:remote_id], :long, 0, :long, 0x20000, :long, 0x10000)
|
423
|
-
t.expect do |
|
423
|
+
t.expect do |t2, p2|
|
424
424
|
assert_equal CHANNEL_REQUEST, p2.type
|
425
425
|
assert_equal "exec", p2[:request]
|
426
426
|
assert_equal true, p2[:want_reply]
|
427
427
|
assert_equal "ls", p2.read_string
|
428
428
|
|
429
|
-
|
429
|
+
t2.return(CHANNEL_SUCCESS, :long, p[:remote_id])
|
430
430
|
|
431
431
|
0.step(data.length-1, 2) do |index|
|
432
432
|
type = data[index]
|
433
433
|
datum = data[index+1]
|
434
434
|
|
435
435
|
if type == :stdout
|
436
|
-
|
436
|
+
t2.return(CHANNEL_DATA, :long, p[:remote_id], :string, datum)
|
437
437
|
else
|
438
|
-
|
438
|
+
t2.return(CHANNEL_EXTENDED_DATA, :long, p[:remote_id], :long, 1, :string, datum)
|
439
439
|
end
|
440
440
|
end
|
441
441
|
|
442
|
-
|
443
|
-
|
442
|
+
t2.return(CHANNEL_CLOSE, :long, p[:remote_id])
|
443
|
+
t2.expect { |t3,p3| assert_equal CHANNEL_CLOSE, p3.type }
|
444
444
|
end
|
445
445
|
end
|
446
446
|
end
|
@@ -66,9 +66,9 @@ module Transport; module Kex
|
|
66
66
|
assert_equal KEXDH_INIT, buffer.type
|
67
67
|
assert_equal dh.dh.pub_key, buffer.read_bignum
|
68
68
|
t.return(KEXDH_REPLY, :string, b(:key, server_key), :bignum, server_dh_pubkey, :string, b(:string, options[:key_type] || "ssh-rsa", :string, signature))
|
69
|
-
connection.expect do |
|
70
|
-
assert_equal NEWKEYS,
|
71
|
-
|
69
|
+
connection.expect do |t2, buffer2|
|
70
|
+
assert_equal NEWKEYS, buffer2.type
|
71
|
+
t2.return(NEWKEYS)
|
72
72
|
end
|
73
73
|
end
|
74
74
|
|
@@ -51,13 +51,13 @@ module Transport; module Kex
|
|
51
51
|
assert_equal need_bits, buffer.read_long
|
52
52
|
assert_equal 8192, buffer.read_long
|
53
53
|
t.return(KEXDH_GEX_GROUP, :bignum, bn(options[:p] || default_p), :bignum, bn(options[:g] || 2))
|
54
|
-
t.expect do |
|
55
|
-
assert_equal KEXDH_GEX_INIT,
|
56
|
-
assert_equal dh.dh.pub_key,
|
57
|
-
|
58
|
-
|
59
|
-
assert_equal NEWKEYS,
|
60
|
-
|
54
|
+
t.expect do |t2, buffer2|
|
55
|
+
assert_equal KEXDH_GEX_INIT, buffer2.type
|
56
|
+
assert_equal dh.dh.pub_key, buffer2.read_bignum
|
57
|
+
t2.return(KEXDH_GEX_REPLY, :string, b(:key, server_key), :bignum, server_dh_pubkey, :string, b(:string, options[:key_type] || "ssh-rsa", :string, signature))
|
58
|
+
t2.expect do |t3, buffer3|
|
59
|
+
assert_equal NEWKEYS, buffer3.type
|
60
|
+
t3.return(NEWKEYS)
|
61
61
|
end
|
62
62
|
end
|
63
63
|
end
|
@@ -4,6 +4,10 @@ require 'net/ssh/transport/cipher_factory'
|
|
4
4
|
module Transport
|
5
5
|
|
6
6
|
class TestCipherFactory < Test::Unit::TestCase
|
7
|
+
def self.if_supported?(name)
|
8
|
+
yield if Net::SSH::Transport::CipherFactory.supported?(name)
|
9
|
+
end
|
10
|
+
|
7
11
|
def test_lengths_for_none
|
8
12
|
assert_equal [0,0], factory.get_lengths("none")
|
9
13
|
assert_equal [0,0], factory.get_lengths("bogus")
|
@@ -13,8 +17,10 @@ module Transport
|
|
13
17
|
assert_equal [16,8], factory.get_lengths("blowfish-cbc")
|
14
18
|
end
|
15
19
|
|
16
|
-
|
17
|
-
|
20
|
+
if_supported?("idea-cbc") do
|
21
|
+
def test_lengths_for_idea_cbc
|
22
|
+
assert_equal [16,8], factory.get_lengths("idea-cbc")
|
23
|
+
end
|
18
24
|
end
|
19
25
|
|
20
26
|
def test_lengths_for_rijndael_cbc
|
@@ -51,14 +57,16 @@ module Transport
|
|
51
57
|
assert_equal TEXT, decrypt("blowfish-cbc", BLOWFISH)
|
52
58
|
end
|
53
59
|
|
54
|
-
|
60
|
+
if_supported?("idea-cbc") do
|
61
|
+
IDEA = "W\234\017G\231\b\357\370H\b\256U]\343M\031k\233]~\023C\363\263\177\262-\261\341$\022\376mv\217\322\b\2763\270H\306\035\343z\313\312\3531\351\t\201\302U\022\360\300\354ul7$z\320O]\360g\024\305\005`V\005\335A\351\312\270c\320D\232\eQH1\340\265\2118\031g*\303v"
|
55
62
|
|
56
|
-
|
57
|
-
|
58
|
-
|
63
|
+
def test_idea_cbc_for_encryption
|
64
|
+
assert_equal IDEA, encrypt("idea-cbc")
|
65
|
+
end
|
59
66
|
|
60
|
-
|
61
|
-
|
67
|
+
def test_idea_cbc_for_decryption
|
68
|
+
assert_equal TEXT, decrypt("idea-cbc", IDEA)
|
69
|
+
end
|
62
70
|
end
|
63
71
|
|
64
72
|
RIJNDAEL = "$\253\271\255\005Z\354\336&\312\324\221\233\307Mj\315\360\310Fk\241EfN\037\231\213\361{'\310\204\347I\343\271\005\240`\325;\034\346uM>#\241\231C`\374\261\vo\226;Z\302:\b\250\366T\330\\#V\330\340\226\363\374!\bm\266\232\207!\232\347\340\t\307\370\356z\236\343=v\210\206y"
|
@@ -370,6 +370,8 @@ module Transport
|
|
370
370
|
hmacs = Net::SSH::Transport::HMAC::MAP.keys
|
371
371
|
|
372
372
|
ciphers.each do |cipher_name|
|
373
|
+
next unless Net::SSH::Transport::CipherFactory.supported?(cipher_name)
|
374
|
+
|
373
375
|
hmacs.each do |hmac_name|
|
374
376
|
[false, :standard].each do |compress|
|
375
377
|
cipher_method_name = cipher_name.gsub(/\W/, "_")
|
@@ -4,7 +4,10 @@ require 'net/ssh/transport/session'
|
|
4
4
|
# mocha adds #verify to Object, which throws off the host-key-verifier part of
|
5
5
|
# these tests.
|
6
6
|
|
7
|
-
|
7
|
+
# can't use .include? because ruby18 uses strings and ruby19 uses symbols :/
|
8
|
+
if Object.instance_methods.any? { |v| v.to_sym == :verify }
|
9
|
+
Object.send(:undef_method, :verify)
|
10
|
+
end
|
8
11
|
|
9
12
|
module Transport
|
10
13
|
|
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: 2.0.
|
4
|
+
version: 2.0.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jamis Buck
|
@@ -9,10 +9,19 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2008-
|
12
|
+
date: 2008-12-06 00:00:00 -07:00
|
13
13
|
default_executable:
|
14
|
-
dependencies:
|
15
|
-
|
14
|
+
dependencies:
|
15
|
+
- !ruby/object:Gem::Dependency
|
16
|
+
name: echoe
|
17
|
+
type: :development
|
18
|
+
version_requirement:
|
19
|
+
version_requirements: !ruby/object:Gem::Requirement
|
20
|
+
requirements:
|
21
|
+
- - ">="
|
22
|
+
- !ruby/object:Gem::Version
|
23
|
+
version: "0"
|
24
|
+
version:
|
16
25
|
description: a pure-Ruby implementation of the SSH2 client protocol
|
17
26
|
email: jamis@jamisbuck.org
|
18
27
|
executables: []
|
@@ -209,7 +218,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
209
218
|
requirements:
|
210
219
|
- - ">="
|
211
220
|
- !ruby/object:Gem::Version
|
212
|
-
version: "
|
221
|
+
version: "1.2"
|
213
222
|
version:
|
214
223
|
requirements: []
|
215
224
|
|