23#ifndef OPENVPN_APPLECRYPTO_SSL_SSLCTX_H
24#define OPENVPN_APPLECRYPTO_SSL_SSLCTX_H
28#include <Security/SecImportExport.h>
29#include <Security/SecItem.h>
30#include <Security/SecureTransport.h>
31#include <Security/SecKey.h>
80 OPENVPN_THROW(ssl_context_error,
"AppleSSLContext: identity '" << subject_match <<
"' undefined");
111 const std::string &subject_match = opt.
get(
"identity", 1, 256);
126 void load_ca(
const std::string &ca_txt,
bool strict)
override
151 void load_dh(
const std::string &dh_txt)
override
204 OPENVPN_LOG(
"AppleSSL: " << funcname <<
" not implemented");
229 const OSStatus status = SSLWrite(
ssl, data, size, &actual);
232 if (status == errSSLWouldBlock)
235 throw CFException(
"AppleSSLContext::SSL::write_cleartext failed", status);
246 const OSStatus status = SSLRead(
ssl, data, capacity, &actual);
249 if (status == errSSLWouldBlock)
252 throw CFException(
"AppleSSLContext::SSL::read_cleartext failed", status);
258 throw ssl_ciphertext_in_overflow();
287 return "[AppleSSL not implemented]";
292 OPENVPN_THROW(ssl_context_error,
"AppleSSL::SSL: auth_cert() not implemented");
308#ifdef OPENVPN_PLATFORM_IPHONE
311 ssl = SSLCreateContext(kCFAllocatorDefault, kSSLServerSide, kSSLStreamType);
313 ssl = SSLCreateContext(kCFAllocatorDefault, kSSLClientSide, kSSLStreamType);
315 OPENVPN_THROW(ssl_context_error,
"AppleSSLContext::SSL: unknown client/server mode");
320 s = SSLSetProtocolVersionMin(
ssl, kTLSProtocol1);
322 throw CFException(
"SSLSetProtocolVersionMin failed", s);
326 s = SSLNewContext(
true, &
ssl);
328 s = SSLNewContext(
false, &
ssl);
330 OPENVPN_THROW(ssl_context_error,
"AppleSSLContext::SSL: unknown client/server mode");
335 s = SSLSetProtocolVersionEnabled(
ssl, kSSLProtocol2,
false);
337 throw CFException(
"SSLSetProtocolVersionEnabled !S2 failed", s);
338 s = SSLSetProtocolVersionEnabled(
ssl, kSSLProtocol3,
false);
340 throw CFException(
"SSLSetProtocolVersionEnabled !S3 failed", s);
341 s = SSLSetProtocolVersionEnabled(
ssl, kTLSProtocol1,
true);
343 throw CFException(
"SSLSetProtocolVersionEnabled T1 failed", s);
355 s = SSLSetConnection(
ssl,
this);
371 static OSStatus
ct_read_func(SSLConnectionRef cref,
void *data,
size_t *length)
376 const size_t actual = self->
ct_in.
read((
unsigned char *)data, *length);
377 const OSStatus
ret = (*length == actual) ? 0 : errSSLWouldBlock;
383 return errSSLInternal;
387 static OSStatus
ct_write_func(SSLConnectionRef cref,
const void *data,
size_t *length)
392 self->
ct_out.
write((
const unsigned char *)data, *length);
397 return errSSLInternal;
411#ifdef OPENVPN_PLATFORM_IPHONE
414 SSLDisposeContext(
ssl);
437 OPENVPN_THROW(ssl_context_error,
"AppleSSLContext: ssl session with CommonName and/or SubjectAltName verification not implemented");
450 OPENVPN_THROW(ssl_context_error,
"AppleSSLContext: identity undefined");
466 const CF::String label =
CF::string(subj_match);
467 const void *keys[] = {kSecClass, kSecMatchSubjectContains, kSecMatchTrustedOnly, kSecReturnRef};
468 const void *values[] = {kSecClassIdentity, label(), kCFBooleanTrue, kCFBooleanTrue};
469 const CF::Dict query =
CF::dict(keys, values,
sizeof(keys) /
sizeof(keys[0]));
471 const OSStatus s = SecItemCopyMatching(query(), result.
mod_ref());
474 const void *asrc[] = {result()};
void load(const OptionList &opt, const unsigned int lflags) override
void load_private_key(const std::string &key_txt) override
void load_crl(const std::string &crl_txt) override
void set_rng(const StrongRandomAPI::Ptr &rng_arg) override
SSLFactoryAPI::Ptr new_factory() override
void set_frame(const Frame::Ptr &frame_arg) override
void load_dh(const std::string &dh_txt) override
void set_remote_cert_tls(const KUParse::TLSWebType wt) override
void set_local_cert_enabled(const bool v) override
void set_ns_cert_type(const NSCert::Type ns_cert_type_arg) override
void set_private_key_password(const std::string &pwd) override
void set_tls_version_min(const TLSVersion::Type tvm) override
void load_cert(const std::string &cert_txt) override
friend class AppleSSLContext
void load_ca(const std::string &ca_txt, bool strict) override
void set_flags(const unsigned int flags_arg) override
void set_tls_remote(const std::string &tls_remote_arg) override
void set_mode(const Mode &mode_arg) override
void not_implemented(const char *funcname)
void set_external_pki_callback(ExternalPKIBase *external_pki_arg, const std::string &alias) override
void set_debug_level(const int debug_level) override
void set_enable_renegotiation(const bool v) override
const Mode & get_mode() const override
void load_cert(const std::string &cert_txt, const std::string &extra_certs_txt) override
void load_identity(const std::string &subject_match)
const AuthCert::Ptr & auth_cert() const override
ssize_t write_cleartext_unbuffered(const void *data, const size_t size) override
ssize_t read_cleartext(void *data, const size_t capacity) override
void write_ciphertext(const BufferPtr &buf) override
SSL(const AppleSSLContext &ctx)
bool read_ciphertext_ready() const override
std::string ssl_handshake_details() const override
void start_handshake() override
static OSStatus ct_read_func(SSLConnectionRef cref, void *data, size_t *length)
BufferPtr read_ciphertext() override
bool read_cleartext_ready() const override
static OSStatus ct_write_func(SSLConnectionRef cref, const void *data, size_t *length)
SSLAPI::Ptr ssl() override
static CF::Array load_identity_(const std::string &subj_match)
const CF::Array & identity() const
const Mode & mode() const override
AppleSSLContext(Config *config)
SSLAPI::Ptr ssl(const std::string &hostname) override
const Frame::Ptr & frame() const
RCPtr< AppleSSLContext > Ptr
void write_buf(const BufferPtr &bp)
void set_frame(const Frame::Ptr &frame)
void write(const unsigned char *data, size_t size)
size_t read(unsigned char *data, size_t len)
const Option & get(const std::string &name) const
bool exists(const std::string &name) const
RCPtr< SSLFactoryAPI > Ptr
#define OPENVPN_THROW(exc, stuff)
#define OPENVPN_LOG(args)
Array array(const void **values, CFIndex numValues)
String string(const char *str)
Dict dict(const void **keys, const void **values, CFIndex numValues)
AppleSSLContext::Ptr AppleSSLContextPtr
const std::string cert_txt
static const char config[]