11#include <botan/tls_policy.h>
12#include <botan/tls_ciphersuite.h>
13#include <botan/tls_algos.h>
14#include <botan/tls_exceptn.h>
15#include <botan/internal/stl_util.h>
16#include <botan/pk_keys.h>
24 std::vector<Signature_Scheme> schemes;
31 if(sig_allowed && hash_allowed)
33 schemes.push_back(scheme);
129 if(peer_groups.empty())
134 for(
auto g : our_groups)
162#if defined(BOTAN_HAS_CURVE_25519)
184 std::vector<Group_Params> groups_to_offer;
186 if (!supported_groups.empty())
187 groups_to_offer.push_back(supported_groups.front());
188 return groups_to_offer;
232 const std::string algo_name = public_key.
algo_name();
234 const size_t keylength = public_key.
key_length();
235 size_t expected_keylength = 0;
237 if(algo_name ==
"RSA")
241 else if(algo_name ==
"DH")
245 else if(algo_name ==
"ECDH" || algo_name ==
"Curve25519")
249 else if(algo_name ==
"ECDSA")
255 if(keylength < expected_keylength)
259 ", policy requires at least " +
270#if defined(BOTAN_HAS_TLS_13)
275#if defined(BOTAN_HAS_TLS_12)
292 throw Invalid_State(
"Policy forbids all available DTLS version");
296#if defined(BOTAN_HAS_TLS_13)
302 throw Invalid_State(
"Policy forbids all available TLS version");
317#if defined(BOTAN_HAS_TLS_12)
325#if defined(BOTAN_HAS_TLS_13)
333#if defined(BOTAN_HAS_TLS_12)
364 return 1280 - 40 - 8;
369 return std::vector<uint16_t>();
374class Ciphersuite_Preference_Ordering
final
377 Ciphersuite_Preference_Ordering(
const std::vector<std::string>& ciphers,
378 const std::vector<std::string>& macs,
379 const std::vector<std::string>& kex,
380 const std::vector<std::string>& sigs) :
381 m_ciphers(ciphers), m_macs(macs), m_kex(kex), m_sigs(sigs) {}
383 bool operator()(
const Ciphersuite& a,
const Ciphersuite&
b)
const
385 if(a.kex_method() !=
b.kex_method())
387 for(
const auto & i : m_kex)
389 if(a.kex_algo() == i)
391 if(
b.kex_algo() == i)
396 if(a.cipher_algo() !=
b.cipher_algo())
398 for(
const auto & m_cipher : m_ciphers)
400 if(a.cipher_algo() == m_cipher)
402 if(
b.cipher_algo() == m_cipher)
407 if(a.cipher_keylen() !=
b.cipher_keylen())
409 if(a.cipher_keylen() <
b.cipher_keylen())
411 if(a.cipher_keylen() >
b.cipher_keylen())
415 if(a.auth_method() !=
b.auth_method())
417 for(
const auto & m_sig : m_sigs)
419 if(a.sig_algo() == m_sig)
421 if(
b.sig_algo() == m_sig)
426 if(a.mac_algo() !=
b.mac_algo())
428 for(
const auto & m_mac : m_macs)
430 if(a.mac_algo() == m_mac)
432 if(
b.mac_algo() == m_mac)
440 std::vector<std::string> m_ciphers, m_macs, m_kex, m_sigs;
452 std::vector<Ciphersuite> ciphersuites;
461 if(!suite.usable_in_version(version))
501 ciphersuites.push_back(suite);
504 if(ciphersuites.empty())
506 throw Invalid_State(
"Policy does not allow any available cipher suite");
509 Ciphersuite_Preference_Ordering order(ciphers, macs, kex, sigs);
510 std::sort(ciphersuites.begin(), ciphersuites.end(), order);
512 std::vector<uint16_t> ciphersuite_codes;
513 ciphersuite_codes.reserve(ciphersuites.size());
514 for(
auto i : ciphersuites)
515 ciphersuite_codes.push_back(i.ciphersuite_code());
516 return ciphersuite_codes;
521void print_vec(std::ostream& o,
523 const std::vector<std::string>&
v)
526 for(
size_t i = 0; i !=
v.size(); ++i)
529 if(i !=
v.size() - 1)
535void print_vec(std::ostream& o,
537 const std::vector<Group_Params>&
v)
540 for(
size_t i = 0; i !=
v.size(); ++i)
543 if(i !=
v.size() - 1)
549void print_bool(std::ostream& o,
550 const char* key,
bool b)
552 o << key <<
" = " << (
b ?
"true" :
"false") <<
'\n';
569 if (groups_to_offer.empty()) {
570 print_vec(o,
"key_exchange_groups_to_offer", { std::string(
"none") });
572 print_vec(o,
"key_exchange_groups_to_offer", groups_to_offer);
596 std::ostringstream oss;
603 return {
"ChaCha20Poly1305",
"AES-256/GCM",
"AES-128/GCM" };
608 return {
"SHA-512",
"SHA-384"};
618 return {
"CECPQ1",
"ECDH" };
virtual size_t key_length() const =0
virtual std::string algo_name() const =0
static const std::vector< Ciphersuite > & all_known_ciphersuites()
std::string mac_algo() const
std::string cipher_algo() const
virtual bool include_time_in_hello_random() const
virtual void check_peer_key_acceptable(const Public_Key &public_key) const
virtual bool abort_connection_on_undesired_renegotiation() const
virtual size_t dtls_maximum_timeout() const
virtual size_t minimum_ecdh_group_size() const
virtual size_t dtls_default_mtu() const
virtual bool allow_tls12() const
virtual std::vector< Signature_Scheme > allowed_signature_schemes() const
std::string to_string() const
virtual std::vector< uint16_t > ciphersuite_list(Protocol_Version version) const
virtual bool require_client_certificate_authentication() const
virtual std::vector< Group_Params > key_exchange_groups() const
virtual bool use_extended_master_secret() const
virtual std::vector< Group_Params > key_exchange_groups_to_offer() const
virtual size_t minimum_rsa_bits() const
bool allowed_signature_method(const std::string &sig_method) const
virtual bool tls_13_middlebox_compatibility_mode() const
virtual bool only_resume_with_exact_version() const
virtual bool allow_client_initiated_renegotiation() const
bool allowed_signature_hash(const std::string &hash) const
virtual bool allow_dtls_epoch0_restart() const
virtual bool request_client_certificate_authentication() const
virtual bool require_cert_revocation_info() const
virtual bool negotiate_encrypt_then_mac() const
virtual bool server_uses_own_ciphersuite_preferences() const
virtual Protocol_Version latest_supported_version(bool datagram) const
virtual bool acceptable_protocol_version(Protocol_Version version) const
virtual std::vector< uint16_t > srtp_profiles() const
virtual uint32_t session_ticket_lifetime() const
virtual bool support_cert_status_message() const
virtual bool acceptable_ciphersuite(const Ciphersuite &suite) const
virtual std::vector< std::string > allowed_macs() const
virtual bool hide_unknown_users() const
virtual bool hash_hello_random() const
virtual bool allow_tls13() const
virtual std::vector< std::string > allowed_key_exchange_methods() const
virtual size_t dtls_initial_timeout() const
virtual std::vector< Signature_Scheme > acceptable_signature_schemes() const
virtual bool use_ecc_point_compression() const
virtual bool allow_dtls12() const
virtual size_t minimum_dh_group_size() const
virtual bool allow_insecure_renegotiation() const
virtual Group_Params choose_key_exchange_group(const std::vector< Group_Params > &peer_groups) const
virtual std::optional< uint16_t > record_size_limit() const
virtual std::vector< std::string > allowed_ciphers() const
virtual size_t minimum_signature_strength() const
virtual Group_Params default_dh_group() const
virtual size_t maximum_certificate_chain_size() const
virtual std::vector< std::string > allowed_signature_methods() const
virtual size_t minimum_ecdsa_group_size() const
virtual bool allow_resumption_for_renegotiation() const
virtual std::vector< std::string > allowed_signature_hashes() const
virtual bool allow_server_initiated_renegotiation() const
virtual void print(std::ostream &o) const
bool is_pre_tls_13() const
static const std::vector< Signature_Scheme > & all_available_schemes()
std::vector< std::string > allowed_macs() const override
std::vector< std::string > allowed_ciphers() const override
std::vector< std::string > allowed_key_exchange_methods() const override
std::vector< std::string > allowed_signature_hashes() const override
int(* final)(unsigned char *, CTX *)
std::string to_string(const BER_Object &obj)
bool group_param_is_dh(Group_Params group)
std::string group_param_to_string(Group_Params group)
bool value_exists(const std::vector< T > &vec, const T &val)