Botan  1.11.15
Public Member Functions
Botan::TLS::Extensions Class Reference

#include <tls_extensions.h>

List of all members.

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< byteserialize () const

Detailed Description

Represents a block of extensions in a hello message

Definition at line 385 of file tls_extensions.h.


Constructor & Destructor Documentation

Definition at line 417 of file tls_extensions.h.

{}

Definition at line 419 of file tls_extensions.h.

References deserialize().

{ deserialize(reader); }

Member Function Documentation

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;
   }
template<typename T >
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;
         }
template<typename T >
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;
   }

The documentation for this class was generated from the following files: