#include <tls_handshake_io.h>
|
typedef std::function< void(uint16_t, uint8_t, const std::vector< uint8_t > &)> | writer_fn |
|
|
void | add_record (const uint8_t record[], size_t record_len, 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) |
|
std::vector< uint8_t > | format (const std::vector< uint8_t > &handshake_msg, Handshake_Type handshake_type) const override |
|
std::pair< Handshake_Type, std::vector< uint8_t > > | get_next_record (bool expecting_ccs) override |
|
Protocol_Version | initial_record_version () const override |
|
std::vector< uint8_t > | send (const Handshake_Message &msg) override |
|
std::vector< uint8_t > | send_under_epoch (const Handshake_Message &msg, uint16_t epoch) override |
|
bool | timeout_check () override |
|
Handshake IO for datagram-based handshakes
Definition at line 101 of file tls_handshake_io.h.
Botan::TLS::Datagram_Handshake_IO::Datagram_Handshake_IO |
( |
writer_fn |
writer, |
|
|
class Connection_Sequence_Numbers & |
seq, |
|
|
uint16_t |
mtu, |
|
|
uint64_t |
initial_timeout_ms, |
|
|
uint64_t |
max_timeout_ms |
|
) |
| |
|
inline |
Definition at line 106 of file tls_handshake_io.h.
111 m_initial_timeout(initial_timeout_ms),
112 m_max_timeout(max_timeout_ms),
void Botan::TLS::Datagram_Handshake_IO::add_record |
( |
const uint8_t |
record[], |
|
|
size_t |
record_len, |
|
|
Record_Type |
type, |
|
|
uint64_t |
sequence_number |
|
) |
| |
|
overridevirtual |
Implements Botan::TLS::Handshake_IO.
Definition at line 194 of file tls_handshake_io.cpp.
References Botan::TLS::CHANGE_CIPHER_SPEC, and Botan::load_be< uint16_t >().
199 const uint16_t epoch =
static_cast<uint16_t
>(record_sequence >> 48);
203 if(record_len != 1 || record[0] != 1)
204 throw Decoding_Error(
"Invalid ChangeCipherSpec");
207 m_ccs_epochs.insert(epoch);
211 const size_t DTLS_HANDSHAKE_HEADER_LEN = 12;
215 if(record_len < DTLS_HANDSHAKE_HEADER_LEN)
218 const uint8_t msg_type = record[0];
219 const size_t msg_len = load_be24(&record[1]);
221 const size_t fragment_offset = load_be24(&record[6]);
222 const size_t fragment_length = load_be24(&record[9]);
224 const size_t total_size = DTLS_HANDSHAKE_HEADER_LEN + fragment_length;
226 if(record_len < total_size)
227 throw Decoding_Error(
"Bad lengths in DTLS header");
229 if(message_seq >= m_in_message_seq)
231 m_messages[message_seq].add_fragment(&record[DTLS_HANDSHAKE_HEADER_LEN],
243 record += total_size;
244 record_len -= total_size;
uint16_t load_be< uint16_t >(const uint8_t in[], size_t off)
std::vector< uint8_t > Botan::TLS::Datagram_Handshake_IO::format |
( |
const std::vector< uint8_t > & |
handshake_msg, |
|
|
Handshake_Type |
handshake_type |
|
) |
| const |
|
overridevirtual |
std::pair< Handshake_Type, std::vector< uint8_t > > Botan::TLS::Datagram_Handshake_IO::get_next_record |
( |
bool |
expecting_ccs | ) |
|
|
overridevirtual |
Returns (HANDSHAKE_NONE, std::vector<>()) if no message currently available
Implements Botan::TLS::Handshake_IO.
Definition at line 249 of file tls_handshake_io.cpp.
References Botan::TLS::HANDSHAKE_CCS, and Botan::TLS::HANDSHAKE_NONE.
252 if(!m_flights.rbegin()->empty())
253 m_flights.push_back(std::vector<uint16_t>());
257 if(!m_messages.empty())
259 const uint16_t current_epoch = m_messages.begin()->second.epoch();
261 if(m_ccs_epochs.count(current_epoch))
262 return std::make_pair(
HANDSHAKE_CCS, std::vector<uint8_t>());
267 auto i = m_messages.find(m_in_message_seq);
269 if(i == m_messages.end() || !i->second.complete())
274 m_in_message_seq += 1;
276 return i->second.message();
Protocol_Version Botan::TLS::Datagram_Handshake_IO::initial_record_version |
( |
| ) |
const |
|
overridevirtual |
std::vector< uint8_t > Botan::TLS::Datagram_Handshake_IO::send |
( |
const Handshake_Message & |
msg | ) |
|
|
overridevirtual |
std::vector< uint8_t > Botan::TLS::Datagram_Handshake_IO::send_under_epoch |
( |
const Handshake_Message & |
msg, |
|
|
uint16_t |
epoch |
|
) |
| |
|
overridevirtual |
Implements Botan::TLS::Handshake_IO.
Definition at line 396 of file tls_handshake_io.cpp.
References Botan::TLS::CHANGE_CIPHER_SPEC, Botan::TLS::HANDSHAKE_CCS, Botan::TLS::HELLO_VERIFY_REQUEST, Botan::TLS::Handshake_Message::serialize(), and Botan::TLS::Handshake_Message::type().
Referenced by send().
398 const std::vector<uint8_t> msg_bits = msg.serialize();
404 return std::vector<uint8_t>();
409 send_message(m_out_message_seq, epoch, msg_type, msg_bits);
410 m_out_message_seq += 1;
411 return std::vector<uint8_t>();
415 m_flights.rbegin()->push_back(m_out_message_seq);
416 m_flight_data[m_out_message_seq] = Message_Info(epoch, msg_type, msg_bits);
418 m_out_message_seq += 1;
419 m_last_write = steady_clock_ms();
420 m_next_timeout = m_initial_timeout;
422 return send_message(m_out_message_seq - 1, epoch, msg_type, msg_bits);
bool Botan::TLS::Datagram_Handshake_IO::timeout_check |
( |
| ) |
|
|
overridevirtual |
Implements Botan::TLS::Handshake_IO.
Definition at line 172 of file tls_handshake_io.cpp.
174 if(m_last_write == 0 || (m_flights.size() > 1 && !m_flights.rbegin()->empty()))
183 const uint64_t ms_since_write = steady_clock_ms() - m_last_write;
185 if(ms_since_write < m_next_timeout)
188 retransmit_last_flight();
190 m_next_timeout = std::min(2 * m_next_timeout, m_max_timeout);
The documentation for this class was generated from the following files: