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>
55 virtual std::vector<uint8_t>
format(
const std::vector<uint8_t>& handshake_msg,
61 uint64_t sequence_number) = 0;
66 virtual std::pair<Handshake_Type, std::vector<uint8_t>>
get_next_record(
bool expecting_ccs,
67 size_t max_message_size) = 0;
98 std::vector<uint8_t>
format(
const std::vector<uint8_t>& handshake_msg,
101 void add_record(
const uint8_t record[],
size_t record_len,
Record_Type type, uint64_t sequence_number)
override;
103 std::pair<Handshake_Type, std::vector<uint8_t>>
get_next_record(
bool expecting_ccs,
104 size_t max_message_size)
override;
107 std::deque<uint8_t> m_queue;
121 uint64_t initial_timeout_ms,
122 uint64_t max_timeout_ms,
123 size_t max_handshake_msg_size) :
126 m_initial_timeout(initial_timeout_ms),
127 m_max_timeout(max_timeout_ms),
128 m_send_hs(std::move(writer)),
130 m_max_handshake_msg_size(max_handshake_msg_size) {}
142 std::vector<uint8_t>
format(
const std::vector<uint8_t>& handshake_msg,
145 void add_record(
const uint8_t record[],
size_t record_len,
Record_Type type, uint64_t sequence_number)
override;
147 std::pair<Handshake_Type, std::vector<uint8_t>>
get_next_record(
bool expecting_ccs,
148 size_t max_message_size)
override;
151 void retransmit_flight(
size_t flight);
152 void retransmit_last_flight();
154 std::vector<uint8_t> format_fragment(
const uint8_t fragment[],
156 uint32_t frag_offset,
159 uint16_t msg_sequence)
const;
161 std::vector<uint8_t> format_w_seq(
const std::vector<uint8_t>& handshake_msg,
163 uint16_t msg_sequence)
const;
165 std::vector<uint8_t> send_message(uint16_t msg_seq,
168 const std::vector<uint8_t>& msg);
170 class Handshake_Reassembly final {
172 void add_fragment(
const uint8_t fragment[],
173 size_t fragment_length,
174 size_t fragment_offset,
179 bool complete()
const;
181 uint16_t epoch()
const {
return m_epoch; }
184 size_t msg_length()
const {
return m_msg_length; }
186 std::pair<Handshake_Type, std::vector<uint8_t>> message()
const;
189 void release_buffers();
193 size_t m_msg_length = 0;
194 size_t m_bytes_received = 0;
195 uint16_t m_epoch = 0;
199 std::vector<uint8_t> m_received_mask;
200 std::vector<uint8_t> m_message;
203 struct Message_Info final {
204 Message_Info(uint16_t e,
Handshake_Type mt,
const std::vector<uint8_t>& msg) :
205 epoch(e), msg_type(mt), msg_bits(msg) {}
211 std::vector<uint8_t> msg_bits;
214 class Connection_Sequence_Numbers& m_seqs;
215 std::map<uint16_t, Handshake_Reassembly> m_messages;
216 size_t m_pending_reassembly_bytes = 0;
217 std::set<uint16_t> m_ccs_epochs;
218 std::vector<std::vector<uint16_t>> m_flights;
219 std::map<uint16_t, Message_Info> m_flight_data;
221 uint64_t m_initial_timeout = 0;
222 uint64_t m_max_timeout = 0;
224 uint64_t m_last_write = 0;
225 uint64_t m_next_timeout = 0;
227 uint16_t m_in_message_seq = 0;
228 uint16_t m_out_message_seq = 0;
232 size_t m_max_handshake_msg_size;
std::vector< uint8_t > send_under_epoch(const Handshake_Message &msg, uint16_t epoch) override
std::pair< Handshake_Type, std::vector< uint8_t > > get_next_record(bool expecting_ccs, size_t max_message_size) override
bool timeout_check() override
void add_record(const uint8_t record[], size_t record_len, Record_Type type, uint64_t sequence_number) override
std::vector< uint8_t > format(const std::vector< uint8_t > &handshake_msg, Handshake_Type handshake_type) const override
Protocol_Version initial_record_version() const override
std::vector< uint8_t > send(const Handshake_Message &msg) 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, size_t max_handshake_msg_size)
bool have_more_data() const override
std::function< void(uint16_t, Record_Type, const std::vector< uint8_t > &)> writer_fn
Handshake_IO & operator=(Handshake_IO &&)=delete
virtual std::vector< uint8_t > send_under_epoch(const Handshake_Message &msg, uint16_t epoch)=0
Handshake_IO(const Handshake_IO &)=delete
virtual bool timeout_check()=0
virtual std::vector< uint8_t > send(const Handshake_Message &msg)=0
virtual std::pair< Handshake_Type, std::vector< uint8_t > > get_next_record(bool expecting_ccs, size_t max_message_size)=0
Handshake_IO & operator=(const Handshake_IO &)=delete
virtual void add_record(const uint8_t record[], size_t record_len, Record_Type type, uint64_t sequence_number)=0
virtual Protocol_Version initial_record_version() const =0
Handshake_IO(Handshake_IO &&)=delete
virtual std::vector< uint8_t > format(const std::vector< uint8_t > &handshake_msg, Handshake_Type handshake_type) const =0
virtual ~Handshake_IO()=default
virtual bool have_more_data() const =0
bool have_more_data() const override
std::vector< uint8_t > send_under_epoch(const Handshake_Message &msg, uint16_t epoch) override
Stream_Handshake_IO(writer_fn writer)
std::vector< uint8_t > format(const std::vector< uint8_t > &handshake_msg, Handshake_Type handshake_type) const override
Protocol_Version initial_record_version() const override
std::function< void(Record_Type, const std::vector< uint8_t > &)> writer_fn
bool timeout_check() override
std::vector< uint8_t > send(const Handshake_Message &msg) override
std::pair< Handshake_Type, std::vector< uint8_t > > get_next_record(bool expecting_ccs, size_t max_message_size) override
void add_record(const uint8_t record[], size_t record_len, Record_Type type, uint64_t sequence_number) override