|
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;
}
1.7.6.1