10#include <botan/tls_messages_12.h>
12#include <botan/tls_callbacks.h>
13#include <botan/tls_exceptn.h>
14#include <botan/tls_extensions_12.h>
15#include <botan/tls_policy.h>
16#include <botan/internal/stl_util.h>
17#include <botan/internal/tls_handshake_hash.h>
18#include <botan/internal/tls_handshake_io.h>
19#include <botan/internal/tls_messages_internal.h>
31 return ecc_formats->prefers_compressed();
42 return reneg->renegotiation_info();
53 return ticket->contents();
84void Client_Hello_12::add_tls12_supported_groups_extensions(
const Policy& policy) {
91 std::vector<Group_Params> compatible_kex_groups;
93 if(!group.is_post_quantum()) {
94 compatible_kex_groups.push_back(group);
98 auto supported_groups = std::make_unique<Supported_Groups>(std::move(compatible_kex_groups));
100 if(!supported_groups->ec_groups().empty()) {
105 m_data->extensions().add(std::move(supported_groups));
116 const std::vector<uint8_t>& reneg_info,
125 " but our own policy does not accept it");
157 add_tls12_supported_groups_extensions(policy);
172 if(
m_data->legacy_version().is_datagram_protocol()) {
191 const std::vector<uint8_t>& reneg_info,
207 " but our own policy does not accept it");
243 add_tls12_supported_groups_extensions(policy);
268 const uint16_t TLS_EMPTY_RENEGOTIATION_INFO_SCSV = 0x00FF;
270 if(
offered_suite(
static_cast<uint16_t
>(TLS_EMPTY_RENEGOTIATION_INFO_SCSV))) {
272 if(!reneg->renegotiation_info().empty()) {
273 throw TLS_Exception(Alert::HandshakeFailure,
"Client sent renegotiation SCSV and non-empty extension");
277 m_data->extensions().add(
new Renegotiation_Extension());
293 return std::vector<uint8_t>();
#define BOTAN_STATE_CHECK(expr)
virtual void tls_modify_extensions(Extensions &extn, Connection_Side which_side, Handshake_Type which_message)
const std::string & hostname() const
Protocol_Version protocol_version() const
void update_hello_cookie(const Hello_Verify_Request &hello_verify)
std::vector< uint8_t > renegotiation_info() const
bool supports_encrypt_then_mac() const
Session_Ticket session_ticket() const
bool supports_cert_status_message() const
bool secure_renegotiation() const
bool supports_extended_master_secret() const
std::optional< Session_Handle > session_handle() const
bool supports_session_ticket() const
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)
bool prefers_compressed_ec_points() const
bool offered_suite(uint16_t ciphersuite) const
std::unique_ptr< Client_Hello_Internal > m_data
std::vector< std::string > next_protocols() const
const Session_ID & session_id() const
Handshake_Type type() const override
void update(const uint8_t in[], size_t length)
virtual std::vector< uint8_t > send(const Handshake_Message &msg)=0
virtual std::vector< uint8_t > serialize() const =0
Hello_Request(Handshake_IO &io)
const std::vector< uint8_t > & cookie() const
virtual std::vector< uint16_t > ciphersuite_list(Protocol_Version version) const
virtual std::vector< Group_Params > key_exchange_groups() const
virtual bool negotiate_encrypt_then_mac() const
virtual bool acceptable_protocol_version(Protocol_Version version) const
virtual std::vector< uint16_t > srtp_profiles() const
virtual bool support_cert_status_message() const
virtual std::optional< std::vector< Signature_Scheme > > acceptable_certificate_signature_schemes() const
virtual std::vector< Signature_Scheme > acceptable_signature_schemes() const
virtual bool use_ecc_point_compression() const
static bool hostname_acceptable_for_sni(std::string_view hostname)
Protocol_Version version() const
bool supports_encrypt_then_mac() const
uint16_t ciphersuite_code() const
const Server_Information & server_info() const
Helper class to embody a session handle in all protocol versions.
std::optional< Session_Ticket > ticket() const
std::optional< Session_ID > id() const
bool empty() const noexcept(noexcept(this->get().empty()))
std::vector< uint8_t > make_hello_random(RandomNumberGenerator &rng, Callbacks &cb, const Policy &policy)
Strong< std::vector< uint8_t >, struct Session_ID_ > Session_ID
holds a TLS 1.2 session ID for stateful resumption
Strong< std::vector< uint8_t >, struct Session_Ticket_ > Session_Ticket
holds a TLS 1.2 session ticket for stateless resumption
bool value_exists(const std::vector< T > &vec, const V &val)