Botan 3.11.0
Crypto and TLS for C&
Botan::TLS::Client_Certificate_Type Class Referencefinal

#include <tls_extensions.h>

Inheritance diagram for Botan::TLS::Client_Certificate_Type:
Botan::TLS::Certificate_Type_Base Botan::TLS::Extension

Public Member Functions

 Certificate_Type_Base (const Certificate_Type_Base &certificate_type_from_client, const std::vector< Certificate_Type > &server_preference)
 Certificate_Type_Base (std::vector< Certificate_Type > supported_cert_types)
 Certificate_Type_Base (TLS_Data_Reader &reader, uint16_t extension_size, Connection_Side from)
 Client_Certificate_Type (const Client_Certificate_Type &cct, const Policy &policy)
bool empty () const override
virtual bool is_implemented () const
Certificate_Type selected_certificate_type () const
std::vector< uint8_t > serialize (Connection_Side whoami) const override
Extension_Code type () const override
void validate_selection (const Certificate_Type_Base &from_server) const

Static Public Member Functions

static Extension_Code static_type ()

Detailed Description

Definition at line 200 of file tls_extensions.h.

Constructor & Destructor Documentation

◆ Client_Certificate_Type()

Botan::TLS::Client_Certificate_Type::Client_Certificate_Type ( const Client_Certificate_Type & cct,
const Policy & policy )

Creates the Server Hello extension from the received client preferences.

Definition at line 410 of file tls_extensions.cpp.

410 :
411 Certificate_Type_Base(cct, policy.accepted_client_certificate_types()) {}
Certificate_Type_Base(std::vector< Certificate_Type > supported_cert_types)

References Certificate_Type_Base(), and Client_Certificate_Type().

Referenced by Client_Certificate_Type().

Member Function Documentation

◆ Certificate_Type_Base() [1/3]

Botan::TLS::Certificate_Type_Base::Certificate_Type_Base ( const Certificate_Type_Base & certificate_type_from_client,
const std::vector< Certificate_Type > & server_preference )

Called by the server to select a cert type to be used in the handshake.

Definition at line 175 of file tls_extensions.cpp.

417 :
419 // RFC 7250 4.2
420 // The server_certificate_type extension in the client hello indicates the
421 // types of certificates the client is able to process when provided by
422 // the server in a subsequent certificate payload. [...] With the
423 // server_certificate_type extension in the server hello, the TLS server
424 // indicates the certificate type carried in the Certificate payload.
425 for(const auto server_supported_cert_type : server_preference) {
426 if(value_exists(certificate_type_from_client.m_certificate_types, server_supported_cert_type)) {
427 m_certificate_types.push_back(server_supported_cert_type);
428 return;
429 }
430 }
431
432 // RFC 7250 4.2 (2.)
433 // The server supports the extension defined in this document, but
434 // it does not have any certificate type in common with the client.
435 // Then, the server terminates the session with a fatal alert of
436 // type "unsupported_certificate".
437 throw TLS_Exception(Alert::UnsupportedCertificate, "Failed to agree on certificate_type");
438}
bool value_exists(const std::vector< T > &vec, const V &val)
Definition stl_util.h:43

◆ Certificate_Type_Base() [2/3]

Botan::TLS::Certificate_Type_Base::Certificate_Type_Base ( std::vector< Certificate_Type > supported_cert_types)
explicit

Called by the client to advertise support for a number of cert types.

Definition at line 169 of file tls_extensions.cpp.

405 :
406 m_certificate_types(std::move(supported_cert_types)), m_from(Connection_Side::Client) {
407 BOTAN_ARG_CHECK(!m_certificate_types.empty(), "at least one certificate type must be supported");
408}
#define BOTAN_ARG_CHECK(expr, msg)
Definition assert.h:33

References type().

Referenced by Client_Certificate_Type().

◆ Certificate_Type_Base() [3/3]

Definition at line 179 of file tls_extensions.cpp.

440 :
441 m_from(from) {
442 if(extension_size == 0) {
443 throw Decoding_Error("Certificate type extension cannot be empty");
444 }
445
446 if(from == Connection_Side::Client) {
447 const auto type_bytes = reader.get_tls_length_value(1);
448 if(static_cast<size_t>(extension_size) != type_bytes.size() + 1) {
449 throw Decoding_Error("certificate type extension had inconsistent length");
450 }
451 std::transform(
452 type_bytes.begin(), type_bytes.end(), std::back_inserter(m_certificate_types), [](const auto type_byte) {
453 return static_cast<Certificate_Type>(type_byte);
454 });
455 } else {
456 // RFC 7250 4.2
457 // Note that only a single value is permitted in the
458 // server_certificate_type extension when carried in the server hello.
459 if(extension_size != 1) {
460 throw Decoding_Error("Server's certificate type extension must be of length 1");
461 }
462 const auto type_byte = reader.get_byte();
463 m_certificate_types.push_back(static_cast<Certificate_Type>(type_byte));
464 }
465}

◆ empty()

bool Botan::TLS::Certificate_Type_Base::empty ( ) const
inlineoverridevirtualinherited
Returns
if we should encode this extension or not

Implements Botan::TLS::Extension.

Definition at line 186 of file tls_extensions.h.

186 {
187 // RFC 7250 4.1
188 // If the client has no remaining certificate types to send in the
189 // client hello, other than the default X.509 type, it MUST omit the
190 // entire client[/server]_certificate_type extension [...].
191 return m_from == Connection_Side::Client && m_certificate_types.size() == 1 &&
192 m_certificate_types.front() == Certificate_Type::X509;
193 }

References Botan::TLS::Client, and Botan::TLS::X509.

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

◆ selected_certificate_type()

Certificate_Type Botan::TLS::Certificate_Type_Base::selected_certificate_type ( ) const
inherited

Definition at line 498 of file tls_extensions.cpp.

498 {
500 BOTAN_ASSERT_NOMSG(m_certificate_types.size() == 1);
501 return m_certificate_types.front();
502}
#define BOTAN_ASSERT_NOMSG(expr)
Definition assert.h:75

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

Referenced by validate_selection().

◆ serialize()

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

Implements Botan::TLS::Extension.

Definition at line 467 of file tls_extensions.cpp.

467 {
468 std::vector<uint8_t> result;
469 if(whoami == Connection_Side::Client) {
470 std::vector<uint8_t> type_bytes;
471 std::transform(
472 m_certificate_types.begin(), m_certificate_types.end(), std::back_inserter(type_bytes), [](const auto type) {
473 return static_cast<uint8_t>(type);
474 });
475 append_tls_length_value(result, type_bytes, 1);
476 } else {
477 BOTAN_ASSERT_NOMSG(m_certificate_types.size() == 1);
478 result.push_back(static_cast<uint8_t>(m_certificate_types.front()));
479 }
480 return result;
481}
virtual Extension_Code type() const =0
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

References Botan::TLS::append_tls_length_value(), BOTAN_ASSERT_NOMSG, Botan::TLS::Client, and Botan::TLS::Extension::type().

◆ static_type()

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

Definition at line 209 of file tls_extensions.h.

References Botan::TLS::ClientCertificateType.

Referenced by type().

◆ type()

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

Implements Botan::TLS::Extension.

Definition at line 211 of file tls_extensions.h.

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

References static_type().

Referenced by Certificate_Type_Base().

◆ validate_selection()

void Botan::TLS::Certificate_Type_Base::validate_selection ( const Certificate_Type_Base & from_server) const
inherited

Definition at line 483 of file tls_extensions.cpp.

483 {
485 BOTAN_ASSERT_NOMSG(from_server.m_from == Connection_Side::Server);
486
487 // RFC 7250 4.2
488 // The value conveyed in the [client_]certificate_type extension MUST be
489 // selected from one of the values provided in the [client_]certificate_type
490 // extension sent in the client hello.
491 if(!value_exists(m_certificate_types, from_server.selected_certificate_type())) {
492 throw TLS_Exception(Alert::IllegalParameter,
493 Botan::fmt("Selected certificate type was not offered: {}",
494 certificate_type_to_string(from_server.selected_certificate_type())));
495 }
496}
std::string certificate_type_to_string(Certificate_Type type)
std::string fmt(std::string_view format, const T &... args)
Definition fmt.h:53

References BOTAN_ASSERT_NOMSG, Certificate_Type_Base(), Botan::TLS::certificate_type_to_string(), Botan::TLS::Client, Botan::fmt(), selected_certificate_type(), Botan::TLS::Server, and Botan::value_exists().


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