Botan 3.12.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 401 of file tls_extensions_key_share.cpp.

401 {
402 if(message_type == Handshake_Type::ClientHello) {
403 m_impl = std::make_unique<Key_Share_Impl>(Key_Share_ClientHello(reader, extension_size));
404 } else if(message_type == Handshake_Type::HelloRetryRequest) {
405 // Connection_Side::Server
406 m_impl = std::make_unique<Key_Share_Impl>(Key_Share_HelloRetryRequest(reader, extension_size));
407 } else if(message_type == Handshake_Type::ServerHello) {
408 // Connection_Side::Server
409 m_impl = std::make_unique<Key_Share_Impl>(Key_Share_ServerHello(reader, extension_size));
410 } else {
411 throw Invalid_Argument(std::string("cannot create a Key_Share extension for message of type: ") +
412 handshake_type_to_string(message_type));
413 }
414}
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 417 of file tls_extensions_key_share.cpp.

417 :
418 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 421 of file tls_extensions_key_share.cpp.

421 :
422 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 443 of file tls_extensions_key_share.cpp.

447 {
448 return std::unique_ptr<Key_Share>(new Key_Share(selected_group, client_keyshare, policy, cb, rng));
449}
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 451 of file tls_extensions_key_share.cpp.

454 {
455 return std::visit(overloaded{[&](Key_Share_ClientHello& ch, const Key_Share_ServerHello& sh) {
456 return ch.decapsulate(sh, policy, cb, rng);
457 },
458 [](const auto&, const auto&) -> secure_vector<uint8_t> {
459 throw Invalid_Argument(
460 "can only decapsulate in ClientHello Key_Share with a ServerHello Key_Share");
461 }},
462 m_impl->key_share,
463 server_keyshare.m_impl->key_share);
464}
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 439 of file tls_extensions_key_share.cpp.

439 {
440 return std::visit([](const auto& key_share) { return key_share.empty(); }, m_impl->key_share);
441}

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

◆ 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 466 of file tls_extensions_key_share.cpp.

466 {
467 return std::visit([](const auto& keyshare) { return keyshare.offered_groups(); }, m_impl->key_share);
468}

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 483 of file tls_extensions_key_share.cpp.

486 {
487 std::visit(overloaded{[&](Key_Share_ClientHello& ch, const Key_Share_HelloRetryRequest& hrr) {
488 auto selected = hrr.selected_group();
489 // RFC 8446 4.2.8
490 // [T]he selected_group field [MUST correspond] to a group which was provided in
491 // the "supported_groups" extension in the original ClientHello
492 if(!value_exists(supported_groups, selected)) {
493 throw TLS_Exception(Alert::IllegalParameter, "group was not advertised as supported");
494 }
495
496 return ch.retry_offer(selected, cb, rng);
497 },
498 [](const auto&, const auto&) {
499 throw Invalid_Argument("can only retry with HelloRetryRequest on a ClientHello Key_Share");
500 }},
501 m_impl->key_share,
502 retry_request_keyshare.m_impl->key_share);
503}
bool value_exists(const std::vector< T > &vec, const V &val)
Definition stl_util.h:44

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 470 of file tls_extensions_key_share.cpp.

470 {
471 return std::visit([](const auto& keyshare) { return keyshare.selected_group(); }, m_impl->key_share);
472}

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 435 of file tls_extensions_key_share.cpp.

435 {
436 return std::visit([](const auto& key_share) { return key_share.serialize(); }, m_impl->key_share);
437}

◆ 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 474 of file tls_extensions_key_share.cpp.

474 {
475 return std::visit(
476 overloaded{[](Key_Share_ServerHello& server_keyshare) { return server_keyshare.take_shared_secret(); },
477 [](auto&) -> secure_vector<uint8_t> {
478 throw Invalid_Argument("Only the key share in Server Hello contains a shared secret");
479 }},
480 m_impl->key_share);
481}

◆ 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: