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);
 SymmetricKey server_mac_key() const
size_t get_record(byte &msg_type, MemoryRegion< byte > &buffer)
void append(Filter *filt)
SymmetricKey client_mac_key() const
size_t read(byte[], size_t)
Algorithm_Factory & algorithm_factory() const
void add_input(const byte input[], size_t input_size)
std::string mac_algo() const
std::invalid_argument Invalid_Argument
byte get_byte(size_t byte_num, T input)
void set_version(Version_Code version)
MessageAuthenticationCode * make_mac(const std::string &algo_spec, const std::string &provider="")
InitializationVector client_iv() const
SymmetricKey server_cipher_key() const
SymmetricKey client_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)
InitializationVector server_iv() const
bool have_hash(const std::string &algo_spec)
u16bit make_u16bit(byte i0, byte i1)
size_t peek(byte[], size_t, size_t=0) const
std::string cipher_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)
virtual size_t output_length() const =0
void process_msg(const byte in[], size_t length)