Handles the decompression and dencryption of incoming packets.
Methods
Attributes
[W] | buffers | A handle to the buffer factory to use when creating buffers |
[W] | log | A handle to the logger instance to use for writing log messages |
Public Class methods
Create a new IncomingPacketStream.
[ show source ]
# File lib/net/ssh/transport/packet-stream.rb, line 132 132: def initialize( ciphers, hmacs, decompressors ) 133: super( ciphers, hmacs ) 134: @decompressor = decompressors.fetch( "none" ) 135: @mutex = Mutex.new 136: end
Public Instance methods
Retrieve the next packet from the string, after (possibly) decrypting and decompressing it. The packet is returned as a reader buffer.
[ show source ]
# File lib/net/ssh/transport/packet-stream.rb, line 146 146: def get 147: @mutex.synchronize do 148: # get the first block of data 149: if @log.debug? 150: @log.debug "reading #{@cipher.block_size} bytes from socket..." 151: end 152: 153: data = read( @cipher.block_size ) 154: 155: # decipher it 156: reader = @buffers.reader( @cipher.update( data ) ) 157: 158: # determine the packet length and how many bytes remain to be read 159: packet_length = reader.read_long 160: remaining_to_read = packet_length + 4 - @cipher.block_size 161: if @log.debug? 162: @log.debug "packet length(#{packet_length}) " + 163: "remaining(#{remaining_to_read})" 164: end 165: 166: # read the remainder of the packet and decrypt it. 167: data = read( remaining_to_read ) 168: 169: # get the hmac from the tail of the packet (if one exists), and 170: # then validate it. 171: hmac = @hmac.mac_length > 0 ? read( @hmac.mac_length ) : "" 172: 173: reader.append @cipher.update( data ) unless data.empty? 174: reader.append @cipher.final 175: 176: padding_length = reader.read_byte 177: 178: payload = reader.read( packet_length - padding_length - 1 ) 179: padding = reader.read( padding_length ) if padding_length > 0 180: 181: my_computed_hmac = compute_hmac( reader.content ) 182: raise Net::SSH::Exception, "corrupted mac detected" if hmac != my_computed_hmac 183: 184: # decompress the payload 185: payload = @decompressor.decompress( payload ) 186: 187: increment_sequence_number 188: 189: buffer = @buffers.reader( payload ) 190: @log.debug "received: #{buffer.content.inspect}" if @log.debug? 191: 192: return buffer 193: end 194: end
Set the cipher, mac, and decompressor algorithms to the given values.
[ show source ]
# File lib/net/ssh/transport/packet-stream.rb, line 139 139: def set_algorithms( cipher, mac, decompressor ) 140: super( cipher, mac ) 141: @decompressor = decompressor 142: end