Botan 3.13.0
Crypto and TLS for C&
Botan::TLS::Supported_Versions Class Referencefinal

#include <tls_extensions.h>

Inheritance diagram for Botan::TLS::Supported_Versions:
Botan::TLS::Extension

Public Member Functions

bool empty () const override
virtual bool is_implemented () const
std::vector< uint8_t > serialize (Connection_Side whoami) const override
 Supported_Versions (Protocol_Version version)
 Supported_Versions (Protocol_Version version, const Policy &policy)
 Supported_Versions (TLS_Data_Reader &reader, uint16_t extension_size, Connection_Side from)
bool supports (Protocol_Version version) const
Extension_Code type () const override
const std::vector< Protocol_Version > & versions () const

Static Public Member Functions

static Extension_Code static_type ()

Detailed Description

Supported Versions from RFC 8446

Definition at line 397 of file tls_extensions.h.

Constructor & Destructor Documentation

◆ Supported_Versions() [1/3]

Botan::TLS::Supported_Versions::Supported_Versions ( Protocol_Version version,
const Policy & policy )

Definition at line 811 of file tls_extensions.cpp.

811 {
812 // RFC 8446 4.2.1
813 // The extension contains a list of supported versions in preference order,
814 // with the most preferred version first. Implementations [...] MUST send
815 // this extension in the ClientHello containing all versions of TLS which
816 // they are prepared to negotiate.
817 //
818 // We simply assume that we always want the newest available TLS version.
819#if defined(BOTAN_HAS_TLS_13)
820 if(!offer.is_datagram_protocol()) {
821 if(offer >= Protocol_Version::TLS_V13 && policy.allow_tls13()) {
822 m_versions.push_back(Protocol_Version::TLS_V13);
823 }
824 }
825#endif
826
827#if defined(BOTAN_HAS_TLS_12)
828 if(offer.is_datagram_protocol()) {
829 if(offer >= Protocol_Version::DTLS_V12 && policy.allow_dtls12()) {
830 m_versions.push_back(Protocol_Version::DTLS_V12);
831 }
832 } else {
833 if(offer >= Protocol_Version::TLS_V12 && policy.allow_tls12()) {
834 m_versions.push_back(Protocol_Version::TLS_V12);
835 }
836 }
837#endif
838
839 // if no versions are supported, the input variables are not used
840 BOTAN_UNUSED(offer, policy);
841}
#define BOTAN_UNUSED
Definition assert.h:144

References Botan::TLS::Policy::allow_dtls12(), Botan::TLS::Policy::allow_tls12(), Botan::TLS::Policy::allow_tls13(), BOTAN_UNUSED, and Botan::TLS::Protocol_Version::is_datagram_protocol().

◆ Supported_Versions() [2/3]

Botan::TLS::Supported_Versions::Supported_Versions ( Protocol_Version version)
inlineexplicit

Definition at line 409 of file tls_extensions.h.

409{ m_versions.push_back(version); }

◆ Supported_Versions() [3/3]

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

Definition at line 843 of file tls_extensions.cpp.

843 {
844 if(from == Connection_Side::Server) {
845 if(extension_size != 2) {
846 throw Decoding_Error("Server sent invalid supported_versions extension");
847 }
848 m_versions.push_back(Protocol_Version(reader.get_uint16_t()));
849 } else {
850 auto versions = reader.get_range<uint16_t>(1, 1, 127);
851
852 for(auto v : versions) {
853 m_versions.push_back(Protocol_Version(v));
854 }
855
856 if(extension_size != 1 + 2 * versions.size()) {
857 throw Decoding_Error("Client sent invalid supported_versions extension");
858 }
859 }
860}
const std::vector< Protocol_Version > & versions() const

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

Member Function Documentation

◆ empty()

bool Botan::TLS::Supported_Versions::empty ( ) const
inlineoverridevirtual

Predicate if a TLS extension should be included or not

Returns
true if this extension should be encoded, otherwise false

Implements Botan::TLS::Extension.

Definition at line 405 of file tls_extensions.h.

405{ return m_versions.empty(); }

◆ is_implemented()

virtual bool Botan::TLS::Extension::is_implemented ( ) const
inlinevirtualinherited

Predicate if the extension is known/implemented

Note
this exists primarily to support unknown extension handling and doesn't need to be overridden even in the custom extension case.
Returns
true if this extension is known

Reimplemented in Botan::TLS::Unknown_Extension.

Definition at line 113 of file tls_extensions.h.

113{ return true; }

◆ serialize()

std::vector< uint8_t > Botan::TLS::Supported_Versions::serialize ( Connection_Side whoami) const
overridevirtual

Serialize a TLS extension

Parameters
whoamiwhich peer we are acting as in the protocol
Returns
serialized binary for the extension

Implements Botan::TLS::Extension.

Definition at line 787 of file tls_extensions.cpp.

787 {
788 std::vector<uint8_t> buf;
789
790 if(whoami == Connection_Side::Server) {
791 BOTAN_ASSERT_NOMSG(m_versions.size() == 1);
792 buf.push_back(m_versions[0].major_version());
793 buf.push_back(m_versions[0].minor_version());
794 } else {
795 // RFC 8446 4.2.1: ProtocolVersion versions<2..254>; - up to 127 entries.
796 BOTAN_ASSERT_NOMSG(!m_versions.empty());
797 BOTAN_ASSERT_NOMSG(m_versions.size() <= 127);
798 const uint8_t len = static_cast<uint8_t>(m_versions.size() * 2);
799
800 buf.push_back(len);
801
802 for(const Protocol_Version version : m_versions) {
803 buf.push_back(version.major_version());
804 buf.push_back(version.minor_version());
805 }
806 }
807
808 return buf;
809}
#define BOTAN_ASSERT_NOMSG(expr)
Definition assert.h:75

References BOTAN_ASSERT_NOMSG, and Botan::TLS::Server.

◆ static_type()

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

Definition at line 399 of file tls_extensions.h.

References Botan::TLS::SupportedVersions.

Referenced by type().

◆ supports()

bool Botan::TLS::Supported_Versions::supports ( Protocol_Version version) const

Definition at line 862 of file tls_extensions.cpp.

862 {
863 for(auto v : m_versions) {
864 if(version == v) {
865 return true;
866 }
867 }
868 return false;
869}

◆ type()

Extension_Code Botan::TLS::Supported_Versions::type ( ) const
inlineoverridevirtual

Return TLS extension code

Returns
code number of the extension

Implements Botan::TLS::Extension.

Definition at line 401 of file tls_extensions.h.

401{ return static_type(); }
static Extension_Code static_type()

References static_type().

◆ versions()

const std::vector< Protocol_Version > & Botan::TLS::Supported_Versions::versions ( ) const
inline

Definition at line 415 of file tls_extensions.h.

415{ return m_versions; }

Referenced by Supported_Versions().


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