Botan 3.11.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 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 340 of file tls_extensions.cpp.

342 {
343 if(extension_size == 0) {
344 return; // empty extension
345 }
346
347 const uint16_t name_bytes = reader.get_uint16_t();
348
349 size_t bytes_remaining = extension_size - 2;
350
351 if(name_bytes != bytes_remaining) {
352 throw Decoding_Error("Bad encoding of ALPN extension, bad length field");
353 }
354
355 while(bytes_remaining > 0) {
356 const std::string p = reader.get_string(1, 0, 255);
357
358 if(bytes_remaining < p.size() + 1) {
359 throw Decoding_Error("Bad encoding of ALPN, length field too long");
360 }
361
362 if(p.empty()) {
363 throw Decoding_Error("Empty ALPN protocol not allowed");
364 }
365
366 bytes_remaining -= (p.size() + 1);
367
368 m_protocols.push_back(p);
369 }
370
371 // RFC 7301 3.1
372 // The "extension_data" field of the [...] extension is structured the
373 // same as described above for the client "extension_data", except that
374 // the "ProtocolNameList" MUST contain exactly one "ProtocolName".
375 if(from == Connection_Side::Server && m_protocols.size() != 1) {
376 throw TLS_Exception(
377 Alert::DecodeError,
378 "Server sent " + std::to_string(m_protocols.size()) + " protocols in ALPN extension response");
379 }
380}

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 387 of file tls_extensions.cpp.

387 {
388 std::vector<uint8_t> buf(2);
389
390 for(auto&& proto : m_protocols) {
391 if(proto.length() >= 256) {
392 throw TLS_Exception(Alert::InternalError, "ALPN name too long");
393 }
394 if(!proto.empty()) {
395 append_tls_length_value(buf, proto, 1);
396 }
397 }
398
399 buf[0] = get_byte<0>(static_cast<uint16_t>(buf.size() - 2));
400 buf[1] = get_byte<1>(static_cast<uint16_t>(buf.size() - 2));
401
402 return buf;
403}
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 382 of file tls_extensions.cpp.

382 {
383 BOTAN_STATE_CHECK(m_protocols.size() == 1);
384 return m_protocols.front();
385}
#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: