10 #ifndef BOTAN_TLS_EXTENSIONS_H__
11 #define BOTAN_TLS_EXTENSIONS_H__
13 #include <botan/secmem.h>
14 #include <botan/tls_magic.h>
15 #include <botan/ocsp.h>
25 class TLS_Data_Reader;
61 virtual std::vector<uint8_t>
serialize()
const = 0;
66 virtual bool empty()
const = 0;
83 m_sni_host_name(host_name) {}
86 uint16_t extension_size);
88 std::string
host_name()
const {
return m_sni_host_name; }
90 std::vector<uint8_t>
serialize()
const override;
92 bool empty()
const override {
return m_sni_host_name.empty(); }
94 std::string m_sni_host_name;
97 #if defined(BOTAN_HAS_SRP6)
101 class SRP_Identifier final :
public Extension
109 explicit SRP_Identifier(
const std::string& identifier) :
110 m_srp_identifier(identifier) {}
112 SRP_Identifier(TLS_Data_Reader& reader,
113 uint16_t extension_size);
115 std::string identifier()
const {
return m_srp_identifier; }
117 std::vector<uint8_t> serialize()
const override;
119 bool empty()
const override {
return m_srp_identifier.empty(); }
121 std::string m_srp_identifier;
139 m_reneg_data(bits) {}
142 uint16_t extension_size);
145 {
return m_reneg_data; }
147 std::vector<uint8_t>
serialize()
const override;
149 bool empty()
const override {
return false; }
151 std::vector<uint8_t> m_reneg_data;
164 const std::vector<std::string>&
protocols()
const {
return m_protocols; }
172 m_protocols(1, protocol) {}
178 m_protocols(protocols) {}
181 uint16_t extension_size);
183 std::vector<uint8_t>
serialize()
const override;
185 bool empty()
const override {
return m_protocols.empty(); }
187 std::vector<std::string> m_protocols;
204 const std::vector<uint8_t>&
contents()
const {
return m_ticket; }
215 m_ticket(session_ticket) {}
222 std::vector<uint8_t>
serialize()
const override {
return m_ticket; }
224 bool empty()
const override {
return false; }
226 std::vector<uint8_t> m_ticket;
243 const std::vector<std::string>&
curves()
const {
return m_curves; }
245 std::vector<uint8_t>
serialize()
const override;
251 uint16_t extension_size);
253 bool empty()
const override {
return m_curves.empty(); }
255 std::vector<std::string> m_curves;
275 std::vector<uint8_t>
serialize()
const override;
278 m_prefers_compressed(prefer_compressed) {}
281 uint16_t extension_size);
283 bool empty()
const override {
return false; }
288 bool m_prefers_compressed =
false;
309 const std::vector<std::pair<std::string, std::string>>&
312 return m_supported_algos;
315 std::vector<uint8_t>
serialize()
const override;
317 bool empty()
const override {
return false; }
320 const std::vector<std::string>& sig_algos);
323 m_supported_algos(algos) {}
326 uint16_t extension_size);
328 std::vector<std::pair<std::string, std::string>> m_supported_algos;
342 const std::vector<uint16_t>&
profiles()
const {
return m_pp; }
344 std::vector<uint8_t>
serialize()
const override;
346 bool empty()
const override {
return m_pp.empty(); }
354 std::vector<uint16_t> m_pp;
368 std::vector<uint8_t>
serialize()
const override;
370 bool empty()
const override {
return false; }
388 std::vector<uint8_t>
serialize()
const override;
390 bool empty()
const override {
return false; }
408 std::vector<uint8_t>
serialize()
const override;
410 bool empty()
const override {
return false; }
417 const std::vector<std::vector<uint8_t>>& ocsp_key_ids);
421 std::vector<X509_DN> m_ocsp_names;
422 std::vector<std::vector<uint8_t>> m_ocsp_keys;
423 std::vector<uint8_t> m_extension_bytes;
433 std::set<Handshake_Extension_Type> extension_types()
const;
440 auto i = m_extensions.find(type);
442 if(i != m_extensions.end())
443 return dynamic_cast<T*>(i->second.get());
450 return get<T>() !=
nullptr;
455 m_extensions[extn->
type()].reset(extn);
458 std::vector<uint8_t> serialize()
const;
470 std::map<Handshake_Extension_Type, std::unique_ptr<Extension>> m_extensions;
std::vector< uint8_t > serialize() const override
std::vector< uint8_t > serialize() const override
static uint8_t sig_algo_code(const std::string &name)
bool empty() const override
static Handshake_Extension_Type static_type()
virtual std::vector< uint8_t > serialize() const =0
Extensions(TLS_Data_Reader &reader)
Handshake_Extension_Type type() const override
std::vector< uint8_t > serialize() 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
const std::string & single_protocol() const
const std::vector< std::string > & curves() const
Supported_Elliptic_Curves(const std::vector< std::string > &curves)
Handshake_Extension_Type type() const override
void add(Extension *extn)
static uint16_t name_to_curve_id(const std::string &name)
const std::vector< std::pair< std::string, std::string > > & supported_signature_algorthms() const
static Handshake_Extension_Type static_type()
Certificate_Status_Request()
std::vector< uint8_t > serialize() const override
static uint8_t hash_algo_code(const std::string &name)
Extended_Master_Secret()=default
std::vector< uint8_t > serialize() const override
static std::string curve_id_to_name(uint16_t id)
bool empty() const override
Handshake_Extension_Type type() const override
Handshake_Extension_Type type() const override
virtual ~Extension()=default
virtual Handshake_Extension_Type type() const =0
Signature_Algorithms(const std::vector< std::pair< std::string, std::string >> &algos)
std::vector< uint8_t > serialize() const override
const std::vector< uint8_t > & contents() const
static Handshake_Extension_Type static_type()
Application_Layer_Protocol_Notification(const std::string &protocol)
static Handshake_Extension_Type static_type()
std::vector< uint8_t > serialize() const override
static Handshake_Extension_Type static_type()
bool empty() const override
static Handshake_Extension_Type static_type()
Session_Ticket(const std::vector< uint8_t > &session_ticket)
Signature_Algorithms(const std::vector< std::string > &hashes, const std::vector< std::string > &sig_algos)
Renegotiation_Extension()=default
SRTP_Protection_Profiles(uint16_t pp)
virtual bool empty() const =0
Handshake_Extension_Type type() const override
static std::string sig_algo_name(uint8_t code)
Handshake_Extension_Type type() const override
bool empty() const override
std::vector< uint8_t > serialize() const override
std::vector< uint8_t > serialize() const override
bool empty() const override
Handshake_Extension_Type type() const override
std::string host_name() const
Encrypt_then_MAC()=default
SRTP_Protection_Profiles(const std::vector< uint16_t > &pp)
static Handshake_Extension_Type static_type()
bool empty() const override
const std::vector< std::string > & protocols() const
static Handshake_Extension_Type static_type()
Handshake_Extension_Type type() const override
std::vector< uint8_t > serialize() const override
bool empty() const override
bool empty() const override
Handshake_Extension_Type type() const override
static Handshake_Extension_Type static_type()
bool empty() const override
static std::string hash_algo_name(uint8_t code)
static Handshake_Extension_Type static_type()
const std::vector< uint8_t > & renegotiation_info() const
Application_Layer_Protocol_Notification(const std::vector< std::string > &protocols)
Renegotiation_Extension(const std::vector< uint8_t > &bits)