/* * TLS Record Handling * (C) 2004-2012 Jack Lloyd * * Released under the terms of the Botan license */ #ifndef BOTAN_TLS_RECORDS_H__ #define BOTAN_TLS_RECORDS_H__ #include #include #include #include #include #include #include #include namespace Botan { namespace TLS { class Session_Keys; /** * TLS Record Writer */ class BOTAN_DLL Record_Writer { public: void send(byte type, const byte input[], size_t length); void send(byte type, byte val) { send(type, &val, 1); } void send(byte type, const std::vector& input) { send(type, &input[0], input.size()); } void send_alert(const Alert& alert); void change_cipher_spec(Connection_Side side, const Ciphersuite& suite, const Session_Keys& keys, byte compression_method); void set_version(Protocol_Version version); bool record_version_set() const { return m_version.valid(); } void reset(); void set_maximum_fragment_size(size_t max_fragment); Record_Writer(std::function output_fn, RandomNumberGenerator& rng); Record_Writer(const Record_Writer&) = delete; Record_Writer& operator=(const Record_Writer&) = delete; ~Record_Writer() { delete m_mac; } private: void send_record(byte type, const byte input[], size_t length); std::function m_output_fn; std::vector m_writebuf; Pipe m_cipher; MessageAuthenticationCode* m_mac; RandomNumberGenerator& m_rng; size_t m_block_size, m_mac_size, m_iv_size, m_max_fragment; u64bit m_seq_no; Protocol_Version m_version; }; /** * TLS Record Reader */ class BOTAN_DLL Record_Reader { public: /** * @param input new input data (may be NULL if input_size == 0) * @param input_size size of input in bytes * @param input_consumed is set to the number of bytes of input * that were consumed * @param msg_type is set to the type of the message just read if * this function returns 0 * @param msg is set to the contents of the record * @return number of bytes still needed (minimum), or 0 if success */ size_t add_input(const byte input[], size_t input_size, size_t& input_consumed, byte& msg_type, std::vector& msg); void change_cipher_spec(Connection_Side side, const Ciphersuite& suite, const Session_Keys& keys, byte compression_method); void set_version(Protocol_Version version); Protocol_Version get_version() const; void reset(); void set_maximum_fragment_size(size_t max_fragment); Record_Reader(); Record_Reader(const Record_Reader&) = delete; Record_Reader& operator=(const Record_Reader&) = delete; ~Record_Reader() { delete m_mac; } private: size_t fill_buffer_to(const byte*& input, size_t& input_size, size_t& input_consumed, size_t desired); std::vector m_readbuf; std::vector m_macbuf; size_t m_readbuf_pos; Pipe m_cipher; MessageAuthenticationCode* m_mac; size_t m_block_size, m_iv_size, m_max_fragment; u64bit m_seq_no; Protocol_Version m_version; }; } } #endif