class HrrRbSsh::Transport::Sender

Public Class Methods

new(logger: nil) click to toggle source
# File lib/hrr_rb_ssh/transport/sender.rb, line 11
def initialize logger: nil
  self.logger = logger
end

Public Instance Methods

encrypt(transport, packet) click to toggle source
# File lib/hrr_rb_ssh/transport/sender.rb, line 33
def encrypt transport, packet
  encrypted_packet = transport.outgoing_encryption_algorithm.encrypt packet

  encrypted_packet
end
packetize(transport, payload) click to toggle source
# File lib/hrr_rb_ssh/transport/sender.rb, line 15
def packetize transport, payload
  packet_length_field_length  = 4
  padding_length_field_length = 1
  minimum_padding_length      = 4
  minimum_block_size          = 8

  block_size       = [transport.outgoing_encryption_algorithm.block_size, minimum_block_size].max
  deflated_payload = transport.outgoing_compression_algorithm.deflate payload
  tmp_total_length = packet_length_field_length + padding_length_field_length + deflated_payload.length + minimum_padding_length
  total_length     = tmp_total_length + (block_size - (tmp_total_length % block_size))
  packet_length    = total_length - packet_length_field_length
  padding_length   = packet_length - padding_length_field_length - deflated_payload.length
  padding          = OpenSSL::Random.random_bytes( padding_length )
  packet           = [packet_length, padding_length].pack("NC") + deflated_payload + padding

  packet
end
send(transport, payload) click to toggle source
# File lib/hrr_rb_ssh/transport/sender.rb, line 49
def send transport, payload
  packet = packetize transport, payload

  send_packet transport, packet
  send_mac    transport, packet

  transport.outgoing_sequence_number.increment
end
send_mac(transport, packet) click to toggle source
# File lib/hrr_rb_ssh/transport/sender.rb, line 44
def send_mac transport, packet
  mac = transport.outgoing_mac_algorithm.compute transport.outgoing_sequence_number.sequence_number, packet
  transport.io.write mac
end
send_packet(transport, packet) click to toggle source
# File lib/hrr_rb_ssh/transport/sender.rb, line 39
def send_packet transport, packet
  encrypted_packet = encrypt transport, packet
  transport.io.write encrypted_packet
end