Handles the compression and encryption of outgoing packets.
Methods
Public Class methods
Create a new OutgoingPacketStream.
[ show source ]
# File lib/net/ssh/transport/packet-stream.rb, line 70 70: def initialize( ciphers, hmacs, compressors ) 71: super( ciphers, hmacs ) 72: @compressor = compressors.fetch( "none" ) 73: @mutex = Mutex.new 74: end
Public Instance methods
Send the given payload over the socket, after (possibly) compressing and encrypting it. The payload is converted to a string (using to_s) before being manipulated.
[ show source ]
# File lib/net/ssh/transport/packet-stream.rb, line 85 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: @socket.send message, 0 115: 116: increment_sequence_number 117: end 118: end
Set the cipher, mac, and compressor to the given values.
[ show source ]
# File lib/net/ssh/transport/packet-stream.rb, line 77 77: def set_algorithms( cipher, hmac, compressor ) 78: super( cipher, hmac ) 79: @compressor = compressor 80: end