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