13#ifndef BOTAN_TLS_EXTENSIONS_H_
14#define BOTAN_TLS_EXTENSIONS_H_
16#include <botan/assert.h>
17#include <botan/tls_algos.h>
18#include <botan/tls_magic.h>
19#include <botan/tls_signature_scheme.h>
20#include <botan/tls_version.h>
118 std::string
host_name()
const {
return m_sni_host_name; }
122 bool empty()
const override {
return false; }
124 static bool hostname_acceptable_for_sni(std::string_view hostname);
127 std::string m_sni_host_name;
139 const std::vector<std::string>&
protocols()
const {
return m_protocols; }
141 std::string single_protocol()
const;
157 bool empty()
const override {
return m_protocols.empty(); }
160 std::vector<std::string> m_protocols;
179 const std::vector<Certificate_Type>& server_preference);
199 std::vector<Certificate_Type> m_certificate_types;
240 const std::vector<Group_Params>& groups()
const;
243 std::vector<Group_Params> ec_groups()
const;
246 std::vector<Group_Params> dh_groups()
const;
254 bool empty()
const override {
return m_groups.empty(); }
257 std::vector<Group_Params> m_groups;
273 bool empty()
const override {
return m_schemes.empty(); }
280 std::vector<Signature_Scheme> m_schemes;
306 bool empty()
const override {
return m_schemes.empty(); }
313 std::vector<Signature_Scheme> m_schemes;
325 const std::vector<uint16_t>&
profiles()
const {
return m_pp; }
329 bool empty()
const override {
return m_pp.empty(); }
338 std::vector<uint16_t> m_pp;
341class Certificate_Status_Request_Internal;
354 bool empty()
const override {
return false; }
365 std::vector<std::vector<uint8_t>> ocsp_key_ids);
371 uint16_t extension_size,
378 std::unique_ptr<Certificate_Status_Request_Internal> m_impl;
392 bool empty()
const override {
return m_versions.empty(); }
402 const std::vector<Protocol_Version>&
versions()
const {
return m_versions; }
405 std::vector<Protocol_Version> m_versions;
425 uint16_t
limit()
const {
return m_limit; }
429 bool empty()
const override {
return m_limit == 0; }
444 const std::vector<uint8_t>&
value() {
return m_value; }
446 bool empty()
const override {
return false; }
454 std::vector<uint8_t> m_value;
464 template <
typename T>
466 return dynamic_cast<T*
>(
get(T::static_type()));
469 template <
typename T>
471 return get<T>() !=
nullptr;
476 size_t size()
const {
return m_extensions.size(); }
478 bool empty()
const {
return m_extensions.empty(); }
480 void add(std::unique_ptr<Extension> extn);
495 bool contains_other_than(
const std::set<Extension_Code>& allowed_extensions,
496 bool allow_unknown_extensions =
false)
const;
521 void reorder(
const std::vector<Extension_Code>& order);
528 if(m_extension_codes.empty()) {
531 return m_extension_codes.back();
552 auto it = m_raw_extension_data.find(type);
553 if(it != m_raw_extension_data.end()) {
561 std::vector<Extension_Code> m_extension_codes;
562 std::map<Extension_Code, std::unique_ptr<Extension>> m_extensions;
563 std::map<Extension_Code, std::vector<uint8_t>> m_raw_extension_data;
#define BOTAN_UNSTABLE_API
Application_Layer_Protocol_Notification(std::string_view protocol)
const std::vector< std::string > & protocols() const
Extension_Code type() const override
bool empty() const override
static Extension_Code static_type()
const std::vector< uint8_t > & get_request_extensions() const
~Certificate_Status_Request() override
const std::vector< uint8_t > & get_responder_id_list() const
Certificate_Status_Request()
static Extension_Code static_type()
const std::vector< uint8_t > & get_ocsp_response() const
Extension_Code type() const override
bool empty() const override
bool empty() const override
Certificate_Type selected_certificate_type() const
Certificate_Type_Base(std::vector< Certificate_Type > supported_cert_types)
void validate_selection(const Certificate_Type_Base &from_server) const
std::vector< uint8_t > serialize(Connection_Side whoami) const override
Extension_Code type() const override
Client_Certificate_Type(const Client_Certificate_Type &cct, const Policy &policy)
Certificate_Type_Base(std::vector< Certificate_Type > supported_cert_types)
static Extension_Code static_type()
virtual std::vector< uint8_t > serialize(Connection_Side whoami) const =0
virtual bool is_implemented() const
virtual Extension_Code type() const =0
virtual bool empty() const =0
virtual ~Extension()=default
Extensions(Extensions &&)=default
void add(Extension *extn)
bool contains_implemented_extensions_other_than(const std::set< Extension_Code > &allowed_extensions) const
Extensions & operator=(const Extensions &)=delete
std::optional< std::vector< uint8_t > > extension_raw_bytes(Extension_Code type) const
Extensions(const Extensions &)=delete
void deserialize(TLS_Data_Reader &reader, Connection_Side from, Handshake_Type message_type)
std::optional< Extension_Code > last_added() const
Extensions(TLS_Data_Reader &reader, Connection_Side side, Handshake_Type message_type)
Extensions & operator=(Extensions &&)=default
std::set< Extension_Code > extension_types() const
bool contains_other_than(const std::set< Extension_Code > &allowed_extensions, bool allow_unknown_extensions=false) const
Record_Size_Limit(uint16_t limit)
Extension_Code type() const override
static Extension_Code static_type()
bool empty() const override
Extension_Code type() const override
SRTP_Protection_Profiles(uint16_t pp)
bool empty() const override
SRTP_Protection_Profiles(const std::vector< uint16_t > &pp)
const std::vector< uint16_t > & profiles() const
static Extension_Code static_type()
static Extension_Code static_type()
Server_Certificate_Type(const Server_Certificate_Type &sct, const Policy &policy)
Certificate_Type_Base(std::vector< Certificate_Type > supported_cert_types)
Extension_Code type() const override
static Extension_Code static_type()
Extension_Code type() const override
std::string host_name() const
bool empty() const override
Server_Name_Indicator(std::string_view host_name)
static Extension_Code static_type()
bool empty() const override
Signature_Algorithms_Cert(std::vector< Signature_Scheme > schemes)
const std::vector< Signature_Scheme > & supported_schemes() const
Extension_Code type() const override
Signature_Algorithms(std::vector< Signature_Scheme > schemes)
const std::vector< Signature_Scheme > & supported_schemes() const
bool empty() const override
static Extension_Code static_type()
Extension_Code type() const override
bool empty() const override
Supported_Groups(const std::vector< Group_Params > &groups)
Extension_Code type() const override
static Extension_Code static_type()
static Extension_Code static_type()
Supported_Versions(Protocol_Version version, const Policy &policy)
const std::vector< Protocol_Version > & versions() const
bool empty() const override
Supported_Versions(Protocol_Version version)
Extension_Code type() const override
bool empty() const override
std::vector< uint8_t > serialize(Connection_Side whoami) const override
Unknown_Extension(Extension_Code type, TLS_Data_Reader &reader, uint16_t extension_size)
const std::vector< uint8_t > & value()
bool is_implemented() const override
Extension_Code type() const override
@ CertSignatureAlgorithms
@ ApplicationLayerProtocolNegotiation
@ CertificateStatusRequest