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

#include <tls_extensions_13.h>

Inheritance diagram for Botan::TLS::Key_Share:
Botan::TLS::Extension

Public Member Functions

secure_vector< uint8_t > decapsulate (const Key_Share &server_keyshare, const Policy &policy, Callbacks &cb, RandomNumberGenerator &rng)
bool empty () const override
virtual bool is_implemented () const
 Key_Share (const Policy &policy, Callbacks &cb, RandomNumberGenerator &rng)
 Key_Share (Named_Group selected_group)
 Key_Share (TLS_Data_Reader &reader, uint16_t extension_size, Handshake_Type message_type)
std::vector< Named_Groupoffered_groups () const
void retry_offer (const Key_Share &retry_request_keyshare, const std::vector< Named_Group > &supported_groups, Callbacks &cb, RandomNumberGenerator &rng)
Named_Group selected_group () const
std::vector< uint8_t > serialize (Connection_Side whoami) const override
secure_vector< uint8_t > take_shared_secret ()
Extension_Code type () const override
 ~Key_Share () override

Static Public Member Functions

static std::unique_ptr< Key_Sharecreate_as_encapsulation (Group_Params selected_group, const Key_Share &client_keyshare, const Policy &policy, Callbacks &cb, RandomNumberGenerator &rng)
static Extension_Code static_type ()

Detailed Description

Key_Share from RFC 8446 4.2.8

Definition at line 210 of file tls_extensions_13.h.

Constructor & Destructor Documentation

◆ Key_Share() [1/3]

Botan::TLS::Key_Share::Key_Share ( TLS_Data_Reader & reader,
uint16_t extension_size,
Handshake_Type message_type )

Definition at line 389 of file tls_extensions_key_share.cpp.

389 {
390 if(message_type == Handshake_Type::ClientHello) {
391 m_impl = std::make_unique<Key_Share_Impl>(Key_Share_ClientHello(reader, extension_size));
392 } else if(message_type == Handshake_Type::HelloRetryRequest) {
393 // Connection_Side::Server
394 m_impl = std::make_unique<Key_Share_Impl>(Key_Share_HelloRetryRequest(reader, extension_size));
395 } else if(message_type == Handshake_Type::ServerHello) {
396 // Connection_Side::Server
397 m_impl = std::make_unique<Key_Share_Impl>(Key_Share_ServerHello(reader, extension_size));
398 } else {
399 throw Invalid_Argument(std::string("cannot create a Key_Share extension for message of type: ") +
400 handshake_type_to_string(message_type));
401 }
402}
const char * handshake_type_to_string(Handshake_Type type)
Definition tls_magic.cpp:15

References Botan::TLS::ClientHello, Botan::TLS::handshake_type_to_string(), Botan::TLS::HelloRetryRequest, Key_Share(), and Botan::TLS::ServerHello.

Referenced by create_as_encapsulation(), decapsulate(), Key_Share(), Key_Share(), retry_offer(), and ~Key_Share().

◆ Key_Share() [2/3]

Botan::TLS::Key_Share::Key_Share ( const Policy & policy,
Callbacks & cb,
RandomNumberGenerator & rng )

Definition at line 405 of file tls_extensions_key_share.cpp.

405 :
406 m_impl(std::make_unique<Key_Share_Impl>(Key_Share_ClientHello(policy, cb, rng))) {}

References Key_Share().

◆ Key_Share() [3/3]

Botan::TLS::Key_Share::Key_Share ( Named_Group selected_group)
explicit

Definition at line 409 of file tls_extensions_key_share.cpp.

409 :
410 m_impl(std::make_unique<Key_Share_Impl>(Key_Share_HelloRetryRequest(selected_group))) {}

References selected_group().

◆ ~Key_Share()

Botan::TLS::Key_Share::~Key_Share ( )
overridedefault

References Key_Share(), and selected_group().

Member Function Documentation

◆ create_as_encapsulation()

std::unique_ptr< Key_Share > Botan::TLS::Key_Share::create_as_encapsulation ( Group_Params selected_group,
const Key_Share & client_keyshare,
const Policy & policy,
Callbacks & cb,
RandomNumberGenerator & rng )
static

Creates a Key_Share extension meant for the Server Hello that performs a key encapsulation with the selected public key from the client.

Note
This will retain the shared secret in the Key_Share extension until it is retrieved via take_shared_secret().

Definition at line 431 of file tls_extensions_key_share.cpp.

435 {
436 return std::unique_ptr<Key_Share>(new Key_Share(selected_group, client_keyshare, policy, cb, rng));
437}
Key_Share(TLS_Data_Reader &reader, uint16_t extension_size, Handshake_Type message_type)

References Key_Share(), and selected_group().

◆ decapsulate()

secure_vector< uint8_t > Botan::TLS::Key_Share::decapsulate ( const Key_Share & server_keyshare,
const Policy & policy,
Callbacks & cb,
RandomNumberGenerator & rng )

Decapsulate the shared secret with the peer's key share. This method can be called on a ClientHello's Key_Share with a ServerHello's Key_Share.

Note
After the decapsulation the client's private key is destroyed. Multiple calls will result in an exception.

Definition at line 439 of file tls_extensions_key_share.cpp.

442 {
443 return std::visit(overloaded{[&](Key_Share_ClientHello& ch, const Key_Share_ServerHello& sh) {
444 return ch.decapsulate(sh, policy, cb, rng);
445 },
446 [](const auto&, const auto&) -> secure_vector<uint8_t> {
447 throw Invalid_Argument(
448 "can only decapsulate in ClientHello Key_Share with a ServerHello Key_Share");
449 }},
450 m_impl->key_share,
451 server_keyshare.m_impl->key_share);
452}
std::vector< T, secure_allocator< T > > secure_vector
Definition secmem.h:68
overloaded(Ts...) -> overloaded< Ts... >

References Key_Share().

◆ empty()

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

Implements Botan::TLS::Extension.

Definition at line 427 of file tls_extensions_key_share.cpp.

427 {
428 return std::visit([](const auto& key_share) { return key_share.empty(); }, m_impl->key_share);
429}

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

◆ offered_groups()

std::vector< Named_Group > Botan::TLS::Key_Share::offered_groups ( ) const
Returns
key exchange groups the peer offered key share entries for

Definition at line 454 of file tls_extensions_key_share.cpp.

454 {
455 return std::visit([](const auto& keyshare) { return keyshare.offered_groups(); }, m_impl->key_share);
456}

Referenced by Botan::TLS::Hello_Retry_Request::Hello_Retry_Request().

◆ retry_offer()

void Botan::TLS::Key_Share::retry_offer ( const Key_Share & retry_request_keyshare,
const std::vector< Named_Group > & supported_groups,
Callbacks & cb,
RandomNumberGenerator & rng )

Update a ClientHello's Key_Share to comply with a HelloRetryRequest.

This will create new Key_Share_Entries and should only be called on a ClientHello Key_Share with a HelloRetryRequest Key_Share.

Definition at line 471 of file tls_extensions_key_share.cpp.

474 {
475 std::visit(overloaded{[&](Key_Share_ClientHello& ch, const Key_Share_HelloRetryRequest& hrr) {
476 auto selected = hrr.selected_group();
477 // RFC 8446 4.2.8
478 // [T]he selected_group field [MUST correspond] to a group which was provided in
479 // the "supported_groups" extension in the original ClientHello
480 if(!value_exists(supported_groups, selected)) {
481 throw TLS_Exception(Alert::IllegalParameter, "group was not advertised as supported");
482 }
483
484 return ch.retry_offer(selected, cb, rng);
485 },
486 [](const auto&, const auto&) {
487 throw Invalid_Argument("can only retry with HelloRetryRequest on a ClientHello Key_Share");
488 }},
489 m_impl->key_share,
490 retry_request_keyshare.m_impl->key_share);
491}
bool value_exists(const std::vector< T > &vec, const V &val)
Definition stl_util.h:43

References Key_Share(), and Botan::value_exists().

◆ selected_group()

Named_Group Botan::TLS::Key_Share::selected_group ( ) const
Returns
key exchange group that was selected by a Hello Retry Request

Definition at line 458 of file tls_extensions_key_share.cpp.

458 {
459 return std::visit([](const auto& keyshare) { return keyshare.selected_group(); }, m_impl->key_share);
460}

Referenced by create_as_encapsulation(), Key_Share(), and ~Key_Share().

◆ serialize()

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

Implements Botan::TLS::Extension.

Definition at line 423 of file tls_extensions_key_share.cpp.

423 {
424 return std::visit([](const auto& key_share) { return key_share.serialize(); }, m_impl->key_share);
425}

◆ static_type()

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

Definition at line 212 of file tls_extensions_13.h.

References Botan::TLS::KeyShare.

Referenced by type().

◆ take_shared_secret()

secure_vector< uint8_t > Botan::TLS::Key_Share::take_shared_secret ( )
Returns
the shared secret that was obtained by constructing this Key_Share object with the peer's.
Note
the shared secret value is std:move'd out. Multiple calls will result in an exception.

Definition at line 462 of file tls_extensions_key_share.cpp.

462 {
463 return std::visit(
464 overloaded{[](Key_Share_ServerHello& server_keyshare) { return server_keyshare.take_shared_secret(); },
465 [](auto&) -> secure_vector<uint8_t> {
466 throw Invalid_Argument("Only the key share in Server Hello contains a shared secret");
467 }},
468 m_impl->key_share);
469}

◆ type()

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

Implements Botan::TLS::Extension.

Definition at line 214 of file tls_extensions_13.h.

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

References static_type().


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