10#ifndef BOTAN_TLS_EXTENSIONS_H_
11#define BOTAN_TLS_EXTENSIONS_H_
13#include <botan/tls_algos.h>
14#include <botan/tls_magic.h>
15#include <botan/tls_version.h>
16#include <botan/secmem.h>
17#include <botan/pkix_types.h>
90 m_sni_host_name(host_name) {}
93 uint16_t extension_size);
95 std::string
host_name()
const {
return m_sni_host_name; }
99 bool empty()
const override {
return m_sni_host_name.empty(); }
101 std::string m_sni_host_name;
104#if defined(BOTAN_HAS_SRP6)
111 static Handshake_Extension_Type static_type()
112 {
return TLSEXT_SRP_IDENTIFIER; }
114 Handshake_Extension_Type
type()
const override {
return static_type(); }
116 explicit SRP_Identifier(
const std::string& identifier) :
117 m_srp_identifier(identifier) {}
119 SRP_Identifier(TLS_Data_Reader& reader,
120 uint16_t extension_size);
122 std::string identifier()
const {
return m_srp_identifier; }
124 std::vector<uint8_t> serialize(Connection_Side whoami)
const override;
126 bool empty()
const override {
return m_srp_identifier.empty(); }
128 std::string m_srp_identifier;
146 m_reneg_data(bits) {}
149 uint16_t extension_size);
152 {
return m_reneg_data; }
156 bool empty()
const override {
return false; }
158 std::vector<uint8_t> m_reneg_data;
171 const std::vector<std::string>&
protocols()
const {
return m_protocols; }
173 const std::string& single_protocol()
const;
179 m_protocols(1, protocol) {}
185 m_protocols(protocols) {}
188 uint16_t extension_size);
192 bool empty()
const override {
return m_protocols.empty(); }
194 std::vector<std::string> m_protocols;
211 const std::vector<uint8_t>&
contents()
const {
return m_ticket; }
222 m_ticket(session_ticket) {}
231 bool empty()
const override {
return false; }
233 std::vector<uint8_t> m_ticket;
248 std::vector<Group_Params> ec_groups()
const;
249 std::vector<Group_Params> dh_groups()
const;
256 uint16_t extension_size);
258 bool empty()
const override {
return m_groups.empty(); }
260 std::vector<Group_Params> m_groups;
274 ANSIX962_COMPRESSED_PRIME = 1,
275 ANSIX962_COMPRESSED_CHAR2 = 2,
286 m_prefers_compressed(prefer_compressed) {}
289 uint16_t extension_size);
291 bool empty()
const override {
return false; }
296 bool m_prefers_compressed =
false;
314 bool empty()
const override {
return m_schemes.empty(); }
317 m_schemes(schemes) {}
320 uint16_t extension_size);
322 std::vector<Signature_Scheme> m_schemes;
336 const std::vector<uint16_t>&
profiles()
const {
return m_pp; }
340 bool empty()
const override {
return m_pp.empty(); }
348 std::vector<uint16_t> m_pp;
364 bool empty()
const override {
return false; }
384 bool empty()
const override {
return false; }
404 bool empty()
const override {
return false; }
413 return m_extension_bytes;
421 const std::vector<std::vector<uint8_t>>& ocsp_key_ids);
424 uint16_t extension_size,
427 std::vector<uint8_t> m_ocsp_names;
428 std::vector<std::vector<uint8_t>> m_ocsp_keys;
429 std::vector<uint8_t> m_extension_bytes;
445 bool empty()
const override {
return m_versions.empty(); }
451 m_versions.push_back(version);
455 uint16_t extension_size,
460 const std::vector<Protocol_Version>
versions()
const {
return m_versions; }
462 std::vector<Protocol_Version> m_versions;
473 uint16_t extension_size);
477 const std::vector<uint8_t>&
value() {
return m_value; }
479 bool empty()
const override {
return false; }
485 std::vector<uint8_t> m_value;
494 std::set<Handshake_Extension_Type> extension_types()
const;
499 return dynamic_cast<T*
>(get(T::static_type()));
505 return get<T>() !=
nullptr;
510 m_extensions[extn->
type()].reset(extn);
515 auto i = m_extensions.find(
type);
517 if(i != m_extensions.end())
518 return i->second.get();
537 deserialize(reader, side);
544 std::map<Handshake_Extension_Type, std::unique_ptr<Extension>> m_extensions;
const std::vector< std::string > & protocols() const
Application_Layer_Protocol_Notification(const std::vector< std::string > &protocols)
Application_Layer_Protocol_Notification(const std::string &protocol)
Handshake_Extension_Type type() const override
bool empty() const override
static Handshake_Extension_Type static_type()
const std::vector< uint8_t > & get_request_extensions() const
Handshake_Extension_Type type() const override
const std::vector< uint8_t > & get_responder_id_list() const
Certificate_Status_Request()
bool empty() const override
static Handshake_Extension_Type static_type()
Handshake_Extension_Type type() const override
Encrypt_then_MAC()=default
static Handshake_Extension_Type static_type()
bool empty() const override
static Handshake_Extension_Type static_type()
Handshake_Extension_Type type() const override
Extended_Master_Secret()=default
bool empty() const override
virtual std::vector< uint8_t > serialize(Connection_Side whoami) const =0
virtual bool empty() const =0
virtual Handshake_Extension_Type type() const =0
virtual ~Extension()=default
void add(Extension *extn)
Extensions(TLS_Data_Reader &reader, Connection_Side side)
Extension * get(Handshake_Extension_Type type) const
Renegotiation_Extension(const std::vector< uint8_t > &bits)
bool empty() const override
Handshake_Extension_Type type() const override
Renegotiation_Extension()=default
const std::vector< uint8_t > & renegotiation_info() const
static Handshake_Extension_Type static_type()
SRTP_Protection_Profiles(uint16_t pp)
bool empty() const override
SRTP_Protection_Profiles(const std::vector< uint16_t > &pp)
Handshake_Extension_Type type() const override
static Handshake_Extension_Type static_type()
const std::vector< uint16_t > & profiles() const
std::string host_name() const
bool empty() const override
Handshake_Extension_Type type() const override
static Handshake_Extension_Type static_type()
Server_Name_Indicator(const std::string &host_name)
Handshake_Extension_Type type() const override
Session_Ticket(const std::vector< uint8_t > &session_ticket)
bool empty() const override
const std::vector< uint8_t > & contents() const
static Handshake_Extension_Type static_type()
std::vector< uint8_t > serialize(Connection_Side) const override
static Handshake_Extension_Type static_type()
Signature_Algorithms(const std::vector< Signature_Scheme > &schemes)
const std::vector< Signature_Scheme > & supported_schemes() const
bool empty() const override
Handshake_Extension_Type type() const override
bool empty() const override
static Handshake_Extension_Type static_type()
Handshake_Extension_Type type() const override
Handshake_Extension_Type type() const override
const std::vector< Protocol_Version > versions() const
static Handshake_Extension_Type static_type()
bool empty() const override
Supported_Versions(Protocol_Version version)
bool empty() const override
Handshake_Extension_Type type() const override
const std::vector< uint8_t > & value()
int(* final)(unsigned char *, CTX *)
#define BOTAN_UNSTABLE_API
@ TLSEXT_ENCRYPT_THEN_MAC
@ TLSEXT_SIGNATURE_ALGORITHMS
@ TLSEXT_CERTIFICATE_TYPES
@ TLSEXT_SUPPORTED_VERSIONS
@ TLSEXT_CERT_STATUS_REQUEST
@ TLSEXT_SERVER_NAME_INDICATION
@ TLSEXT_SAFE_RENEGOTIATION
@ TLSEXT_SUPPORTED_GROUPS
@ TLSEXT_EXTENDED_MASTER_SECRET
@ TLSEXT_EC_POINT_FORMATS