OpenVPN 3 Core Library
Loading...
Searching...
No Matches
sslctx.hpp
Go to the documentation of this file.
1// OpenVPN -- An application to securely tunnel IP networks
2// over a single port, with support for SSL/TLS-based
3// session authentication and key exchange,
4// packet encryption, packet authentication, and
5// packet compression.
6//
7// Copyright (C) 2012- OpenVPN Inc.
8//
9// SPDX-License-Identifier: MPL-2.0 OR AGPL-3.0-only WITH openvpn3-openssl-exception
10//
11
12// Wrap the OpenSSL SSL API as defined in <openssl/ssl.h>
13// so that it can be used as the SSL layer by the OpenVPN core.
14
15#ifndef OPENVPN_OPENSSL_SSL_SSLCTX_H
16#define OPENVPN_OPENSSL_SSL_SSLCTX_H
17
18#include <map>
19#include <mutex>
20#include <string>
21#include <cstring>
22#include <cstdint>
23#include <sstream>
24#include <utility>
25
26#include <openssl/crypto.h>
27#include <openssl/ssl.h>
28#include <openssl/x509v3.h>
29#include <openssl/rsa.h>
30#include <openssl/dsa.h>
31#include <openssl/ec.h>
32#include <openssl/bn.h>
33#include <openssl/rand.h>
34#include <openssl/evp.h>
35#if OPENSSL_VERSION_NUMBER >= 0x30000000L
36#include <openssl/provider.h>
37#endif
38
65#if ENABLE_EXTERNAL_PKI
66#if OPENSSL_VERSION_NUMBER >= 0x30000000L
68#else
70#endif
71#endif
81
82
83#ifdef HAVE_JSON
85#endif
86
87// An SSL Context is essentially a configuration that can be used
88// to generate an arbitrary number of actual SSL connections objects.
89
90// OpenSSLContext is an SSL Context implementation that uses the
91// OpenSSL library as a backend.
92
93#if OPENSSL_VERSION_NUMBER < 0x30000000L
94using ssl_mac_ctx = ::HMAC_CTX;
95#else
96using ssl_mac_ctx = ::EVP_MAC_CTX;
97#endif
98
99namespace openvpn {
100
101// Represents an SSL configuration that can be used
102// to instantiate actual SSL sessions.
104{
105 using SSL_CTX_unique_ptr = std::unique_ptr<::SSL_CTX, decltype(&::SSL_CTX_free)>;
106
107 public:
110
111 enum
112 {
113 MAX_CIPHERTEXT_IN = 64 // maximum number of queued input ciphertext packets
114 };
115
126 class Config : public SSLConfigAPI
127 {
128 friend class OpenSSLContext;
129
130 // These can be OR-ed to provide different OpenSSL library configurations.
131 static constexpr unsigned short LIB_CTX_NO_PROVIDERS = 0;
132 static constexpr unsigned short LIB_CTX_LEGACY_PROVIDER = (1 << 0);
133
134#if OPENSSL_VERSION_NUMBER >= 0x30000000L
135 /* OpenSSL library context, used to load non-default providers etc,
136 * made mutable so const function can use/initialise the context.
137 *
138 * First field in this class so it gets destructed last*/
139 using TlsLibCtxType = std::remove_pointer<SSLLib::Ctx>::type;
140 using TlsLibCtxUPtr = std::unique_ptr<TlsLibCtxType, decltype(&::OSSL_LIB_CTX_free)>;
141 using SSLProviderUPtr = std::unique_ptr<OSSL_PROVIDER, decltype(&::OSSL_PROVIDER_unload)>;
142
152 class LibContext
153 {
154 public:
161 LibContext(unsigned short config)
162 : ctx_{OSSL_LIB_CTX_new(), &::OSSL_LIB_CTX_free}
163 {
164 if (!ctx_)
165 throw OpenSSLException("OpenSSLContext: OSSL_LIB_CTX_new failed");
166
167 if (config & LIB_CTX_LEGACY_PROVIDER)
168 {
169 SSLProviderUPtr legacy_provider{OSSL_PROVIDER_load(ctx_.get(), "legacy"), &::OSSL_PROVIDER_unload};
170
171 if (!legacy_provider)
172 throw OpenSSLException("OpenSSLContext: loading legacy provider failed");
173
174 SSLProviderUPtr default_provider{OSSL_PROVIDER_load(ctx_.get(), "default"), &::OSSL_PROVIDER_unload};
175
176 if (!default_provider)
177 throw OpenSSLException("OpenSSLContext: loading default provider failed");
178
179 providers_.emplace_back(std::move(legacy_provider));
180 providers_.emplace_back(std::move(default_provider));
181 }
182 }
183
185 SSLLib::Ctx ctx() const
186 {
187 return ctx_.get();
188 }
189
190 private:
191 TlsLibCtxUPtr ctx_;
192 std::vector<SSLProviderUPtr> providers_;
193 };
194#endif
195
196 public:
198
210 {
211 return SSLFactoryAPI::Ptr(new OpenSSLContext(this));
212 }
213
214 void set_mode(const Mode &mode_arg) override
215 {
216 mode = mode_arg;
217 }
218
219 const Mode &get_mode() const override
220 {
221 return mode;
222 }
223
224 // if this callback is defined, no private key needs to be loaded
225 void set_external_pki_callback(ExternalPKIBase *external_pki_arg, const std::string &alias) override
226 {
227 external_pki = external_pki_arg;
228 external_pki_alias = alias;
229 }
230
231 // server side
232 void set_session_ticket_handler(TLSSessionTicketBase *session_ticket_handler_arg) override
233 {
234 session_ticket_handler = session_ticket_handler_arg;
235 }
236
237 // client side
238 void set_client_session_tickets(const bool v) override
239 {
241 }
242
243 void enable_legacy_algorithms(const bool v) override
244 {
245 if (v)
247 else
248 lib_ctx_provider_config &= ~LIB_CTX_LEGACY_PROVIDER;
249 }
250
251 // server side
252 void set_sni_handler(SNI::HandlerBase *sni_handler_arg) override
253 {
254 sni_handler = sni_handler_arg;
255 }
256
257 // client side
258 void set_sni_name(const std::string &sni_name_arg) override
259 {
260 sni_name = sni_name_arg;
261 }
262
270 void set_cn_reject_handler(CommonNameReject *cn_reject_handler_arg) override
271 {
272 cn_reject_handler = cn_reject_handler_arg;
273 }
274
275 void set_private_key_password(const std::string &pwd) override
276 {
278 }
279
280 void load_ca(const std::string &ca_txt, bool strict) override
281 {
282 ca.parse_pem(ca_txt, "ca");
283 }
284
285 void load_crl(const std::string &crl_txt) override
286 {
287 ca.parse_pem(crl_txt, "crl");
288 }
289
290 void load_cert(const std::string &cert_txt) override
291 {
292 cert.parse_pem(cert_txt, "cert");
293 }
294
295 void load_cert(const std::string &cert_txt, const std::string &extra_certs_txt) override
296 {
298 if (!extra_certs_txt.empty())
299 CertCRLList::from_string(extra_certs_txt, "extra-certs", &extra_certs, nullptr);
300 }
301
302 void load_private_key(const std::string &key_txt) override
303 {
304 pkey.parse_pem(key_txt, "private key", ctx());
305 }
306
307 void load_dh(const std::string &dh_txt) override
308 {
309 dh.parse_pem(dh_txt);
310 }
311
312 std::string extract_ca() const override
313 {
314 return ca.certs.render_pem();
315 }
316
317 std::string extract_crl() const override
318 {
319 return ca.crls.render_pem();
320 }
321
322 std::string extract_cert() const override
323 {
324 return cert.render_pem();
325 }
326
327 std::vector<std::string> extract_extra_certs() const override
328 {
329 std::vector<std::string> ret;
330
331 for (auto const &cert : extra_certs)
332 ret.push_back(cert.render_pem());
333
334 return ret;
335 }
336
337 std::string extract_private_key() const override
338 {
339 return pkey.render_pem();
340 }
341
342 std::string extract_dh() const override
343 {
344 return dh.render_pem();
345 }
346
348 {
349 if (!pkey.defined())
350 return PKType::PK_NONE;
351 return pkey.key_type();
352 }
353
354 size_t private_key_length() const override
355 {
356 return pkey.key_length();
357 }
358
359 void set_frame(const Frame::Ptr &frame_arg) override
360 {
361 frame = frame_arg;
362 }
363
364 void set_debug_level(const int debug_level) override
365 {
366 set_log_level(debug_level);
367 }
368
369 void set_flags(const unsigned int flags_arg) override
370 {
371 flags = flags_arg;
372 }
373
374 void set_ns_cert_type(const NSCert::Type ns_cert_type_arg) override
375 {
376 ns_cert_type = ns_cert_type_arg;
377 }
378
380 {
382 }
383
384 void set_tls_remote(const std::string &tls_remote_arg) override
385 {
386 tls_remote = tls_remote_arg;
387 }
388
389 void set_tls_version_min(const TLSVersion::Type tvm) override
390 {
391 tls_version_min = tvm;
392 }
393
394 void set_tls_version_max(const TLSVersion::Type tvm) override
395 {
396 tls_version_max = tvm;
397 }
398
399 void set_tls_version_min_override(const std::string &override) override
400 {
402 }
403
405 {
406 tls_cert_profile = type;
407 }
408
409 void set_tls_cert_profile_override(const std::string &override) override
410 {
412 }
413
414 virtual void set_tls_cipher_list(const std::string &override)
415 {
416 if (!override.empty())
417 tls_cipher_list = override;
418 }
419
420 virtual void set_tls_ciphersuite_list(const std::string &override)
421 {
422 if (!override.empty())
423 tls_ciphersuite_list = override;
424 }
425
426 virtual void set_tls_groups(const std::string &groups)
427 {
428 if (!groups.empty())
429 tls_groups = groups;
430 }
431
432 void set_local_cert_enabled(const bool v) override
433 {
435 }
436
437 void set_x509_track(X509Track::ConfigSet x509_track_config_arg) override
438 {
439 x509_track_config = std::move(x509_track_config_arg);
440 }
441
442 void set_rng(const StrongRandomAPI::Ptr &rng_arg) override
443 {
444 // Not implemented because OpenSSL is hardcoded to use its own RNG.
445 }
446
447 std::string validate_cert(const std::string &cert_txt) const override
448 {
450 return cert.render_pem();
451 }
452
453 std::string validate_cert_list(const std::string &certs_txt) const override
454 {
455 CertCRLList certs(certs_txt, "cert list");
456 return certs.render_pem();
457 }
458
459 std::string validate_private_key(const std::string &key_txt) const override
460 {
461 OpenSSLPKI::PKey pkey(key_txt, "private key", ctx());
462 return pkey.render_pem();
463 }
464
465 std::string validate_dh(const std::string &dh_txt) const override
466 {
467 OpenSSLPKI::DH dh(dh_txt);
468 return dh.render_pem();
469 }
470
471 std::string validate_crl(const std::string &crl_txt) const override
472 {
473 OpenSSLPKI::CRL crl(crl_txt);
474 return crl.render_pem();
475 }
476
477 void load(const OptionList &opt, const unsigned int lflags) override
478 {
479 // client/server
480 if (lflags & LF_PARSE_MODE)
481 mode = opt.exists("client") ? Mode(Mode::CLIENT) : Mode(Mode::SERVER);
482
483 // possibly disable peer cert verification
485 && opt.exists("client-cert-not-required"))
487
488 // sni
489 {
490 const std::string name = opt.get_optional("sni", 1, 256);
491 if (!name.empty())
492 set_sni_name(name);
493 }
494
495 // ca
496 {
497 std::string ca_txt = opt.cat("ca");
498 if (lflags & LF_RELAY_MODE)
499 ca_txt += opt.cat("relay-extra-ca");
500 load_ca(ca_txt, true);
501 }
502
503 // CRL
504 {
505 const std::string crl_txt = opt.cat("crl-verify");
506 if (!crl_txt.empty())
507 load_crl(crl_txt);
508 }
509
510 // local cert/key
512 {
513 // cert
514 {
515 const std::string &cert_txt = opt.get("cert", 1, Option::MULTILINE);
516 const std::string ec_txt = opt.cat("extra-certs");
517 load_cert(cert_txt, ec_txt);
518 }
519
520 // private key
521 if (!external_pki)
522 {
523 const std::string &key_txt = opt.get("key", 1, Option::MULTILINE);
524 load_private_key(key_txt);
525 }
526 }
527
528 // DH
529 if (mode.is_server() && opt.exists("dh"))
530 {
531 const std::string &dh_txt = opt.get("dh", 1, Option::MULTILINE);
532 load_dh(dh_txt);
533 }
534
535 // relay mode
536 std::string relay_prefix;
537 if (lflags & LF_RELAY_MODE)
538 relay_prefix = "relay-";
539
540 // ns-cert-type
541 ns_cert_type = NSCert::ns_cert_type(opt, relay_prefix);
542
543 // parse remote-cert-x options
544 KUParse::remote_cert_tls(opt, relay_prefix, ku, eku);
545 KUParse::remote_cert_ku(opt, relay_prefix, ku);
546 KUParse::remote_cert_eku(opt, relay_prefix, eku);
547
548 // parse tls-remote
549 tls_remote = opt.get_optional(relay_prefix + "tls-remote", 1, 256);
550
551 // parse verify-x509-name
552 verify_x509_name.init(opt, relay_prefix);
553
554 // parse peer-fingerprint
557 flags |= SSLConst::VERIFY_PEER_FINGERPRINT; // make CA optional
558
559 // Parse tls-version-min option.
561
562 // parse tls-cert-profile
564
565 // Overrides for tls cipher suites
566 if (opt.exists("tls-cipher"))
567 tls_cipher_list = opt.get_optional("tls-cipher", 1, 256);
568
569 if (opt.exists("tls-ciphersuites"))
570 tls_ciphersuite_list = opt.get_optional("tls-ciphersuites", 1, 256);
571
572 if (opt.exists("tls-groups"))
573 tls_groups = opt.get_optional("tls-groups", 1, 256);
574
575 // unsupported cert checkers
576 {
577 }
578 }
579
580#ifdef OPENVPN_JSON_INTERNAL
581 // The get_string_ref methods require internal JSON and do not work with jsoncpp
582 SSLConfigAPI::Ptr json_override(const Json::Value &root, const bool load_cert_key) const override
583 {
584 static const char title[] = "json_override";
585
587
588 // inherit from self
589 ret->mode = mode;
590 ret->dh = dh;
591 ret->frame = frame;
592 ret->flags = flags;
593 ret->local_cert_enabled = local_cert_enabled;
594
595 // ca
596 {
597 const std::string &ca_txt = json::get_string_ref(root, "ca", title);
598 ret->load_ca(ca_txt, true);
599 }
600
601 // CRL
602 {
603 const std::string crl_txt = json::get_string_optional(root, "crl_verify", std::string(), title);
604 if (!crl_txt.empty())
605 ret->load_crl(crl_txt);
606 }
607
608 // cert/key
609 if (load_cert_key && local_cert_enabled)
610 {
611 bool loaded_cert = false;
612
613 // cert/extra_certs
614 {
615 const std::string cert_txt = json::get_string_optional(root, "cert", std::string(), title);
616 if (!cert_txt.empty())
617 {
618 const std::string ec_txt = json::get_string_optional(root, "extra_certs", std::string(), title);
619 ret->load_cert(cert_txt, ec_txt);
620 loaded_cert = true;
621 }
622 else
623 {
624 ret->cert = cert;
625 ret->extra_certs = extra_certs;
626 }
627 }
628
629 // private key
630 if (loaded_cert && !external_pki)
631 {
632 const std::string &key_txt = json::get_string_ref(root, "key", title);
633 if (!key_txt.empty())
634 ret->load_private_key(key_txt);
635 else
636 ret->pkey = pkey;
637 }
638 }
639 else
640 {
641 // inherit from self
642 ret->cert = cert;
643 ret->extra_certs = extra_certs;
644 ret->pkey = pkey;
645 }
646
647 // ns_cert_type
648 {
649 const std::string ct = json::get_string_optional(root, "ns_cert_type", std::string(), title);
650 if (!ct.empty())
651 ret->ns_cert_type = NSCert::ns_cert_type(ct);
652 }
653
654 // ku, eku
655 {
656 const std::string ct = json::get_string_optional(root, "remote_cert_tls", std::string(), title);
657 if (!ct.empty())
658 KUParse::remote_cert_tls(ct, ret->ku, ret->eku);
659 }
660
661 // tls_version_min
662 {
663 const std::string tvm = json::get_string_optional(root, "tls_version_min", std::string(), title);
664 if (!tvm.empty())
665 ret->tls_version_min = TLSVersion::parse_tls_version_min(tvm, false, maxver());
666 }
667
668 // tls_cert_profile
669 {
670 const std::string prof = json::get_string_optional(root, "tls_cert_profile", std::string(), title);
671 if (!prof.empty())
672 ret->tls_cert_profile = TLSCertProfile::parse_tls_cert_profile(prof);
673 }
674
675 return ret;
676 }
677#endif
678
679 private:
681 {
682#if OPENSSL_VERSION_NUMBER >= 0x30000000L
684 return lib_ctx->ctx();
685#else
686 return nullptr;
687#endif
688 }
689
692 {
693#if OPENSSL_VERSION_NUMBER >= 0x30000000L
694 std::lock_guard guard{lib_ctx_mutex};
695
696 if (lib_ctx)
697 return;
698
699 auto it = lib_ctx_map.find(lib_ctx_provider_config);
700
701 if (it != lib_ctx_map.end())
702 {
703 auto cached_ctx = it->second.lock();
704
705 if (cached_ctx)
706 {
707 lib_ctx = std::move(cached_ctx);
708 return;
709 }
710 }
711
712 // There's either no cached library context, or the cached context expired.
713 lib_ctx = std::make_shared<LibContext>(lib_ctx_provider_config);
714 lib_ctx_map[lib_ctx_provider_config] = lib_ctx;
715#endif
716 }
717
719 {
720 // Return maximum TLS version supported by OpenSSL.
721 // Assume that presence of SSL_OP_NO_TLSvX macro indicates
722 // that local OpenSSL library implements TLSvX.
723#if defined(SSL_OP_NO_TLSv1_3)
725#elif defined(SSL_OP_NO_TLSv1_2)
727#elif defined(SSL_OP_NO_TLSv1_1)
729#else
731#endif
732 }
733
734#if OPENSSL_VERSION_NUMBER >= 0x30000000L
735 /* The C++ standard says:
736 *
737 * 26.2.6 Associative containers [associative.reqmts]
738 *
739 * The insert and emplace members shall not affect the validity of iterators
740 * and references to the container, and the erase members shall invalidate
741 * only iterators and references to the erased elements.
742 *
743 * So we should be safe to return pointers / references to existing
744 * values.
745 */
746 static inline std::map<unsigned short, std::weak_ptr<LibContext>> lib_ctx_map;
747 mutable std::shared_ptr<LibContext> lib_ctx;
748 static inline std::mutex lib_ctx_mutex;
749#endif
751
753 CertCRLList ca; // from OpenVPN "ca" and "crl-verify" option
754 OpenSSLPKI::X509 cert; // from OpenVPN "cert" option
755 OpenSSLPKI::X509List extra_certs; // from OpenVPN "extra-certs" option
756 OpenSSLPKI::PKey pkey; // private key
757 OpenSSLPKI::DH dh; // diffie-hellman parameters (only needed in server mode)
760 TLSSessionTicketBase *session_ticket_handler = nullptr; // server side only
761 SNI::HandlerBase *sni_handler = nullptr; // server side only
764 unsigned int flags = 0; // defined in sslconsts.hpp
765 std::string sni_name; // client side only
767 std::vector<unsigned int> ku; // if defined, peer cert X509 key usage must match one of these values
768 std::string eku; // if defined, peer cert X509 extended key usage must match this OID/string
769 std::string tls_remote;
770 VerifyX509Name verify_x509_name; // --verify-x509-name feature
771 PeerFingerprints peer_fingerprints; // --peer-fingerprint
772 TLSVersion::Type tls_version_min{TLSVersion::Type::V1_2}; // minimum TLS version that we will negotiate
773 TLSVersion::Type tls_version_max{TLSVersion::Type::UNDEF}; // maximum TLS version that we will negotiate, use for testing only (NOT exposed via tls-version-max)
775 std::string tls_cipher_list;
777 std::string tls_groups;
781 };
782
783 // Represents an actual SSL session.
784 // Normally instantiated by OpenSSLContext::ssl().
785 class SSL : public SSLAPI
786 {
787 friend class OpenSSLContext;
788
789 public:
791
792 void start_handshake() override
793 {
794 SSL_do_handshake(ssl);
795 }
796
797 ssize_t write_cleartext_unbuffered(const void *data, const size_t size) override
798 {
799 const int status = BIO_write(ssl_bio, data, numeric_cast<int>(size));
800 if (status < 0)
801 {
802 if (status == -1 && BIO_should_retry(ssl_bio))
804 else
805 {
807 OPENVPN_THROW(OpenSSLException, "OpenSSLContext::SSL::write_cleartext: BIO_write failed, size=" << size << " status=" << status);
808 }
809 }
810 else
811 return status;
812 }
813
814 ssize_t read_cleartext(void *data, const size_t capacity) override
815 {
816 if (!overflow)
817 {
818 const int status = BIO_read(ssl_bio, data, numeric_cast<int>(capacity));
819 if (status <= 0)
820 {
821 if ((status == 0 || status == -1) && BIO_should_retry(ssl_bio))
823 else
824 {
826 OPENVPN_THROW(OpenSSLException, "OpenSSLContext::SSL::read_cleartext: BIO_read failed, cap=" << capacity << " status=" << status);
827 }
828 }
829 else
830 return status;
831 }
832 else
833 throw ssl_ciphertext_in_overflow();
834 }
835
836 bool read_cleartext_ready() const override
837 {
838 return !bmq_stream::memq_from_bio(ct_in)->empty() || SSL_pending(ssl) > 0;
839 }
840
841 void write_ciphertext(const BufferPtr &buf) override
842 {
844 if (in->size() < MAX_CIPHERTEXT_IN)
845 in->write_buf(buf);
846 else
847 overflow = true;
848 }
849
850 void write_ciphertext_unbuffered(const unsigned char *data, const size_t size) override
851 {
853 if (in->size() < MAX_CIPHERTEXT_IN)
854 in->write(data, size);
855 else
856 overflow = true;
857 }
858
859 bool read_ciphertext_ready() const override
860 {
862 }
863
865 {
867 }
868
869 std::string ssl_handshake_details() const override
870 {
872 }
873
874 bool export_keying_material(const std::string &label, unsigned char *dest, size_t size) override
875 {
876 return SSL_get_session(ssl) && SSL_export_keying_material(ssl, dest, size, label.c_str(), label.size(), nullptr, 0, 0) == 1;
877 }
878
884 bool did_full_handshake() override
885 {
887 return false;
889 return !SSL_session_reused(ssl);
890 }
891
892 const AuthCert::Ptr &auth_cert() const override
893 {
894 // Reused sessions don't call the cert verify callbacks,
895 // so we must use an alternative method to build authcert.
896 if (authcert && !authcert->defined())
898 return authcert;
899 }
900
901 void mark_no_cache() override
902 {
903 sess_cache_key.reset();
904 }
905
907 {
908 ssl_erase();
909 }
910
911 static void init_static()
912 {
914#if OPENSSL_VERSION_NUMBER < 0x30000010L && !defined(OPENSSL_NO_EC) && defined(ENABLE_EXTERNAL_PKI)
916#endif
917
918
919 ssl_data_index = SSL_get_ex_new_index(0, (char *)"OpenSSLContext::SSL", nullptr, nullptr, nullptr);
920 context_data_index = SSL_get_ex_new_index(0, (char *)"OpenSSLContext", nullptr, nullptr, nullptr);
921 }
922
923 private:
924 SSL(const OpenSSLContext &ctx, const std::string *hostname, const std::string *cache_key)
925 {
926 ssl_clear();
927 try
928 {
929 // init SSL objects
930 ssl = SSL_new(ctx.ctx.get());
931 if (!ssl)
932 throw OpenSSLException("OpenSSLContext::SSL: SSL_new failed");
933
934 // release unneeded buffers
935 SSL_set_mode(ssl, SSL_MODE_RELEASE_BUFFERS);
936
937 // verify hostname
938 if (hostname && !(ctx.config->flags & SSLConst::NO_VERIFY_HOSTNAME))
939 {
940 X509_VERIFY_PARAM *param = SSL_get0_param(ssl);
941 X509_VERIFY_PARAM_set_hostflags(param, 0);
942 X509_VERIFY_PARAM_set1_host(param, hostname->c_str(), 0);
943 }
944
945 // init BIOs
946 ssl_bio = BIO_new(BIO_f_ssl());
947 if (!ssl_bio)
948 throw OpenSSLException("OpenSSLContext::SSL: BIO_new BIO_f_ssl failed");
949 ct_in = mem_bio(ctx.config->frame);
950 ct_out = mem_bio(ctx.config->frame);
951
952 // set client/server mode
953 if (ctx.config->mode.is_server())
954 {
955 SSL_set_accept_state(ssl);
956 authcert.reset(new AuthCert());
957 if (!ctx.config->x509_track_config.empty())
959 }
960 else if (ctx.config->mode.is_client())
961 {
962 if (cache_key && ctx.sess_cache)
963 {
964 // see if a cached session already exists for our cache_key
965 ctx.sess_cache->extract(*cache_key, [this](SSL_SESSION *sess)
966 {
967 if (!SSL_set_session(ssl, sess))
968 throw OpenSSLException("SSL_set_session failed"); });
969
970 // cache the session before its end-of-life if no errors occur
971 sess_cache_key.reset(new OpenSSLSessionCache::Key(*cache_key, ctx.sess_cache));
972 }
973 SSL_set_connect_state(ssl);
974
975 // client-side SNI
976 if (!ctx.config->sni_name.empty())
977 {
978 if (SSL_set_tlsext_host_name(ssl, ctx.config->sni_name.c_str()) != 1)
979 throw OpenSSLException("OpenSSLContext::SSL: SSL_set_tlsext_host_name failed (sni_name)");
980 }
981 else if ((ctx.config->flags & SSLConst::ENABLE_CLIENT_SNI) && hostname)
982 {
983 if (SSL_set_tlsext_host_name(ssl, hostname->c_str()) != 1)
984 throw OpenSSLException("OpenSSLContext::SSL: SSL_set_tlsext_host_name failed (hostname)");
985 }
986 }
987 else
988 OPENVPN_THROW(ssl_context_error, "OpenSSLContext::SSL: unknown client/server mode");
989
990 // effect SSL/BIO linkage
991 ssl_bio_linkage = true; // after this point, no need to explicitly BIO_free ct_in/ct_out
992 SSL_set_bio(ssl, ct_in, ct_out);
993 BIO_set_ssl(ssl_bio, ssl, BIO_NOCLOSE);
994
995 if (ssl_data_index < 0)
996 throw ssl_context_error("OpenSSLContext::SSL: ssl_data_index is uninitialized");
997 SSL_set_ex_data(ssl, ssl_data_index, this);
998 set_parent(&ctx);
999 }
1000 catch (...)
1001 {
1002 ssl_erase();
1003 throw;
1004 }
1005 }
1006
1008 {
1009 if (context_data_index < 0)
1010 throw ssl_context_error("OpenSSLContext::SSL: context_data_index is uninitialized");
1011 SSL_set_ex_data(ssl, context_data_index, (void *)ctx);
1012 }
1013
1014 void rebuild_authcert() const
1015 {
1016 ::X509 *cert = SSL_get_peer_certificate(ssl);
1017 if (cert)
1018 {
1019 // save the issuer cert fingerprint
1020 static_assert(sizeof(AuthCert::issuer_fp) == SHA_DIGEST_LENGTH, "size inconsistency");
1021
1022 unsigned int md_len = sizeof(AuthCert::issuer_fp);
1023 X509_digest(cert, EVP_sha1(), authcert->issuer_fp, &md_len);
1024
1025 // save the Common Name
1026 authcert->cn = OpenSSLPKI::x509_get_field(cert, NID_commonName);
1027
1028 // save the leaf cert serial number
1030
1031 authcert->defined_ = true;
1032
1033 X509_free(cert);
1034 }
1035 }
1036
1037 // Indicate no data available for our custom SSLv23 method
1038 static int ssl_pending_override(const ::SSL *)
1039 {
1040 return 0;
1041 }
1042
1043 static void print_ec_key_details(EVP_PKEY *pkey, std::ostream &os)
1044 {
1045 std::array<char, 1024> gname{};
1046 size_t gname_sz = gname.size();
1047
1048 const char *group = gname.data();
1049 if (!EVP_PKEY_get_group_name(pkey, gname.data(), gname_sz, &gname_sz))
1050 {
1051 group = "Error getting group name";
1052 }
1053 os << ", " << EVP_PKEY_get_bits(pkey) << " bit EC, group:" << group;
1054 }
1055
1056 // Print a one line summary of SSL/TLS session handshake.
1057 static std::string ssl_handshake_details(const ::SSL *c_ssl)
1058 {
1059 std::ostringstream os;
1060
1061 ::X509 *cert = SSL_get_peer_certificate(c_ssl);
1062
1063 if (cert)
1064 os << "peer certificate: CN=" << OpenSSLPKI::x509_get_field(cert, NID_commonName);
1065
1066 if (cert != nullptr)
1067 {
1068 EVP_PKEY *pkey = X509_get_pubkey(cert);
1069 if (pkey != nullptr)
1070 {
1071#ifndef OPENSSL_NO_EC
1072 if ((EVP_PKEY_id(pkey) == EVP_PKEY_EC))
1073 print_ec_key_details(pkey, os);
1074 else
1075#endif
1076 {
1077#if OPENSSL_VERSION_NUMBER < 0x30000000L
1078 int pkeyId = EVP_PKEY_id(pkey);
1079 const char *pkeySN = OBJ_nid2sn(pkeyId);
1080 if (!pkeySN)
1081 pkeySN = "(error getting public key type)";
1082
1083 // Nicer names instead of rsaEncryption and dsaEncryption
1084 if (pkeyId == EVP_PKEY_RSA)
1085 pkeySN = "RSA";
1086 else if (pkeyId == EVP_PKEY_DSA)
1087 pkeySN = "DSA";
1088#else /* OpenSSL >= 3 */
1089 const char *pkeySN = EVP_PKEY_get0_type_name(pkey);
1090 if (!pkeySN)
1091 {
1092 pkeySN = "(error getting public key type)";
1093 }
1094#endif /* if OPENSSL_VERSION_NUMBER < 0x30000000L */
1095
1096 os << ", " << EVP_PKEY_bits(pkey) << " bit " << pkeySN;
1097 }
1098 EVP_PKEY_free(pkey);
1099 }
1100 X509_free(cert);
1101 }
1102
1103 const SSL_CIPHER *ciph = SSL_get_current_cipher(c_ssl);
1104 if (ciph)
1105 {
1106 char *desc = SSL_CIPHER_description(ciph, nullptr, 0);
1107 if (!desc)
1108 {
1109 os << ", cipher: Error getting TLS cipher description from SSL_CIPHER_description";
1110 }
1111 else
1112 {
1113 os << ", cipher: " << desc;
1114 OPENSSL_free(desc);
1115 }
1116 }
1117 // This has been changed in upstream SSL to have a const
1118 // parameter, so we cast away const for older versions compatibility
1119 // (Upstream commit: c04b66b18d1a90f0c6326858e4b8367be5444582)
1120 if (SSL_session_reused(const_cast<::SSL *>(c_ssl)))
1121 os << " [REUSED]";
1122 return os.str();
1123 }
1124
1126 {
1127 ssl_bio_linkage = false;
1128 ssl = nullptr;
1129 ssl_bio = nullptr;
1130 ct_in = nullptr;
1131 ct_out = nullptr;
1132 overflow = false;
1134 sess_cache_key.reset();
1135 }
1136
1138 {
1139 if (!ssl_bio_linkage)
1140 {
1141 if (ct_in)
1142 BIO_free(ct_in);
1143 if (ct_out)
1144 BIO_free(ct_out);
1145 }
1146
1147 BIO_free_all(ssl_bio);
1148 if (sess_cache_key)
1149 {
1150 SSL_set_shutdown(ssl, SSL_SENT_SHUTDOWN | SSL_RECEIVED_SHUTDOWN);
1151 sess_cache_key->commit(SSL_get1_session(ssl));
1152 }
1153 SSL_free(ssl);
1155 ssl_clear();
1156 }
1157
1158 static BIO *mem_bio(const Frame::Ptr &frame)
1159 {
1160 BIO *bio = BIO_new(bmq_stream::BIO_s_memq());
1161 if (!bio)
1162 throw OpenSSLException("OpenSSLContext::SSL: BIO_new failed on bmq_stream");
1164 return bio;
1165 }
1166
1167 ::SSL *ssl; // OpenSSL SSL object
1168 BIO *ssl_bio; // read/write cleartext from here
1169 BIO *ct_in; // write ciphertext to here
1170 BIO *ct_out; // read ciphertext from here
1177
1178 // Helps us to store pointer to self in ::SSL object
1179 inline static int ssl_data_index = -1;
1180 inline static int context_data_index = -1;
1181 };
1182
1184 static std::string translate_cipher_list(std::string cipherlist)
1185 {
1186 // OpenVPN 2.x accepts IANA ciphers instead in the cipher list, we need
1187 // to do the same
1188
1189 std::stringstream cipher_list_ss(cipherlist);
1190 std::string ciphersuite;
1191
1192 std::stringstream result;
1193
1194
1195 while (std::getline(cipher_list_ss, ciphersuite, ':'))
1196 {
1197 const tls_cipher_name_pair *pair = tls_get_cipher_name_pair(ciphersuite);
1198
1199 if (!result.str().empty())
1200 result << ":";
1201
1202 if (pair)
1203 {
1204 if (pair->iana_name != ciphersuite)
1205 {
1206 OVPN_LOG_INFO("OpenSSLContext: Deprecated cipher suite name '"
1207 << pair->openssl_name << "' please use IANA name ' "
1208 << pair->iana_name << "'");
1209 }
1210 result << pair->openssl_name;
1211 }
1212 else
1213 {
1214 result << ciphersuite;
1215 }
1216 }
1217
1218 return result.str();
1219 }
1220
1221 private:
1223 {
1224 const std::string sess_id_context = config->session_ticket_handler->session_id_context();
1225 if (!SSL_CTX_set_session_id_context(ctx.get(), (unsigned char *)sess_id_context.c_str(), numeric_cast<unsigned int>(sess_id_context.length())))
1226 throw OpenSSLException("OpenSSLContext: SSL_CTX_set_session_id_context failed");
1227
1228#if OPENSSL_VERSION_NUMBER < 0x30000000L
1229 if (!SSL_CTX_set_tlsext_ticket_key_cb(ctx.get(), tls_ticket_key_callback))
1230 throw OpenSSLException("OpenSSLContext: SSL_CTX_set_tlsext_ticket_key_cb failed");
1231#else
1232
1233 if (!SSL_CTX_set_tlsext_ticket_key_evp_cb(ctx.get(), tls_ticket_key_callback))
1234 throw OpenSSLException("OpenSSLContext: SSL_CTX_set_tlsext_ticket_evp_cb failed");
1235#endif
1236 }
1237
1239 : config(config_arg)
1240 {
1241 // Create new SSL_CTX for server or client mode
1242 if (config->mode.is_server())
1243 {
1244 ctx = SSL_CTX_unique_ptr{SSL_CTX_new_ex(libctx(), nullptr, ::TLS_server_method()), ::SSL_CTX_free};
1245 if (!ctx)
1246 throw OpenSSLException("OpenSSLContext: SSL_CTX_new_ex failed for server method");
1247
1248 // Set DH object
1249 if (config->dh.defined())
1250 {
1251#if OPENSSL_VERSION_NUMBER >= 0x30000000L
1252 if (!SSL_CTX_set0_tmp_dh_pkey(ctx.get(), config->dh.obj_release()))
1253 throw OpenSSLException("OpenSSLContext: SSL_CTX_set0_tmp_dh_pkey failed");
1254#else
1255 if (!SSL_CTX_set_tmp_dh(ctx.get(), config->dh.obj()))
1256 throw OpenSSLException("OpenSSLContext: SSL_CTX_set_tmp_dh failed");
1257#endif
1258 }
1260 SSL_CTX_set_purpose(ctx.get(), X509_PURPOSE_SSL_SERVER);
1261
1262 // server-side SNI
1263 if (config->sni_handler)
1264 {
1265 SSL_CTX_set_client_hello_cb(ctx.get(), client_hello_callback, nullptr);
1266 }
1267 }
1268 else if (config->mode.is_client())
1269 {
1270 ctx = SSL_CTX_unique_ptr{SSL_CTX_new_ex(libctx(), nullptr, ::TLS_client_method()), &::SSL_CTX_free};
1271 if (!ctx)
1272 throw OpenSSLException("OpenSSLContext: SSL_CTX_new_ex failed for client method");
1273 }
1274 else
1275 OPENVPN_THROW(ssl_context_error, "OpenSSLContext: unknown config->mode");
1276
1277 // Set SSL options
1279 {
1280 int vf = SSL_VERIFY_PEER;
1282 vf |= SSL_VERIFY_FAIL_IF_NO_PEER_CERT;
1283 SSL_CTX_set_verify(ctx.get(),
1284 vf,
1288 SSL_CTX_set_verify_depth(ctx.get(), 16);
1289 }
1290
1291 /* Disable SSLv2 and SSLv3, might be a noop but does not hurt */
1292 long sslopt = SSL_OP_SINGLE_DH_USE | SSL_OP_SINGLE_ECDH_USE | SSL_OP_NO_COMPRESSION | SSL_OP_NO_SSLv2 | SSL_OP_NO_SSLv3;
1293
1294#ifdef SSL_OP_NO_RENEGOTIATION
1295 sslopt |= SSL_OP_NO_RENEGOTIATION;
1296#endif
1297
1298 if (config->mode.is_server())
1299 {
1300 SSL_CTX_set_session_cache_mode(ctx.get(), SSL_SESS_CACHE_OFF);
1302 {
1304 }
1305 else
1306 sslopt |= SSL_OP_NO_TICKET;
1307
1308 // send a client CA list to the client
1310 {
1311 for (const auto &e : config->ca.certs)
1312 {
1313 if (SSL_CTX_add_client_CA(ctx.get(), e.obj()) != 1)
1314 throw OpenSSLException("OpenSSLContext: SSL_CTX_add_client_CA failed");
1315 }
1316 }
1317 }
1318 else
1319 {
1321 {
1322 SSL_CTX_set_session_cache_mode(ctx.get(), SSL_SESS_CACHE_CLIENT);
1324 }
1325 else
1326 {
1327 SSL_CTX_set_session_cache_mode(ctx.get(), SSL_SESS_CACHE_OFF);
1328 sslopt |= SSL_OP_NO_TICKET;
1329 }
1330 }
1331#if OPENSSL_VERSION_NUMBER >= 0x10100000L
1333 {
1334 SSL_CTX_set_min_proto_version(ctx.get(), TLSVersion::toTLSVersion(config->tls_version_min));
1335 }
1336#else
1338 sslopt |= SSL_OP_NO_TLSv1;
1339#ifdef SSL_OP_NO_TLSv1_1
1341 sslopt |= SSL_OP_NO_TLSv1_1;
1342#endif
1343#ifdef SSL_OP_NO_TLSv1_2
1345 sslopt |= SSL_OP_NO_TLSv1_2;
1346#endif
1347#ifdef SSL_OP_NO_TLSv1_3
1349 sslopt |= SSL_OP_NO_TLSv1_3;
1350#endif
1351#endif
1352#if OPENSSL_VERSION_NUMBER >= 0x10100000L
1354 {
1355 SSL_CTX_set_max_proto_version(ctx.get(), TLSVersion::toTLSVersion(config->tls_version_max));
1356 }
1357#else
1359 sslopt |= SSL_OP_NO_TLSv1;
1360#ifdef SSL_OP_NO_TLSv1_1
1362 sslopt |= SSL_OP_NO_TLSv1_1;
1363#endif
1364#ifdef SSL_OP_NO_TLSv1_2
1366 sslopt |= SSL_OP_NO_TLSv1_2;
1367#endif
1368#ifdef SSL_OP_NO_TLSv1_3
1370 sslopt |= SSL_OP_NO_TLSv1_3;
1371#endif
1372#endif
1373 SSL_CTX_set_options(ctx.get(), sslopt);
1374
1375 if (!config->tls_groups.empty())
1376 {
1378 }
1379#if defined(TLS1_3_VERSION)
1380 if (!config->tls_ciphersuite_list.empty())
1381 {
1382 if (!SSL_CTX_set_ciphersuites(ctx.get(), config->tls_ciphersuite_list.c_str()))
1383 OPENVPN_THROW(ssl_context_error, "OpenSSLContext: SSL_CTX_set_ciphersuites_list failed");
1384 }
1385#endif
1386 std::string tls_cipher_list =
1387 /* default list as a basis */
1388 "DEFAULT"
1389 /* Disable export ciphers, low and medium */
1390 ":!EXP:!LOW:!MEDIUM"
1391 /* Disable static (EC)DH keys (no forward secrecy) */
1392 ":!kDH:!kECDH"
1393 /* Disable DSA private keys */
1394 ":!DSS"
1395 /* Disable RC4 cipher */
1396 ":!RC4"
1397 /* Disable MD5 */
1398 ":!MD5"
1399 /* Disable unsupported TLS modes */
1400 ":!PSK:!SRP:!kRSA"
1401 /* Disable SSLv2 cipher suites*/
1402 ":!SSLv2";
1403
1404 /* If we are using preferred, we also do not want to allow SHA1
1405 * cipher suites. This is also included in security level 4 of
1406 * OpenSSL*/
1408 tls_cipher_list += ":!SHA1";
1409
1410
1411 std::string translated_cipherlist;
1412
1413 if (!config->tls_cipher_list.empty())
1414 {
1415 tls_cipher_list = translate_cipher_list(config->tls_cipher_list);
1416 }
1417
1418 if (!SSL_CTX_set_cipher_list(ctx.get(), tls_cipher_list.c_str()))
1419 OPENVPN_THROW(ssl_context_error, "OpenSSLContext: SSL_CTX_set_cipher_list failed");
1420#if OPENSSL_VERSION_NUMBER >= 0x10002000L && OPENSSL_VERSION_NUMBER < 0x10100000L
1421 SSL_CTX_set_ecdh_auto(ctx.get(), 1); // this method becomes a no-op in OpenSSL 1.1
1422#endif
1423
1424#if OPENSSL_VERSION_NUMBER >= 0x10100000L
1426 {
1428 OPENVPN_THROW(ssl_context_error,
1429 "OpenSSLContext: undefined tls-cert-profile");
1430 break;
1431#ifdef OPENVPN_ALLOW_INSECURE_CERTPROFILE
1432 case TLSCertProfile::INSECURE:
1433 SSL_CTX_set_security_level(ctx.get(), 0);
1434 break;
1435#endif
1437 SSL_CTX_set_security_level(ctx.get(), 1);
1438 break;
1440 SSL_CTX_set_security_level(ctx.get(), 2);
1441 break;
1443 SSL_CTX_set_security_level(ctx.get(), 3);
1444 break;
1445 default:
1446 OPENVPN_THROW(ssl_context_error,
1447 "OpenSSLContext: unexpected tls-cert-profile value");
1448 break;
1449 }
1450#else
1451 // when OpenSSL does not CertProfile support we force the user to set 'legacy'
1453 {
1454 OPENVPN_THROW(ssl_context_error,
1455 "OpenSSLContext: tls-cert-profile not supported by this OpenSSL build. Use 'legacy' instead");
1456 }
1457#endif
1458
1460 {
1461 // Set certificate
1462 if (!config->cert.defined())
1463 OPENVPN_THROW(ssl_context_error, "OpenSSLContext: cert not defined");
1464 if (SSL_CTX_use_certificate(ctx.get(), config->cert.obj()) != 1)
1465 throw OpenSSLException("OpenSSLContext: SSL_CTX_use_certificate failed");
1466
1467 // Set private key
1468 if (config->external_pki)
1469 {
1470#ifdef ENABLE_EXTERNAL_PKI
1471#if OPENSSL_VERSION_NUMBER >= 0x30000010L
1473
1474#else
1475 auto certType = EVP_PKEY_id(X509_get0_pubkey(config->cert.obj()));
1476 if (certType == EVP_PKEY_RSA)
1477 {
1478 epki = std::make_shared<ExternalPKIImpl>(ExternalPKIRsaImpl(ctx.get(), config->cert.obj(), config->external_pki, config->external_pki_alias));
1479 }
1480#if OPENSSL_VERSION_NUMBER >= 0x10100000L && !defined(OPENSSL_NO_EC)
1481 else if (certType == EVP_PKEY_EC)
1482 {
1483 epki = std::make_shared<ExternalPKIImpl>(ExternalPKIECImpl(ctx.get(), config->cert.obj(), config->external_pki, config->external_pki_alias));
1484 }
1485#endif
1486 else
1487 {
1488 throw OpenSSLException("OpenSSLContext: pkey is neither RSA nor EC. Unsupported with external pki");
1489 }
1490#endif
1491#else
1492 throw OpenSSLException("OpenSSLContext: External PKI is not enabled in this build. ");
1493#endif
1494 }
1495 else
1496 {
1497 if (!config->pkey.defined())
1498 OPENVPN_THROW(ssl_context_error, "OpenSSLContext: private key not defined");
1499 if (SSL_CTX_use_PrivateKey(ctx.get(), config->pkey.obj()) != 1)
1500 throw OpenSSLException("OpenSSLContext: SSL_CTX_use_PrivateKey failed");
1501
1502 // Check cert/private key compatibility
1503 if (!SSL_CTX_check_private_key(ctx.get()))
1504 throw OpenSSLException("OpenSSLContext: private key does not match the certificate");
1505 }
1506
1507 // Set extra certificates that are part of our own certificate
1508 // chain but shouldn't be included in the verify chain.
1509 if (config->extra_certs.defined())
1510 {
1511 for (const auto &e : config->extra_certs)
1512 {
1513 if (SSL_CTX_add_extra_chain_cert(ctx.get(), e.obj_dup()) != 1)
1514 throw OpenSSLException("OpenSSLContext: SSL_CTX_add_extra_chain_cert failed");
1515 }
1516 }
1517 }
1518
1519 // Set CAs/CRLs
1520 if (config->ca.certs.defined())
1523 OPENVPN_THROW(ssl_context_error, "OpenSSLContext: CA not defined");
1524
1525 // Show handshake debugging info
1527 SSL_CTX_set_info_callback(ctx.get(), info_callback);
1528 }
1529
1530 public:
1531 // create a new SSL instance
1532 SSLAPI::Ptr ssl() override
1533 {
1534 return SSL::Ptr(new SSL(*this, nullptr, nullptr));
1535 }
1536
1537 // like ssl() above but verify hostname against cert CommonName and/or SubjectAltName
1538 SSLAPI::Ptr ssl(const std::string *hostname, const std::string *cache_key) override
1539 {
1540 return SSL::Ptr(new SSL(*this, hostname, cache_key));
1541 }
1542
1544 {
1545 SSLLib::Ctx lib_ctx = config->ctx();
1546#if OPENSSL_VERSION_NUMBER >= 0x30000000L
1547 if (!lib_ctx)
1548 throw OpenSSLException("OpenSSLContext: library context is not initialised");
1549#endif
1550 return lib_ctx;
1551 }
1552
1553
1555 {
1556 OpenSSLPKI::X509Store store(cc);
1557 SSL_CTX_set_cert_store(ctx.get(), store.release());
1558 }
1559
1560 ~OpenSSLContext() = default;
1561
1562 const Mode &mode() const override
1563 {
1564 return config->mode;
1565 }
1566
1567 constexpr static bool support_key_material_export()
1568 {
1569 return true;
1570 }
1571
1572#ifdef UNIT_TEST
1573 static void load_cert_info_into_authcert(AuthCert &authcert, const std::string &cert_txt)
1574 {
1575 const OpenSSLPKI::X509 cert(cert_txt, "OpenSSLContext::load_cert_info_into_authcert");
1576
1577 // save the issuer cert fingerprint
1578 {
1579 unsigned int md_len = sizeof(AuthCert::issuer_fp);
1580 X509_digest(cert.obj(), EVP_sha1(), authcert.issuer_fp, &md_len);
1581 }
1582
1583 // save the Common Name
1584 authcert.cn = OpenSSLPKI::x509_get_field(cert.obj(), NID_commonName);
1585
1586 // save the cert serial number
1587 load_serial_number_into_authcert(authcert, cert.obj());
1588
1589 authcert.defined_ = true;
1590 }
1591#endif
1592
1593 private:
1594 // ns-cert-type verification
1595
1597 {
1598 return config->ns_cert_type != NSCert::NONE;
1599 }
1600
1601 bool verify_ns_cert_type(::X509 *cert) const
1602 {
1604 return X509_check_purpose(cert, X509_PURPOSE_SSL_SERVER, 0);
1605 else if (config->ns_cert_type == NSCert::CLIENT)
1606 return X509_check_purpose(cert, X509_PURPOSE_SSL_CLIENT, 0);
1607 else
1608 return true;
1609 }
1610
1611
1612 void set_openssl_tls_groups(const std::string &tls_groups)
1613 {
1614 auto num_groups = std::count(tls_groups.begin(), tls_groups.end(), ':') + 1;
1615
1616 std::unique_ptr<int[]> glist(new int[num_groups]);
1617
1618 std::stringstream groups_ss(tls_groups);
1619 std::string group;
1620
1621 int glistlen = 0;
1622 while (std::getline(groups_ss, group, ':'))
1623 {
1624 /* Dance around that the fact that even though OpenSSL authors
1625 * call this group secp256r1 in their own source code, OpenSSL
1626 * externally only knows this by prime256v1 or P-256 */
1627 if (group == "secp256r1")
1628 {
1629 group = "prime256v1";
1630 }
1631
1632 int nid = OBJ_sn2nid(group.c_str());
1633 if (nid != 0)
1634 {
1635 glist[glistlen] = nid;
1636 glistlen++;
1637 }
1638 else
1639 {
1640 OVPN_LOG_INFO("OpenSSL -- warning ignoring unknown group '"
1641 << group << "' in tls-groups");
1642 }
1643 }
1644
1645 if (!SSL_CTX_set1_groups(ctx.get(), glist.get(), glistlen))
1646 OPENVPN_THROW(ssl_context_error, "OpenSSLContext: SSL_CTX_set1_groups failed");
1647 }
1648
1649 // remote-cert-ku verification
1650
1652 {
1653 return config->ku.size() > 0;
1654 }
1655
1656 bool verify_x509_cert_ku(::X509 *cert) const
1657 {
1658 bool found = false;
1659 ASN1_BIT_STRING *ku = (ASN1_BIT_STRING *)X509_get_ext_d2i(cert, NID_key_usage, nullptr, nullptr);
1660
1661 if (ku)
1662 {
1663 // Extract key usage bits
1664 unsigned int nku = 0;
1665 {
1666 for (int i = 0; i < 8; i++)
1667 {
1668 if (ASN1_BIT_STRING_get_bit(ku, i))
1669 nku |= 1 << (7 - i);
1670 }
1671 }
1672
1673 // Fixup if no LSB bits
1674 if ((nku & 0xff) == 0)
1675 nku >>= 8;
1676
1677 // Validating certificate key usage
1678 {
1679 for (std::vector<unsigned int>::const_iterator i = config->ku.begin(); i != config->ku.end(); ++i)
1680 {
1681 if (nku == *i)
1682 {
1683 found = true;
1684 break;
1685 }
1686 }
1687 }
1688
1689 ASN1_BIT_STRING_free(ku);
1690 }
1691 return found;
1692 }
1693
1694 // remote-cert-eku verification
1695
1697 {
1698 return !config->eku.empty();
1699 }
1700
1701 bool verify_x509_cert_eku(::X509 *cert) const
1702 {
1703 bool found = false;
1704 EXTENDED_KEY_USAGE *eku = (EXTENDED_KEY_USAGE *)X509_get_ext_d2i(cert, NID_ext_key_usage, nullptr, nullptr);
1705
1706 if (eku)
1707 {
1708 // Validating certificate extended key usage
1709 for (int i = 0; !found && i < sk_ASN1_OBJECT_num(eku); i++)
1710 {
1711 ASN1_OBJECT *oid = sk_ASN1_OBJECT_value(eku, i);
1712 char oid_str[256];
1713
1714 if (!found && OBJ_obj2txt(oid_str, sizeof(oid_str), oid, 0) != -1)
1715 {
1716 // Compare EKU against string
1717 if (config->eku == oid_str)
1718 found = true;
1719 }
1720
1721 if (!found && OBJ_obj2txt(oid_str, sizeof(oid_str), oid, 1) != -1)
1722 {
1723 // Compare EKU against OID
1724 if (config->eku == oid_str)
1725 found = true;
1726 }
1727 }
1728
1729 sk_ASN1_OBJECT_pop_free(eku, ASN1_OBJECT_free);
1730 }
1731 return found;
1732 }
1733
1734 static void x509_track_extract_nid(const X509Track::Type xt_type,
1735 const int nid,
1736 ::X509 *cert,
1737 const int depth,
1738 X509Track::Set &xts)
1739 {
1740 const std::string value = OpenSSLPKI::x509_get_field(cert, nid);
1741 if (!value.empty())
1742 xts.emplace_back(xt_type, depth, OpenSSLPKI::x509_get_field(cert, nid));
1743 }
1744
1745 static void x509_track_extract_from_cert(::X509 *cert,
1746 const int depth,
1747 const X509Track::ConfigSet &cs,
1748 X509Track::Set &xts)
1749 {
1750 for (auto &c : cs)
1751 {
1752 if (c.depth_match(depth))
1753 {
1754 switch (c.type)
1755 {
1756 case X509Track::SERIAL:
1757 {
1758 std::string serial = OpenSSLPKI::x509_get_serial(cert);
1759 if (!serial.empty())
1760 xts.emplace_back(X509Track::SERIAL,
1761 depth,
1762 serial);
1763 }
1764 break;
1766 xts.emplace_back(X509Track::SERIAL_HEX,
1767 depth,
1769 break;
1770 case X509Track::SHA1:
1771 {
1772 unsigned char buf[EVP_MAX_MD_SIZE];
1773 unsigned int len = EVP_MAX_MD_SIZE;
1774 X509_digest(cert, EVP_sha1(), buf, &len);
1775 xts.emplace_back(X509Track::SHA1,
1776 depth,
1777 render_hex_sep(buf, len, ':', true));
1778 }
1779 break;
1780 case X509Track::CN:
1781 x509_track_extract_nid(X509Track::CN, NID_commonName, cert, depth, xts);
1782 break;
1783 case X509Track::C:
1784 x509_track_extract_nid(X509Track::C, NID_countryName, cert, depth, xts);
1785 break;
1786 case X509Track::L:
1787 x509_track_extract_nid(X509Track::L, NID_localityName, cert, depth, xts);
1788 break;
1789 case X509Track::ST:
1790 x509_track_extract_nid(X509Track::ST, NID_stateOrProvinceName, cert, depth, xts);
1791 break;
1792 case X509Track::O:
1793 x509_track_extract_nid(X509Track::O, NID_organizationName, cert, depth, xts);
1794 break;
1795 case X509Track::OU:
1796 x509_track_extract_nid(X509Track::OU, NID_organizationalUnitName, cert, depth, xts);
1797 break;
1798 case X509Track::EMAIL:
1799 x509_track_extract_nid(X509Track::EMAIL, NID_pkcs9_emailAddress, cert, depth, xts);
1800 break;
1801 default:
1802 break;
1803 }
1804 }
1805 }
1806 }
1807
1808 static void load_serial_number_into_authcert(AuthCert &authcert, ::X509 *cert)
1809 {
1810 const ASN1_INTEGER *ai = X509_get_serialNumber(cert);
1811 if (!ai)
1812 return;
1813 if (ai->type == V_ASN1_NEG_INTEGER) // negative serial number is considered to be undefined
1814 return;
1815 if (!is_safe_conversion<int>(authcert.serial.size()))
1816 return;
1817 BIGNUM *bn = ASN1_INTEGER_to_BN(ai, NULL);
1818 if (!bn)
1819 return;
1820
1821 BN_bn2binpad(bn, authcert.serial.number(), static_cast<int>(authcert.serial.size()));
1822 BN_free(bn);
1823 }
1824
1825 static std::string cert_status_line(int preverify_ok,
1826 int depth,
1827 int err,
1828 const std::string &signature,
1829 const std::string &subject)
1830 {
1831 std::string ret;
1832 ret.reserve(128);
1833 ret = "VERIFY";
1834 if (preverify_ok)
1835 ret += " OK";
1836 else
1837 ret += " FAIL";
1838 ret += ": depth=";
1839 ret += openvpn::to_string(depth);
1840 ret += ", ";
1841 if (!subject.empty())
1842 ret += subject;
1843 else
1844 ret += "NO_SUBJECT";
1845 ret += ", signature: " + signature;
1846 if (!preverify_ok)
1847 {
1848 ret += " [";
1849 ret += X509_verify_cert_error_string(err);
1850 ret += ']';
1851 }
1852 return ret;
1853 }
1854
1855 static AuthCert::Fail::Type cert_fail_code(const int openssl_err)
1856 {
1857 // NOTE: this method should never return OK
1858 switch (openssl_err)
1859 {
1860 case X509_V_ERR_CERT_HAS_EXPIRED:
1862 default:
1864 }
1865 }
1866
1867
1868 static int check_cert_warnings(const X509 *cert)
1869 {
1870 int nid = X509_get_signature_nid(cert);
1871
1872 switch (nid)
1873 {
1874 case NID_ecdsa_with_SHA1:
1875 case NID_dsaWithSHA:
1876 case NID_dsaWithSHA1:
1877 case NID_sha1WithRSAEncryption:
1879 case NID_md5WithRSA:
1880 case NID_md5WithRSAEncryption:
1882 default:
1883 return SSLAPI::TLS_WARN_NONE;
1884 }
1885 }
1886
1887 static int verify_callback_client(int preverify_ok, X509_STORE_CTX *ctx)
1888 {
1889 // get the OpenSSL SSL object
1890 ::SSL *ssl = (::SSL *)X509_STORE_CTX_get_ex_data(ctx, SSL_get_ex_data_X509_STORE_CTX_idx());
1891
1892 // get OpenSSLContext
1893 const OpenSSLContext *self = (OpenSSLContext *)SSL_get_ex_data(ssl, SSL::context_data_index);
1894
1895 // get OpenSSLContext::SSL
1896 SSL *self_ssl = (SSL *)SSL_get_ex_data(ssl, SSL::ssl_data_index);
1897
1898 // get depth
1899 const int depth = X509_STORE_CTX_get_error_depth(ctx);
1900
1901 // get current certificate
1902 X509 *current_cert = X509_STORE_CTX_get_current_cert(ctx);
1903
1904 // log subject
1905 const std::string subject = OpenSSLPKI::x509_get_subject(current_cert);
1907 {
1908 // don't log self-signed leaf-cert errors with peer-fingerprint validation
1909 int err = X509_STORE_CTX_get_error(ctx);
1910 if (preverify_ok
1911 || err != X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT
1913 {
1914 auto sign_alg = OpenSSLPKI::x509_get_signature_algorithm(current_cert);
1915 OVPN_LOG_INFO(cert_status_line(preverify_ok, depth, err, sign_alg, subject));
1916 // Output the certificates itself for debug logging
1918 }
1919 }
1920
1921 // Add warnings if Cert parameters are wrong
1922 self_ssl->tls_warnings |= self->check_cert_warnings(current_cert);
1923
1924 // If a verification error occured in the certificate chain, we
1925 // never override the result of the verification.
1926 if (depth != 0)
1927 return preverify_ok;
1928
1929 // peer-fingerprint
1931 if (self->config->peer_fingerprints)
1932 {
1933 // might override the OpenSSL verification result to "true"
1934 // since we only care about the fingerprint and not the
1935 // certificate chain.
1936 preverify_ok = self->config->peer_fingerprints.match(fp);
1937 if (!preverify_ok)
1938 {
1939 OVPN_LOG_INFO("VERIFY FAIL -- bad peer-fingerprint in leaf certificate");
1940 }
1941 }
1942
1943 // verify ns-cert-type
1944 if (self->ns_cert_type_defined() && !self->verify_ns_cert_type(current_cert))
1945 {
1946 OVPN_LOG_INFO("VERIFY FAIL -- bad ns-cert-type in leaf certificate");
1947 preverify_ok = false;
1948 }
1949
1950 // verify X509 key usage
1951 if (self->x509_cert_ku_defined() && !self->verify_x509_cert_ku(current_cert))
1952 {
1953 OVPN_LOG_INFO("VERIFY FAIL -- bad X509 key usage in leaf certificate");
1954 preverify_ok = false;
1955 }
1956
1957 // verify X509 extended key usage
1958 if (self->x509_cert_eku_defined() && !self->verify_x509_cert_eku(current_cert))
1959 {
1960 OVPN_LOG_INFO("VERIFY FAIL -- bad X509 extended key usage in leaf certificate");
1961 preverify_ok = false;
1962 }
1963
1964 // verify-x509-name
1965 const VerifyX509Name &verify_x509 = self->config->verify_x509_name;
1966 if (verify_x509.get_mode() != VerifyX509Name::VERIFY_X509_NONE)
1967 {
1968 std::string name;
1970 name = OpenSSLPKI::x509_get_subject(current_cert, true);
1971 else
1972 name = OpenSSLPKI::x509_get_field(current_cert, NID_commonName);
1973
1974 if (!verify_x509.verify(name))
1975 {
1976 OVPN_LOG_INFO("VERIFY FAIL -- verify-x509-name failed");
1977 preverify_ok = false;
1978 }
1979 }
1980
1981 // verify tls-remote
1982 if (!self->config->tls_remote.empty())
1983 {
1984 const std::string subj = TLSRemote::sanitize_x509_name(subject);
1985 const std::string common_name = TLSRemote::sanitize_common_name(OpenSSLPKI::x509_get_field(current_cert, NID_commonName));
1986 TLSRemote::log(self->config->tls_remote, subj, common_name);
1987 if (!TLSRemote::test(self->config->tls_remote, subj, common_name))
1988 {
1989 OVPN_LOG_INFO("VERIFY FAIL -- tls-remote match failed");
1990 preverify_ok = false;
1991 }
1992 }
1993
1994 return preverify_ok;
1995 }
1996
1997 static int verify_callback_server(int preverify_ok, X509_STORE_CTX *ctx)
1998 {
1999 // get the OpenSSL SSL object
2000 ::SSL *ssl = (::SSL *)X509_STORE_CTX_get_ex_data(ctx, SSL_get_ex_data_X509_STORE_CTX_idx());
2001
2002 // get OpenSSLContext
2003 const OpenSSLContext *self = (OpenSSLContext *)SSL_get_ex_data(ssl, SSL::context_data_index);
2004
2005 // get OpenSSLContext::SSL
2006 SSL *self_ssl = (SSL *)SSL_get_ex_data(ssl, SSL::ssl_data_index);
2007
2008 // get error code
2009 const int err = X509_STORE_CTX_get_error(ctx);
2010
2011 // get depth
2012 const int depth = X509_STORE_CTX_get_error_depth(ctx);
2013
2014 // get current certificate
2015 X509 *current_cert = X509_STORE_CTX_get_current_cert(ctx);
2016
2017 // log subject
2019 {
2020 // don't log self-signed leaf-cert errors with peer-fingerprint validation
2021 int err = X509_STORE_CTX_get_error(ctx);
2022 if (preverify_ok
2023 || err != X509_V_ERR_DEPTH_ZERO_SELF_SIGNED_CERT
2025 {
2026 const auto sign_alg = OpenSSLPKI::x509_get_signature_algorithm(current_cert);
2027 const auto subject = OpenSSLPKI::x509_get_subject(current_cert);
2028 OVPN_LOG_INFO(cert_status_line(preverify_ok, depth, err, sign_alg, subject));
2029 }
2030 }
2031
2032 // record cert error in authcert
2033 if (!preverify_ok && self_ssl->authcert)
2034 self_ssl->authcert->add_fail(depth,
2035 cert_fail_code(err),
2036 X509_verify_cert_error_string(err));
2037
2038 // Note on X509_STORE_CTX_set_error: see ssl/statem/statem_lib.c in
2039 // OpenSSL source for mapping from X509_STORE_CTX_set_error() codes
2040 // to TLS alert codes.
2041 if (depth == 1) // issuer cert
2042 {
2043 // save the issuer cert fingerprint
2044 if (self_ssl->authcert)
2045 {
2046 static_assert(sizeof(AuthCert::issuer_fp) == SHA_DIGEST_LENGTH, "size inconsistency");
2047 unsigned int digest_len = sizeof(AuthCert::issuer_fp);
2048 if (!X509_digest(current_cert, EVP_sha1(), self_ssl->authcert->issuer_fp, &digest_len))
2049 preverify_ok = false;
2050 }
2051 }
2052 else if (depth == 0) // leaf cert
2053 {
2054 // peer-fingerprint
2056 if (self->config->peer_fingerprints && !self->config->peer_fingerprints.match(fp))
2057 {
2058 OVPN_LOG_INFO("VERIFY FAIL -- bad peer-fingerprint in leaf certificate");
2059 if (self_ssl->authcert)
2060 self_ssl->authcert->add_fail(depth,
2062 "bad peer-fingerprint in leaf certificate");
2063 X509_STORE_CTX_set_error(ctx, X509_V_ERR_UNABLE_TO_VERIFY_LEAF_SIGNATURE); // alert code: SSL_R_TLSV1_ALERT_UNKNOWN_CA
2064 preverify_ok = false;
2065 }
2066
2067 // verify ns-cert-type
2068 if (self->ns_cert_type_defined() && !self->verify_ns_cert_type(current_cert))
2069 {
2070 OVPN_LOG_INFO("VERIFY FAIL -- bad ns-cert-type in leaf certificate");
2071 if (self_ssl->authcert)
2072 self_ssl->authcert->add_fail(depth,
2074 "bad ns-cert-type in leaf certificate");
2075 X509_STORE_CTX_set_error(ctx, X509_V_ERR_INVALID_PURPOSE); // alert code: SSL_R_SSLV3_ALERT_UNSUPPORTED_CERTIFICATE
2076 preverify_ok = false;
2077 }
2078
2079 // verify X509 key usage
2080 if (self->x509_cert_ku_defined() && !self->verify_x509_cert_ku(current_cert))
2081 {
2082 OVPN_LOG_INFO("VERIFY FAIL -- bad X509 key usage in leaf certificate");
2083 if (self_ssl->authcert)
2084 self_ssl->authcert->add_fail(depth,
2086 "bad X509 key usage in leaf certificate");
2087 X509_STORE_CTX_set_error(ctx, X509_V_ERR_INVALID_PURPOSE); // alert code: SSL_R_SSLV3_ALERT_UNSUPPORTED_CERTIFICATE
2088 preverify_ok = false;
2089 }
2090
2091 // verify X509 extended key usage
2092 if (self->x509_cert_eku_defined() && !self->verify_x509_cert_eku(current_cert))
2093 {
2094 OVPN_LOG_INFO("VERIFY FAIL -- bad X509 extended key usage in leaf certificate");
2095 if (self_ssl->authcert)
2096 self_ssl->authcert->add_fail(depth,
2098 "bad X509 extended key usage in leaf certificate");
2099 X509_STORE_CTX_set_error(ctx, X509_V_ERR_INVALID_PURPOSE); // alert code: SSL_R_SSLV3_ALERT_UNSUPPORTED_CERTIFICATE
2100 preverify_ok = false;
2101 }
2102
2103 // get the Common name
2104 std::string cn = OpenSSLPKI::x509_get_field(current_cert, NID_commonName);
2105
2106 // early rejection of Common Name?
2107 if (self->config->cn_reject_handler)
2108 {
2109 try
2110 {
2111 if (self->config->cn_reject_handler->reject(cn))
2112 {
2113 OVPN_LOG_INFO("VERIFY FAIL -- early rejection of leaf cert Common Name");
2114 X509_STORE_CTX_set_error(ctx, X509_V_ERR_CERT_REJECTED); // alert code: SSL_R_SSLV3_ALERT_BAD_CERTIFICATE
2115 preverify_ok = false;
2116 }
2117 }
2118 catch (const std::exception &e)
2119 {
2120 OVPN_LOG_INFO("VERIFY FAIL -- early rejection of leaf cert Common Name due to handler exception: " << e.what());
2121 X509_STORE_CTX_set_error(ctx, X509_V_ERR_CERT_REJECTED); // alert code: SSL_R_SSLV3_ALERT_BAD_CERTIFICATE
2122 preverify_ok = false;
2123 }
2124 }
2125
2126 if (self_ssl->authcert)
2127 {
2128 // save the Common Name
2129 self_ssl->authcert->cn = std::move(cn); // NOTE: cn is consumed!
2130
2131 // save the leaf cert serial number
2132 load_serial_number_into_authcert(*self_ssl->authcert, current_cert);
2133
2134 self_ssl->authcert->defined_ = true;
2135 }
2136 }
2137
2138 // x509-track enabled?
2139 if (self_ssl->authcert && self_ssl->authcert->x509_track)
2140 x509_track_extract_from_cert(current_cert,
2141 depth,
2143 *self_ssl->authcert->x509_track);
2144
2145 return preverify_ok || self->deferred_cert_verify_failsafe(*self_ssl);
2146 }
2147
2148 // Print debugging information on SSL/TLS session negotiation.
2149 static void info_callback(const ::SSL *s, int where, int ret)
2150 {
2151 if (where & SSL_CB_LOOP)
2152 {
2153 OVPN_LOG_INFO("SSL state ("
2154 << ((where & SSL_ST_CONNECT)
2155 ? "connect"
2156 : (where & SSL_ST_ACCEPT
2157 ? "accept"
2158 : "undefined"))
2159 << "): " << SSL_state_string_long(s));
2160 }
2161 if (where & SSL_CB_ALERT)
2162 {
2163 OVPN_LOG_INFO("SSL alert ("
2164 << (where & SSL_CB_READ ? "read" : "write") << "): "
2165 << SSL_alert_type_string_long(ret) << ": "
2166 << SSL_alert_desc_string_long(ret));
2167 }
2168 }
2169
2170 static int tls_ticket_key_callback(::SSL *ssl,
2171 unsigned char key_name[16],
2172 unsigned char iv[EVP_MAX_IV_LENGTH],
2173 ::EVP_CIPHER_CTX *ctx,
2174 ssl_mac_ctx *hctx,
2175 int enc)
2176 {
2177 // get OpenSSLContext
2178 const OpenSSLContext *self = (OpenSSLContext *)SSL_get_ex_data(ssl, SSL::context_data_index);
2179 if (!self)
2180 return -1;
2181
2182 // get user-defined session ticket handler
2184 if (!t)
2185 return -1;
2186
2187 if (enc)
2188 {
2189 // create new ticket
2192
2193 switch (t->create_session_ticket_key(name, key))
2194 {
2196 case TLSSessionTicketBase::TICKET_EXPIRING: // doesn't really make sense for enc==1?
2197 return 0;
2199 if (!RAND_bytes(iv, EVP_MAX_IV_LENGTH))
2200 return -1;
2201 if (!tls_ticket_init_cipher_hmac(key, iv, ctx, hctx, enc))
2202 return -1;
2203 static_assert(TLSSessionTicketBase::Name::SIZE == 16, "unexpected name size");
2204 std::memcpy(key_name, name.value_, TLSSessionTicketBase::Name::SIZE);
2205 // OPENVPN_LOG("tls_ticket_key_callback: created ticket");
2206 return 1;
2207 default:
2208 // OPENVPN_LOG("tls_ticket_key_callback: create: bad ticket");
2209 return -1;
2210 }
2211 }
2212 else
2213 {
2214 // lookup existing ticket
2215 static_assert(TLSSessionTicketBase::Name::SIZE == 16, "unexpected name size");
2216 const TLSSessionTicketBase::Name name(key_name);
2218
2219 switch (t->lookup_session_ticket_key(name, key))
2220 {
2222 if (!tls_ticket_init_cipher_hmac(key, iv, ctx, hctx, enc))
2223 return -1;
2224 // OPENVPN_LOG("tls_ticket_key_callback: found ticket");
2225 return 1;
2227 if (!tls_ticket_init_cipher_hmac(key, iv, ctx, hctx, enc))
2228 return -1;
2229 // OPENVPN_LOG("tls_ticket_key_callback: expiring ticket");
2230 return 2;
2232 // OPENVPN_LOG("tls_ticket_key_callback: lookup: no ticket");
2233 return 0;
2234 default:
2235 // OPENVPN_LOG("tls_ticket_key_callback: lookup: bad ticket");
2236 return -1;
2237 }
2238 }
2239 }
2240
2242 unsigned char iv[EVP_MAX_IV_LENGTH],
2243 ::EVP_CIPHER_CTX *ctx,
2244 ssl_mac_ctx *mctx,
2245 const int enc)
2246 {
2247 static_assert(TLSSessionTicketBase::Key::CIPHER_KEY_SIZE == 32, "unexpected cipher key size");
2248 if (!EVP_CipherInit_ex(ctx, EVP_aes_256_cbc(), nullptr, key.cipher_value_, iv, enc))
2249 return false;
2250#if OPENSSL_VERSION_NUMBER >= 0x30000000L
2251 OSSL_PARAM params[]{
2252
2253 /* The OSSL_PARAM_construct_utf8_string needs a non const str */
2254 OSSL_PARAM_construct_utf8_string("digest", (char *)"sha256", 0),
2255 OSSL_PARAM_construct_end()};
2256
2257 if (!EVP_MAC_init(mctx, key.hmac_value_, TLSSessionTicketBase::Key::HMAC_KEY_SIZE, params))
2258 return false;
2259#else
2260 if (!HMAC_Init_ex(mctx, key.hmac_value_, TLSSessionTicketBase::Key::HMAC_KEY_SIZE, EVP_sha256(), nullptr))
2261 return false;
2262#endif
2263 return true;
2264 }
2265
2268 {
2269 if (!RAND_bytes(name.value_, TLSSessionTicketBase::Name::SIZE))
2270 return false;
2272 return false;
2274 return false;
2275 return true;
2276 }
2277
2278 static int client_hello_callback(::SSL *s, int *al, void *)
2279 {
2280 std::string sni_name;
2281
2282 // get OpenSSLContext
2283 OpenSSLContext *self = (OpenSSLContext *)SSL_get_ex_data(s, SSL::context_data_index);
2284
2285 // get OpenSSLContext::SSL
2286 SSL *self_ssl = (SSL *)SSL_get_ex_data(s, SSL::ssl_data_index);
2287
2288 try
2289 {
2290 // get the SNI from the client hello
2291 sni_name = client_hello_get_sni(s);
2292
2293 // process the SNI name, if provided
2294 if (!sni_name.empty())
2295 {
2296 // save the SNI name in authcert
2297 if (self_ssl->authcert)
2298 self_ssl->authcert->sni = sni_name;
2299
2300 // ignore the SNI if no handler was provided
2301 if (self->config->sni_handler)
2302 {
2303 // get an alternative SSLFactoryAPI from the sni_handler
2304 SSLFactoryAPI::Ptr fapi;
2305 try
2306 {
2308 fapi = self->config->sni_handler->sni_hello(sni_name, sm, self->config);
2309 if (self_ssl->authcert)
2310 self_ssl->authcert->sni_metadata = std::move(sm);
2311 }
2312 catch (const std::exception &e)
2313 {
2314 OPENVPN_LOG("SNI HANDLER ERROR: " << e.what());
2315 return sni_error(e.what(), SSL_AD_INTERNAL_ERROR, self, self_ssl, al);
2316 }
2317 if (!fapi)
2318 return sni_error("SNI name not found", SSL_AD_UNRECOGNIZED_NAME, self, self_ssl, al);
2319
2320 // make sure that returned SSLFactoryAPI is an OpenSSLContext
2321 self_ssl->sni_ctx = fapi.dynamic_pointer_cast<OpenSSLContext>();
2322 if (!self_ssl->sni_ctx)
2323 throw Exception("sni_handler returned wrong kind of SSLFactoryAPI");
2324
2325 // don't modify SSL CTX if the returned SSLFactoryAPI is ourself
2326 if (fapi.get() != self)
2327 {
2328 SSL_set_SSL_CTX(s, self_ssl->sni_ctx->ctx.get());
2329 self_ssl->set_parent(self_ssl->sni_ctx.get());
2330 }
2331 }
2332 }
2333 return SSL_CLIENT_HELLO_SUCCESS;
2334 }
2335 catch (const std::exception &e)
2336 {
2337 OPENVPN_LOG("SNI exception in OpenSSLContext, SNI=" << sni_name << " : " << e.what());
2338 *al = SSL_AD_INTERNAL_ERROR;
2339 return SSL_CLIENT_HELLO_ERROR;
2340 }
2341 }
2342
2343 static int sni_error(std::string err,
2344 const int ssl_ad_error,
2345 OpenSSLContext *self,
2346 SSL *self_ssl,
2347 int *al)
2348 {
2349 if (self_ssl->authcert)
2350 self_ssl->authcert->add_fail(0, AuthCert::Fail::SNI_ERROR, std::move(err));
2351 if (self->deferred_cert_verify_failsafe(*self_ssl))
2352 return SSL_CLIENT_HELLO_SUCCESS;
2353 *al = ssl_ad_error;
2354 return SSL_CLIENT_HELLO_ERROR;
2355 }
2356
2357 static size_t sni_get_len(ConstBuffer &buf)
2358 {
2359 size_t ret = buf.pop_front() << 8;
2360 ret += buf.pop_front();
2361 return ret;
2362 }
2363
2364 static std::string client_hello_get_sni(::SSL *s)
2365 {
2366 const unsigned char *p;
2367 size_t remaining;
2368 if (!SSL_client_hello_get0_ext(s, TLSEXT_TYPE_server_name, &p, &remaining))
2369 return std::string();
2370
2371 // For safety, map a ConstBuffer onto returned OpenSSL TLSEXT_TYPE_server_name data.
2372 ConstBuffer buf(p, remaining, true);
2373
2374 // Extract the length of the supplied list of names,
2375 // and check that it matches size of remaining data
2376 // in buf.
2377 {
2378 const size_t len = sni_get_len(buf);
2379 if (len != buf.size())
2380 throw Exception("bad name list size");
2381 }
2382
2383 // Next byte must be TLSEXT_NAMETYPE_host_name.
2384 if (buf.pop_front() != TLSEXT_NAMETYPE_host_name)
2385 throw Exception("expecting TLSEXT_NAMETYPE_host_name");
2386
2387 // Now try to extract the SNI name.
2388 {
2389 const size_t len = sni_get_len(buf);
2390 if (len > buf.size())
2391 throw Exception("bad name size");
2393 throw Exception("invalid UTF-8");
2394 return std::string((const char *)buf.c_data(), len);
2395 }
2396 }
2397
2398 // Return true if we should continue with authentication
2399 // even though there was an error, because the user has
2400 // enabled SSLConst::DEFERRED_CERT_VERIFY and wants the
2401 // error to be logged in authcert so that it can be handled
2402 // by a higher layer.
2404 {
2406 && ssl.authcert // failsafe: don't defer error unless
2407 && ssl.authcert->is_fail(); // authcert has recorded it
2408 }
2409
2410 /* The order of epki and config is important here. epki holds a library
2411 * context that is need for the certificate (cert) object from config
2412 * with external key as that internally refrences the library context
2413 * and must not be destructed before the objects referencing it have
2414 * been destructed */
2415 std::shared_ptr<ExternalPKIImpl> epki = nullptr;
2417
2418 SSL_CTX_unique_ptr ctx{nullptr, &SSL_CTX_free};
2420};
2421
2422inline const std::string get_ssl_library_version()
2423{
2424 return OpenSSL_version(OPENSSL_VERSION);
2425}
2426} // namespace openvpn
2427#endif
const std::uint8_t * number() const
Definition authcert.hpp:235
static constexpr size_t size()
Definition authcert.hpp:245
bool defined() const
Definition authcert.hpp:366
SNI::Metadata::UPtr sni_metadata
Definition authcert.hpp:528
std::string sni
Definition authcert.hpp:521
std::string cn
Definition authcert.hpp:522
std::uint8_t issuer_fp[20]
Definition authcert.hpp:524
std::unique_ptr< X509Track::Set > x509_track
Definition authcert.hpp:527
void add_fail(const size_t depth, const Fail::Type new_code, std::string reason)
Definition authcert.hpp:481
std::string render_pem() const
Definition cclist.hpp:54
void parse_pem(const std::string &content, const std::string &title)
Definition cclist.hpp:44
static void from_string(const std::string &content, const std::string &title, OpenSSLPKI::X509List *cert_list, OpenSSLPKI::CRLList *crl_list=nullptr)
Definition cclist.hpp:133
virtual bool reject(const std::string &cn)=0
const T * c_data() const
Returns a const pointer to the start of the buffer.
Definition buffer.hpp:1194
size_t size() const
Returns the size of the buffer in T objects.
Definition buffer.hpp:1242
T pop_front()
Removes and returns the first element from the buffer.
Definition buffer.hpp:1256
static void init_static()
Definition extpki.hpp:301
bool empty() const
Definition memq.hpp:37
size_t size() const
Definition memq.hpp:32
BufferPtr read_buf()
Definition memq.hpp:60
void write_buf(const BufferPtr &bp)
Definition memq.hpp:54
void set_frame(const Frame::Ptr &frame)
void write(const unsigned char *data, size_t size)
bool is_server() const
Definition mode.hpp:36
bool is_client() const
Definition mode.hpp:40
std::string validate_cert_list(const std::string &certs_txt) const override
Definition sslctx.hpp:453
std::vector< unsigned int > ku
Definition sslctx.hpp:767
ExternalPKIBase * external_pki
Definition sslctx.hpp:758
std::string extract_ca() const override
Definition sslctx.hpp:312
void load(const OptionList &opt, const unsigned int lflags) override
Definition sslctx.hpp:477
void enable_legacy_algorithms(const bool v) override
Definition sslctx.hpp:243
OpenSSLPKI::X509List extra_certs
Definition sslctx.hpp:755
virtual void set_tls_cipher_list(const std::string &override)
Definition sslctx.hpp:414
void initialise_lib_context() const
For OpenSSL 3.x, set up a library context if one is not already set up.
Definition sslctx.hpp:691
void set_tls_remote(const std::string &tls_remote_arg) override
Definition sslctx.hpp:384
VerifyX509Name verify_x509_name
Definition sslctx.hpp:770
void set_tls_version_min_override(const std::string &override) override
Definition sslctx.hpp:399
std::string extract_crl() const override
Definition sslctx.hpp:317
void load_private_key(const std::string &key_txt) override
Definition sslctx.hpp:302
TLSSessionTicketBase * session_ticket_handler
Definition sslctx.hpp:760
void set_tls_version_min(const TLSVersion::Type tvm) override
Definition sslctx.hpp:389
const Mode & get_mode() const override
Definition sslctx.hpp:219
virtual void set_tls_groups(const std::string &groups)
Definition sslctx.hpp:426
void set_rng(const StrongRandomAPI::Ptr &rng_arg) override
Definition sslctx.hpp:442
X509Track::ConfigSet x509_track_config
Definition sslctx.hpp:778
TLSCertProfile::Type tls_cert_profile
Definition sslctx.hpp:774
void set_remote_cert_tls(const KUParse::TLSWebType wt) override
Definition sslctx.hpp:379
void set_tls_cert_profile_override(const std::string &override) override
Definition sslctx.hpp:409
void set_x509_track(X509Track::ConfigSet x509_track_config_arg) override
Definition sslctx.hpp:437
void load_cert(const std::string &cert_txt, const std::string &extra_certs_txt) override
Definition sslctx.hpp:295
static constexpr unsigned short LIB_CTX_NO_PROVIDERS
Definition sslctx.hpp:131
void set_frame(const Frame::Ptr &frame_arg) override
Definition sslctx.hpp:359
unsigned short lib_ctx_provider_config
Definition sslctx.hpp:750
SNI::HandlerBase * sni_handler
Definition sslctx.hpp:761
size_t private_key_length() const override
Definition sslctx.hpp:354
std::string extract_private_key() const override
Definition sslctx.hpp:337
void load_ca(const std::string &ca_txt, bool strict) override
Definition sslctx.hpp:280
PKType::Type private_key_type() const override
Definition sslctx.hpp:347
void set_tls_version_max(const TLSVersion::Type tvm) override
Definition sslctx.hpp:394
TLSVersion::Type tls_version_max
Definition sslctx.hpp:773
void set_flags(const unsigned int flags_arg) override
Definition sslctx.hpp:369
void set_session_ticket_handler(TLSSessionTicketBase *session_ticket_handler_arg) override
Definition sslctx.hpp:232
TLSVersion::Type tls_version_min
Definition sslctx.hpp:772
void set_sni_handler(SNI::HandlerBase *sni_handler_arg) override
Definition sslctx.hpp:252
static TLSVersion::Type maxver()
Definition sslctx.hpp:718
std::string extract_dh() const override
Definition sslctx.hpp:342
void set_cn_reject_handler(CommonNameReject *cn_reject_handler_arg) override
Definition sslctx.hpp:270
void load_cert(const std::string &cert_txt) override
Definition sslctx.hpp:290
std::string extract_cert() const override
Definition sslctx.hpp:322
std::string validate_private_key(const std::string &key_txt) const override
Definition sslctx.hpp:459
std::string validate_cert(const std::string &cert_txt) const override
Definition sslctx.hpp:447
SSLFactoryAPI::Ptr new_factory() override
Return a pointer-like object that refers to a ssl factory.
Definition sslctx.hpp:209
void set_local_cert_enabled(const bool v) override
Definition sslctx.hpp:432
void set_client_session_tickets(const bool v) override
Definition sslctx.hpp:238
void set_sni_name(const std::string &sni_name_arg) override
Definition sslctx.hpp:258
SSLLib::Ctx ctx() const
Definition sslctx.hpp:680
std::string validate_dh(const std::string &dh_txt) const override
Definition sslctx.hpp:465
CommonNameReject * cn_reject_handler
Definition sslctx.hpp:762
void set_tls_cert_profile(const TLSCertProfile::Type type) override
Definition sslctx.hpp:404
void set_mode(const Mode &mode_arg) override
Definition sslctx.hpp:214
void load_dh(const std::string &dh_txt) override
Definition sslctx.hpp:307
PeerFingerprints peer_fingerprints
Definition sslctx.hpp:771
std::vector< std::string > extract_extra_certs() const override
Definition sslctx.hpp:327
void set_debug_level(const int debug_level) override
Definition sslctx.hpp:364
virtual void set_tls_ciphersuite_list(const std::string &override)
Definition sslctx.hpp:420
void load_crl(const std::string &crl_txt) override
Definition sslctx.hpp:285
void set_external_pki_callback(ExternalPKIBase *external_pki_arg, const std::string &alias) override
Definition sslctx.hpp:225
void set_ns_cert_type(const NSCert::Type ns_cert_type_arg) override
Definition sslctx.hpp:374
void set_private_key_password(const std::string &pwd) override
Definition sslctx.hpp:275
static constexpr unsigned short LIB_CTX_LEGACY_PROVIDER
Definition sslctx.hpp:132
std::string validate_crl(const std::string &crl_txt) const override
Definition sslctx.hpp:471
const AuthCert::Ptr & auth_cert() const override
Definition sslctx.hpp:892
ssize_t write_cleartext_unbuffered(const void *data, const size_t size) override
Definition sslctx.hpp:797
static std::string ssl_handshake_details(const ::SSL *c_ssl)
Definition sslctx.hpp:1057
bool export_keying_material(const std::string &label, unsigned char *dest, size_t size) override
Definition sslctx.hpp:874
void start_handshake() override
Definition sslctx.hpp:792
OpenSSLContext::Ptr sni_ctx
Definition sslctx.hpp:1173
BufferPtr read_ciphertext() override
Definition sslctx.hpp:864
bool read_cleartext_ready() const override
Definition sslctx.hpp:836
static int ssl_pending_override(const ::SSL *)
Definition sslctx.hpp:1038
void write_ciphertext(const BufferPtr &buf) override
Definition sslctx.hpp:841
bool did_full_handshake() override
Returns the cached/reused status of the session.
Definition sslctx.hpp:884
std::string ssl_handshake_details() const override
Definition sslctx.hpp:869
void set_parent(const OpenSSLContext *ctx)
Definition sslctx.hpp:1007
bool read_ciphertext_ready() const override
Definition sslctx.hpp:859
OpenSSLSessionCache::Key::UPtr sess_cache_key
Definition sslctx.hpp:1172
ssize_t read_cleartext(void *data, const size_t capacity) override
Definition sslctx.hpp:814
void write_ciphertext_unbuffered(const unsigned char *data, const size_t size) override
Definition sslctx.hpp:850
void mark_no_cache() override
Definition sslctx.hpp:901
static BIO * mem_bio(const Frame::Ptr &frame)
Definition sslctx.hpp:1158
SSL(const OpenSSLContext &ctx, const std::string *hostname, const std::string *cache_key)
Definition sslctx.hpp:924
static void print_ec_key_details(EVP_PKEY *pkey, std::ostream &os)
Definition sslctx.hpp:1043
static void info_callback(const ::SSL *s, int where, int ret)
Definition sslctx.hpp:2149
static bool tls_ticket_init_cipher_hmac(const TLSSessionTicketBase::Key &key, unsigned char iv[EVP_MAX_IV_LENGTH], ::EVP_CIPHER_CTX *ctx, ssl_mac_ctx *mctx, const int enc)
Definition sslctx.hpp:2241
static std::string translate_cipher_list(std::string cipherlist)
Definition sslctx.hpp:1184
static constexpr bool support_key_material_export()
Definition sslctx.hpp:1567
static void load_serial_number_into_authcert(AuthCert &authcert, ::X509 *cert)
Definition sslctx.hpp:1808
CertCRLListTemplate< OpenSSLPKI::X509List, OpenSSLPKI::CRLList > CertCRLList
Definition sslctx.hpp:109
static int verify_callback_client(int preverify_ok, X509_STORE_CTX *ctx)
Definition sslctx.hpp:1887
bool ns_cert_type_defined() const
Definition sslctx.hpp:1596
std::shared_ptr< ExternalPKIImpl > epki
Definition sslctx.hpp:2415
void setup_server_ticket_callback() const
Definition sslctx.hpp:1222
static std::string client_hello_get_sni(::SSL *s)
Definition sslctx.hpp:2364
static int check_cert_warnings(const X509 *cert)
Definition sslctx.hpp:1868
static std::string cert_status_line(int preverify_ok, int depth, int err, const std::string &signature, const std::string &subject)
Definition sslctx.hpp:1825
bool x509_cert_ku_defined() const
Definition sslctx.hpp:1651
SSLAPI::Ptr ssl() override
Definition sslctx.hpp:1532
static int client_hello_callback(::SSL *s, int *al, void *)
Definition sslctx.hpp:2278
static void x509_track_extract_nid(const X509Track::Type xt_type, const int nid, ::X509 *cert, const int depth, X509Track::Set &xts)
Definition sslctx.hpp:1734
const Mode & mode() const override
Definition sslctx.hpp:1562
void set_openssl_tls_groups(const std::string &tls_groups)
Definition sslctx.hpp:1612
static int sni_error(std::string err, const int ssl_ad_error, OpenSSLContext *self, SSL *self_ssl, int *al)
Definition sslctx.hpp:2343
OpenSSLSessionCache::Ptr sess_cache
Definition sslctx.hpp:2419
static size_t sni_get_len(ConstBuffer &buf)
Definition sslctx.hpp:2357
static int tls_ticket_key_callback(::SSL *ssl, unsigned char key_name[16], unsigned char iv[EVP_MAX_IV_LENGTH], ::EVP_CIPHER_CTX *ctx, ssl_mac_ctx *hctx, int enc)
Definition sslctx.hpp:2170
static void x509_track_extract_from_cert(::X509 *cert, const int depth, const X509Track::ConfigSet &cs, X509Track::Set &xts)
Definition sslctx.hpp:1745
static AuthCert::Fail::Type cert_fail_code(const int openssl_err)
Definition sslctx.hpp:1855
bool verify_x509_cert_eku(::X509 *cert) const
Definition sslctx.hpp:1701
void update_trust(const CertCRLList &cc)
Definition sslctx.hpp:1554
bool verify_x509_cert_ku(::X509 *cert) const
Definition sslctx.hpp:1656
SSLAPI::Ptr ssl(const std::string *hostname, const std::string *cache_key) override
Definition sslctx.hpp:1538
bool x509_cert_eku_defined() const
Definition sslctx.hpp:1696
OpenSSLContext(Config *config_arg)
Definition sslctx.hpp:1238
bool verify_ns_cert_type(::X509 *cert) const
Definition sslctx.hpp:1601
std::unique_ptr<::SSL_CTX, decltype(&::SSL_CTX_free)> SSL_CTX_unique_ptr
Definition sslctx.hpp:105
SSLLib::Ctx libctx() override
Definition sslctx.hpp:1543
static int verify_callback_server(int preverify_ok, X509_STORE_CTX *ctx)
Definition sslctx.hpp:1997
bool deferred_cert_verify_failsafe(const SSL &ssl) const
Definition sslctx.hpp:2403
RCPtr< OpenSSLContext > Ptr
Definition sslctx.hpp:108
static bool randomize_name_key(TLSSessionTicketBase::Name &name, TLSSessionTicketBase::Key &key)
Definition sslctx.hpp:2266
SSL_CTX_unique_ptr ctx
Definition sslctx.hpp:2418
std::string render_pem() const
Definition crl.hpp:155
std::string render_pem() const
Definition crl.hpp:98
void parse_pem(const std::string &dh_txt)
std::string render_pem() const
size_t key_length() const
Definition pkey.hpp:113
void set_private_key_password(const std::string &pwd)
Definition pkey.hpp:123
::EVP_PKEY * obj() const
Definition pkey.hpp:86
void parse_pem(const std::string &pkey_txt, const std::string &title, SSLLib::Ctx libctx)
Definition pkey.hpp:128
PKType::Type key_type() const
Definition pkey.hpp:91
bool defined() const
Definition pkey.hpp:82
std::string render_pem() const
Definition pkey.hpp:143
std::string render_pem() const
Definition x509.hpp:166
::X509 * obj() const
Definition x509.hpp:82
void parse_pem(const std::string &cert_txt, const std::string &title)
Definition x509.hpp:92
bool defined() const
Definition x509.hpp:77
std::string render_pem() const
Definition x509.hpp:106
std::unique_ptr< Key > UPtr
std::string get_optional(const std::string &name, size_t index, const size_t max_len) const
Definition options.hpp:1342
std::string cat(const std::string &name) const
Definition options.hpp:1286
const Option & get(const std::string &name) const
Definition options.hpp:1254
bool exists(const std::string &name) const
Definition options.hpp:1325
The smart pointer class.
Definition rc.hpp:119
void reset() noexcept
Points this RCPtr<T> to nullptr safely.
Definition rc.hpp:290
RCPtr< U > dynamic_pointer_cast() const noexcept
Returns a "RCPtr<U>" that points to our T object.
Definition rc.hpp:422
T * get() const noexcept
Returns the raw pointer to the object T, or nullptr.
Definition rc.hpp:321
virtual SSLFactoryAPI::Ptr sni_hello(const std::string &sni_name, SNI::Metadata::UPtr &sni_metadata, SSLConfigAPI::Ptr default_factory) const =0
std::unique_ptr< Metadata > UPtr
uint32_t tls_warnings
Definition sslapi.hpp:79
RCPtr< SSLFactoryAPI > Ptr
Definition sslapi.hpp:91
unsigned char hmac_value_[HMAC_KEY_SIZE]
unsigned char cipher_value_[CIPHER_KEY_SIZE]
static constexpr size_t CIPHER_KEY_SIZE
static constexpr size_t HMAC_KEY_SIZE
virtual std::string session_id_context() const =0
virtual Status create_session_ticket_key(Name &name, Key &key) const =0
virtual Status lookup_session_ticket_key(const Name &name, Key &key) const =0
void init(const OptionList &opt, const std::string &relay_prefix)
bool verify(const std::string &value) const
static std::shared_ptr< XKeyExternalPKIImpl > create(SSL_CTX *ssl_ctx, ::X509 *cert, ExternalPKIBase *external_pki, std::string alias)
Definition xkey.hpp:126
int log_level() const
return the current logging level for all logging
Definition logger.hpp:61
static SSL_CTX * SSL_CTX_new_ex(void *libctx, const char *propq, const SSL_METHOD *meth)
Definition compat.hpp:90
#define EVP_PKEY_get_bits
Definition compat.hpp:99
static void OSSL_LIB_CTX_free(void *libctx)
Definition compat.hpp:96
static int EVP_PKEY_get_group_name(EVP_PKEY *pkey, char *gname, size_t gname_sz, size_t *gname_len)
Definition compat.hpp:26
#define OPENVPN_THROW(exc, stuff)
#define OPENVPN_LOG(args)
#define OVPN_LOG_TRACE(args)
Definition logger.hpp:227
#define OVPN_LOG_INFO(args)
Definition logger.hpp:224
void remote_cert_ku(const OptionList &opt, const std::string &relay_prefix, std::vector< unsigned int > &ku)
Definition kuparse.hpp:90
void remote_cert_tls(const TLSWebType wt, std::vector< unsigned int > &ku, std::string &eku)
Definition kuparse.hpp:33
void remote_cert_eku(const OptionList &opt, const std::string &relay_prefix, std::string &eku)
Definition kuparse.hpp:118
Type ns_cert_type(const std::string &ct)
Definition nscert.hpp:31
static std::size_t x509_fingerprint_size()
static std::string x509_get_serial_hex(::X509 *cert)
static std::string x509_get_field(::X509 *cert, const int nid)
static std::string X509_get_pem_encoding(::X509 *cert)
static std::string x509_get_serial(::X509 *cert)
static std::vector< uint8_t > x509_get_fingerprint(const ::X509 *cert)
static std::string x509_get_subject(::X509 *cert, bool new_format=false)
static std::string x509_get_signature_algorithm(const ::X509 *cert)
void apply_override(Type &type, const std::string &override)
Type default_if_undef(const Type type)
Type parse_tls_cert_profile(const std::string &profile_name)
std::string sanitize_x509_name(const std::string &str)
bool test(const std::string &tls_remote, const std::string &subject, const std::string &common_name)
std::string sanitize_common_name(const std::string &str)
void log(const std::string &tls_remote, const std::string &subject, const std::string &common_name)
int toTLSVersion(const Type version)
Definition tlsver.hpp:20
void apply_override(Type &tvm, const std::string &override)
Definition tlsver.hpp:89
Type parse_tls_version_min(const std::string &ver, const bool or_highest, const Type max_version)
Definition tlsver.hpp:57
bool is_valid_utf8_uchar_buf(const unsigned char *source, size_t size, const size_t max_len_flags=0)
Definition unicode.hpp:41
BIO_METHOD * BIO_s_memq(void)
MemQ * memq_from_bio(BIO *b)
std::string get_string_optional(const Json::Value &root, const NAME &name, const std::string &default_value, const TITLE &title)
constexpr int LOG_LEVEL_INFO
Definition logger.hpp:20
void openssl_clear_error_stack()
Definition error.hpp:247
std::string to_string(const T &t)
Convert a value to a string.
Definition to_string.hpp:45
const tls_cipher_name_pair * tls_get_cipher_name_pair(const std::string &ciphername)
std::string render_hex_sep(const unsigned char *data, size_t size, const char sep, const bool caps=false)
Definition hexstr.hpp:180
const std::string get_ssl_library_version()
Definition sslctx.hpp:1679
::HMAC_CTX ssl_mac_ctx
Definition sslctx.hpp:94
bool match(const PeerFingerprint &fp) const
const std::string cert_txt
std::string ret
std::ostringstream os
static const char config[]