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

#include <tls_extensions.h>

Inheritance diagram for Botan::TLS::Record_Size_Limit:
Botan::TLS::Extension

Public Member Functions

bool empty () const override
virtual bool is_implemented () const
uint16_t limit () const
 Record_Size_Limit (TLS_Data_Reader &reader, uint16_t extension_size, Connection_Side from)
 Record_Size_Limit (uint16_t limit)
std::vector< uint8_t > serialize (Connection_Side whoami) const override
Extension_Code type () const override

Static Public Member Functions

static Extension_Code static_type ()

Detailed Description

Record Size Limit (RFC 8449)

TODO: the record size limit is currently not honored by the TLS 1.2 stack

Definition at line 428 of file tls_extensions.h.

Constructor & Destructor Documentation

◆ Record_Size_Limit() [1/2]

Botan::TLS::Record_Size_Limit::Record_Size_Limit ( uint16_t limit)
explicit

Definition at line 871 of file tls_extensions.cpp.

871 : m_limit(limit) {
872 BOTAN_ARG_CHECK(limit >= 64, "RFC 8449 does not allow record size limits smaller than 64 bytes");
873 BOTAN_ARG_CHECK(limit <= MAX_PLAINTEXT_SIZE + 1 /* encrypted content type byte */,
874 "RFC 8449 does not allow record size limits larger than 2^14+1");
875}
#define BOTAN_ARG_CHECK(expr, msg)
Definition assert.h:33
@ MAX_PLAINTEXT_SIZE
Definition tls_magic.h:35

References BOTAN_ARG_CHECK, limit(), and Botan::TLS::MAX_PLAINTEXT_SIZE.

◆ Record_Size_Limit() [2/2]

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

Definition at line 877 of file tls_extensions.cpp.

877 {
878 if(extension_size != 2) {
879 throw TLS_Exception(Alert::DecodeError, "invalid record_size_limit extension");
880 }
881
882 m_limit = reader.get_uint16_t();
883
884 // RFC 8449 4.
885 // This value is the length of the plaintext of a protected record.
886 // The value includes the content type and padding added in TLS 1.3 (that
887 // is, the complete length of TLSInnerPlaintext).
888 //
889 // A server MUST NOT enforce this restriction; a client might advertise
890 // a higher limit that is enabled by an extension or version the server
891 // does not understand. A client MAY abort the handshake with an
892 // "illegal_parameter" alert.
893 //
894 // Note: We are currently supporting this extension in TLS 1.3 only, hence
895 // we check for the TLS 1.3 limit. The TLS 1.2 limit would not include
896 // the "content type byte" and hence be one byte less!
897 if(m_limit > MAX_PLAINTEXT_SIZE + 1 /* encrypted content type byte */ && from == Connection_Side::Server) {
898 throw TLS_Exception(Alert::IllegalParameter,
899 "Server requested a record size limit larger than the protocol's maximum");
900 }
901
902 // RFC 8449 4.
903 // Endpoints MUST NOT send a "record_size_limit" extension with a value
904 // smaller than 64. An endpoint MUST treat receipt of a smaller value
905 // as a fatal error and generate an "illegal_parameter" alert.
906 if(m_limit < 64) {
907 throw TLS_Exception(Alert::IllegalParameter, "Received a record size limit smaller than 64 bytes");
908 }
909}

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

Member Function Documentation

◆ empty()

bool Botan::TLS::Record_Size_Limit::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 442 of file tls_extensions.h.

442{ return m_limit == 0; }

◆ 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; }

◆ limit()

uint16_t Botan::TLS::Record_Size_Limit::limit ( ) const
inline

Definition at line 438 of file tls_extensions.h.

438{ return m_limit; }

Referenced by Record_Size_Limit().

◆ serialize()

std::vector< uint8_t > Botan::TLS::Record_Size_Limit::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 911 of file tls_extensions.cpp.

911 {
912 std::vector<uint8_t> buf;
913
914 buf.push_back(get_byte<0>(m_limit));
915 buf.push_back(get_byte<1>(m_limit));
916
917 return buf;
918}
constexpr uint8_t get_byte(T input)
Definition loadstor.h:79

References Botan::get_byte().

◆ static_type()

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

Definition at line 430 of file tls_extensions.h.

References Botan::TLS::RecordSizeLimit.

Referenced by type().

◆ type()

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

Return TLS extension code

Returns
code number of the extension

Implements Botan::TLS::Extension.

Definition at line 432 of file tls_extensions.h.

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

References static_type().


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