Botan
1.11.15
|
#include <tls_extensions.h>
Public Member Functions | |
void | add (Extension *extn) |
void | deserialize (TLS_Data_Reader &reader) |
std::set < Handshake_Extension_Type > | extension_types () const |
Extensions () | |
Extensions (TLS_Data_Reader &reader) | |
template<typename T > | |
T * | get () const |
template<typename T > | |
bool | has () const |
std::vector< byte > | serialize () const |
Represents a block of extensions in a hello message
Definition at line 385 of file tls_extensions.h.
Botan::TLS::Extensions::Extensions | ( | ) | [inline] |
Definition at line 417 of file tls_extensions.h.
{}
Botan::TLS::Extensions::Extensions | ( | TLS_Data_Reader & | reader | ) | [inline] |
void Botan::TLS::Extensions::add | ( | Extension * | extn | ) | [inline] |
Definition at line 408 of file tls_extensions.h.
References Botan::TLS::Extension::type().
{ extensions[extn->type()].reset(extn); }
void Botan::TLS::Extensions::deserialize | ( | TLS_Data_Reader & | reader | ) |
Definition at line 61 of file tls_extensions.cpp.
References Botan::Extensions::add(), Botan::TLS::TLS_Data_Reader::discard_next(), Botan::TLS::TLS_Data_Reader::get_u16bit(), Botan::TLS::TLS_Data_Reader::has_remaining(), and Botan::TLS::TLS_Data_Reader::remaining_bytes().
Referenced by Extensions().
{ if(reader.has_remaining()) { const u16bit all_extn_size = reader.get_u16bit(); if(reader.remaining_bytes() != all_extn_size) throw Decoding_Error("Bad extension size"); while(reader.has_remaining()) { const u16bit extension_code = reader.get_u16bit(); const u16bit extension_size = reader.get_u16bit(); Extension* extn = make_extension(reader, extension_code, extension_size); if(extn) this->add(extn); else // unknown/unhandled extension reader.discard_next(extension_size); } } }
std::set< Handshake_Extension_Type > Botan::TLS::Extensions::extension_types | ( | ) | const |
Definition at line 121 of file tls_extensions.cpp.
{ std::set<Handshake_Extension_Type> offers; for(auto i = extensions.begin(); i != extensions.end(); ++i) offers.insert(i->first); return offers; }
T* Botan::TLS::Extensions::get | ( | ) | const [inline] |
Definition at line 391 of file tls_extensions.h.
{ Handshake_Extension_Type type = T::static_type(); auto i = extensions.find(type); if(i != extensions.end()) return dynamic_cast<T*>(i->second.get()); return nullptr; }
bool Botan::TLS::Extensions::has | ( | ) | const [inline] |
Definition at line 403 of file tls_extensions.h.
References has().
Referenced by has().
{ return get<T>() != nullptr; }
std::vector< byte > Botan::TLS::Extensions::serialize | ( | ) | const |
Definition at line 87 of file tls_extensions.cpp.
References Botan::get_byte().
{ std::vector<byte> buf(2); // 2 bytes for length field for(auto& extn : extensions) { if(extn.second->empty()) continue; const u16bit extn_code = extn.second->type(); std::vector<byte> extn_val = extn.second->serialize(); buf.push_back(get_byte(0, extn_code)); buf.push_back(get_byte(1, extn_code)); buf.push_back(get_byte<u16bit>(0, extn_val.size())); buf.push_back(get_byte<u16bit>(1, extn_val.size())); buf += extn_val; } const u16bit extn_size = buf.size() - 2; buf[0] = get_byte(0, extn_size); buf[1] = get_byte(1, extn_size); // avoid sending a completely empty extensions block if(buf.size() == 2) return std::vector<byte>(); return buf; }