net-ssh 1.1.4 → 2.0.0
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 +37 -0
- data/Manifest +101 -0
- data/README.rdoc +110 -0
- data/Rakefile +26 -0
- data/{THANKS → THANKS.rdoc} +2 -5
- data/lib/net/ssh.rb +189 -57
- data/lib/net/ssh/authentication/agent.rb +175 -0
- data/lib/net/ssh/authentication/constants.rb +18 -0
- data/lib/net/ssh/authentication/key_manager.rb +166 -0
- data/lib/net/ssh/authentication/methods/abstract.rb +60 -0
- data/lib/net/ssh/authentication/methods/hostbased.rb +71 -0
- data/lib/net/ssh/authentication/methods/keyboard_interactive.rb +66 -0
- data/lib/net/ssh/authentication/methods/password.rb +39 -0
- data/lib/net/ssh/authentication/methods/publickey.rb +92 -0
- data/lib/net/ssh/authentication/pageant.rb +176 -0
- data/lib/net/ssh/authentication/session.rb +116 -0
- data/lib/net/ssh/buffer.rb +339 -0
- data/lib/net/ssh/buffered_io.rb +149 -0
- data/lib/net/ssh/config.rb +173 -0
- data/lib/net/ssh/connection/channel.rb +575 -454
- data/lib/net/ssh/connection/constants.rb +31 -45
- data/lib/net/ssh/connection/session.rb +569 -0
- data/lib/net/ssh/connection/term.rb +176 -88
- data/lib/net/ssh/errors.rb +83 -61
- data/lib/net/ssh/key_factory.rb +85 -0
- data/lib/net/ssh/known_hosts.rb +129 -0
- data/lib/net/ssh/loggable.rb +61 -0
- data/lib/net/ssh/packet.rb +102 -0
- data/lib/net/ssh/prompt.rb +93 -0
- data/lib/net/ssh/proxy/errors.rb +8 -28
- data/lib/net/ssh/proxy/http.rb +75 -107
- data/lib/net/ssh/proxy/socks4.rb +35 -48
- data/lib/net/ssh/proxy/socks5.rb +76 -108
- data/lib/net/ssh/service/forward.rb +267 -0
- data/lib/net/ssh/test.rb +89 -0
- data/lib/net/ssh/test/channel.rb +129 -0
- data/lib/net/ssh/test/extensions.rb +152 -0
- data/lib/net/ssh/test/kex.rb +44 -0
- data/lib/net/ssh/test/local_packet.rb +51 -0
- data/lib/net/ssh/test/packet.rb +81 -0
- data/lib/net/ssh/test/remote_packet.rb +38 -0
- data/lib/net/ssh/test/script.rb +157 -0
- data/lib/net/ssh/test/socket.rb +59 -0
- data/lib/net/ssh/transport/algorithms.rb +384 -0
- data/lib/net/ssh/transport/cipher_factory.rb +72 -0
- data/lib/net/ssh/transport/constants.rb +22 -58
- data/lib/net/ssh/transport/hmac.rb +31 -0
- data/lib/net/ssh/transport/hmac/abstract.rb +48 -0
- data/lib/net/ssh/transport/hmac/md5.rb +12 -0
- data/lib/net/ssh/transport/hmac/md5_96.rb +11 -0
- data/lib/net/ssh/transport/hmac/none.rb +15 -0
- data/lib/net/ssh/transport/hmac/sha1.rb +13 -0
- data/lib/net/ssh/transport/hmac/sha1_96.rb +11 -0
- data/lib/net/ssh/transport/identity_cipher.rb +40 -0
- data/lib/net/ssh/transport/kex.rb +13 -0
- data/lib/net/ssh/transport/kex/diffie_hellman_group1_sha1.rb +208 -0
- data/lib/net/ssh/transport/kex/diffie_hellman_group_exchange_sha1.rb +77 -0
- data/lib/net/ssh/{util → transport}/openssl.rb +22 -40
- data/lib/net/ssh/transport/packet_stream.rb +230 -0
- data/lib/net/ssh/transport/server_version.rb +61 -0
- data/lib/net/ssh/transport/session.rb +225 -303
- data/lib/net/ssh/transport/state.rb +170 -0
- data/lib/net/ssh/verifiers/lenient.rb +30 -0
- data/lib/net/ssh/verifiers/null.rb +12 -0
- data/lib/net/ssh/verifiers/strict.rb +53 -0
- data/lib/net/ssh/version.rb +57 -26
- data/net-ssh.gemspec +54 -0
- data/setup.rb +1585 -0
- data/test/authentication/methods/common.rb +28 -0
- data/test/authentication/methods/test_abstract.rb +51 -0
- data/test/authentication/methods/test_hostbased.rb +108 -0
- data/test/authentication/methods/test_keyboard_interactive.rb +98 -0
- data/test/authentication/methods/test_password.rb +50 -0
- data/test/authentication/methods/test_publickey.rb +123 -0
- data/test/authentication/test_agent.rb +205 -0
- data/test/authentication/test_key_manager.rb +100 -0
- data/test/authentication/test_session.rb +93 -0
- data/test/common.rb +106 -0
- data/test/configs/exact_match +8 -0
- data/test/configs/wild_cards +14 -0
- data/test/connection/test_channel.rb +452 -0
- data/test/connection/test_session.rb +483 -0
- data/test/test_all.rb +6 -0
- data/test/test_buffer.rb +336 -0
- data/test/test_buffered_io.rb +63 -0
- data/test/test_config.rb +78 -0
- data/test/test_key_factory.rb +67 -0
- data/test/transport/hmac/test_md5.rb +34 -0
- data/test/transport/hmac/test_md5_96.rb +25 -0
- data/test/transport/hmac/test_none.rb +34 -0
- data/test/transport/hmac/test_sha1.rb +34 -0
- data/test/transport/hmac/test_sha1_96.rb +25 -0
- data/test/transport/kex/test_diffie_hellman_group1_sha1.rb +146 -0
- data/test/transport/kex/test_diffie_hellman_group_exchange_sha1.rb +92 -0
- data/test/transport/test_algorithms.rb +302 -0
- data/test/transport/test_cipher_factory.rb +163 -0
- data/test/transport/test_hmac.rb +34 -0
- data/test/transport/test_identity_cipher.rb +40 -0
- data/test/transport/test_packet_stream.rb +433 -0
- data/test/transport/test_server_version.rb +55 -0
- data/test/transport/test_session.rb +312 -0
- data/test/transport/test_state.rb +173 -0
- metadata +102 -253
- data/ChangeLog +0 -560
- data/LICENSE +0 -7
- data/NEWS +0 -152
- data/README +0 -14
- data/bin/rb-keygen +0 -210
- data/doc/LICENSE-BSD +0 -27
- data/doc/LICENSE-GPL +0 -280
- data/doc/LICENSE-RUBY +0 -56
- data/doc/manual-html/chapter-1.html +0 -388
- data/doc/manual-html/chapter-2.html +0 -552
- data/doc/manual-html/chapter-3.html +0 -470
- data/doc/manual-html/chapter-4.html +0 -413
- data/doc/manual-html/chapter-5.html +0 -525
- data/doc/manual-html/chapter-6.html +0 -456
- data/doc/manual-html/chapter-7.html +0 -343
- data/doc/manual-html/index.html +0 -235
- data/doc/manual-html/stylesheets/manual.css +0 -270
- data/doc/manual-html/stylesheets/ruby.css +0 -17
- data/doc/manual/chapter.erb +0 -38
- data/doc/manual/example.erb +0 -18
- data/doc/manual/index.erb +0 -29
- data/doc/manual/manual.rb +0 -311
- data/doc/manual/manual.yml +0 -73
- data/doc/manual/page.erb +0 -87
- data/doc/manual/parts/0000.txt +0 -5
- data/doc/manual/parts/0001.txt +0 -3
- data/doc/manual/parts/0002.txt +0 -40
- data/doc/manual/parts/0003.txt +0 -6
- data/doc/manual/parts/0004.txt +0 -7
- data/doc/manual/parts/0005.txt +0 -1
- data/doc/manual/parts/0006.txt +0 -49
- data/doc/manual/parts/0007.txt +0 -67
- data/doc/manual/parts/0008.txt +0 -43
- data/doc/manual/parts/0009.txt +0 -14
- data/doc/manual/parts/0010.txt +0 -7
- data/doc/manual/parts/0011.txt +0 -14
- data/doc/manual/parts/0012.txt +0 -3
- data/doc/manual/parts/0013.txt +0 -20
- data/doc/manual/parts/0014.txt +0 -32
- data/doc/manual/parts/0015.txt +0 -14
- data/doc/manual/parts/0016.txt +0 -28
- data/doc/manual/parts/0017.txt +0 -50
- data/doc/manual/parts/0018.txt +0 -35
- data/doc/manual/parts/0019.txt +0 -7
- data/doc/manual/parts/0020.txt +0 -72
- data/doc/manual/parts/0021.txt +0 -50
- data/doc/manual/parts/0022.txt +0 -42
- data/doc/manual/parts/0023.txt +0 -51
- data/doc/manual/parts/0024.txt +0 -18
- data/doc/manual/parts/0025.txt +0 -18
- data/doc/manual/parts/0026.txt +0 -15
- data/doc/manual/parts/0027.txt +0 -37
- data/doc/manual/parts/0028.txt +0 -16
- data/doc/manual/parts/0029.txt +0 -1
- data/doc/manual/parts/0030.txt +0 -52
- data/doc/manual/parts/0031.txt +0 -25
- data/doc/manual/stylesheets/manual.css +0 -270
- data/doc/manual/stylesheets/ruby.css +0 -17
- data/doc/manual/tutorial.erb +0 -30
- data/examples/auth-forward.rb +0 -41
- data/examples/channel-demo.rb +0 -81
- data/examples/port-forward.rb +0 -51
- data/examples/process-demo.rb +0 -91
- data/examples/remote-net-port-forward.rb +0 -45
- data/examples/remote-port-forward.rb +0 -80
- data/examples/shell-demo.rb +0 -46
- data/examples/ssh-client.rb +0 -67
- data/examples/sync-shell-demo.rb +0 -69
- data/examples/tail-demo.rb +0 -49
- data/lib/net/ssh/connection/driver.rb +0 -446
- data/lib/net/ssh/connection/services.rb +0 -72
- data/lib/net/ssh/host-key-verifier.rb +0 -52
- data/lib/net/ssh/known-hosts.rb +0 -96
- data/lib/net/ssh/lenient-host-key-verifier.rb +0 -25
- data/lib/net/ssh/null-host-key-verifier.rb +0 -14
- data/lib/net/ssh/service/agentforward/driver.rb +0 -78
- data/lib/net/ssh/service/agentforward/services.rb +0 -41
- data/lib/net/ssh/service/forward/driver.rb +0 -319
- data/lib/net/ssh/service/forward/local-network-handler.rb +0 -71
- data/lib/net/ssh/service/forward/remote-network-handler.rb +0 -83
- data/lib/net/ssh/service/forward/services.rb +0 -76
- data/lib/net/ssh/service/process/driver.rb +0 -153
- data/lib/net/ssh/service/process/open.rb +0 -193
- data/lib/net/ssh/service/process/popen3.rb +0 -178
- data/lib/net/ssh/service/process/services.rb +0 -66
- data/lib/net/ssh/service/services.rb +0 -60
- data/lib/net/ssh/service/shell/driver.rb +0 -86
- data/lib/net/ssh/service/shell/services.rb +0 -54
- data/lib/net/ssh/service/shell/shell.rb +0 -222
- data/lib/net/ssh/service/shell/sync.rb +0 -114
- data/lib/net/ssh/session.rb +0 -305
- data/lib/net/ssh/transport/algorithm-negotiator.rb +0 -275
- data/lib/net/ssh/transport/compress/compressor.rb +0 -53
- data/lib/net/ssh/transport/compress/decompressor.rb +0 -53
- data/lib/net/ssh/transport/compress/none-compressor.rb +0 -39
- data/lib/net/ssh/transport/compress/none-decompressor.rb +0 -39
- data/lib/net/ssh/transport/compress/services.rb +0 -68
- data/lib/net/ssh/transport/compress/zlib-compressor.rb +0 -60
- data/lib/net/ssh/transport/compress/zlib-decompressor.rb +0 -52
- data/lib/net/ssh/transport/errors.rb +0 -47
- data/lib/net/ssh/transport/identity-cipher.rb +0 -61
- data/lib/net/ssh/transport/kex/dh-gex.rb +0 -106
- data/lib/net/ssh/transport/kex/dh.rb +0 -249
- data/lib/net/ssh/transport/kex/services.rb +0 -62
- data/lib/net/ssh/transport/ossl/buffer-factory.rb +0 -52
- data/lib/net/ssh/transport/ossl/buffer.rb +0 -87
- data/lib/net/ssh/transport/ossl/cipher-factory.rb +0 -98
- data/lib/net/ssh/transport/ossl/digest-factory.rb +0 -51
- data/lib/net/ssh/transport/ossl/hmac-factory.rb +0 -71
- data/lib/net/ssh/transport/ossl/hmac/hmac.rb +0 -62
- data/lib/net/ssh/transport/ossl/hmac/md5-96.rb +0 -44
- data/lib/net/ssh/transport/ossl/hmac/md5.rb +0 -46
- data/lib/net/ssh/transport/ossl/hmac/none.rb +0 -46
- data/lib/net/ssh/transport/ossl/hmac/services.rb +0 -68
- data/lib/net/ssh/transport/ossl/hmac/sha1-96.rb +0 -44
- data/lib/net/ssh/transport/ossl/hmac/sha1.rb +0 -45
- data/lib/net/ssh/transport/ossl/key-factory.rb +0 -116
- data/lib/net/ssh/transport/ossl/services.rb +0 -149
- data/lib/net/ssh/transport/packet-stream.rb +0 -236
- data/lib/net/ssh/transport/services.rb +0 -146
- data/lib/net/ssh/transport/version-negotiator.rb +0 -73
- data/lib/net/ssh/userauth/agent.rb +0 -222
- data/lib/net/ssh/userauth/constants.rb +0 -35
- data/lib/net/ssh/userauth/driver.rb +0 -183
- data/lib/net/ssh/userauth/methods/hostbased.rb +0 -119
- data/lib/net/ssh/userauth/methods/keyboard-interactive.rb +0 -104
- data/lib/net/ssh/userauth/methods/password.rb +0 -70
- data/lib/net/ssh/userauth/methods/publickey.rb +0 -137
- data/lib/net/ssh/userauth/methods/services.rb +0 -90
- data/lib/net/ssh/userauth/pageant.rb +0 -197
- data/lib/net/ssh/userauth/services.rb +0 -141
- data/lib/net/ssh/userauth/userkeys.rb +0 -258
- data/lib/net/ssh/util/buffer.rb +0 -274
- data/lib/net/ssh/util/prompter.rb +0 -73
- data/test/ALL-TESTS.rb +0 -18
- data/test/connection/tc_channel.rb +0 -136
- data/test/connection/tc_driver.rb +0 -287
- data/test/connection/tc_integration.rb +0 -87
- data/test/proxy/tc_http.rb +0 -209
- data/test/proxy/tc_socks4.rb +0 -148
- data/test/proxy/tc_socks5.rb +0 -214
- data/test/service/agentforward/tc_driver.rb +0 -138
- data/test/service/forward/tc_driver.rb +0 -289
- data/test/service/forward/tc_local_network_handler.rb +0 -123
- data/test/service/forward/tc_remote_network_handler.rb +0 -111
- data/test/service/process/tc_driver.rb +0 -79
- data/test/service/process/tc_integration.rb +0 -119
- data/test/service/process/tc_open.rb +0 -179
- data/test/service/process/tc_popen3.rb +0 -164
- data/test/tc_integration.rb +0 -80
- data/test/transport/compress/tc_none_compress.rb +0 -41
- data/test/transport/compress/tc_none_decompress.rb +0 -45
- data/test/transport/compress/tc_zlib_compress.rb +0 -61
- data/test/transport/compress/tc_zlib_decompress.rb +0 -48
- data/test/transport/kex/tc_dh.rb +0 -312
- data/test/transport/kex/tc_dh_gex.rb +0 -71
- data/test/transport/ossl/fixtures/dsa-encrypted +0 -15
- data/test/transport/ossl/fixtures/dsa-encrypted-bad +0 -15
- data/test/transport/ossl/fixtures/dsa-unencrypted +0 -12
- data/test/transport/ossl/fixtures/dsa-unencrypted-bad +0 -12
- data/test/transport/ossl/fixtures/dsa-unencrypted.pub +0 -1
- data/test/transport/ossl/fixtures/not-a-private-key +0 -4
- data/test/transport/ossl/fixtures/not-supported +0 -2
- data/test/transport/ossl/fixtures/rsa-encrypted +0 -18
- data/test/transport/ossl/fixtures/rsa-encrypted-bad +0 -18
- data/test/transport/ossl/fixtures/rsa-unencrypted +0 -15
- data/test/transport/ossl/fixtures/rsa-unencrypted-bad +0 -15
- data/test/transport/ossl/fixtures/rsa-unencrypted.pub +0 -1
- data/test/transport/ossl/hmac/tc_hmac.rb +0 -58
- data/test/transport/ossl/hmac/tc_md5.rb +0 -50
- data/test/transport/ossl/hmac/tc_md5_96.rb +0 -50
- data/test/transport/ossl/hmac/tc_none.rb +0 -50
- data/test/transport/ossl/hmac/tc_sha1.rb +0 -50
- data/test/transport/ossl/hmac/tc_sha1_96.rb +0 -50
- data/test/transport/ossl/tc_buffer.rb +0 -97
- data/test/transport/ossl/tc_buffer_factory.rb +0 -67
- data/test/transport/ossl/tc_cipher_factory.rb +0 -84
- data/test/transport/ossl/tc_digest_factory.rb +0 -39
- data/test/transport/ossl/tc_hmac_factory.rb +0 -72
- data/test/transport/ossl/tc_key_factory.rb +0 -199
- data/test/transport/tc_algorithm_negotiator.rb +0 -170
- data/test/transport/tc_identity_cipher.rb +0 -52
- data/test/transport/tc_integration.rb +0 -115
- data/test/transport/tc_packet_stream.rb +0 -184
- data/test/transport/tc_session.rb +0 -296
- data/test/transport/tc_version_negotiator.rb +0 -86
- data/test/userauth/methods/tc_hostbased.rb +0 -136
- data/test/userauth/methods/tc_password.rb +0 -89
- data/test/userauth/methods/tc_publickey.rb +0 -167
- data/test/userauth/tc_agent.rb +0 -223
- data/test/userauth/tc_driver.rb +0 -190
- data/test/userauth/tc_integration.rb +0 -97
- data/test/userauth/tc_userkeys.rb +0 -265
- data/test/util/tc_buffer.rb +0 -217
@@ -1,170 +0,0 @@
|
|
1
|
-
#--
|
2
|
-
# =============================================================================
|
3
|
-
# Copyright (c) 2004,2005 Jamis Buck (jamis@37signals.com)
|
4
|
-
# All rights reserved.
|
5
|
-
#
|
6
|
-
# This source file is distributed as part of the Net::SSH Secure Shell Client
|
7
|
-
# library for Ruby. This file (and the library as a whole) may be used only as
|
8
|
-
# allowed by either the BSD license, or the Ruby license (or, by association
|
9
|
-
# with the Ruby license, the GPL). See the "doc" subdirectory of the Net::SSH
|
10
|
-
# distribution for the texts of these licenses.
|
11
|
-
# -----------------------------------------------------------------------------
|
12
|
-
# net-ssh website : http://net-ssh.rubyforge.org
|
13
|
-
# project website: http://rubyforge.org/projects/net-ssh
|
14
|
-
# =============================================================================
|
15
|
-
#++
|
16
|
-
|
17
|
-
$:.unshift "#{File.dirname(__FILE__)}/../../lib"
|
18
|
-
|
19
|
-
require 'net/ssh/transport/algorithm-negotiator'
|
20
|
-
require 'net/ssh/transport/constants'
|
21
|
-
require 'net/ssh/util/buffer'
|
22
|
-
require 'test/unit'
|
23
|
-
|
24
|
-
class TC_AlgorithmNegotiator < Test::Unit::TestCase
|
25
|
-
include Net::SSH::Transport::Constants
|
26
|
-
|
27
|
-
class MockLogger; def debug?; false; end; end
|
28
|
-
|
29
|
-
class Buffers
|
30
|
-
def writer
|
31
|
-
Net::SSH::Util::WriterBuffer.new
|
32
|
-
end
|
33
|
-
end
|
34
|
-
|
35
|
-
class ScriptedSession
|
36
|
-
attr_reader :messages
|
37
|
-
attr_reader :host, :port
|
38
|
-
|
39
|
-
def initialize( *script )
|
40
|
-
@script = script
|
41
|
-
@messages = []
|
42
|
-
end
|
43
|
-
|
44
|
-
def wait_for_message
|
45
|
-
@script.shift
|
46
|
-
end
|
47
|
-
|
48
|
-
def send_message( msg )
|
49
|
-
@messages << msg.to_s
|
50
|
-
end
|
51
|
-
end
|
52
|
-
|
53
|
-
ALGORITHMS = {
|
54
|
-
:host_key => [ "A", "B" ],
|
55
|
-
:kex => [ "C", "D" ],
|
56
|
-
:encryption => [ "E", "F" ],
|
57
|
-
:hmac => [ "G", "H" ],
|
58
|
-
:compression => [ "I", "J" ],
|
59
|
-
:languages => [ "K", "L" ],
|
60
|
-
}
|
61
|
-
|
62
|
-
def reader( text )
|
63
|
-
Net::SSH::Util::ReaderBuffer.new( text )
|
64
|
-
end
|
65
|
-
|
66
|
-
def setup
|
67
|
-
logger = MockLogger.new
|
68
|
-
buffers = Buffers.new
|
69
|
-
@negotiator = Net::SSH::Transport::AlgorithmNegotiator.new( logger, ALGORITHMS, buffers )
|
70
|
-
end
|
71
|
-
|
72
|
-
def test_no_kexinit
|
73
|
-
session = ScriptedSession.new( [ -1, reader("") ] )
|
74
|
-
assert_raise( Net::SSH::Exception ) do
|
75
|
-
@negotiator.negotiate( session, {} )
|
76
|
-
end
|
77
|
-
end
|
78
|
-
|
79
|
-
def test_simple_exchange
|
80
|
-
session = ScriptedSession.new(
|
81
|
-
[ KEXINIT,
|
82
|
-
reader("1234567890123456" +
|
83
|
-
"\0\0\0\3C,D" +
|
84
|
-
"\0\0\0\3A,B" +
|
85
|
-
"\0\0\0\3E,F\0\0\0\3E,F" +
|
86
|
-
"\0\0\0\3G,H\0\0\0\3G,H" +
|
87
|
-
"\0\0\0\3I,J\0\0\0\3I,J" +
|
88
|
-
"\0\0\0\0\0\0\0\0\0\0\0\0\0") ]
|
89
|
-
)
|
90
|
-
|
91
|
-
result = @negotiator.negotiate( session, {} )
|
92
|
-
|
93
|
-
assert_equal "C", result.kex
|
94
|
-
assert_equal "A", result.host_key
|
95
|
-
assert_equal "E", result.encryption_c2s
|
96
|
-
assert_equal "E", result.encryption_s2c
|
97
|
-
assert_equal "G", result.mac_c2s
|
98
|
-
assert_equal "G", result.mac_s2c
|
99
|
-
assert_equal "I", result.compression_c2s
|
100
|
-
assert_equal "I", result.compression_s2c
|
101
|
-
assert_equal "", result.language_c2s
|
102
|
-
assert_equal "", result.language_s2c
|
103
|
-
|
104
|
-
assert_equal "1234567890123456\0\0\0\3C,D\0\0\0\3A,B\0\0\0\3E,F\0\0\0\3E,F\0\0\0\3G,H\0\0\0\3G,H\0\0\0\3I,J\0\0\0\3I,J\0\0\0\0\0\0\0\0\0\0\0\0\0", result.server_packet
|
105
|
-
assert_equal "\0\0\0\3C,D\0\0\0\3A,B\0\0\0\3E,F\0\0\0\3E,F\0\0\0\3G,H\0\0\0\3G,H\0\0\0\3I,J\0\0\0\3I,J\0\0\0\3K,L\0\0\0\3K,L\0\0\0\0\0", result.client_packet[17..-1]
|
106
|
-
end
|
107
|
-
|
108
|
-
def test_custom_exchange
|
109
|
-
session = ScriptedSession.new(
|
110
|
-
[ KEXINIT,
|
111
|
-
reader("1234567890123456" +
|
112
|
-
"\0\0\0\3C,D" +
|
113
|
-
"\0\0\0\3A,B" +
|
114
|
-
"\0\0\0\3E,F\0\0\0\3E,F" +
|
115
|
-
"\0\0\0\3G,H\0\0\0\3G,H" +
|
116
|
-
"\0\0\0\3I,J\0\0\0\3I,J" +
|
117
|
-
"\0\0\0\0\0\0\0\0\0\0\0\0\0") ]
|
118
|
-
)
|
119
|
-
|
120
|
-
result = @negotiator.negotiate( session,
|
121
|
-
:kex => "D",
|
122
|
-
:host_key => [ "B", "A" ] )
|
123
|
-
|
124
|
-
assert_equal "D", result.kex
|
125
|
-
assert_equal "B", result.host_key
|
126
|
-
assert_equal "E", result.encryption_c2s
|
127
|
-
assert_equal "E", result.encryption_s2c
|
128
|
-
assert_equal "G", result.mac_c2s
|
129
|
-
assert_equal "G", result.mac_s2c
|
130
|
-
assert_equal "I", result.compression_c2s
|
131
|
-
assert_equal "I", result.compression_s2c
|
132
|
-
assert_equal "", result.language_c2s
|
133
|
-
assert_equal "", result.language_s2c
|
134
|
-
end
|
135
|
-
|
136
|
-
def test_bad_algorithm
|
137
|
-
session = ScriptedSession.new(
|
138
|
-
[ KEXINIT,
|
139
|
-
reader("1234567890123456" +
|
140
|
-
"\0\0\0\3C,D" +
|
141
|
-
"\0\0\0\3A,B" +
|
142
|
-
"\0\0\0\3E,F\0\0\0\3E,F" +
|
143
|
-
"\0\0\0\3G,H\0\0\0\3G,H" +
|
144
|
-
"\0\0\0\3I,J\0\0\0\3I,J" +
|
145
|
-
"\0\0\0\0\0\0\0\0\0\0\0\0\0") ]
|
146
|
-
)
|
147
|
-
|
148
|
-
assert_raise( NotImplementedError ) do
|
149
|
-
@negotiator.negotiate( session, :kex => "K" )
|
150
|
-
end
|
151
|
-
end
|
152
|
-
|
153
|
-
def test_no_agree
|
154
|
-
session = ScriptedSession.new(
|
155
|
-
[ KEXINIT,
|
156
|
-
reader("1234567890123456" +
|
157
|
-
"\0\0\0\3C,D" +
|
158
|
-
"\0\0\0\3M,N" +
|
159
|
-
"\0\0\0\3E,F\0\0\0\3E,F" +
|
160
|
-
"\0\0\0\3G,H\0\0\0\3G,H" +
|
161
|
-
"\0\0\0\3I,J\0\0\0\3I,J" +
|
162
|
-
"\0\0\0\0\0\0\0\0\0\0\0\0\0") ]
|
163
|
-
)
|
164
|
-
|
165
|
-
assert_raise( Net::SSH::Exception ) do
|
166
|
-
@negotiator.negotiate( session, {} )
|
167
|
-
end
|
168
|
-
end
|
169
|
-
|
170
|
-
end
|
@@ -1,52 +0,0 @@
|
|
1
|
-
#--
|
2
|
-
# =============================================================================
|
3
|
-
# Copyright (c) 2004,2005 Jamis Buck (jamis@37signals.com)
|
4
|
-
# All rights reserved.
|
5
|
-
#
|
6
|
-
# This source file is distributed as part of the Net::SSH Secure Shell Client
|
7
|
-
# library for Ruby. This file (and the library as a whole) may be used only as
|
8
|
-
# allowed by either the BSD license, or the Ruby license (or, by association
|
9
|
-
# with the Ruby license, the GPL). See the "doc" subdirectory of the Net::SSH
|
10
|
-
# distribution for the texts of these licenses.
|
11
|
-
# -----------------------------------------------------------------------------
|
12
|
-
# net-ssh website : http://net-ssh.rubyforge.org
|
13
|
-
# project website: http://rubyforge.org/projects/net-ssh
|
14
|
-
# =============================================================================
|
15
|
-
#++
|
16
|
-
|
17
|
-
$:.unshift "#{File.dirname(__FILE__)}/../../lib"
|
18
|
-
|
19
|
-
require 'net/ssh/transport/identity-cipher'
|
20
|
-
require 'test/unit'
|
21
|
-
|
22
|
-
class TC_IdentityCipher < Test::Unit::TestCase
|
23
|
-
|
24
|
-
def setup
|
25
|
-
@cipher = Net::SSH::Transport::IdentityCipher.new
|
26
|
-
end
|
27
|
-
|
28
|
-
def test_block_size
|
29
|
-
assert_equal 8, @cipher.block_size
|
30
|
-
end
|
31
|
-
|
32
|
-
def test_encrypt
|
33
|
-
@cipher.encrypt
|
34
|
-
text = @cipher.update( "value1" )
|
35
|
-
text << @cipher.update( "value2" )
|
36
|
-
text << @cipher.final
|
37
|
-
assert_equal text, "value1value2"
|
38
|
-
end
|
39
|
-
|
40
|
-
def test_decrypt
|
41
|
-
@cipher.decrypt
|
42
|
-
text = @cipher.update( "value1" )
|
43
|
-
text << @cipher.update( "value2" )
|
44
|
-
text << @cipher.final
|
45
|
-
assert_equal text, "value1value2"
|
46
|
-
end
|
47
|
-
|
48
|
-
def test_name
|
49
|
-
assert_equal "identity", @cipher.name
|
50
|
-
end
|
51
|
-
|
52
|
-
end
|
@@ -1,115 +0,0 @@
|
|
1
|
-
#--
|
2
|
-
# =============================================================================
|
3
|
-
# Copyright (c) 2004,2005 Jamis Buck (jamis@37signals.com)
|
4
|
-
# All rights reserved.
|
5
|
-
#
|
6
|
-
# This source file is distributed as part of the Net::SSH Secure Shell Client
|
7
|
-
# library for Ruby. This file (and the library as a whole) may be used only as
|
8
|
-
# allowed by either the BSD license, or the Ruby license (or, by association
|
9
|
-
# with the Ruby license, the GPL). See the "doc" subdirectory of the Net::SSH
|
10
|
-
# distribution for the texts of these licenses.
|
11
|
-
# -----------------------------------------------------------------------------
|
12
|
-
# net-ssh website : http://net-ssh.rubyforge.org
|
13
|
-
# project website: http://rubyforge.org/projects/net-ssh
|
14
|
-
# =============================================================================
|
15
|
-
#++
|
16
|
-
|
17
|
-
$:.unshift "#{File.dirname(__FILE__)}/../../lib"
|
18
|
-
|
19
|
-
if $run_integration_tests || __FILE__ == $0
|
20
|
-
|
21
|
-
require 'needle'
|
22
|
-
require 'net/ssh/transport/services'
|
23
|
-
require 'net/ssh/null-host-key-verifier'
|
24
|
-
require 'test/unit'
|
25
|
-
|
26
|
-
class TC_Transport_Integration < Test::Unit::TestCase
|
27
|
-
|
28
|
-
def setup
|
29
|
-
@registry = Needle::Registry.new :logs => { :device=>STDOUT, :default_level => :WARN }
|
30
|
-
@registry.define { |b| b.host_key_verifier { Net::SSH::NullHostKeyVerifier.new } }
|
31
|
-
Net::SSH::Transport.register_services( @registry )
|
32
|
-
end
|
33
|
-
|
34
|
-
def teardown
|
35
|
-
@registry.logs.close
|
36
|
-
end
|
37
|
-
|
38
|
-
backends = [ :ossl ]
|
39
|
-
keys = [ "ssh-dss", "ssh-rsa" ]
|
40
|
-
kexs = [ "diffie-hellman-group-exchange-sha1", "diffie-hellman-group1-sha1" ]
|
41
|
-
# we don't test "idea-cbc" because it is not supported by OpenSSH. OpenSSH
|
42
|
-
# will use 3des-cbc instead, which we are already testing.
|
43
|
-
encryptions = [ "3des-cbc", "aes128-cbc", "blowfish-cbc", "aes256-cbc",
|
44
|
-
"aes192-cbc" ]
|
45
|
-
hmacs = [ "hmac-md5", "hmac-sha1", "hmac-md5-96", "hmac-sha1-96" ]
|
46
|
-
# for some reason, the version of sshd I'm using locally reports the 'zlib'
|
47
|
-
# algorithm as 'zlib@openssh.com', which wreaks havoc on the code. For now,
|
48
|
-
# I'm just disabling the zlib tests.
|
49
|
-
compressions = [ "none" ] #, "zlib" ]
|
50
|
-
|
51
|
-
# keys = [ 'ssh-dss' ]
|
52
|
-
# kexs = [ 'diffie-hellman-group-exchange-sha1' ]
|
53
|
-
# encryptions = [ '3des-cbc' ]
|
54
|
-
# hmacs = [ 'hmac-md5' ]
|
55
|
-
# compressions = [ 'none' ]
|
56
|
-
|
57
|
-
backends.each do |backend|
|
58
|
-
keys.each do |key|
|
59
|
-
kexs.each do |kex|
|
60
|
-
encryptions.each do |encryption|
|
61
|
-
hmacs.each do |hmac|
|
62
|
-
compressions.each do |compression|
|
63
|
-
method_name = "test_#{backend}__#{key}__#{kex}__" +
|
64
|
-
"#{encryption}__#{hmac}__#{compression}"
|
65
|
-
method_name.gsub!( /-/, "_" )
|
66
|
-
|
67
|
-
define_method( method_name ) do
|
68
|
-
@registry.define do |b|
|
69
|
-
b.crypto_backend { backend }
|
70
|
-
b.transport_host { "test.host" }
|
71
|
-
b.transport_options do
|
72
|
-
Hash[ :host_key => key,
|
73
|
-
:kex => kex,
|
74
|
-
:encryption => encryption,
|
75
|
-
:hmac => hmac,
|
76
|
-
:compression => compression ]
|
77
|
-
end
|
78
|
-
end
|
79
|
-
|
80
|
-
session = nil
|
81
|
-
assert_nothing_raised do
|
82
|
-
session = @registry.transport.session
|
83
|
-
end
|
84
|
-
|
85
|
-
assert_equal key, session.algorithms.host_key
|
86
|
-
assert_equal kex, session.algorithms.kex
|
87
|
-
assert_equal encryption, session.algorithms.encryption_c2s
|
88
|
-
assert_equal encryption, session.algorithms.encryption_s2c
|
89
|
-
assert_equal hmac, session.algorithms.mac_c2s
|
90
|
-
assert_equal hmac, session.algorithms.mac_s2c
|
91
|
-
assert_equal compression, session.algorithms.compression_c2s
|
92
|
-
assert_equal compression, session.algorithms.compression_s2c
|
93
|
-
|
94
|
-
type = nil
|
95
|
-
assert_nothing_raised do
|
96
|
-
session.send_message(
|
97
|
-
session.class::SERVICE_REQUEST.chr +
|
98
|
-
"\0\0\0\14ssh-userauth" )
|
99
|
-
type, buffer = session.wait_for_message
|
100
|
-
end
|
101
|
-
|
102
|
-
assert_equal session.class::SERVICE_ACCEPT, type
|
103
|
-
session.close
|
104
|
-
end
|
105
|
-
|
106
|
-
end
|
107
|
-
end
|
108
|
-
end
|
109
|
-
end
|
110
|
-
end
|
111
|
-
end
|
112
|
-
|
113
|
-
end
|
114
|
-
|
115
|
-
end
|
@@ -1,184 +0,0 @@
|
|
1
|
-
#--
|
2
|
-
# =============================================================================
|
3
|
-
# Copyright (c) 2004,2005 Jamis Buck (jamis@37signals.com)
|
4
|
-
# All rights reserved.
|
5
|
-
#
|
6
|
-
# This source file is distributed as part of the Net::SSH Secure Shell Client
|
7
|
-
# library for Ruby. This file (and the library as a whole) may be used only as
|
8
|
-
# allowed by either the BSD license, or the Ruby license (or, by association
|
9
|
-
# with the Ruby license, the GPL). See the "doc" subdirectory of the Net::SSH
|
10
|
-
# distribution for the texts of these licenses.
|
11
|
-
# -----------------------------------------------------------------------------
|
12
|
-
# net-ssh website : http://net-ssh.rubyforge.org
|
13
|
-
# project website: http://rubyforge.org/projects/net-ssh
|
14
|
-
# =============================================================================
|
15
|
-
#++
|
16
|
-
|
17
|
-
$:.unshift "#{File.dirname(__FILE__)}/../../lib"
|
18
|
-
|
19
|
-
require 'net/ssh/transport/packet-stream'
|
20
|
-
require 'net/ssh/util/buffer'
|
21
|
-
require 'test/unit'
|
22
|
-
|
23
|
-
module PacketStream_Mock
|
24
|
-
class Cipher
|
25
|
-
def block_size
|
26
|
-
8
|
27
|
-
end
|
28
|
-
|
29
|
-
def update( text )
|
30
|
-
"!" + text
|
31
|
-
end
|
32
|
-
|
33
|
-
def final
|
34
|
-
"!"
|
35
|
-
end
|
36
|
-
end
|
37
|
-
|
38
|
-
class NullCipher
|
39
|
-
def block_size; 8; end
|
40
|
-
def update( text ); text; end
|
41
|
-
def final; ""; end
|
42
|
-
end
|
43
|
-
|
44
|
-
class HMAC
|
45
|
-
def mac_length
|
46
|
-
8
|
47
|
-
end
|
48
|
-
|
49
|
-
def digest( text )
|
50
|
-
text[0,mac_length]
|
51
|
-
end
|
52
|
-
end
|
53
|
-
|
54
|
-
class Compressor
|
55
|
-
def initialize( b="<", e=">" )
|
56
|
-
@b, @e = b, e
|
57
|
-
end
|
58
|
-
|
59
|
-
def compress( text )
|
60
|
-
"#{@b}#{text}#{@e}"
|
61
|
-
end
|
62
|
-
end
|
63
|
-
|
64
|
-
class Decompressor
|
65
|
-
def decompress( text )
|
66
|
-
text
|
67
|
-
end
|
68
|
-
end
|
69
|
-
|
70
|
-
class CipherFactory
|
71
|
-
def initialize( klass )
|
72
|
-
@klass = klass
|
73
|
-
end
|
74
|
-
|
75
|
-
def get( name )
|
76
|
-
raise ArgumentError, "expected \"none\", got #{name.inspect}" unless name=="none"
|
77
|
-
@klass.new
|
78
|
-
end
|
79
|
-
end
|
80
|
-
|
81
|
-
class HMACFactory
|
82
|
-
def get( name )
|
83
|
-
raise ArgumentError, "expected \"none\", got #{name.inspect}" unless name=="none"
|
84
|
-
HMAC.new
|
85
|
-
end
|
86
|
-
end
|
87
|
-
|
88
|
-
class BufferFactory
|
89
|
-
def reader( text )
|
90
|
-
Net::SSH::Util::ReaderBuffer.new( text )
|
91
|
-
end
|
92
|
-
end
|
93
|
-
|
94
|
-
class Socket
|
95
|
-
attr_reader :send_buffer
|
96
|
-
|
97
|
-
def initialize( source="" )
|
98
|
-
@send_buffer = ""
|
99
|
-
@source = source
|
100
|
-
end
|
101
|
-
|
102
|
-
def recv( bytes )
|
103
|
-
result, @source = @source[0,bytes], @source[bytes..-1]
|
104
|
-
result
|
105
|
-
end
|
106
|
-
|
107
|
-
def send( text, arg )
|
108
|
-
@send_buffer << text
|
109
|
-
text.length
|
110
|
-
end
|
111
|
-
end
|
112
|
-
|
113
|
-
Compressors = { "none" => Compressor.new }
|
114
|
-
Decompressors = { "none" => Decompressor.new }
|
115
|
-
end
|
116
|
-
|
117
|
-
class TC_OutgoingPacketStream < Test::Unit::TestCase
|
118
|
-
|
119
|
-
def setup
|
120
|
-
@stream = Net::SSH::Transport::OutgoingPacketStream.new(
|
121
|
-
PacketStream_Mock::CipherFactory.new( PacketStream_Mock::Cipher ),
|
122
|
-
PacketStream_Mock::HMACFactory.new,
|
123
|
-
PacketStream_Mock::Compressors )
|
124
|
-
@socket = PacketStream_Mock::Socket.new
|
125
|
-
@stream.socket = @socket
|
126
|
-
end
|
127
|
-
|
128
|
-
def test_send_empty
|
129
|
-
assert_equal 0, @stream.sequence_number
|
130
|
-
@stream.send( "" )
|
131
|
-
assert_equal 1, @stream.sequence_number
|
132
|
-
assert_match( %r{^!\0\0\0\24\21<>.................!\0\0\0\0\0\0\0\24$}m, @socket.send_buffer )
|
133
|
-
end
|
134
|
-
|
135
|
-
def test_send_nonstring
|
136
|
-
assert_equal 0, @stream.sequence_number
|
137
|
-
@stream.send( 15 )
|
138
|
-
assert_equal 1, @stream.sequence_number
|
139
|
-
assert_match( %r{^!\0\0\0\24\17<15>...............!\0\0\0\0\0\0\0\24$}m, @socket.send_buffer )
|
140
|
-
end
|
141
|
-
|
142
|
-
def test_send_long_string
|
143
|
-
assert_equal 0, @stream.sequence_number
|
144
|
-
@stream.send( "12345678901234567" )
|
145
|
-
assert_equal 1, @stream.sequence_number
|
146
|
-
assert_match( %r{^!\0\0\0\34\10<12345678901234567>........!\0\0\0\0\0\0\0\034$}m, @socket.send_buffer )
|
147
|
-
end
|
148
|
-
|
149
|
-
end
|
150
|
-
|
151
|
-
class TC_IncomingPacketStream < Test::Unit::TestCase
|
152
|
-
|
153
|
-
class MockLog
|
154
|
-
def debug?
|
155
|
-
false
|
156
|
-
end
|
157
|
-
end
|
158
|
-
|
159
|
-
def setup
|
160
|
-
@stream = Net::SSH::Transport::IncomingPacketStream.new(
|
161
|
-
PacketStream_Mock::CipherFactory.new( PacketStream_Mock::NullCipher ),
|
162
|
-
PacketStream_Mock::HMACFactory.new,
|
163
|
-
PacketStream_Mock::Decompressors )
|
164
|
-
@stream.buffers = PacketStream_Mock::BufferFactory.new
|
165
|
-
@stream.log = MockLog.new
|
166
|
-
end
|
167
|
-
|
168
|
-
def test_get_empty
|
169
|
-
@stream.socket = PacketStream_Mock::Socket.new( "\0\0\0\21\0201234567890123456\0\0\0\0\0\0\0\21" )
|
170
|
-
assert_equal 0, @stream.sequence_number
|
171
|
-
buffer = @stream.get
|
172
|
-
assert_equal 1, @stream.sequence_number
|
173
|
-
assert_equal 0, buffer.length
|
174
|
-
end
|
175
|
-
|
176
|
-
def test_get_long
|
177
|
-
@stream.socket = PacketStream_Mock::Socket.new( "\0\0\0\32\020ABCDEFGHI1234567890123456\0\0\0\0\0\0\0\32" )
|
178
|
-
assert_equal 0, @stream.sequence_number
|
179
|
-
buffer = @stream.get
|
180
|
-
assert_equal 1, @stream.sequence_number
|
181
|
-
assert_equal 9, buffer.length
|
182
|
-
assert_equal "ABCDEFGHI", buffer.to_s
|
183
|
-
end
|
184
|
-
end
|