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

#include <tls_extensions.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 760 of file tls_extensions.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 388 of file tls_extensions_key_share.cpp.

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

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

404 :
405 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 408 of file tls_extensions_key_share.cpp.

408 :
409 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 430 of file tls_extensions_key_share.cpp.

434 {
435 return std::unique_ptr<Key_Share>(new Key_Share(selected_group, client_keyshare, policy, cb, rng));
436}
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 438 of file tls_extensions_key_share.cpp.

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

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

◆ 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 115 of file tls_extensions.h.

115{ 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 453 of file tls_extensions_key_share.cpp.

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

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

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

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

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

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

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

◆ static_type()

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

Definition at line 762 of file tls_extensions.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 461 of file tls_extensions_key_share.cpp.

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

◆ type()

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

Implements Botan::TLS::Extension.

Definition at line 764 of file tls_extensions.h.

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

References static_type().


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