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>
29 class TLS_Data_Reader;
68 virtual std::vector<uint8_t> serialize(
Connection_Side whoami)
const = 0;
73 virtual bool empty()
const = 0;
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)
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; }
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);
479 bool empty()
const override {
return false; }
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;
#define BOTAN_UNSTABLE_API
Supported_Versions(Protocol_Version version)
bool empty() const override
static Handshake_Extension_Type static_type()
Handshake_Extension_Type type() const override
const std::vector< uint16_t > & profiles() const
Server_Name_Indicator(const std::string &host_name)
Handshake_Extension_Type type() const override
bool empty() const override
Handshake_Extension_Type type() const override
void add(Extension *extn)
int(* final)(unsigned char *, CTX *)
static Handshake_Extension_Type static_type()
Handshake_Extension_Type type() const override
Handshake_Extension_Type type() const override
Signature_Algorithms(const std::vector< Signature_Scheme > &schemes)
Certificate_Status_Request()
bool empty() const override
bool empty() const override
bool empty() const override
Handshake_Extension_Type type() const override
Extensions(TLS_Data_Reader &reader, Connection_Side side)
Handshake_Extension_Type type() const override
virtual Handshake_Extension_Type type() const =0
std::vector< uint8_t > serialize(Connection_Side) const override
const std::vector< uint8_t > & contents() const
static Handshake_Extension_Type static_type()
Application_Layer_Protocol_Notification(const std::string &protocol)
const std::vector< Protocol_Version > versions() const
static Handshake_Extension_Type static_type()
static Handshake_Extension_Type static_type()
bool empty() const override
static Handshake_Extension_Type static_type()
const std::vector< uint8_t > & value()
Session_Ticket(const std::vector< uint8_t > &session_ticket)
SRTP_Protection_Profiles(uint16_t pp)
static Handshake_Extension_Type static_type()
Handshake_Extension_Type type() const override
Handshake_Extension_Type type() const override
const std::vector< uint8_t > & get_responder_id_list() const
bool empty() const override
bool empty() const override
std::string host_name() const
SRTP_Protection_Profiles(const std::vector< uint16_t > &pp)
static Handshake_Extension_Type static_type()
const std::vector< Signature_Scheme > & supported_schemes() const
bool empty() const override
const std::vector< std::string > & protocols() const
Handshake_Extension_Type type() const override
const std::vector< uint8_t > & get_request_extensions() const
Handshake_Extension_Type type() const override
bool empty() const override
Handshake_Extension_Type type() const override
static Handshake_Extension_Type static_type()
bool empty() const override
bool empty() const override
static Handshake_Extension_Type static_type()
const std::vector< uint8_t > & renegotiation_info() const
Application_Layer_Protocol_Notification(const std::vector< std::string > &protocols)
static Handshake_Extension_Type static_type()
Renegotiation_Extension(const std::vector< uint8_t > &bits)