Botan 3.11.1
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 128 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 141 of file tls_extensions.h.

141 :
142 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 147 of file tls_extensions.h.

147 :
148 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 367 of file tls_extensions.cpp.

369 {
370 if(extension_size == 0) {
371 return; // empty extension
372 }
373
374 const uint16_t name_bytes = reader.get_uint16_t();
375
376 size_t bytes_remaining = extension_size - 2;
377
378 if(name_bytes != bytes_remaining) {
379 throw Decoding_Error("Bad encoding of ALPN extension, bad length field");
380 }
381
382 while(bytes_remaining > 0) {
383 const std::string p = reader.get_string(1, 0, 255);
384
385 if(bytes_remaining < p.size() + 1) {
386 throw Decoding_Error("Bad encoding of ALPN, length field too long");
387 }
388
389 if(p.empty()) {
390 throw Decoding_Error("Empty ALPN protocol not allowed");
391 }
392
393 bytes_remaining -= (p.size() + 1);
394
395 m_protocols.push_back(p);
396 }
397
398 // RFC 7301 3.1
399 // The "extension_data" field of the [...] extension is structured the
400 // same as described above for the client "extension_data", except that
401 // the "ProtocolNameList" MUST contain exactly one "ProtocolName".
402 if(from == Connection_Side::Server && m_protocols.size() != 1) {
403 throw TLS_Exception(
404 Alert::DecodeError,
405 "Server sent " + std::to_string(m_protocols.size()) + " protocols in ALPN extension response");
406 }
407}

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 154 of file tls_extensions.h.

154{ 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 95 of file tls_extensions.h.

95{ return true; }

◆ protocols()

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

Definition at line 134 of file tls_extensions.h.

134{ 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 414 of file tls_extensions.cpp.

414 {
415 std::vector<uint8_t> buf(2);
416
417 for(auto&& proto : m_protocols) {
418 if(proto.length() >= 256) {
419 throw TLS_Exception(Alert::InternalError, "ALPN name too long");
420 }
421 if(!proto.empty()) {
422 append_tls_length_value(buf, proto, 1);
423 }
424 }
425
426 buf[0] = get_byte<0>(static_cast<uint16_t>(buf.size() - 2));
427 buf[1] = get_byte<1>(static_cast<uint16_t>(buf.size() - 2));
428
429 return buf;
430}
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:177
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 409 of file tls_extensions.cpp.

409 {
410 BOTAN_STATE_CHECK(m_protocols.size() == 1);
411 return m_protocols.front();
412}
#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 132 of file tls_extensions.h.

132{ return static_type(); }

References static_type().


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