diff options
author | lloyd <[email protected]> | 2014-10-06 01:29:13 +0000 |
---|---|---|
committer | lloyd <[email protected]> | 2014-10-06 01:29:13 +0000 |
commit | 2d6a5e530c8db496aad61b5a9ab3107dd1ed646b (patch) | |
tree | 29d92fc311f65ca88b812dadf3462c3ad1fdb0f9 /src/lib/tls/tls_handshake_io.h | |
parent | 97010abaf527fdbe6e308cb3570f9167c1dc9ec1 (diff) |
Add support for DTLS handshake timeouts and retransmissions.
Diffstat (limited to 'src/lib/tls/tls_handshake_io.h')
-rw-r--r-- | src/lib/tls/tls_handshake_io.h | 43 |
1 files changed, 36 insertions, 7 deletions
diff --git a/src/lib/tls/tls_handshake_io.h b/src/lib/tls/tls_handshake_io.h index 36c605c30..b13a81700 100644 --- a/src/lib/tls/tls_handshake_io.h +++ b/src/lib/tls/tls_handshake_io.h @@ -1,6 +1,6 @@ /* * TLS Handshake Serialization -* (C) 2012 Jack Lloyd +* (C) 2012,2014 Jack Lloyd * * Released under the terms of the Botan license */ @@ -17,7 +17,6 @@ #include <map> #include <set> #include <utility> -#include <tuple> namespace Botan { @@ -35,6 +34,8 @@ class Handshake_IO virtual std::vector<byte> send(const Handshake_Message& msg) = 0; + virtual bool timeout_check() = 0; + virtual std::vector<byte> format( const std::vector<byte>& handshake_msg, Handshake_Type handshake_type) const = 0; @@ -69,6 +70,8 @@ class Stream_Handshake_IO : public Handshake_IO Protocol_Version initial_record_version() const override; + bool timeout_check() override { return false; } + std::vector<byte> send(const Handshake_Message& msg) override; std::vector<byte> format( @@ -93,11 +96,14 @@ class Datagram_Handshake_IO : public Handshake_IO { public: Datagram_Handshake_IO(class Connection_Sequence_Numbers& seq, - std::function<void (u16bit, byte, const std::vector<byte>&)> writer) : - m_seqs(seq), m_flights(1), m_send_hs(writer) {} + std::function<void (u16bit, byte, const std::vector<byte>&)> writer, + u16bit mtu) : + m_seqs(seq), m_flights(1), m_send_hs(writer), m_mtu(mtu) {} Protocol_Version initial_record_version() const override; + bool timeout_check() override; + std::vector<byte> send(const Handshake_Message& msg) override; std::vector<byte> format( @@ -124,6 +130,10 @@ class Datagram_Handshake_IO : public Handshake_IO Handshake_Type handshake_type, u16bit msg_sequence) const; + std::vector<byte> send_message(u16bit msg_seq, u16bit epoch, + Handshake_Type msg_type, + const std::vector<byte>& msg); + class Handshake_Reassembly { public: @@ -144,21 +154,40 @@ class Datagram_Handshake_IO : public Handshake_IO size_t m_msg_length = 0; u16bit m_epoch = 0; + // vector<bool> m_seen; + // vector<byte> m_fragments std::map<size_t, byte> m_fragments; std::vector<byte> m_message; }; + struct Message_Info + { + Message_Info(u16bit e, Handshake_Type mt, const std::vector<byte>& msg) : + epoch(e), msg_type(mt), msg_bits(msg) {} + + Message_Info(const Message_Info& other) = default; + + Message_Info() : epoch(0xFFFF), msg_type(HANDSHAKE_NONE) {} + + u16bit epoch; + Handshake_Type msg_type; + std::vector<byte> msg_bits; + }; + class Connection_Sequence_Numbers& m_seqs; std::map<u16bit, Handshake_Reassembly> m_messages; std::set<u16bit> m_ccs_epochs; std::vector<std::vector<u16bit>> m_flights; - std::map<u16bit, std::tuple<u16bit, byte, std::vector<byte>>> m_flight_data; + std::map<u16bit, Message_Info> m_flight_data; + + u64bit m_last_write = 0; + u64bit m_next_timeout = 0; - // default MTU is IPv6 min MTU minus UDP/IP headers - u16bit m_mtu = 1280 - 40 - 8; u16bit m_in_message_seq = 0; u16bit m_out_message_seq = 0; + std::function<void (u16bit, byte, const std::vector<byte>&)> m_send_hs; + u16bit m_mtu; }; } |