net-ssh 2.0.11 → 2.0.13
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG.rdoc +22 -0
- data/Manifest +11 -8
- data/README.rdoc +30 -0
- data/Rakefile +70 -17
- data/Rudyfile +110 -0
- data/lib/net/ssh/config.rb +10 -6
- data/lib/net/ssh/proxy/socks5.rb +18 -5
- data/lib/net/ssh/transport/algorithms.rb +1 -1
- data/lib/net/ssh/transport/cipher_factory.rb +25 -8
- data/lib/net/ssh/transport/packet_stream.rb +6 -6
- data/lib/net/ssh/transport/server_version.rb +13 -3
- data/lib/net/ssh/transport/state.rb +11 -6
- data/lib/net/ssh/version.rb +1 -1
- data/net-ssh.gemspec +128 -30
- data/support/arcfour_check.rb +20 -0
- data/test/common.rb +1 -0
- data/test/configs/multihost +4 -0
- data/test/test_all.rb +2 -0
- data/test/test_config.rb +16 -1
- data/test/transport/test_algorithms.rb +5 -5
- data/test/transport/test_cipher_factory.rb +43 -1
- data/test/transport/test_packet_stream.rb +8 -2
- data/test/transport/test_server_version.rb +15 -4
- metadata +31 -95
data/CHANGELOG.rdoc
CHANGED
@@ -1,3 +1,25 @@
|
|
1
|
+
|
2
|
+
|
3
|
+
=== 2.0.13 / 17 Aug 2009
|
4
|
+
|
5
|
+
* Added fix for hanging in ServerVersion#negotiate! when using SOCKS5 proxy (GH-9) [Gerald Talton]
|
6
|
+
|
7
|
+
* Added support for specifying a list of hosts in .ssh/config, with tests (GH-6) [ckoehler, Delano Mandelbaum]
|
8
|
+
|
9
|
+
* Added tests for arcfour128/256/512 lengths, encryption, and decryption [Delano Mandelbaum]
|
10
|
+
|
11
|
+
* Skip packet stream tests for arcfour128/256/512 [Delano Mandelbaum]
|
12
|
+
|
13
|
+
* Fix for OpenSSL cipher key length because it always returns 16, even when 32 byte keys are required, e.g. for arcfour256 and arcfour512 ciphers [Karl Varga]
|
14
|
+
|
15
|
+
|
16
|
+
=== 2.0.12 / 08 Jun 2009
|
17
|
+
|
18
|
+
* Applied patch for arcfour128 and arcfour256 support [Denis Bernard]
|
19
|
+
|
20
|
+
* Use unbuffered reads when negotiating the protocol version [Steven Hazel]
|
21
|
+
|
22
|
+
|
1
23
|
=== 2.0.11 / 24 Feb 2009
|
2
24
|
|
3
25
|
* Add :key_data option for specifying raw private keys in PEM format [Alex Holems, Andrew Babkin]
|
data/Manifest
CHANGED
@@ -1,4 +1,10 @@
|
|
1
1
|
CHANGELOG.rdoc
|
2
|
+
Manifest
|
3
|
+
README.rdoc
|
4
|
+
Rakefile
|
5
|
+
Rudyfile
|
6
|
+
THANKS.rdoc
|
7
|
+
lib/net/ssh.rb
|
2
8
|
lib/net/ssh/authentication/agent.rb
|
3
9
|
lib/net/ssh/authentication/constants.rb
|
4
10
|
lib/net/ssh/authentication/key_manager.rb
|
@@ -28,6 +34,7 @@ lib/net/ssh/proxy/socks4.rb
|
|
28
34
|
lib/net/ssh/proxy/socks5.rb
|
29
35
|
lib/net/ssh/ruby_compat.rb
|
30
36
|
lib/net/ssh/service/forward.rb
|
37
|
+
lib/net/ssh/test.rb
|
31
38
|
lib/net/ssh/test/channel.rb
|
32
39
|
lib/net/ssh/test/extensions.rb
|
33
40
|
lib/net/ssh/test/kex.rb
|
@@ -36,21 +43,20 @@ lib/net/ssh/test/packet.rb
|
|
36
43
|
lib/net/ssh/test/remote_packet.rb
|
37
44
|
lib/net/ssh/test/script.rb
|
38
45
|
lib/net/ssh/test/socket.rb
|
39
|
-
lib/net/ssh/test.rb
|
40
46
|
lib/net/ssh/transport/algorithms.rb
|
41
47
|
lib/net/ssh/transport/cipher_factory.rb
|
42
48
|
lib/net/ssh/transport/constants.rb
|
49
|
+
lib/net/ssh/transport/hmac.rb
|
43
50
|
lib/net/ssh/transport/hmac/abstract.rb
|
44
51
|
lib/net/ssh/transport/hmac/md5.rb
|
45
52
|
lib/net/ssh/transport/hmac/md5_96.rb
|
46
53
|
lib/net/ssh/transport/hmac/none.rb
|
47
54
|
lib/net/ssh/transport/hmac/sha1.rb
|
48
55
|
lib/net/ssh/transport/hmac/sha1_96.rb
|
49
|
-
lib/net/ssh/transport/hmac.rb
|
50
56
|
lib/net/ssh/transport/identity_cipher.rb
|
57
|
+
lib/net/ssh/transport/kex.rb
|
51
58
|
lib/net/ssh/transport/kex/diffie_hellman_group1_sha1.rb
|
52
59
|
lib/net/ssh/transport/kex/diffie_hellman_group_exchange_sha1.rb
|
53
|
-
lib/net/ssh/transport/kex.rb
|
54
60
|
lib/net/ssh/transport/openssl.rb
|
55
61
|
lib/net/ssh/transport/packet_stream.rb
|
56
62
|
lib/net/ssh/transport/server_version.rb
|
@@ -60,12 +66,9 @@ lib/net/ssh/verifiers/lenient.rb
|
|
60
66
|
lib/net/ssh/verifiers/null.rb
|
61
67
|
lib/net/ssh/verifiers/strict.rb
|
62
68
|
lib/net/ssh/version.rb
|
63
|
-
lib/net/ssh.rb
|
64
|
-
Manifest
|
65
69
|
net-ssh.gemspec
|
66
|
-
Rakefile
|
67
|
-
README.rdoc
|
68
70
|
setup.rb
|
71
|
+
support/arcfour_check.rb
|
69
72
|
test/authentication/methods/common.rb
|
70
73
|
test/authentication/methods/test_abstract.rb
|
71
74
|
test/authentication/methods/test_hostbased.rb
|
@@ -78,6 +81,7 @@ test/authentication/test_session.rb
|
|
78
81
|
test/common.rb
|
79
82
|
test/configs/eqsign
|
80
83
|
test/configs/exact_match
|
84
|
+
test/configs/multihost
|
81
85
|
test/configs/wild_cards
|
82
86
|
test/connection/test_channel.rb
|
83
87
|
test/connection/test_session.rb
|
@@ -101,4 +105,3 @@ test/transport/test_packet_stream.rb
|
|
101
105
|
test/transport/test_server_version.rb
|
102
106
|
test/transport/test_session.rb
|
103
107
|
test/transport/test_state.rb
|
104
|
-
THANKS.rdoc
|
data/README.rdoc
CHANGED
@@ -80,10 +80,40 @@ Lastly, if you want to run the tests or use any of the Rake tasks, you'll need:
|
|
80
80
|
* Echoe (for the Rakefile)
|
81
81
|
* Mocha (for the tests)
|
82
82
|
|
83
|
+
|
83
84
|
== INSTALL:
|
84
85
|
|
85
86
|
* gem install net-ssh (might need sudo privileges)
|
86
87
|
|
88
|
+
|
89
|
+
== ARCFOUR SUPPORT:
|
90
|
+
|
91
|
+
from Karl Varga:
|
92
|
+
|
93
|
+
Ruby's OpenSSL bindings always return a key length of 16 for RC4 ciphers, which means that when we try to use ARCFOUR256 or higher, Net::SSH generates keys which are consistently too short - 16 bytes as opposed to 32 bytes - resulting in the following error:
|
94
|
+
|
95
|
+
OpenSSL::CipherError: key length too short
|
96
|
+
|
97
|
+
My patch simply instructs Net::SSH to build keys of the the proper length, regardless of the required key length reported by OpenSSL.
|
98
|
+
|
99
|
+
You should also be aware that your OpenSSL C libraries may also contain this bug. I've updated to 0.9.8k, but according to this thread[https://bugzilla.mindrot.org/show_bug.cgi?id=1291], the bug existed as recently as 0.9.8e! I've manually taken a look at my header files and they look ok, which is what makes me think it's a bug in the Ruby implementation.
|
100
|
+
|
101
|
+
To see your OpenSSL version:
|
102
|
+
|
103
|
+
$ openssl version
|
104
|
+
OpenSSL 0.9.8k 25 Mar 2009
|
105
|
+
|
106
|
+
After installing this gem, verify that Net::SSH is generating keys of the correct length by running the script <tt>support/arcfour_check.rb</tt>:
|
107
|
+
|
108
|
+
$ ruby arcfour_support.rb
|
109
|
+
|
110
|
+
which should produce the following:
|
111
|
+
|
112
|
+
arcfour128: [16, 8] OpenSSL::Cipher::Cipher
|
113
|
+
arcfour256: [32, 8] OpenSSL::Cipher::Cipher
|
114
|
+
arcfour512: [64, 8] OpenSSL::Cipher::Cipher
|
115
|
+
|
116
|
+
|
87
117
|
== LICENSE:
|
88
118
|
|
89
119
|
(The MIT License)
|
data/Rakefile
CHANGED
@@ -1,26 +1,79 @@
|
|
1
|
-
require '
|
1
|
+
require 'rubygems'
|
2
|
+
require 'rake/clean'
|
3
|
+
require 'rake/gempackagetask'
|
4
|
+
require 'hanna/rdoctask'
|
5
|
+
require 'fileutils'
|
6
|
+
include FileUtils
|
7
|
+
|
8
|
+
task :default => :package
|
9
|
+
|
10
|
+
# CONFIG =============================================================
|
2
11
|
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
12
|
+
# Change the following according to your needs
|
13
|
+
README = "README.rdoc"
|
14
|
+
CHANGES = "CHANGELOG.rdoc"
|
15
|
+
THANKS = 'THANKS.rdoc'
|
16
|
+
|
17
|
+
# Files and directories to be deleted when you run "rake clean"
|
18
|
+
CLEAN.include [ 'pkg', '*.gem', '.config', 'doc']
|
19
|
+
|
20
|
+
# Virginia assumes your project and gemspec have the same name
|
21
|
+
name = 'net-ssh'
|
22
|
+
load "#{name}.gemspec"
|
23
|
+
version = @spec.version
|
24
|
+
|
25
|
+
# That's it! The following defaults should allow you to get started
|
26
|
+
# on other things.
|
27
|
+
|
28
|
+
|
29
|
+
# TESTS/SPECS =========================================================
|
30
|
+
|
31
|
+
|
32
|
+
|
33
|
+
# INSTALL =============================================================
|
34
|
+
|
35
|
+
Rake::GemPackageTask.new(@spec) do |p|
|
36
|
+
p.need_tar = true if RUBY_PLATFORM !~ /mswin/
|
37
|
+
end
|
38
|
+
|
39
|
+
task :release => [ :rdoc, :package ]
|
40
|
+
task :install => [ :rdoc, :package ] do
|
41
|
+
sh %{sudo gem install pkg/#{name}-#{version}.gem}
|
42
|
+
end
|
43
|
+
task :uninstall => [ :clean ] do
|
44
|
+
sh %{sudo gem uninstall #{name}}
|
7
45
|
end
|
8
46
|
|
9
|
-
|
10
|
-
|
11
|
-
|
47
|
+
|
48
|
+
# RUBYFORGE RELEASE / PUBLISH TASKS ==================================
|
49
|
+
|
50
|
+
if @spec.rubyforge_project
|
51
|
+
desc 'Publish website to rubyforge'
|
52
|
+
task 'publish:rdoc' => 'doc/index.html' do
|
53
|
+
sh "scp -rp doc/* rubyforge.org:/var/www/gforge-projects/#{name}/ssh/v2/api/"
|
54
|
+
end
|
55
|
+
|
56
|
+
desc 'Public release to rubyforge'
|
57
|
+
task 'publish:gem' => [:package] do |t|
|
58
|
+
sh <<-end
|
59
|
+
rubyforge add_release -o Any -a #{CHANGES} -f -n #{README} #{name} #{name} #{@spec.version} pkg/#{name}-#{@spec.version}.gem &&
|
60
|
+
rubyforge add_file -o Any -a #{CHANGES} -f -n #{README} #{name} #{name} #{@spec.version} pkg/#{name}-#{@spec.version}.tgz
|
61
|
+
end
|
62
|
+
end
|
12
63
|
end
|
13
64
|
|
14
|
-
Echoe.new('net-ssh', version) do |p|
|
15
|
-
p.changelog = "CHANGELOG.rdoc"
|
16
65
|
|
17
|
-
p.author = "Jamis Buck"
|
18
|
-
p.email = "jamis@jamisbuck.org"
|
19
|
-
p.summary = "a pure-Ruby implementation of the SSH2 client protocol"
|
20
|
-
p.url = "http://net-ssh.rubyforge.org/ssh"
|
21
66
|
|
22
|
-
|
23
|
-
p.include_rakefile = true
|
67
|
+
# RUBY DOCS TASK ==================================
|
24
68
|
|
25
|
-
|
69
|
+
Rake::RDocTask.new do |t|
|
70
|
+
t.rdoc_dir = 'doc'
|
71
|
+
t.title = @spec.summary
|
72
|
+
t.options << '--line-numbers' << '-A cattr_accessor=object'
|
73
|
+
t.options << '--charset' << 'utf-8'
|
74
|
+
t.rdoc_files.include(README)
|
75
|
+
t.rdoc_files.include(CHANGES)
|
76
|
+
t.rdoc_files.include(THANKS)
|
77
|
+
t.rdoc_files.include('lib/**/*.rb')
|
26
78
|
end
|
79
|
+
|
data/Rudyfile
ADDED
@@ -0,0 +1,110 @@
|
|
1
|
+
# Rudyfile
|
2
|
+
#
|
3
|
+
# This configuration is used to test installing
|
4
|
+
# and running net-ssh on a clean machine.
|
5
|
+
#
|
6
|
+
# Usage:
|
7
|
+
#
|
8
|
+
# $ rudy -vv startup
|
9
|
+
# $ rudy -vv testsuite
|
10
|
+
# $ rudy -vv shutdown
|
11
|
+
#
|
12
|
+
# Requires: Rudy 0.9 (http://code.google.com/p/rudy/)
|
13
|
+
#
|
14
|
+
|
15
|
+
defaults do
|
16
|
+
color true
|
17
|
+
environment :test
|
18
|
+
role :netssh
|
19
|
+
end
|
20
|
+
|
21
|
+
machines do
|
22
|
+
region :'us-east-1' do
|
23
|
+
ami 'ami-e348af8a' # Alestic Debian 5.0, 32-bit (US)
|
24
|
+
end
|
25
|
+
env :test do
|
26
|
+
role :netssh do
|
27
|
+
user :root
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
commands do
|
33
|
+
allow :apt_get, "apt-get", :y, :q
|
34
|
+
allow :gem_install, "/usr/bin/gem", "install", :n, '/usr/bin', :y, :V, "--no-rdoc", "--no-ri"
|
35
|
+
allow :gem_sources, "/usr/bin/gem", "sources"
|
36
|
+
allow :gem_uninstall, "/usr/bin/gem", "uninstall", :V
|
37
|
+
allow :update_rubygems
|
38
|
+
allow :rm
|
39
|
+
end
|
40
|
+
|
41
|
+
routines do
|
42
|
+
|
43
|
+
testsuite do
|
44
|
+
before :sysupdate, :installdeps, :install_gem
|
45
|
+
|
46
|
+
remote :root do
|
47
|
+
directory_upload 'test', '/tmp/'
|
48
|
+
cd '/tmp'
|
49
|
+
ruby :I, 'lib/', :I, 'test/', :r, 'rubygems', 'test/test_all.rb'
|
50
|
+
end
|
51
|
+
|
52
|
+
after :install_rubyforge, :install_github
|
53
|
+
end
|
54
|
+
|
55
|
+
install_rubyforge do
|
56
|
+
remote :root do
|
57
|
+
gem_install 'net-ssh', '--version', '2.0.7'
|
58
|
+
gem_install 'net-ssh'
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
install_github do
|
63
|
+
remote :root do
|
64
|
+
gem_sources :a, "http://gems.github.com"
|
65
|
+
gem_install 'net-ssh-net-ssh'
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
install_gem do
|
70
|
+
before :package_gem
|
71
|
+
remote :root do
|
72
|
+
disable_safe_mode
|
73
|
+
file_upload "pkg/net-ssh-*.gem", "/tmp/"
|
74
|
+
gem_install "/tmp/net-ssh-*.gem"
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
package_gem do
|
79
|
+
local do
|
80
|
+
rm :r, :f, 'pkg'
|
81
|
+
rake 'package'
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
remove do
|
86
|
+
remote :root do
|
87
|
+
gem_uninstall 'net-ssh'
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
installdeps do
|
92
|
+
remote :root do
|
93
|
+
gem_install "rye", "test-unit", "mocha"
|
94
|
+
rye 'authorize-local'
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
sysupdate do
|
99
|
+
remote :root do
|
100
|
+
apt_get "update"
|
101
|
+
apt_get "install", "build-essential", "git-core"
|
102
|
+
apt_get "install", "ruby1.8-dev", "rdoc", "libzlib-ruby", "rubygems"
|
103
|
+
mkdir :p, "/var/lib/gems/1.8/bin" # Doesn't get created, but causes Rubygems to fail
|
104
|
+
gem_install "builder", "session"
|
105
|
+
gem_install 'rubygems-update', "-v=1.3.4" # circular issue with 1.3.5 and hoe
|
106
|
+
update_rubygems
|
107
|
+
end
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
data/lib/net/ssh/config.rb
CHANGED
@@ -57,11 +57,12 @@ module Net; module SSH
|
|
57
57
|
def load(file, host, settings={})
|
58
58
|
file = File.expand_path(file)
|
59
59
|
return settings unless File.readable?(file)
|
60
|
-
|
61
|
-
|
60
|
+
|
61
|
+
matched_host = nil
|
62
|
+
multi_host = []
|
62
63
|
IO.foreach(file) do |line|
|
63
64
|
next if line =~ /^\s*(?:#.*)?$/
|
64
|
-
|
65
|
+
|
65
66
|
if line =~ /^\s*(\S+)\s*=(.*)$/
|
66
67
|
key, value = $1, $2
|
67
68
|
else
|
@@ -82,8 +83,11 @@ module Net; module SSH
|
|
82
83
|
end
|
83
84
|
|
84
85
|
if key == 'host'
|
85
|
-
|
86
|
-
|
86
|
+
# Support "Host host1,host2,hostN".
|
87
|
+
# See http://github.com/net-ssh/net-ssh/issues#issue/6
|
88
|
+
multi_host = value.split(/,\s+/)
|
89
|
+
matched_host = multi_host.select { |h| host =~ pattern2regex(h) }.first
|
90
|
+
elsif !matched_host.nil?
|
87
91
|
if key == 'identityfile'
|
88
92
|
settings[key] ||= []
|
89
93
|
settings[key] << value
|
@@ -92,7 +96,7 @@ module Net; module SSH
|
|
92
96
|
end
|
93
97
|
end
|
94
98
|
end
|
95
|
-
|
99
|
+
|
96
100
|
return settings
|
97
101
|
end
|
98
102
|
|
data/lib/net/ssh/proxy/socks5.rb
CHANGED
@@ -94,11 +94,24 @@ module Net
|
|
94
94
|
|
95
95
|
packet << [port].pack("n")
|
96
96
|
socket.send packet, 0
|
97
|
-
|
98
|
-
version, reply, = socket.recv(
|
99
|
-
|
100
|
-
socket.recv(
|
101
|
-
|
97
|
+
|
98
|
+
version, reply, = socket.recv(2).unpack("C*")
|
99
|
+
socket.recv(1)
|
100
|
+
address_type = socket.recv(1).getbyte(0)
|
101
|
+
case address_type
|
102
|
+
when 1
|
103
|
+
socket.recv(4) # get four bytes for IPv4 address
|
104
|
+
when 3
|
105
|
+
len = socket.recv(1).getbyte(0)
|
106
|
+
hostname = socket.recv(len)
|
107
|
+
when 4
|
108
|
+
ipv6addr hostname = socket.recv(16)
|
109
|
+
else
|
110
|
+
socket.close
|
111
|
+
raise ConnectionError, "Illegal response type"
|
112
|
+
end
|
113
|
+
portnum = socket.recv(2)
|
114
|
+
|
102
115
|
unless reply == SUCCESS
|
103
116
|
socket.close
|
104
117
|
raise ConnectError, "#{reply}"
|
@@ -27,7 +27,7 @@ module Net; module SSH; module Transport
|
|
27
27
|
diffie-hellman-group1-sha1),
|
28
28
|
:encryption => %w(aes128-cbc 3des-cbc blowfish-cbc cast128-cbc
|
29
29
|
aes192-cbc aes256-cbc rijndael-cbc@lysator.liu.se
|
30
|
-
idea-cbc none),
|
30
|
+
idea-cbc none arcfour128 arcfour256),
|
31
31
|
:hmac => %w(hmac-sha1 hmac-md5 hmac-sha1-96 hmac-md5-96 none),
|
32
32
|
:compression => %w(none zlib@openssh.com zlib),
|
33
33
|
:language => %w()
|
@@ -15,9 +15,20 @@ module Net; module SSH; module Transport
|
|
15
15
|
"idea-cbc" => "idea-cbc",
|
16
16
|
"cast128-cbc" => "cast-cbc",
|
17
17
|
"rijndael-cbc@lysator.liu.se" => "aes-256-cbc",
|
18
|
+
"arcfour128" => "rc4",
|
19
|
+
"arcfour256" => "rc4",
|
20
|
+
"arcfour512" => "rc4",
|
18
21
|
"none" => "none"
|
19
22
|
}
|
20
|
-
|
23
|
+
|
24
|
+
# Ruby's OpenSSL bindings always return a key length of 16 for RC4 ciphers
|
25
|
+
# resulting in the error: OpenSSL::CipherError: key length too short.
|
26
|
+
# The following ciphers will override this key length.
|
27
|
+
KEY_LEN_OVERRIDE = {
|
28
|
+
"arcfour256" => 32,
|
29
|
+
"arcfour512" => 64
|
30
|
+
}
|
31
|
+
|
21
32
|
# Returns true if the underlying OpenSSL library supports the given cipher,
|
22
33
|
# and false otherwise.
|
23
34
|
def self.supported?(name)
|
@@ -39,8 +50,11 @@ module Net; module SSH; module Transport
|
|
39
50
|
cipher.send(options[:encrypt] ? :encrypt : :decrypt)
|
40
51
|
|
41
52
|
cipher.padding = 0
|
42
|
-
cipher.iv = make_key(cipher.iv_len, options[:iv], options)
|
43
|
-
|
53
|
+
cipher.iv = make_key(cipher.iv_len, options[:iv], options) if ossl_name != "rc4"
|
54
|
+
key_len = KEY_LEN_OVERRIDE[name] || cipher.key_len
|
55
|
+
cipher.key_len = key_len
|
56
|
+
cipher.key = make_key(key_len, options[:key], options)
|
57
|
+
cipher.update(" " * 1536) if ossl_name == "rc4"
|
44
58
|
|
45
59
|
return cipher
|
46
60
|
end
|
@@ -54,7 +68,10 @@ module Net; module SSH; module Transport
|
|
54
68
|
return [0, 0] if ossl_name.nil? || ossl_name == "none"
|
55
69
|
|
56
70
|
cipher = OpenSSL::Cipher::Cipher.new(ossl_name)
|
57
|
-
|
71
|
+
key_len = KEY_LEN_OVERRIDE[name] || cipher.key_len
|
72
|
+
cipher.key_len = key_len
|
73
|
+
|
74
|
+
return [key_len, ossl_name=="rc4" ? 8 : cipher.block_size]
|
58
75
|
end
|
59
76
|
|
60
77
|
private
|
@@ -62,10 +79,10 @@ module Net; module SSH; module Transport
|
|
62
79
|
# Generate a key value in accordance with the SSH2 specification.
|
63
80
|
def self.make_key(bytes, start, options={})
|
64
81
|
k = start[0, bytes]
|
65
|
-
|
66
|
-
digester = options[:digester]
|
67
|
-
shared = options[:shared]
|
68
|
-
hash = options[:hash]
|
82
|
+
|
83
|
+
digester = options[:digester] or raise 'No digester supplied'
|
84
|
+
shared = options[:shared] or raise 'No shared secret supplied'
|
85
|
+
hash = options[:hash] or raise 'No hash supplied'
|
69
86
|
|
70
87
|
while k.length < bytes
|
71
88
|
step = digester.digest(shared + hash + k)
|
@@ -118,14 +118,14 @@ module Net; module SSH; module Transport
|
|
118
118
|
actual_length = 4 + payload.length + 1
|
119
119
|
|
120
120
|
# compute the padding length
|
121
|
-
padding_length = client.
|
122
|
-
padding_length += client.
|
121
|
+
padding_length = client.block_size - (actual_length % client.block_size)
|
122
|
+
padding_length += client.block_size if padding_length < 4
|
123
123
|
|
124
124
|
# compute the packet length (sans the length field itself)
|
125
125
|
packet_length = payload.length + padding_length + 1
|
126
126
|
|
127
127
|
if packet_length < 16
|
128
|
-
padding_length += client.
|
128
|
+
padding_length += client.block_size
|
129
129
|
packet_length = payload.length + padding_length + 1
|
130
130
|
end
|
131
131
|
|
@@ -182,7 +182,7 @@ module Net; module SSH; module Transport
|
|
182
182
|
# new Packet object.
|
183
183
|
def poll_next_packet
|
184
184
|
if @packet.nil?
|
185
|
-
minimum = server.
|
185
|
+
minimum = server.block_size < 4 ? 4 : server.block_size
|
186
186
|
return nil if available < minimum
|
187
187
|
data = read_available(minimum)
|
188
188
|
|
@@ -191,8 +191,8 @@ module Net; module SSH; module Transport
|
|
191
191
|
@packet_length = @packet.read_long
|
192
192
|
end
|
193
193
|
|
194
|
-
need = @packet_length + 4 - server.
|
195
|
-
raise Net::SSH::Exception, "padding error, need #{need} block #{server.
|
194
|
+
need = @packet_length + 4 - server.block_size
|
195
|
+
raise Net::SSH::Exception, "padding error, need #{need} block #{server.block_size}" if need % server.block_size != 0
|
196
196
|
|
197
197
|
return nil if available < need + server.hmac.mac_length
|
198
198
|
|
@@ -41,8 +41,17 @@ module Net; module SSH; module Transport
|
|
41
41
|
info { "negotiating protocol version" }
|
42
42
|
|
43
43
|
loop do
|
44
|
-
@version =
|
45
|
-
|
44
|
+
@version = ""
|
45
|
+
loop do
|
46
|
+
b = socket.recv(1)
|
47
|
+
|
48
|
+
if b.nil?
|
49
|
+
raise Net::SSH::Disconnect, "connection closed by remote host"
|
50
|
+
end
|
51
|
+
@version << b
|
52
|
+
break if b == "\n"
|
53
|
+
end
|
54
|
+
break if @version.match(/^SSH-/)
|
46
55
|
@header << @version
|
47
56
|
end
|
48
57
|
|
@@ -55,6 +64,7 @@ module Net; module SSH; module Transport
|
|
55
64
|
|
56
65
|
debug { "local is `#{PROTO_VERSION}'" }
|
57
66
|
socket.write "#{PROTO_VERSION}\r\n"
|
67
|
+
socket.flush
|
58
68
|
end
|
59
69
|
end
|
60
|
-
end; end; end
|
70
|
+
end; end; end
|
@@ -34,6 +34,9 @@ module Net; module SSH; module Transport
|
|
34
34
|
# The cipher algorithm in use for this socket endpoint.
|
35
35
|
attr_reader :cipher
|
36
36
|
|
37
|
+
# The block size for the cipher
|
38
|
+
attr_reader :block_size
|
39
|
+
|
37
40
|
# The role that this state plays (either :client or :server)
|
38
41
|
attr_reader :role
|
39
42
|
|
@@ -56,6 +59,7 @@ module Net; module SSH; module Transport
|
|
56
59
|
@role = role
|
57
60
|
@sequence_number = @packets = @blocks = 0
|
58
61
|
@cipher = CipherFactory.get("none")
|
62
|
+
@block_size = 8
|
59
63
|
@hmac = HMAC.get("none")
|
60
64
|
@compression = nil
|
61
65
|
@compressor = @decompressor = nil
|
@@ -89,7 +93,7 @@ module Net; module SSH; module Transport
|
|
89
93
|
def increment(packet_length)
|
90
94
|
@sequence_number = (@sequence_number + 1) & 0xFFFFFFFF
|
91
95
|
@packets += 1
|
92
|
-
@blocks += (packet_length + 4) /
|
96
|
+
@blocks += (packet_length + 4) / @block_size
|
93
97
|
end
|
94
98
|
|
95
99
|
# The compressor object to use when compressing data. This takes into account
|
@@ -135,22 +139,23 @@ module Net; module SSH; module Transport
|
|
135
139
|
|
136
140
|
@max_packets ||= 1 << 31
|
137
141
|
|
142
|
+
@block_size = cipher.name == "RC4" ? 8 : cipher.block_size
|
143
|
+
|
138
144
|
if max_blocks.nil?
|
139
145
|
# cargo-culted from openssh. the idea is that "the 2^(blocksize*2)
|
140
146
|
# limit is too expensive for 3DES, blowfish, etc., so enforce a 1GB
|
141
147
|
# limit for small blocksizes."
|
142
|
-
|
143
|
-
|
144
|
-
@max_blocks = 1 << (cipher.block_size * 2)
|
148
|
+
if @block_size >= 16
|
149
|
+
@max_blocks = 1 << (@block_size * 2)
|
145
150
|
else
|
146
|
-
@max_blocks = (1 << 30) /
|
151
|
+
@max_blocks = (1 << 30) / @block_size
|
147
152
|
end
|
148
153
|
|
149
154
|
# if a limit on the # of bytes has been given, convert that into a
|
150
155
|
# minimum number of blocks processed.
|
151
156
|
|
152
157
|
if rekey_limit
|
153
|
-
@max_blocks = [@max_blocks, rekey_limit /
|
158
|
+
@max_blocks = [@max_blocks, rekey_limit / @block_size].min
|
154
159
|
end
|
155
160
|
end
|
156
161
|
|
data/lib/net/ssh/version.rb
CHANGED
data/net-ssh.gemspec
CHANGED
@@ -1,33 +1,131 @@
|
|
1
|
-
Gem::Specification.new do |s|
|
2
|
-
|
3
|
-
s.
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
s.
|
1
|
+
@spec = Gem::Specification.new do |s|
|
2
|
+
s.name = "net-ssh"
|
3
|
+
s.rubyforge_project = 'net-ssh'
|
4
|
+
s.version = "2.0.13"
|
5
|
+
s.summary = "Net::SSH: a pure-Ruby implementation of the SSH2 client protocol."
|
6
|
+
s.description = s.summary
|
7
|
+
s.authors = ["Jamis Buck", "Delano Mandelbaum"]
|
8
|
+
s.email = ["net-ssh@solutious.com", "net-ssh@solutious.com"]
|
9
|
+
s.homepage = "http://rubyforge.org/projects/net-ssh/"
|
10
|
+
|
11
|
+
s.extra_rdoc_files = %w[README.rdoc THANKS.rdoc CHANGELOG.rdoc]
|
12
12
|
s.has_rdoc = true
|
13
|
-
s.
|
14
|
-
s.
|
15
|
-
s.
|
16
|
-
|
17
|
-
s.
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
13
|
+
s.rdoc_options = ["--line-numbers", "--title", s.summary, "--main", "README.rdoc"]
|
14
|
+
s.require_paths = %w[lib]
|
15
|
+
s.rubygems_version = '1.3.2'
|
16
|
+
|
17
|
+
s.executables = %w[]
|
18
|
+
|
19
|
+
# = MANIFEST =
|
20
|
+
s.files = %w(
|
21
|
+
CHANGELOG.rdoc
|
22
|
+
Manifest
|
23
|
+
README.rdoc
|
24
|
+
Rakefile
|
25
|
+
Rudyfile
|
26
|
+
THANKS.rdoc
|
27
|
+
lib/net/ssh.rb
|
28
|
+
lib/net/ssh/authentication/agent.rb
|
29
|
+
lib/net/ssh/authentication/constants.rb
|
30
|
+
lib/net/ssh/authentication/key_manager.rb
|
31
|
+
lib/net/ssh/authentication/methods/abstract.rb
|
32
|
+
lib/net/ssh/authentication/methods/hostbased.rb
|
33
|
+
lib/net/ssh/authentication/methods/keyboard_interactive.rb
|
34
|
+
lib/net/ssh/authentication/methods/password.rb
|
35
|
+
lib/net/ssh/authentication/methods/publickey.rb
|
36
|
+
lib/net/ssh/authentication/pageant.rb
|
37
|
+
lib/net/ssh/authentication/session.rb
|
38
|
+
lib/net/ssh/buffer.rb
|
39
|
+
lib/net/ssh/buffered_io.rb
|
40
|
+
lib/net/ssh/config.rb
|
41
|
+
lib/net/ssh/connection/channel.rb
|
42
|
+
lib/net/ssh/connection/constants.rb
|
43
|
+
lib/net/ssh/connection/session.rb
|
44
|
+
lib/net/ssh/connection/term.rb
|
45
|
+
lib/net/ssh/errors.rb
|
46
|
+
lib/net/ssh/key_factory.rb
|
47
|
+
lib/net/ssh/known_hosts.rb
|
48
|
+
lib/net/ssh/loggable.rb
|
49
|
+
lib/net/ssh/packet.rb
|
50
|
+
lib/net/ssh/prompt.rb
|
51
|
+
lib/net/ssh/proxy/errors.rb
|
52
|
+
lib/net/ssh/proxy/http.rb
|
53
|
+
lib/net/ssh/proxy/socks4.rb
|
54
|
+
lib/net/ssh/proxy/socks5.rb
|
55
|
+
lib/net/ssh/ruby_compat.rb
|
56
|
+
lib/net/ssh/service/forward.rb
|
57
|
+
lib/net/ssh/test.rb
|
58
|
+
lib/net/ssh/test/channel.rb
|
59
|
+
lib/net/ssh/test/extensions.rb
|
60
|
+
lib/net/ssh/test/kex.rb
|
61
|
+
lib/net/ssh/test/local_packet.rb
|
62
|
+
lib/net/ssh/test/packet.rb
|
63
|
+
lib/net/ssh/test/remote_packet.rb
|
64
|
+
lib/net/ssh/test/script.rb
|
65
|
+
lib/net/ssh/test/socket.rb
|
66
|
+
lib/net/ssh/transport/algorithms.rb
|
67
|
+
lib/net/ssh/transport/cipher_factory.rb
|
68
|
+
lib/net/ssh/transport/constants.rb
|
69
|
+
lib/net/ssh/transport/hmac.rb
|
70
|
+
lib/net/ssh/transport/hmac/abstract.rb
|
71
|
+
lib/net/ssh/transport/hmac/md5.rb
|
72
|
+
lib/net/ssh/transport/hmac/md5_96.rb
|
73
|
+
lib/net/ssh/transport/hmac/none.rb
|
74
|
+
lib/net/ssh/transport/hmac/sha1.rb
|
75
|
+
lib/net/ssh/transport/hmac/sha1_96.rb
|
76
|
+
lib/net/ssh/transport/identity_cipher.rb
|
77
|
+
lib/net/ssh/transport/kex.rb
|
78
|
+
lib/net/ssh/transport/kex/diffie_hellman_group1_sha1.rb
|
79
|
+
lib/net/ssh/transport/kex/diffie_hellman_group_exchange_sha1.rb
|
80
|
+
lib/net/ssh/transport/openssl.rb
|
81
|
+
lib/net/ssh/transport/packet_stream.rb
|
82
|
+
lib/net/ssh/transport/server_version.rb
|
83
|
+
lib/net/ssh/transport/session.rb
|
84
|
+
lib/net/ssh/transport/state.rb
|
85
|
+
lib/net/ssh/verifiers/lenient.rb
|
86
|
+
lib/net/ssh/verifiers/null.rb
|
87
|
+
lib/net/ssh/verifiers/strict.rb
|
88
|
+
lib/net/ssh/version.rb
|
89
|
+
net-ssh.gemspec
|
90
|
+
setup.rb
|
91
|
+
support/arcfour_check.rb
|
92
|
+
test/authentication/methods/common.rb
|
93
|
+
test/authentication/methods/test_abstract.rb
|
94
|
+
test/authentication/methods/test_hostbased.rb
|
95
|
+
test/authentication/methods/test_keyboard_interactive.rb
|
96
|
+
test/authentication/methods/test_password.rb
|
97
|
+
test/authentication/methods/test_publickey.rb
|
98
|
+
test/authentication/test_agent.rb
|
99
|
+
test/authentication/test_key_manager.rb
|
100
|
+
test/authentication/test_session.rb
|
101
|
+
test/common.rb
|
102
|
+
test/configs/eqsign
|
103
|
+
test/configs/exact_match
|
104
|
+
test/configs/multihost
|
105
|
+
test/configs/wild_cards
|
106
|
+
test/connection/test_channel.rb
|
107
|
+
test/connection/test_session.rb
|
108
|
+
test/test_all.rb
|
109
|
+
test/test_buffer.rb
|
110
|
+
test/test_buffered_io.rb
|
111
|
+
test/test_config.rb
|
112
|
+
test/test_key_factory.rb
|
113
|
+
test/transport/hmac/test_md5.rb
|
114
|
+
test/transport/hmac/test_md5_96.rb
|
115
|
+
test/transport/hmac/test_none.rb
|
116
|
+
test/transport/hmac/test_sha1.rb
|
117
|
+
test/transport/hmac/test_sha1_96.rb
|
118
|
+
test/transport/kex/test_diffie_hellman_group1_sha1.rb
|
119
|
+
test/transport/kex/test_diffie_hellman_group_exchange_sha1.rb
|
120
|
+
test/transport/test_algorithms.rb
|
121
|
+
test/transport/test_cipher_factory.rb
|
122
|
+
test/transport/test_hmac.rb
|
123
|
+
test/transport/test_identity_cipher.rb
|
124
|
+
test/transport/test_packet_stream.rb
|
125
|
+
test/transport/test_server_version.rb
|
126
|
+
test/transport/test_session.rb
|
127
|
+
test/transport/test_state.rb
|
128
|
+
)
|
24
129
|
|
25
|
-
|
26
|
-
s.add_development_dependency(%q<echoe>, [">= 0"])
|
27
|
-
else
|
28
|
-
s.add_dependency(%q<echoe>, [">= 0"])
|
29
|
-
end
|
30
|
-
else
|
31
|
-
s.add_dependency(%q<echoe>, [">= 0"])
|
32
|
-
end
|
130
|
+
|
33
131
|
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
|
2
|
+
require 'net/ssh'
|
3
|
+
|
4
|
+
# ARCFOUR CHECK
|
5
|
+
#
|
6
|
+
# Usage:
|
7
|
+
# $ ruby support/arcfour_check.rb
|
8
|
+
#
|
9
|
+
# Expected Output:
|
10
|
+
# arcfour128: [16, 8] OpenSSL::Cipher::Cipher
|
11
|
+
# arcfour256: [32, 8] OpenSSL::Cipher::Cipher
|
12
|
+
# arcfour512: [64, 8] OpenSSL::Cipher::Cipher
|
13
|
+
|
14
|
+
[['arcfour128', 16], ['arcfour256', 32], ['arcfour512', 64]].each do |cipher|
|
15
|
+
print "#{cipher[0]}: "
|
16
|
+
a = Net::SSH::Transport::CipherFactory.get_lengths(cipher[0])
|
17
|
+
b = Net::SSH::Transport::CipherFactory.get(cipher[0], :key => ([].fill('x', 0, cipher[1]).join))
|
18
|
+
puts "#{a} #{b.class}"
|
19
|
+
end
|
20
|
+
|
data/test/common.rb
CHANGED
data/test/test_all.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# $ ruby -Ilib -Itest -rrubygems test/test_all.rb
|
2
|
+
# $ ruby -Ilib -Itest -rrubygems test/transport/test_server_version.rb
|
1
3
|
Dir.chdir(File.dirname(__FILE__)) do
|
2
4
|
test_files = Dir['**/test_*.rb']
|
3
5
|
test_files = test_files.select { |f| f =~ Regexp.new(ENV['ONLY']) } if ENV['ONLY']
|
data/test/test_config.rb
CHANGED
@@ -37,7 +37,22 @@ class TestConfig < Test::Unit::TestCase
|
|
37
37
|
assert_equal %w(~/.ssh/id_dsa), config[:keys]
|
38
38
|
assert !config.key?(:rekey_limit)
|
39
39
|
end
|
40
|
-
|
40
|
+
|
41
|
+
def test_load_with_multiple_hosts
|
42
|
+
config = Net::SSH::Config.load(config(:multihost), "test.host")
|
43
|
+
assert config['compression']
|
44
|
+
assert_equal '2G', config['rekeylimit']
|
45
|
+
assert_equal 1980, config['port']
|
46
|
+
end
|
47
|
+
|
48
|
+
def test_load_with_multiple_hosts_and_config_should_match_for_both
|
49
|
+
aconfig = Net::SSH::Config.load(config(:multihost), "test.host")
|
50
|
+
bconfig = Net::SSH::Config.load(config(:multihost), "other.host")
|
51
|
+
assert_equal aconfig['port'], bconfig['port']
|
52
|
+
assert_equal aconfig['compression'], bconfig['compression']
|
53
|
+
assert_equal aconfig['rekeylimit'], bconfig['rekeylimit']
|
54
|
+
end
|
55
|
+
|
41
56
|
def test_load_should_parse_equal_sign_delimiters
|
42
57
|
config = Net::SSH::Config.load(config(:eqsign), "test.test")
|
43
58
|
assert config['compression']
|
@@ -19,7 +19,7 @@ module Transport
|
|
19
19
|
def test_constructor_should_build_default_list_of_preferred_algorithms
|
20
20
|
assert_equal %w(ssh-rsa ssh-dss), algorithms[:host_key]
|
21
21
|
assert_equal %w(diffie-hellman-group-exchange-sha1 diffie-hellman-group1-sha1), algorithms[:kex]
|
22
|
-
assert_equal %w(aes128-cbc 3des-cbc blowfish-cbc cast128-cbc aes192-cbc aes256-cbc rijndael-cbc@lysator.liu.se idea-cbc none), algorithms[:encryption]
|
22
|
+
assert_equal %w(aes128-cbc 3des-cbc blowfish-cbc cast128-cbc aes192-cbc aes256-cbc rijndael-cbc@lysator.liu.se idea-cbc none arcfour128 arcfour256), algorithms[:encryption]
|
23
23
|
assert_equal %w(hmac-sha1 hmac-md5 hmac-sha1-96 hmac-md5-96 none), algorithms[:hmac]
|
24
24
|
assert_equal %w(none zlib@openssh.com zlib), algorithms[:compression]
|
25
25
|
assert_equal %w(), algorithms[:language]
|
@@ -54,11 +54,11 @@ module Transport
|
|
54
54
|
end
|
55
55
|
|
56
56
|
def test_constructor_with_preferred_encryption_should_put_preferred_encryption_first
|
57
|
-
assert_equal %w(aes256-cbc aes128-cbc 3des-cbc blowfish-cbc cast128-cbc aes192-cbc rijndael-cbc@lysator.liu.se idea-cbc none), algorithms(:encryption => "aes256-cbc")[:encryption]
|
57
|
+
assert_equal %w(aes256-cbc aes128-cbc 3des-cbc blowfish-cbc cast128-cbc aes192-cbc rijndael-cbc@lysator.liu.se idea-cbc none arcfour128 arcfour256), algorithms(:encryption => "aes256-cbc")[:encryption]
|
58
58
|
end
|
59
59
|
|
60
60
|
def test_constructor_with_multiple_preferred_encryption_should_put_all_preferred_encryption_first
|
61
|
-
assert_equal %w(aes256-cbc 3des-cbc idea-cbc aes128-cbc blowfish-cbc cast128-cbc aes192-cbc rijndael-cbc@lysator.liu.se none), algorithms(:encryption => %w(aes256-cbc 3des-cbc idea-cbc))[:encryption]
|
61
|
+
assert_equal %w(aes256-cbc 3des-cbc idea-cbc aes128-cbc blowfish-cbc cast128-cbc aes192-cbc rijndael-cbc@lysator.liu.se none arcfour128 arcfour256), algorithms(:encryption => %w(aes256-cbc 3des-cbc idea-cbc))[:encryption]
|
62
62
|
end
|
63
63
|
|
64
64
|
def test_constructor_with_unrecognized_encryption_should_raise_exception
|
@@ -268,8 +268,8 @@ module Transport
|
|
268
268
|
assert_equal 16, buffer.read(16).length
|
269
269
|
assert_equal options[:kex] || "diffie-hellman-group-exchange-sha1,diffie-hellman-group1-sha1", buffer.read_string
|
270
270
|
assert_equal options[:host_key] || "ssh-rsa,ssh-dss", buffer.read_string
|
271
|
-
assert_equal options[:encryption_client] || "aes128-cbc,3des-cbc,blowfish-cbc,cast128-cbc,aes192-cbc,aes256-cbc,rijndael-cbc@lysator.liu.se,idea-cbc,none", buffer.read_string
|
272
|
-
assert_equal options[:encryption_server] || "aes128-cbc,3des-cbc,blowfish-cbc,cast128-cbc,aes192-cbc,aes256-cbc,rijndael-cbc@lysator.liu.se,idea-cbc,none", buffer.read_string
|
271
|
+
assert_equal options[:encryption_client] || "aes128-cbc,3des-cbc,blowfish-cbc,cast128-cbc,aes192-cbc,aes256-cbc,rijndael-cbc@lysator.liu.se,idea-cbc,none,arcfour128,arcfour256", buffer.read_string
|
272
|
+
assert_equal options[:encryption_server] || "aes128-cbc,3des-cbc,blowfish-cbc,cast128-cbc,aes192-cbc,aes256-cbc,rijndael-cbc@lysator.liu.se,idea-cbc,none,arcfour128,arcfour256", buffer.read_string
|
273
273
|
assert_equal options[:hmac_client] || "hmac-sha1,hmac-md5,hmac-sha1-96,hmac-md5-96,none", buffer.read_string
|
274
274
|
assert_equal options[:hmac_server] || "hmac-sha1,hmac-md5,hmac-sha1-96,hmac-md5-96,none", buffer.read_string
|
275
275
|
assert_equal options[:compression_client] || "none,zlib@openssh.com,zlib", buffer.read_string
|
@@ -47,6 +47,18 @@ module Transport
|
|
47
47
|
assert_equal [32,16], factory.get_lengths("aes256-cbc")
|
48
48
|
end
|
49
49
|
|
50
|
+
def test_lengths_for_arcfour128
|
51
|
+
assert_equal [16,8], factory.get_lengths("arcfour128")
|
52
|
+
end
|
53
|
+
|
54
|
+
def test_lengths_for_arcfour256
|
55
|
+
assert_equal [32,8], factory.get_lengths("arcfour256")
|
56
|
+
end
|
57
|
+
|
58
|
+
def test_lengths_for_arcfour512
|
59
|
+
assert_equal [64,8], factory.get_lengths("arcfour512")
|
60
|
+
end
|
61
|
+
|
50
62
|
BLOWFISH = "\210\021\200\315\240_\026$\352\204g\233\244\242x\332e\370\001\327\224Nv@9_\323\037\252kb\037\036\237\375]\343/y\037\237\312Q\f7]\347Y\005\275%\377\0010$G\272\250B\265Nd\375\342\372\025r6}+Y\213y\n\237\267\\\374^\346BdJ$\353\220Ik\023<\236&H\277=\225"
|
51
63
|
|
52
64
|
def test_blowfish_cbc_for_encryption
|
@@ -128,7 +140,37 @@ module Transport
|
|
128
140
|
def test_aes256_cbc_for_decryption
|
129
141
|
assert_equal TEXT, decrypt("aes256-cbc", AES256)
|
130
142
|
end
|
143
|
+
|
144
|
+
ARCFOUR128 = "\n\x90\xED*\xD4\xBE\xCBg5\xA5\a\xEC]\x97\xB7L\x06)6\x12FL\x90@\xF4Sqxqh\r\x11\x1Aq \xC8\xE6v\xC6\x12\xD9<A\xDAZ\xFE\x7F\x88\x19f.\x06\xA7\xFE:\xFF\x93\x9B\x8D\xA0\\\x9E\xCA\x03\x15\xE1\xE2\f\xC0\b\xA2C\xE1\xBD\xB6\x13D\xD1\xB4'g\x89\xDC\xEB\f\x19Z)U"
|
145
|
+
|
146
|
+
def test_arcfour128_for_encryption
|
147
|
+
assert_equal ARCFOUR128, encrypt("arcfour128")
|
148
|
+
end
|
149
|
+
|
150
|
+
def test_arcfour128_for_decryption
|
151
|
+
assert_equal TEXT, decrypt("arcfour128", ARCFOUR128)
|
152
|
+
end
|
153
|
+
|
154
|
+
ARCFOUR256 = "|g\xCCw\xF5\xC1y\xEB\xF0\v\xF7\x83\x14\x03\xC8\xAB\xE8\xC2\xFCY\xDC,\xB8\xD4dVa\x8B\x18%\xA4S\x00\xE0at\x86\xE8\xA6W\xAB\xD2\x9D\xA8\xDE[g\aZy.\xFB\xFC\x82c\x04h\f\xBFYq\xB7U\x80\x0EG\x91\x88\xDF\xA3\xA2\xFA(\xEC\xDB\xA4\xE7\xFE)\x12u\xAF\x0EZ\xA0\xBA\x97\n\xFC"
|
131
155
|
|
156
|
+
def test_arcfour256_for_encryption
|
157
|
+
assert_equal ARCFOUR256, encrypt("arcfour256")
|
158
|
+
end
|
159
|
+
|
160
|
+
def test_arcfour256_for_decryption
|
161
|
+
assert_equal TEXT, decrypt("arcfour256", ARCFOUR256)
|
162
|
+
end
|
163
|
+
|
164
|
+
ARCFOUR512 = "|8\"v\xE7\xE3\b\xA8\x19\x9Aa\xB6Vv\x00\x11\x8A$C\xB6xE\xEF\xF1j\x90\xA8\xFA\x10\xE4\xA1b8\xF6\x04\xF2+\xC0\xD1(8\xEBT]\xB0\xF3/\xD9\xE0@\x83\a\x93\x9D\xCA\x04RXS\xB7A\x0Fj\x94\bE\xEB\x84j\xB4\xDF\nU\xF7\x83o\n\xE8\xF9\x01{jH\xEE\xCDQym\x9E"
|
165
|
+
|
166
|
+
def test_arcfour512_for_encryption
|
167
|
+
assert_equal ARCFOUR512, encrypt("arcfour512")
|
168
|
+
end
|
169
|
+
|
170
|
+
def test_arcfour512_for_decryption
|
171
|
+
assert_equal TEXT, decrypt("arcfour512", ARCFOUR512)
|
172
|
+
end
|
173
|
+
|
132
174
|
def test_none_for_encryption
|
133
175
|
assert_equal TEXT, encrypt("none").strip
|
134
176
|
end
|
@@ -136,7 +178,7 @@ module Transport
|
|
136
178
|
def test_none_for_decryption
|
137
179
|
assert_equal TEXT, decrypt("none", TEXT)
|
138
180
|
end
|
139
|
-
|
181
|
+
|
140
182
|
private
|
141
183
|
|
142
184
|
TEXT = "But soft! What light through yonder window breaks? It is the east, and Juliet is the sun!"
|
@@ -371,12 +371,18 @@ module Transport
|
|
371
371
|
|
372
372
|
ciphers.each do |cipher_name|
|
373
373
|
next unless Net::SSH::Transport::CipherFactory.supported?(cipher_name)
|
374
|
-
|
374
|
+
|
375
|
+
# TODO: How are the expected packets generated?
|
376
|
+
if cipher_name =~ /arcfour/
|
377
|
+
puts "Skipping packet stream test for #{cipher_name}"
|
378
|
+
next
|
379
|
+
end
|
380
|
+
|
375
381
|
hmacs.each do |hmac_name|
|
376
382
|
[false, :standard].each do |compress|
|
377
383
|
cipher_method_name = cipher_name.gsub(/\W/, "_")
|
378
384
|
hmac_method_name = hmac_name.gsub(/\W/, "_")
|
379
|
-
|
385
|
+
|
380
386
|
define_method("test_next_packet_with_#{cipher_method_name}_and_#{hmac_method_name}_and_#{compress}_compression") do
|
381
387
|
cipher = Net::SSH::Transport::CipherFactory.get(cipher_name, :key => "ABC", :iv => "abc", :shared => "123", :digester => OpenSSL::Digest::SHA1, :hash => "^&*", :decrypt => true)
|
382
388
|
hmac = Net::SSH::Transport::HMAC.get(hmac_name, "{}|")
|
@@ -29,19 +29,30 @@ module Transport
|
|
29
29
|
end
|
30
30
|
|
31
31
|
def test_header_lines_should_be_accumulated
|
32
|
-
s = subject(socket(true, "Welcome\r\
|
32
|
+
s = subject(socket(true, "Welcome\r\nAnother line\r\nSSH-2.0-Testing_1.0\r\n"))
|
33
33
|
assert_equal "Welcome\r\nAnother line\r\n", s.header
|
34
34
|
assert_equal "SSH-2.0-Testing_1.0", s.version
|
35
35
|
end
|
36
36
|
|
37
|
+
def test_server_disconnect_should_raise_exception
|
38
|
+
assert_raises(Net::SSH::Disconnect) { subject(socket(false, "SSH-2.0-Aborting")) }
|
39
|
+
end
|
40
|
+
|
37
41
|
private
|
38
42
|
|
39
|
-
def socket(good,
|
43
|
+
def socket(good, version_header)
|
40
44
|
socket = mock("socket")
|
41
|
-
|
45
|
+
|
46
|
+
data = version_header.split('')
|
47
|
+
recv_times = data.length
|
48
|
+
if data[-1] != "\n"
|
49
|
+
recv_times += 1
|
50
|
+
end
|
51
|
+
socket.expects(:recv).with(1).times(recv_times).returns(*data).then.returns(nil)
|
42
52
|
|
43
53
|
if good
|
44
54
|
socket.expects(:write).with("#{Net::SSH::Transport::ServerVersion::PROTO_VERSION}\r\n")
|
55
|
+
socket.expects(:flush)
|
45
56
|
else
|
46
57
|
socket.expects(:write).never
|
47
58
|
end
|
@@ -54,4 +65,4 @@ module Transport
|
|
54
65
|
end
|
55
66
|
end
|
56
67
|
|
57
|
-
end
|
68
|
+
end
|
metadata
CHANGED
@@ -1,101 +1,39 @@
|
|
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.13
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jamis Buck
|
8
|
+
- Delano Mandelbaum
|
8
9
|
autorequire:
|
9
10
|
bindir: bin
|
10
11
|
cert_chain: []
|
11
12
|
|
12
|
-
date: 2009-
|
13
|
+
date: 2009-08-17 00:00:00 -04:00
|
13
14
|
default_executable:
|
14
|
-
dependencies:
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
requirements:
|
21
|
-
- - ">="
|
22
|
-
- !ruby/object:Gem::Version
|
23
|
-
version: "0"
|
24
|
-
version:
|
25
|
-
description: a pure-Ruby implementation of the SSH2 client protocol
|
26
|
-
email: jamis@jamisbuck.org
|
15
|
+
dependencies: []
|
16
|
+
|
17
|
+
description: "Net::SSH: a pure-Ruby implementation of the SSH2 client protocol."
|
18
|
+
email:
|
19
|
+
- net-ssh@solutious.com
|
20
|
+
- net-ssh@solutious.com
|
27
21
|
executables: []
|
28
22
|
|
29
23
|
extensions: []
|
30
24
|
|
31
25
|
extra_rdoc_files:
|
32
|
-
- CHANGELOG.rdoc
|
33
|
-
- lib/net/ssh/authentication/agent.rb
|
34
|
-
- lib/net/ssh/authentication/constants.rb
|
35
|
-
- lib/net/ssh/authentication/key_manager.rb
|
36
|
-
- lib/net/ssh/authentication/methods/abstract.rb
|
37
|
-
- lib/net/ssh/authentication/methods/hostbased.rb
|
38
|
-
- lib/net/ssh/authentication/methods/keyboard_interactive.rb
|
39
|
-
- lib/net/ssh/authentication/methods/password.rb
|
40
|
-
- lib/net/ssh/authentication/methods/publickey.rb
|
41
|
-
- lib/net/ssh/authentication/pageant.rb
|
42
|
-
- lib/net/ssh/authentication/session.rb
|
43
|
-
- lib/net/ssh/buffer.rb
|
44
|
-
- lib/net/ssh/buffered_io.rb
|
45
|
-
- lib/net/ssh/config.rb
|
46
|
-
- lib/net/ssh/connection/channel.rb
|
47
|
-
- lib/net/ssh/connection/constants.rb
|
48
|
-
- lib/net/ssh/connection/session.rb
|
49
|
-
- lib/net/ssh/connection/term.rb
|
50
|
-
- lib/net/ssh/errors.rb
|
51
|
-
- lib/net/ssh/key_factory.rb
|
52
|
-
- lib/net/ssh/known_hosts.rb
|
53
|
-
- lib/net/ssh/loggable.rb
|
54
|
-
- lib/net/ssh/packet.rb
|
55
|
-
- lib/net/ssh/prompt.rb
|
56
|
-
- lib/net/ssh/proxy/errors.rb
|
57
|
-
- lib/net/ssh/proxy/http.rb
|
58
|
-
- lib/net/ssh/proxy/socks4.rb
|
59
|
-
- lib/net/ssh/proxy/socks5.rb
|
60
|
-
- lib/net/ssh/ruby_compat.rb
|
61
|
-
- lib/net/ssh/service/forward.rb
|
62
|
-
- lib/net/ssh/test/channel.rb
|
63
|
-
- lib/net/ssh/test/extensions.rb
|
64
|
-
- lib/net/ssh/test/kex.rb
|
65
|
-
- lib/net/ssh/test/local_packet.rb
|
66
|
-
- lib/net/ssh/test/packet.rb
|
67
|
-
- lib/net/ssh/test/remote_packet.rb
|
68
|
-
- lib/net/ssh/test/script.rb
|
69
|
-
- lib/net/ssh/test/socket.rb
|
70
|
-
- lib/net/ssh/test.rb
|
71
|
-
- lib/net/ssh/transport/algorithms.rb
|
72
|
-
- lib/net/ssh/transport/cipher_factory.rb
|
73
|
-
- lib/net/ssh/transport/constants.rb
|
74
|
-
- lib/net/ssh/transport/hmac/abstract.rb
|
75
|
-
- lib/net/ssh/transport/hmac/md5.rb
|
76
|
-
- lib/net/ssh/transport/hmac/md5_96.rb
|
77
|
-
- lib/net/ssh/transport/hmac/none.rb
|
78
|
-
- lib/net/ssh/transport/hmac/sha1.rb
|
79
|
-
- lib/net/ssh/transport/hmac/sha1_96.rb
|
80
|
-
- lib/net/ssh/transport/hmac.rb
|
81
|
-
- lib/net/ssh/transport/identity_cipher.rb
|
82
|
-
- lib/net/ssh/transport/kex/diffie_hellman_group1_sha1.rb
|
83
|
-
- lib/net/ssh/transport/kex/diffie_hellman_group_exchange_sha1.rb
|
84
|
-
- lib/net/ssh/transport/kex.rb
|
85
|
-
- lib/net/ssh/transport/openssl.rb
|
86
|
-
- lib/net/ssh/transport/packet_stream.rb
|
87
|
-
- lib/net/ssh/transport/server_version.rb
|
88
|
-
- lib/net/ssh/transport/session.rb
|
89
|
-
- lib/net/ssh/transport/state.rb
|
90
|
-
- lib/net/ssh/verifiers/lenient.rb
|
91
|
-
- lib/net/ssh/verifiers/null.rb
|
92
|
-
- lib/net/ssh/verifiers/strict.rb
|
93
|
-
- lib/net/ssh/version.rb
|
94
|
-
- lib/net/ssh.rb
|
95
26
|
- README.rdoc
|
96
27
|
- THANKS.rdoc
|
28
|
+
- CHANGELOG.rdoc
|
97
29
|
files:
|
98
30
|
- CHANGELOG.rdoc
|
31
|
+
- Manifest
|
32
|
+
- README.rdoc
|
33
|
+
- Rakefile
|
34
|
+
- Rudyfile
|
35
|
+
- THANKS.rdoc
|
36
|
+
- lib/net/ssh.rb
|
99
37
|
- lib/net/ssh/authentication/agent.rb
|
100
38
|
- lib/net/ssh/authentication/constants.rb
|
101
39
|
- lib/net/ssh/authentication/key_manager.rb
|
@@ -125,6 +63,7 @@ files:
|
|
125
63
|
- lib/net/ssh/proxy/socks5.rb
|
126
64
|
- lib/net/ssh/ruby_compat.rb
|
127
65
|
- lib/net/ssh/service/forward.rb
|
66
|
+
- lib/net/ssh/test.rb
|
128
67
|
- lib/net/ssh/test/channel.rb
|
129
68
|
- lib/net/ssh/test/extensions.rb
|
130
69
|
- lib/net/ssh/test/kex.rb
|
@@ -133,21 +72,20 @@ files:
|
|
133
72
|
- lib/net/ssh/test/remote_packet.rb
|
134
73
|
- lib/net/ssh/test/script.rb
|
135
74
|
- lib/net/ssh/test/socket.rb
|
136
|
-
- lib/net/ssh/test.rb
|
137
75
|
- lib/net/ssh/transport/algorithms.rb
|
138
76
|
- lib/net/ssh/transport/cipher_factory.rb
|
139
77
|
- lib/net/ssh/transport/constants.rb
|
78
|
+
- lib/net/ssh/transport/hmac.rb
|
140
79
|
- lib/net/ssh/transport/hmac/abstract.rb
|
141
80
|
- lib/net/ssh/transport/hmac/md5.rb
|
142
81
|
- lib/net/ssh/transport/hmac/md5_96.rb
|
143
82
|
- lib/net/ssh/transport/hmac/none.rb
|
144
83
|
- lib/net/ssh/transport/hmac/sha1.rb
|
145
84
|
- lib/net/ssh/transport/hmac/sha1_96.rb
|
146
|
-
- lib/net/ssh/transport/hmac.rb
|
147
85
|
- lib/net/ssh/transport/identity_cipher.rb
|
86
|
+
- lib/net/ssh/transport/kex.rb
|
148
87
|
- lib/net/ssh/transport/kex/diffie_hellman_group1_sha1.rb
|
149
88
|
- lib/net/ssh/transport/kex/diffie_hellman_group_exchange_sha1.rb
|
150
|
-
- lib/net/ssh/transport/kex.rb
|
151
89
|
- lib/net/ssh/transport/openssl.rb
|
152
90
|
- lib/net/ssh/transport/packet_stream.rb
|
153
91
|
- lib/net/ssh/transport/server_version.rb
|
@@ -157,12 +95,9 @@ files:
|
|
157
95
|
- lib/net/ssh/verifiers/null.rb
|
158
96
|
- lib/net/ssh/verifiers/strict.rb
|
159
97
|
- lib/net/ssh/version.rb
|
160
|
-
- lib/net/ssh.rb
|
161
|
-
- Manifest
|
162
98
|
- net-ssh.gemspec
|
163
|
-
- Rakefile
|
164
|
-
- README.rdoc
|
165
99
|
- setup.rb
|
100
|
+
- support/arcfour_check.rb
|
166
101
|
- test/authentication/methods/common.rb
|
167
102
|
- test/authentication/methods/test_abstract.rb
|
168
103
|
- test/authentication/methods/test_hostbased.rb
|
@@ -175,6 +110,7 @@ files:
|
|
175
110
|
- test/common.rb
|
176
111
|
- test/configs/eqsign
|
177
112
|
- test/configs/exact_match
|
113
|
+
- test/configs/multihost
|
178
114
|
- test/configs/wild_cards
|
179
115
|
- test/connection/test_channel.rb
|
180
116
|
- test/connection/test_session.rb
|
@@ -198,15 +134,15 @@ files:
|
|
198
134
|
- test/transport/test_server_version.rb
|
199
135
|
- test/transport/test_session.rb
|
200
136
|
- test/transport/test_state.rb
|
201
|
-
- THANKS.rdoc
|
202
137
|
has_rdoc: true
|
203
|
-
homepage: http://
|
138
|
+
homepage: http://rubyforge.org/projects/net-ssh/
|
139
|
+
licenses: []
|
140
|
+
|
204
141
|
post_install_message:
|
205
142
|
rdoc_options:
|
206
143
|
- --line-numbers
|
207
|
-
- --inline-source
|
208
144
|
- --title
|
209
|
-
- Net-
|
145
|
+
- "Net::SSH: a pure-Ruby implementation of the SSH2 client protocol."
|
210
146
|
- --main
|
211
147
|
- README.rdoc
|
212
148
|
require_paths:
|
@@ -221,14 +157,14 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
221
157
|
requirements:
|
222
158
|
- - ">="
|
223
159
|
- !ruby/object:Gem::Version
|
224
|
-
version: "
|
160
|
+
version: "0"
|
225
161
|
version:
|
226
162
|
requirements: []
|
227
163
|
|
228
164
|
rubyforge_project: net-ssh
|
229
|
-
rubygems_version: 1.2
|
165
|
+
rubygems_version: 1.3.2
|
230
166
|
signing_key:
|
231
|
-
specification_version:
|
232
|
-
summary: a pure-Ruby implementation of the SSH2 client protocol
|
233
|
-
test_files:
|
234
|
-
|
167
|
+
specification_version: 3
|
168
|
+
summary: "Net::SSH: a pure-Ruby implementation of the SSH2 client protocol."
|
169
|
+
test_files: []
|
170
|
+
|