OpenVPN 3 Core Library
Loading...
Searching...
No Matches
sslapi.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// API for SSL implementations
13
14#ifndef OPENVPN_SSL_SSLAPI_H
15#define OPENVPN_SSL_SSLAPI_H
16
17#include <string>
18#include <cstdint>
19
22#include <openvpn/common/rc.hpp>
41
42namespace openvpn {
43
44namespace SNI {
45class HandlerBase;
46}
47
48class SSLAPI : public RC<thread_unsafe_refcount>
49{
50 public:
52 {
54 TLS_WARN_SIG_MD5 = (1 << 0),
55 TLS_WARN_SIG_SHA1 = (1 << 1)
56 };
57
59
60 virtual void start_handshake() = 0;
61 virtual ssize_t write_cleartext_unbuffered(const void *data, const size_t size) = 0;
62 virtual ssize_t read_cleartext(void *data, const size_t capacity) = 0;
63 virtual bool read_cleartext_ready() const = 0;
64 virtual void write_ciphertext(const BufferPtr &buf) = 0;
65 virtual void write_ciphertext_unbuffered(const unsigned char *data, const size_t size) = 0;
66 virtual bool read_ciphertext_ready() const = 0;
68 virtual std::string ssl_handshake_details() const = 0;
69 virtual bool export_keying_material(const std::string &label, unsigned char *dest, size_t size) = 0;
70 virtual bool did_full_handshake() = 0;
71 virtual const AuthCert::Ptr &auth_cert() const = 0;
72 virtual void mark_no_cache() = 0; // prevent caching of client-side session (only meaningful when client_session_tickets is enabled)
73 uint32_t get_tls_warnings() const
74 {
75 return tls_warnings;
76 }
77
78 protected:
79 uint32_t tls_warnings = 0; // bitfield of SSLAPI::TLSWarnings
80};
81
82class SSLFactoryAPI : public RC<thread_unsafe_refcount>,
83 public logging::LoggingMixin<logging::LOG_LEVEL_VERB, logging::LOG_LEVEL_TRACE, SSLFactoryAPI>
84{
85 public:
86 OPENVPN_EXCEPTION(ssl_options_error);
87 OPENVPN_EXCEPTION(ssl_context_error);
89 OPENVPN_SIMPLE_EXCEPTION(ssl_ciphertext_in_overflow);
90
92
93 // create a new SSLAPI instance
94 virtual SSLAPI::Ptr ssl() = 0;
95
96 // get the library context that is used with this SSLAPI instance
97 virtual SSLLib::Ctx libctx() = 0;
98
99 // like ssl() above but optionally verify hostname against cert CommonName and/or
100 // SubjectAltName, and optionally set/lookup a cache key for this session.
101 virtual SSLAPI::Ptr ssl(const std::string *hostname, const std::string *cache_key) = 0;
102
103 // client or server?
104 virtual const Mode &mode() const = 0;
105};
106
107class SSLConfigAPI : public RC<thread_unsafe_refcount>
108{
109 public:
111
113 {
114 LF_PARSE_MODE = (1 << 0),
116 LF_RELAY_MODE = (1 << 2), // look for "relay-ca" instead of "ca" directive
117 };
118
119 std::string private_key_type_string() const
120 {
122
123 switch (type)
124 {
125 case PKType::PK_NONE:
126 return "None";
127 case PKType::PK_DSA:
128 return "DSA";
129 case PKType::PK_RSA:
130 return "RSA";
131 case PKType::PK_EC:
132 return "EC";
133 case PKType::PK_ECDSA:
134 return "ECDSA";
136 default:
137 return "Unknown";
138 }
139 }
140
141 virtual void set_mode(const Mode &mode_arg) = 0;
142 virtual const Mode &get_mode() const = 0;
143 virtual void set_external_pki_callback(ExternalPKIBase *external_pki_arg, const std::string &alias) = 0; // private key alternative
144 virtual void set_session_ticket_handler(TLSSessionTicketBase *session_ticket_handler) = 0; // server side
145 virtual void set_client_session_tickets(const bool v) = 0; // client side
146 virtual void enable_legacy_algorithms(const bool v) = 0; // loads legacy+default provider in OpenSSL 3
147 virtual void set_sni_handler(SNI::HandlerBase *sni_handler) = 0; // server side
148 virtual void set_sni_name(const std::string &sni_name_arg) = 0; // client side
149 virtual void set_private_key_password(const std::string &pwd) = 0;
150 virtual void set_cn_reject_handler(CommonNameReject *cn_reject_handler_arg) = 0;
151 virtual void load_ca(const std::string &ca_txt, bool strict) = 0;
152 virtual void load_crl(const std::string &crl_txt) = 0;
153 virtual void load_cert(const std::string &cert_txt) = 0;
154 virtual void load_cert(const std::string &cert_txt, const std::string &extra_certs_txt) = 0;
155 virtual void load_private_key(const std::string &key_txt) = 0;
156 virtual void load_dh(const std::string &dh_txt) = 0;
157 virtual std::string extract_ca() const = 0;
158 virtual std::string extract_crl() const = 0;
159 virtual std::string extract_cert() const = 0;
160 virtual std::vector<std::string> extract_extra_certs() const = 0;
161 virtual std::string extract_private_key() const = 0;
162 virtual std::string extract_dh() const = 0;
163 virtual PKType::Type private_key_type() const = 0;
164 virtual size_t private_key_length() const = 0;
165 virtual void set_frame(const Frame::Ptr &frame_arg) = 0;
166 virtual void set_debug_level(const int debug_level) = 0;
167 virtual void set_flags(const unsigned int flags_arg) = 0;
168 virtual void set_ns_cert_type(const NSCert::Type ns_cert_type_arg) = 0;
169 virtual void set_remote_cert_tls(const KUParse::TLSWebType wt) = 0;
170 virtual void set_tls_remote(const std::string &tls_remote_arg) = 0;
171 virtual void set_tls_version_min(const TLSVersion::Type tvm) = 0;
172 virtual void set_tls_version_max(const TLSVersion::Type tvm) = 0;
173 virtual void set_tls_version_min_override(const std::string &override) = 0;
174 virtual void set_tls_cert_profile(const TLSCertProfile::Type type) = 0;
175 virtual void set_tls_cert_profile_override(const std::string &override) = 0;
176 virtual void set_local_cert_enabled(const bool v) = 0;
177 virtual void set_x509_track(X509Track::ConfigSet x509_track_config_arg) = 0;
178 virtual void set_rng(const StrongRandomAPI::Ptr &rng_arg) = 0;
179 virtual void load(const OptionList &opt, const unsigned int lflags) = 0;
180
181#ifdef OPENVPN_JSON_INTERNAL
182 virtual SSLConfigAPI::Ptr json_override(const Json::Value &root, const bool load_cert_key) const = 0;
183#endif
184
185 virtual std::string validate_cert(const std::string &cert_txt) const = 0;
186 virtual std::string validate_cert_list(const std::string &certs_txt) const = 0;
187 virtual std::string validate_crl(const std::string &crl_txt) const = 0;
188 virtual std::string validate_private_key(const std::string &key_txt) const = 0;
189 virtual std::string validate_dh(const std::string &dh_txt) const = 0;
190
192};
193
200inline const std::string get_ssl_library_version();
201
202} // namespace openvpn
203
204#endif
The smart pointer class.
Definition rc.hpp:119
Reference count base class for objects tracked by RCPtr. Disallows copying and assignment.
Definition rc.hpp:912
virtual void start_handshake()=0
virtual void write_ciphertext_unbuffered(const unsigned char *data, const size_t size)=0
RCPtr< SSLAPI > Ptr
Definition sslapi.hpp:58
virtual void write_ciphertext(const BufferPtr &buf)=0
uint32_t tls_warnings
Definition sslapi.hpp:79
virtual const AuthCert::Ptr & auth_cert() const =0
virtual void mark_no_cache()=0
virtual bool read_ciphertext_ready() const =0
virtual bool read_cleartext_ready() const =0
virtual std::string ssl_handshake_details() const =0
virtual bool did_full_handshake()=0
virtual bool export_keying_material(const std::string &label, unsigned char *dest, size_t size)=0
virtual BufferPtr read_ciphertext()=0
virtual ssize_t write_cleartext_unbuffered(const void *data, const size_t size)=0
virtual ssize_t read_cleartext(void *data, const size_t capacity)=0
uint32_t get_tls_warnings() const
Definition sslapi.hpp:73
virtual void load_dh(const std::string &dh_txt)=0
virtual std::string extract_dh() const =0
virtual size_t private_key_length() const =0
virtual std::string validate_cert(const std::string &cert_txt) const =0
virtual std::string validate_dh(const std::string &dh_txt) const =0
virtual void set_tls_remote(const std::string &tls_remote_arg)=0
virtual void set_mode(const Mode &mode_arg)=0
virtual void load_private_key(const std::string &key_txt)=0
virtual std::string extract_private_key() const =0
virtual void set_remote_cert_tls(const KUParse::TLSWebType wt)=0
virtual PKType::Type private_key_type() const =0
virtual const Mode & get_mode() const =0
virtual void set_sni_name(const std::string &sni_name_arg)=0
RCPtr< SSLConfigAPI > Ptr
Definition sslapi.hpp:110
virtual void set_x509_track(X509Track::ConfigSet x509_track_config_arg)=0
virtual std::string extract_crl() const =0
virtual void set_frame(const Frame::Ptr &frame_arg)=0
virtual void set_cn_reject_handler(CommonNameReject *cn_reject_handler_arg)=0
std::string private_key_type_string() const
Definition sslapi.hpp:119
virtual void set_rng(const StrongRandomAPI::Ptr &rng_arg)=0
virtual void set_tls_version_max(const TLSVersion::Type tvm)=0
virtual void load_cert(const std::string &cert_txt)=0
virtual void load_ca(const std::string &ca_txt, bool strict)=0
virtual void set_session_ticket_handler(TLSSessionTicketBase *session_ticket_handler)=0
virtual void set_tls_version_min(const TLSVersion::Type tvm)=0
virtual void load_cert(const std::string &cert_txt, const std::string &extra_certs_txt)=0
virtual void set_local_cert_enabled(const bool v)=0
virtual void enable_legacy_algorithms(const bool v)=0
virtual void set_tls_cert_profile(const TLSCertProfile::Type type)=0
virtual std::string validate_private_key(const std::string &key_txt) const =0
virtual void set_external_pki_callback(ExternalPKIBase *external_pki_arg, const std::string &alias)=0
virtual std::string extract_ca() const =0
virtual void set_private_key_password(const std::string &pwd)=0
virtual SSLFactoryAPI::Ptr new_factory()=0
virtual void load_crl(const std::string &crl_txt)=0
virtual void set_client_session_tickets(const bool v)=0
virtual void set_flags(const unsigned int flags_arg)=0
virtual void set_debug_level(const int debug_level)=0
virtual void load(const OptionList &opt, const unsigned int lflags)=0
virtual std::string validate_cert_list(const std::string &certs_txt) const =0
virtual std::vector< std::string > extract_extra_certs() const =0
virtual void set_tls_version_min_override(const std::string &override)=0
virtual void set_tls_cert_profile_override(const std::string &override)=0
virtual std::string validate_crl(const std::string &crl_txt) const =0
virtual std::string extract_cert() const =0
virtual void set_ns_cert_type(const NSCert::Type ns_cert_type_arg)=0
virtual void set_sni_handler(SNI::HandlerBase *sni_handler)=0
virtual SSLLib::Ctx libctx()=0
OPENVPN_EXCEPTION(ssl_external_pki)
virtual const Mode & mode() const =0
virtual SSLAPI::Ptr ssl(const std::string *hostname, const std::string *cache_key)=0
OPENVPN_EXCEPTION(ssl_options_error)
virtual SSLAPI::Ptr ssl()=0
OPENVPN_EXCEPTION(ssl_context_error)
RCPtr< SSLFactoryAPI > Ptr
Definition sslapi.hpp:91
OPENVPN_SIMPLE_EXCEPTION(ssl_ciphertext_in_overflow)
Support deferred server-side state creation when client connects.
Definition ovpncli.cpp:95
SSLFactoryAPI::ssl_external_pki ssl_external_pki
Definition extpki.hpp:26
const std::string get_ssl_library_version()
Definition sslctx.hpp:1679
Implementation of the base classes for random number generators.
const std::string cert_txt