2 * Copyright (c) 1999-2001,2005-2014 Apple Inc. All Rights Reserved.
4 * @APPLE_LICENSE_HEADER_START@
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
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.
21 * @APPLE_LICENSE_HEADER_END@
25 * cipherSpecs.c - SSLCipherSpec declarations
28 #include "sslBuildFlags.h"
29 #include "sslContext.h"
30 #include "sslCipherSpecs.h"
32 #include "sslMemory.h"
36 #include <tls_handshake.h>
40 #include <Security/SecBase.h>
42 #include <TargetConditionals.h>
45 /* SecureTransport needs it's own copy of KnownCipherSuites for now, there is a copy in coreTLS,
46 that is exported, but it actually should only included the "default" not the supported */
49 #define ENABLE_AES_GCM 1
51 #define ENABLE_CHACHA20_POLY1305 1
52 #define ENABLE_AES_CCM 0
55 static const uint16_t STKnownCipherSuites
[] = {
57 TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
,
58 TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
,
60 TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384
,
61 TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256
,
62 TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA
,
63 TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA
,
64 TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA
,
66 TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
,
67 TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
,
69 TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384
,
70 TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256
,
71 TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA
,
72 TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA
,
73 TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA
,
76 TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384
,
77 TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256
,
79 TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384
,
80 TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256
,
81 TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA
,
82 TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA
,
83 TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA
,
85 TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384
,
86 TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256
,
88 TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384
,
89 TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256
,
90 TLS_ECDH_RSA_WITH_AES_256_CBC_SHA
,
91 TLS_ECDH_RSA_WITH_AES_128_CBC_SHA
,
92 TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA
,
96 TLS_DHE_RSA_WITH_AES_256_GCM_SHA384
,
97 TLS_DHE_RSA_WITH_AES_128_GCM_SHA256
,
98 #endif // ENABLE_AES_GCM
99 TLS_DHE_RSA_WITH_AES_256_CBC_SHA256
,
100 TLS_DHE_RSA_WITH_AES_128_CBC_SHA256
,
101 TLS_DHE_RSA_WITH_AES_256_CBC_SHA
,
102 TLS_DHE_RSA_WITH_AES_128_CBC_SHA
,
103 SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA
,
106 TLS_RSA_WITH_AES_256_GCM_SHA384
,
107 TLS_RSA_WITH_AES_128_GCM_SHA256
,
109 TLS_RSA_WITH_AES_256_CBC_SHA256
,
110 TLS_RSA_WITH_AES_128_CBC_SHA256
,
111 TLS_RSA_WITH_AES_256_CBC_SHA
,
112 TLS_RSA_WITH_AES_128_CBC_SHA
,
113 SSL_RSA_WITH_3DES_EDE_CBC_SHA
,
115 /* TLS 1.3 ciphersuites */
117 TLS_AES_128_GCM_SHA256
,
118 TLS_AES_256_GCM_SHA384
,
120 #if ENABLE_CHACHA20_POLY1305
121 TLS_CHACHA20_POLY1305_SHA256
,
124 TLS_AES_128_CCM_SHA256
,
125 TLS_AES_128_CCM_8_SHA256
,
128 /* Unsafe ciphersuites */
131 TLS_DH_anon_WITH_AES_256_GCM_SHA384
,
132 TLS_DH_anon_WITH_AES_128_GCM_SHA256
,
134 TLS_DH_anon_WITH_AES_128_CBC_SHA256
,
135 TLS_DH_anon_WITH_AES_256_CBC_SHA256
,
136 TLS_DH_anon_WITH_AES_128_CBC_SHA
,
137 TLS_DH_anon_WITH_AES_256_CBC_SHA
,
138 SSL_DH_anon_WITH_3DES_EDE_CBC_SHA
,
140 TLS_ECDHE_ECDSA_WITH_NULL_SHA
,
141 TLS_ECDHE_RSA_WITH_NULL_SHA
,
143 TLS_ECDH_ECDSA_WITH_NULL_SHA
,
144 TLS_ECDH_RSA_WITH_NULL_SHA
,
148 TLS_PSK_WITH_AES_256_CBC_SHA384
,
149 TLS_PSK_WITH_AES_128_CBC_SHA256
,
150 TLS_PSK_WITH_AES_256_CBC_SHA
,
151 TLS_PSK_WITH_AES_128_CBC_SHA
,
152 TLS_PSK_WITH_3DES_EDE_CBC_SHA
,
153 TLS_PSK_WITH_NULL_SHA384
,
154 TLS_PSK_WITH_NULL_SHA256
,
155 TLS_PSK_WITH_NULL_SHA
,
158 TLS_RSA_WITH_NULL_SHA256
,
159 SSL_RSA_WITH_NULL_SHA
,
160 SSL_RSA_WITH_NULL_MD5
163 static const unsigned STCipherSuiteCount
= sizeof(STKnownCipherSuites
)/sizeof(STKnownCipherSuites
[0]);
165 #define CiphersuitesTLS13 \
166 TLS_AES_128_GCM_SHA256, \
167 TLS_AES_256_GCM_SHA384, \
168 TLS_CHACHA20_POLY1305_SHA256
170 #define CiphersuitesPFS \
171 TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384, \
172 TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, \
173 TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384, \
174 TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256, \
175 TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA, \
176 TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA, \
177 TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256, \
178 TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384, \
179 TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, \
180 TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384, \
181 TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256, \
182 TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA, \
183 TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA, \
184 TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256
186 #define CiphersuitesNonPFS \
187 TLS_RSA_WITH_AES_256_GCM_SHA384, \
188 TLS_RSA_WITH_AES_128_GCM_SHA256, \
189 TLS_RSA_WITH_AES_256_CBC_SHA256, \
190 TLS_RSA_WITH_AES_128_CBC_SHA256, \
191 TLS_RSA_WITH_AES_256_CBC_SHA, \
192 TLS_RSA_WITH_AES_128_CBC_SHA
194 #define CiphersuitesTLS10 \
195 TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA, \
196 TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA, \
197 TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA, \
198 TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA, \
199 TLS_RSA_WITH_AES_256_CBC_SHA, \
200 TLS_RSA_WITH_AES_128_CBC_SHA
202 #define CiphersuitesTLS10_3DES \
203 TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA, \
204 TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA, \
205 SSL_RSA_WITH_3DES_EDE_CBC_SHA
207 #define CiphersuitesDHE \
208 TLS_DHE_RSA_WITH_AES_256_GCM_SHA384, \
209 TLS_DHE_RSA_WITH_AES_128_GCM_SHA256, \
210 TLS_DHE_RSA_WITH_AES_256_CBC_SHA256, \
211 TLS_DHE_RSA_WITH_AES_128_CBC_SHA256, \
212 TLS_DHE_RSA_WITH_AES_256_CBC_SHA, \
213 TLS_DHE_RSA_WITH_AES_128_CBC_SHA, \
214 SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA
217 #define DefineTLSCiphersuiteGroupList(XXX, ...) \
218 static const SSLCipherSuite List##XXX[] = { \
222 DefineTLSCiphersuiteGroupList(kSSLCiphersuiteGroupDefault
,
225 DefineTLSCiphersuiteGroupList(kSSLCiphersuiteGroupCompatibility
,
228 CiphersuitesTLS10_3DES
);
229 DefineTLSCiphersuiteGroupList(kSSLCiphersuiteGroupLegacy
,
231 DefineTLSCiphersuiteGroupList(kSSLCiphersuiteGroupATS
,
234 DefineTLSCiphersuiteGroupList(kSSLCiphersuiteGroupATSCompatibility
,
237 typedef struct tls_ciphersuite_definition
{
238 SSLCipherSuite ciphersuite
;
239 SSLProtocol min_version
;
240 SSLProtocol max_version
;
241 char ciphersuite_name
[64];
242 } *tls_ciphersuite_definition_t
;
244 #define DefineTLSCiphersuiteDefinition(XXX, MIN_VERSION, MAX_VERSION) \
246 .ciphersuite = XXX, \
247 .ciphersuite_name = "##XXX", \
248 .min_version = MIN_VERSION, \
249 .max_version = MAX_VERSION, \
252 static const struct tls_ciphersuite_definition tls_ciphersuite_definitions
[] = {
253 // TLS 1.3 ciphersuites
254 DefineTLSCiphersuiteDefinition(TLS_AES_128_GCM_SHA256
, kTLSProtocol13
, kTLSProtocolMaxSupported
),
255 DefineTLSCiphersuiteDefinition(TLS_AES_256_GCM_SHA384
, kTLSProtocol13
, kTLSProtocolMaxSupported
),
256 DefineTLSCiphersuiteDefinition(TLS_CHACHA20_POLY1305_SHA256
, kTLSProtocol13
, kTLSProtocolMaxSupported
),
258 // RFC 7905: ChaCha20-Poly1305 Cipher Suites for Transport Layer Security (TLS)
259 DefineTLSCiphersuiteDefinition(TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256
, kTLSProtocol12
, kTLSProtocol12
),
260 DefineTLSCiphersuiteDefinition(TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256
, kTLSProtocol12
, kTLSProtocol12
),
262 // RFC 5289: TLS Elliptic Curve Cipher Suites with SHA-256/384 and AES Galois Counter Mode (GCM)
263 DefineTLSCiphersuiteDefinition(TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
, kTLSProtocol12
, kTLSProtocol12
),
264 DefineTLSCiphersuiteDefinition(TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
, kTLSProtocol12
, kTLSProtocol12
),
265 DefineTLSCiphersuiteDefinition(TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384
, kTLSProtocol12
, kTLSProtocol12
),
266 DefineTLSCiphersuiteDefinition(TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256
, kTLSProtocol12
, kTLSProtocol12
),
267 DefineTLSCiphersuiteDefinition(TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
, kTLSProtocol12
, kTLSProtocol12
),
268 DefineTLSCiphersuiteDefinition(TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
, kTLSProtocol12
, kTLSProtocol12
),
269 DefineTLSCiphersuiteDefinition(TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384
, kTLSProtocol12
, kTLSProtocol12
),
270 DefineTLSCiphersuiteDefinition(TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256
, kTLSProtocol12
, kTLSProtocol12
),
272 // RFC 5288: AES Galois Counter Mode (GCM) Cipher Suites for TLS
273 DefineTLSCiphersuiteDefinition(TLS_RSA_WITH_AES_256_GCM_SHA384
, kTLSProtocol12
, kTLSProtocol12
),
274 DefineTLSCiphersuiteDefinition(TLS_RSA_WITH_AES_128_GCM_SHA256
, kTLSProtocol12
, kTLSProtocol12
),
275 DefineTLSCiphersuiteDefinition(TLS_DHE_RSA_WITH_AES_256_GCM_SHA384
, kTLSProtocol12
, kTLSProtocol12
),
276 DefineTLSCiphersuiteDefinition(TLS_DHE_RSA_WITH_AES_128_GCM_SHA256
, kTLSProtocol12
, kTLSProtocol12
),
278 // RFC 5246: The Transport Layer Security (TLS) Protocol Version 1.2
279 DefineTLSCiphersuiteDefinition(TLS_RSA_WITH_AES_256_CBC_SHA256
, kTLSProtocol12
, kTLSProtocol12
),
280 DefineTLSCiphersuiteDefinition(TLS_RSA_WITH_AES_128_CBC_SHA256
, kTLSProtocol12
, kTLSProtocol12
),
281 DefineTLSCiphersuiteDefinition(SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA
, kTLSProtocol12
, kTLSProtocol12
),
282 DefineTLSCiphersuiteDefinition(SSL_RSA_WITH_3DES_EDE_CBC_SHA
, kTLSProtocol12
, kTLSProtocol12
),
283 DefineTLSCiphersuiteDefinition(TLS_DHE_RSA_WITH_AES_256_CBC_SHA256
, kTLSProtocol12
, kTLSProtocol12
),
284 DefineTLSCiphersuiteDefinition(TLS_DHE_RSA_WITH_AES_128_CBC_SHA256
, kTLSProtocol12
, kTLSProtocol12
),
286 // RFC 4492: Elliptic Curve Cryptography (ECC) Cipher Suites for Transport Layer Security (TLS)
287 DefineTLSCiphersuiteDefinition(TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA
, kTLSProtocol1
, kTLSProtocol11
),
288 DefineTLSCiphersuiteDefinition(TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA
, kTLSProtocol1
, kTLSProtocol11
),
289 DefineTLSCiphersuiteDefinition(TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA
, kTLSProtocol1
, kTLSProtocol11
),
290 DefineTLSCiphersuiteDefinition(TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA
, kTLSProtocol1
, kTLSProtocol11
),
291 DefineTLSCiphersuiteDefinition(TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA
, kTLSProtocol1
, kTLSProtocol11
),
292 DefineTLSCiphersuiteDefinition(TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA
, kTLSProtocol1
, kTLSProtocol11
),
294 // RFC 3268: Advanced Encryption Standard (AES) Ciphersuites for Transport Layer Security (TLS)
295 DefineTLSCiphersuiteDefinition(TLS_RSA_WITH_AES_256_CBC_SHA
, kTLSProtocol1
, kTLSProtocol11
),
296 DefineTLSCiphersuiteDefinition(TLS_RSA_WITH_AES_128_CBC_SHA
, kTLSProtocol1
, kTLSProtocol11
),
297 DefineTLSCiphersuiteDefinition(TLS_RSA_WITH_AES_256_CBC_SHA
, kTLSProtocol1
, kTLSProtocol11
),
298 DefineTLSCiphersuiteDefinition(TLS_DHE_RSA_WITH_AES_256_CBC_SHA
, kTLSProtocol1
, kTLSProtocol11
),
299 DefineTLSCiphersuiteDefinition(TLS_RSA_WITH_AES_128_CBC_SHA
, kTLSProtocol1
, kTLSProtocol11
),
300 DefineTLSCiphersuiteDefinition(TLS_DHE_RSA_WITH_AES_128_CBC_SHA
, kTLSProtocol1
, kTLSProtocol11
),
301 DefineTLSCiphersuiteDefinition(TLS_DHE_RSA_WITH_AES_256_CBC_SHA
, kTLSProtocol1
, kTLSProtocol11
),
302 DefineTLSCiphersuiteDefinition(TLS_DHE_RSA_WITH_AES_128_CBC_SHA
, kTLSProtocol1
, kTLSProtocol11
),
305 // Size of the definition list
306 static const size_t tls_ciphersuite_definitions_length
= \
307 sizeof(tls_ciphersuite_definitions
) / sizeof(struct tls_ciphersuite_definition
);
309 // Remove macro definitions
310 #undef CiphersuitesTLS13
311 #undef CiphersuitesPFS
312 #undef CiphersuitesNonPFS
313 #undef CiphersuitesTLS10_3DES
314 #undef CiphersuitesTLS10
315 #undef CiphersuitesDHE
316 #undef DefineTLSCiphersuiteGroupList
317 #undef DefineTLSCiphersuiteDefinition
319 const SSLCipherSuite
*
320 SSLCiphersuiteGroupToCiphersuiteList(SSLCiphersuiteGroup group
, size_t *listSize
)
322 if (listSize
== NULL
) {
326 const SSLCipherSuite
*ciphersuites
= NULL
;
329 #define CASE_CONFIG(GROUPNAME) \
331 ciphersuites = List##GROUPNAME; \
332 count = sizeof(List##GROUPNAME) / sizeof(SSLCipherSuite); \
336 CASE_CONFIG(kSSLCiphersuiteGroupDefault
);
337 CASE_CONFIG(kSSLCiphersuiteGroupCompatibility
);
338 CASE_CONFIG(kSSLCiphersuiteGroupLegacy
);
339 CASE_CONFIG(kSSLCiphersuiteGroupATS
);
340 CASE_CONFIG(kSSLCiphersuiteGroupATSCompatibility
);
345 if (ciphersuites
!= NULL
) {
355 SSLCiphersuiteMinimumTLSVersion(SSLCipherSuite ciphersuite
)
357 for (size_t i
= 0; i
< tls_ciphersuite_definitions_length
; i
++) {
358 if (tls_ciphersuite_definitions
[i
].ciphersuite
== ciphersuite
) {
359 return tls_ciphersuite_definitions
[i
].min_version
;
362 return kSSLProtocolUnknown
;
366 SSLCiphersuiteMaximumTLSVersion(SSLCipherSuite ciphersuite
)
368 for (size_t i
= 0; i
< tls_ciphersuite_definitions_length
; i
++) {
369 if (tls_ciphersuite_definitions
[i
].ciphersuite
== ciphersuite
) {
370 return tls_ciphersuite_definitions
[i
].max_version
;
373 return kSSLProtocolUnknown
;
377 * Convert an array of uint16_t
378 * to an array of SSLCipherSuites.
381 cipherSuitesToCipherSuites(
382 size_t numCipherSuites
,
383 const uint16_t *cipherSuites
,
384 SSLCipherSuite
*ciphers
, /* RETURNED */
385 size_t *numCiphers
) /* IN/OUT */
388 if(*numCiphers
< numCipherSuites
) {
389 return errSSLBufferOverflow
;
392 /* NOTE: this is required to go from uint16_t to SSLCipherSuite
393 which is either 32 or 16 bits, depending on the platform */
394 for(i
=0;i
<numCipherSuites
; i
++) {
395 ciphers
[i
]=cipherSuites
[i
];
397 *numCiphers
= numCipherSuites
;
398 return errSecSuccess
;
402 *** Publically exported functions declared in SecureTransport.h
406 * Determine number and values of all of the SSLCipherSuites we support.
407 * Caller allocates output buffer for SSLGetSupportedCiphers() and passes in
408 * its size in *numCiphers. If supplied buffer is too small, errSSLBufferOverflow
412 SSLGetNumberSupportedCiphers (SSLContextRef ctx
,
415 if((ctx
== NULL
) || (numCiphers
== NULL
)) {
418 *numCiphers
= STCipherSuiteCount
;
419 return errSecSuccess
;
423 SSLGetSupportedCiphers (SSLContextRef ctx
,
424 SSLCipherSuite
*ciphers
, /* RETURNED */
425 size_t *numCiphers
) /* IN/OUT */
427 if((ctx
== NULL
) || (ciphers
== NULL
) || (numCiphers
== NULL
)) {
430 return cipherSuitesToCipherSuites(STCipherSuiteCount
,
437 * Specify a (typically) restricted set of SSLCipherSuites to be enabled by
438 * the current SSLContext. Can only be called when no session is active. Default
439 * set of enabled SSLCipherSuites is NOT the same as the complete set of supported
440 * SSLCipherSuites as obtained by SSLGetSupportedCiphers().
443 SSLSetEnabledCiphers (SSLContextRef ctx
,
444 const SSLCipherSuite
*ciphers
,
449 if((ctx
== NULL
) || (ciphers
== NULL
) || (numCiphers
== 0)) {
453 if(sslIsSessionActive(ctx
)) {
454 /* can't do this with an active session */
459 for(int i
=0; i
<numCiphers
; i
++) {
460 for (int j
=0; j
< STCipherSuiteCount
; j
++) {
461 if (STKnownCipherSuites
[j
] == ciphers
[i
]) {
468 // If the caller specified no ciphersuites that we actually support, return an error code.
469 if (matchCount
== 0) {
473 cs
= (uint16_t *)sslMalloc(matchCount
* sizeof(uint16_t));
475 return errSecAllocate
;
479 for(int i
=0; i
<numCiphers
; i
++) {
480 for (int j
=0; j
< STCipherSuiteCount
; j
++) {
481 if (STKnownCipherSuites
[j
] == ciphers
[i
]) {
482 cs
[matchCount
++] = ciphers
[i
];
489 OSStatus result
= tls_handshake_set_ciphersuites(ctx
->hdsk
, cs
, (unsigned) matchCount
);
497 * Determine number and values of all of the SSLCipherSuites currently enabled.
498 * Caller allocates output buffer for SSLGetEnabledCiphers() and passes in
499 * its size in *numCiphers. If supplied buffer is too small, errSSLBufferOverflow
503 SSLGetNumberEnabledCiphers (SSLContextRef ctx
,
506 if((ctx
== NULL
) || (numCiphers
== NULL
)) {
511 const uint16_t *ciphersuites
;
514 err
= tls_handshake_get_ciphersuites(ctx
->hdsk
, &ciphersuites
, &n
);
520 return errSecSuccess
;
525 SSLGetEnabledCiphers (SSLContextRef ctx
,
526 SSLCipherSuite
*ciphers
, /* RETURNED */
527 size_t *numCiphers
) /* IN/OUT */
529 if((ctx
== NULL
) || (ciphers
== NULL
) || (numCiphers
== NULL
)) {
534 const uint16_t *ciphersuites
;
537 err
= tls_handshake_get_ciphersuites(ctx
->hdsk
, &ciphersuites
, &n
);
542 return cipherSuitesToCipherSuites(n
,
550 SSLSetSessionTicketsEnabled (SSLContextRef context
,
553 if (context
== NULL
) {
557 return tls_handshake_set_session_ticket_enabled(context
->hdsk
, enabled
);