8 #ifndef BOTAN_TLS_HANDSHAKE_IO_H__
9 #define BOTAN_TLS_HANDSHAKE_IO_H__
11 #include <botan/tls_magic.h>
12 #include <botan/tls_version.h>
13 #include <botan/loadstor.h>
25 class Handshake_Message;
39 virtual std::vector<uint8_t>
format(
40 const std::vector<uint8_t>& handshake_msg,
43 virtual void add_record(
const std::vector<uint8_t>& record,
45 uint64_t sequence_number) = 0;
50 virtual std::pair<Handshake_Type, std::vector<uint8_t>>
68 typedef std::function<void (uint8_t, const std::vector<uint8_t>&)>
writer_fn;
78 std::vector<uint8_t>
format(
79 const std::vector<uint8_t>& handshake_msg,
82 void add_record(
const std::vector<uint8_t>& record,
84 uint64_t sequence_number)
override;
86 std::pair<Handshake_Type, std::vector<uint8_t>>
89 std::deque<uint8_t> m_queue;
99 typedef std::function<void (uint16_t, uint8_t, const std::vector<uint8_t>&)>
writer_fn;
103 uint16_t mtu, uint64_t initial_timeout_ms, uint64_t max_timeout_ms) :
106 m_initial_timeout(initial_timeout_ms),
107 m_max_timeout(max_timeout_ms),
118 std::vector<uint8_t>
format(
119 const std::vector<uint8_t>& handshake_msg,
122 void add_record(
const std::vector<uint8_t>& record,
124 uint64_t sequence_number)
override;
126 std::pair<Handshake_Type, std::vector<uint8_t>>
129 void retransmit_flight(
size_t flight);
130 void retransmit_last_flight();
132 std::vector<uint8_t> format_fragment(
133 const uint8_t fragment[],
135 uint16_t frag_offset,
138 uint16_t msg_sequence)
const;
140 std::vector<uint8_t> format_w_seq(
141 const std::vector<uint8_t>& handshake_msg,
143 uint16_t msg_sequence)
const;
145 std::vector<uint8_t> send_message(uint16_t msg_seq, uint16_t epoch,
147 const std::vector<uint8_t>& msg);
149 class Handshake_Reassembly final
152 void add_fragment(
const uint8_t fragment[],
153 size_t fragment_length,
154 size_t fragment_offset,
159 bool complete()
const;
161 uint16_t epoch()
const {
return m_epoch; }
163 std::pair<Handshake_Type, std::vector<uint8_t>> message()
const;
166 size_t m_msg_length = 0;
167 uint16_t m_epoch = 0;
171 std::map<size_t, uint8_t> m_fragments;
172 std::vector<uint8_t> m_message;
175 struct Message_Info final
177 Message_Info(uint16_t e,
Handshake_Type mt,
const std::vector<uint8_t>& msg) :
178 epoch(e), msg_type(mt), msg_bits(msg) {}
184 std::vector<uint8_t> msg_bits;
187 class Connection_Sequence_Numbers& m_seqs;
188 std::map<uint16_t, Handshake_Reassembly> m_messages;
189 std::set<uint16_t> m_ccs_epochs;
190 std::vector<std::vector<uint16_t>> m_flights;
191 std::map<uint16_t, Message_Info> m_flight_data;
193 uint64_t m_initial_timeout = 0;
194 uint64_t m_max_timeout = 0;
196 uint64_t m_last_write = 0;
197 uint64_t m_next_timeout = 0;
199 uint16_t m_in_message_seq = 0;
200 uint16_t m_out_message_seq = 0;
virtual std::vector< uint8_t > send(const Handshake_Message &msg)=0
bool timeout_check() override
Stream_Handshake_IO(writer_fn writer)
virtual Protocol_Version initial_record_version() const =0
Protocol_Version initial_record_version() const override
Protocol_Version initial_record_version() const override
virtual std::vector< uint8_t > format(const std::vector< uint8_t > &handshake_msg, Handshake_Type handshake_type) const =0
std::vector< uint8_t > send(const Handshake_Message &msg) override
virtual ~Handshake_IO()=default
std::vector< uint8_t > send(const Handshake_Message &msg) override
std::function< void(uint8_t, const std::vector< uint8_t > &)> writer_fn
std::pair< Handshake_Type, std::vector< uint8_t > > get_next_record(bool expecting_ccs) override
std::function< void(uint16_t, uint8_t, const std::vector< uint8_t > &)> writer_fn
std::pair< Handshake_Type, std::vector< uint8_t > > get_next_record(bool expecting_ccs) override
void add_record(const std::vector< uint8_t > &record, Record_Type type, uint64_t sequence_number) override
virtual std::pair< Handshake_Type, std::vector< uint8_t > > get_next_record(bool expecting_ccs)=0
std::vector< uint8_t > format(const std::vector< uint8_t > &handshake_msg, Handshake_Type handshake_type) const override
bool timeout_check() override
virtual bool timeout_check()=0
virtual void add_record(const std::vector< uint8_t > &record, Record_Type type, uint64_t sequence_number)=0
std::vector< uint8_t > format(const std::vector< uint8_t > &handshake_msg, Handshake_Type handshake_type) const override
void add_record(const std::vector< uint8_t > &record, Record_Type type, uint64_t sequence_number) override
Datagram_Handshake_IO(writer_fn writer, class Connection_Sequence_Numbers &seq, uint16_t mtu, uint64_t initial_timeout_ms, uint64_t max_timeout_ms)
Handshake_IO & operator=(const Handshake_IO &)=delete