118: def enqueue_packet(payload)
119:
120: payload = client.compress(payload)
121:
122:
123: actual_length = 4 + payload.length + 1
124:
125:
126: padding_length = client.block_size - (actual_length % client.block_size)
127: padding_length += client.block_size if padding_length < 4
128:
129:
130: packet_length = payload.length + padding_length + 1
131:
132: if packet_length < 16
133: padding_length += client.block_size
134: packet_length = payload.length + padding_length + 1
135: end
136:
137: padding = Array.new(padding_length) { rand(256) }.pack("C*")
138:
139: unencrypted_data = [packet_length, padding_length, payload, padding].pack("NCA*A*")
140: mac = client.hmac.digest([client.sequence_number, unencrypted_data].pack("NA*"))
141:
142: encrypted_data = client.update_cipher(unencrypted_data) << client.final_cipher
143: message = encrypted_data + mac
144:
145: debug { "queueing packet nr #{client.sequence_number} type #{payload.getbyte(0)} len #{packet_length}" }
146: enqueue(message)
147:
148: client.increment(packet_length)
149:
150: self
151: end