8 #ifndef BOTAN_TLS_SEQ_NUMBERS_H__
9 #define BOTAN_TLS_SEQ_NUMBERS_H__
11 #include <botan/types.h>
50 uint64_t m_write_seq_no = 0;
51 uint64_t m_read_seq_no = 0;
52 uint16_t m_read_epoch = 0;
53 uint16_t m_write_epoch = 0;
66 m_write_seqs[m_write_epoch] = 0;
74 auto i = m_write_seqs.find(epoch);
76 return (static_cast<uint64_t>(epoch) << 48) | i->second++;
81 throw Exception(
"DTLS uses explicit sequence numbers");
86 const size_t window_size =
sizeof(m_window_bits) * 8;
88 if(sequence > m_window_highest)
91 const uint64_t offset = m_window_highest - sequence;
93 if(offset >= window_size)
96 return (((m_window_bits >> offset) & 1) == 1);
101 const size_t window_size =
sizeof(m_window_bits) * 8;
103 if(sequence > m_window_highest)
105 const size_t offset = sequence - m_window_highest;
106 m_window_highest += offset;
108 if(offset >= window_size)
111 m_window_bits <<= offset;
113 m_window_bits |= 0x01;
117 const uint64_t offset = m_window_highest - sequence;
118 m_window_bits |= (
static_cast<uint64_t
>(1) << offset);
123 std::map<uint16_t, uint64_t> m_write_seqs;
124 uint16_t m_write_epoch = 0;
125 uint16_t m_read_epoch = 0;
126 uint64_t m_window_highest = 0;
127 uint64_t m_window_bits = 0;
bool already_seen(uint64_t) const override
virtual bool already_seen(uint64_t seq) const =0
virtual uint64_t next_read_sequence()=0
void read_accept(uint64_t) override
bool already_seen(uint64_t sequence) const override
uint16_t current_write_epoch() const override
void read_accept(uint64_t sequence) override
void new_write_cipher_state() override
#define BOTAN_ASSERT(expr, assertion_made)
virtual ~Connection_Sequence_Numbers()
virtual void new_read_cipher_state()=0
void new_write_cipher_state() override
uint64_t next_write_sequence(uint16_t) override
uint16_t current_read_epoch() const override
uint16_t current_write_epoch() const override
uint64_t next_read_sequence() override
void new_read_cipher_state() override
virtual uint64_t next_write_sequence(uint16_t)=0
uint16_t current_read_epoch() const override
uint64_t next_write_sequence(uint16_t epoch) override
virtual uint16_t current_write_epoch() const =0
void new_read_cipher_state() override
virtual void read_accept(uint64_t seq)=0
uint64_t next_read_sequence() override
virtual uint16_t current_read_epoch() const =0
virtual void new_write_cipher_state()=0
Datagram_Sequence_Numbers()