122 byte header[5] = { 0 };
124 const size_t have_in_queue = input_queue.size();
126 if(have_in_queue <
sizeof(header))
127 return (
sizeof(header) - have_in_queue);
132 input_queue.peek(header,
sizeof(header));
135 if(header[0] & 0x80 && header[2] == 1 && header[3] == 3)
137 size_t record_len =
make_u16bit(header[0], header[1]) & 0x7FFF;
139 if(have_in_queue < record_len + 2)
140 return (record_len + 2 - have_in_queue);
143 output.
resize(record_len + 4);
145 input_queue.read(&output[2], record_len + 2);
148 output[2] = header[0] & 0x7F;
149 output[3] = header[1];
155 header[0] !=
ALERT &&
160 "Record_Reader: Unknown record type");
166 if(major && (header[1] != major || header[2] != minor))
168 "Record_Reader: Got unexpected version");
171 if(have_in_queue < (
sizeof(header) + record_len))
172 return (
sizeof(header) + record_len - have_in_queue);
176 input_queue.read(header,
sizeof(header));
177 input_queue.read(&buffer[0], buffer.
size());
185 msg_type = header[0];
192 cipher.process_msg(buffer);
199 byte pad_value = plaintext[plaintext.
size()-1];
200 pad_size = pad_value + 1;
212 if(pad_value > block_size)
217 bool padding_good =
true;
219 for(
size_t i = 0; i != pad_size; ++i)
220 if(plaintext[plaintext.
size()-i-1] != pad_value)
221 padding_good =
false;
228 if(plaintext.
size() < mac_size + pad_size + iv_size)
231 const size_t mac_offset = plaintext.
size() - (mac_size + pad_size);
235 const u16bit plain_length = plaintext.
size() - (mac_size + pad_size + iv_size);
237 mac->update_be(seq_no);
238 mac->update(header[0]);
241 for(
size_t i = 0; i != 2; ++i)
244 mac->update_be(plain_length);
245 mac->update(&plaintext[iv_size], plain_length);
251 if(received_mac != computed_mac)
254 msg_type = header[0];
256 output.
resize(plain_length);
257 copy_mem(&output[0], &plaintext[iv_size], plain_length);