8#ifndef BOTAN_TLS_SEQ_NUMBERS_H_
9#define BOTAN_TLS_SEQ_NUMBERS_H_
11#include <botan/assert.h>
12#include <botan/exceptn.h>
63 if(m_write_seq_no == std::numeric_limits<uint64_t>::max()) {
64 throw Invalid_State(
"TLS 1.2 write sequence number overflow");
66 return m_write_seq_no++;
74 if(m_read_seq_no == std::numeric_limits<uint64_t>::max()) {
81 uint64_t m_write_seq_no;
82 uint64_t m_read_seq_no;
83 uint16_t m_read_epoch;
84 uint16_t m_write_epoch;
104 m_write_seqs[m_write_epoch] = 0;
112 auto i = m_write_seqs.find(epoch);
114 if(i->second > 0x0000FFFFFFFFFFFF) {
117 return (
static_cast<uint64_t
>(epoch) << 48) | i->second++;
123 const size_t window_size =
sizeof(m_window_bits) * 8;
125 if(sequence > m_window_highest) {
129 const uint64_t offset = m_window_highest - sequence;
131 if(offset >= window_size) {
135 return (((m_window_bits >> offset) & 1) == 1);
139 const size_t window_size =
sizeof(m_window_bits) * 8;
141 if(sequence > m_window_highest) {
143 const uint64_t offset = sequence - m_window_highest;
144 m_window_highest += offset;
146 if(offset >= window_size) {
149 m_window_bits <<= offset;
152 m_window_bits |= 0x01;
154 const uint64_t offset = m_window_highest - sequence;
156 if(offset < window_size) {
158 m_window_bits |= (
static_cast<uint64_t
>(1) << offset);
161 m_window_highest = sequence;
168 std::map<uint16_t, uint64_t> m_write_seqs;
169 uint16_t m_write_epoch = 0;
170 uint16_t m_read_epoch = 0;
171 uint64_t m_window_highest = 0;
172 uint64_t m_window_bits = 0;
#define BOTAN_ASSERT(expr, assertion_made)
virtual uint16_t current_read_epoch() const =0
virtual uint64_t next_read_sequence()=0
virtual ~Connection_Sequence_Numbers()=default
virtual void read_accept(uint64_t seq)=0
virtual uint16_t current_write_epoch() const =0
virtual void new_read_cipher_state()=0
virtual bool already_seen(uint64_t seq) const =0
virtual void new_write_cipher_state()=0
virtual uint64_t next_write_sequence(uint16_t)=0
uint64_t next_read_sequence() override
void read_accept(uint64_t sequence) override
uint16_t current_read_epoch() const override
void new_read_cipher_state() override
uint16_t current_write_epoch() const override
uint64_t next_write_sequence(uint16_t epoch) override
bool already_seen(uint64_t sequence) const override
void new_write_cipher_state() override
Datagram_Sequence_Numbers()
uint64_t next_write_sequence(uint16_t) override
uint64_t next_read_sequence() override
void read_accept(uint64_t) override
Stream_Sequence_Numbers()
void new_read_cipher_state() override
void new_write_cipher_state() override
uint16_t current_read_epoch() const override
bool already_seen(uint64_t) const override
uint16_t current_write_epoch() const override