module Net::SSH::Transport::PacketStream

def enqueue_packet(payload)

in the client state (compression, cipher, and hmac).
The given payload is pre-processed according to the algorithms specified
Enqueues a packet to be sent, but does not immediately send the packet.
def enqueue_packet(payload)
  # try to compress the packet
  payload = client.compress(payload)
  # the length of the packet, minus the padding
  actual_length = 4 + payload.bytesize + 1
  # compute the padding length
  padding_length = client.block_size - (actual_length % client.block_size)
  padding_length += client.block_size if padding_length < 4
  # compute the packet length (sans the length field itself)
  packet_length = payload.bytesize + padding_length + 1
  if packet_length < 16
    padding_length += client.block_size
    packet_length = payload.bytesize + padding_length + 1
  end
  padding = Array.new(padding_length) { rand(256) }.pack("C*")
  unencrypted_data = [packet_length, padding_length, payload, padding].pack("NCA*A*")
  mac = client.hmac.digest([client.sequence_number, unencrypted_data].pack("NA*"))
  encrypted_data = client.update_cipher(unencrypted_data) << client.final_cipher
  message = encrypted_data + mac
  debug { "queueing packet nr #{client.sequence_number} type #{payload.getbyte(0)} len #{packet_length}" }
  enqueue(message)
  client.increment(packet_length)
  self
end