Class: HrrRbSsh::Transport::Sender

Inherits:
Object
  • Object
show all
Defined in:
lib/hrr_rb_ssh/transport/sender.rb

Instance Method Summary collapse

Constructor Details

#initializeSender

Returns a new instance of Sender.



9
10
11
# File 'lib/hrr_rb_ssh/transport/sender.rb', line 9

def initialize
  @logger = Logger.new self.class.name
end

Instance Method Details

#encrypt(transport, packet) ⇒ Object



31
32
33
34
35
# File 'lib/hrr_rb_ssh/transport/sender.rb', line 31

def encrypt transport, packet
  encrypted_packet = transport.outgoing_encryption_algorithm.encrypt packet

  encrypted_packet
end

#packetize(transport, payload) ⇒ Object



13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# File 'lib/hrr_rb_ssh/transport/sender.rb', line 13

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) ⇒ Object



47
48
49
50
51
52
53
54
# File 'lib/hrr_rb_ssh/transport/sender.rb', line 47

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) ⇒ Object



42
43
44
45
# File 'lib/hrr_rb_ssh/transport/sender.rb', line 42

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) ⇒ Object



37
38
39
40
# File 'lib/hrr_rb_ssh/transport/sender.rb', line 37

def send_packet transport, packet
  encrypted_packet = encrypt transport, packet
  transport.io.write encrypted_packet
end