SecureTransportPriv.h   [plain text]


/*
 * Copyright (c) 1999-2001,2005-2012 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@
 */

/*
 * SecureTransportPriv.h - Apple-private exported routines
 */

#ifndef	_SECURE_TRANSPORT_PRIV_H_
#define _SECURE_TRANSPORT_PRIV_H_	1

#include <Security/SecureTransport.h>
#include <Security/SecTrust.h>

#ifdef __cplusplus
extern "C" {
#endif

#include "sslTypes.h"

/* Create an SSL Context with an external record layer - eg: kernel accelerated layer */
SSLContextRef
SSLCreateContextWithRecordFuncs(CFAllocatorRef alloc,
                                SSLProtocolSide protocolSide,
                                SSLConnectionType connectionType,
                                const struct SSLRecordFuncs *recFuncs);

/* Set the external record layer context */
OSStatus
SSLSetRecordContext         (SSLContextRef          ctx,
                             SSLRecordContextRef    recCtx);

/* The size of of client- and server-generated random numbers in hello messages. */
#define SSL_CLIENT_SRVR_RAND_SIZE		32

/* The size of the pre-master and master secrets. */
#define SSL_RSA_PREMASTER_SECRET_SIZE	48
#define SSL_MASTER_SECRET_SIZE			48

/*
 * For the following three functions, *size is the available
 * buffer size on entry and the actual size of the data returned
 * on return. The above consts are for convenience.
 */
OSStatus SSLInternalMasterSecret(
   SSLContextRef context,
   void *secret,         // mallocd by caller, SSL_MASTER_SECRET_SIZE
   size_t *secretSize);  // in/out

OSStatus SSLInternalServerRandom(
   SSLContextRef context,
   void *randBuf, 			// mallocd by caller, SSL_CLIENT_SRVR_RAND_SIZE
   size_t *randSize);	// in/out

OSStatus SSLInternalClientRandom(
   SSLContextRef context,
   void *randBuf,  		// mallocd by caller, SSL_CLIENT_SRVR_RAND_SIZE
   size_t *randSize);	// in/out

/*
 * Obtain the sizes of the currently negotiated HMAC digest, session
 * key, and session key IV.
 */
OSStatus SSLGetCipherSizes(
	SSLContextRef context,
	size_t *digestSize,
	size_t *symmetricKeySize,
	size_t *ivSize);

OSStatus SSLInternal_PRF(
   SSLContextRef context,
   const void *secret,
   size_t secretLen,
   const void *label,
   size_t labelLen,
   const void *seed,
   size_t seedLen,
   void *out,   		// mallocd by caller, length >= outLen
   size_t outLen);

/*
 * Obtain a SecTrustRef representing peer certificates. Valid anytime,
 * subsequent to a handshake attempt. The returned SecTrustRef is valid
 * only as long as the SSLContextRef is.
 */
OSStatus
SSLGetPeerSecTrust			(SSLContextRef 		context,
							 SecTrustRef		*secTrust);	/* RETURNED */

/*
 * Obtain resumable session info. Can be called anytime subsequent to
 * handshake attempt.
 *
 * if sessionWasResumed is True on return, the session is indeed a
 * resumed session; the sessionID (an opaque blob generated by the
 * server) is returned in *sessionID. The length of the sessionID
 * is returned in *sessionIDLength. Caller must allocate the
 * sessionID buffer; it max size is MAX_SESSION_ID_LENGTH bytes.
 */
#define MAX_SESSION_ID_LENGTH	32

OSStatus
SSLGetResumableSessionInfo	(
	SSLContextRef	context,
	Boolean			*sessionWasResumed,		// RETURNED
	void			*sessionID,				// RETURNED, mallocd by caller
	size_t			*sessionIDLength);		// IN/OUT

/*
 * Getters for SSLSetCertificate() and SSLSetEncryptionCertificate()
 */
OSStatus
SSLGetCertificate (
	SSLContextRef	context,
	CFArrayRef		*certRefs);				// RETURNED, *not* retained

OSStatus
SSLGetEncryptionCertificate (
	SSLContextRef	context,
	CFArrayRef		*certRefs);				// RETURNED, *not* retained

/*
 * Getter for SSLSetClientSideAuthenticate()
 */
OSStatus
SSLGetClientSideAuthenticate (
	SSLContextRef	context,
	SSLAuthenticate	*auth);					// RETURNED

/*
 * Get/set array of trusted leaf certificates.
 *
 * If none have been set previously with SSLSetTrustedLeafCertificates(),
 * then SSLCopyTrustedLeafCertificates() will return NULL with errSecSuccess.
 */
OSStatus
SSLSetTrustedLeafCertificates (
	SSLContextRef	context,
	CFArrayRef 		certRefs);

OSStatus
SSLCopyTrustedLeafCertificates (
	SSLContextRef	context,
	CFArrayRef 		*certRefs);				// RETURNED, caller must release

/*
 * Get/set enable of anonymous ciphers. Default is enabled.
 *
 * SSLSetAllowAnonymousCiphers() returns errSecBadReq if SSLSetEnabledCiphers()
 * has already been called.
 *
 * The enable state set by SSLSetAllowAnonymousCiphers() is ignored if
 * SSLSetEnabledCiphers() is called after SSLSetAllowAnonymousCiphers() is
 * called, i.e., SSLSetEnabledCiphers() overrides SSLSetAllowAnonymousCiphers().
 *
 * NOTE: "Anonymous" ciphers include those ciphers that perform no encryption,
 * as well as ciphers that perform no authentication, since neither are secure.
 */
OSStatus
SSLSetAllowAnonymousCiphers(
	SSLContextRef	context,
	Boolean			enable);

OSStatus
SSLGetAllowAnonymousCiphers(
	SSLContextRef	context,
	Boolean			*enable);

/*
 * Override the default session cache timeout for a cache entry created for
 * the current session.
 */
OSStatus
SSLSetSessionCacheTimeout(
	SSLContextRef context,
	uint32_t timeoutInSeconds);

/*
 * Callback function for EAP-style PAC-based session resumption.
 * This function is called by SecureTransport to obtain the
 * master secret.
 */
typedef void (*SSLInternalMasterSecretFunction)(
	SSLContextRef ctx,
	const void *arg,		/* opaque to SecureTransport; app-specific */
	void *secret,			/* mallocd by caller, SSL_MASTER_SECRET_SIZE */
	size_t *secretLength);  /* in/out */

/*
 * Register a callback for obtaining the master_secret when performing
 * PAC-based session resumption. At the time the callback is called,
 * the following are guaranteed to be valid:
 *
 *  -- serverRandom (via SSLInternalServerRandom())
 *  -- clientRandom (via SSLInternalClientRandom())
 *  -- negotiated protocol version (via SSLGetNegotiatedProtocolVersion())
 *  -- negotiated CipherSuite (via SSLGetNegotiatedCipher())
 *
 * Currently, PAC-based session resumption is only implemented on
 * the client side for Deployment builds.
 *
 * On the client side, this callback occurs if/when the server sends a
 * ChangeCipherSpec message immediately following its ServerHello
 * message (i.e., it's skipped the entire Key Exchange phase of
 * negotiation).
 *
 * On the server side (Development builds only) this callback occurs
 * immediately upon receipt of the Client Hello message, before we send
 * the Server Hello.
 */
OSStatus
SSLInternalSetMasterSecretFunction(
	SSLContextRef ctx,
	SSLInternalMasterSecretFunction mFunc,
	const void *arg);		/* opaque to SecureTransport; app-specific */

/*
 * Provide an opaque SessionTicket for use in PAC-based session
 * resumption. Client side only. The provided ticket is sent in
 * the ClientHello message as a SessionTicket extension.
 * The maximum ticketLength is 2**16-1.
 */
OSStatus SSLInternalSetSessionTicket(
   SSLContextRef ctx,
   const void *ticket,
   size_t ticketLength);

/*
 * Support for specifying and obtaining ECC curves, used with the ECDH-based
 * ciphersuites.
 */

/*
 * These are the named curves from RFC 4492
 * section 5.1.1, with the exception of SSL_Curve_None which means
 * "ECDSA not negotiated".
 */
typedef enum
{
	SSL_Curve_None = -1,

    SSL_Curve_sect163k1 = 1,
    SSL_Curve_sect163r1 = 2,
    SSL_Curve_sect163r2 = 3,
    SSL_Curve_sect193r1 = 4,
    SSL_Curve_sect193r2 = 5,
    SSL_Curve_sect233k1 = 6,
    SSL_Curve_sect233r1 = 7,
    SSL_Curve_sect239k1 = 8,
    SSL_Curve_sect283k1 = 9,
    SSL_Curve_sect283r1 = 10,
    SSL_Curve_sect409k1 = 11,
    SSL_Curve_sect409r1 = 12,
    SSL_Curve_sect571k1 = 13,
    SSL_Curve_sect571r1 = 14,
    SSL_Curve_secp160k1 = 15,
    SSL_Curve_secp160r1 = 16,
    SSL_Curve_secp160r2 = 17,
    SSL_Curve_secp192k1 = 18,
    SSL_Curve_secp192r1 = 19,
    SSL_Curve_secp224k1 = 20,
    SSL_Curve_secp224r1 = 21,
    SSL_Curve_secp256k1 = 22,

    /* These are the ones we actually support */
	SSL_Curve_secp256r1 = 23,
	SSL_Curve_secp384r1 = 24,
	SSL_Curve_secp521r1 = 25
} SSL_ECDSA_NamedCurve;

/*
 * Obtain the SSL_ECDSA_NamedCurve negotiated during a handshake.
 * Returns errSecParam if no ECDH-related ciphersuite was negotiated.
 */
extern OSStatus SSLGetNegotiatedCurve(
   SSLContextRef ctx,
   SSL_ECDSA_NamedCurve *namedCurve);    /* RETURNED */

/*
 * Obtain the number of currently enabled SSL_ECDSA_NamedCurves.
 */
extern OSStatus SSLGetNumberOfECDSACurves(
   SSLContextRef ctx,
   unsigned *numCurves);				/* RETURNED */

/*
 * Obtain the ordered list of currently enabled SSL_ECDSA_NamedCurves.
 * Caller allocates returned array and specifies its size (in
 * SSL_ECDSA_NamedCurves) in *numCurves on entry; *numCurves
 * is the actual size of the returned array on successful return.
 */
extern OSStatus SSLGetECDSACurves(
   SSLContextRef ctx,
   SSL_ECDSA_NamedCurve *namedCurves,	/* RETURNED */
   unsigned *numCurves);				/* IN/OUT */

/*
 * Specify ordered list of allowable named curves.
 */
extern OSStatus SSLSetECDSACurves(
   SSLContextRef ctx,
   const SSL_ECDSA_NamedCurve *namedCurves,
   unsigned numCurves);

/*
 * Server-specified client authentication mechanisms.
 */
typedef enum {
	/* doesn't appear on the wire */
	SSLClientAuthNone = -1,
	/* RFC 2246 7.4.6 */
	SSLClientAuth_RSASign = 1,
	SSLClientAuth_DSSSign = 2,
	SSLClientAuth_RSAFixedDH = 3,
	SSLClientAuth_DSS_FixedDH = 4,
	/* RFC 4492 5.5 */
	SSLClientAuth_ECDSASign = 64,
	SSLClientAuth_RSAFixedECDH = 65,
	SSLClientAuth_ECDSAFixedECDH = 66
} SSLClientAuthenticationType;

/* TLS 1.2 Signature Algorithms extension values for hash field. */
typedef enum {
    SSL_HashAlgorithmNone = 0,
    SSL_HashAlgorithmMD5 = 1,
    SSL_HashAlgorithmSHA1 = 2,
    SSL_HashAlgorithmSHA224 = 3,
    SSL_HashAlgorithmSHA256 = 4,
    SSL_HashAlgorithmSHA384 = 5,
    SSL_HashAlgorithmSHA512 = 6
} SSL_HashAlgorithm;

/* TLS 1.2 Signature Algorithms extension values for signature field. */
typedef enum {
    SSL_SignatureAlgorithmAnonymous = 0,
    SSL_SignatureAlgorithmRSA = 1,
    SSL_SignatureAlgorithmDSA = 2,
    SSL_SignatureAlgorithmECDSA = 3
} SSL_SignatureAlgorithm;

typedef struct {
    SSL_HashAlgorithm hash;
    SSL_SignatureAlgorithm signature;
} SSLSignatureAndHashAlgorithm;

/*
 * Obtain the number of client authentication mechanisms specified by
 * the server in its Certificate Request message.
 * Returns errSecParam if server hasn't sent a Certificate Request message
 * (i.e., client certificate state is kSSLClientCertNone).
 */
extern OSStatus SSLGetNumberOfClientAuthTypes(
	SSLContextRef ctx,
	unsigned *numTypes);

/*
 * Obtain the client authentication mechanisms specified by
 * the server in its Certificate Request message.
 * Caller allocates returned array and specifies its size (in
 * SSLClientAuthenticationTypes) in *numType on entry; *numTypes
 * is the actual size of the returned array on successful return.
 */
extern OSStatus SSLGetClientAuthTypes(
   SSLContextRef ctx,
   SSLClientAuthenticationType *authTypes,		/* RETURNED */
   unsigned *numTypes);							/* IN/OUT */

/*
 * Obtain the SSLClientAuthenticationType actually performed.
 * Only valid if client certificate state is kSSLClientCertSent
 * or kSSLClientCertRejected; SSLClientAuthNone is returned as
 * the negotiated auth type otherwise.
 */
extern OSStatus SSLGetNegotiatedClientAuthType(
   SSLContextRef ctx,
   SSLClientAuthenticationType *authType);		/* RETURNED */

/*
 * Obtain the number of supported_signature_algorithms specified by
 * the server in its Certificate Request message.
 * Returns errSecParam if server hasn't sent a Certificate Request message
 * (i.e., client certificate state is kSSLClientCertNone).
 */
extern OSStatus SSLGetNumberOfSignatureAlgorithms(
    SSLContextRef ctx,
    unsigned *numSigAlgs);

/*
 * Obtain the supported_signature_algorithms specified by
 * the server in its Certificate Request message.
 * Caller allocates returned array and specifies its size (in
 * SSLClientAuthenticationTypes) in *numType on entry; *numTypes
 * is the actual size of the returned array on successful return.
 */
extern OSStatus SSLGetSignatureAlgorithms(
    SSLContextRef ctx,
    SSLSignatureAndHashAlgorithm *sigAlgs,		/* RETURNED */
    unsigned *numSigAlgs);							/* IN/OUT */

/* PSK SPIs */

/* Set the Shared Secret for PSK CipherSuite.
   This need to be set before the handshake starts. */
OSStatus SSLSetPSKSharedSecret(SSLContextRef ctx,
                               const void *secret,
                               size_t secretLen);

/* Set the Client identity for PSK CipherSuite.
   This need to be set before the handshake starts.
   Only useful for client side.*/
OSStatus SSLSetPSKIdentity(SSLContextRef ctx,
                           const void *pskIdentity,
                           size_t pskIdentityLen);

/* For client side, get the identity previously set by SSLSetPSKIdentity.
   For server side, get the identity provided by the client during the handshake.
   Might be NULL if not set. identity is owned by the SSLContext and is invalid once
   the SSLContext is released.
 */
OSStatus SSLGetPSKIdentity(SSLContextRef ctx,
                           const void **pskIdentity,
                           size_t *pskIdentityLen);
    
#if TARGET_OS_IPHONE

/* Following are SPIs on iOS */

/*
 * 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
 *
 * This is deprecated in favor of SSLSetProtocolVersionMax/SSLSetProtocolVersionMin
 */
OSStatus
_SSLSetProtocolVersionEnabled (SSLContextRef 	context,
                              SSLProtocol		protocol,
                               Boolean			enable);

/*
 * Obtain a value specified in SSLSetProtocolVersionEnabled.
 *
 * This is deprecated in favor of SSLGetProtocolVersionMax/SSLGetProtocolVersionMin
 */
OSStatus
_SSLGetProtocolVersionEnabled(SSLContextRef 		context,
                             SSLProtocol		protocol,
                              Boolean			*enable);		/* RETURNED */

/*
 * Get/set SSL protocol version; optional. Default is kSSLProtocolUnknown,
 * in which case the highest possible version (currently kTLSProtocol1)
 * is attempted, but a lower version is accepted if the peer requires it.
 *
 * SSLSetProtocolVersion can not be called when a session is active.
 *
 * This is deprecated in favor of SSLSetProtocolVersionEnabled.
 *
 * This is deprecated in favor of SSLSetProtocolVersionMax/SSLSetProtocolVersionMin
 */
OSStatus
_SSLSetProtocolVersion		(SSLContextRef 		context,
                             SSLProtocol		version);

/*
 * Obtain the protocol version specified in SSLSetProtocolVersion.
 * This is deprecated in favor of SSLGetProtocolVersionEnabled.
 * 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).
 *
 * This is deprecated in favor of SSLGetProtocolVersionMax/SSLGetProtocolVersionMin
 */
OSStatus
_SSLGetProtocolVersion		(SSLContextRef		context,
                             SSLProtocol		*protocol);		/* RETURNED */

/* API REVIEW:
 The following 15 calls were used to change the behaviour of the trust
 evaluation of the certificate chain.
 The proper alternative is to break out of the handshake, get the
 peer's SecTrustRef with SSLCopyPeerTrust and evaluate that.
 */

/*
 * Enable/disable peer certificate chain validation. Default is enabled.
 * If caller disables, it is the caller's responsibility to call
 * SSLCopyPeerTrust() upon successful completion of the handshake
 * and then to perform external validation of the peer certificate
 * chain before proceeding with data transfer.
 */
OSStatus
_SSLSetEnableCertVerify		(SSLContextRef 			context,
                             Boolean				enableVerify);

OSStatus
_SSLGetEnableCertVerify		(SSLContextRef 			context,
                             Boolean				*enableVerify);	/* RETURNED */

/*
 * Specify the option of ignoring certificates' "expired" times.
 * This is a common failure in the real SSL world. Default for
 * this flag is false, meaning expired certs result in a
 * errSSLCertExpired error.
 */
OSStatus
_SSLSetAllowsExpiredCerts	(SSLContextRef		context,
                             Boolean			allowsExpired);

/*
 * Obtain the current value of an SSLContext's "allowExpiredCerts" flag.
 */
OSStatus
_SSLGetAllowsExpiredCerts	(SSLContextRef		context,
                             Boolean			*allowsExpired); /* RETURNED */

/*
 * Similar to SSLSetAllowsExpiredCerts(), this function allows the
 * option of ignoring "expired" status for root certificates only.
 * Default is false, i.e., expired root certs result in an
 * errSSLCertExpired error.
 */
OSStatus
_SSLSetAllowsExpiredRoots	(SSLContextRef		context,
                             Boolean			allowsExpired);

OSStatus
_SSLGetAllowsExpiredRoots	(SSLContextRef		context,
                             Boolean			*allowsExpired); /* RETURNED */

/*
 * 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.
 */
OSStatus
_SSLSetAllowsAnyRoot			(SSLContextRef		context,
                                 Boolean			anyRoot);

/*
 * Obtain the current value of an SSLContext's "allow any root" flag.
 */
OSStatus
_SSLGetAllowsAnyRoot			(SSLContextRef		context,
                                 Boolean			*anyRoot); /* RETURNED */

/*
 * 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.
 */
OSStatus
_SSLSetTrustedRoots			(SSLContextRef 		context,
                             CFArrayRef 		trustedRoots,
                             Boolean 			replaceExisting);

/*
 * 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.
 */
OSStatus
_SSLCopyTrustedRoots			(SSLContextRef 		context,
                                 CFArrayRef 		*trustedRoots);	/* RETURNED */

/*
 * 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 is this is called on an SSLContextRef which
 * is configured as a client, or when a session is active.
 */
OSStatus
_SSLSetCertificateAuthorities(SSLContextRef		context,
                             CFTypeRef			certificateOrArray,
                              Boolean 			replaceExisting);

/*
 * Obtain the certificates specified in SSLSetCertificateAuthorities(),
 * if any. Returns a NULL array if SSLSetCertificateAuthorities() has not
 * been called.
 * Caller must CFRelease the returned array.
 */

OSStatus
_SSLCopyCertificateAuthorities(SSLContextRef		context,
                              CFArrayRef		*certificates);	/* RETURNED */

/*
 * 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.
 */
/* API REVIEW:
 This should be removed so that applications are not tempted to
 use this to evaluate trust, they should use the SecTrustRef returned
 by SSLCopyPeerTrust instead.
 But this maybe useful to know which certs where returned by the server
 vs which where pulled internally.
 This would be a debug feature, so we deprecate this in iOS. There
 should be an API in SecTrust to allow getting the original certificates
 for debug purpose.
 */
OSStatus
_SSLCopyPeerCertificates		(SSLContextRef 		context,
                             CFArrayRef			*certs);	/* RETURNED */

/*
 * 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).
 */
OSStatus _SSLSetDiffieHellmanParams	(SSLContextRef			context,
                                     const void 			*dhParams,
                                     size_t					dhParamsLen);

/*
 * Return parameter block specified in SSLSetDiffieHellmanParams.
 * Returned data is not copied and belongs to the SSLContextRef.
 */
OSStatus _SSLGetDiffieHellmanParams	(SSLContextRef			context,
                                     const void 			**dhParams,
                                     size_t					*dhParamsLen);

/*
 * 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.
 */
OSStatus _SSLSetRsaBlinding			(SSLContextRef			context,
                                     Boolean				blinding);

OSStatus _SSLGetRsaBlinding			(SSLContextRef			context,
                                     Boolean				*blinding);

/*
 * Create a new SSL/TLS session context.
 * Deprecated: please use the allocator based functions, when available.
 */
OSStatus
_SSLNewContext				(Boolean 			isServer,
                             SSLContextRef 		*tlsContextPtr);     /* RETURNED */

/*
 * Dispose of an SSLContextRef.  This is effectivly a CFRelease.
 * Deprecated.
 */
OSStatus
_SSLDisposeContext			(SSLContextRef		context);

/* We redefine the names of all SPIs to avoid collision with unavailable APIs */
#define SSLSetProtocolVersionEnabled _SSLSetProtocolVersionEnabled
#define SSLGetProtocolVersionEnabled _SSLGetProtocolVersionEnabled
#define SSLSetProtocolVersion _SSLSetProtocolVersion
#define SSLGetProtocolVersion _SSLGetProtocolVersion
#define SSLSetEnableCertVerify _SSLSetEnableCertVerify
#define SSLGetEnableCertVerify _SSLGetEnableCertVerify
#define SSLSetAllowsExpiredCerts _SSLSetAllowsExpiredCerts
#define SSLGetAllowsExpiredCerts _SSLGetAllowsExpiredCerts
#define SSLSetAllowsExpiredRoots _SSLSetAllowsExpiredRoots
#define SSLGetAllowsExpiredRoots _SSLGetAllowsExpiredRoots
#define SSLSetAllowsAnyRoot _SSLSetAllowsAnyRoot
#define SSLGetAllowsAnyRoot _SSLGetAllowsAnyRoot
#define SSLSetTrustedRoots _SSLSetTrustedRoots
#define SSLCopyTrustedRoots _SSLCopyTrustedRoots
#define SSLSetCertificateAuthorities _SSLSetCertificateAuthorities
#define SSLCopyCertificateAuthorities _SSLCopyCertificateAuthorities
#define SSLCopyPeerCertificates _SSLCopyPeerCertificates
#define SSLSetDiffieHellmanParams _SSLSetDiffieHellmanParams
#define SSLGetDiffieHellmanParams _SSLGetDiffieHellmanParams
#define SSLSetRsaBlinding   _SSLSetRsaBlinding
#define SSLGetRsaBlinding	_SSLGetRsaBlinding
#define SSLNewContext _SSLNewContext
#define SSLNewDatagramContext _SSLNewDatagramContext
#define SSLDisposeContext _SSLDisposeContext

#endif /* TARGET_OS_IPHONE */


/*
 * Create a new Datagram TLS session context.
 * Use in place of SSLNewContext to create a DTLS session.
 * Deprecated: please use the allocator based functions, when available.
 * Also note: the symbol is prefixed with underscore in iOS (historical)
 */
OSStatus
SSLNewDatagramContext		(Boolean 			isServer,
                             SSLContextRef 		*dtlsContextPtr);	/* RETURNED */



#ifdef __cplusplus
}
#endif


#endif	/* _SECURE_TRANSPORT_PRIV_H_ */