14#include <botan/tls_extensions_13.h>
16#include <botan/ber_dec.h>
17#include <botan/der_enc.h>
18#include <botan/tls_alert.h>
19#include <botan/tls_exceptn.h>
20#include <botan/internal/tls_reader.h>
34 if(extension_size < 3) {
40 if(
static_cast<size_t>(len) + 2 != extension_size) {
44 m_cookie = reader.
get_fixed<uint8_t>(len);
48 std::vector<uint8_t> buf;
54 std::vector<uint8_t> buf;
57 buf.push_back(
static_cast<uint8_t
>(m_modes.size()));
58 for(
const auto& mode : m_modes) {
59 buf.push_back(
static_cast<uint8_t
>(mode));
73 if(extension_size < 2) {
74 throw Decoding_Error(
"Empty psk_key_exchange_modes extension is illegal");
77 const auto mode_count = reader.
get_byte();
78 if(
static_cast<size_t>(mode_count) + 1 != extension_size) {
79 throw Decoding_Error(
"Inconsistent length in psk_key_exchange_modes extension");
82 for(uint16_t i = 0; i < mode_count; ++i) {
85 m_modes.push_back(mode);
91 std::vector<uint8_t> out;
92 std::vector<uint8_t> dn_list;
94 for(
const auto& dn : m_distinguished_names) {
95 std::vector<uint8_t> encoded_dn;
97 dn.encode_into(encoder);
107 if(extension_size < 2) {
108 throw Decoding_Error(
"Empty certificate_authorities extension is illegal");
114 throw Decoding_Error(
"Inconsistent length in certificate_authorities extension");
118 if(purported_size < 3) {
119 throw Decoding_Error(
"Empty certificate_authorities list is illegal");
124 const std::vector<uint8_t> name_bits = reader.
get_range<uint8_t>(2, 1, 65535);
127 m_distinguished_names.emplace_back();
128 decoder.decode(m_distinguished_names.back()).verify_end();
133 m_distinguished_names(std::move(acceptable_DNs)) {}
136 std::vector<uint8_t> result;
137 if(m_max_early_data_size.has_value()) {
138 const auto max_data = m_max_early_data_size.value();
148 uint16_t extension_size,
151 if(extension_size != 4) {
153 "Received an early_data extension in a NewSessionTicket message "
154 "without maximum early data size indication");
158 }
else if(extension_size != 0) {
160 "Received an early_data extension containing an unexpected data "
#define BOTAN_ASSERT_NOMSG(expr)
std::vector< uint8_t > serialize(Connection_Side whoami) const override
Certificate_Authorities(TLS_Data_Reader &reader, uint16_t extension_size)
Cookie(const std::vector< uint8_t > &cookie)
std::vector< uint8_t > serialize(Connection_Side whoami) const override
std::vector< uint8_t > serialize(Connection_Side whoami) const override
EarlyDataIndication(TLS_Data_Reader &reader, uint16_t extension_size, Handshake_Type message_type)
bool empty() const override
PSK_Key_Exchange_Modes(std::vector< PSK_Key_Exchange_Mode > modes)
std::vector< uint8_t > serialize(Connection_Side whoami) const override
bool has_remaining() const
std::vector< T > get_range(size_t len_bytes, size_t min_elems, size_t max_elems)
size_t remaining_bytes() const
std::vector< T > get_fixed(size_t size)
void append_tls_length_value(std::vector< uint8_t, Alloc > &buf, const T *vals, size_t vals_size, size_t tag_size)
constexpr uint8_t get_byte(T input)