Class: HrrRbSsh::Transport::Receiver
- Inherits:
-
Object
- Object
- HrrRbSsh::Transport::Receiver
- Defined in:
- lib/hrr_rb_ssh/transport/receiver.rb
Instance Method Summary collapse
- #depacketize(transport, packet) ⇒ Object
-
#initialize ⇒ Receiver
constructor
A new instance of Receiver.
- #receive(transport) ⇒ Object
- #receive_mac(transport) ⇒ Object
- #receive_packet(transport) ⇒ Object
Constructor Details
#initialize ⇒ Receiver
Returns a new instance of Receiver.
10 11 12 |
# File 'lib/hrr_rb_ssh/transport/receiver.rb', line 10 def initialize @logger = Logger.new self.class.name end |
Instance Method Details
#depacketize(transport, packet) ⇒ Object
14 15 16 17 18 19 20 21 22 23 24 25 |
# File 'lib/hrr_rb_ssh/transport/receiver.rb', line 14 def depacketize transport, packet packet_length_field_length = 4 padding_length_field_length = 1 packet_length = packet[0,4].unpack("N")[0] padding_length = packet[4,1].unpack("C")[0] deflated_payload_length = packet_length - padding_length_field_length - padding_length deflated_payload = packet[packet_length_field_length + padding_length_field_length, deflated_payload_length] payload = transport.incoming_compression_algorithm.inflate deflated_payload payload end |
#receive(transport) ⇒ Object
64 65 66 67 68 69 70 71 72 73 74 |
# File 'lib/hrr_rb_ssh/transport/receiver.rb', line 64 def receive transport unencrypted_packet = receive_packet transport payload = depacketize transport, unencrypted_packet mac = receive_mac transport raise if mac != transport.incoming_mac_algorithm.compute( transport.incoming_sequence_number.sequence_number, unencrypted_packet ) transport.incoming_sequence_number.increment payload end |
#receive_mac(transport) ⇒ Object
54 55 56 57 58 59 60 61 62 |
# File 'lib/hrr_rb_ssh/transport/receiver.rb', line 54 def receive_mac transport mac_length = transport.incoming_mac_algorithm.digest_length mac = transport.io.read mac_length if (mac == nil) || (mac.length != mac_length) @logger.warn { "IO is EOF" } raise EOFError end mac end |
#receive_packet(transport) ⇒ Object
27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
# File 'lib/hrr_rb_ssh/transport/receiver.rb', line 27 def receive_packet transport packet_length_field_length = 4 minimum_block_size = 8 encrypted_packet = Array.new unencrypted_packet = Array.new block_size = [transport.incoming_encryption_algorithm.block_size, minimum_block_size].max encrypted_packet.push transport.io.read(block_size) if (encrypted_packet.last == nil) || (encrypted_packet.last.length != block_size) @logger.warn { "IO is EOF" } raise EOFError end unencrypted_packet.push transport.incoming_encryption_algorithm.decrypt(encrypted_packet.last) packet_length = unencrypted_packet.last[0,4].unpack("N")[0] following_packet_length = packet_length_field_length + packet_length - block_size encrypted_packet.push transport.io.read(following_packet_length) if (encrypted_packet.last == nil) || (encrypted_packet.last.length != following_packet_length) @logger.warn { "IO is EOF" } raise EOFError end unencrypted_packet.push transport.incoming_encryption_algorithm.decrypt(encrypted_packet.last) unencrypted_packet.join end |