9 #include <botan/tls_policy.h>
10 #include <botan/tls_ciphersuite.h>
11 #include <botan/tls_magic.h>
12 #include <botan/tls_exceptn.h>
13 #include <botan/internal/stl_util.h>
128 for(
size_t i = 0; i != our_curves.size(); ++i)
130 return our_curves[i];
138 return "modp/ietf/2048";
188 const std::string algo_name = public_key.
algo_name();
190 const size_t keylength = public_key.
key_length();
191 size_t expected_keylength = 0;
193 if(algo_name ==
"RSA")
197 else if(algo_name ==
"DH")
201 else if(algo_name ==
"DSA")
205 else if(algo_name ==
"ECDH" || algo_name ==
"Curve25519")
209 else if(algo_name ==
"ECDSA")
215 if(keylength < expected_keylength)
219 ", policy requires at least " +
288 return 1280 - 40 - 8;
293 return std::vector<uint16_t>();
298 class Ciphersuite_Preference_Ordering
301 Ciphersuite_Preference_Ordering(
const std::vector<std::string>& ciphers,
302 const std::vector<std::string>& macs,
303 const std::vector<std::string>& kex,
304 const std::vector<std::string>& sigs) :
307 bool operator()(
const Ciphersuite& a,
const Ciphersuite& b)
const
309 if(a.kex_algo() != b.kex_algo())
311 for(
size_t i = 0; i !=
m_kex.size(); ++i)
313 if(a.kex_algo() ==
m_kex[i])
315 if(b.kex_algo() ==
m_kex[i])
320 if(a.cipher_algo() != b.cipher_algo())
322 for(
size_t i = 0; i !=
m_ciphers.size(); ++i)
331 if(a.cipher_keylen() != b.cipher_keylen())
333 if(a.cipher_keylen() < b.cipher_keylen())
335 if(a.cipher_keylen() > b.cipher_keylen())
339 if(a.sig_algo() != b.sig_algo())
341 for(
size_t i = 0; i !=
m_sigs.size(); ++i)
343 if(a.sig_algo() ==
m_sigs[i])
345 if(b.sig_algo() ==
m_sigs[i])
350 if(a.mac_algo() != b.mac_algo())
352 for(
size_t i = 0; i !=
m_macs.size(); ++i)
354 if(a.mac_algo() ==
m_macs[i])
356 if(b.mac_algo() ==
m_macs[i])
377 std::vector<Ciphersuite> ciphersuites;
382 if(suite.valid() ==
false)
390 if(!have_srp && suite.kex_algo() ==
"SRP_SHA")
396 if(suite.mac_algo() ==
"AEAD")
400 if(suite.mac_algo() !=
"SHA-1")
416 if(suite.sig_algo() !=
"" || !suite.psk_ciphersuite())
429 ciphersuites.push_back(suite);
432 if(ciphersuites.empty())
434 throw Exception(
"Policy does not allow any available cipher suite");
437 Ciphersuite_Preference_Ordering order(ciphers, macs, kex, sigs);
438 std::sort(ciphersuites.begin(), ciphersuites.end(), order);
440 std::vector<uint16_t> ciphersuite_codes;
441 for(
auto i : ciphersuites)
442 ciphersuite_codes.push_back(i.ciphersuite_code());
443 return ciphersuite_codes;
448 void print_vec(std::ostream& o,
450 const std::vector<std::string>& v)
453 for(
size_t i = 0; i != v.size(); ++i)
456 if(i != v.size() - 1)
462 void print_bool(std::ostream& o,
463 const char* key,
bool b)
465 o << key <<
" = " << (b ?
"true" :
"false") <<
'\n';
491 o <<
"dh_group = " <<
dh_group() <<
'\n';
500 std::ostringstream oss;
507 return {
"ChaCha20Poly1305",
"AES-256/GCM",
"AES-128/GCM" };
512 return {
"SHA-512",
"SHA-384"};
522 return {
"CECPQ1",
"ECDH" };
virtual std::vector< std::string > allowed_ciphers() const
virtual size_t minimum_dh_group_size() const
virtual void print(std::ostream &o) const
virtual bool allow_insecure_renegotiation() const
static Protocol_Version latest_dtls_version()
virtual std::vector< std::string > allowed_ecc_curves() const
std::vector< std::string > m_sigs
virtual bool require_cert_revocation_info() const
std::string to_string() const
virtual bool send_fallback_scsv(Protocol_Version version) const
virtual std::vector< uint16_t > srtp_profiles() const
virtual std::vector< std::string > allowed_signature_methods() const
bool allow_dtls10() const override
std::vector< std::string > m_macs
bool allow_tls11() const override
virtual bool server_uses_own_ciphersuite_preferences() const
bool allowed_signature_method(const std::string &sig_method) const
bool allow_dtls12() const override
virtual std::vector< uint8_t > compression() const
virtual std::string algo_name() const =0
static Protocol_Version latest_tls_version()
std::string to_string(const BER_Object &obj)
virtual size_t minimum_ecdh_group_size() const
virtual size_t minimum_dsa_group_size() const
std::vector< std::string > m_ciphers
virtual bool hide_unknown_users() const
virtual std::string choose_curve(const std::vector< std::string > &curve_names) const
bool allow_tls12() const override
std::vector< std::string > allowed_signature_hashes() const override
bool allowed_ecc_curve(const std::string &curve) const
virtual std::string dh_group() const
virtual std::vector< uint16_t > ciphersuite_list(Protocol_Version version, bool have_srp) const
virtual bool allow_server_initiated_renegotiation() const
virtual size_t minimum_ecdsa_group_size() const
virtual size_t key_length() const =0
virtual std::vector< std::string > allowed_signature_hashes() const
virtual size_t minimum_rsa_bits() const
virtual size_t dtls_initial_timeout() const
virtual bool acceptable_protocol_version(Protocol_Version version) const
std::vector< std::string > allowed_macs() const override
virtual size_t dtls_maximum_timeout() const
virtual bool use_ecc_point_compression() const
std::vector< std::string > allowed_key_exchange_methods() const override
virtual size_t dtls_default_mtu() const
virtual uint32_t session_ticket_lifetime() const
bool value_exists(const std::vector< T > &vec, const T &val)
virtual bool allow_tls10() const
std::vector< std::string > m_kex
virtual void check_peer_key_acceptable(const Public_Key &public_key) const
virtual size_t minimum_signature_strength() const
bool supports_aead_modes() const
virtual bool allow_dtls12() const
virtual bool acceptable_ciphersuite(const Ciphersuite &suite) const
virtual bool allow_dtls10() const
virtual Protocol_Version latest_supported_version(bool datagram) const
virtual bool include_time_in_hello_random() const
std::vector< std::string > allowed_ciphers() const override
virtual std::vector< std::string > allowed_key_exchange_methods() const
bool allow_tls10() const override
bool is_datagram_protocol() const
static const std::vector< Ciphersuite > & all_known_ciphersuites()
virtual bool allow_tls11() const
virtual std::vector< std::string > allowed_macs() const
virtual bool negotiate_encrypt_then_mac() const
virtual bool allow_tls12() const