Botan 3.12.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 384 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 806 of file tls_extensions.cpp.

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

396{ 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 838 of file tls_extensions.cpp.

838 {
839 if(from == Connection_Side::Server) {
840 if(extension_size != 2) {
841 throw Decoding_Error("Server sent invalid supported_versions extension");
842 }
843 m_versions.push_back(Protocol_Version(reader.get_uint16_t()));
844 } else {
845 auto versions = reader.get_range<uint16_t>(1, 1, 127);
846
847 for(auto v : versions) {
848 m_versions.push_back(Protocol_Version(v));
849 }
850
851 if(extension_size != 1 + 2 * versions.size()) {
852 throw Decoding_Error("Client sent invalid supported_versions extension");
853 }
854 }
855}
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
Returns
if we should encode this extension or not

Implements Botan::TLS::Extension.

Definition at line 392 of file tls_extensions.h.

392{ return m_versions.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 100 of file tls_extensions.h.

100{ return true; }

◆ serialize()

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

Implements Botan::TLS::Extension.

Definition at line 782 of file tls_extensions.cpp.

782 {
783 std::vector<uint8_t> buf;
784
785 if(whoami == Connection_Side::Server) {
786 BOTAN_ASSERT_NOMSG(m_versions.size() == 1);
787 buf.push_back(m_versions[0].major_version());
788 buf.push_back(m_versions[0].minor_version());
789 } else {
790 // RFC 8446 4.2.1: ProtocolVersion versions<2..254>; - up to 127 entries.
791 BOTAN_ASSERT_NOMSG(!m_versions.empty());
792 BOTAN_ASSERT_NOMSG(m_versions.size() <= 127);
793 const uint8_t len = static_cast<uint8_t>(m_versions.size() * 2);
794
795 buf.push_back(len);
796
797 for(const Protocol_Version version : m_versions) {
798 buf.push_back(version.major_version());
799 buf.push_back(version.minor_version());
800 }
801 }
802
803 return buf;
804}
#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 386 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 857 of file tls_extensions.cpp.

857 {
858 for(auto v : m_versions) {
859 if(version == v) {
860 return true;
861 }
862 }
863 return false;
864}

◆ type()

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

Implements Botan::TLS::Extension.

Definition at line 388 of file tls_extensions.h.

388{ 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 402 of file tls_extensions.h.

402{ return m_versions; }

Referenced by Supported_Versions().


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