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.
Files changed (297) hide show
  1. data/CHANGELOG.rdoc +37 -0
  2. data/Manifest +101 -0
  3. data/README.rdoc +110 -0
  4. data/Rakefile +26 -0
  5. data/{THANKS → THANKS.rdoc} +2 -5
  6. data/lib/net/ssh.rb +189 -57
  7. data/lib/net/ssh/authentication/agent.rb +175 -0
  8. data/lib/net/ssh/authentication/constants.rb +18 -0
  9. data/lib/net/ssh/authentication/key_manager.rb +166 -0
  10. data/lib/net/ssh/authentication/methods/abstract.rb +60 -0
  11. data/lib/net/ssh/authentication/methods/hostbased.rb +71 -0
  12. data/lib/net/ssh/authentication/methods/keyboard_interactive.rb +66 -0
  13. data/lib/net/ssh/authentication/methods/password.rb +39 -0
  14. data/lib/net/ssh/authentication/methods/publickey.rb +92 -0
  15. data/lib/net/ssh/authentication/pageant.rb +176 -0
  16. data/lib/net/ssh/authentication/session.rb +116 -0
  17. data/lib/net/ssh/buffer.rb +339 -0
  18. data/lib/net/ssh/buffered_io.rb +149 -0
  19. data/lib/net/ssh/config.rb +173 -0
  20. data/lib/net/ssh/connection/channel.rb +575 -454
  21. data/lib/net/ssh/connection/constants.rb +31 -45
  22. data/lib/net/ssh/connection/session.rb +569 -0
  23. data/lib/net/ssh/connection/term.rb +176 -88
  24. data/lib/net/ssh/errors.rb +83 -61
  25. data/lib/net/ssh/key_factory.rb +85 -0
  26. data/lib/net/ssh/known_hosts.rb +129 -0
  27. data/lib/net/ssh/loggable.rb +61 -0
  28. data/lib/net/ssh/packet.rb +102 -0
  29. data/lib/net/ssh/prompt.rb +93 -0
  30. data/lib/net/ssh/proxy/errors.rb +8 -28
  31. data/lib/net/ssh/proxy/http.rb +75 -107
  32. data/lib/net/ssh/proxy/socks4.rb +35 -48
  33. data/lib/net/ssh/proxy/socks5.rb +76 -108
  34. data/lib/net/ssh/service/forward.rb +267 -0
  35. data/lib/net/ssh/test.rb +89 -0
  36. data/lib/net/ssh/test/channel.rb +129 -0
  37. data/lib/net/ssh/test/extensions.rb +152 -0
  38. data/lib/net/ssh/test/kex.rb +44 -0
  39. data/lib/net/ssh/test/local_packet.rb +51 -0
  40. data/lib/net/ssh/test/packet.rb +81 -0
  41. data/lib/net/ssh/test/remote_packet.rb +38 -0
  42. data/lib/net/ssh/test/script.rb +157 -0
  43. data/lib/net/ssh/test/socket.rb +59 -0
  44. data/lib/net/ssh/transport/algorithms.rb +384 -0
  45. data/lib/net/ssh/transport/cipher_factory.rb +72 -0
  46. data/lib/net/ssh/transport/constants.rb +22 -58
  47. data/lib/net/ssh/transport/hmac.rb +31 -0
  48. data/lib/net/ssh/transport/hmac/abstract.rb +48 -0
  49. data/lib/net/ssh/transport/hmac/md5.rb +12 -0
  50. data/lib/net/ssh/transport/hmac/md5_96.rb +11 -0
  51. data/lib/net/ssh/transport/hmac/none.rb +15 -0
  52. data/lib/net/ssh/transport/hmac/sha1.rb +13 -0
  53. data/lib/net/ssh/transport/hmac/sha1_96.rb +11 -0
  54. data/lib/net/ssh/transport/identity_cipher.rb +40 -0
  55. data/lib/net/ssh/transport/kex.rb +13 -0
  56. data/lib/net/ssh/transport/kex/diffie_hellman_group1_sha1.rb +208 -0
  57. data/lib/net/ssh/transport/kex/diffie_hellman_group_exchange_sha1.rb +77 -0
  58. data/lib/net/ssh/{util → transport}/openssl.rb +22 -40
  59. data/lib/net/ssh/transport/packet_stream.rb +230 -0
  60. data/lib/net/ssh/transport/server_version.rb +61 -0
  61. data/lib/net/ssh/transport/session.rb +225 -303
  62. data/lib/net/ssh/transport/state.rb +170 -0
  63. data/lib/net/ssh/verifiers/lenient.rb +30 -0
  64. data/lib/net/ssh/verifiers/null.rb +12 -0
  65. data/lib/net/ssh/verifiers/strict.rb +53 -0
  66. data/lib/net/ssh/version.rb +57 -26
  67. data/net-ssh.gemspec +54 -0
  68. data/setup.rb +1585 -0
  69. data/test/authentication/methods/common.rb +28 -0
  70. data/test/authentication/methods/test_abstract.rb +51 -0
  71. data/test/authentication/methods/test_hostbased.rb +108 -0
  72. data/test/authentication/methods/test_keyboard_interactive.rb +98 -0
  73. data/test/authentication/methods/test_password.rb +50 -0
  74. data/test/authentication/methods/test_publickey.rb +123 -0
  75. data/test/authentication/test_agent.rb +205 -0
  76. data/test/authentication/test_key_manager.rb +100 -0
  77. data/test/authentication/test_session.rb +93 -0
  78. data/test/common.rb +106 -0
  79. data/test/configs/exact_match +8 -0
  80. data/test/configs/wild_cards +14 -0
  81. data/test/connection/test_channel.rb +452 -0
  82. data/test/connection/test_session.rb +483 -0
  83. data/test/test_all.rb +6 -0
  84. data/test/test_buffer.rb +336 -0
  85. data/test/test_buffered_io.rb +63 -0
  86. data/test/test_config.rb +78 -0
  87. data/test/test_key_factory.rb +67 -0
  88. data/test/transport/hmac/test_md5.rb +34 -0
  89. data/test/transport/hmac/test_md5_96.rb +25 -0
  90. data/test/transport/hmac/test_none.rb +34 -0
  91. data/test/transport/hmac/test_sha1.rb +34 -0
  92. data/test/transport/hmac/test_sha1_96.rb +25 -0
  93. data/test/transport/kex/test_diffie_hellman_group1_sha1.rb +146 -0
  94. data/test/transport/kex/test_diffie_hellman_group_exchange_sha1.rb +92 -0
  95. data/test/transport/test_algorithms.rb +302 -0
  96. data/test/transport/test_cipher_factory.rb +163 -0
  97. data/test/transport/test_hmac.rb +34 -0
  98. data/test/transport/test_identity_cipher.rb +40 -0
  99. data/test/transport/test_packet_stream.rb +433 -0
  100. data/test/transport/test_server_version.rb +55 -0
  101. data/test/transport/test_session.rb +312 -0
  102. data/test/transport/test_state.rb +173 -0
  103. metadata +102 -253
  104. data/ChangeLog +0 -560
  105. data/LICENSE +0 -7
  106. data/NEWS +0 -152
  107. data/README +0 -14
  108. data/bin/rb-keygen +0 -210
  109. data/doc/LICENSE-BSD +0 -27
  110. data/doc/LICENSE-GPL +0 -280
  111. data/doc/LICENSE-RUBY +0 -56
  112. data/doc/manual-html/chapter-1.html +0 -388
  113. data/doc/manual-html/chapter-2.html +0 -552
  114. data/doc/manual-html/chapter-3.html +0 -470
  115. data/doc/manual-html/chapter-4.html +0 -413
  116. data/doc/manual-html/chapter-5.html +0 -525
  117. data/doc/manual-html/chapter-6.html +0 -456
  118. data/doc/manual-html/chapter-7.html +0 -343
  119. data/doc/manual-html/index.html +0 -235
  120. data/doc/manual-html/stylesheets/manual.css +0 -270
  121. data/doc/manual-html/stylesheets/ruby.css +0 -17
  122. data/doc/manual/chapter.erb +0 -38
  123. data/doc/manual/example.erb +0 -18
  124. data/doc/manual/index.erb +0 -29
  125. data/doc/manual/manual.rb +0 -311
  126. data/doc/manual/manual.yml +0 -73
  127. data/doc/manual/page.erb +0 -87
  128. data/doc/manual/parts/0000.txt +0 -5
  129. data/doc/manual/parts/0001.txt +0 -3
  130. data/doc/manual/parts/0002.txt +0 -40
  131. data/doc/manual/parts/0003.txt +0 -6
  132. data/doc/manual/parts/0004.txt +0 -7
  133. data/doc/manual/parts/0005.txt +0 -1
  134. data/doc/manual/parts/0006.txt +0 -49
  135. data/doc/manual/parts/0007.txt +0 -67
  136. data/doc/manual/parts/0008.txt +0 -43
  137. data/doc/manual/parts/0009.txt +0 -14
  138. data/doc/manual/parts/0010.txt +0 -7
  139. data/doc/manual/parts/0011.txt +0 -14
  140. data/doc/manual/parts/0012.txt +0 -3
  141. data/doc/manual/parts/0013.txt +0 -20
  142. data/doc/manual/parts/0014.txt +0 -32
  143. data/doc/manual/parts/0015.txt +0 -14
  144. data/doc/manual/parts/0016.txt +0 -28
  145. data/doc/manual/parts/0017.txt +0 -50
  146. data/doc/manual/parts/0018.txt +0 -35
  147. data/doc/manual/parts/0019.txt +0 -7
  148. data/doc/manual/parts/0020.txt +0 -72
  149. data/doc/manual/parts/0021.txt +0 -50
  150. data/doc/manual/parts/0022.txt +0 -42
  151. data/doc/manual/parts/0023.txt +0 -51
  152. data/doc/manual/parts/0024.txt +0 -18
  153. data/doc/manual/parts/0025.txt +0 -18
  154. data/doc/manual/parts/0026.txt +0 -15
  155. data/doc/manual/parts/0027.txt +0 -37
  156. data/doc/manual/parts/0028.txt +0 -16
  157. data/doc/manual/parts/0029.txt +0 -1
  158. data/doc/manual/parts/0030.txt +0 -52
  159. data/doc/manual/parts/0031.txt +0 -25
  160. data/doc/manual/stylesheets/manual.css +0 -270
  161. data/doc/manual/stylesheets/ruby.css +0 -17
  162. data/doc/manual/tutorial.erb +0 -30
  163. data/examples/auth-forward.rb +0 -41
  164. data/examples/channel-demo.rb +0 -81
  165. data/examples/port-forward.rb +0 -51
  166. data/examples/process-demo.rb +0 -91
  167. data/examples/remote-net-port-forward.rb +0 -45
  168. data/examples/remote-port-forward.rb +0 -80
  169. data/examples/shell-demo.rb +0 -46
  170. data/examples/ssh-client.rb +0 -67
  171. data/examples/sync-shell-demo.rb +0 -69
  172. data/examples/tail-demo.rb +0 -49
  173. data/lib/net/ssh/connection/driver.rb +0 -446
  174. data/lib/net/ssh/connection/services.rb +0 -72
  175. data/lib/net/ssh/host-key-verifier.rb +0 -52
  176. data/lib/net/ssh/known-hosts.rb +0 -96
  177. data/lib/net/ssh/lenient-host-key-verifier.rb +0 -25
  178. data/lib/net/ssh/null-host-key-verifier.rb +0 -14
  179. data/lib/net/ssh/service/agentforward/driver.rb +0 -78
  180. data/lib/net/ssh/service/agentforward/services.rb +0 -41
  181. data/lib/net/ssh/service/forward/driver.rb +0 -319
  182. data/lib/net/ssh/service/forward/local-network-handler.rb +0 -71
  183. data/lib/net/ssh/service/forward/remote-network-handler.rb +0 -83
  184. data/lib/net/ssh/service/forward/services.rb +0 -76
  185. data/lib/net/ssh/service/process/driver.rb +0 -153
  186. data/lib/net/ssh/service/process/open.rb +0 -193
  187. data/lib/net/ssh/service/process/popen3.rb +0 -178
  188. data/lib/net/ssh/service/process/services.rb +0 -66
  189. data/lib/net/ssh/service/services.rb +0 -60
  190. data/lib/net/ssh/service/shell/driver.rb +0 -86
  191. data/lib/net/ssh/service/shell/services.rb +0 -54
  192. data/lib/net/ssh/service/shell/shell.rb +0 -222
  193. data/lib/net/ssh/service/shell/sync.rb +0 -114
  194. data/lib/net/ssh/session.rb +0 -305
  195. data/lib/net/ssh/transport/algorithm-negotiator.rb +0 -275
  196. data/lib/net/ssh/transport/compress/compressor.rb +0 -53
  197. data/lib/net/ssh/transport/compress/decompressor.rb +0 -53
  198. data/lib/net/ssh/transport/compress/none-compressor.rb +0 -39
  199. data/lib/net/ssh/transport/compress/none-decompressor.rb +0 -39
  200. data/lib/net/ssh/transport/compress/services.rb +0 -68
  201. data/lib/net/ssh/transport/compress/zlib-compressor.rb +0 -60
  202. data/lib/net/ssh/transport/compress/zlib-decompressor.rb +0 -52
  203. data/lib/net/ssh/transport/errors.rb +0 -47
  204. data/lib/net/ssh/transport/identity-cipher.rb +0 -61
  205. data/lib/net/ssh/transport/kex/dh-gex.rb +0 -106
  206. data/lib/net/ssh/transport/kex/dh.rb +0 -249
  207. data/lib/net/ssh/transport/kex/services.rb +0 -62
  208. data/lib/net/ssh/transport/ossl/buffer-factory.rb +0 -52
  209. data/lib/net/ssh/transport/ossl/buffer.rb +0 -87
  210. data/lib/net/ssh/transport/ossl/cipher-factory.rb +0 -98
  211. data/lib/net/ssh/transport/ossl/digest-factory.rb +0 -51
  212. data/lib/net/ssh/transport/ossl/hmac-factory.rb +0 -71
  213. data/lib/net/ssh/transport/ossl/hmac/hmac.rb +0 -62
  214. data/lib/net/ssh/transport/ossl/hmac/md5-96.rb +0 -44
  215. data/lib/net/ssh/transport/ossl/hmac/md5.rb +0 -46
  216. data/lib/net/ssh/transport/ossl/hmac/none.rb +0 -46
  217. data/lib/net/ssh/transport/ossl/hmac/services.rb +0 -68
  218. data/lib/net/ssh/transport/ossl/hmac/sha1-96.rb +0 -44
  219. data/lib/net/ssh/transport/ossl/hmac/sha1.rb +0 -45
  220. data/lib/net/ssh/transport/ossl/key-factory.rb +0 -116
  221. data/lib/net/ssh/transport/ossl/services.rb +0 -149
  222. data/lib/net/ssh/transport/packet-stream.rb +0 -236
  223. data/lib/net/ssh/transport/services.rb +0 -146
  224. data/lib/net/ssh/transport/version-negotiator.rb +0 -73
  225. data/lib/net/ssh/userauth/agent.rb +0 -222
  226. data/lib/net/ssh/userauth/constants.rb +0 -35
  227. data/lib/net/ssh/userauth/driver.rb +0 -183
  228. data/lib/net/ssh/userauth/methods/hostbased.rb +0 -119
  229. data/lib/net/ssh/userauth/methods/keyboard-interactive.rb +0 -104
  230. data/lib/net/ssh/userauth/methods/password.rb +0 -70
  231. data/lib/net/ssh/userauth/methods/publickey.rb +0 -137
  232. data/lib/net/ssh/userauth/methods/services.rb +0 -90
  233. data/lib/net/ssh/userauth/pageant.rb +0 -197
  234. data/lib/net/ssh/userauth/services.rb +0 -141
  235. data/lib/net/ssh/userauth/userkeys.rb +0 -258
  236. data/lib/net/ssh/util/buffer.rb +0 -274
  237. data/lib/net/ssh/util/prompter.rb +0 -73
  238. data/test/ALL-TESTS.rb +0 -18
  239. data/test/connection/tc_channel.rb +0 -136
  240. data/test/connection/tc_driver.rb +0 -287
  241. data/test/connection/tc_integration.rb +0 -87
  242. data/test/proxy/tc_http.rb +0 -209
  243. data/test/proxy/tc_socks4.rb +0 -148
  244. data/test/proxy/tc_socks5.rb +0 -214
  245. data/test/service/agentforward/tc_driver.rb +0 -138
  246. data/test/service/forward/tc_driver.rb +0 -289
  247. data/test/service/forward/tc_local_network_handler.rb +0 -123
  248. data/test/service/forward/tc_remote_network_handler.rb +0 -111
  249. data/test/service/process/tc_driver.rb +0 -79
  250. data/test/service/process/tc_integration.rb +0 -119
  251. data/test/service/process/tc_open.rb +0 -179
  252. data/test/service/process/tc_popen3.rb +0 -164
  253. data/test/tc_integration.rb +0 -80
  254. data/test/transport/compress/tc_none_compress.rb +0 -41
  255. data/test/transport/compress/tc_none_decompress.rb +0 -45
  256. data/test/transport/compress/tc_zlib_compress.rb +0 -61
  257. data/test/transport/compress/tc_zlib_decompress.rb +0 -48
  258. data/test/transport/kex/tc_dh.rb +0 -312
  259. data/test/transport/kex/tc_dh_gex.rb +0 -71
  260. data/test/transport/ossl/fixtures/dsa-encrypted +0 -15
  261. data/test/transport/ossl/fixtures/dsa-encrypted-bad +0 -15
  262. data/test/transport/ossl/fixtures/dsa-unencrypted +0 -12
  263. data/test/transport/ossl/fixtures/dsa-unencrypted-bad +0 -12
  264. data/test/transport/ossl/fixtures/dsa-unencrypted.pub +0 -1
  265. data/test/transport/ossl/fixtures/not-a-private-key +0 -4
  266. data/test/transport/ossl/fixtures/not-supported +0 -2
  267. data/test/transport/ossl/fixtures/rsa-encrypted +0 -18
  268. data/test/transport/ossl/fixtures/rsa-encrypted-bad +0 -18
  269. data/test/transport/ossl/fixtures/rsa-unencrypted +0 -15
  270. data/test/transport/ossl/fixtures/rsa-unencrypted-bad +0 -15
  271. data/test/transport/ossl/fixtures/rsa-unencrypted.pub +0 -1
  272. data/test/transport/ossl/hmac/tc_hmac.rb +0 -58
  273. data/test/transport/ossl/hmac/tc_md5.rb +0 -50
  274. data/test/transport/ossl/hmac/tc_md5_96.rb +0 -50
  275. data/test/transport/ossl/hmac/tc_none.rb +0 -50
  276. data/test/transport/ossl/hmac/tc_sha1.rb +0 -50
  277. data/test/transport/ossl/hmac/tc_sha1_96.rb +0 -50
  278. data/test/transport/ossl/tc_buffer.rb +0 -97
  279. data/test/transport/ossl/tc_buffer_factory.rb +0 -67
  280. data/test/transport/ossl/tc_cipher_factory.rb +0 -84
  281. data/test/transport/ossl/tc_digest_factory.rb +0 -39
  282. data/test/transport/ossl/tc_hmac_factory.rb +0 -72
  283. data/test/transport/ossl/tc_key_factory.rb +0 -199
  284. data/test/transport/tc_algorithm_negotiator.rb +0 -170
  285. data/test/transport/tc_identity_cipher.rb +0 -52
  286. data/test/transport/tc_integration.rb +0 -115
  287. data/test/transport/tc_packet_stream.rb +0 -184
  288. data/test/transport/tc_session.rb +0 -296
  289. data/test/transport/tc_version_negotiator.rb +0 -86
  290. data/test/userauth/methods/tc_hostbased.rb +0 -136
  291. data/test/userauth/methods/tc_password.rb +0 -89
  292. data/test/userauth/methods/tc_publickey.rb +0 -167
  293. data/test/userauth/tc_agent.rb +0 -223
  294. data/test/userauth/tc_driver.rb +0 -190
  295. data/test/userauth/tc_integration.rb +0 -97
  296. data/test/userauth/tc_userkeys.rb +0 -265
  297. data/test/util/tc_buffer.rb +0 -217
@@ -1,236 +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
- require 'thread'
18
-
19
- require 'net/ssh/errors'
20
- require 'net/ssh/transport/errors'
21
-
22
- module Net
23
- module SSH
24
- module Transport
25
-
26
- # The abstract parent of IncomingPacketStream and OutgoingPacketStream. It
27
- # represents the common interface of its subclasses.
28
- class PacketStream
29
-
30
- # the sequence number of the next packet to be processed.
31
- attr_reader :sequence_number
32
-
33
- # the setter for setting the socket to use for IO communication
34
- attr_writer :socket
35
-
36
- # Create a new packet stream. The given ciphers and hmacs are factories
37
- # that are used to initialize the cipher and mac attributes.
38
- def initialize( ciphers, hmacs )
39
- @sequence_number = 0
40
-
41
- @cipher = ciphers.get( "none" )
42
- @hmac = hmacs.get( "none" )
43
- end
44
-
45
- # Set the cipher and mac algorithms to the given arguments.
46
- def set_algorithms( cipher, mac )
47
- @cipher, @hmac = cipher, mac
48
- end
49
-
50
- # Compute the mac for the given payload.
51
- def compute_hmac( payload )
52
- @hmac.digest( [ @sequence_number, payload ].pack( "NA*" ) )
53
- end
54
-
55
- # Increment the sequence number. This handles the (rare) case of a
56
- # sequence number overflowing a long integer, and resets it safely to 0
57
- # (as required by the SSH2 protocol).
58
- def increment_sequence_number
59
- @sequence_number += 1
60
- @sequence_number = 0 if @sequence_number > 0xFFFFFFFF
61
- end
62
- private :increment_sequence_number
63
-
64
- end
65
-
66
- # Handles the compression and encryption of outgoing packets.
67
- class OutgoingPacketStream < PacketStream
68
-
69
- # Create a new OutgoingPacketStream.
70
- def initialize( ciphers, hmacs, compressors )
71
- super( ciphers, hmacs )
72
- @compressor = compressors.fetch( "none" )
73
- @mutex = Mutex.new
74
- end
75
-
76
- # Set the cipher, mac, and compressor to the given values.
77
- def set_algorithms( cipher, hmac, compressor )
78
- super( cipher, hmac )
79
- @compressor = compressor
80
- end
81
-
82
- # Send the given payload over the socket, after (possibly) compressing
83
- # and encrypting it. The payload is converted to a string (using #to_s)
84
- # before being manipulated.
85
- def send( payload )
86
- @mutex.synchronize do
87
- # force the payload into a string
88
- payload = @compressor.compress( payload.to_s )
89
-
90
- # the length of the packet, minus the padding
91
- actual_length = 4 + payload.length + 1
92
-
93
- # compute the padding length
94
- padding_length = @cipher.block_size -
95
- ( actual_length % @cipher.block_size )
96
- padding_length += @cipher.block_size if padding_length < 4
97
-
98
- # compute the packet length (sans the length field itself)
99
- packet_length = payload.length + padding_length + 1
100
-
101
- if packet_length < 16
102
- padding_length += @cipher.block_size
103
- packet_length = payload.length + padding_length + 1
104
- end
105
-
106
- padding = Array.new( padding_length ) { rand(256) }.pack("C*")
107
-
108
- unencrypted_data = [ packet_length, padding_length, payload,
109
- padding ].pack( "NCA*A*" )
110
- mac = compute_hmac( unencrypted_data )
111
-
112
- encrypted_data = @cipher.update( unencrypted_data ) << @cipher.final
113
- message = encrypted_data + mac
114
-
115
- # send package, in case package was only partially transferred, retry
116
- counter = message.size
117
- while counter > 0
118
- begin
119
- counter -= @socket.send message[(message.size-counter)..message.size], 0
120
- rescue Errno::EINTR
121
- retry
122
- end
123
- end
124
-
125
- increment_sequence_number
126
- end
127
- end
128
-
129
- end
130
-
131
- # Handles the decompression and dencryption of incoming packets.
132
- class IncomingPacketStream < PacketStream
133
-
134
- # A handle to the buffer factory to use when creating buffers
135
- attr_writer :buffers
136
-
137
- # A handle to the logger instance to use for writing log messages
138
- attr_writer :log
139
-
140
- # Create a new IncomingPacketStream.
141
- def initialize( ciphers, hmacs, decompressors )
142
- super( ciphers, hmacs )
143
- @decompressor = decompressors.fetch( "none" )
144
- @mutex = Mutex.new
145
- end
146
-
147
- # Set the cipher, mac, and decompressor algorithms to the given values.
148
- def set_algorithms( cipher, mac, decompressor )
149
- super( cipher, mac )
150
- @decompressor = decompressor
151
- end
152
-
153
- # Retrieve the next packet from the string, after (possibly) decrypting
154
- # and decompressing it. The packet is returned as a reader buffer.
155
- def get
156
- @mutex.synchronize do
157
- # get the first block of data
158
- if @log.debug?
159
- @log.debug "reading #{@cipher.block_size} bytes from socket..."
160
- end
161
-
162
- data = read( @cipher.block_size )
163
-
164
- # decipher it
165
- reader = @buffers.reader( @cipher.update( data ) )
166
-
167
- # determine the packet length and how many bytes remain to be read
168
- packet_length = reader.read_long
169
- remaining_to_read = packet_length + 4 - @cipher.block_size
170
- if @log.debug?
171
- @log.debug "packet length(#{packet_length}) " +
172
- "remaining(#{remaining_to_read})"
173
- end
174
-
175
- # read the remainder of the packet and decrypt it.
176
- data = read( remaining_to_read )
177
-
178
- # get the hmac from the tail of the packet (if one exists), and
179
- # then validate it.
180
- hmac = @hmac.mac_length > 0 ? read( @hmac.mac_length ) : ""
181
-
182
- reader.append @cipher.update( data ) unless data.empty?
183
- reader.append @cipher.final
184
-
185
- padding_length = reader.read_byte
186
-
187
- payload = reader.read( packet_length - padding_length - 1 )
188
- padding = reader.read( padding_length ) if padding_length > 0
189
-
190
- my_computed_hmac = compute_hmac( reader.content )
191
- raise Net::SSH::Exception, "corrupted mac detected" if hmac != my_computed_hmac
192
-
193
- # decompress the payload
194
- payload = @decompressor.decompress( payload )
195
-
196
- increment_sequence_number
197
-
198
- buffer = @buffers.reader( payload )
199
- @log.debug "received: #{buffer.content.inspect}" if @log.debug?
200
-
201
- return buffer
202
- end
203
- end
204
-
205
- def read( length )
206
- if IO === @socket
207
- data = ""
208
- begin
209
- while data.length < length
210
- break if @socket.closed?
211
- if ( IO.select([@socket],nil,nil,0.01) rescue nil )
212
- data << @socket.read(length-data.length)
213
- end
214
- end
215
- rescue Errno::EINTR
216
- retry
217
- end
218
- else
219
- data = @socket.recv(length)
220
- end
221
-
222
- # if the data is less than expected, the socket was closed
223
- if data.nil? || data.length < length
224
- raise Net::SSH::Transport::Disconnect,
225
- "connection closed by remote host"
226
- end
227
-
228
- data
229
- end
230
- private :read
231
-
232
- end
233
-
234
- end
235
- end
236
- end
@@ -1,146 +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
- module Net
18
- module SSH
19
- module Transport
20
-
21
- # Register the services that together implement the SSH transport layer.
22
- def register_services( container )
23
- container.namespace_define :transport do |b|
24
- b.kex_names { Hash.new }
25
- b.compression_algorithms { Hash.new }
26
- b.decompression_algorithms { Hash.new }
27
-
28
- b.cipher_factories { Hash.new }
29
- b.hmac_factories { Hash.new }
30
- b.key_factories { Hash.new }
31
- b.buffer_factories { Hash.new }
32
- b.bn_factories { Hash.new }
33
- b.digest_factories { Hash.new }
34
-
35
- b.ciphers( :model => :prototype ) { |c,|
36
- c.cipher_factories.fetch( c.crypto_backend ) }
37
-
38
- b.hmacs( :model => :prototype ) { |c,|
39
- c.hmac_factories.fetch( c.crypto_backend ) }
40
-
41
- b.keys( :model => :prototype ) { |c,|
42
- c.key_factories.fetch( c.crypto_backend ) }
43
-
44
- b.buffers( :model => :prototype ) { |c,|
45
- c.buffer_factories.fetch( c.crypto_backend ) }
46
-
47
- b.bns( :model => :prototype ) { |c,|
48
- c.bn_factories.fetch( c.crypto_backend ) }
49
-
50
- b.digesters( :model => :prototype ) { |c,|
51
- c.digest_factories.fetch( c.crypto_backend ) }
52
-
53
- b.identity_cipher do
54
- require 'net/ssh/transport/identity-cipher'
55
- IdentityCipher.new
56
- end
57
-
58
- b.outgoing_packet_stream :model => :prototype_deferred do |c,|
59
- require 'net/ssh/transport/packet-stream'
60
- OutgoingPacketStream.new(
61
- c.ciphers, c.hmacs, c.compression_algorithms )
62
- end
63
-
64
- b.incoming_packet_stream :model => :prototype_deferred do |c,point|
65
- require 'net/ssh/transport/packet-stream'
66
- stream = IncomingPacketStream.new(
67
- c.ciphers, c.hmacs, c.decompression_algorithms )
68
- stream.buffers = c.buffers
69
- stream.log = c.log_for( point )
70
- stream
71
- end
72
-
73
- b.algorithms do
74
- Hash[
75
- :host_key => [ "ssh-dss", "ssh-rsa" ],
76
- :kex => [ "diffie-hellman-group-exchange-sha1",
77
- "diffie-hellman-group1-sha1" ],
78
- :encryption => [ "3des-cbc",
79
- "aes128-cbc",
80
- "blowfish-cbc",
81
- "aes256-cbc",
82
- "aes192-cbc",
83
- "idea-cbc",
84
- "none" ],
85
- :hmac => [ "hmac-md5",
86
- "hmac-sha1",
87
- "hmac-md5-96",
88
- "hmac-sha1-96",
89
- "none" ],
90
- :compression => [ "none", "zlib" ],
91
- :languages => []
92
- ]
93
- end
94
-
95
- b.default_ssh_port { 22 }
96
-
97
- b.socket_factory do
98
- require 'socket'
99
- TCPSocket
100
- end
101
-
102
- b.version_negotiator do |c,point|
103
- require 'net/ssh/transport/version-negotiator'
104
- VersionNegotiator.new( c.log_for( point ) )
105
- end
106
-
107
- b.algorithm_negotiator do |c,point|
108
- require 'net/ssh/transport/algorithm-negotiator'
109
- AlgorithmNegotiator.new(
110
- c.log_for( point ),
111
- c.algorithms,
112
- c.buffers )
113
- end
114
-
115
- b.session do |c,point|
116
- require 'net/ssh/transport/session'
117
-
118
- args = [ c[:transport_host] ]
119
- args << c[:transport_options] if c.knows_key?(:transport_options)
120
-
121
- Session.new( *args ) do |s|
122
- s.logger = c[:log_for, point]
123
- s.default_port = c[:default_ssh_port]
124
- s.version_negotiator = c[:version_negotiator]
125
- s.algorithm_negotiator = c[:algorithm_negotiator]
126
- s.socket_factory = c[:socket_factory]
127
- s.packet_sender = c[:outgoing_packet_stream]
128
- s.packet_receiver = c[:incoming_packet_stream]
129
- s.ciphers = c[:ciphers]
130
- s.hmacs = c[:hmacs]
131
- s.kexs = c[:kex_names]
132
- s.compressors = c[:compression_algorithms]
133
- s.decompressors = c[:decompression_algorithms]
134
- end
135
- end
136
-
137
- b.require 'net/ssh/transport/ossl/services', "#{self}::OSSL"
138
- b.require 'net/ssh/transport/compress/services', "#{self}::Compress"
139
- b.require 'net/ssh/transport/kex/services', "#{self}::Kex"
140
- end
141
- end
142
- module_function :register_services
143
-
144
- end
145
- end
146
- end
@@ -1,73 +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
- require 'net/ssh/errors'
18
-
19
- module Net
20
- module SSH
21
- module Transport
22
-
23
- # Manages the negotiation of the version strings between client and
24
- # server.
25
- class VersionNegotiator
26
-
27
- # For processing the version header. The version reported by the server
28
- # must match this pattern.
29
- VERSION_LINE = /^SSH-/
30
-
31
- # Only versions matching this pattern are supported by Net::SSH.
32
- REQUIRED_VERSION_PATTERN = /^SSH-(1.99|2.0)-/
33
-
34
- # An array of lines returned by the server prior to reporting the
35
- # version.
36
- attr_reader :header_lines
37
-
38
- # Creates a new VersionNegotiator object that logs to the given logger
39
- # instance.
40
- def initialize( logger )
41
- @logger = logger
42
- end
43
-
44
- # Negotiate version information over the given socket. This will
45
- # return the version reported by the server.
46
- def negotiate( socket, version )
47
- server_version = ""
48
- @header_lines = []
49
-
50
- loop do
51
- server_version = socket.readline
52
- break if server_version.nil? || VERSION_LINE.match( server_version )
53
- @header_lines << server_version
54
- end
55
-
56
- if !REQUIRED_VERSION_PATTERN.match( server_version )
57
- raise Net::SSH::Exception,
58
- "incompatible ssh version #{server_version.inspect}"
59
- end
60
-
61
- if @logger.debug?
62
- @logger.debug "remote server is #{server_version.chomp.inspect}"
63
- end
64
- socket.print "#{version}\r\n"
65
-
66
- return server_version.chomp
67
- end
68
-
69
- end
70
-
71
- end
72
- end
73
- end