]> git.saurik.com Git - apple/security.git/blobdiff - OSX/libsecurity_ssl/lib/SecureTransport.h
Security-57336.1.9.tar.gz
[apple/security.git] / OSX / libsecurity_ssl / lib / SecureTransport.h
diff --git a/OSX/libsecurity_ssl/lib/SecureTransport.h b/OSX/libsecurity_ssl/lib/SecureTransport.h
new file mode 100644 (file)
index 0000000..f6e5fc6
--- /dev/null
@@ -0,0 +1,1360 @@
+/*
+ * Copyright (c) 1999-2002,2005-2014 Apple Inc. All Rights Reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ * 
+ * This file contains Original Code and/or Modifications of Original Code
+ * as defined in and that are subject to the Apple Public Source License
+ * Version 2.0 (the 'License'). You may not use this file except in
+ * compliance with the License. Please obtain a copy of the License at
+ * http://www.opensource.apple.com/apsl/ and read it before using this
+ * file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
+ * Please see the License for the specific language governing rights and
+ * limitations under the License.
+ * 
+ * @APPLE_LICENSE_HEADER_END@
+ */
+
+/*
+ * SecureTransport.h - Public API for Apple SSL/TLS Implementation
+ */
+
+#ifndef _SECURITY_SECURETRANSPORT_H_
+#define _SECURITY_SECURETRANSPORT_H_
+
+/*
+ * This file describes the public API for an implementation of the
+ * Secure Socket Layer, V. 3.0, Transport Layer Security, V. 1.0 to V. 1.2
+ * and Datagram Transport Layer Security V. 1.0
+ *
+ * There are no transport layer dependencies in this library;
+ * it can be used with sockets, Open Transport, etc. Applications using
+ * this library provide callback functions which do the actual I/O
+ * on underlying network connections. Applications are also responsible
+ * for setting up raw network connections; the application passes in
+ * an opaque reference to the underlying (connected) entity at the
+ * start of an SSL session in the form of an SSLConnectionRef.
+ *
+ * Some terminology:
+ *
+ * A "client" is the initiator of an SSL Session. The canonical example
+ * of a client is a web browser, when it's talking to an https URL.
+ *
+ * A "server" is an entity which accepts requests for SSL sessions made
+ * by clients. E.g., a secure web server.
+
+ * An "SSL Session", or "session", is bounded by calls to SSLHandshake()
+ * and SSLClose(). An "Active session" is in some state between these
+ * two calls, inclusive.
+ *
+ * An SSL Session Context, or SSLContextRef, is an opaque reference in this
+ * library to the state associated with one session. A SSLContextRef cannot
+ * be reused for multiple sessions.
+ */
+
+#include <CoreFoundation/CFArray.h>
+#include <Security/CipherSuite.h>
+#include <Security/SecTrust.h>
+#include <sys/types.h>
+#include <Availability.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+CF_ASSUME_NONNULL_BEGIN
+CF_IMPLICIT_BRIDGING_ENABLED
+
+/***********************
+ *** Common typedefs ***
+ ***********************/
+
+/* Opaque reference to an SSL session context */
+struct                      SSLContext;
+typedef struct CF_BRIDGED_TYPE(id) SSLContext *SSLContextRef;
+
+/* Opaque reference to an I/O connection (socket, endpoint, etc.) */
+typedef const void *           SSLConnectionRef;
+
+/* SSL Protocol version */
+typedef CF_ENUM(int, SSLProtocol) {
+       kSSLProtocolUnknown = 0,                /* no protocol negotiated/specified; use default */
+       kSSLProtocol3       = 2,                                /* SSL 3.0 */
+       kTLSProtocol1       = 4,                                /* TLS 1.0 */
+    kTLSProtocol11      = 7,                           /* TLS 1.1 */
+    kTLSProtocol12      = 8,                           /* TLS 1.2 */
+    kDTLSProtocol1      = 9,                /* DTLS 1.0 */
+
+    /* DEPRECATED on iOS */
+    kSSLProtocol2       = 1,                           /* SSL 2.0 */
+    kSSLProtocol3Only   = 3,                /* SSL 3.0 Only */
+    kTLSProtocol1Only   = 5,                /* TLS 1.0 Only */
+    kSSLProtocolAll     = 6,                /* All TLS supported protocols */
+
+};
+
+/* SSL session options */
+typedef CF_ENUM(int, SSLSessionOption) {
+       /*
+        * Set this option to enable returning from SSLHandshake (with a result of
+        * errSSLServerAuthCompleted) when the server authentication portion of the
+        * handshake is complete. This disable certificate verification and
+        * provides an opportunity to perform application-specific server
+        * verification before deciding to continue.
+        */
+       kSSLSessionOptionBreakOnServerAuth = 0,
+       /*
+        * Set this option to enable returning from SSLHandshake (with a result of
+        * errSSLClientCertRequested) when the server requests a client certificate.
+        */
+       kSSLSessionOptionBreakOnCertRequested = 1,
+    /*
+     * This option is the same as kSSLSessionOptionBreakOnServerAuth but applies
+     * to the case where SecureTransport is the server and the client has presented
+     * its certificates allowing the server to verify whether these should be
+     * allowed to authenticate.
+     */
+    kSSLSessionOptionBreakOnClientAuth = 2,
+    /*
+     * Enable/Disable TLS False Start
+     * When enabled, False Start will only be performed if a adequate cipher-suite is
+     * negotiated.
+     */
+    kSSLSessionOptionFalseStart = 3,
+    /*
+     * Enable/Disable 1/n-1 record splitting for BEAST attack mitigation.
+     * When enabled, record splitting will only be performed for TLS 1.0 connections
+     * using a block cipher.
+     */
+    kSSLSessionOptionSendOneByteRecord = 4,
+    /*
+     * Allow/Disallow server identity change on renegotiation. Disallow by default
+     * to avoid Triple Handshake attack.
+     */
+    kSSLSessionOptionAllowServerIdentityChange = 5,
+    /*
+     * Enable fallback countermeasures. Use this option when retyring a SSL connection
+     * with a lower protocol version because of failure to connect.
+     */
+    kSSLSessionOptionFallback = 6,
+    /*
+     * Set this option to break from a client hello in order to check for SNI
+     */
+    kSSLSessionOptionBreakOnClientHello = 7,
+
+};
+
+/* State of an SSLSession */
+typedef CF_ENUM(int, SSLSessionState) {
+       kSSLIdle,                                       /* no I/O performed yet */
+       kSSLHandshake,                          /* SSL handshake in progress */
+       kSSLConnected,                          /* Handshake complete, ready for normal I/O */
+       kSSLClosed,                                     /* connection closed normally */
+       kSSLAborted                                     /* connection aborted */
+};
+
+/*
+ * Status of client certificate exchange (which is optional
+ * for both server and client).
+ */
+typedef CF_ENUM(int, SSLClientCertificateState) {
+       /* Server hasn't asked for a cert. Client hasn't sent one. */
+       kSSLClientCertNone,
+       /* Server has asked for a cert, but client didn't send it. */
+       kSSLClientCertRequested,
+       /*
+        * Server side: We asked for a cert, client sent one, we validated
+        *                              it OK. App can inspect the cert via
+        *                              SSLGetPeerCertificates().
+        * Client side: server asked for one, we sent it.
+        */
+       kSSLClientCertSent,
+       /*
+        * Client sent a cert but failed validation. Server side only.
+        * Server app can inspect the cert via SSLGetPeerCertificates().
+        */
+       kSSLClientCertRejected
+} ;
+
+/*
+ * R/W functions. The application using this library provides
+ * these functions via SSLSetIOFuncs().
+ *
+ * Data's memory is allocated by caller; on entry to these two functions
+ * the *length argument indicates both the size of the available data and the
+ * requested byte count. Number of bytes actually transferred is returned in
+ * *length.
+ *
+ * The application may configure the underlying connection to operate
+ * in a non-blocking manner; in such a case, a read operation may
+ * well return errSSLWouldBlock, indicating "I transferred less data than
+ * you requested (maybe even zero bytes), nothing is wrong, except
+ * requested I/O hasn't completed". This will be returned back up to
+ * the application as a return from SSLRead(), SSLWrite(), SSLHandshake(),
+ * etc.
+ */
+typedef OSStatus
+(*SSLReadFunc)                                 (SSLConnectionRef       connection,
+                                                        void                           *data,                  /* owned by
+                                                                                                                                * caller, data
+                                                                                                                                * RETURNED */
+                                                        size_t                         *dataLength);   /* IN/OUT */
+typedef OSStatus
+(*SSLWriteFunc)                        (SSLConnectionRef       connection,
+                                                        const void             *data,
+                                                        size_t                         *dataLength);   /* IN/OUT */
+
+/*************************************************
+ *** OSStatus values unique to SecureTransport ***
+ *************************************************/
+
+/*
+    Note: the comments that appear after these errors are used to create SecErrorMessages.strings.
+    The comments must not be multi-line, and should be in a form meaningful to an end user. If
+    a different or additional comment is needed, it can be put in the header doc format, or on a
+    line that does not start with errZZZ.
+*/
+
+CF_ENUM(OSStatus) {
+       errSSLProtocol                          = -9800,        /* SSL protocol error */
+       errSSLNegotiation                       = -9801,        /* Cipher Suite negotiation failure */
+       errSSLFatalAlert                        = -9802,        /* Fatal alert */
+       errSSLWouldBlock                        = -9803,        /* I/O would block (not fatal) */
+    errSSLSessionNotFound              = -9804,        /* attempt to restore an unknown session */
+    errSSLClosedGraceful               = -9805,        /* connection closed gracefully */
+    errSSLClosedAbort                  = -9806,        /* connection closed via error */
+    errSSLXCertChainInvalid    = -9807,        /* invalid certificate chain */
+    errSSLBadCert                              = -9808,        /* bad certificate format */
+       errSSLCrypto                            = -9809,        /* underlying cryptographic error */
+       errSSLInternal                          = -9810,        /* Internal error */
+       errSSLModuleAttach                      = -9811,        /* module attach failure */
+    errSSLUnknownRootCert              = -9812,        /* valid cert chain, untrusted root */
+    errSSLNoRootCert                   = -9813,        /* cert chain not verified by root */
+       errSSLCertExpired                       = -9814,        /* chain had an expired cert */
+       errSSLCertNotYetValid           = -9815,        /* chain had a cert not yet valid */
+       errSSLClosedNoNotify            = -9816,        /* server closed session with no notification */
+       errSSLBufferOverflow            = -9817,        /* insufficient buffer provided */
+       errSSLBadCipherSuite            = -9818,        /* bad SSLCipherSuite */
+
+       /* fatal errors detected by peer */
+       errSSLPeerUnexpectedMsg         = -9819,        /* unexpected message received */
+       errSSLPeerBadRecordMac          = -9820,        /* bad MAC */
+       errSSLPeerDecryptionFail        = -9821,        /* decryption failed */
+       errSSLPeerRecordOverflow        = -9822,        /* record overflow */
+       errSSLPeerDecompressFail        = -9823,        /* decompression failure */
+       errSSLPeerHandshakeFail         = -9824,        /* handshake failure */
+       errSSLPeerBadCert                       = -9825,        /* misc. bad certificate */
+       errSSLPeerUnsupportedCert       = -9826,        /* bad unsupported cert format */
+       errSSLPeerCertRevoked           = -9827,        /* certificate revoked */
+       errSSLPeerCertExpired           = -9828,        /* certificate expired */
+       errSSLPeerCertUnknown           = -9829,        /* unknown certificate */
+       errSSLIllegalParam                      = -9830,        /* illegal parameter */
+       errSSLPeerUnknownCA             = -9831,        /* unknown Cert Authority */
+       errSSLPeerAccessDenied          = -9832,        /* access denied */
+       errSSLPeerDecodeError           = -9833,        /* decoding error */
+       errSSLPeerDecryptError          = -9834,        /* decryption error */
+       errSSLPeerExportRestriction     = -9835,        /* export restriction */
+       errSSLPeerProtocolVersion       = -9836,        /* bad protocol version */
+       errSSLPeerInsufficientSecurity = -9837, /* insufficient security */
+       errSSLPeerInternalError         = -9838,        /* internal error */
+       errSSLPeerUserCancelled         = -9839,        /* user canceled */
+       errSSLPeerNoRenegotiation       = -9840,        /* no renegotiation allowed */
+
+       /* non-fatal result codes */
+       errSSLPeerAuthCompleted     = -9841,    /* peer cert is valid, or was ignored if verification disabled */
+       errSSLClientCertRequested       = -9842,        /* server has requested a client cert */
+
+       /* more errors detected by us */
+       errSSLHostNameMismatch          = -9843,        /* peer host name mismatch */
+       errSSLConnectionRefused         = -9844,        /* peer dropped connection before responding */
+       errSSLDecryptionFail            = -9845,        /* decryption failure */
+       errSSLBadRecordMac                      = -9846,        /* bad MAC */
+       errSSLRecordOverflow            = -9847,        /* record overflow */
+       errSSLBadConfiguration          = -9848,        /* configuration error */
+       errSSLUnexpectedRecord      = -9849,    /* unexpected (skipped) record in DTLS */
+    errSSLWeakPeerEphemeralDHKey = -9850,      /* weak ephemeral dh key  */
+
+    /* non-fatal result codes */
+    errSSLClientHelloReceived   = -9851,    /* SNI */
+};
+
+/* DEPRECATED aliases for errSSLPeerAuthCompleted */
+#define errSSLServerAuthCompleted      errSSLPeerAuthCompleted
+#define errSSLClientAuthCompleted      errSSLPeerAuthCompleted
+
+/* DEPRECATED alias for the end of the error range */
+#define errSSLLast errSSLUnexpectedRecord
+
+typedef CF_ENUM(int, SSLProtocolSide)
+{
+    kSSLServerSide,
+    kSSLClientSide
+};
+
+typedef CF_ENUM(int, SSLConnectionType)
+{
+    kSSLStreamType,
+    kSSLDatagramType
+};
+
+typedef CF_ENUM(int, SSLSessionStrengthPolicy)
+{
+    kSSLSessionStrengthPolicyDefault,
+    kSSLSessionStrengthPolicyATSv1
+};
+
+/******************
+ *** Public API ***
+ ******************/
+
+/*
+ * Secure Transport APIs require a SSLContextRef, which is an opaque
+ * reference to the SSL session and its parameters. On Mac OS X 10.7
+ * and earlier versions, a new context is created using SSLNewContext,
+ * and is disposed by calling SSLDisposeContext.
+ *
+ * On i0S 5.0 and later, as well as Mac OS X versions after 10.7, the
+ * SSLContextRef is a true CFType object with retain-release semantics.
+ * New code should create a new context using SSLCreateContext (instead
+ * of SSLNewContext), and dispose the context by calling CFRelease
+ * (instead of SSLDisposeContext) when finished with it.
+ */
+
+/*
+ * Return the CFTypeID for SSLContext objects.
+ */
+CFTypeID
+SSLContextGetTypeID(void)
+       __OSX_AVAILABLE_STARTING(__MAC_10_8, __IPHONE_5_0);
+
+/*
+ * Create a new instance of an SSLContextRef using the specified allocator.
+ */
+__nullable
+SSLContextRef
+SSLCreateContext(CFAllocatorRef __nullable alloc, SSLProtocolSide protocolSide, SSLConnectionType connectionType)
+       __OSX_AVAILABLE_STARTING(__MAC_10_8, __IPHONE_5_0);
+
+
+#if (TARGET_OS_MAC && !(TARGET_OS_EMBEDDED || TARGET_OS_IPHONE))
+/*
+ * Create a new session context.
+ *
+ * ==========================
+ * MAC OS X ONLY (DEPRECATED)
+ * ==========================
+ * NOTE: this function is not available on iOS, and should be considered
+ * deprecated on Mac OS X. Your code should use SSLCreateContext instead.
+ */
+OSStatus
+SSLNewContext                          (Boolean                        isServer,
+                                                        SSLContextRef          * __nonnull CF_RETURNS_RETAINED contextPtr)     /* RETURNED */
+       __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_2,__MAC_10_9,__IPHONE_NA,__IPHONE_NA);
+
+/*
+ * Dispose of a session context.
+ *
+ * ==========================
+ * MAC OS X ONLY (DEPRECATED)
+ * ==========================
+ * NOTE: this function is not available on iOS, and should be considered
+ * deprecated on Mac OS X. Your code should use CFRelease to dispose a session
+ * created with SSLCreateContext.
+ */
+OSStatus
+SSLDisposeContext                      (SSLContextRef          context)
+       __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_2,__MAC_10_9,__IPHONE_NA,__IPHONE_NA);
+
+#endif /* MAC OS X */
+
+/*
+ * Determine the state of an SSL/DTLS session.
+ */
+OSStatus
+SSLGetSessionState                     (SSLContextRef          context,
+                                                        SSLSessionState        *state)         /* RETURNED */
+       __OSX_AVAILABLE_STARTING(__MAC_10_2, __IPHONE_5_0);
+
+/*
+ * Set options for an SSL session. Must be called prior to SSLHandshake();
+ * subsequently cannot be called while session is active.
+ */
+OSStatus
+SSLSetSessionOption                    (SSLContextRef          context,
+                                                        SSLSessionOption       option,
+                                                        Boolean                        value)
+       __OSX_AVAILABLE_STARTING(__MAC_10_6, __IPHONE_5_0);
+
+/*
+ * Determine current value for the specified option in a given SSL session.
+ */
+OSStatus
+SSLGetSessionOption                    (SSLContextRef          context,
+                                                        SSLSessionOption       option,
+                                                        Boolean                        *value)
+       __OSX_AVAILABLE_STARTING(__MAC_10_6, __IPHONE_5_0);
+
+/********************************************************************
+ *** Session context configuration, common to client and servers. ***
+ ********************************************************************/
+
+/*
+ * Specify functions which do the network I/O. Must be called prior
+ * to SSLHandshake(); subsequently cannot be called while a session is
+ * active.
+ */
+OSStatus
+SSLSetIOFuncs                          (SSLContextRef          context,
+                                                        SSLReadFunc            readFunc,
+                                                        SSLWriteFunc           writeFunc)
+       __OSX_AVAILABLE_STARTING(__MAC_10_2, __IPHONE_5_0);
+
+/*
+ * Set the minimum SSL protocol version allowed. Optional.
+ * The default is the lower supported protocol.
+ *
+ * This can only be called when no session is active.
+ *
+ * For TLS contexts, legal values for minVersion are :
+ *             kSSLProtocol3
+ *             kTLSProtocol1
+ *             kTLSProtocol11
+ *             kTLSProtocol12
+ *
+ * For DTLS contexts, legal values for minVersion are :
+ *      kDTLSProtocol1
+ */
+OSStatus
+SSLSetProtocolVersionMin  (SSLContextRef      context,
+                           SSLProtocol        minVersion)
+    __OSX_AVAILABLE_STARTING(__MAC_10_8, __IPHONE_5_0);
+
+/*
+ * Get minimum protocol version allowed
+ */
+OSStatus
+SSLGetProtocolVersionMin  (SSLContextRef      context,
+                           SSLProtocol        *minVersion)
+    __OSX_AVAILABLE_STARTING(__MAC_10_8, __IPHONE_5_0);
+
+/*
+ * Set the maximum SSL protocol version allowed. Optional.
+ * The default is the highest supported protocol.
+ *
+ * This can only be called when no session is active.
+ *
+ * For TLS contexts, legal values for minVersion are :
+ *             kSSLProtocol3
+ *             kTLSProtocol1
+ *             kTLSProtocol11
+ *             kTLSProtocol12
+ *
+ * For DTLS contexts, legal values for minVersion are :
+ *      kDTLSProtocol1
+ */
+OSStatus
+SSLSetProtocolVersionMax  (SSLContextRef      context,
+                           SSLProtocol        maxVersion)
+    __OSX_AVAILABLE_STARTING(__MAC_10_8, __IPHONE_5_0);
+
+/*
+ * Get maximum protocol version allowed
+ */
+OSStatus
+SSLGetProtocolVersionMax  (SSLContextRef      context,
+                           SSLProtocol        *maxVersion)
+    __OSX_AVAILABLE_STARTING(__MAC_10_8, __IPHONE_5_0);
+
+
+#if (TARGET_OS_MAC && !(TARGET_OS_EMBEDDED || TARGET_OS_IPHONE))
+/*
+ * Set allowed SSL protocol versions. Optional.
+ * Specifying kSSLProtocolAll for SSLSetProtocolVersionEnabled results in
+ * specified 'enable' boolean to be applied to all supported protocols.
+ * The default is "all supported protocols are enabled".
+ * This can only be called when no session is active.
+ *
+ * Legal values for protocol are :
+ *             kSSLProtocol2
+ *             kSSLProtocol3
+ *             kTLSProtocol1
+ *             kSSLProtocolAll
+ *
+ * ==========================
+ * MAC OS X ONLY (DEPRECATED)
+ * ==========================
+ * NOTE: this function is not available on iOS, and should be considered
+ * deprecated on Mac OS X. You can use SSLSetProtocolVersionMin and/or
+ * SSLSetProtocolVersionMax to specify which protocols are enabled.
+ */
+OSStatus
+SSLSetProtocolVersionEnabled (SSLContextRef    context,
+                                                        SSLProtocol            protocol,
+                                                        Boolean                        enable)
+       __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_2,__MAC_10_9,__IPHONE_NA,__IPHONE_NA);
+
+/*
+ * Obtain a value specified in SSLSetProtocolVersionEnabled.
+ *
+ * ==========================
+ * MAC OS X ONLY (DEPRECATED)
+ * ==========================
+ * NOTE: this function is not available on iOS, and should be considered
+ * deprecated on Mac OS X. You can use SSLGetProtocolVersionMin and/or
+ * SSLGetProtocolVersionMax to check whether a protocol is enabled.
+ */
+OSStatus
+SSLGetProtocolVersionEnabled(SSLContextRef             context,
+                                                        SSLProtocol            protocol,
+                                                        Boolean                        *enable)        /* RETURNED */
+       __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_2,__MAC_10_9,__IPHONE_NA,__IPHONE_NA);
+
+/*
+ * Get/set SSL protocol version; optional. Default is kSSLProtocolUnknown,
+ * in which case the highest possible version is attempted, but a lower
+ * version is accepted if the peer requires it.
+ * SSLSetProtocolVersion cannot be called when a session is active.
+ *
+ * ==========================
+ * MAC OS X ONLY (DEPRECATED)
+ * ==========================
+ * NOTE: this function is not available on iOS, and deprecated on Mac OS X 10.8.
+ * Use SSLSetProtocolVersionMin and/or SSLSetProtocolVersionMax to specify
+ * which protocols are enabled.
+ */
+OSStatus
+SSLSetProtocolVersion          (SSLContextRef          context,
+                                                        SSLProtocol            version)
+       __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_2,__MAC_10_8,__IPHONE_NA,__IPHONE_NA);
+
+/*
+ * Obtain the protocol version specified in SSLSetProtocolVersion.
+ * If SSLSetProtocolVersionEnabled() has been called for this session,
+ * SSLGetProtocolVersion() may return errSecParam if the protocol enable
+ * state can not be represented by the SSLProtocol enums (e.g.,
+ * SSL2 and TLS1 enabled, SSL3 disabled).
+ *
+ * ==========================
+ * MAC OS X ONLY (DEPRECATED)
+ * ==========================
+ * NOTE: this function is not available on iOS, and deprecated on Mac OS X 10.8.
+ * Use SSLGetProtocolVersionMin and/or SSLGetProtocolVersionMax to check
+ * whether a protocol is enabled.
+ */
+OSStatus
+SSLGetProtocolVersion          (SSLContextRef          context,
+                                                        SSLProtocol            *protocol)      /* RETURNED */
+       __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_2,__MAC_10_8,__IPHONE_NA,__IPHONE_NA);
+
+#endif /* MAC OS X */
+
+/*
+ * Specify this connection's certificate(s). This is mandatory for
+ * server connections, optional for clients. Specifying a certificate
+ * for a client enables SSL client-side authentication. The end-entity
+ * cert is in certRefs[0]. Specifying a root cert is optional; if it's
+ * not specified, the root cert which verifies the cert chain specified
+ * here must be present in the system-wide set of trusted anchor certs.
+ *
+ * The certRefs argument is a CFArray containing SecCertificateRefs,
+ * except for certRefs[0], which is a SecIdentityRef.
+ *
+ * Must be called prior to SSLHandshake(), or immediately after
+ * SSLHandshake has returned errSSLClientCertRequested (i.e. before the
+ * handshake is resumed by calling SSLHandshake again.)
+ *
+ * SecureTransport assumes the following:
+ *
+ *  -- The certRef references remain valid for the lifetime of the session.
+ *  -- The certificate specified in certRefs[0] is capable of signing.
+ *  -- The required capabilities of the certRef[0], and of the optional cert
+ *     specified in SSLSetEncryptionCertificate (see below), are highly
+ *     dependent on the application. For example, to work as a server with
+ *     Netscape clients, the cert specified here must be capable of both
+ *     signing and encrypting.
+ */
+OSStatus
+SSLSetCertificate                      (SSLContextRef          context,
+                                                        CFArrayRef                     certRefs)
+       __OSX_AVAILABLE_STARTING(__MAC_10_2, __IPHONE_5_0);
+
+/*
+ * Specify I/O connection - a socket, endpoint, etc., which is
+ * managed by caller. On the client side, it's assumed that communication
+ * has been established with the desired server on this connection.
+ * On the server side, it's assumed that an incoming client request
+ * has been established.
+ *
+ * Must be called prior to SSLHandshake(); subsequently can only be
+ * called when no session is active.
+ */
+OSStatus
+SSLSetConnection                       (SSLContextRef                  context,
+                                                        SSLConnectionRef __nullable    connection)
+       __OSX_AVAILABLE_STARTING(__MAC_10_2, __IPHONE_5_0);
+
+OSStatus
+SSLGetConnection                       (SSLContextRef          context,
+                                                        SSLConnectionRef       * __nonnull CF_RETURNS_NOT_RETAINED connection)
+       __OSX_AVAILABLE_STARTING(__MAC_10_2, __IPHONE_5_0);
+
+/*
+ * Specify the fully qualified doman name of the peer, e.g., "store.apple.com."
+ * Optional; used to verify the common name field in peer's certificate.
+ * Name is in the form of a C string; NULL termination optional, i.e.,
+ * peerName[peerNameLen+1] may or may not have a NULL. In any case peerNameLen
+ * is the number of bytes of the peer domain name.
+ */
+OSStatus
+SSLSetPeerDomainName           (SSLContextRef          context,
+                                                        const char                     * __nullable peerName,
+                                                        size_t                         peerNameLen)
+       __OSX_AVAILABLE_STARTING(__MAC_10_2, __IPHONE_5_0);
+
+/*
+ * Determine the buffer size needed for SSLGetPeerDomainName().
+ */
+OSStatus
+SSLGetPeerDomainNameLength     (SSLContextRef          context,
+                                                        size_t                         *peerNameLen)   // RETURNED
+       __OSX_AVAILABLE_STARTING(__MAC_10_2, __IPHONE_5_0);
+
+/*
+ * Obtain the value specified in SSLSetPeerDomainName().
+ */
+OSStatus
+SSLGetPeerDomainName           (SSLContextRef          context,
+                                                        char                           *peerName,              // returned here
+                                                        size_t                         *peerNameLen)   // IN/OUT
+       __OSX_AVAILABLE_STARTING(__MAC_10_2, __IPHONE_5_0);
+
+/*
+ * Specify the Datagram TLS Hello Cookie.
+ * This is to be called for server side only and is optional.
+ * The default is a zero len cookie. The maximum cookieLen is 32 bytes.
+ */
+OSStatus
+SSLSetDatagramHelloCookie      (SSLContextRef          dtlsContext,
+                             const void         * __nullable cookie,
+                             size_t             cookieLen)
+       __OSX_AVAILABLE_STARTING(__MAC_10_8, __IPHONE_5_0);
+
+/*
+ * Specify the maximum record size, including all DTLS record headers.
+ * This should be set appropriately to avoid fragmentation
+ * of Datagrams during handshake, as fragmented datagrams may
+ * be dropped by some network.
+ * This is for Datagram TLS only
+ */
+OSStatus
+SSLSetMaxDatagramRecordSize (SSLContextRef             dtlsContext,
+                             size_t             maxSize)
+       __OSX_AVAILABLE_STARTING(__MAC_10_8, __IPHONE_5_0);
+
+/*
+ * Get the maximum record size, including all Datagram TLS record headers.
+ * This is for Datagram TLS only
+ */
+OSStatus
+SSLGetMaxDatagramRecordSize (SSLContextRef             dtlsContext,
+                             size_t             *maxSize)
+       __OSX_AVAILABLE_STARTING(__MAC_10_8, __IPHONE_5_0);
+
+/*
+ * Obtain the actual negotiated protocol version of the active
+ * session, which may be different that the value specified in
+ * SSLSetProtocolVersion(). Returns kSSLProtocolUnknown if no
+ * SSL session is in progress.
+ */
+OSStatus
+SSLGetNegotiatedProtocolVersion                (SSLContextRef          context,
+                                                                        SSLProtocol            *protocol)      /* RETURNED */
+       __OSX_AVAILABLE_STARTING(__MAC_10_2, __IPHONE_5_0);
+
+/*
+ * Determine number and values of all of the SSLCipherSuites we support.
+ * Caller allocates output buffer for SSLGetSupportedCiphers() and passes in
+ * its size in *numCiphers. If supplied buffer is too small, errSSLBufferOverflow
+ * will be returned.
+ */
+OSStatus
+SSLGetNumberSupportedCiphers (SSLContextRef                    context,
+                                                         size_t                                *numCiphers)
+       __OSX_AVAILABLE_STARTING(__MAC_10_2, __IPHONE_5_0);
+
+OSStatus
+SSLGetSupportedCiphers          (SSLContextRef                 context,
+                                                         SSLCipherSuite                *ciphers,               /* RETURNED */
+                                                         size_t                                *numCiphers)    /* IN/OUT */
+       __OSX_AVAILABLE_STARTING(__MAC_10_2, __IPHONE_5_0);
+
+/*
+ * Specify a (typically) restricted set of SSLCipherSuites to be enabled by
+ * the current SSLContext. Can only be called when no session is active. Default
+ * set of enabled SSLCipherSuites is the same as the complete set of supported
+ * SSLCipherSuites as obtained by SSLGetSupportedCiphers().
+ */
+OSStatus
+SSLSetEnabledCiphers           (SSLContextRef                  context,
+                                                        const SSLCipherSuite   *ciphers,
+                                                        size_t                                 numCiphers)
+       __OSX_AVAILABLE_STARTING(__MAC_10_2, __IPHONE_5_0);
+
+/*
+ * Determine number and values of all of the SSLCipherSuites currently enabled.
+ * Caller allocates output buffer for SSLGetEnabledCiphers() and passes in
+ * its size in *numCiphers. If supplied buffer is too small, errSSLBufferOverflow
+ * will be returned.
+ */
+OSStatus
+SSLGetNumberEnabledCiphers     (SSLContextRef                  context,
+                                                        size_t                                 *numCiphers)
+       __OSX_AVAILABLE_STARTING(__MAC_10_2, __IPHONE_5_0);
+
+OSStatus
+SSLGetEnabledCiphers           (SSLContextRef                  context,
+                                                        SSLCipherSuite                 *ciphers,               /* RETURNED */
+                                                        size_t                                 *numCiphers)    /* IN/OUT */
+       __OSX_AVAILABLE_STARTING(__MAC_10_2, __IPHONE_5_0);
+
+
+#if (TARGET_OS_MAC && !(TARGET_OS_EMBEDDED || TARGET_OS_IPHONE))
+/*
+ * Enable/disable peer certificate chain validation. Default is enabled.
+ * If caller disables, it is the caller's responsibility to call
+ * SSLCopyPeerCertificates() upon successful completion of the handshake
+ * and then to perform external validation of the peer certificate
+ * chain before proceeding with data transfer.
+ *
+ * ==========================
+ * MAC OS X ONLY (DEPRECATED)
+ * ==========================
+ * NOTE: this function is not available on iOS, and should be considered
+ * deprecated on Mac OS X. To disable peer certificate chain validation, you
+ * can instead use SSLSetSessionOption to set kSSLSessionOptionBreakOnServerAuth
+ * to true. This will disable verification and cause SSLHandshake to return with
+ * an errSSLServerAuthCompleted result when the peer certificates have been
+ * received; at that time, you can choose to evaluate peer trust yourself, or
+ * simply call SSLHandshake again to proceed with the handshake.
+ */
+OSStatus
+SSLSetEnableCertVerify         (SSLContextRef                  context,
+                                                        Boolean                                enableVerify)
+       __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_2,__MAC_10_9,__IPHONE_NA,__IPHONE_NA);
+
+/*
+ * Check whether peer certificate chain validation is enabled.
+ *
+ * ==========================
+ * MAC OS X ONLY (DEPRECATED)
+ * ==========================
+ * NOTE: this function is not available on iOS, and should be considered
+ * deprecated on Mac OS X. To check whether peer certificate chain validation
+ * is enabled in a context, call SSLGetSessionOption to obtain the value of
+ * the kSSLSessionOptionBreakOnServerAuth session option flag. If the value
+ * of this option flag is true, then verification is disabled.
+ */
+OSStatus
+SSLGetEnableCertVerify         (SSLContextRef                  context,
+                                                        Boolean                                *enableVerify)  /* RETURNED */
+       __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_2,__MAC_10_9,__IPHONE_NA,__IPHONE_NA);
+
+/*
+ * Specify the option of ignoring certificates' "expired" times.
+ * This is a common failure in the real SSL world. Default setting for this
+ * flag is false, meaning expired certs result in an errSSLCertExpired error.
+ *
+ * ==========================
+ * MAC OS X ONLY (DEPRECATED)
+ * ==========================
+ * NOTE: this function is not available on iOS, and should be considered
+ * deprecated on Mac OS X. To ignore expired certificate errors, first disable
+ * Secure Transport's automatic verification of peer certificates by calling
+ * SSLSetSessionOption to set kSSLSessionOptionBreakOnServerAuth to true. When
+ * SSLHandshake subsequently returns an errSSLServerAuthCompleted result,
+ * your code should obtain the SecTrustRef for the peer's certificates and
+ * perform a custom trust evaluation with SecTrust APIs (see SecTrust.h).
+ * The SecTrustSetOptions function allows you to specify that the expiration
+ * status of certificates should be ignored for this evaluation.
+ *
+ * Example:
+ *
+ *     status = SSLSetSessionOption(ctx, kSSLSessionOptionBreakOnServerAuth, true);
+ *     do {
+ *             status = SSLHandshake(ctx);
+ *
+ *             if (status == errSSLServerAuthCompleted) {
+ *                     SecTrustRef peerTrust = NULL;
+ *                     status = SSLCopyPeerTrust(ctx, &peerTrust);
+ *                     if (status == errSecSuccess) {
+ *                             SecTrustResultType trustResult;
+ *                             // set flag to allow expired certificates
+ *                             SecTrustSetOptions(peerTrust, kSecTrustOptionAllowExpired);
+ *                             status = SecTrustEvaluate(peerTrust, &trustResult);
+ *                             if (status == errSecSuccess) {
+ *                                     // A "proceed" result means the cert is explicitly trusted,
+ *                                     // e.g. "Always Trust" was clicked;
+ *                                     // "Unspecified" means the cert has no explicit trust settings,
+ *                                     // but is implicitly OK since it chains back to a trusted root.
+ *                                     // Any other result means the cert is not trusted.
+ *                                     //
+ *                                     if (trustResult == kSecTrustResultProceed ||
+ *                                             trustResult == kSecTrustResultUnspecified) {
+ *                                             // certificate is trusted
+ *                                             status = errSSLWouldBlock; // so we call SSLHandshake again
+ *                                     } else if (trustResult == kSecTrustResultRecoverableTrustFailure) {
+ *                                             // not trusted, for some reason other than being expired;
+ *                                             // could ask the user whether to allow the connection here
+ *                                             //
+ *                                             status = errSSLXCertChainInvalid;
+ *                                     } else {
+ *                                             // cannot use this certificate (fatal)
+ *                                             status = errSSLBadCert;
+ *                                     }
+ *                             }
+ *                             if (peerTrust) {
+ *                                     CFRelease(peerTrust);
+ *                             }
+ *                     }
+ *             } // errSSLServerAuthCompleted
+ *
+ *     } while (status == errSSLWouldBlock);
+ *
+ */
+OSStatus
+SSLSetAllowsExpiredCerts       (SSLContextRef          context,
+                                                        Boolean                        allowsExpired)
+       __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_2,__MAC_10_9,__IPHONE_NA,__IPHONE_NA);
+
+/*
+ * Obtain the current value of an SSLContext's "allowExpiredCerts" flag.
+ *
+ * ==========================
+ * MAC OS X ONLY (DEPRECATED)
+ * ==========================
+ * NOTE: this function is not available on iOS, and should be considered
+ * deprecated on Mac OS X.
+ */
+OSStatus
+SSLGetAllowsExpiredCerts       (SSLContextRef          context,
+                                                        Boolean                        *allowsExpired) /* RETURNED */
+       __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_2,__MAC_10_9,__IPHONE_NA,__IPHONE_NA);
+
+/*
+ * Similar to SSLSetAllowsExpiredCerts, SSLSetAllowsExpiredRoots allows the
+ * option of ignoring "expired" status for root certificates only.
+ * Default setting is false, i.e., expired root certs result in an
+ * errSSLCertExpired error.
+ *
+ * ==========================
+ * MAC OS X ONLY (DEPRECATED)
+ * ==========================
+ * NOTE: this function is not available on iOS, and should be considered
+ * deprecated on Mac OS X. To ignore expired certificate errors, first disable
+ * Secure Transport's automatic verification of peer certificates by calling
+ * SSLSetSessionOption to set kSSLSessionOptionBreakOnServerAuth to true. When
+ * SSLHandshake subsequently returns an errSSLServerAuthCompleted result,
+ * your code should obtain the SecTrustRef for the peer's certificates and
+ * perform a custom trust evaluation with SecTrust APIs (see SecTrust.h).
+ * The SecTrustSetOptions function allows you to specify that the expiration
+ * status of certificates should be ignored for this evaluation.
+ *
+ * See the description of the SSLSetAllowsExpiredCerts function (above)
+ * for a code example. The kSecTrustOptionAllowExpiredRoot option can be used
+ * instead of kSecTrustOptionAllowExpired to allow expired roots only.
+ */
+OSStatus
+SSLSetAllowsExpiredRoots       (SSLContextRef          context,
+                                                        Boolean                        allowsExpired)
+       __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_2,__MAC_10_9,__IPHONE_NA,__IPHONE_NA);
+
+/*
+ * Obtain the current value of an SSLContext's "allow expired roots" flag.
+ *
+ * ==========================
+ * MAC OS X ONLY (DEPRECATED)
+ * ==========================
+ * NOTE: this function is not available on iOS, and should be considered
+ * deprecated on Mac OS X.
+ */
+OSStatus
+SSLGetAllowsExpiredRoots       (SSLContextRef          context,
+                                                        Boolean                        *allowsExpired) /* RETURNED */
+       __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_2,__MAC_10_9,__IPHONE_NA,__IPHONE_NA);
+
+/*
+ * Specify option of allowing for an unknown root cert, i.e., one which
+ * this software can not verify as one of a list of known good root certs.
+ * Default for this flag is false, in which case one of the following two
+ * errors may occur:
+ *    -- The peer returns a cert chain with a root cert, and the chain
+ *       verifies to that root, but the root is not one of our trusted
+ *       roots. This results in errSSLUnknownRootCert on handshake.
+ *    -- The peer returns a cert chain which does not contain a root cert,
+ *       and we can't verify the chain to one of our trusted roots. This
+ *       results in errSSLNoRootCert on handshake.
+ *
+ * Both of these error conditions are ignored when the AllowAnyRoot flag is
+ * true, allowing connection to a totally untrusted peer.
+ *
+ * ==========================
+ * MAC OS X ONLY (DEPRECATED)
+ * ==========================
+ * NOTE: this function is not available on iOS, and should be considered
+ * deprecated on Mac OS X. To ignore unknown root cert errors, first disable
+ * Secure Transport's automatic verification of peer certificates by calling
+ * SSLSetSessionOption to set kSSLSessionOptionBreakOnServerAuth to true. When
+ * SSLHandshake subsequently returns an errSSLServerAuthCompleted result,
+ * your code should obtain the SecTrustRef for the peer's certificates and
+ * perform a custom trust evaluation with SecTrust APIs (see SecTrust.h).
+ *
+ * See the description of the SSLSetAllowsExpiredCerts function (above)
+ * for a code example. Note that an unknown root certificate will cause
+ * SecTrustEvaluate to report kSecTrustResultRecoverableTrustFailure as the
+ * trust result.
+ */
+OSStatus
+SSLSetAllowsAnyRoot                    (SSLContextRef          context,
+                                                        Boolean                        anyRoot)
+       __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_2,__MAC_10_9,__IPHONE_NA,__IPHONE_NA);
+
+/*
+ * Obtain the current value of an SSLContext's "allow any root" flag.
+ *
+ * ==========================
+ * MAC OS X ONLY (DEPRECATED)
+ * ==========================
+ * NOTE: this function is not available on iOS, and should be considered
+ * deprecated on Mac OS X.
+ */
+OSStatus
+SSLGetAllowsAnyRoot                    (SSLContextRef          context,
+                                                        Boolean                        *anyRoot) /* RETURNED */
+       __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_2,__MAC_10_9,__IPHONE_NA,__IPHONE_NA);
+
+/*
+ * Augment or replace the system's default trusted root certificate set
+ * for this session. If replaceExisting is true, the specified roots will
+ * be the only roots which are trusted during this session. If replaceExisting
+ * is false, the specified roots will be added to the current set of trusted
+ * root certs. If this function has never been called, the current trusted
+ * root set is the same as the system's default trusted root set.
+ * Successive calls with replaceExisting false result in accumulation
+ * of additional root certs.
+ *
+ * The trustedRoots array contains SecCertificateRefs.
+ *
+ * ==========================
+ * MAC OS X ONLY (DEPRECATED)
+ * ==========================
+ * NOTE: this function is not available on iOS, and should be considered
+ * deprecated on Mac OS X. To trust specific roots in a session, first disable
+ * Secure Transport's automatic verification of peer certificates by calling
+ * SSLSetSessionOption to set kSSLSessionOptionBreakOnServerAuth to true. When
+ * SSLHandshake subsequently returns an errSSLServerAuthCompleted result,
+ * your code should obtain the SecTrustRef for the peer's certificates and
+ * perform a custom trust evaluation with SecTrust APIs (see SecTrust.h).
+ *
+ * See the description of the SSLSetAllowsExpiredCerts function (above)
+ * for a code example. You can call SecTrustSetAnchorCertificates to
+ * augment the system's trusted root set, or SecTrustSetAnchorCertificatesOnly
+ * to make these the only trusted roots, prior to calling SecTrustEvaluate.
+ */
+OSStatus
+SSLSetTrustedRoots                     (SSLContextRef          context,
+                                                        CFArrayRef             trustedRoots,
+                                                        Boolean                        replaceExisting)
+       __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_2,__MAC_10_9,__IPHONE_NA,__IPHONE_NA);
+
+/*
+ * Obtain an array of SecCertificateRefs representing the current
+ * set of trusted roots. If SSLSetTrustedRoots() has never been called
+ * for this session, this returns the system's default root set.
+ *
+ * Caller must CFRelease the returned CFArray.
+ *
+ * ==========================
+ * MAC OS X ONLY (DEPRECATED)
+ * ==========================
+ * NOTE: this function is not available on iOS, and should be considered
+ * deprecated on Mac OS X. To get the current set of trusted roots, call the
+ * SSLCopyPeerTrust function to obtain the SecTrustRef for the peer certificate
+ * chain, then SecTrustCopyCustomAnchorCertificates (see SecTrust.h).
+ */
+OSStatus
+SSLCopyTrustedRoots                    (SSLContextRef          context,
+                                                        CFArrayRef             * __nonnull CF_RETURNS_RETAINED trustedRoots)   /* RETURNED */
+       __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_5,__MAC_10_9,__IPHONE_NA,__IPHONE_NA);
+
+/*
+ * Request peer certificates. Valid anytime, subsequent to a handshake attempt.
+ *
+ * The certs argument is a CFArray containing SecCertificateRefs.
+ * Caller must CFRelease the returned array.
+ *
+ * The cert at index 0 of the returned array is the subject (end
+ * entity) cert; the root cert (or the closest cert to it) is at
+ * the end of the returned array.
+ *
+ * ==========================
+ * MAC OS X ONLY (DEPRECATED)
+ * ==========================
+ * NOTE: this function is not available on iOS, and should be considered
+ * deprecated on Mac OS X. To get peer certificates, call SSLCopyPeerTrust
+ * to obtain the SecTrustRef for the peer certificate chain, then use the
+ * SecTrustGetCertificateCount and SecTrustGetCertificateAtIndex functions
+ * to retrieve individual certificates in the chain (see SecTrust.h).
+ */
+OSStatus
+SSLCopyPeerCertificates                (SSLContextRef          context,
+                                                        CFArrayRef                     * __nonnull CF_RETURNS_RETAINED certs)          /* RETURNED */
+       __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_5,__MAC_10_9,__IPHONE_NA,__IPHONE_NA);
+
+#endif /* MAC OS X */
+
+/*
+ * Obtain a SecTrustRef representing peer certificates. Valid anytime,
+ * subsequent to a handshake attempt. Caller must CFRelease the returned
+ * trust reference.
+ *
+ * The returned trust reference will have already been evaluated for you,
+ * unless one of the following is true:
+ * - Your code has disabled automatic certificate verification, by calling
+ *   SSLSetSessionOption to set kSSLSessionOptionBreakOnServerAuth to true.
+ * - Your code has called SSLSetPeerID, and this session has been resumed
+ *   from an earlier cached session.
+ *
+ * In these cases, your code should call SecTrustEvaluate prior to
+ * examining the peer certificate chain or trust results (see SecTrust.h).
+ *
+ * NOTE: if you have not called SSLHandshake at least once prior to
+ * calling this function, the returned trust reference will be NULL.
+ */
+OSStatus
+SSLCopyPeerTrust                       (SSLContextRef          context,
+                                                        SecTrustRef            * __nonnull CF_RETURNS_RETAINED trust)          /* RETURNED */
+       __OSX_AVAILABLE_STARTING(__MAC_10_6, __IPHONE_5_0);
+
+/*
+ * Specify some data, opaque to this library, which is sufficient
+ * to uniquely identify the peer of the current session. An example
+ * would be IP address and port, stored in some caller-private manner.
+ * To be optionally called prior to SSLHandshake for the current
+ * session. This is mandatory if this session is to be resumable.
+ *
+ * SecureTransport allocates its own copy of the incoming peerID. The
+ * data provided in *peerID, while opaque to SecureTransport, is used
+ * in a byte-for-byte compare to other previous peerID values set by the
+ * current application. Matching peerID blobs result in SecureTransport
+ * attempting to resume an SSL session with the same parameters as used
+ * in the previous session which specified the same peerID bytes.
+ */
+OSStatus
+SSLSetPeerID                           (SSLContextRef          context,
+                                                        const void             * __nullable peerID,
+                                                        size_t                         peerIDLen)
+       __OSX_AVAILABLE_STARTING(__MAC_10_2, __IPHONE_5_0);
+
+/*
+ * Obtain current PeerID. Returns NULL pointer, zero length if
+ * SSLSetPeerID has not been called for this context.
+ */
+OSStatus
+SSLGetPeerID                           (SSLContextRef          context,
+                                                        const void             * __nullable * __nonnull peerID,
+                                                        size_t                         *peerIDLen)
+       __OSX_AVAILABLE_STARTING(__MAC_10_2, __IPHONE_5_0);
+
+/*
+ * Obtain the SSLCipherSuite (e.g., SSL_RSA_WITH_DES_CBC_SHA) negotiated
+ * for this session. Only valid when a session is active.
+ */
+OSStatus
+SSLGetNegotiatedCipher         (SSLContextRef          context,
+                                                        SSLCipherSuite         *cipherSuite)
+       __OSX_AVAILABLE_STARTING(__MAC_10_2, __IPHONE_5_0);
+
+
+/********************************************************
+ *** Session context configuration, server side only. ***
+ ********************************************************/
+
+/*
+ * This function is deprecated in OSX 10.11 and iOS 9.0 and
+ * has no effect on the TLS handshake since OSX 10.10 and
+ * iOS 8.0. Using separate RSA certificates for encryption
+ * and signing is no longer supported.
+ */
+OSStatus
+SSLSetEncryptionCertificate    (SSLContextRef          context,
+                                                        CFArrayRef                     certRefs)
+       __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_2, __MAC_10_11, __IPHONE_5_0, __IPHONE_9_0);
+
+/*
+ * Specify requirements for client-side authentication.
+ * Optional; Default is kNeverAuthenticate.
+ *
+ * Can only be called when no session is active.
+ */
+typedef CF_ENUM(int, SSLAuthenticate) {
+       kNeverAuthenticate,                     /* skip client authentication */
+       kAlwaysAuthenticate,            /* require it */
+       kTryAuthenticate                        /* try to authenticate, but not an error
+                                                                * if client doesn't have a cert */
+};
+
+OSStatus
+SSLSetClientSideAuthenticate   (SSLContextRef          context,
+                                                                SSLAuthenticate        auth)
+       __OSX_AVAILABLE_STARTING(__MAC_10_2, __IPHONE_5_0);
+
+/*
+ * Add a DER-encoded distinguished name to list of acceptable names
+ * to be specified in requests for client certificates.
+ */
+OSStatus
+SSLAddDistinguishedName                (SSLContextRef          context,
+                                                        const void             * __nullable derDN,
+                                                        size_t                         derDNLen)
+       __OSX_AVAILABLE_STARTING(__MAC_10_4, __IPHONE_5_0);
+
+
+#if (TARGET_OS_MAC && !(TARGET_OS_EMBEDDED || TARGET_OS_IPHONE))
+/*
+ * Add a SecCertificateRef, or a CFArray of them, to a server's list
+ * of acceptable Certificate Authorities (CAs) to present to the client
+ * when client authentication is performed.
+ *
+ * If replaceExisting is true, the specified certificate(s) will replace
+ * a possible existing list of acceptable CAs. If replaceExisting is
+ * false, the specified certificate(s) will be appended to the existing
+ * list of acceptable CAs, if any.
+ *
+ * Returns errSecParam if this is called on a SSLContextRef which
+ * is configured as a client, or when a session is active.
+ *
+ * NOTE: this function is currently not available on iOS.
+ */
+OSStatus
+SSLSetCertificateAuthorities(SSLContextRef             context,
+                                                        CFTypeRef                      certificateOrArray,
+                                                        Boolean                        replaceExisting)
+       __OSX_AVAILABLE_STARTING(__MAC_10_5, __IPHONE_NA);
+
+/*
+ * Obtain the certificates specified in SSLSetCertificateAuthorities(),
+ * if any. Returns a NULL array if SSLSetCertificateAuthorities() has not
+ * been called.
+ * Caller must CFRelease the returned array.
+ *
+ * NOTE: this function is currently not available on iOS.
+ */
+OSStatus
+SSLCopyCertificateAuthorities(SSLContextRef            context,
+                                                         CFArrayRef            * __nonnull CF_RETURNS_RETAINED certificates)   /* RETURNED */
+       __OSX_AVAILABLE_STARTING(__MAC_10_5, __IPHONE_NA);
+
+#endif /* MAC OS X */
+
+/*
+ * Obtain the list of acceptable distinguished names as provided by
+ * a server (if the SSLContextRef is configured as a client), or as
+ * specified by SSLSetCertificateAuthorities (if the SSLContextRef
+ * is configured as a server).
+ * The returned array contains CFDataRefs, each of which represents
+ * one DER-encoded RDN.
+ *
+ * Caller must CFRelease the returned array.
+ */
+OSStatus
+SSLCopyDistinguishedNames      (SSLContextRef          context,
+                                                        CFArrayRef                     * __nonnull CF_RETURNS_RETAINED names)
+       __OSX_AVAILABLE_STARTING(__MAC_10_5, __IPHONE_5_0);
+
+/*
+ * Obtain client certificate exchange status. Can be called
+ * any time. Reflects the *last* client certificate state change;
+ * subsequent to a renegotiation attempt by either peer, the state
+ * is reset to kSSLClientCertNone.
+ */
+OSStatus
+SSLGetClientCertificateState   (SSLContextRef                          context,
+                                                                SSLClientCertificateState      *clientState)
+       __OSX_AVAILABLE_STARTING(__MAC_10_3, __IPHONE_5_0);
+
+
+#if (TARGET_OS_MAC && !(TARGET_OS_EMBEDDED || TARGET_OS_IPHONE))
+/*
+ * Specify Diffie-Hellman parameters. Optional; if we are configured to allow
+ * for D-H ciphers and a D-H cipher is negotiated, and this function has not
+ * been called, a set of process-wide parameters will be calculated. However
+ * that can take a long time (30 seconds).
+ *
+ * NOTE: this function is currently not available on iOS.
+ */
+OSStatus SSLSetDiffieHellmanParams     (SSLContextRef                  context,
+                                                                        const void                     * __nullable dhParams,
+                                                                        size_t                                 dhParamsLen)
+       __OSX_AVAILABLE_STARTING(__MAC_10_2, __IPHONE_NA);
+
+/*
+ * Return parameter block specified in SSLSetDiffieHellmanParams.
+ * Returned data is not copied and belongs to the SSLContextRef.
+ *
+ * NOTE: this function is currently not available on iOS.
+ */
+OSStatus SSLGetDiffieHellmanParams     (SSLContextRef                  context,
+                                                                        const void                     * __nullable * __nonnull dhParams,
+                                                                        size_t                                 *dhParamsLen)
+       __OSX_AVAILABLE_STARTING(__MAC_10_2, __IPHONE_NA);
+
+/*
+ * Enable/Disable RSA blinding. This feature thwarts a known timing
+ * attack to which RSA keys are vulnerable; enabling it is a tradeoff
+ * between performance and security. The default for RSA blinding is
+ * enabled.
+ *
+ * ==========================
+ * MAC OS X ONLY (DEPRECATED)
+ * ==========================
+ * NOTE: this function is not available on iOS, and should be considered
+ * deprecated on Mac OS X. RSA blinding is enabled unconditionally, as
+ * it prevents a known way for an attacker to recover the private key,
+ * and the performance gain of disabling it is negligible.
+ */
+OSStatus SSLSetRsaBlinding                     (SSLContextRef                  context,
+                                                                        Boolean                                blinding)
+       __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_2,__MAC_10_9,__IPHONE_NA,__IPHONE_NA);
+
+OSStatus SSLGetRsaBlinding                     (SSLContextRef                  context,
+                                                                        Boolean                                *blinding)
+       __OSX_AVAILABLE_BUT_DEPRECATED(__MAC_10_2,__MAC_10_9,__IPHONE_NA,__IPHONE_NA);
+
+#endif /* MAC OS X */
+
+/*******************************
+ ******** I/O Functions ********
+ *******************************/
+
+/*
+ * Note: depending on the configuration of the underlying I/O
+ * connection, all SSL I/O functions can return errSSLWouldBlock,
+ * indicating "not complete, nothing is wrong, except required
+ * I/O hasn't completed". Caller may need to repeat I/Os as necessary
+ * if the underlying connection has been configured to behave in
+ * a non-blocking manner.
+ */
+
+/*
+ * Perform the SSL handshake. On successful return, session is
+ * ready for normal secure application I/O via SSLWrite and SSLRead.
+ *
+ * Interesting error returns:
+ *
+ *  errSSLUnknownRootCert: Peer had a valid cert chain, but the root of
+ *      the chain is unknown.
+ *
+ *  errSSLNoRootCert: Peer had a cert chain which did not end in a root.
+ *
+ *  errSSLCertExpired: Peer's cert chain had one or more expired certs.
+ *
+ *  errSSLXCertChainInvalid: Peer had an invalid cert chain (i.e.,
+ *      signature verification within the chain failed, or no certs
+ *      were found).
+ *
+ *  In all of the above errors, the handshake was aborted; the peer's
+ *  cert chain is available via SSLCopyPeerTrust or SSLCopyPeerCertificates.
+ *
+ *  Other interesting result codes:
+ *
+ *  errSSLPeerAuthCompleted: Peer's cert chain is valid, or was ignored if
+ *      cert verification was disabled via SSLSetEnableCertVerify. The application
+ *      may decide to continue with the handshake (by calling SSLHandshake
+ *      again), or close the connection at this point.
+ *
+ *  errSSLClientCertRequested: The server has requested a client certificate.
+ *      The client may choose to examine the server's certificate and
+ *      distinguished name list, then optionally call SSLSetCertificate prior
+ *      to resuming the handshake by calling SSLHandshake again.
+ *
+ * A return value of errSSLWouldBlock indicates that SSLHandshake has to be
+ * called again (and again and again until something else is returned).
+ */
+OSStatus
+SSLHandshake                           (SSLContextRef          context)
+       __OSX_AVAILABLE_STARTING(__MAC_10_2, __IPHONE_5_0);
+
+/*
+ * Normal application-level read/write. On both of these, a errSSLWouldBlock
+ * return and a partially completed transfer - or even zero bytes transferred -
+ * are NOT mutually exclusive.
+ */
+OSStatus
+SSLWrite                                       (SSLContextRef          context,
+                                                        const void *           __nullable data,
+                                                        size_t                         dataLength,
+                                                        size_t                         *processed)             /* RETURNED */
+       __OSX_AVAILABLE_STARTING(__MAC_10_2, __IPHONE_5_0);
+
+/*
+ * data is mallocd by caller; available size specified in
+ * dataLength; actual number of bytes read returned in
+ * *processed.
+ */
+OSStatus
+SSLRead                                                (SSLContextRef          context,
+                                                        void *                         data,                   /* RETURNED */
+                                                        size_t                         dataLength,
+                                                        size_t                         *processed)             /* RETURNED */
+       __OSX_AVAILABLE_STARTING(__MAC_10_2, __IPHONE_5_0);
+
+/*
+ * Determine how much data the client can be guaranteed to
+ * obtain via SSLRead() without blocking or causing any low-level
+ * read operations to occur.
+ */
+OSStatus
+SSLGetBufferedReadSize         (SSLContextRef context,
+                                                        size_t *bufSize)                                       /* RETURNED */
+       __OSX_AVAILABLE_STARTING(__MAC_10_2, __IPHONE_5_0);
+
+/*
+ * Determine how much data the application can be guaranteed to write
+ * with SSLWrite() without causing fragmentation. The value is based on
+ * the maximum Datagram Record size defined by the application with
+ * SSLSetMaxDatagramRecordSize(), minus the DTLS Record header size.
+ */
+OSStatus
+SSLGetDatagramWriteSize                (SSLContextRef dtlsContext,
+                                                        size_t *bufSize)
+       __OSX_AVAILABLE_STARTING(__MAC_10_8, __IPHONE_5_0);
+
+/*
+ * Terminate current SSL session.
+ */
+OSStatus
+SSLClose                                       (SSLContextRef          context)
+       __OSX_AVAILABLE_STARTING(__MAC_10_2, __IPHONE_5_0);
+
+/*
+ * Set the minimum acceptable strength of policy to be negotiated for an
+ * ATS session
+ */
+OSStatus
+SSLSetSessionStrengthPolicy(SSLContextRef context,
+                            SSLSessionStrengthPolicy policyStrength);
+
+CF_IMPLICIT_BRIDGING_DISABLED
+CF_ASSUME_NONNULL_END
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* !_SECURITY_SECURETRANSPORT_H_ */