net-ssh 0.5.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.
Files changed (179) hide show
  1. data/doc/LICENSE-BSD +27 -0
  2. data/doc/LICENSE-GPL +280 -0
  3. data/doc/LICENSE-RUBY +56 -0
  4. data/doc/README +13 -0
  5. data/doc/manual-html/chapter-1.html +333 -0
  6. data/doc/manual-html/chapter-2.html +455 -0
  7. data/doc/manual-html/chapter-3.html +413 -0
  8. data/doc/manual-html/chapter-4.html +353 -0
  9. data/doc/manual-html/chapter-5.html +393 -0
  10. data/doc/manual-html/chapter-6.html +296 -0
  11. data/doc/manual-html/index.html +217 -0
  12. data/doc/manual-html/manual.css +192 -0
  13. data/doc/manual/chapter.erb +18 -0
  14. data/doc/manual/example.erb +18 -0
  15. data/doc/manual/index.erb +29 -0
  16. data/doc/manual/manual.css +192 -0
  17. data/doc/manual/manual.rb +240 -0
  18. data/doc/manual/manual.yml +67 -0
  19. data/doc/manual/page.erb +87 -0
  20. data/doc/manual/parts/channels_callbacks.txt +32 -0
  21. data/doc/manual/parts/channels_loop.txt +14 -0
  22. data/doc/manual/parts/channels_open.txt +20 -0
  23. data/doc/manual/parts/channels_operations.txt +15 -0
  24. data/doc/manual/parts/channels_types.txt +3 -0
  25. data/doc/manual/parts/channels_what_are.txt +7 -0
  26. data/doc/manual/parts/exec_channels.txt +28 -0
  27. data/doc/manual/parts/exec_open.txt +51 -0
  28. data/doc/manual/parts/exec_popen3.txt +35 -0
  29. data/doc/manual/parts/forward_direct.txt +37 -0
  30. data/doc/manual/parts/forward_handlers.txt +16 -0
  31. data/doc/manual/parts/forward_intro.txt +18 -0
  32. data/doc/manual/parts/forward_local.txt +18 -0
  33. data/doc/manual/parts/forward_remote.txt +14 -0
  34. data/doc/manual/parts/intro_author.txt +1 -0
  35. data/doc/manual/parts/intro_getting.txt +39 -0
  36. data/doc/manual/parts/intro_license.txt +6 -0
  37. data/doc/manual/parts/intro_support.txt +7 -0
  38. data/doc/manual/parts/intro_what_is.txt +7 -0
  39. data/doc/manual/parts/intro_what_is_not.txt +3 -0
  40. data/doc/manual/parts/proxy_http.txt +52 -0
  41. data/doc/manual/parts/proxy_intro.txt +1 -0
  42. data/doc/manual/parts/proxy_socks.txt +23 -0
  43. data/doc/manual/parts/session_key.txt +66 -0
  44. data/doc/manual/parts/session_options.txt +42 -0
  45. data/doc/manual/parts/session_session.txt +14 -0
  46. data/doc/manual/parts/session_start.txt +49 -0
  47. data/doc/manual/tutorial.erb +30 -0
  48. data/examples/channel-demo.rb +81 -0
  49. data/examples/port-forward.rb +51 -0
  50. data/examples/process-demo.rb +91 -0
  51. data/examples/remote-net-port-forward.rb +45 -0
  52. data/examples/remote-port-forward.rb +80 -0
  53. data/examples/tail-demo.rb +49 -0
  54. data/lib/net/ssh.rb +52 -0
  55. data/lib/net/ssh/connection/channel.rb +411 -0
  56. data/lib/net/ssh/connection/constants.rb +47 -0
  57. data/lib/net/ssh/connection/driver.rb +343 -0
  58. data/lib/net/ssh/connection/services.rb +72 -0
  59. data/lib/net/ssh/connection/term.rb +90 -0
  60. data/lib/net/ssh/errors.rb +27 -0
  61. data/lib/net/ssh/proxy/errors.rb +34 -0
  62. data/lib/net/ssh/proxy/http.rb +126 -0
  63. data/lib/net/ssh/proxy/socks4.rb +83 -0
  64. data/lib/net/ssh/proxy/socks5.rb +160 -0
  65. data/lib/net/ssh/service/forward/driver.rb +319 -0
  66. data/lib/net/ssh/service/forward/local-network-handler.rb +74 -0
  67. data/lib/net/ssh/service/forward/remote-network-handler.rb +81 -0
  68. data/lib/net/ssh/service/forward/services.rb +76 -0
  69. data/lib/net/ssh/service/process/driver.rb +153 -0
  70. data/lib/net/ssh/service/process/open.rb +193 -0
  71. data/lib/net/ssh/service/process/popen3.rb +160 -0
  72. data/lib/net/ssh/service/process/services.rb +66 -0
  73. data/lib/net/ssh/service/services.rb +44 -0
  74. data/lib/net/ssh/session.rb +242 -0
  75. data/lib/net/ssh/transport/algorithm-negotiator.rb +267 -0
  76. data/lib/net/ssh/transport/compress/compressor.rb +53 -0
  77. data/lib/net/ssh/transport/compress/decompressor.rb +53 -0
  78. data/lib/net/ssh/transport/compress/none-compressor.rb +39 -0
  79. data/lib/net/ssh/transport/compress/none-decompressor.rb +39 -0
  80. data/lib/net/ssh/transport/compress/services.rb +68 -0
  81. data/lib/net/ssh/transport/compress/zlib-compressor.rb +60 -0
  82. data/lib/net/ssh/transport/compress/zlib-decompressor.rb +52 -0
  83. data/lib/net/ssh/transport/constants.rb +66 -0
  84. data/lib/net/ssh/transport/errors.rb +47 -0
  85. data/lib/net/ssh/transport/identity-cipher.rb +61 -0
  86. data/lib/net/ssh/transport/kex/dh-gex.rb +106 -0
  87. data/lib/net/ssh/transport/kex/dh.rb +231 -0
  88. data/lib/net/ssh/transport/kex/services.rb +60 -0
  89. data/lib/net/ssh/transport/ossl/buffer-factory.rb +52 -0
  90. data/lib/net/ssh/transport/ossl/buffer.rb +87 -0
  91. data/lib/net/ssh/transport/ossl/cipher-factory.rb +98 -0
  92. data/lib/net/ssh/transport/ossl/digest-factory.rb +51 -0
  93. data/lib/net/ssh/transport/ossl/hmac-factory.rb +71 -0
  94. data/lib/net/ssh/transport/ossl/hmac/hmac.rb +62 -0
  95. data/lib/net/ssh/transport/ossl/hmac/md5-96.rb +44 -0
  96. data/lib/net/ssh/transport/ossl/hmac/md5.rb +46 -0
  97. data/lib/net/ssh/transport/ossl/hmac/none.rb +46 -0
  98. data/lib/net/ssh/transport/ossl/hmac/services.rb +68 -0
  99. data/lib/net/ssh/transport/ossl/hmac/sha1-96.rb +44 -0
  100. data/lib/net/ssh/transport/ossl/hmac/sha1.rb +45 -0
  101. data/lib/net/ssh/transport/ossl/key-factory.rb +113 -0
  102. data/lib/net/ssh/transport/ossl/services.rb +149 -0
  103. data/lib/net/ssh/transport/packet-stream.rb +210 -0
  104. data/lib/net/ssh/transport/services.rb +146 -0
  105. data/lib/net/ssh/transport/session.rb +296 -0
  106. data/lib/net/ssh/transport/version-negotiator.rb +73 -0
  107. data/lib/net/ssh/userauth/agent.rb +218 -0
  108. data/lib/net/ssh/userauth/constants.rb +35 -0
  109. data/lib/net/ssh/userauth/driver.rb +176 -0
  110. data/lib/net/ssh/userauth/methods/hostbased.rb +119 -0
  111. data/lib/net/ssh/userauth/methods/password.rb +70 -0
  112. data/lib/net/ssh/userauth/methods/publickey.rb +137 -0
  113. data/lib/net/ssh/userauth/methods/services.rb +63 -0
  114. data/lib/net/ssh/userauth/services.rb +126 -0
  115. data/lib/net/ssh/userauth/userkeys.rb +258 -0
  116. data/lib/net/ssh/util/buffer.rb +274 -0
  117. data/lib/net/ssh/util/openssl.rb +146 -0
  118. data/lib/net/ssh/util/prompter.rb +73 -0
  119. data/lib/net/ssh/version.rb +29 -0
  120. data/test/ALL-TESTS.rb +21 -0
  121. data/test/connection/tc_channel.rb +136 -0
  122. data/test/connection/tc_driver.rb +287 -0
  123. data/test/connection/tc_integration.rb +85 -0
  124. data/test/proxy/tc_http.rb +209 -0
  125. data/test/proxy/tc_socks4.rb +148 -0
  126. data/test/proxy/tc_socks5.rb +214 -0
  127. data/test/service/forward/tc_driver.rb +289 -0
  128. data/test/service/forward/tc_local_network_handler.rb +123 -0
  129. data/test/service/forward/tc_remote_network_handler.rb +108 -0
  130. data/test/service/process/tc_driver.rb +79 -0
  131. data/test/service/process/tc_integration.rb +117 -0
  132. data/test/service/process/tc_open.rb +179 -0
  133. data/test/service/process/tc_popen3.rb +164 -0
  134. data/test/tc_integration.rb +79 -0
  135. data/test/transport/compress/tc_none_compress.rb +41 -0
  136. data/test/transport/compress/tc_none_decompress.rb +45 -0
  137. data/test/transport/compress/tc_zlib_compress.rb +61 -0
  138. data/test/transport/compress/tc_zlib_decompress.rb +48 -0
  139. data/test/transport/kex/tc_dh.rb +304 -0
  140. data/test/transport/kex/tc_dh_gex.rb +70 -0
  141. data/test/transport/ossl/fixtures/dsa-encrypted +15 -0
  142. data/test/transport/ossl/fixtures/dsa-encrypted-bad +15 -0
  143. data/test/transport/ossl/fixtures/dsa-unencrypted +12 -0
  144. data/test/transport/ossl/fixtures/dsa-unencrypted-bad +12 -0
  145. data/test/transport/ossl/fixtures/dsa-unencrypted.pub +1 -0
  146. data/test/transport/ossl/fixtures/not-a-private-key +4 -0
  147. data/test/transport/ossl/fixtures/not-supported +2 -0
  148. data/test/transport/ossl/fixtures/rsa-encrypted +18 -0
  149. data/test/transport/ossl/fixtures/rsa-encrypted-bad +18 -0
  150. data/test/transport/ossl/fixtures/rsa-unencrypted +15 -0
  151. data/test/transport/ossl/fixtures/rsa-unencrypted-bad +15 -0
  152. data/test/transport/ossl/fixtures/rsa-unencrypted.pub +1 -0
  153. data/test/transport/ossl/hmac/tc_hmac.rb +58 -0
  154. data/test/transport/ossl/hmac/tc_md5.rb +50 -0
  155. data/test/transport/ossl/hmac/tc_md5_96.rb +50 -0
  156. data/test/transport/ossl/hmac/tc_none.rb +50 -0
  157. data/test/transport/ossl/hmac/tc_sha1.rb +50 -0
  158. data/test/transport/ossl/hmac/tc_sha1_96.rb +50 -0
  159. data/test/transport/ossl/tc_buffer.rb +97 -0
  160. data/test/transport/ossl/tc_buffer_factory.rb +67 -0
  161. data/test/transport/ossl/tc_cipher_factory.rb +84 -0
  162. data/test/transport/ossl/tc_digest_factory.rb +39 -0
  163. data/test/transport/ossl/tc_hmac_factory.rb +72 -0
  164. data/test/transport/ossl/tc_key_factory.rb +199 -0
  165. data/test/transport/tc_algorithm_negotiator.rb +169 -0
  166. data/test/transport/tc_identity_cipher.rb +52 -0
  167. data/test/transport/tc_integration.rb +110 -0
  168. data/test/transport/tc_packet_stream.rb +183 -0
  169. data/test/transport/tc_session.rb +283 -0
  170. data/test/transport/tc_version_negotiator.rb +86 -0
  171. data/test/userauth/methods/tc_hostbased.rb +136 -0
  172. data/test/userauth/methods/tc_password.rb +89 -0
  173. data/test/userauth/methods/tc_publickey.rb +167 -0
  174. data/test/userauth/tc_agent.rb +223 -0
  175. data/test/userauth/tc_driver.rb +190 -0
  176. data/test/userauth/tc_integration.rb +81 -0
  177. data/test/userauth/tc_userkeys.rb +265 -0
  178. data/test/util/tc_buffer.rb +217 -0
  179. metadata +256 -0
@@ -0,0 +1,169 @@
1
+ #--
2
+ # =============================================================================
3
+ # Copyright (c) 2004, Jamis Buck (jgb3@email.byu.edu)
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 "../../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
+
38
+ def initialize( *script )
39
+ @script = script
40
+ @messages = []
41
+ end
42
+
43
+ def wait_for_message
44
+ @script.shift
45
+ end
46
+
47
+ def send_message( msg )
48
+ @messages << msg.to_s
49
+ end
50
+ end
51
+
52
+ ALGORITHMS = {
53
+ :host_key => [ "A", "B" ],
54
+ :kex => [ "C", "D" ],
55
+ :encryption => [ "E", "F" ],
56
+ :hmac => [ "G", "H" ],
57
+ :compression => [ "I", "J" ],
58
+ :languages => [ "K", "L" ],
59
+ }
60
+
61
+ def reader( text )
62
+ Net::SSH::Util::ReaderBuffer.new( text )
63
+ end
64
+
65
+ def setup
66
+ logger = MockLogger.new
67
+ buffers = Buffers.new
68
+ @negotiator = Net::SSH::Transport::AlgorithmNegotiator.new( logger, ALGORITHMS, buffers )
69
+ end
70
+
71
+ def test_no_kexinit
72
+ session = ScriptedSession.new( [ -1, reader("") ] )
73
+ assert_raise( Net::SSH::Exception ) do
74
+ @negotiator.negotiate( session, {} )
75
+ end
76
+ end
77
+
78
+ def test_simple_exchange
79
+ session = ScriptedSession.new(
80
+ [ KEXINIT,
81
+ reader("1234567890123456" +
82
+ "\0\0\0\3C,D" +
83
+ "\0\0\0\3A,B" +
84
+ "\0\0\0\3E,F\0\0\0\3E,F" +
85
+ "\0\0\0\3G,H\0\0\0\3G,H" +
86
+ "\0\0\0\3I,J\0\0\0\3I,J" +
87
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0") ]
88
+ )
89
+
90
+ result = @negotiator.negotiate( session, {} )
91
+
92
+ assert_equal "C", result.kex
93
+ assert_equal "A", result.host_key
94
+ assert_equal "E", result.encryption_c2s
95
+ assert_equal "E", result.encryption_s2c
96
+ assert_equal "G", result.mac_c2s
97
+ assert_equal "G", result.mac_s2c
98
+ assert_equal "I", result.compression_c2s
99
+ assert_equal "I", result.compression_s2c
100
+ assert_equal "", result.language_c2s
101
+ assert_equal "", result.language_s2c
102
+
103
+ 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
104
+ 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]
105
+ end
106
+
107
+ def test_custom_exchange
108
+ session = ScriptedSession.new(
109
+ [ KEXINIT,
110
+ reader("1234567890123456" +
111
+ "\0\0\0\3C,D" +
112
+ "\0\0\0\3A,B" +
113
+ "\0\0\0\3E,F\0\0\0\3E,F" +
114
+ "\0\0\0\3G,H\0\0\0\3G,H" +
115
+ "\0\0\0\3I,J\0\0\0\3I,J" +
116
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0") ]
117
+ )
118
+
119
+ result = @negotiator.negotiate( session,
120
+ :kex => "D",
121
+ :host_key => [ "B", "A" ] )
122
+
123
+ assert_equal "D", result.kex
124
+ assert_equal "B", result.host_key
125
+ assert_equal "E", result.encryption_c2s
126
+ assert_equal "E", result.encryption_s2c
127
+ assert_equal "G", result.mac_c2s
128
+ assert_equal "G", result.mac_s2c
129
+ assert_equal "I", result.compression_c2s
130
+ assert_equal "I", result.compression_s2c
131
+ assert_equal "", result.language_c2s
132
+ assert_equal "", result.language_s2c
133
+ end
134
+
135
+ def test_bad_algorithm
136
+ session = ScriptedSession.new(
137
+ [ KEXINIT,
138
+ reader("1234567890123456" +
139
+ "\0\0\0\3C,D" +
140
+ "\0\0\0\3A,B" +
141
+ "\0\0\0\3E,F\0\0\0\3E,F" +
142
+ "\0\0\0\3G,H\0\0\0\3G,H" +
143
+ "\0\0\0\3I,J\0\0\0\3I,J" +
144
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0") ]
145
+ )
146
+
147
+ assert_raise( NotImplementedError ) do
148
+ @negotiator.negotiate( session, :kex => "K" )
149
+ end
150
+ end
151
+
152
+ def test_no_agree
153
+ session = ScriptedSession.new(
154
+ [ KEXINIT,
155
+ reader("1234567890123456" +
156
+ "\0\0\0\3C,D" +
157
+ "\0\0\0\3M,N" +
158
+ "\0\0\0\3E,F\0\0\0\3E,F" +
159
+ "\0\0\0\3G,H\0\0\0\3G,H" +
160
+ "\0\0\0\3I,J\0\0\0\3I,J" +
161
+ "\0\0\0\0\0\0\0\0\0\0\0\0\0") ]
162
+ )
163
+
164
+ assert_raise( Net::SSH::Exception ) do
165
+ @negotiator.negotiate( session, {} )
166
+ end
167
+ end
168
+
169
+ end
@@ -0,0 +1,52 @@
1
+ #--
2
+ # =============================================================================
3
+ # Copyright (c) 2004, Jamis Buck (jgb3@email.byu.edu)
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 "../../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
@@ -0,0 +1,110 @@
1
+ #--
2
+ # =============================================================================
3
+ # Copyright (c) 2004, Jamis Buck (jgb3@email.byu.edu)
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 "../../lib"
18
+
19
+ if $run_integration_tests || __FILE__ == $0
20
+
21
+ require 'needle'
22
+ require 'net/ssh/transport/services'
23
+ require 'test/unit'
24
+
25
+ class TC_Transport_Integration < Test::Unit::TestCase
26
+
27
+ def setup
28
+ @registry = Needle::Registry.new :logs => { :device=>STDOUT, :default_level => :WARN }
29
+ Net::SSH::Transport.register_services( @registry )
30
+ end
31
+
32
+ def teardown
33
+ @registry.logs.close
34
+ end
35
+
36
+ backends = [ :ossl ]
37
+ keys = [ "ssh-dss", "ssh-rsa" ]
38
+ kexs = [ "diffie-hellman-group-exchange-sha1", "diffie-hellman-group1-sha1" ]
39
+ # we don't test "idea-cbc" because it is not supported by OpenSSH. OpenSSH
40
+ # will use 3des-cbc instead, which we are already testing.
41
+ encryptions = [ "3des-cbc", "aes128-cbc", "blowfish-cbc", "aes256-cbc",
42
+ "aes192-cbc" ]
43
+ hmacs = [ "hmac-md5", "hmac-sha1", "hmac-md5-96", "hmac-sha1-96" ]
44
+ compressions = [ "none", "zlib" ]
45
+
46
+ # keys = [ 'ssh-dss' ]
47
+ # kexs = [ 'diffie-hellman-group-exchange-sha1' ]
48
+ # encryptions = [ '3des-cbc' ]
49
+ # hmacs = [ 'hmac-md5' ]
50
+ # compressions = [ 'none' ]
51
+
52
+ backends.each do |backend|
53
+ keys.each do |key|
54
+ kexs.each do |kex|
55
+ encryptions.each do |encryption|
56
+ hmacs.each do |hmac|
57
+ compressions.each do |compression|
58
+ method_name = "test_#{backend}__#{key}__#{kex}__" +
59
+ "#{encryption}__#{hmac}__#{compression}"
60
+ method_name.gsub!( /-/, "_" )
61
+
62
+ define_method( method_name ) do
63
+ @registry.define do |b|
64
+ b.crypto_backend { backend }
65
+ b.transport_host { "test.host" }
66
+ b.transport_options do
67
+ Hash[ :host_key => key,
68
+ :kex => kex,
69
+ :encryption => encryption,
70
+ :hmac => hmac,
71
+ :compression => compression ]
72
+ end
73
+ end
74
+
75
+ session = nil
76
+ assert_nothing_raised do
77
+ session = @registry.transport.session
78
+ end
79
+
80
+ assert_equal key, session.algorithms.host_key
81
+ assert_equal kex, session.algorithms.kex
82
+ assert_equal encryption, session.algorithms.encryption_c2s
83
+ assert_equal encryption, session.algorithms.encryption_s2c
84
+ assert_equal hmac, session.algorithms.mac_c2s
85
+ assert_equal hmac, session.algorithms.mac_s2c
86
+ assert_equal compression, session.algorithms.compression_c2s
87
+ assert_equal compression, session.algorithms.compression_s2c
88
+
89
+ type = nil
90
+ assert_nothing_raised do
91
+ session.send_message(
92
+ session.class::SERVICE_REQUEST.chr +
93
+ "\0\0\0\14ssh-userauth" )
94
+ type, buffer = session.wait_for_message
95
+ end
96
+
97
+ assert_equal session.class::SERVICE_ACCEPT, type
98
+ session.close
99
+ end
100
+
101
+ end
102
+ end
103
+ end
104
+ end
105
+ end
106
+ end
107
+
108
+ end
109
+
110
+ end
@@ -0,0 +1,183 @@
1
+ #--
2
+ # =============================================================================
3
+ # Copyright (c) 2004, Jamis Buck (jgb3@email.byu.edu)
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 "../../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
+ end
110
+ end
111
+
112
+ Compressors = { "none" => Compressor.new }
113
+ Decompressors = { "none" => Decompressor.new }
114
+ end
115
+
116
+ class TC_OutgoingPacketStream < Test::Unit::TestCase
117
+
118
+ def setup
119
+ @stream = Net::SSH::Transport::OutgoingPacketStream.new(
120
+ PacketStream_Mock::CipherFactory.new( PacketStream_Mock::Cipher ),
121
+ PacketStream_Mock::HMACFactory.new,
122
+ PacketStream_Mock::Compressors )
123
+ @socket = PacketStream_Mock::Socket.new
124
+ @stream.socket = @socket
125
+ end
126
+
127
+ def test_send_empty
128
+ assert_equal 0, @stream.sequence_number
129
+ @stream.send( "" )
130
+ assert_equal 1, @stream.sequence_number
131
+ assert_match( %r{^!\0\0\0\24\21<>.................!\0\0\0\0\0\0\0\24$}m, @socket.send_buffer )
132
+ end
133
+
134
+ def test_send_nonstring
135
+ assert_equal 0, @stream.sequence_number
136
+ @stream.send( 15 )
137
+ assert_equal 1, @stream.sequence_number
138
+ assert_match( %r{^!\0\0\0\24\17<15>...............!\0\0\0\0\0\0\0\24$}m, @socket.send_buffer )
139
+ end
140
+
141
+ def test_send_long_string
142
+ assert_equal 0, @stream.sequence_number
143
+ @stream.send( "12345678901234567" )
144
+ assert_equal 1, @stream.sequence_number
145
+ assert_match( %r{^!\0\0\0\34\10<12345678901234567>........!\0\0\0\0\0\0\0\034$}m, @socket.send_buffer )
146
+ end
147
+
148
+ end
149
+
150
+ class TC_IncomingPacketStream < Test::Unit::TestCase
151
+
152
+ class MockLog
153
+ def debug?
154
+ false
155
+ end
156
+ end
157
+
158
+ def setup
159
+ @stream = Net::SSH::Transport::IncomingPacketStream.new(
160
+ PacketStream_Mock::CipherFactory.new( PacketStream_Mock::NullCipher ),
161
+ PacketStream_Mock::HMACFactory.new,
162
+ PacketStream_Mock::Decompressors )
163
+ @stream.buffers = PacketStream_Mock::BufferFactory.new
164
+ @stream.log = MockLog.new
165
+ end
166
+
167
+ def test_get_empty
168
+ @stream.socket = PacketStream_Mock::Socket.new( "\0\0\0\21\0201234567890123456\0\0\0\0\0\0\0\21" )
169
+ assert_equal 0, @stream.sequence_number
170
+ buffer = @stream.get
171
+ assert_equal 1, @stream.sequence_number
172
+ assert_equal 0, buffer.length
173
+ end
174
+
175
+ def test_get_long
176
+ @stream.socket = PacketStream_Mock::Socket.new( "\0\0\0\32\020ABCDEFGHI1234567890123456\0\0\0\0\0\0\0\32" )
177
+ assert_equal 0, @stream.sequence_number
178
+ buffer = @stream.get
179
+ assert_equal 1, @stream.sequence_number
180
+ assert_equal 9, buffer.length
181
+ assert_equal "ABCDEFGHI", buffer.to_s
182
+ end
183
+ end