8 #include <botan/tls_record.h>
9 #include <botan/lookup.h>
10 #include <botan/loadstor.h>
39 major = (version >> 8) & 0xFF;
40 minor = (version & 0xFF);
70 const std::string cipher_algo = suite.
cipher_algo();
71 const std::string mac_algo = suite.
mac_algo();
76 cipher_algo +
"/CBC/NoPadding",
81 if(major > 3 || (major == 3 && minor >= 2))
99 if(major == 3 && minor == 0)
100 mac = af.
make_mac(
"SSL3-MAC(" + mac_algo +
")");
102 mac = af.
make_mac(
"HMAC(" + mac_algo +
")");
113 input_queue.
write(input, input_size);
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];
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);
241 for(
size_t i = 0; i != 2; ++i)
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);
size_t get_record(byte &msg_type, MemoryRegion< byte > &buffer)
void append(Filter *filt)
size_t read(byte[], size_t)
SymmetricKey server_mac_key() const
void add_input(const byte input[], size_t input_size)
SymmetricKey client_cipher_key() const
SymmetricKey client_mac_key() const
std::invalid_argument Invalid_Argument
byte get_byte(size_t byte_num, T input)
InitializationVector server_iv() const
void set_version(Version_Code version)
MessageAuthenticationCode * make_mac(const std::string &algo_spec, const std::string &provider="")
std::string cipher_algo() const
size_t peek(byte[], size_t, size_t=0) const
Algorithm_Factory & algorithm_factory() const
SymmetricKey server_cipher_key() const
SecureVector< byte > read_all(message_id msg=DEFAULT_MESSAGE)
void set_key(const SymmetricKey &key)
static const message_id LAST_MESSAGE
Library_State & global_state()
void update(const byte in[], size_t length)
size_t block_size_of(const std::string &name)
void set_keys(const CipherSuite &suite, const SessionKeys &keys, Connection_Side side)
void copy_mem(T *out, const T *in, size_t n)
void write(const byte[], size_t)
bool have_stream_cipher(const std::string &algo_spec)
bool have_hash(const std::string &algo_spec)
u16bit make_u16bit(byte i0, byte i1)
std::string mac_algo() const
bool have_block_cipher(const std::string &algo_spec)
void update_be(const T in)
Keyed_Filter * get_cipher(const std::string &algo_spec, Cipher_Dir direction)
InitializationVector client_iv() const
virtual size_t output_length() const =0
void process_msg(const byte in[], size_t length)