Botan 3.0.0-alpha0
Crypto and TLS for C&
tls_policy.cpp
Go to the documentation of this file.
1/*
2* Policies for TLS
3* (C) 2004-2010,2012,2015,2016 Jack Lloyd
4* 2016 Christian Mainka
5* 2017 Harry Reimann, Rohde & Schwarz Cybersecurity
6* 2022 René Meusel, Hannes Rantzsch - neXenio GmbH
7*
8* Botan is released under the Simplified BSD License (see license.txt)
9*/
10
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>
17#include <optional>
18#include <sstream>
19
20namespace Botan::TLS {
21
22std::vector<Signature_Scheme> Policy::allowed_signature_schemes() const
23 {
24 std::vector<Signature_Scheme> schemes;
25
27 {
28 const bool sig_allowed = allowed_signature_method(scheme.algorithm_name());
29 const bool hash_allowed = allowed_signature_hash(scheme.hash_function_name());
30
31 if(sig_allowed && hash_allowed)
32 {
33 schemes.push_back(scheme);
34 }
35 }
36
37 return schemes;
38 }
39
40std::vector<Signature_Scheme> Policy::acceptable_signature_schemes() const
41 {
42 return this->allowed_signature_schemes();
43 }
44
45std::vector<std::string> Policy::allowed_ciphers() const
46 {
47 return {
48 //"AES-256/OCB(12)",
49 "ChaCha20Poly1305",
50 "AES-256/GCM",
51 "AES-128/GCM",
52 //"AES-256/CCM",
53 //"AES-128/CCM",
54 //"AES-256/CCM(8)",
55 //"AES-128/CCM(8)",
56 //"Camellia-256/GCM",
57 //"Camellia-128/GCM",
58 //"ARIA-256/GCM",
59 //"ARIA-128/GCM",
60 //"AES-256",
61 //"AES-128",
62 //"3DES",
63 };
64 }
65
66std::vector<std::string> Policy::allowed_signature_hashes() const
67 {
68 return {
69 "SHA-512",
70 "SHA-384",
71 "SHA-256",
72 };
73 }
74
75std::vector<std::string> Policy::allowed_macs() const
76 {
77 /*
78 SHA-256 is preferred because the Lucky13 countermeasure works
79 somewhat better for SHA-256 vs SHA-384:
80 https://github.com/randombit/botan/pull/675
81 */
82 return {
83 "AEAD",
84 "SHA-256",
85 "SHA-384",
86 "SHA-1",
87 };
88 }
89
90std::vector<std::string> Policy::allowed_key_exchange_methods() const
91 {
92 return {
93 //"ECDHE_PSK",
94 //"PSK",
95 "CECPQ1",
96 "ECDH",
97 "DH",
98 //"RSA",
99 };
100 }
101
102std::vector<std::string> Policy::allowed_signature_methods() const
103 {
104 return {
105 "ECDSA",
106 "RSA",
107 //"DSA",
108 //"IMPLICIT",
109 };
110 }
111
112bool Policy::allowed_signature_method(const std::string& sig_method) const
113 {
114 return value_exists(allowed_signature_methods(), sig_method);
115 }
116
117bool Policy::allowed_signature_hash(const std::string& sig_hash) const
118 {
119 return value_exists(allowed_signature_hashes(), sig_hash);
120 }
121
123 {
124 return false;
125 }
126
127Group_Params Policy::choose_key_exchange_group(const std::vector<Group_Params>& peer_groups) const
128 {
129 if(peer_groups.empty())
130 return Group_Params::NONE;
131
132 const std::vector<Group_Params> our_groups = key_exchange_groups();
133
134 for(auto g : our_groups)
135 {
136 if(value_exists(peer_groups, g))
137 return g;
138 }
139
140 return Group_Params::NONE;
141 }
142
144 {
145 /*
146 * Return the first listed or just default to 2048
147 */
148 for(auto g : key_exchange_groups())
149 {
150 if(group_param_is_dh(g))
151 return g;
152 }
153
155 }
156
157std::vector<Group_Params> Policy::key_exchange_groups() const
158 {
159 // Default list is ordered by performance
160 return {
161
162#if defined(BOTAN_HAS_CURVE_25519)
164#endif
165
172
178 };
179 }
180
181std::vector<Group_Params> Policy::key_exchange_groups_to_offer() const
182 {
183 // by default, we offer a key share for the most-preferred group, only
184 std::vector<Group_Params> groups_to_offer;
185 const auto supported_groups = key_exchange_groups();
186 if (!supported_groups.empty())
187 groups_to_offer.push_back(supported_groups.front());
188 return groups_to_offer;
189 }
190
192 {
193 return 2048;
194 }
195
197 {
198 // Here we are at the mercy of whatever the CA signed, but most certs should be 256 bit by now
199 return 256;
200 }
201
203 {
204 // x25519 is smallest curve currently supported for TLS key exchange
205 return 255;
206 }
207
209 {
210 return 110;
211 }
212
214 {
215 return true;
216 }
217
219 {
220 /* Default assumption is all end-entity certificates should
221 be at least 2048 bits these days.
222
223 If you are connecting to arbitrary servers on the Internet
224 (ie as a web browser or SMTP client) you'll probably have to reduce this
225 to 1024 bits, or perhaps even lower.
226 */
227 return 2048;
228 }
229
231 {
232 const std::string algo_name = public_key.algo_name();
233
234 const size_t keylength = public_key.key_length();
235 size_t expected_keylength = 0;
236
237 if(algo_name == "RSA")
238 {
239 expected_keylength = minimum_rsa_bits();
240 }
241 else if(algo_name == "DH")
242 {
243 expected_keylength = minimum_dh_group_size();
244 }
245 else if(algo_name == "ECDH" || algo_name == "Curve25519")
246 {
247 expected_keylength = minimum_ecdh_group_size();
248 }
249 else if(algo_name == "ECDSA")
250 {
251 expected_keylength = minimum_ecdsa_group_size();
252 }
253 // else some other algo, so leave expected_keylength as zero and the check is a no-op
254
255 if(keylength < expected_keylength)
257 "Peer sent " +
258 std::to_string(keylength) + " bit " + algo_name + " key"
259 ", policy requires at least " +
260 std::to_string(expected_keylength));
261 }
262
264 {
265 return 86400; // ~1 day
266 }
267
269 {
270#if defined(BOTAN_HAS_TLS_13)
271 if(version == Protocol_Version::TLS_V13 && allow_tls13())
272 return true;
273#endif
274
275#if defined(BOTAN_HAS_TLS_12)
276 if(version == Protocol_Version::TLS_V12 && allow_tls12())
277 return true;
278
279 if(version == Protocol_Version::DTLS_V12 && allow_dtls12())
280 return true;
281#endif
282
283 return false;
284 }
285
287 {
288 if(datagram)
289 {
292 throw Invalid_State("Policy forbids all available DTLS version");
293 }
294 else
295 {
296#if defined(BOTAN_HAS_TLS_13)
299#endif
302 throw Invalid_State("Policy forbids all available TLS version");
303 }
304 }
305
306bool Policy::acceptable_ciphersuite(const Ciphersuite& ciphersuite) const
307 {
308 return value_exists(allowed_ciphers(), ciphersuite.cipher_algo()) &&
309 value_exists(allowed_macs(), ciphersuite.mac_algo());
310 }
311
314bool Policy::allow_insecure_renegotiation() const { return false; }
316 {
317#if defined(BOTAN_HAS_TLS_12)
318 return true;
319#else
320 return false;
321#endif
322 }
324 {
325#if defined(BOTAN_HAS_TLS_13)
326 return true;
327#else
328 return false;
329#endif
330 }
332 {
333#if defined(BOTAN_HAS_TLS_12)
334 return true;
335#else
336 return false;
337#endif
338 }
339bool Policy::include_time_in_hello_random() const { return true; }
340bool Policy::hide_unknown_users() const { return false; }
342bool Policy::negotiate_encrypt_then_mac() const { return true; }
344std::optional<uint16_t> Policy::record_size_limit() const { return std::nullopt; }
345bool Policy::support_cert_status_message() const { return true; }
348bool Policy::hash_hello_random() const { return true; }
349bool Policy::only_resume_with_exact_version() const { return true; }
353bool Policy::allow_dtls_epoch0_restart() const { return false; }
354
355size_t Policy::maximum_certificate_chain_size() const { return 0; }
356
357// 1 second initial timeout, 60 second max - see RFC 6347 sec 4.2.4.1
358size_t Policy::dtls_initial_timeout() const { return 1*1000; }
359size_t Policy::dtls_maximum_timeout() const { return 60*1000; }
360
362 {
363 // default MTU is IPv6 min MTU minus UDP/IP headers
364 return 1280 - 40 - 8;
365 }
366
367std::vector<uint16_t> Policy::srtp_profiles() const
368 {
369 return std::vector<uint16_t>();
370 }
371
372namespace {
373
374class Ciphersuite_Preference_Ordering final
375 {
376 public:
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) {}
382
383 bool operator()(const Ciphersuite& a, const Ciphersuite& b) const
384 {
385 if(a.kex_method() != b.kex_method())
386 {
387 for(const auto & i : m_kex)
388 {
389 if(a.kex_algo() == i)
390 return true;
391 if(b.kex_algo() == i)
392 return false;
393 }
394 }
395
396 if(a.cipher_algo() != b.cipher_algo())
397 {
398 for(const auto & m_cipher : m_ciphers)
399 {
400 if(a.cipher_algo() == m_cipher)
401 return true;
402 if(b.cipher_algo() == m_cipher)
403 return false;
404 }
405 }
406
407 if(a.cipher_keylen() != b.cipher_keylen())
408 {
409 if(a.cipher_keylen() < b.cipher_keylen())
410 return false;
411 if(a.cipher_keylen() > b.cipher_keylen())
412 return true;
413 }
414
415 if(a.auth_method() != b.auth_method())
416 {
417 for(const auto & m_sig : m_sigs)
418 {
419 if(a.sig_algo() == m_sig)
420 return true;
421 if(b.sig_algo() == m_sig)
422 return false;
423 }
424 }
425
426 if(a.mac_algo() != b.mac_algo())
427 {
428 for(const auto & m_mac : m_macs)
429 {
430 if(a.mac_algo() == m_mac)
431 return true;
432 if(b.mac_algo() == m_mac)
433 return false;
434 }
435 }
436
437 return false; // equal (?!?)
438 }
439 private:
440 std::vector<std::string> m_ciphers, m_macs, m_kex, m_sigs;
441 };
442
443}
444
445std::vector<uint16_t> Policy::ciphersuite_list(Protocol_Version version) const
446 {
447 const std::vector<std::string> ciphers = allowed_ciphers();
448 const std::vector<std::string> macs = allowed_macs();
449 const std::vector<std::string> kex = allowed_key_exchange_methods();
450 const std::vector<std::string> sigs = allowed_signature_methods();
451
452 std::vector<Ciphersuite> ciphersuites;
453
454 for(auto&& suite : Ciphersuite::all_known_ciphersuites())
455 {
456 // Can we use it?
457 if(!suite.valid())
458 continue;
459
460 // Can we use it in this version?
461 if(!suite.usable_in_version(version))
462 continue;
463
464 // Is it acceptable to the policy?
465 if(!this->acceptable_ciphersuite(suite))
466 continue;
467
468 if(!value_exists(ciphers, suite.cipher_algo()))
469 continue; // unsupported cipher
470
471 // these checks are irrelevant for TLS 1.3
472 // TODO: consider making a method for this logic
473 if(version.is_pre_tls_13())
474 {
475 if(!value_exists(kex, suite.kex_algo()))
476 continue; // unsupported key exchange
477
478 if(!value_exists(macs, suite.mac_algo()))
479 continue; // unsupported MAC algo
480
481 if(!value_exists(sigs, suite.sig_algo()))
482 {
483 // allow if it's an empty sig algo and we want to use PSK
484 if(suite.auth_method() != Auth_Method::IMPLICIT || !suite.psk_ciphersuite())
485 continue;
486 }
487
488 /*
489 CECPQ1 always uses x25519 for ECDH, so treat the applications
490 removal of x25519 from the ECC curve list as equivalent to
491 saying they do not trust CECPQ1
492 */
493 if(suite.kex_method() == Kex_Algo::CECPQ1)
494 {
496 continue;
497 }
498 }
499
500 // OK, consider it
501 ciphersuites.push_back(suite);
502 }
503
504 if(ciphersuites.empty())
505 {
506 throw Invalid_State("Policy does not allow any available cipher suite");
507 }
508
509 Ciphersuite_Preference_Ordering order(ciphers, macs, kex, sigs);
510 std::sort(ciphersuites.begin(), ciphersuites.end(), order);
511
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;
517 }
518
519namespace {
520
521void print_vec(std::ostream& o,
522 const char* key,
523 const std::vector<std::string>& v)
524 {
525 o << key << " = ";
526 for(size_t i = 0; i != v.size(); ++i)
527 {
528 o << v[i];
529 if(i != v.size() - 1)
530 o << ' ';
531 }
532 o << '\n';
533 }
534
535void print_vec(std::ostream& o,
536 const char* key,
537 const std::vector<Group_Params>& v)
538 {
539 o << key << " = ";
540 for(size_t i = 0; i != v.size(); ++i)
541 {
542 o << group_param_to_string(v[i]);
543 if(i != v.size() - 1)
544 o << ' ';
545 }
546 o << '\n';
547 }
548
549void print_bool(std::ostream& o,
550 const char* key, bool b)
551 {
552 o << key << " = " << (b ? "true" : "false") << '\n';
553 }
554
555}
556
557void Policy::print(std::ostream& o) const
558 {
559 print_bool(o, "allow_tls12", allow_tls12());
560 print_bool(o, "allow_tls13", allow_tls13());
561 print_bool(o, "allow_dtls12", allow_dtls12());
562 print_vec(o, "ciphers", allowed_ciphers());
563 print_vec(o, "macs", allowed_macs());
564 print_vec(o, "signature_hashes", allowed_signature_hashes());
565 print_vec(o, "signature_methods", allowed_signature_methods());
566 print_vec(o, "key_exchange_methods", allowed_key_exchange_methods());
567 print_vec(o, "key_exchange_groups", key_exchange_groups());
568 const auto groups_to_offer = key_exchange_groups_to_offer();
569 if (groups_to_offer.empty()) {
570 print_vec(o, "key_exchange_groups_to_offer", { std::string("none") });
571 } else {
572 print_vec(o, "key_exchange_groups_to_offer", groups_to_offer);
573 }
574 print_bool(o, "allow_insecure_renegotiation", allow_insecure_renegotiation());
575 print_bool(o, "include_time_in_hello_random", include_time_in_hello_random());
576 print_bool(o, "allow_server_initiated_renegotiation", allow_server_initiated_renegotiation());
577 print_bool(o, "hide_unknown_users", hide_unknown_users());
578 print_bool(o, "server_uses_own_ciphersuite_preferences", server_uses_own_ciphersuite_preferences());
579 print_bool(o, "negotiate_encrypt_then_mac", negotiate_encrypt_then_mac());
580 print_bool(o, "use_extended_master_secret", use_extended_master_secret());
581 print_bool(o, "support_cert_status_message", support_cert_status_message());
582 print_bool(o, "tls_13_middlebox_compatibility_mode", tls_13_middlebox_compatibility_mode());
583 print_bool(o, "hash_hello_random", hash_hello_random());
584 if (record_size_limit().has_value()) {
585 o << "record_size_limit = " << record_size_limit().has_value() << '\n';
586 }
587 o << "session_ticket_lifetime = " << session_ticket_lifetime() << '\n';
588 o << "minimum_dh_group_size = " << minimum_dh_group_size() << '\n';
589 o << "minimum_ecdh_group_size = " << minimum_ecdh_group_size() << '\n';
590 o << "minimum_rsa_bits = " << minimum_rsa_bits() << '\n';
591 o << "minimum_signature_strength = " << minimum_signature_strength() << '\n';
592 }
593
594std::string Policy::to_string() const
595 {
596 std::ostringstream oss;
597 this->print(oss);
598 return oss.str();
599 }
600
601std::vector<std::string> Strict_Policy::allowed_ciphers() const
602 {
603 return { "ChaCha20Poly1305", "AES-256/GCM", "AES-128/GCM" };
604 }
605
606std::vector<std::string> Strict_Policy::allowed_signature_hashes() const
607 {
608 return { "SHA-512", "SHA-384"};
609 }
610
611std::vector<std::string> Strict_Policy::allowed_macs() const
612 {
613 return { "AEAD" };
614 }
615
616std::vector<std::string> Strict_Policy::allowed_key_exchange_methods() const
617 {
618 return { "CECPQ1", "ECDH" };
619 }
620
621}
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
Definition: tls_policy.cpp:339
virtual void check_peer_key_acceptable(const Public_Key &public_key) const
Definition: tls_policy.cpp:230
virtual bool abort_connection_on_undesired_renegotiation() const
Definition: tls_policy.cpp:352
virtual size_t dtls_maximum_timeout() const
Definition: tls_policy.cpp:359
virtual size_t minimum_ecdh_group_size() const
Definition: tls_policy.cpp:202
virtual size_t dtls_default_mtu() const
Definition: tls_policy.cpp:361
virtual bool allow_tls12() const
Definition: tls_policy.cpp:315
virtual std::vector< Signature_Scheme > allowed_signature_schemes() const
Definition: tls_policy.cpp:22
std::string to_string() const
Definition: tls_policy.cpp:594
virtual std::vector< uint16_t > ciphersuite_list(Protocol_Version version) const
Definition: tls_policy.cpp:445
virtual bool require_client_certificate_authentication() const
Definition: tls_policy.cpp:350
virtual std::vector< Group_Params > key_exchange_groups() const
Definition: tls_policy.cpp:157
virtual bool use_extended_master_secret() const
Definition: tls_policy.cpp:343
virtual std::vector< Group_Params > key_exchange_groups_to_offer() const
Definition: tls_policy.cpp:181
virtual size_t minimum_rsa_bits() const
Definition: tls_policy.cpp:218
bool allowed_signature_method(const std::string &sig_method) const
Definition: tls_policy.cpp:112
virtual bool tls_13_middlebox_compatibility_mode() const
Definition: tls_policy.cpp:347
virtual bool only_resume_with_exact_version() const
Definition: tls_policy.cpp:349
virtual bool allow_client_initiated_renegotiation() const
Definition: tls_policy.cpp:312
bool allowed_signature_hash(const std::string &hash) const
Definition: tls_policy.cpp:117
virtual bool allow_dtls_epoch0_restart() const
Definition: tls_policy.cpp:353
virtual bool request_client_certificate_authentication() const
Definition: tls_policy.cpp:351
virtual bool require_cert_revocation_info() const
Definition: tls_policy.cpp:213
virtual bool negotiate_encrypt_then_mac() const
Definition: tls_policy.cpp:342
virtual bool server_uses_own_ciphersuite_preferences() const
Definition: tls_policy.cpp:341
virtual Protocol_Version latest_supported_version(bool datagram) const
Definition: tls_policy.cpp:286
virtual bool acceptable_protocol_version(Protocol_Version version) const
Definition: tls_policy.cpp:268
virtual std::vector< uint16_t > srtp_profiles() const
Definition: tls_policy.cpp:367
virtual uint32_t session_ticket_lifetime() const
Definition: tls_policy.cpp:263
virtual bool support_cert_status_message() const
Definition: tls_policy.cpp:345
virtual bool acceptable_ciphersuite(const Ciphersuite &suite) const
Definition: tls_policy.cpp:306
virtual std::vector< std::string > allowed_macs() const
Definition: tls_policy.cpp:75
virtual bool hide_unknown_users() const
Definition: tls_policy.cpp:340
virtual bool hash_hello_random() const
Definition: tls_policy.cpp:348
virtual bool allow_tls13() const
Definition: tls_policy.cpp:323
virtual std::vector< std::string > allowed_key_exchange_methods() const
Definition: tls_policy.cpp:90
virtual size_t dtls_initial_timeout() const
Definition: tls_policy.cpp:358
virtual std::vector< Signature_Scheme > acceptable_signature_schemes() const
Definition: tls_policy.cpp:40
virtual bool use_ecc_point_compression() const
Definition: tls_policy.cpp:122
virtual bool allow_dtls12() const
Definition: tls_policy.cpp:331
virtual size_t minimum_dh_group_size() const
Definition: tls_policy.cpp:191
virtual bool allow_insecure_renegotiation() const
Definition: tls_policy.cpp:314
virtual Group_Params choose_key_exchange_group(const std::vector< Group_Params > &peer_groups) const
Definition: tls_policy.cpp:127
virtual std::optional< uint16_t > record_size_limit() const
Definition: tls_policy.cpp:344
virtual std::vector< std::string > allowed_ciphers() const
Definition: tls_policy.cpp:45
virtual size_t minimum_signature_strength() const
Definition: tls_policy.cpp:208
virtual Group_Params default_dh_group() const
Definition: tls_policy.cpp:143
virtual size_t maximum_certificate_chain_size() const
Definition: tls_policy.cpp:355
virtual std::vector< std::string > allowed_signature_methods() const
Definition: tls_policy.cpp:102
virtual size_t minimum_ecdsa_group_size() const
Definition: tls_policy.cpp:196
virtual bool allow_resumption_for_renegotiation() const
Definition: tls_policy.cpp:346
virtual std::vector< std::string > allowed_signature_hashes() const
Definition: tls_policy.cpp:66
virtual bool allow_server_initiated_renegotiation() const
Definition: tls_policy.cpp:313
virtual void print(std::ostream &o) const
Definition: tls_policy.cpp:557
static const std::vector< Signature_Scheme > & all_available_schemes()
std::vector< std::string > allowed_macs() const override
Definition: tls_policy.cpp:611
std::vector< std::string > allowed_ciphers() const override
Definition: tls_policy.cpp:601
std::vector< std::string > allowed_key_exchange_methods() const override
Definition: tls_policy.cpp:616
std::vector< std::string > allowed_signature_hashes() const override
Definition: tls_policy.cpp:606
int(* final)(unsigned char *, CTX *)
Polynomial v
Definition: kyber.cpp:822
PolynomialVector b
Definition: kyber.cpp:821
std::string to_string(const BER_Object &obj)
Definition: asn1_obj.cpp:209
bool group_param_is_dh(Group_Params group)
Definition: tls_algos.cpp:109
std::string group_param_to_string(Group_Params group)
Definition: tls_algos.cpp:146
bool value_exists(const std::vector< T > &vec, const T &val)
Definition: stl_util.h:89