11#include <botan/tls_callbacks.h>
14#include <botan/dl_group.h>
15#include <botan/ec_group.h>
16#include <botan/ecdh.h>
17#include <botan/ocsp.h>
18#include <botan/pk_algs.h>
19#include <botan/tls_algos.h>
20#include <botan/tls_exceptn.h>
21#include <botan/tls_policy.h>
22#include <botan/tls_session.h>
23#include <botan/x509path.h>
24#include <botan/internal/fmt.h>
25#include <botan/internal/stl_util.h>
27#if defined(BOTAN_HAS_X25519)
28 #include <botan/x25519.h>
31#if defined(BOTAN_HAS_X448)
32 #include <botan/x448.h>
35#if defined(BOTAN_HAS_ML_KEM)
36 #include <botan/ml_kem.h>
39#if defined(BOTAN_HAS_FRODOKEM)
40 #include <botan/frodokem.h>
43#if defined(BOTAN_HAS_TLS_13_PQC)
44 #include <botan/internal/hybrid_public_key.h>
62 return std::chrono::system_clock::now();
89 const std::vector<std::optional<OCSP::Response>>& ocsp_responses,
90 const std::vector<Certificate_Store*>& trusted_roots,
92 std::string_view hostname,
94 if(cert_chain.empty()) {
117 std::string_view hostname,
122 throw TLS_Exception(Alert::CertificateUnknown,
"Application did not provide a means to validate the raw public key");
136 std::vector<std::vector<uint8_t>> result(chain.size());
145 std::string_view padding,
147 const std::vector<uint8_t>& msg) {
148 PK_Signer signer(key, rng, padding, format);
154 std::string_view padding,
156 const std::vector<uint8_t>& msg,
157 const std::vector<uint8_t>& sig) {
165bool is_dh_group(
const std::variant<TLS::Group_Params, DL_Group>& group) {
166 return std::holds_alternative<DL_Group>(group) || std::get<TLS::Group_Params>(group).is_dh_named_group();
169DL_Group get_dl_group(
const std::variant<TLS::Group_Params, DL_Group>& group) {
177 [&](TLS::Group_Params group_param) {
return DL_Group::from_name(group_param.to_string().value()); }},
184 const std::variant<TLS::Group_Params, DL_Group>& group, std::span<const uint8_t> key_bits) {
185 if(is_dh_group(group)) {
188 const auto dl_group = get_dl_group(group);
198 if(Y <= 1 || Y >= dl_group.get_p() - 1) {
202 return std::make_unique<DH_PublicKey>(dl_group, Y);
208 const auto group_params = std::get<TLS::Group_Params>(group);
210 if(group_params.is_ecdh_named_curve()) {
212 return std::make_unique<ECDH_PublicKey>(ec_group,
EC_AffinePoint(ec_group, key_bits));
215#if defined(BOTAN_HAS_X25519)
216 if(group_params.is_x25519()) {
217 return std::make_unique<X25519_PublicKey>(key_bits);
221#if defined(BOTAN_HAS_X448)
222 if(group_params.is_x448()) {
223 return std::make_unique<X448_PublicKey>(key_bits);
227#if defined(BOTAN_HAS_TLS_13_PQC)
228 if(group_params.is_pqc_hybrid()) {
233#if defined(BOTAN_HAS_ML_KEM)
234 if(group_params.is_pure_ml_kem()) {
235 return std::make_unique<ML_KEM_PublicKey>(key_bits,
ML_KEM_Mode(group_params.to_string().value()));
239#if defined(BOTAN_HAS_FRODOKEM)
240 if(group_params.is_pure_frodokem()) {
241 return std::make_unique<FrodoKEM_PublicKey>(key_bits,
FrodoKEMMode(group_params.to_string().value()));
245 throw Decoding_Error(
"cannot create a key offering without a group definition");
249#if defined(BOTAN_HAS_ML_KEM)
255#if defined(BOTAN_HAS_FRODOKEM)
261#if defined(BOTAN_HAS_TLS_13_PQC)
271 const std::vector<uint8_t>& encoded_public_key,
275 auto kem_pub_key = [&] {
299 return {ephemeral_keypair->public_value(),
306 const std::vector<uint8_t>& encapsulated_bytes,
312 throw TLS_Exception(Alert::IllegalParameter,
"Invalid encapsulated key length");
314 return kemdec.
decrypt(encapsulated_bytes, 0, {});
320 }
catch(
const std::bad_cast&) {
321 throw Invalid_Argument(
"provided ephemeral key is not a PK_Key_Agreement_Key");
327 if(is_dh_group(group)) {
328 const DL_Group dl_group = get_dl_group(group);
329 return std::make_unique<DH_PrivateKey>(rng, dl_group);
333 const auto group_params = std::get<TLS::Group_Params>(group);
335 if(group_params.is_ecdh_named_curve()) {
337 return std::make_unique<ECDH_PrivateKey>(rng, ec_group);
340#if defined(BOTAN_HAS_X25519)
341 if(group_params.is_x25519()) {
342 return std::make_unique<X25519_PrivateKey>(rng);
346#if defined(BOTAN_HAS_X448)
347 if(group_params.is_x448()) {
348 return std::make_unique<X448_PrivateKey>(rng);
352 if(group_params.is_kem()) {
353 throw TLS_Exception(Alert::IllegalParameter,
"cannot generate an ephemeral KEX key for a KEM");
356 throw TLS_Exception(Alert::DecodeError,
"cannot create a key offering without a group definition");
372 ecc_key->set_point_encoding(tls12_ecc_pubkey_encoding_format);
379 const std::variant<TLS::Group_Params, DL_Group>& group,
381 const std::vector<uint8_t>& public_value,
384 const auto kex_pub_key = [&]() {
419 return std::vector<uint8_t>();
435 std::span<const uint8_t> client_random,
436 std::span<const uint8_t> secret)
const {
441 if(prf_algo ==
"MD5" || prf_algo ==
"SHA-1") {
#define BOTAN_ASSERT_NOMSG(expr)
#define BOTAN_ASSERT_NONNULL(ptr)
static BigInt from_bytes(std::span< const uint8_t > bytes)
static DL_Group from_name(std::string_view name)
static EC_Group from_name(std::string_view name)
const char * what() const noexcept override
static std::unique_ptr< KDF > create_or_throw(std::string_view algo_spec, std::string_view provider="")
secure_vector< uint8_t > bits_of() const
size_t encapsulated_key_length() const
void decrypt(std::span< uint8_t > out_shared_key, std::span< const uint8_t > encap_key, size_t desired_shared_key_len=32, std::span< const uint8_t > salt={})
KEM_Encapsulation encrypt(RandomNumberGenerator &rng, size_t desired_shared_key_len=32, std::span< const uint8_t > salt={})
SymmetricKey derive_key(size_t key_len, std::span< const uint8_t > peer_key, std::span< const uint8_t > salt) const
std::vector< uint8_t > sign_message(const uint8_t in[], size_t length, RandomNumberGenerator &rng)
bool verify_message(const uint8_t msg[], size_t msg_length, const uint8_t sig[], size_t sig_length)
bool successful_validation() const
std::string result_string() const
virtual std::chrono::milliseconds tls_verify_cert_chain_ocsp_timeout() const
virtual std::vector< uint8_t > tls_provide_cert_status(const std::vector< X509_Certificate > &chain, const Certificate_Status_Request &csr)
virtual std::string tls_peer_network_identity()
virtual void tls_modify_extensions(Extensions &extn, Connection_Side which_side, Handshake_Type which_message)
virtual std::vector< std::vector< uint8_t > > tls_provide_cert_chain_status(const std::vector< X509_Certificate > &chain, const Certificate_Status_Request &csr)
virtual void tls_log_debug_bin(const char *descr, const uint8_t val[], size_t val_len)
virtual void tls_log_error(const char *err)
virtual void tls_log_debug(const char *what)
virtual std::unique_ptr< PK_Key_Agreement_Key > tls12_generate_ephemeral_ecdh_key(TLS::Group_Params group, RandomNumberGenerator &rng, EC_Point_Format tls12_ecc_pubkey_encoding_format)
virtual std::string tls_server_choose_app_protocol(const std::vector< std::string > &client_protos)
virtual std::optional< OCSP::Response > tls_parse_ocsp_response(const std::vector< uint8_t > &raw_response)
virtual void tls_examine_extensions(const Extensions &extn, Connection_Side which_side, Handshake_Type which_message)
virtual std::vector< uint8_t > tls_sign_message(const Private_Key &key, RandomNumberGenerator &rng, std::string_view padding, Signature_Format format, const std::vector< uint8_t > &msg)
virtual void tls_session_established(const Session_Summary &session)
virtual void tls_verify_raw_public_key(const Public_Key &raw_public_key, Usage_Type usage, std::string_view hostname, const TLS::Policy &policy)
virtual std::unique_ptr< KDF > tls12_protocol_specific_kdf(std::string_view prf_algo) const
virtual KEM_Encapsulation tls_kem_encapsulate(TLS::Group_Params group, const std::vector< uint8_t > &encoded_public_key, RandomNumberGenerator &rng, const Policy &policy)
virtual bool tls_should_persist_resumption_information(const Session &session)
virtual std::unique_ptr< Private_Key > tls_kem_generate_key(TLS::Group_Params group, RandomNumberGenerator &rng)
virtual std::unique_ptr< Public_Key > tls_deserialize_peer_public_key(const std::variant< TLS::Group_Params, DL_Group > &group, std::span< const uint8_t > key_bits)
virtual secure_vector< uint8_t > tls_ephemeral_key_agreement(const std::variant< TLS::Group_Params, DL_Group > &group, const PK_Key_Agreement_Key &private_key, const std::vector< uint8_t > &public_value, RandomNumberGenerator &rng, const Policy &policy)
virtual secure_vector< uint8_t > tls_kem_decapsulate(TLS::Group_Params group, const Private_Key &private_key, const std::vector< uint8_t > &encapsulated_bytes, RandomNumberGenerator &rng, const Policy &policy)
virtual std::chrono::system_clock::time_point tls_current_timestamp()
virtual std::unique_ptr< PK_Key_Agreement_Key > tls_generate_ephemeral_key(const std::variant< TLS::Group_Params, DL_Group > &group, RandomNumberGenerator &rng)
virtual void tls_verify_cert_chain(const std::vector< X509_Certificate > &cert_chain, const std::vector< std::optional< OCSP::Response > > &ocsp_responses, const std::vector< Certificate_Store * > &trusted_roots, Usage_Type usage, std::string_view hostname, const TLS::Policy &policy)
virtual void tls_ssl_key_log_data(std::string_view label, std::span< const uint8_t > client_random, std::span< const uint8_t > secret) const
virtual bool tls_verify_message(const Public_Key &key, std::string_view padding, Signature_Format format, const std::vector< uint8_t > &msg, const std::vector< uint8_t > &sig)
virtual void tls_inspect_handshake_msg(const Handshake_Message &message)
constexpr bool is_pqc_hybrid() const
constexpr bool is_kem() const
constexpr bool is_pure_frodokem() const
std::optional< std::string > to_string() const
constexpr bool is_pure_ml_kem() const
static std::unique_ptr< Hybrid_KEM_PrivateKey > generate_from_group(Group_Params group, RandomNumberGenerator &rng)
static std::unique_ptr< Hybrid_KEM_PublicKey > load_for_group(Group_Params group, std::span< const uint8_t > concatenated_public_values)
virtual void check_peer_key_acceptable(const Public_Key &public_key) const
virtual bool require_cert_revocation_info() const
virtual size_t minimum_signature_strength() const
bool is_pre_tls_13() const
Protocol_Version version() const
std::chrono::seconds lifetime_hint() const
std::string fmt(std::string_view format, const T &... args)
Path_Validation_Result x509_path_validate(const std::vector< X509_Certificate > &end_certs, const Path_Validation_Restrictions &restrictions, const std::vector< Certificate_Store * > &trusted_roots, std::string_view hostname, Usage_Type usage, std::chrono::system_clock::time_point ref_time, std::chrono::milliseconds ocsp_timeout, const std::vector< std::optional< OCSP::Response > > &ocsp_resp)
std::vector< T, secure_allocator< T > > secure_vector