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>
82 OPENVPN_THROW(ssl_context_error,
"AppleSSLContext: identity '" << subject_match <<
"' undefined");
113 const std::string &subject_match = opt.
get(
"identity", 1, 256);
128 void load_ca(
const std::string &ca_txt,
bool strict)
override
153 void load_dh(
const std::string &dh_txt)
override
206 OPENVPN_LOG(
"AppleSSL: " << funcname <<
" not implemented");
231 const OSStatus status = SSLWrite(
ssl, data, size, &actual);
234 if (status == errSSLWouldBlock)
237 throw CFException(
"AppleSSLContext::SSL::write_cleartext failed", status);
248 const OSStatus status = SSLRead(
ssl, data, capacity, &actual);
251 if (status == errSSLWouldBlock)
254 throw CFException(
"AppleSSLContext::SSL::read_cleartext failed", status);
260 throw ssl_ciphertext_in_overflow();
289 return "[AppleSSL not implemented]";
294 OPENVPN_THROW(ssl_context_error,
"AppleSSL::SSL: auth_cert() not implemented");
310#ifdef OPENVPN_PLATFORM_IPHONE
313 ssl = SSLCreateContext(kCFAllocatorDefault, kSSLServerSide, kSSLStreamType);
315 ssl = SSLCreateContext(kCFAllocatorDefault, kSSLClientSide, kSSLStreamType);
317 OPENVPN_THROW(ssl_context_error,
"AppleSSLContext::SSL: unknown client/server mode");
322 s = SSLSetProtocolVersionMin(
ssl, kTLSProtocol1);
324 throw CFException(
"SSLSetProtocolVersionMin failed", s);
328 s = SSLNewContext(
true, &
ssl);
330 s = SSLNewContext(
false, &
ssl);
332 OPENVPN_THROW(ssl_context_error,
"AppleSSLContext::SSL: unknown client/server mode");
337 s = SSLSetProtocolVersionEnabled(
ssl, kSSLProtocol2,
false);
339 throw CFException(
"SSLSetProtocolVersionEnabled !S2 failed", s);
340 s = SSLSetProtocolVersionEnabled(
ssl, kSSLProtocol3,
false);
342 throw CFException(
"SSLSetProtocolVersionEnabled !S3 failed", s);
343 s = SSLSetProtocolVersionEnabled(
ssl, kTLSProtocol1,
true);
345 throw CFException(
"SSLSetProtocolVersionEnabled T1 failed", s);
357 s = SSLSetConnection(
ssl,
this);
373 static OSStatus
ct_read_func(SSLConnectionRef cref,
void *data,
size_t *length)
378 const size_t actual = self->
ct_in.
read((
unsigned char *)data, *length);
379 const OSStatus
ret = (*length == actual) ? 0 : errSSLWouldBlock;
385 return errSSLInternal;
389 static OSStatus
ct_write_func(SSLConnectionRef cref,
const void *data,
size_t *length)
394 self->
ct_out.
write((
const unsigned char *)data, *length);
399 return errSSLInternal;
413#ifdef OPENVPN_PLATFORM_IPHONE
416 SSLDisposeContext(
ssl);
439 OPENVPN_THROW(ssl_context_error,
"AppleSSLContext: ssl session with CommonName and/or SubjectAltName verification not implemented");
452 OPENVPN_THROW(ssl_context_error,
"AppleSSLContext: identity undefined");
468 const CF::String label =
CF::string(subj_match);
469 const void *keys[] = {kSecClass, kSecMatchSubjectContains, kSecMatchTrustedOnly, kSecReturnRef};
470 const void *values[] = {kSecClassIdentity, label(), kCFBooleanTrue, kCFBooleanTrue};
471 const CF::Dict query =
CF::dict(keys, values,
sizeof(keys) /
sizeof(keys[0]));
473 const OSStatus s = SecItemCopyMatching(query(), result.
mod_ref());
476 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)
Support deferred server-side state creation when client connects.
AppleSSLContext::Ptr AppleSSLContextPtr
const std::string cert_txt
static const char config[]