Class: HrrRbSsh::Transport
- Inherits:
-
Object
- Object
- HrrRbSsh::Transport
- Includes:
- Constant
- Defined in:
- lib/hrr_rb_ssh/transport.rb,
lib/hrr_rb_ssh/transport/sender.rb,
lib/hrr_rb_ssh/transport/constant.rb,
lib/hrr_rb_ssh/transport/receiver.rb,
lib/hrr_rb_ssh/transport/direction.rb,
lib/hrr_rb_ssh/transport/kex_algorithm.rb,
lib/hrr_rb_ssh/transport/mac_algorithm.rb,
lib/hrr_rb_ssh/transport/sequence_number.rb,
lib/hrr_rb_ssh/transport/mac_algorithm/none.rb,
lib/hrr_rb_ssh/transport/encryption_algorithm.rb,
lib/hrr_rb_ssh/transport/compression_algorithm.rb,
lib/hrr_rb_ssh/transport/mac_algorithm/hmac_md5.rb,
lib/hrr_rb_ssh/transport/mac_algorithm/hmac_sha1.rb,
lib/hrr_rb_ssh/transport/encryption_algorithm/none.rb,
lib/hrr_rb_ssh/transport/mac_algorithm/hmac_md5_96.rb,
lib/hrr_rb_ssh/transport/server_host_key_algorithm.rb,
lib/hrr_rb_ssh/transport/compression_algorithm/none.rb,
lib/hrr_rb_ssh/transport/compression_algorithm/zlib.rb,
lib/hrr_rb_ssh/transport/mac_algorithm/functionable.rb,
lib/hrr_rb_ssh/transport/mac_algorithm/hmac_sha1_96.rb,
lib/hrr_rb_ssh/transport/kex_algorithm/iv_computable.rb,
lib/hrr_rb_ssh/transport/mac_algorithm/hmac_sha2_256.rb,
lib/hrr_rb_ssh/transport/mac_algorithm/hmac_sha2_512.rb,
lib/hrr_rb_ssh/transport/encryption_algorithm/arcfour.rb,
lib/hrr_rb_ssh/transport/kex_algorithm/diffie_hellman.rb,
lib/hrr_rb_ssh/transport/mac_algorithm/unfunctionable.rb,
lib/hrr_rb_ssh/transport/encryption_algorithm/aes128_cbc.rb,
lib/hrr_rb_ssh/transport/encryption_algorithm/aes128_ctr.rb,
lib/hrr_rb_ssh/transport/encryption_algorithm/aes192_cbc.rb,
lib/hrr_rb_ssh/transport/encryption_algorithm/aes192_ctr.rb,
lib/hrr_rb_ssh/transport/encryption_algorithm/aes256_cbc.rb,
lib/hrr_rb_ssh/transport/encryption_algorithm/aes256_ctr.rb,
lib/hrr_rb_ssh/transport/kex_algorithm/diffie_hellman/h0.rb,
lib/hrr_rb_ssh/transport/encryption_algorithm/cast128_cbc.rb,
lib/hrr_rb_ssh/transport/encryption_algorithm/blowfish_cbc.rb,
lib/hrr_rb_ssh/transport/encryption_algorithm/functionable.rb,
lib/hrr_rb_ssh/transport/server_host_key_algorithm/ssh_dss.rb,
lib/hrr_rb_ssh/transport/server_host_key_algorithm/ssh_rsa.rb,
lib/hrr_rb_ssh/transport/compression_algorithm/functionable.rb,
lib/hrr_rb_ssh/transport/encryption_algorithm/three_des_cbc.rb,
lib/hrr_rb_ssh/transport/encryption_algorithm/unfunctionable.rb,
lib/hrr_rb_ssh/transport/compression_algorithm/unfunctionable.rb,
lib/hrr_rb_ssh/transport/server_host_key_algorithm/functionable.rb,
lib/hrr_rb_ssh/transport/kex_algorithm/diffie_hellman_group1_sha1.rb,
lib/hrr_rb_ssh/transport/kex_algorithm/diffie_hellman_group14_sha1.rb,
lib/hrr_rb_ssh/transport/kex_algorithm/diffie_hellman_group14_sha256.rb,
lib/hrr_rb_ssh/transport/kex_algorithm/diffie_hellman_group15_sha512.rb,
lib/hrr_rb_ssh/transport/kex_algorithm/diffie_hellman_group16_sha512.rb,
lib/hrr_rb_ssh/transport/kex_algorithm/diffie_hellman_group17_sha512.rb,
lib/hrr_rb_ssh/transport/kex_algorithm/diffie_hellman_group18_sha512.rb,
lib/hrr_rb_ssh/transport/kex_algorithm/diffie_hellman_group_exchange.rb,
lib/hrr_rb_ssh/transport/kex_algorithm/elliptic_curve_diffie_hellman.rb,
lib/hrr_rb_ssh/transport/server_host_key_algorithm/ecdsa_sha2_nistp256.rb,
lib/hrr_rb_ssh/transport/server_host_key_algorithm/ecdsa_sha2_nistp384.rb,
lib/hrr_rb_ssh/transport/server_host_key_algorithm/ecdsa_sha2_nistp521.rb,
lib/hrr_rb_ssh/transport/kex_algorithm/diffie_hellman_group_exchange/h0.rb,
lib/hrr_rb_ssh/transport/kex_algorithm/elliptic_curve_diffie_hellman/h0.rb,
lib/hrr_rb_ssh/transport/kex_algorithm/diffie_hellman_group_exchange_sha1.rb,
lib/hrr_rb_ssh/transport/kex_algorithm/diffie_hellman_group_exchange_sha256.rb,
lib/hrr_rb_ssh/transport/kex_algorithm/elliptic_curve_diffie_hellman_sha2_nistp256.rb,
lib/hrr_rb_ssh/transport/kex_algorithm/elliptic_curve_diffie_hellman_sha2_nistp384.rb,
lib/hrr_rb_ssh/transport/kex_algorithm/elliptic_curve_diffie_hellman_sha2_nistp521.rb
Defined Under Namespace
Modules: Constant, Direction Classes: CompressionAlgorithm, EncryptionAlgorithm, KexAlgorithm, MacAlgorithm, Receiver, Sender, SequenceNumber, ServerHostKeyAlgorithm
Constant Summary
Constants included from Constant
Instance Attribute Summary collapse
-
#i_c ⇒ Object
readonly
Returns the value of attribute i_c.
-
#i_s ⇒ Object
readonly
Returns the value of attribute i_s.
-
#incoming_compression_algorithm ⇒ Object
readonly
Returns the value of attribute incoming_compression_algorithm.
-
#incoming_encryption_algorithm ⇒ Object
readonly
Returns the value of attribute incoming_encryption_algorithm.
-
#incoming_mac_algorithm ⇒ Object
readonly
Returns the value of attribute incoming_mac_algorithm.
-
#incoming_sequence_number ⇒ Object
readonly
Returns the value of attribute incoming_sequence_number.
-
#io ⇒ Object
readonly
Returns the value of attribute io.
-
#outgoing_compression_algorithm ⇒ Object
readonly
Returns the value of attribute outgoing_compression_algorithm.
-
#outgoing_encryption_algorithm ⇒ Object
readonly
Returns the value of attribute outgoing_encryption_algorithm.
-
#outgoing_mac_algorithm ⇒ Object
readonly
Returns the value of attribute outgoing_mac_algorithm.
-
#outgoing_sequence_number ⇒ Object
readonly
Returns the value of attribute outgoing_sequence_number.
-
#preferred_compression_algorithms ⇒ Object
readonly
Returns the value of attribute preferred_compression_algorithms.
-
#preferred_encryption_algorithms ⇒ Object
readonly
Returns the value of attribute preferred_encryption_algorithms.
-
#preferred_kex_algorithms ⇒ Object
readonly
Returns the value of attribute preferred_kex_algorithms.
-
#preferred_mac_algorithms ⇒ Object
readonly
Returns the value of attribute preferred_mac_algorithms.
-
#preferred_server_host_key_algorithms ⇒ Object
readonly
Returns the value of attribute preferred_server_host_key_algorithms.
-
#server_host_key_algorithm ⇒ Object
readonly
Returns the value of attribute server_host_key_algorithm.
-
#session_id ⇒ Object
readonly
Returns the value of attribute session_id.
-
#supported_compression_algorithms ⇒ Object
readonly
Returns the value of attribute supported_compression_algorithms.
-
#supported_encryption_algorithms ⇒ Object
readonly
Returns the value of attribute supported_encryption_algorithms.
-
#supported_kex_algorithms ⇒ Object
readonly
Returns the value of attribute supported_kex_algorithms.
-
#supported_mac_algorithms ⇒ Object
readonly
Returns the value of attribute supported_mac_algorithms.
-
#supported_server_host_key_algorithms ⇒ Object
readonly
Returns the value of attribute supported_server_host_key_algorithms.
-
#v_c ⇒ Object
readonly
Returns the value of attribute v_c.
-
#v_s ⇒ Object
readonly
Returns the value of attribute v_s.
Instance Method Summary collapse
- #check_if_preferred_algorithms_are_supported ⇒ Object
- #close ⇒ Object
- #closed? ⇒ Boolean
- #disconnect ⇒ Object
- #exchange_key(payload = nil) ⇒ Object
- #exchange_version ⇒ Object
-
#initialize(io, mode, options = {}) ⇒ Transport
constructor
A new instance of Transport.
- #initialize_algorithms ⇒ Object
- #initialize_local_algorithms ⇒ Object
- #receive ⇒ Object
- #receive_kexinit(payload) ⇒ Object
- #receive_newkeys(payload) ⇒ Object
- #receive_service_request ⇒ Object
- #receive_version ⇒ Object
- #register_acceptable_service(service_name) ⇒ Object
- #send(payload) ⇒ Object
- #send_disconnect ⇒ Object
- #send_kexinit ⇒ Object
- #send_newkeys ⇒ Object
- #send_service_accept(service_name) ⇒ Object
- #send_version ⇒ Object
- #start ⇒ Object
- #start_kex_algorithm ⇒ Object
- #update_compression_algorithm ⇒ Object
- #update_encryption_algorithm ⇒ Object
- #update_encryption_mac_compression_algorithms ⇒ Object
- #update_kex_and_server_host_key_algorithms ⇒ Object
- #update_mac_algorithm ⇒ Object
- #update_preferred_algorithms ⇒ Object
- #update_remote_algorithms(message) ⇒ Object
- #update_supported_algorithms ⇒ Object
- #update_version_strings ⇒ Object
- #verify_service_request ⇒ Object
Constructor Details
#initialize(io, mode, options = {}) ⇒ Transport
Returns a new instance of Transport.
52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 |
# File 'lib/hrr_rb_ssh/transport.rb', line 52 def initialize io, mode, ={} @io = io @mode = mode @options = @logger = Logger.new self.class.name @closed = nil @disconnected = nil @in_kex = false @sender = Sender.new @receiver = Receiver.new @sender_monitor = Monitor.new @receiver_monitor = Monitor.new @local_version = "SSH-2.0-HrrRbSsh-#{VERSION}".force_encoding(Encoding::ASCII_8BIT) @remote_version = "".force_encoding(Encoding::ASCII_8BIT) @incoming_sequence_number = SequenceNumber.new @outgoing_sequence_number = SequenceNumber.new @acceptable_services = Array.new update_supported_algorithms update_preferred_algorithms initialize_local_algorithms initialize_algorithms end |
Instance Attribute Details
#i_c ⇒ Object (readonly)
Returns the value of attribute i_c.
25 26 27 |
# File 'lib/hrr_rb_ssh/transport.rb', line 25 def i_c @i_c end |
#i_s ⇒ Object (readonly)
Returns the value of attribute i_s.
25 26 27 |
# File 'lib/hrr_rb_ssh/transport.rb', line 25 def i_s @i_s end |
#incoming_compression_algorithm ⇒ Object (readonly)
Returns the value of attribute incoming_compression_algorithm.
25 26 27 |
# File 'lib/hrr_rb_ssh/transport.rb', line 25 def incoming_compression_algorithm @incoming_compression_algorithm end |
#incoming_encryption_algorithm ⇒ Object (readonly)
Returns the value of attribute incoming_encryption_algorithm.
25 26 27 |
# File 'lib/hrr_rb_ssh/transport.rb', line 25 def incoming_encryption_algorithm @incoming_encryption_algorithm end |
#incoming_mac_algorithm ⇒ Object (readonly)
Returns the value of attribute incoming_mac_algorithm.
25 26 27 |
# File 'lib/hrr_rb_ssh/transport.rb', line 25 def incoming_mac_algorithm @incoming_mac_algorithm end |
#incoming_sequence_number ⇒ Object (readonly)
Returns the value of attribute incoming_sequence_number.
25 26 27 |
# File 'lib/hrr_rb_ssh/transport.rb', line 25 def incoming_sequence_number @incoming_sequence_number end |
#io ⇒ Object (readonly)
Returns the value of attribute io.
25 26 27 |
# File 'lib/hrr_rb_ssh/transport.rb', line 25 def io @io end |
#outgoing_compression_algorithm ⇒ Object (readonly)
Returns the value of attribute outgoing_compression_algorithm.
25 26 27 |
# File 'lib/hrr_rb_ssh/transport.rb', line 25 def outgoing_compression_algorithm @outgoing_compression_algorithm end |
#outgoing_encryption_algorithm ⇒ Object (readonly)
Returns the value of attribute outgoing_encryption_algorithm.
25 26 27 |
# File 'lib/hrr_rb_ssh/transport.rb', line 25 def outgoing_encryption_algorithm @outgoing_encryption_algorithm end |
#outgoing_mac_algorithm ⇒ Object (readonly)
Returns the value of attribute outgoing_mac_algorithm.
25 26 27 |
# File 'lib/hrr_rb_ssh/transport.rb', line 25 def outgoing_mac_algorithm @outgoing_mac_algorithm end |
#outgoing_sequence_number ⇒ Object (readonly)
Returns the value of attribute outgoing_sequence_number.
25 26 27 |
# File 'lib/hrr_rb_ssh/transport.rb', line 25 def outgoing_sequence_number @outgoing_sequence_number end |
#preferred_compression_algorithms ⇒ Object (readonly)
Returns the value of attribute preferred_compression_algorithms.
25 26 27 |
# File 'lib/hrr_rb_ssh/transport.rb', line 25 def preferred_compression_algorithms @preferred_compression_algorithms end |
#preferred_encryption_algorithms ⇒ Object (readonly)
Returns the value of attribute preferred_encryption_algorithms.
25 26 27 |
# File 'lib/hrr_rb_ssh/transport.rb', line 25 def preferred_encryption_algorithms @preferred_encryption_algorithms end |
#preferred_kex_algorithms ⇒ Object (readonly)
Returns the value of attribute preferred_kex_algorithms.
25 26 27 |
# File 'lib/hrr_rb_ssh/transport.rb', line 25 def preferred_kex_algorithms @preferred_kex_algorithms end |
#preferred_mac_algorithms ⇒ Object (readonly)
Returns the value of attribute preferred_mac_algorithms.
25 26 27 |
# File 'lib/hrr_rb_ssh/transport.rb', line 25 def preferred_mac_algorithms @preferred_mac_algorithms end |
#preferred_server_host_key_algorithms ⇒ Object (readonly)
Returns the value of attribute preferred_server_host_key_algorithms.
25 26 27 |
# File 'lib/hrr_rb_ssh/transport.rb', line 25 def preferred_server_host_key_algorithms @preferred_server_host_key_algorithms end |
#server_host_key_algorithm ⇒ Object (readonly)
Returns the value of attribute server_host_key_algorithm.
25 26 27 |
# File 'lib/hrr_rb_ssh/transport.rb', line 25 def server_host_key_algorithm @server_host_key_algorithm end |
#session_id ⇒ Object (readonly)
Returns the value of attribute session_id.
25 26 27 |
# File 'lib/hrr_rb_ssh/transport.rb', line 25 def session_id @session_id end |
#supported_compression_algorithms ⇒ Object (readonly)
Returns the value of attribute supported_compression_algorithms.
25 26 27 |
# File 'lib/hrr_rb_ssh/transport.rb', line 25 def supported_compression_algorithms @supported_compression_algorithms end |
#supported_encryption_algorithms ⇒ Object (readonly)
Returns the value of attribute supported_encryption_algorithms.
25 26 27 |
# File 'lib/hrr_rb_ssh/transport.rb', line 25 def supported_encryption_algorithms @supported_encryption_algorithms end |
#supported_kex_algorithms ⇒ Object (readonly)
Returns the value of attribute supported_kex_algorithms.
25 26 27 |
# File 'lib/hrr_rb_ssh/transport.rb', line 25 def supported_kex_algorithms @supported_kex_algorithms end |
#supported_mac_algorithms ⇒ Object (readonly)
Returns the value of attribute supported_mac_algorithms.
25 26 27 |
# File 'lib/hrr_rb_ssh/transport.rb', line 25 def supported_mac_algorithms @supported_mac_algorithms end |
#supported_server_host_key_algorithms ⇒ Object (readonly)
Returns the value of attribute supported_server_host_key_algorithms.
25 26 27 |
# File 'lib/hrr_rb_ssh/transport.rb', line 25 def supported_server_host_key_algorithms @supported_server_host_key_algorithms end |
#v_c ⇒ Object (readonly)
Returns the value of attribute v_c.
25 26 27 |
# File 'lib/hrr_rb_ssh/transport.rb', line 25 def v_c @v_c end |
#v_s ⇒ Object (readonly)
Returns the value of attribute v_s.
25 26 27 |
# File 'lib/hrr_rb_ssh/transport.rb', line 25 def v_s @v_s end |
Instance Method Details
#check_if_preferred_algorithms_are_supported ⇒ Object
269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 |
# File 'lib/hrr_rb_ssh/transport.rb', line 269 def check_if_preferred_algorithms_are_supported [ ['kex', @preferred_kex_algorithms, @supported_kex_algorithms ], ['server host key', @preferred_server_host_key_algorithms, @supported_server_host_key_algorithms], ['encryption', @preferred_encryption_algorithms, @supported_encryption_algorithms ], ['mac', @preferred_mac_algorithms, @supported_mac_algorithms ], ['compression', @preferred_compression_algorithms, @supported_compression_algorithms ], ].each{ |algorithm_name, list_preferred, list_supported| list_preferred.each{ |a| unless list_supported.include? a raise ArgumentError, "#{algorithm_name} algorithm #{a} is not supported" end } } end |
#close ⇒ Object
183 184 185 186 187 188 189 190 191 |
# File 'lib/hrr_rb_ssh/transport.rb', line 183 def close return if @closed @logger.info { "close transport" } @closed = true disconnect @incoming_compression_algorithm.close @outgoing_compression_algorithm.close @logger.info { "transport closed" } end |
#closed? ⇒ Boolean
193 194 195 |
# File 'lib/hrr_rb_ssh/transport.rb', line 193 def closed? @closed end |
#disconnect ⇒ Object
197 198 199 200 201 202 203 204 205 206 207 208 209 |
# File 'lib/hrr_rb_ssh/transport.rb', line 197 def disconnect return if @disconnected @logger.info { "disconnect transport" } @disconnected = true begin send_disconnect rescue IOError @logger.warn { "IO is closed" } rescue => e @logger.error { [e.backtrace[0], ": ", e., " (", e.class.to_s, ")\n\t", e.backtrace[1..-1].join("\n\t")].join } end @logger.info { "transport disconnected" } end |
#exchange_key(payload = nil) ⇒ Object
217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 |
# File 'lib/hrr_rb_ssh/transport.rb', line 217 def exchange_key payload=nil @in_kex = true @sender_monitor.synchronize do @receiver_monitor.synchronize do send_kexinit if payload receive_kexinit payload else receive_kexinit receive end update_kex_and_server_host_key_algorithms start_kex_algorithm send_newkeys receive_newkeys receive update_encryption_mac_compression_algorithms end end @in_kex = false end |
#exchange_version ⇒ Object
211 212 213 214 215 |
# File 'lib/hrr_rb_ssh/transport.rb', line 211 def exchange_version send_version receive_version update_version_strings end |
#initialize_algorithms ⇒ Object
296 297 298 299 300 301 302 303 304 |
# File 'lib/hrr_rb_ssh/transport.rb', line 296 def initialize_algorithms @incoming_encryption_algorithm = EncryptionAlgorithm['none'].new @incoming_mac_algorithm = MacAlgorithm['none'].new @incoming_compression_algorithm = CompressionAlgorithm['none'].new @outgoing_encryption_algorithm = EncryptionAlgorithm['none'].new @outgoing_mac_algorithm = MacAlgorithm['none'].new @outgoing_compression_algorithm = CompressionAlgorithm['none'].new end |
#initialize_local_algorithms ⇒ Object
285 286 287 288 289 290 291 292 293 294 |
# File 'lib/hrr_rb_ssh/transport.rb', line 285 def initialize_local_algorithms @local_kex_algorithms = @preferred_kex_algorithms @local_server_host_key_algorithms = @preferred_server_host_key_algorithms @local_encryption_algorithms_client_to_server = @preferred_encryption_algorithms @local_encryption_algorithms_server_to_client = @preferred_encryption_algorithms @local_mac_algorithms_client_to_server = @preferred_mac_algorithms @local_mac_algorithms_server_to_client = @preferred_mac_algorithms @local_compression_algorithms_client_to_server = @preferred_compression_algorithms @local_compression_algorithms_server_to_client = @preferred_compression_algorithms end |
#receive ⇒ Object
104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 |
# File 'lib/hrr_rb_ssh/transport.rb', line 104 def receive raise Error::ClosedTransport if @closed @receiver_monitor.synchronize do begin payload = @receiver.receive self case payload[0,1].unpack("C")[0] when Message::SSH_MSG_DISCONNECT::VALUE = Message::SSH_MSG_DISCONNECT.decode payload @logger.debug { "received disconnect message: #{.inspect}" } @disconnected = true close raise Error::ClosedTransport when Message::SSH_MSG_IGNORE::VALUE = Message::SSH_MSG_IGNORE.decode payload @logger.debug { "received ignore message: #{.inspect}" } receive when Message::SSH_MSG_UNIMPLEMENTED::VALUE = Message::SSH_MSG_UNIMPLEMENTED.decode payload @logger.debug { "received unimplemented message: #{.inspect}" } receive when Message::SSH_MSG_DEBUG::VALUE = Message::SSH_MSG_DEBUG.decode payload @logger.debug { "received debug message: #{.inspect}" } receive when Message::SSH_MSG_KEXINIT::VALUE @logger.debug { "received kexinit message" } if @in_kex payload else exchange_key payload receive end else payload end rescue Error::ClosedTransport raise Error::ClosedTransport rescue EOFError => e close raise Error::ClosedTransport rescue IOError => e @logger.warn { "IO is closed" } close raise Error::ClosedTransport rescue Errno::ECONNRESET => e @logger.warn { "IO is RESET" } close raise Error::ClosedTransport rescue => e @logger.error { [e.backtrace[0], ": ", e., " (", e.class.to_s, ")\n\t", e.backtrace[1..-1].join("\n\t")].join } close raise Error::ClosedTransport end end end |
#receive_kexinit(payload) ⇒ Object
378 379 380 381 382 383 384 385 386 387 |
# File 'lib/hrr_rb_ssh/transport.rb', line 378 def receive_kexinit payload case @mode when Mode::SERVER @i_c = payload when Mode::CLIENT @i_s = payload end = Message::SSH_MSG_KEXINIT.decode payload update_remote_algorithms end |
#receive_newkeys(payload) ⇒ Object
397 398 399 |
# File 'lib/hrr_rb_ssh/transport.rb', line 397 def receive_newkeys payload = Message::SSH_MSG_NEWKEYS.decode payload end |
#receive_service_request ⇒ Object
401 402 403 404 405 406 |
# File 'lib/hrr_rb_ssh/transport.rb', line 401 def receive_service_request payload = @receiver.receive self = Message::SSH_MSG_SERVICE_REQUEST.decode payload end |
#receive_version ⇒ Object
310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 |
# File 'lib/hrr_rb_ssh/transport.rb', line 310 def receive_version str_io = StringIO.new loop do str_io.write @io.read(1) if str_io.string[-2..-1] == "#{CR}#{LF}" if str_io.string[0..3] == "SSH-" @remote_version = str_io.string[0..-3] @logger.info { "received remote version string: #{@remote_version}" } break else @logger.info { "received message before remote version string: #{str_io.string}" } str_io.rewind str_io.truncate(0) end end end end |
#register_acceptable_service(service_name) ⇒ Object
84 85 86 |
# File 'lib/hrr_rb_ssh/transport.rb', line 84 def register_acceptable_service service_name @acceptable_services.push service_name end |
#send(payload) ⇒ Object
88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 |
# File 'lib/hrr_rb_ssh/transport.rb', line 88 def send payload @sender_monitor.synchronize do begin @sender.send self, payload rescue Errno::EPIPE => e @logger.warn { "IO is Broken PIPE" } close raise Error::ClosedTransport rescue => e @logger.error { [e.backtrace[0], ": ", e., " (", e.class.to_s, ")\n\t", e.backtrace[1..-1].join("\n\t")].join } close raise Error::ClosedTransport end end end |
#send_disconnect ⇒ Object
339 340 341 342 343 344 345 346 347 348 |
# File 'lib/hrr_rb_ssh/transport.rb', line 339 def send_disconnect = { :'message number' => Message::SSH_MSG_DISCONNECT::VALUE, :'reason code' => Message::SSH_MSG_DISCONNECT::ReasonCode::SSH_DISCONNECT_BY_APPLICATION, :'description' => "disconnected by user", :'language tag' => "" } payload = Message::SSH_MSG_DISCONNECT.encode send payload end |
#send_kexinit ⇒ Object
350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 |
# File 'lib/hrr_rb_ssh/transport.rb', line 350 def send_kexinit = { :'message number' => Message::SSH_MSG_KEXINIT::VALUE, :'cookie (random byte)' => lambda { rand(0x01_00) }, :'kex_algorithms' => @local_kex_algorithms, :'server_host_key_algorithms' => @local_server_host_key_algorithms, :'encryption_algorithms_client_to_server' => @local_encryption_algorithms_client_to_server, :'encryption_algorithms_server_to_client' => @local_encryption_algorithms_server_to_client, :'mac_algorithms_client_to_server' => @local_mac_algorithms_client_to_server, :'mac_algorithms_server_to_client' => @local_mac_algorithms_server_to_client, :'compression_algorithms_client_to_server' => @local_compression_algorithms_client_to_server, :'compression_algorithms_server_to_client' => @local_compression_algorithms_server_to_client, :'languages_client_to_server' => [], :'languages_server_to_client' => [], :'first_kex_packet_follows' => false, :'0 (reserved for future extension)' => 0, } payload = Message::SSH_MSG_KEXINIT.encode send payload case @mode when Mode::SERVER @i_s = payload when Mode::CLIENT @i_c = payload end end |
#send_newkeys ⇒ Object
389 390 391 392 393 394 395 |
# File 'lib/hrr_rb_ssh/transport.rb', line 389 def send_newkeys = { :'message number' => Message::SSH_MSG_NEWKEYS::VALUE, } payload = Message::SSH_MSG_NEWKEYS.encode send payload end |
#send_service_accept(service_name) ⇒ Object
408 409 410 411 412 413 414 415 |
# File 'lib/hrr_rb_ssh/transport.rb', line 408 def send_service_accept service_name = { :'message number' => Message::SSH_MSG_SERVICE_ACCEPT::VALUE, :'service name' => service_name, } payload = Message::SSH_MSG_SERVICE_ACCEPT.encode send payload end |
#send_version ⇒ Object
306 307 308 |
# File 'lib/hrr_rb_ssh/transport.rb', line 306 def send_version @io.write (@local_version + CR + LF) end |
#start ⇒ Object
160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 |
# File 'lib/hrr_rb_ssh/transport.rb', line 160 def start @logger.info { "start transport" } begin exchange_version exchange_key case @mode when Mode::SERVER verify_service_request end @closed = false rescue EOFError => e close rescue => e @logger.error { [e.backtrace[0], ": ", e., " (", e.class.to_s, ")\n\t", e.backtrace[1..-1].join("\n\t")].join } close else @logger.info { "transport started" } end end |
#start_kex_algorithm ⇒ Object
237 238 239 |
# File 'lib/hrr_rb_ssh/transport.rb', line 237 def start_kex_algorithm @kex_algorithm.start self, @mode end |
#update_compression_algorithm ⇒ Object
480 481 482 483 484 485 486 487 488 489 490 491 492 |
# File 'lib/hrr_rb_ssh/transport.rb', line 480 def update_compression_algorithm case @mode when Mode::SERVER compression_algorithm_c_to_s_name = @remote_compression_algorithms_client_to_server.find{ |a| @local_compression_algorithms_client_to_server.include? a } or raise compression_algorithm_s_to_c_name = @remote_compression_algorithms_server_to_client.find{ |a| @local_compression_algorithms_server_to_client.include? a } or raise incoming_compression_algorithm_name = compression_algorithm_c_to_s_name outgoing_compression_algorithm_name = compression_algorithm_s_to_c_name end @incoming_compression_algorithm.close @outgoing_compression_algorithm.close @incoming_compression_algorithm = CompressionAlgorithm[incoming_compression_algorithm_name].new Direction::INCOMING @outgoing_compression_algorithm = CompressionAlgorithm[outgoing_compression_algorithm_name].new Direction::OUTGOING end |
#update_encryption_algorithm ⇒ Object
450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 |
# File 'lib/hrr_rb_ssh/transport.rb', line 450 def update_encryption_algorithm case @mode when Mode::SERVER encryption_algorithm_c_to_s_name = @remote_encryption_algorithms_client_to_server.find{ |a| @local_encryption_algorithms_client_to_server.include? a } or raise encryption_algorithm_s_to_c_name = @remote_encryption_algorithms_server_to_client.find{ |a| @local_encryption_algorithms_server_to_client.include? a } or raise incoming_encryption_algorithm_name = encryption_algorithm_c_to_s_name outgoing_encryption_algorithm_name = encryption_algorithm_s_to_c_name incoming_crpt_iv = @kex_algorithm.iv_c_to_s self, incoming_encryption_algorithm_name outgoing_crpt_iv = @kex_algorithm.iv_s_to_c self, outgoing_encryption_algorithm_name incoming_crpt_key = @kex_algorithm.key_c_to_s self, incoming_encryption_algorithm_name outgoing_crpt_key = @kex_algorithm.key_s_to_c self, outgoing_encryption_algorithm_name end @incoming_encryption_algorithm = EncryptionAlgorithm[incoming_encryption_algorithm_name].new Direction::INCOMING, incoming_crpt_iv, incoming_crpt_key @outgoing_encryption_algorithm = EncryptionAlgorithm[outgoing_encryption_algorithm_name].new Direction::OUTGOING, outgoing_crpt_iv, outgoing_crpt_key end |
#update_encryption_mac_compression_algorithms ⇒ Object
443 444 445 446 447 448 |
# File 'lib/hrr_rb_ssh/transport.rb', line 443 def update_encryption_mac_compression_algorithms @session_id ||= @kex_algorithm.hash(self) update_encryption_algorithm update_mac_algorithm update_compression_algorithm end |
#update_kex_and_server_host_key_algorithms ⇒ Object
428 429 430 431 432 433 434 435 436 437 438 439 440 441 |
# File 'lib/hrr_rb_ssh/transport.rb', line 428 def update_kex_and_server_host_key_algorithms case @mode when Mode::SERVER kex_algorithm_name = @remote_kex_algorithms.find{ |a| @local_kex_algorithms.include? a } or raise server_host_key_algorithm_name = @remote_server_host_key_algorithms.find{ |a| @local_server_host_key_algorithms.include? a } or raise when Mode::CLIENT kex_algorithm_name = @local_kex_algorithms.find{ |a| @remote_kex_algorithms.include? a } or raise server_host_key_algorithm_name = @local_server_host_key_algorithms.find{ |a| @remote_server_host_key_algorithms.include? a } or raise end server_secret_host_key = @options.fetch('transport_server_secret_host_keys', {}).fetch(server_host_key_algorithm_name, nil) @kex_algorithm = KexAlgorithm[kex_algorithm_name].new @server_host_key_algorithm = ServerHostKeyAlgorithm[server_host_key_algorithm_name].new server_secret_host_key end |
#update_mac_algorithm ⇒ Object
466 467 468 469 470 471 472 473 474 475 476 477 478 |
# File 'lib/hrr_rb_ssh/transport.rb', line 466 def update_mac_algorithm case @mode when Mode::SERVER mac_algorithm_c_to_s_name = @remote_mac_algorithms_client_to_server.find{ |a| @local_mac_algorithms_client_to_server.include? a } or raise mac_algorithm_s_to_c_name = @remote_mac_algorithms_server_to_client.find{ |a| @local_mac_algorithms_server_to_client.include? a } or raise incoming_mac_algorithm_name = mac_algorithm_c_to_s_name outgoing_mac_algorithm_name = mac_algorithm_s_to_c_name incoming_mac_key = @kex_algorithm.mac_c_to_s self, incoming_mac_algorithm_name outgoing_mac_key = @kex_algorithm.mac_s_to_c self, outgoing_mac_algorithm_name end @incoming_mac_algorithm = MacAlgorithm[incoming_mac_algorithm_name].new incoming_mac_key @outgoing_mac_algorithm = MacAlgorithm[outgoing_mac_algorithm_name].new outgoing_mac_key end |
#update_preferred_algorithms ⇒ Object
259 260 261 262 263 264 265 266 267 |
# File 'lib/hrr_rb_ssh/transport.rb', line 259 def update_preferred_algorithms @preferred_kex_algorithms = @options['transport_preferred_kex_algorithms'] || KexAlgorithm.list_preferred @preferred_server_host_key_algorithms = @options['transport_preferred_server_host_key_algorithms'] || ServerHostKeyAlgorithm.list_preferred @preferred_encryption_algorithms = @options['transport_preferred_encryption_algorithms'] || EncryptionAlgorithm.list_preferred @preferred_mac_algorithms = @options['transport_preferred_mac_algorithms'] || MacAlgorithm.list_preferred @preferred_compression_algorithms = @options['transport_preferred_compression_algorithms'] || CompressionAlgorithm.list_preferred check_if_preferred_algorithms_are_supported end |
#update_remote_algorithms(message) ⇒ Object
417 418 419 420 421 422 423 424 425 426 |
# File 'lib/hrr_rb_ssh/transport.rb', line 417 def update_remote_algorithms @remote_kex_algorithms = [:'kex_algorithms'] @remote_server_host_key_algorithms = [:'server_host_key_algorithms'] @remote_encryption_algorithms_client_to_server = [:'encryption_algorithms_client_to_server'] @remote_encryption_algorithms_server_to_client = [:'encryption_algorithms_server_to_client'] @remote_mac_algorithms_client_to_server = [:'mac_algorithms_client_to_server'] @remote_mac_algorithms_server_to_client = [:'mac_algorithms_server_to_client'] @remote_compression_algorithms_client_to_server = [:'compression_algorithms_client_to_server'] @remote_compression_algorithms_server_to_client = [:'compression_algorithms_server_to_client'] end |
#update_supported_algorithms ⇒ Object
251 252 253 254 255 256 257 |
# File 'lib/hrr_rb_ssh/transport.rb', line 251 def update_supported_algorithms @supported_kex_algorithms = KexAlgorithm.list_supported @supported_server_host_key_algorithms = ServerHostKeyAlgorithm.list_supported @supported_encryption_algorithms = EncryptionAlgorithm.list_supported @supported_mac_algorithms = MacAlgorithm.list_supported @supported_compression_algorithms = CompressionAlgorithm.list_supported end |
#update_version_strings ⇒ Object
328 329 330 331 332 333 334 335 336 337 |
# File 'lib/hrr_rb_ssh/transport.rb', line 328 def update_version_strings case @mode when Mode::SERVER @v_c = @remote_version @v_s = @local_version when Mode::CLIENT @v_c = @local_version @v_s = @remote_version end end |
#verify_service_request ⇒ Object
241 242 243 244 245 246 247 248 249 |
# File 'lib/hrr_rb_ssh/transport.rb', line 241 def verify_service_request = receive_service_request service_name = [:'service name'] if @acceptable_services.include? service_name send_service_accept service_name else close end end |