Botan 3.9.0
Crypto and TLS for C&
Botan::TLS::Application_Layer_Protocol_Notification Class Referencefinal

#include <tls_extensions.h>

Inheritance diagram for Botan::TLS::Application_Layer_Protocol_Notification:
Botan::TLS::Extension

Public Member Functions

 Application_Layer_Protocol_Notification (const std::vector< std::string > &protocols)
 Application_Layer_Protocol_Notification (std::string_view protocol)
 Application_Layer_Protocol_Notification (TLS_Data_Reader &reader, uint16_t extension_size, Connection_Side from)
bool empty () const override
virtual bool is_implemented () const
const std::vector< std::string > & protocols () const
std::vector< uint8_t > serialize (Connection_Side whoami) const override
std::string single_protocol () const
Extension_Code type () const override

Static Public Member Functions

static Extension_Code static_type ()

Detailed Description

ALPN (RFC 7301)

Definition at line 171 of file tls_extensions.h.

Constructor & Destructor Documentation

◆ Application_Layer_Protocol_Notification() [1/3]

Botan::TLS::Application_Layer_Protocol_Notification::Application_Layer_Protocol_Notification ( std::string_view protocol)
inlineexplicit

Single protocol, used by server

Definition at line 184 of file tls_extensions.h.

184 :
185 m_protocols(1, std::string(protocol)) {}

◆ Application_Layer_Protocol_Notification() [2/3]

Botan::TLS::Application_Layer_Protocol_Notification::Application_Layer_Protocol_Notification ( const std::vector< std::string > & protocols)
inlineexplicit

List of protocols, used by client

Definition at line 190 of file tls_extensions.h.

190 :
191 m_protocols(protocols) {}
const std::vector< std::string > & protocols() const

References protocols().

◆ Application_Layer_Protocol_Notification() [3/3]

Botan::TLS::Application_Layer_Protocol_Notification::Application_Layer_Protocol_Notification ( TLS_Data_Reader & reader,
uint16_t extension_size,
Connection_Side from )

Definition at line 312 of file tls_extensions.cpp.

314 {
315 if(extension_size == 0) {
316 return; // empty extension
317 }
318
319 const uint16_t name_bytes = reader.get_uint16_t();
320
321 size_t bytes_remaining = extension_size - 2;
322
323 if(name_bytes != bytes_remaining) {
324 throw Decoding_Error("Bad encoding of ALPN extension, bad length field");
325 }
326
327 while(bytes_remaining > 0) {
328 const std::string p = reader.get_string(1, 0, 255);
329
330 if(bytes_remaining < p.size() + 1) {
331 throw Decoding_Error("Bad encoding of ALPN, length field too long");
332 }
333
334 if(p.empty()) {
335 throw Decoding_Error("Empty ALPN protocol not allowed");
336 }
337
338 bytes_remaining -= (p.size() + 1);
339
340 m_protocols.push_back(p);
341 }
342
343 // RFC 7301 3.1
344 // The "extension_data" field of the [...] extension is structured the
345 // same as described above for the client "extension_data", except that
346 // the "ProtocolNameList" MUST contain exactly one "ProtocolName".
347 if(from == Connection_Side::Server && m_protocols.size() != 1) {
348 throw TLS_Exception(
349 Alert::DecodeError,
350 "Server sent " + std::to_string(m_protocols.size()) + " protocols in ALPN extension response");
351 }
352}

References Botan::TLS::TLS_Data_Reader::get_string(), Botan::TLS::TLS_Data_Reader::get_uint16_t(), and Botan::TLS::Server.

Member Function Documentation

◆ empty()

bool Botan::TLS::Application_Layer_Protocol_Notification::empty ( ) const
inlineoverridevirtual
Returns
if we should encode this extension or not

Implements Botan::TLS::Extension.

Definition at line 197 of file tls_extensions.h.

197{ return m_protocols.empty(); }

◆ is_implemented()

virtual bool Botan::TLS::Extension::is_implemented ( ) const
inlinevirtualinherited
Returns
true if this extension is known and implemented by Botan

Reimplemented in Botan::TLS::Unknown_Extension.

Definition at line 115 of file tls_extensions.h.

115{ return true; }

◆ protocols()

const std::vector< std::string > & Botan::TLS::Application_Layer_Protocol_Notification::protocols ( ) const
inline

Definition at line 177 of file tls_extensions.h.

177{ return m_protocols; }

Referenced by Application_Layer_Protocol_Notification().

◆ serialize()

std::vector< uint8_t > Botan::TLS::Application_Layer_Protocol_Notification::serialize ( Connection_Side whoami) const
overridevirtual
Returns
serialized binary for the extension

Implements Botan::TLS::Extension.

Definition at line 359 of file tls_extensions.cpp.

359 {
360 std::vector<uint8_t> buf(2);
361
362 for(auto&& proto : m_protocols) {
363 if(proto.length() >= 256) {
364 throw TLS_Exception(Alert::InternalError, "ALPN name too long");
365 }
366 if(!proto.empty()) {
367 append_tls_length_value(buf, proto, 1);
368 }
369 }
370
371 buf[0] = get_byte<0>(static_cast<uint16_t>(buf.size() - 2));
372 buf[1] = get_byte<1>(static_cast<uint16_t>(buf.size() - 2));
373
374 return buf;
375}
void append_tls_length_value(std::vector< uint8_t, Alloc > &buf, const T *vals, size_t vals_size, size_t tag_size)
Definition tls_reader.h:184
constexpr uint8_t get_byte(T input)
Definition loadstor.h:79

References Botan::TLS::append_tls_length_value(), and Botan::get_byte().

◆ single_protocol()

std::string Botan::TLS::Application_Layer_Protocol_Notification::single_protocol ( ) const

Definition at line 354 of file tls_extensions.cpp.

354 {
355 BOTAN_STATE_CHECK(m_protocols.size() == 1);
356 return m_protocols.front();
357}
#define BOTAN_STATE_CHECK(expr)
Definition assert.h:49

References BOTAN_STATE_CHECK.

◆ static_type()

Extension_Code Botan::TLS::Application_Layer_Protocol_Notification::static_type ( )
inlinestatic

◆ type()

Extension_Code Botan::TLS::Application_Layer_Protocol_Notification::type ( ) const
inlineoverridevirtual
Returns
code number of the extension

Implements Botan::TLS::Extension.

Definition at line 175 of file tls_extensions.h.

175{ return static_type(); }

References static_type().


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