Botan 3.13.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 129 of file tls_seq_numbers.h.

129 {
130 const uint16_t epoch = static_cast<uint16_t>(sequence >> 48);
131 const uint64_t record_sequence = sequence & 0x0000FFFFFFFFFFFF;
132 const auto window = m_read_windows.find(epoch);
133
134 if(window == m_read_windows.end()) {
135 return false;
136 }
137
138 const size_t window_size = sizeof(window->second.bits) * 8;
139
140 if(record_sequence > window->second.highest) {
141 return false;
142 }
143
144 const uint64_t offset = window->second.highest - record_sequence;
145
146 if(offset >= window_size) {
147 return true; // really old?
148 }
149
150 return (((window->second.bits >> offset) & 1) == 1);
151 }

◆ current_read_epoch()

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

Implements Botan::TLS::Connection_Sequence_Numbers.

Definition at line 112 of file tls_seq_numbers.h.

112{ 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 114 of file tls_seq_numbers.h.

114{ 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 {
101 m_read_epoch = next_epoch(m_read_epoch);
102 m_read_windows.try_emplace(m_read_epoch);
103 prune_epochs(m_read_windows, m_read_epoch);
104 }

◆ new_write_cipher_state()

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

Implements Botan::TLS::Connection_Sequence_Numbers.

Definition at line 106 of file tls_seq_numbers.h.

106 {
107 m_write_epoch = next_epoch(m_write_epoch);
108 m_write_seqs[m_write_epoch] = 0;
109 prune_epochs(m_write_seqs, m_write_epoch);
110 }

◆ next_read_sequence()

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

Implements Botan::TLS::Connection_Sequence_Numbers.

Definition at line 127 of file tls_seq_numbers.h.

127{ 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 116 of file tls_seq_numbers.h.

116 {
117 auto i = m_write_seqs.find(epoch);
118 if(i == m_write_seqs.end()) {
119 throw Invalid_State("DTLS epoch not found");
120 }
121 if(i->second > 0x0000FFFFFFFFFFFF) {
122 throw Invalid_State("DTLS write sequence number overflow");
123 }
124 return (static_cast<uint64_t>(epoch) << 48) | i->second++;
125 }

◆ read_accept()

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

Implements Botan::TLS::Connection_Sequence_Numbers.

Definition at line 153 of file tls_seq_numbers.h.

153 {
154 const uint16_t epoch = static_cast<uint16_t>(sequence >> 48);
155 const uint64_t record_sequence = sequence & 0x0000FFFFFFFFFFFF;
156 auto& window = m_read_windows[epoch];
157 const size_t window_size = sizeof(window.bits) * 8;
158
159 if(record_sequence > window.highest) {
160 // We've received a later sequence which advances our window
161 const uint64_t offset = record_sequence - window.highest;
162 window.highest += offset;
163
164 if(offset >= window_size) {
165 window.bits = 0;
166 } else {
167 window.bits <<= offset;
168 }
169
170 window.bits |= 0x01;
171 } else {
172 const uint64_t offset = window.highest - record_sequence;
173
174 if(offset < window_size) {
175 // We've received an old sequence but still within our window
176 window.bits |= (static_cast<uint64_t>(1) << offset);
177 } else {
178 // DTLS reconnection: recenter the window on this sequence. Bit 0
179 // marks the sequence itself as seen so an immediate replay is
180 // detected; the other branches above set this implicitly.
181 window.highest = record_sequence;
182 window.bits = 1;
183 }
184 }
185 }

◆ 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_read_windows.clear();
97 m_read_windows[0] = Replay_Window{};
98 }

Referenced by Datagram_Sequence_Numbers().


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