Botan 3.12.0
Crypto and TLS for C&
Botan::TLS::Datagram_Sequence_Numbers Class Referencefinal

#include <tls_seq_numbers.h>

Inheritance diagram for Botan::TLS::Datagram_Sequence_Numbers:
Botan::TLS::Connection_Sequence_Numbers

Public Member Functions

bool already_seen (uint64_t sequence) const override
uint16_t current_read_epoch () const override
uint16_t current_write_epoch () const override
 Datagram_Sequence_Numbers ()
void new_read_cipher_state () override
void new_write_cipher_state () override
uint64_t next_read_sequence () override
uint64_t next_write_sequence (uint16_t epoch) override
void read_accept (uint64_t sequence) override
void reset () override

Detailed Description

Definition at line 87 of file tls_seq_numbers.h.

Constructor & Destructor Documentation

◆ Datagram_Sequence_Numbers()

Botan::TLS::Datagram_Sequence_Numbers::Datagram_Sequence_Numbers ( )
inline

Definition at line 89 of file tls_seq_numbers.h.

References reset().

Member Function Documentation

◆ already_seen()

bool Botan::TLS::Datagram_Sequence_Numbers::already_seen ( uint64_t sequence) const
inlineoverridevirtual

Implements Botan::TLS::Connection_Sequence_Numbers.

Definition at line 122 of file tls_seq_numbers.h.

122 {
123 const size_t window_size = sizeof(m_window_bits) * 8;
124
125 if(sequence > m_window_highest) {
126 return false;
127 }
128
129 const uint64_t offset = m_window_highest - sequence;
130
131 if(offset >= window_size) {
132 return true; // really old?
133 }
134
135 return (((m_window_bits >> offset) & 1) == 1);
136 }

◆ current_read_epoch()

uint16_t Botan::TLS::Datagram_Sequence_Numbers::current_read_epoch ( ) const
inlineoverridevirtual

Implements Botan::TLS::Connection_Sequence_Numbers.

Definition at line 107 of file tls_seq_numbers.h.

107{ return m_read_epoch; }

◆ current_write_epoch()

uint16_t Botan::TLS::Datagram_Sequence_Numbers::current_write_epoch ( ) const
inlineoverridevirtual

Implements Botan::TLS::Connection_Sequence_Numbers.

Definition at line 109 of file tls_seq_numbers.h.

109{ return m_write_epoch; }

◆ new_read_cipher_state()

void Botan::TLS::Datagram_Sequence_Numbers::new_read_cipher_state ( )
inlineoverridevirtual

Implements Botan::TLS::Connection_Sequence_Numbers.

Definition at line 100 of file tls_seq_numbers.h.

100{ m_read_epoch++; }

◆ new_write_cipher_state()

void Botan::TLS::Datagram_Sequence_Numbers::new_write_cipher_state ( )
inlineoverridevirtual

Implements Botan::TLS::Connection_Sequence_Numbers.

Definition at line 102 of file tls_seq_numbers.h.

102 {
103 m_write_epoch++;
104 m_write_seqs[m_write_epoch] = 0;
105 }

◆ next_read_sequence()

uint64_t Botan::TLS::Datagram_Sequence_Numbers::next_read_sequence ( )
inlineoverridevirtual

Implements Botan::TLS::Connection_Sequence_Numbers.

Definition at line 120 of file tls_seq_numbers.h.

120{ throw Invalid_State("DTLS uses explicit sequence numbers"); }

◆ next_write_sequence()

uint64_t Botan::TLS::Datagram_Sequence_Numbers::next_write_sequence ( uint16_t epoch)
inlineoverridevirtual

Implements Botan::TLS::Connection_Sequence_Numbers.

Definition at line 111 of file tls_seq_numbers.h.

111 {
112 auto i = m_write_seqs.find(epoch);
113 BOTAN_ASSERT(i != m_write_seqs.end(), "Found epoch");
114 if(i->second > 0x0000FFFFFFFFFFFF) {
115 throw Invalid_State("DTLS write sequence number overflow");
116 }
117 return (static_cast<uint64_t>(epoch) << 48) | i->second++;
118 }
#define BOTAN_ASSERT(expr, assertion_made)
Definition assert.h:62

References BOTAN_ASSERT.

◆ read_accept()

void Botan::TLS::Datagram_Sequence_Numbers::read_accept ( uint64_t sequence)
inlineoverridevirtual

Implements Botan::TLS::Connection_Sequence_Numbers.

Definition at line 138 of file tls_seq_numbers.h.

138 {
139 const size_t window_size = sizeof(m_window_bits) * 8;
140
141 if(sequence > m_window_highest) {
142 // We've received a later sequence which advances our window
143 const uint64_t offset = sequence - m_window_highest;
144 m_window_highest += offset;
145
146 if(offset >= window_size) {
147 m_window_bits = 0;
148 } else {
149 m_window_bits <<= offset;
150 }
151
152 m_window_bits |= 0x01;
153 } else {
154 const uint64_t offset = m_window_highest - sequence;
155
156 if(offset < window_size) {
157 // We've received an old sequence but still within our window
158 m_window_bits |= (static_cast<uint64_t>(1) << offset);
159 } else {
160 // This occurs only if we have reset state (DTLS reconnection case)
161 m_window_highest = sequence;
162 m_window_bits = 0;
163 }
164 }
165 }

◆ reset()

void Botan::TLS::Datagram_Sequence_Numbers::reset ( )
inlineoverridevirtual

Implements Botan::TLS::Connection_Sequence_Numbers.

Definition at line 91 of file tls_seq_numbers.h.

91 {
92 m_write_seqs.clear();
93 m_write_seqs[0] = 0;
94 m_write_epoch = 0;
95 m_read_epoch = 0;
96 m_window_highest = 0;
97 m_window_bits = 0;
98 }

Referenced by Datagram_Sequence_Numbers().


The documentation for this class was generated from the following file: