/ OSX / libsecurity_ssl / lib / SecureTransportPriv.h
SecureTransportPriv.h
  1  /*
  2   * Copyright (c) 1999-2001,2005-2014 Apple Inc. All Rights Reserved.
  3   *
  4   * @APPLE_LICENSE_HEADER_START@
  5   * 
  6   * This file contains Original Code and/or Modifications of Original Code
  7   * as defined in and that are subject to the Apple Public Source License
  8   * Version 2.0 (the 'License'). You may not use this file except in
  9   * compliance with the License. Please obtain a copy of the License at
 10   * http://www.opensource.apple.com/apsl/ and read it before using this
 11   * file.
 12   * 
 13   * The Original Code and all software distributed under the License are
 14   * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
 15   * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
 16   * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
 17   * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
 18   * Please see the License for the specific language governing rights and
 19   * limitations under the License.
 20   * 
 21   * @APPLE_LICENSE_HEADER_END@
 22   */
 23  
 24  /*
 25   * SecureTransportPriv.h - Apple-private exported routines
 26   */
 27  
 28  #ifndef	_SECURE_TRANSPORT_PRIV_H_
 29  #define _SECURE_TRANSPORT_PRIV_H_	1
 30  
 31  #include <Security/SecureTransport.h>
 32  #include <Security/SecTrust.h>
 33  
 34  #ifdef __cplusplus
 35  extern "C" {
 36  #endif
 37  
 38  #include <Security/sslTypes.h>
 39  
 40  /* Enum defining connection strength for TLS connections. */
 41  typedef CF_ENUM(int, SSLConnectionStrength) {
 42      SSLConnectionStrengthStrong,
 43      SSLConnectionStrengthWeak,
 44      SSLConnectionStrengthNonsecure,
 45  };
 46  
 47  /* See: https://tools.ietf.org/html/rfc8446#section-4.2.7 */
 48  typedef CF_ENUM(uint16_t, SSLKeyExchangeGroup) {
 49      SSLKeyExchangeGroupSecp256r1 = 0x0017,
 50      SSLKeyExchangeGroupSecp384r1 = 0x0018,
 51      SSLKeyExchangeGroupSecp521r1 = 0x0019,
 52      SSLKeyExchangeGroupX25519 = 0x001D,
 53      SSLKeyExchangeGroupX448 = 0x001E,
 54      SSLKeyExchangeGroupFFDHE2048 = 0x0100,
 55      SSLKeyExchangeGroupFFDHE3072 = 0x0101,
 56      SSLKeyExchangeGroupFFDHE4096 = 0x0102,
 57      SSLKeyExchangeGroupFFDHE6144 = 0x0103,
 58      SSLKeyExchangeGroupFFDHE8192 = 0x0104,
 59  };
 60  
 61  /*
 62   * Convenience key exchange groups that collate group identifiers of
 63   * comparable security into a single alias.
 64   */
 65  typedef CF_ENUM(int, SSLKeyExchangeGroupSet) {
 66      kSSLKeyExchangeGroupSetDefault,
 67      kSSLKeyExchangeGroupSetCompatibility,
 68      kSSLKeyExchangeGroupSetLegacy,
 69  };
 70  
 71  /* Determine if a ciphersuite belongs to a specific ciphersuite group */
 72  bool SSLCiphersuiteGroupContainsCiphersuite(SSLCiphersuiteGroup group, SSLCipherSuite suite);
 73  
 74  /* Return the list of ciphersuites associated with a SSLCiphersuiteGroup */
 75  const SSLCipherSuite *SSLCiphersuiteGroupToCiphersuiteList(SSLCiphersuiteGroup group,
 76                                                             size_t *listSize);
 77  
 78  /* Determine minimum allowed TLS version for the given ciphersuite */
 79  SSLProtocol SSLCiphersuiteMinimumTLSVersion(SSLCipherSuite ciphersuite);
 80  
 81  /* Determine maximum allowed TLS version for the given ciphersuite */
 82  SSLProtocol SSLCiphersuiteMaximumTLSVersion(SSLCipherSuite ciphersuite);
 83  
 84  /* Get a human readable name for the given ciphersuite. */
 85  const char *SSLCiphersuiteGetName(SSLCipherSuite ciphersuite);
 86  
 87  /* Get the 2-byte IANA codepoint representation of the given TLS protocol version. */
 88  uint16_t SSLProtocolGetVersionCodepoint(SSLProtocol protocol_version);
 89  
 90  /* Get the internal SSLProtocol enumeration value from a 2-byte IANA TLS version codepoint. */
 91  SSLProtocol SSLProtocolFromVersionCodepoint(uint16_t protocol_version);
 92  
 93  /* Create an SSL Context with an external record layer - eg: kernel accelerated layer */
 94  SSLContextRef
 95  SSLCreateContextWithRecordFuncs(CFAllocatorRef alloc,
 96                                  SSLProtocolSide protocolSide,
 97                                  SSLConnectionType connectionType,
 98                                  const struct SSLRecordFuncs *recFuncs);
 99  
100  /* Set the external record layer context */
101  OSStatus
102  SSLSetRecordContext         (SSLContextRef          ctx,
103                               SSLRecordContextRef    recCtx);
104  
105  /* The size of of client- and server-generated random numbers in hello messages. */
106  #define SSL_CLIENT_SRVR_RAND_SIZE		32
107  
108  /* The size of the pre-master and master secrets. */
109  #define SSL_RSA_PREMASTER_SECRET_SIZE	48
110  #define SSL_MASTER_SECRET_SIZE			48
111  
112  /*
113   * For the following three functions, *size is the available
114   * buffer size on entry and the actual size of the data returned
115   * on return. The above consts are for convenience.
116   */
117  OSStatus SSLInternalMasterSecret(
118     SSLContextRef context,
119     void *secret,         // mallocd by caller, SSL_MASTER_SECRET_SIZE
120     size_t *secretSize);  // in/out
121  
122  OSStatus SSLInternalServerRandom(
123     SSLContextRef context,
124     void *randBuf, 			// mallocd by caller, SSL_CLIENT_SRVR_RAND_SIZE
125     size_t *randSize);	// in/out
126  
127  OSStatus SSLInternalClientRandom(
128     SSLContextRef context,
129     void *randBuf,  		// mallocd by caller, SSL_CLIENT_SRVR_RAND_SIZE
130     size_t *randSize);	// in/out
131  
132  /*
133   * Obtain the sizes of the currently negotiated HMAC digest, session
134   * key, and session key IV.
135   */
136  OSStatus SSLGetCipherSizes(
137  	SSLContextRef context,
138  	size_t *digestSize,
139  	size_t *symmetricKeySize,
140  	size_t *ivSize);
141  
142  OSStatus SSLInternal_PRF(
143     SSLContextRef context,
144     const void *secret,
145     size_t secretLen,
146     const void *label,
147     size_t labelLen,
148     const void *seed,
149     size_t seedLen,
150     void *out,   		// mallocd by caller, length >= outLen
151     size_t outLen);
152  
153  /*
154   * Obtain a SecTrustRef representing peer certificates. Valid anytime,
155   * subsequent to a handshake attempt. The returned SecTrustRef is valid
156   * only as long as the SSLContextRef is.
157   */
158  OSStatus
159  SSLGetPeerSecTrust			(SSLContextRef 		context,
160  							 SecTrustRef		*secTrust);	/* RETURNED */
161  
162  /*
163   * Obtain resumable session info. Can be called anytime subsequent to
164   * handshake attempt.
165   *
166   * if sessionWasResumed is True on return, the session is indeed a
167   * resumed session; the sessionID (an opaque blob generated by the
168   * server) is returned in *sessionID. The length of the sessionID
169   * is returned in *sessionIDLength. Caller must allocate the
170   * sessionID buffer; it max size is MAX_SESSION_ID_LENGTH bytes.
171   */
172  #define MAX_SESSION_ID_LENGTH	32
173  
174  OSStatus
175  SSLGetResumableSessionInfo	(
176  	SSLContextRef	context,
177  	Boolean			*sessionWasResumed,		// RETURNED
178  	void			*sessionID,				// RETURNED, mallocd by caller
179  	size_t			*sessionIDLength);		// IN/OUT
180  
181  /*
182   * Getters for SSLSetCertificate() and SSLSetEncryptionCertificate()
183   */
184  OSStatus
185  SSLGetCertificate (
186  	SSLContextRef	context,
187  	CFArrayRef		*certRefs);				// RETURNED, *not* retained
188  
189  OSStatus
190  SSLGetEncryptionCertificate (
191  	SSLContextRef	context,
192  	CFArrayRef		*certRefs);				// RETURNED, *not* retained
193  
194  /*
195   * Getter for SSLSetClientSideAuthenticate()
196   */
197  OSStatus
198  SSLGetClientSideAuthenticate (
199  	SSLContextRef	context,
200  	SSLAuthenticate	*auth);					// RETURNED
201  
202  #if !TARGET_OS_IPHONE
203  /*
204   * Get/set array of trusted leaf certificates.
205   *
206   * If none have been set previously with SSLSetTrustedLeafCertificates(),
207   * then SSLCopyTrustedLeafCertificates() will return NULL with errSecSuccess.
208   */
209  OSStatus
210  SSLSetTrustedLeafCertificates (
211  	SSLContextRef	context,
212  	CFArrayRef 		certRefs);
213  
214  OSStatus
215  SSLCopyTrustedLeafCertificates (
216  	SSLContextRef	context,
217  	CFArrayRef 		*certRefs);				// RETURNED, caller must release
218  #endif
219  /*
220   * Get/set enable of anonymous ciphers. This is deprecated and now a no-op.
221   */
222  OSStatus
223  SSLSetAllowAnonymousCiphers(
224  	SSLContextRef	context,
225  	Boolean			enable);
226  
227  OSStatus
228  SSLGetAllowAnonymousCiphers(
229  	SSLContextRef	context,
230  	Boolean			*enable);
231  
232  /*
233   * Override the default session cache timeout for a cache entry created for
234   * the current session.
235   */
236  OSStatus
237  SSLSetSessionCacheTimeout(
238  	SSLContextRef context,
239  	uint32_t timeoutInSeconds);
240  
241  /*
242   * Callback function for EAP-style PAC-based session resumption.
243   * This function is called by SecureTransport to obtain the
244   * master secret.
245   */
246  typedef void (*SSLInternalMasterSecretFunction)(
247  	SSLContextRef ctx,
248  	const void *arg,		/* opaque to SecureTransport; app-specific */
249  	void *secret,			/* mallocd by caller, SSL_MASTER_SECRET_SIZE */
250  	size_t *secretLength);  /* in/out */
251  
252  /*
253   * Register a callback for obtaining the master_secret when performing
254   * PAC-based session resumption. At the time the callback is called,
255   * the following are guaranteed to be valid:
256   *
257   *  -- serverRandom (via SSLInternalServerRandom())
258   *  -- clientRandom (via SSLInternalClientRandom())
259   *  -- negotiated protocol version (via SSLGetNegotiatedProtocolVersion())
260   *  -- negotiated CipherSuite (via SSLGetNegotiatedCipher())
261   *
262   * Currently, PAC-based session resumption is only implemented on
263   * the client side for Deployment builds.
264   *
265   * On the client side, this callback occurs if/when the server sends a
266   * ChangeCipherSpec message immediately following its ServerHello
267   * message (i.e., it's skipped the entire Key Exchange phase of
268   * negotiation).
269   *
270   * On the server side (Development builds only) this callback occurs
271   * immediately upon receipt of the Client Hello message, before we send
272   * the Server Hello.
273   */
274  OSStatus
275  SSLInternalSetMasterSecretFunction(
276  	SSLContextRef ctx,
277  	SSLInternalMasterSecretFunction mFunc,
278  	const void *arg);		/* opaque to SecureTransport; app-specific */
279  
280  /*
281   * Provide an opaque SessionTicket for use in PAC-based session
282   * resumption. Client side only. The provided ticket is sent in
283   * the ClientHello message as a SessionTicket extension.
284   * The maximum ticketLength is 2**16-1.
285   */
286  OSStatus SSLInternalSetSessionTicket(
287     SSLContextRef ctx,
288     const void *ticket,
289     size_t ticketLength);
290  
291  /*
292   * Support for specifying and obtaining ECC curves, used with the ECDH-based
293   * ciphersuites.
294   */
295  
296  /*
297   * These are the named curves from RFC 4492
298   * section 5.1.1, with the exception of SSL_Curve_None which means
299   * "ECDSA not negotiated".
300   */
301  typedef enum
302  {
303  	SSL_Curve_None = -1,
304  
305      SSL_Curve_sect163k1 = 1,
306      SSL_Curve_sect163r1 = 2,
307      SSL_Curve_sect163r2 = 3,
308      SSL_Curve_sect193r1 = 4,
309      SSL_Curve_sect193r2 = 5,
310      SSL_Curve_sect233k1 = 6,
311      SSL_Curve_sect233r1 = 7,
312      SSL_Curve_sect239k1 = 8,
313      SSL_Curve_sect283k1 = 9,
314      SSL_Curve_sect283r1 = 10,
315      SSL_Curve_sect409k1 = 11,
316      SSL_Curve_sect409r1 = 12,
317      SSL_Curve_sect571k1 = 13,
318      SSL_Curve_sect571r1 = 14,
319      SSL_Curve_secp160k1 = 15,
320      SSL_Curve_secp160r1 = 16,
321      SSL_Curve_secp160r2 = 17,
322      SSL_Curve_secp192k1 = 18,
323      SSL_Curve_secp192r1 = 19,
324      SSL_Curve_secp224k1 = 20,
325      SSL_Curve_secp224r1 = 21,
326      SSL_Curve_secp256k1 = 22,
327  
328      /* These are the ones we actually support */
329  	SSL_Curve_secp256r1 = 23,
330  	SSL_Curve_secp384r1 = 24,
331  	SSL_Curve_secp521r1 = 25
332  } SSL_ECDSA_NamedCurve;
333  
334  /*
335   * Obtain the SSL_ECDSA_NamedCurve negotiated during a handshake.
336   * Returns errSecParam if no ECDH-related ciphersuite was negotiated.
337   */
338  extern OSStatus SSLGetNegotiatedCurve(
339     SSLContextRef ctx,
340     SSL_ECDSA_NamedCurve *namedCurve);    /* RETURNED */
341  
342  /*
343   * Obtain the number of currently enabled SSL_ECDSA_NamedCurves.
344   */
345  extern OSStatus SSLGetNumberOfECDSACurves(
346     SSLContextRef ctx,
347     unsigned *numCurves);				/* RETURNED */
348  
349  /*
350   * Obtain the ordered list of currently enabled SSL_ECDSA_NamedCurves.
351   * Caller allocates returned array and specifies its size (in
352   * SSL_ECDSA_NamedCurves) in *numCurves on entry; *numCurves
353   * is the actual size of the returned array on successful return.
354   */
355  extern OSStatus SSLGetECDSACurves(
356     SSLContextRef ctx,
357     SSL_ECDSA_NamedCurve *namedCurves,	/* RETURNED */
358     unsigned *numCurves);				/* IN/OUT */
359  
360  /*
361   * Specify ordered list of allowable named curves.
362   */
363  extern OSStatus SSLSetECDSACurves(
364     SSLContextRef ctx,
365     const SSL_ECDSA_NamedCurve *namedCurves,
366     unsigned numCurves);
367  
368  /*
369   * Server-specified client authentication mechanisms.
370   */
371  typedef enum {
372  	/* doesn't appear on the wire */
373  	SSLClientAuthNone = -1,
374  	/* RFC 2246 7.4.6 */
375  	SSLClientAuth_RSASign = 1,
376  	SSLClientAuth_DSSSign = 2,
377  	SSLClientAuth_RSAFixedDH = 3,
378  	SSLClientAuth_DSS_FixedDH = 4,
379  	/* RFC 4492 5.5 */
380  	SSLClientAuth_ECDSASign = 64,
381  	SSLClientAuth_RSAFixedECDH = 65,
382  	SSLClientAuth_ECDSAFixedECDH = 66
383  } SSLClientAuthenticationType;
384  
385  /* TLS 1.2 Signature Algorithms extension values for hash field. */
386  typedef enum {
387      SSL_HashAlgorithmNone = 0,
388      SSL_HashAlgorithmMD5 = 1,
389      SSL_HashAlgorithmSHA1 = 2,
390      SSL_HashAlgorithmSHA224 = 3,
391      SSL_HashAlgorithmSHA256 = 4,
392      SSL_HashAlgorithmSHA384 = 5,
393      SSL_HashAlgorithmSHA512 = 6
394  } SSL_HashAlgorithm;
395  
396  /* TLS 1.2 Signature Algorithms extension values for signature field. */
397  typedef enum {
398      SSL_SignatureAlgorithmAnonymous = 0,
399      SSL_SignatureAlgorithmRSA = 1,
400      SSL_SignatureAlgorithmDSA = 2,
401      SSL_SignatureAlgorithmECDSA = 3
402  } SSL_SignatureAlgorithm;
403  
404  typedef struct {
405      SSL_HashAlgorithm hash;
406      SSL_SignatureAlgorithm signature;
407  } SSLSignatureAndHashAlgorithm;
408  
409  /*
410   * Obtain the number of client authentication mechanisms specified by
411   * the server in its Certificate Request message.
412   * Returns errSecParam if server hasn't sent a Certificate Request message
413   * (i.e., client certificate state is kSSLClientCertNone).
414   */
415  extern OSStatus SSLGetNumberOfClientAuthTypes(
416  	SSLContextRef ctx,
417  	unsigned *numTypes);
418  
419  /*
420   * Obtain the client authentication mechanisms specified by
421   * the server in its Certificate Request message.
422   * Caller allocates returned array and specifies its size (in
423   * SSLClientAuthenticationTypes) in *numType on entry; *numTypes
424   * is the actual size of the returned array on successful return.
425   */
426  extern OSStatus SSLGetClientAuthTypes(
427     SSLContextRef ctx,
428     SSLClientAuthenticationType *authTypes,		/* RETURNED */
429     unsigned *numTypes);							/* IN/OUT */
430  
431  /*
432   * -- DEPRECATED -- 
433   * This is not actually useful. Currently return errSecUnimplemented.
434   * The client auth type is fully determined by the type of private key used by
435   * the client.
436   */
437  extern OSStatus SSLGetNegotiatedClientAuthType(
438     SSLContextRef ctx,
439     SSLClientAuthenticationType *authType);		/* RETURNED */
440  
441  
442  /*
443   * Obtain the number of supported_signature_algorithms specified by
444   * the server in its Certificate Request message.
445   * Returns errSecParam if server hasn't sent a Certificate Request message
446   * (i.e., client certificate state is kSSLClientCertNone).
447   */
448  extern OSStatus SSLGetNumberOfSignatureAlgorithms(
449      SSLContextRef ctx,
450      unsigned *numSigAlgs);
451  
452  /*
453   * Obtain the supported_signature_algorithms specified by
454   * the server in its Certificate Request message.
455   * Caller allocates returned array and specifies its size (in
456   * SSLClientAuthenticationTypes) in *numType on entry; *numTypes
457   * is the actual size of the returned array on successful return.
458   */
459  extern OSStatus SSLGetSignatureAlgorithms(
460      SSLContextRef ctx,
461      SSLSignatureAndHashAlgorithm *sigAlgs,		/* RETURNED */
462      unsigned *numSigAlgs);							/* IN/OUT */
463  
464  /* PSK SPIs */
465  
466  /* Set the Shared Secret for PSK CipherSuite.
467     This need to be set before the handshake starts. */
468  OSStatus SSLSetPSKSharedSecret(SSLContextRef ctx,
469                                 const void *secret,
470                                 size_t secretLen);
471  
472  /* Set the Client identity for PSK CipherSuite.
473     This need to be set before the handshake starts.
474     Only useful for client side.*/
475  OSStatus SSLSetPSKIdentity(SSLContextRef ctx,
476                             const void *pskIdentity,
477                             size_t pskIdentityLen);
478  
479  /* For client side, get the identity previously set by SSLSetPSKIdentity.
480     For server side, get the identity provided by the client during the handshake.
481     Might be NULL if not set. identity is owned by the SSLContext and is invalid once
482     the SSLContext is released.
483   */
484  OSStatus SSLGetPSKIdentity(SSLContextRef ctx,
485                             const void **pskIdentity,
486                             size_t *pskIdentityLen);
487  
488  /* For client side, set the minimum allowed DH group size for DHE ciphersuites */
489  OSStatus SSLSetMinimumDHGroupSize(SSLContextRef ctx, unsigned nbits);
490  
491  OSStatus SSLGetMinimumDHGroupSize(SSLContextRef ctx, unsigned *nbits);
492  
493  OSStatus SSLSetDHEEnabled(SSLContextRef ctx, bool enabled);
494  
495  OSStatus SSLGetDHEEnabled(SSLContextRef ctx, bool *enabled);
496  
497  #if TARGET_OS_IPHONE
498  
499  /* Following are SPIs on iOS */
500  
501  /*
502   * Set allowed SSL protocol versions. Optional.
503   * Specifying kSSLProtocolAll for SSLSetProtocolVersionEnabled results in
504   * specified 'enable' boolean to be applied to all supported protocols.
505   * The default is "all supported protocols are enabled".
506   * This can only be called when no session is active.
507   *
508   * Legal values for protocol are :
509   *		kSSLProtocol2
510   *		kSSLProtocol3
511   * 		kTLSProtocol1
512   *		kSSLProtocolAll
513   *
514   * This is deprecated in favor of SSLSetProtocolVersionMax/SSLSetProtocolVersionMin
515   */
516  OSStatus
517  _SSLSetProtocolVersionEnabled (SSLContextRef 	context,
518                                SSLProtocol		protocol,
519                                 Boolean			enable) API_UNAVAILABLE(macCatalyst);
520  
521  /*
522   * Obtain a value specified in SSLSetProtocolVersionEnabled.
523   *
524   * This is deprecated in favor of SSLGetProtocolVersionMax/SSLGetProtocolVersionMin
525   */
526  OSStatus
527  _SSLGetProtocolVersionEnabled(SSLContextRef 		context,
528                               SSLProtocol		protocol,
529                                Boolean			*enable) API_UNAVAILABLE(macCatalyst);		/* RETURNED */
530  
531  /*
532   * Get/set SSL protocol version; optional. Default is kSSLProtocolUnknown,
533   * in which case the highest possible version (currently kTLSProtocol1)
534   * is attempted, but a lower version is accepted if the peer requires it.
535   *
536   * SSLSetProtocolVersion can not be called when a session is active.
537   *
538   * This is deprecated in favor of SSLSetProtocolVersionEnabled.
539   *
540   * This is deprecated in favor of SSLSetProtocolVersionMax/SSLSetProtocolVersionMin
541   */
542  OSStatus
543  _SSLSetProtocolVersion		(SSLContextRef 		context,
544                               SSLProtocol		version) API_UNAVAILABLE(macCatalyst);
545  
546  /*
547   * Obtain the protocol version specified in SSLSetProtocolVersion.
548   * This is deprecated in favor of SSLGetProtocolVersionEnabled.
549   * If SSLSetProtocolVersionEnabled() has been called for this session,
550   * SSLGetProtocolVersion() may return errSecParam if the protocol enable
551   * state can not be represented by the SSLProtocol enums (e.g.,
552   * SSL2 and TLS1 enabled, SSL3 disabled).
553   *
554   * This is deprecated in favor of SSLGetProtocolVersionMax/SSLGetProtocolVersionMin
555   */
556  OSStatus
557  _SSLGetProtocolVersion		(SSLContextRef		context,
558                               SSLProtocol		*protocol) API_UNAVAILABLE(macCatalyst);		/* RETURNED */
559  
560  /* API REVIEW:
561   The following 15 calls were used to change the behaviour of the trust
562   evaluation of the certificate chain.
563   The proper alternative is to break out of the handshake, get the
564   peer's SecTrustRef with SSLCopyPeerTrust and evaluate that.
565   */
566  
567  /*
568   * Enable/disable peer certificate chain validation. Default is enabled.
569   * If caller disables, it is the caller's responsibility to call
570   * SSLCopyPeerTrust() upon successful completion of the handshake
571   * and then to perform external validation of the peer certificate
572   * chain before proceeding with data transfer.
573   */
574  OSStatus
575  _SSLSetEnableCertVerify		(SSLContextRef 			context,
576                               Boolean				enableVerify) API_UNAVAILABLE(macCatalyst);
577  
578  OSStatus
579  _SSLGetEnableCertVerify		(SSLContextRef 			context,
580                               Boolean				*enableVerify) API_UNAVAILABLE(macCatalyst);	/* RETURNED */
581  
582  /*
583   * Specify the option of ignoring certificates' "expired" times.
584   * This is a common failure in the real SSL world. Default for
585   * this flag is false, meaning expired certs result in a
586   * errSSLCertExpired error.
587   */
588  OSStatus
589  _SSLSetAllowsExpiredCerts	(SSLContextRef		context,
590                               Boolean			allowsExpired) API_UNAVAILABLE(macCatalyst);
591  
592  /*
593   * Obtain the current value of an SSLContext's "allowExpiredCerts" flag.
594   */
595  OSStatus
596  _SSLGetAllowsExpiredCerts	(SSLContextRef		context,
597                               Boolean			*allowsExpired) API_UNAVAILABLE(macCatalyst); /* RETURNED */
598  
599  /*
600   * Similar to SSLSetAllowsExpiredCerts(), this function allows the
601   * option of ignoring "expired" status for root certificates only.
602   * Default is false, i.e., expired root certs result in an
603   * errSSLCertExpired error.
604   */
605  OSStatus
606  _SSLSetAllowsExpiredRoots	(SSLContextRef		context,
607                               Boolean			allowsExpired) API_UNAVAILABLE(macCatalyst);
608  
609  OSStatus
610  _SSLGetAllowsExpiredRoots	(SSLContextRef		context,
611                               Boolean			*allowsExpired) API_UNAVAILABLE(macCatalyst); /* RETURNED */
612  
613  /*
614   * Specify option of allowing for an unknown root cert, i.e., one which
615   * this software can not verify as one of a list of known good root certs.
616   * Default for this flag is false, in which case one of the following two
617   * errors may occur:
618   *    -- The peer returns a cert chain with a root cert, and the chain
619   *       verifies to that root, but the root is not one of our trusted
620   *       roots. This results in errSSLUnknownRootCert on handshake.
621   *    -- The peer returns a cert chain which does not contain a root cert,
622   *       and we can't verify the chain to one of our trusted roots. This
623   *       results in errSSLNoRootCert on handshake.
624   *
625   * Both of these error conditions are ignored when the AllowAnyRoot flag is true,
626   * allowing connection to a totally untrusted peer.
627   */
628  OSStatus
629  _SSLSetAllowsAnyRoot			(SSLContextRef		context,
630                                   Boolean			anyRoot) API_UNAVAILABLE(macCatalyst);
631  
632  /*
633   * Obtain the current value of an SSLContext's "allow any root" flag.
634   */
635  OSStatus
636  _SSLGetAllowsAnyRoot			(SSLContextRef		context,
637                                   Boolean			*anyRoot) API_UNAVAILABLE(macCatalyst); /* RETURNED */
638  
639  /*
640   * Augment or replace the system's default trusted root certificate set
641   * for this session. If replaceExisting is true, the specified roots will
642   * be the only roots which are trusted during this session. If replaceExisting
643   * is false, the specified roots will be added to the current set of trusted
644   * root certs. If this function has never been called, the current trusted
645   * root set is the same as the system's default trusted root set.
646   * Successive calls with replaceExisting false result in accumulation
647   * of additional root certs.
648   *
649   * The trustedRoots array contains SecCertificateRefs.
650   */
651  OSStatus
652  _SSLSetTrustedRoots			(SSLContextRef 		context,
653                               CFArrayRef 		trustedRoots,
654                               Boolean 			replaceExisting) API_UNAVAILABLE(macCatalyst);
655  
656  /*
657   * Obtain an array of SecCertificateRefs representing the current
658   * set of trusted roots. If SSLSetTrustedRoots() has never been called
659   * for this session, this returns the system's default root set.
660   *
661   * Caller must CFRelease the returned CFArray.
662   */
663  OSStatus
664  _SSLCopyTrustedRoots			(SSLContextRef 		context,
665                                   CFArrayRef 		*trustedRoots) API_UNAVAILABLE(macCatalyst);	/* RETURNED */
666  
667  /*
668   * Add a SecCertificateRef, or a CFArray of them, to a server's list
669   * of acceptable Certificate Authorities (CAs) to present to the client
670   * when client authentication is performed.
671   *
672   * If replaceExisting is true, the specified certificate(s) will replace
673   * a possible existing list of acceptable CAs. If replaceExisting is
674   * false, the specified certificate(s) will be appended to the existing
675   * list of acceptable CAs, if any.
676   *
677   * Returns errSecParam is this is called on an SSLContextRef which
678   * is configured as a client, or when a session is active.
679   */
680  OSStatus
681  _SSLSetCertificateAuthorities(SSLContextRef		context,
682                               CFTypeRef			certificateOrArray,
683                                Boolean 			replaceExisting) API_UNAVAILABLE(macCatalyst);
684  
685  /*
686   * Obtain the certificates specified in SSLSetCertificateAuthorities(),
687   * if any. Returns a NULL array if SSLSetCertificateAuthorities() has not
688   * been called.
689   * Caller must CFRelease the returned array.
690   */
691  
692  OSStatus
693  _SSLCopyCertificateAuthorities(SSLContextRef		context,
694                                CFArrayRef		*certificates) API_UNAVAILABLE(macCatalyst);	/* RETURNED */
695  
696  /*
697   * Request peer certificates. Valid anytime, subsequent to
698   * a handshake attempt.
699   *
700   * The certs argument is a CFArray containing SecCertificateRefs.
701   * Caller must CFRelease the returned array.
702   *
703   * The cert at index 0 of the returned array is the subject (end
704   * entity) cert; the root cert (or the closest cert to it) is at
705   * the end of the returned array.
706   */
707  /* API REVIEW:
708   This should be removed so that applications are not tempted to
709   use this to evaluate trust, they should use the SecTrustRef returned
710   by SSLCopyPeerTrust instead.
711   But this maybe useful to know which certs where returned by the server
712   vs which where pulled internally.
713   This would be a debug feature, so we deprecate this in iOS. There
714   should be an API in SecTrust to allow getting the original certificates
715   for debug purpose.
716   */
717  OSStatus
718  _SSLCopyPeerCertificates		(SSLContextRef 		context,
719                               CFArrayRef			*certs) API_UNAVAILABLE(macCatalyst);	/* RETURNED */
720  
721  /*
722   * Specify Diffie-Hellman parameters. Optional; if we are configured to allow
723   * for D-H ciphers and a D-H cipher is negotiated, and this function has not
724   * been called, a set of process-wide parameters will be calculated. However
725   * that can take a long time (30 seconds).
726   */
727  OSStatus _SSLSetDiffieHellmanParams	(SSLContextRef			context,
728                                       const void 			*dhParams,
729                                       size_t					dhParamsLen) API_UNAVAILABLE(macCatalyst);
730  
731  /*
732   * Return parameter block specified in SSLSetDiffieHellmanParams.
733   * Returned data is not copied and belongs to the SSLContextRef.
734   */
735  OSStatus _SSLGetDiffieHellmanParams	(SSLContextRef			context,
736                                       const void 			**dhParams,
737                                       size_t					*dhParamsLen) API_UNAVAILABLE(macCatalyst);
738  
739  /*
740   * Enable/Disable RSA blinding. This feature thwarts a known timing
741   * attack to which RSA keys are vulnerable; enabling it is a tradeoff
742   * between performance and security. The default for RSA blinding is
743   * enabled.
744   */
745  OSStatus _SSLSetRsaBlinding			(SSLContextRef			context,
746                                       Boolean				blinding) API_UNAVAILABLE(macCatalyst);
747  
748  OSStatus _SSLGetRsaBlinding			(SSLContextRef			context,
749                                       Boolean				*blinding) API_UNAVAILABLE(macCatalyst);
750  
751  /*
752   * Create a new SSL/TLS session context.
753   * Deprecated: please use the allocator based functions, when available.
754   */
755  OSStatus
756  _SSLNewContext				(Boolean 			isServer,
757                               SSLContextRef 		*tlsContextPtr) API_UNAVAILABLE(macCatalyst);     /* RETURNED */
758  
759  /*
760   * Dispose of an SSLContextRef.  This is effectivly a CFRelease.
761   * Deprecated.
762   */
763  OSStatus
764  _SSLDisposeContext			(SSLContextRef		context) API_UNAVAILABLE(macCatalyst);
765  
766  /* We redefine the names of all SPIs to avoid collision with unavailable APIs */
767  #define SSLSetProtocolVersionEnabled _SSLSetProtocolVersionEnabled
768  #define SSLGetProtocolVersionEnabled _SSLGetProtocolVersionEnabled
769  #define SSLSetProtocolVersion _SSLSetProtocolVersion
770  #define SSLGetProtocolVersion _SSLGetProtocolVersion
771  #define SSLSetEnableCertVerify _SSLSetEnableCertVerify
772  #define SSLGetEnableCertVerify _SSLGetEnableCertVerify
773  #define SSLSetAllowsExpiredCerts _SSLSetAllowsExpiredCerts
774  #define SSLGetAllowsExpiredCerts _SSLGetAllowsExpiredCerts
775  #define SSLSetAllowsExpiredRoots _SSLSetAllowsExpiredRoots
776  #define SSLGetAllowsExpiredRoots _SSLGetAllowsExpiredRoots
777  #define SSLSetAllowsAnyRoot _SSLSetAllowsAnyRoot
778  #define SSLGetAllowsAnyRoot _SSLGetAllowsAnyRoot
779  #define SSLSetTrustedRoots _SSLSetTrustedRoots
780  #define SSLCopyTrustedRoots _SSLCopyTrustedRoots
781  #define SSLSetCertificateAuthorities _SSLSetCertificateAuthorities
782  #define SSLCopyCertificateAuthorities _SSLCopyCertificateAuthorities
783  #define SSLCopyPeerCertificates _SSLCopyPeerCertificates
784  #define SSLSetDiffieHellmanParams _SSLSetDiffieHellmanParams
785  #define SSLGetDiffieHellmanParams _SSLGetDiffieHellmanParams
786  #define SSLSetRsaBlinding   _SSLSetRsaBlinding
787  #define SSLGetRsaBlinding	_SSLGetRsaBlinding
788  #define SSLNewContext _SSLNewContext
789  #define SSLNewDatagramContext _SSLNewDatagramContext
790  #define SSLDisposeContext _SSLDisposeContext
791  
792  #endif /* TARGET_OS_IPHONE */
793  
794  /*
795   * Map the SSLProtocol enum to an enum capturing the wire format (coreTLS) version.
796   */
797  #define SECURITY_HAS_TLS_VERSION_TRANSLATOR 1
798  tls_protocol_version
799  _SSLProtocolVersionToWireFormatValue   (SSLProtocol protocol);
800  
801  
802  /*
803   * Create a new Datagram TLS session context.
804   * Use in place of SSLNewContext to create a DTLS session.
805   * Deprecated: please use the allocator based functions, when available.
806   * Also note: the symbol is prefixed with underscore in iOS (historical)
807   */
808  OSStatus
809  SSLNewDatagramContext		(Boolean 			isServer,
810                               SSLContextRef 		*dtlsContextPtr) API_UNAVAILABLE(macCatalyst);	/* RETURNED */
811  
812  
813  
814  /*
815   * NPN support.
816   *
817   * If used, must be by client and server before SSLHandshake()
818   *
819   * Client: if set the client will announce NPN extension in the
820   * ClientHello, and the a callback will provide the server list, at
821   * that time the client needs to call SSLSetNPNData() in the callback
822   * to provide to the server the support mechanism.
823   *
824   * Server: the callback will tell the server that the client supports
825   * NPN and at that time, the server needs to set the supported NPN
826   * types with SSLSetNPNData().
827   */
828  typedef void
829  (*SSLNPNFunc)               (SSLContextRef          ctx,
830                               void                   *info,		/* info pointer provided by SSLSetNPNFunc */
831                               const void			    *npnData,
832                               size_t                 npnDataLength);
833  
834  
835  void
836  SSLSetNPNFunc               (SSLContextRef      context,
837                               SSLNPNFunc         npnFunc,
838                               void               *info)
839      __OSX_AVAILABLE_STARTING(__MAC_10_10, __IPHONE_8_0);
840  
841  /*
842   * For servers, this is the data that is announced.
843   * For clients, this is the picked data in the npnFunc callback.
844   *
845   * Return an error on out of memory and if buffer it too large
846   */
847  OSStatus
848  SSLSetNPNData				(SSLContextRef      context,
849                               const void *data,
850  							 size_t length)
851      __OSX_AVAILABLE_STARTING(__MAC_10_10, __IPHONE_8_0);
852  
853  /*
854   * For servers, return client provided npn data if sent
855   */
856  const void *
857  SSLGetNPNData				(SSLContextRef      context,
858  							 size_t				*length)
859      __OSX_AVAILABLE_STARTING(__MAC_10_10, __IPHONE_8_0);
860  
861  // ALPN
862  typedef void
863  (*SSLALPNFunc)             (SSLContextRef          ctx,
864                              void                    *info,		/* info pointer provided by SSLSetALPNFunc */
865                              const void			    *alpnData,
866                              size_t                  alpnDataLength);
867  
868  void
869  SSLSetALPNFunc              (SSLContextRef      context,
870                               SSLALPNFunc         alpnFunc,
871                               void               *info)
872      __OSX_AVAILABLE_STARTING(__MAC_10_11, __IPHONE_9_0);
873  
874  
875  OSStatus
876  SSLSetALPNData				(SSLContextRef      context,
877                               const void *data,
878                               size_t length)
879      __OSX_AVAILABLE_STARTING(__MAC_10_11, __IPHONE_9_0);
880  
881  const void *
882  SSLGetALPNData				(SSLContextRef      context,
883                               size_t				*length)
884      __OSX_AVAILABLE_STARTING(__MAC_10_11, __IPHONE_9_0);
885  
886  // end of ALPN
887  
888  #ifdef __cplusplus
889  }
890  #endif
891  
892  
893  #endif	/* _SECURE_TRANSPORT_PRIV_H_ */