Botan 3.1.1
Crypto and TLS for C&
Classes | Public Member Functions | Protected Member Functions | Protected Attributes | Friends | List of all members
Botan::TLS::Client_Hello_12 Class Referencefinal

#include <tls_messages.h>

Inheritance diagram for Botan::TLS::Client_Hello_12:
Botan::TLS::Client_Hello Botan::TLS::Handshake_Message

Classes

class  Settings
 

Public Member Functions

std::vector< Signature_Schemecertificate_signature_schemes () const
 
const std::vector< uint16_t > & ciphersuites () const
 
 Client_Hello_12 (const std::vector< uint8_t > &buf)
 
 Client_Hello_12 (Handshake_IO &io, Handshake_Hash &hash, const Policy &policy, Callbacks &cb, RandomNumberGenerator &rng, const std::vector< uint8_t > &reneg_info, const Session_with_Handle &session_and_handle, const std::vector< std::string > &next_protocols)
 
 Client_Hello_12 (Handshake_IO &io, Handshake_Hash &hash, const Policy &policy, Callbacks &cb, RandomNumberGenerator &rng, const std::vector< uint8_t > &reneg_info, const Settings &client_settings, const std::vector< std::string > &next_protocols)
 
const std::vector< uint8_t > & compression_methods () const
 
const std::vector< uint8_t > & cookie () const
 
std::vector< uint8_t > cookie_input_data () const
 
std::set< Extension_Codeextension_types () const
 
const Extensionsextensions () const
 
Protocol_Version legacy_version () const
 
std::vector< std::string > next_protocols () const
 
bool offered_suite (uint16_t ciphersuite) const
 
bool prefers_compressed_ec_points () const
 
const std::vector< uint8_t > & random () const
 
std::vector< uint8_t > renegotiation_info () const
 
bool secure_renegotiation () const
 
bool sent_signature_algorithms () const
 
std::vector< uint8_t > serialize () const override
 
std::optional< Session_Handlesession_handle () const
 
const Session_IDsession_id () const
 
Session_Ticket session_ticket () const
 
std::vector< Signature_Schemesignature_schemes () const
 
std::string sni_hostname () const
 
std::vector< uint16_t > srtp_profiles () const
 
std::vector< Group_Paramssupported_dh_groups () const
 
std::vector< Group_Paramssupported_ecc_curves () const
 
std::vector< Protocol_Versionsupported_versions () const
 
bool supports_alpn () const
 
bool supports_cert_status_message () const
 
bool supports_encrypt_then_mac () const
 
bool supports_extended_master_secret () const
 
bool supports_session_ticket () const
 
Handshake_Type type () const override
 
std::string type_string () const
 
void update_hello_cookie (const Hello_Verify_Request &hello_verify)
 
virtual Handshake_Type wire_type () const
 

Protected Member Functions

 Client_Hello_12 (std::unique_ptr< Client_Hello_Internal > data)
 

Protected Attributes

std::unique_ptr< Client_Hello_Internal > m_data
 

Friends

class Client_Hello_13
 

Detailed Description

Definition at line 146 of file tls_messages.h.

Constructor & Destructor Documentation

◆ Client_Hello_12() [1/4]

Botan::TLS::Client_Hello_12::Client_Hello_12 ( const std::vector< uint8_t > &  buf)
explicit

Definition at line 432 of file msg_client_hello.cpp.

432 :
433 Client_Hello_12(std::make_unique<Client_Hello_Internal>(buf)) {}
Client_Hello_12(const std::vector< uint8_t > &buf)

◆ Client_Hello_12() [2/4]

Botan::TLS::Client_Hello_12::Client_Hello_12 ( Handshake_IO io,
Handshake_Hash hash,
const Policy policy,
Callbacks cb,
RandomNumberGenerator rng,
const std::vector< uint8_t > &  reneg_info,
const Settings client_settings,
const std::vector< std::string > &  next_protocols 
)

Definition at line 438 of file msg_client_hello.cpp.

445 {
446 m_data->m_legacy_version = client_settings.protocol_version();
447 m_data->m_random = make_hello_random(rng, cb, policy);
448 m_data->m_suites = policy.ciphersuite_list(client_settings.protocol_version());
449
450 if(!policy.acceptable_protocol_version(m_data->legacy_version())) {
451 throw Internal_Error("Offering " + m_data->legacy_version().to_string() +
452 " but our own policy does not accept it");
453 }
454
455 /*
456 * Place all empty extensions in front to avoid a bug in some systems
457 * which reject hellos when the last extension in the list is empty.
458 */
459
460 // EMS must always be used with TLS 1.2, regardless of the policy used.
461 m_data->extensions().add(new Extended_Master_Secret);
462
463 if(policy.negotiate_encrypt_then_mac()) {
464 m_data->extensions().add(new Encrypt_then_MAC);
465 }
466
467 m_data->extensions().add(new Session_Ticket_Extension());
468
469 m_data->extensions().add(new Renegotiation_Extension(reneg_info));
470
471 m_data->extensions().add(new Supported_Versions(m_data->legacy_version(), policy));
472
473 if(!client_settings.hostname().empty()) {
474 m_data->extensions().add(new Server_Name_Indicator(client_settings.hostname()));
475 }
476
477 if(policy.support_cert_status_message()) {
478 m_data->extensions().add(new Certificate_Status_Request({}, {}));
479 }
480
481 auto supported_groups = std::make_unique<Supported_Groups>(policy.key_exchange_groups());
482 if(!supported_groups->ec_groups().empty()) {
483 m_data->extensions().add(new Supported_Point_Formats(policy.use_ecc_point_compression()));
484 }
485 m_data->extensions().add(supported_groups.release());
486
487 m_data->extensions().add(new Signature_Algorithms(policy.acceptable_signature_schemes()));
488 if(auto cert_signing_prefs = policy.acceptable_certificate_signature_schemes()) {
489 // RFC 8446 4.2.3
490 // TLS 1.2 implementations SHOULD also process this extension.
491 // Implementations which have the same policy in both cases MAY omit
492 // the "signature_algorithms_cert" extension.
493 m_data->extensions().add(new Signature_Algorithms_Cert(std::move(cert_signing_prefs.value())));
494 }
495
496 if(reneg_info.empty() && !next_protocols.empty()) {
497 m_data->extensions().add(new Application_Layer_Protocol_Notification(next_protocols));
498 }
499
500 if(m_data->legacy_version().is_datagram_protocol()) {
501 m_data->extensions().add(new SRTP_Protection_Profiles(policy.srtp_profiles()));
502 }
503
504 cb.tls_modify_extensions(m_data->extensions(), Connection_Side::Client, type());
505
506 hash.update(io.send(*this));
507}
std::unique_ptr< Client_Hello_Internal > m_data
Definition: tls_messages.h:143
std::vector< std::string > next_protocols() const
Handshake_Type type() const override
std::vector< uint8_t > make_hello_random(RandomNumberGenerator &rng, Callbacks &cb, const Policy &policy)

References Botan::TLS::Policy::acceptable_certificate_signature_schemes(), Botan::TLS::Policy::acceptable_protocol_version(), Botan::TLS::Policy::acceptable_signature_schemes(), Botan::TLS::Policy::ciphersuite_list(), Botan::TLS::Client, Botan::TLS::Client_Hello_12::Settings::hostname(), Botan::TLS::Policy::key_exchange_groups(), Botan::TLS::Client_Hello::m_data, Botan::TLS::make_hello_random(), Botan::TLS::Policy::negotiate_encrypt_then_mac(), Botan::TLS::Client_Hello::next_protocols(), Botan::TLS::Client_Hello_12::Settings::protocol_version(), Botan::TLS::Handshake_IO::send(), Botan::TLS::Policy::srtp_profiles(), Botan::TLS::Policy::support_cert_status_message(), Botan::TLS::Callbacks::tls_modify_extensions(), Botan::TLS::Client_Hello::type(), Botan::TLS::Handshake_Hash::update(), and Botan::TLS::Policy::use_ecc_point_compression().

◆ Client_Hello_12() [3/4]

Botan::TLS::Client_Hello_12::Client_Hello_12 ( Handshake_IO io,
Handshake_Hash hash,
const Policy policy,
Callbacks cb,
RandomNumberGenerator rng,
const std::vector< uint8_t > &  reneg_info,
const Session_with_Handle session_and_handle,
const std::vector< std::string > &  next_protocols 
)

Definition at line 512 of file msg_client_hello.cpp.

519 {
520 m_data->m_legacy_version = session.session.version();
521 m_data->m_random = make_hello_random(rng, cb, policy);
522
523 // RFC 5077 3.4
524 // When presenting a ticket, the client MAY generate and include a
525 // Session ID in the TLS ClientHello. [...] If a ticket is presented by
526 // the client, the server MUST NOT attempt to use the Session ID in the
527 // ClientHello for stateful session resumption.
528 m_data->m_session_id = session.handle.id().value_or(Session_ID(make_hello_random(rng, cb, policy)));
529 m_data->m_suites = policy.ciphersuite_list(m_data->legacy_version());
530
531 if(!policy.acceptable_protocol_version(session.session.version())) {
532 throw Internal_Error("Offering " + m_data->legacy_version().to_string() +
533 " but our own policy does not accept it");
534 }
535
536 if(!value_exists(m_data->ciphersuites(), session.session.ciphersuite_code())) {
537 m_data->m_suites.push_back(session.session.ciphersuite_code());
538 }
539
540 /*
541 * As EMS must always be used with TLS 1.2, add it even if it wasn't used
542 * in the original session. If the server understands it and follows the
543 * RFC it should reject our resume attempt and upgrade us to a new session
544 * with the EMS protection.
545 */
546 m_data->extensions().add(new Extended_Master_Secret);
547
548 if(session.session.supports_encrypt_then_mac()) {
549 m_data->extensions().add(new Encrypt_then_MAC);
550 }
551
552 if(session.handle.is_ticket()) {
553 m_data->extensions().add(new Session_Ticket_Extension(session.handle.ticket().value()));
554 }
555
556 m_data->extensions().add(new Renegotiation_Extension(reneg_info));
557
558 m_data->extensions().add(new Server_Name_Indicator(session.session.server_info().hostname()));
559
560 if(policy.support_cert_status_message()) {
561 m_data->extensions().add(new Certificate_Status_Request({}, {}));
562 }
563
564 auto supported_groups = std::make_unique<Supported_Groups>(policy.key_exchange_groups());
565
566 if(!supported_groups->ec_groups().empty()) {
567 m_data->extensions().add(new Supported_Point_Formats(policy.use_ecc_point_compression()));
568 }
569
570 m_data->extensions().add(supported_groups.release());
571
572 m_data->extensions().add(new Signature_Algorithms(policy.acceptable_signature_schemes()));
573 if(auto cert_signing_prefs = policy.acceptable_certificate_signature_schemes()) {
574 // RFC 8446 4.2.3
575 // TLS 1.2 implementations SHOULD also process this extension.
576 // Implementations which have the same policy in both cases MAY omit
577 // the "signature_algorithms_cert" extension.
578 m_data->extensions().add(new Signature_Algorithms_Cert(std::move(cert_signing_prefs.value())));
579 }
580
581 if(reneg_info.empty() && !next_protocols.empty()) {
582 m_data->extensions().add(new Application_Layer_Protocol_Notification(next_protocols));
583 }
584
585 cb.tls_modify_extensions(m_data->extensions(), Connection_Side::Client, type());
586
587 hash.update(io.send(*this));
588}
Strong< std::vector< uint8_t >, struct Session_ID_ > Session_ID
holds a TLS 1.2 session ID for stateful resumption
Definition: tls_session.h:34
bool value_exists(const std::vector< T > &vec, const OT &val)
Definition: stl_util.h:93

References Botan::TLS::Policy::acceptable_certificate_signature_schemes(), Botan::TLS::Policy::acceptable_protocol_version(), Botan::TLS::Policy::acceptable_signature_schemes(), Botan::TLS::Session_Base::ciphersuite_code(), Botan::TLS::Policy::ciphersuite_list(), Botan::TLS::Client, Botan::TLS::Session_with_Handle::handle, Botan::TLS::Server_Information::hostname(), Botan::TLS::Session_Handle::id(), Botan::TLS::Session_Handle::is_ticket(), Botan::TLS::Policy::key_exchange_groups(), Botan::TLS::Client_Hello::m_data, Botan::TLS::make_hello_random(), Botan::TLS::Client_Hello::next_protocols(), Botan::TLS::Handshake_IO::send(), Botan::TLS::Session_Base::server_info(), Botan::TLS::Session_with_Handle::session, Botan::TLS::Policy::support_cert_status_message(), Botan::TLS::Session_Base::supports_encrypt_then_mac(), Botan::TLS::Session_Handle::ticket(), Botan::TLS::Callbacks::tls_modify_extensions(), Botan::TLS::Client_Hello::type(), Botan::TLS::Handshake_Hash::update(), Botan::TLS::Policy::use_ecc_point_compression(), Botan::value_exists(), and Botan::TLS::Session_Base::version().

◆ Client_Hello_12() [4/4]

Botan::TLS::Client_Hello_12::Client_Hello_12 ( std::unique_ptr< Client_Hello_Internal >  data)
protected

Definition at line 417 of file msg_client_hello.cpp.

417 : Client_Hello(std::move(data)) {
418 if(offered_suite(static_cast<uint16_t>(TLS_EMPTY_RENEGOTIATION_INFO_SCSV))) {
419 if(Renegotiation_Extension* reneg = m_data->extensions().get<Renegotiation_Extension>()) {
420 if(!reneg->renegotiation_info().empty()) {
421 throw TLS_Exception(Alert::HandshakeFailure, "Client sent renegotiation SCSV and non-empty extension");
422 }
423 } else {
424 // add fake extension
425 m_data->extensions().add(new Renegotiation_Extension());
426 }
427 }
428}
bool offered_suite(uint16_t ciphersuite) const
@ TLS_EMPTY_RENEGOTIATION_INFO_SCSV

References Botan::TLS::Client_Hello::m_data, Botan::TLS::Client_Hello::offered_suite(), and Botan::TLS::TLS_EMPTY_RENEGOTIATION_INFO_SCSV.

Member Function Documentation

◆ certificate_signature_schemes()

std::vector< Signature_Scheme > Botan::TLS::Client_Hello::certificate_signature_schemes ( ) const
inherited

Definition at line 273 of file msg_client_hello.cpp.

273 {
274 // RFC 8446 4.2.3
275 // If no "signature_algorithms_cert" extension is present, then the
276 // "signature_algorithms" extension also applies to signatures appearing
277 // in certificates.
278 if(Signature_Algorithms_Cert* sigs = m_data->extensions().get<Signature_Algorithms_Cert>()) {
279 return sigs->supported_schemes();
280 } else {
281 return signature_schemes();
282 }
283}
std::vector< Signature_Scheme > signature_schemes() const

References Botan::TLS::Client_Hello::m_data, and Botan::TLS::Client_Hello::signature_schemes().

◆ ciphersuites()

const std::vector< uint16_t > & Botan::TLS::Client_Hello::ciphersuites ( ) const
inherited

Definition at line 203 of file msg_client_hello.cpp.

203 {
204 return m_data->ciphersuites();
205}

References Botan::TLS::Client_Hello::m_data.

◆ compression_methods()

const std::vector< uint8_t > & Botan::TLS::Client_Hello::compression_methods ( ) const

Definition at line 140 of file msg_client_hello.cpp.

199 {
200 return m_data->comp_methods();
201}

◆ cookie()

const std::vector< uint8_t > & Botan::TLS::Client_Hello::cookie ( ) const
inherited

Definition at line 390 of file msg_client_hello.cpp.

390 {
391 return m_data->hello_cookie();
392}

References Botan::TLS::Client_Hello::m_data.

◆ cookie_input_data()

std::vector< uint8_t > Botan::TLS::Client_Hello::cookie_input_data ( ) const
inherited

Definition at line 252 of file msg_client_hello.cpp.

252 {
253 BOTAN_STATE_CHECK(!m_data->hello_cookie_input_bits().empty());
254
255 return m_data->hello_cookie_input_bits();
256}
#define BOTAN_STATE_CHECK(expr)
Definition: assert.h:41

References BOTAN_STATE_CHECK, and Botan::TLS::Client_Hello::m_data.

◆ extension_types()

std::set< Extension_Code > Botan::TLS::Client_Hello::extension_types ( ) const
inherited

Definition at line 207 of file msg_client_hello.cpp.

207 {
208 return m_data->extensions().extension_types();
209}

References Botan::TLS::Client_Hello::m_data.

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

◆ extensions()

const Extensions & Botan::TLS::Client_Hello::extensions ( ) const
inherited

Definition at line 211 of file msg_client_hello.cpp.

211 {
212 return m_data->extensions();
213}

References Botan::TLS::Client_Hello::m_data.

◆ legacy_version()

Protocol_Version Botan::TLS::Client_Hello::legacy_version ( ) const
inherited

Return the version indicated in the ClientHello. This may differ from the version indicated in the supported_versions extension.

See RFC 8446 4.1.2: TLS 1.3, the client indicates its version preferences in the "supported_versions" extension (Section 4.2.1) and the legacy_version field MUST be set to 0x0303, which is the version number for TLS 1.2.

Definition at line 187 of file msg_client_hello.cpp.

187 {
188 return m_data->legacy_version();
189}

References Botan::TLS::Client_Hello::m_data.

◆ next_protocols()

std::vector< std::string > Botan::TLS::Client_Hello::next_protocols ( ) const
inherited

Definition at line 376 of file msg_client_hello.cpp.

376 {
377 if(auto alpn = m_data->extensions().get<Application_Layer_Protocol_Notification>()) {
378 return alpn->protocols();
379 }
380 return {};
381}

References Botan::TLS::Client_Hello::m_data.

Referenced by Client_Hello_12().

◆ offered_suite()

bool Botan::TLS::Client_Hello::offered_suite ( uint16_t  ciphersuite) const
inherited

Definition at line 261 of file msg_client_hello.cpp.

261 {
262 return std::find(m_data->ciphersuites().cbegin(), m_data->ciphersuites().cend(), ciphersuite) !=
263 m_data->ciphersuites().cend();
264}

References Botan::TLS::Client_Hello::m_data.

Referenced by Client_Hello_12().

◆ prefers_compressed_ec_points()

bool Botan::TLS::Client_Hello_12::prefers_compressed_ec_points ( ) const

Definition at line 299 of file msg_client_hello.cpp.

299 {
300 if(Supported_Point_Formats* ecc_formats = m_data->extensions().get<Supported_Point_Formats>()) {
301 return ecc_formats->prefers_compressed();
302 }
303 return false;
304}

References Botan::TLS::Client_Hello::m_data.

◆ random()

const std::vector< uint8_t > & Botan::TLS::Client_Hello::random ( ) const

Definition at line 99 of file msg_client_hello.cpp.

191 {
192 return m_data->random();
193}

◆ renegotiation_info()

std::vector< uint8_t > Botan::TLS::Client_Hello_12::renegotiation_info ( ) const

Definition at line 317 of file msg_client_hello.cpp.

317 {
318 if(Renegotiation_Extension* reneg = m_data->extensions().get<Renegotiation_Extension>()) {
319 return reneg->renegotiation_info();
320 }
321 return {};
322}

References Botan::TLS::Client_Hello::m_data.

Referenced by Botan::TLS::Channel_Impl_12::secure_renegotiation_check().

◆ secure_renegotiation()

bool Botan::TLS::Client_Hello_12::secure_renegotiation ( ) const

Definition at line 313 of file msg_client_hello.cpp.

313 {
314 return m_data->extensions().has<Renegotiation_Extension>();
315}

References Botan::TLS::Client_Hello::m_data.

Referenced by Botan::TLS::Channel_Impl_12::secure_renegotiation_check(), and Botan::TLS::Server_Hello_12::Server_Hello_12().

◆ sent_signature_algorithms()

bool Botan::TLS::Client_Hello::sent_signature_algorithms ( ) const
inherited

Definition at line 372 of file msg_client_hello.cpp.

372 {
373 return m_data->extensions().has<Signature_Algorithms>();
374}

References Botan::TLS::Client_Hello::m_data.

◆ serialize()

std::vector< uint8_t > Botan::TLS::Client_Hello::serialize ( ) const
overridevirtualinherited
Returns
DER representation of this message

Implements Botan::TLS::Handshake_Message.

Definition at line 224 of file msg_client_hello.cpp.

224 {
225 std::vector<uint8_t> buf;
226 buf.reserve(1024); // working around GCC warning
227
228 buf.push_back(m_data->legacy_version().major_version());
229 buf.push_back(m_data->legacy_version().minor_version());
230 buf += m_data->random();
231
232 append_tls_length_value(buf, m_data->session_id().get(), 1);
233
234 if(m_data->legacy_version().is_datagram_protocol()) {
235 append_tls_length_value(buf, m_data->hello_cookie(), 1);
236 }
237
238 append_tls_length_value(buf, m_data->ciphersuites(), 2);
239 append_tls_length_value(buf, m_data->comp_methods(), 1);
240
241 /*
242 * May not want to send extensions at all in some cases. If so,
243 * should include SCSV value (if reneg info is empty, if not we are
244 * renegotiating with a modern server)
245 */
246
247 buf += m_data->extensions().serialize(Connection_Side::Client);
248
249 return buf;
250}
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:176

References Botan::TLS::append_tls_length_value(), Botan::TLS::Client, and Botan::TLS::Client_Hello::m_data.

◆ session_handle()

std::optional< Session_Handle > Botan::TLS::Client_Hello_12::session_handle ( ) const

Definition at line 342 of file msg_client_hello.cpp.

342 {
343 // RFC 5077 3.4
344 // If a ticket is presented by the client, the server MUST NOT attempt
345 // to use the Session ID in the ClientHello for stateful session
346 // resumption.
347 if(auto ticket = session_ticket(); !ticket.empty()) {
348 return ticket;
349 } else if(const auto& id = session_id(); !id.empty()) {
350 return id;
351 } else {
352 return std::nullopt;
353 }
354}
Session_Ticket session_ticket() const
const Session_ID & session_id() const

References Botan::TLS::Client_Hello::session_id(), and session_ticket().

◆ session_id()

const Session_ID & Botan::TLS::Client_Hello::session_id ( ) const
inherited

Definition at line 195 of file msg_client_hello.cpp.

195 {
196 return m_data->session_id();
197}

References Botan::TLS::Client_Hello::m_data.

Referenced by session_handle().

◆ session_ticket()

Session_Ticket Botan::TLS::Client_Hello_12::session_ticket ( ) const

Definition at line 335 of file msg_client_hello.cpp.

335 {
336 if(auto* ticket = m_data->extensions().get<Session_Ticket_Extension>()) {
337 return ticket->contents();
338 }
339 return {};
340}

References Botan::TLS::Client_Hello::m_data.

Referenced by session_handle(), and Botan::TLS::Handshake_State::session_ticket().

◆ signature_schemes()

std::vector< Signature_Scheme > Botan::TLS::Client_Hello::signature_schemes ( ) const
inherited

Definition at line 266 of file msg_client_hello.cpp.

266 {
267 if(Signature_Algorithms* sigs = m_data->extensions().get<Signature_Algorithms>()) {
268 return sigs->supported_schemes();
269 }
270 return {};
271}

References Botan::TLS::Client_Hello::m_data.

Referenced by Botan::TLS::Client_Hello::certificate_signature_schemes(), and Botan::TLS::Handshake_State::choose_sig_format().

◆ sni_hostname()

std::string Botan::TLS::Client_Hello::sni_hostname ( ) const
inherited

Definition at line 306 of file msg_client_hello.cpp.

306 {
307 if(Server_Name_Indicator* sni = m_data->extensions().get<Server_Name_Indicator>()) {
308 return sni->host_name();
309 }
310 return "";
311}

References Botan::TLS::Client_Hello::m_data.

◆ srtp_profiles()

std::vector< uint16_t > Botan::TLS::Client_Hello::srtp_profiles ( ) const
inherited

Definition at line 383 of file msg_client_hello.cpp.

383 {
384 if(SRTP_Protection_Profiles* srtp = m_data->extensions().get<SRTP_Protection_Profiles>()) {
385 return srtp->profiles();
386 }
387 return {};
388}

References Botan::TLS::Client_Hello::m_data.

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

◆ supported_dh_groups()

std::vector< Group_Params > Botan::TLS::Client_Hello::supported_dh_groups ( ) const
inherited

Definition at line 292 of file msg_client_hello.cpp.

292 {
293 if(Supported_Groups* groups = m_data->extensions().get<Supported_Groups>()) {
294 return groups->dh_groups();
295 }
296 return std::vector<Group_Params>();
297}

References Botan::TLS::Client_Hello::m_data.

◆ supported_ecc_curves()

std::vector< Group_Params > Botan::TLS::Client_Hello::supported_ecc_curves ( ) const
inherited

Definition at line 285 of file msg_client_hello.cpp.

285 {
286 if(Supported_Groups* groups = m_data->extensions().get<Supported_Groups>()) {
287 return groups->ec_groups();
288 }
289 return {};
290}

References Botan::TLS::Client_Hello::m_data.

◆ supported_versions()

std::vector< Protocol_Version > Botan::TLS::Client_Hello::supported_versions ( ) const
inherited

Definition at line 324 of file msg_client_hello.cpp.

324 {
325 if(Supported_Versions* versions = m_data->extensions().get<Supported_Versions>()) {
326 return versions->versions();
327 }
328 return {};
329}

References Botan::TLS::Client_Hello::m_data.

◆ supports_alpn()

bool Botan::TLS::Client_Hello::supports_alpn ( ) const
inherited

Definition at line 356 of file msg_client_hello.cpp.

356 {
357 return m_data->extensions().has<Application_Layer_Protocol_Notification>();
358}

References Botan::TLS::Client_Hello::m_data.

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

◆ supports_cert_status_message()

bool Botan::TLS::Client_Hello_12::supports_cert_status_message ( ) const

Definition at line 364 of file msg_client_hello.cpp.

364 {
365 return m_data->extensions().has<Certificate_Status_Request>();
366}

References Botan::TLS::Client_Hello::m_data.

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

◆ supports_encrypt_then_mac()

bool Botan::TLS::Client_Hello_12::supports_encrypt_then_mac ( ) const

Definition at line 368 of file msg_client_hello.cpp.

368 {
369 return m_data->extensions().has<Encrypt_then_MAC>();
370}

References Botan::TLS::Client_Hello::m_data.

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

◆ supports_extended_master_secret()

bool Botan::TLS::Client_Hello_12::supports_extended_master_secret ( ) const

Definition at line 360 of file msg_client_hello.cpp.

360 {
361 return m_data->extensions().has<Extended_Master_Secret>();
362}

References Botan::TLS::Client_Hello::m_data.

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

◆ supports_session_ticket()

bool Botan::TLS::Client_Hello_12::supports_session_ticket ( ) const

Definition at line 331 of file msg_client_hello.cpp.

331 {
332 return m_data->extensions().has<Session_Ticket_Extension>();
333}

References Botan::TLS::Client_Hello::m_data.

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

◆ type()

Handshake_Type Botan::TLS::Client_Hello::type ( ) const
overridevirtualinherited
Returns
the message type

Implements Botan::TLS::Handshake_Message.

Definition at line 183 of file msg_client_hello.cpp.

References Botan::TLS::ClientHello.

Referenced by Client_Hello_12().

◆ type_string()

std::string Botan::TLS::Handshake_Message::type_string ( ) const
inherited
Returns
string representation of this message type

Definition at line 19 of file tls_handshake_state.cpp.

19 {
21}
virtual Handshake_Type type() const =0
const char * handshake_type_to_string(Handshake_Type type)

References Botan::TLS::handshake_type_to_string(), and Botan::TLS::Handshake_Message::type().

◆ update_hello_cookie()

void Botan::TLS::Client_Hello_12::update_hello_cookie ( const Hello_Verify_Request hello_verify)

Definition at line 215 of file msg_client_hello.cpp.

215 {
216 BOTAN_STATE_CHECK(m_data->legacy_version().is_datagram_protocol());
217
218 m_data->m_hello_cookie = hello_verify.cookie();
219}

References BOTAN_STATE_CHECK, Botan::TLS::Hello_Verify_Request::cookie(), and Botan::TLS::Client_Hello::m_data.

◆ wire_type()

virtual Handshake_Type Botan::TLS::Handshake_Message::wire_type ( ) const
inlinevirtualinherited
Returns
the wire representation of the message's type

Definition at line 41 of file tls_handshake_msg.h.

41 {
42 // Usually equal to the Handshake_Type enum value,
43 // with the exception of TLS 1.3 Hello Retry Request.
44 return type();
45 }

Referenced by Botan::TLS::Stream_Handshake_IO::send().

Friends And Related Function Documentation

◆ Client_Hello_13

friend class Client_Hello_13
friend

Definition at line 184 of file tls_messages.h.

Member Data Documentation

◆ m_data

std::unique_ptr<Client_Hello_Internal> Botan::TLS::Client_Hello::m_data
protectedinherited

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