module Net::SSH::Transport::PacketStream

def poll_next_packet

new Packet object.
algorithms specified in the server state object, and returned as a
read, post-processed according to the cipher, hmac, and compression
an entire packet, this returns immediately, otherwise the packet is
Tries to read the next packet. If there is insufficient data to read
def poll_next_packet
  if @packet.nil?
    minimum = server.block_size < 4 ? 4 : server.block_size
    return nil if available < minimum
    data = read_available(minimum)
    # decipher it
    @packet = Net::SSH::Buffer.new(server.update_cipher(data))
    @packet_length = @packet.read_long
  end
  need = @packet_length + 4 - server.block_size
  raise Net::SSH::Exception, "padding error, need #{need} block #{server.block_size}" if need % server.block_size != 0
  return nil if available < need + server.hmac.mac_length
  if need > 0
    # read the remainder of the packet and decrypt it.
    data = read_available(need)
    @packet.append(server.update_cipher(data))
  end
  # get the hmac from the tail of the packet (if one exists), and
  # then validate it.
  real_hmac = read_available(server.hmac.mac_length) || ""
  @packet.append(server.final_cipher)
  padding_length = @packet.read_byte
  payload = @packet.read(@packet_length - padding_length - 1)
  my_computed_hmac = server.hmac.digest([server.sequence_number, @packet.content].pack("NA*"))
  raise Net::SSH::Exception, "corrupted mac detected" if real_hmac != my_computed_hmac
  # try to decompress the payload, in case compression is active
  payload = server.decompress(payload)
  debug { "received packet nr #{server.sequence_number} type #{payload.getbyte(0)} len #{@packet_length}" }
  server.increment(@packet_length)
  @packet = nil
  return Packet.new(payload)
end