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);
174 SecureVector<byte> buffer(record_len);
176 input_queue.
read(header,
sizeof(header));
177 input_queue.
read(&buffer[0], buffer.
size());
185 msg_type = header[0];
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)
229 throw Decoding_Error(
"Record_Reader: Record truncated");
231 const size_t mac_offset = plaintext.size() - (mac_size + pad_size);
232 SecureVector<byte> received_mac(&plaintext[mac_offset],
235 const u16bit plain_length = plaintext.size() - (mac_size + pad_size + iv_size);
241 for(
size_t i = 0; i != 2; ++i)
245 mac->
update(&plaintext[iv_size], plain_length);
249 SecureVector<byte> computed_mac = mac->
final();
251 if(received_mac != computed_mac)
252 throw TLS_Exception(
BAD_RECORD_MAC,
"Record_Reader: MAC failure");
254 msg_type = header[0];
256 output.resize(plain_length);
257 copy_mem(&output[0], &plaintext[iv_size], plain_length);
size_t read(byte[], size_t)
byte get_byte(size_t byte_num, T input)
size_t peek(byte[], size_t, size_t=0) const
SecureVector< byte > read_all(message_id msg=DEFAULT_MESSAGE)
static const message_id LAST_MESSAGE
void update(const byte in[], size_t length)
void copy_mem(T *out, const T *in, size_t n)
u16bit make_u16bit(byte i0, byte i1)
void update_be(const T in)
void process_msg(const byte in[], size_t length)