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,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
|