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"
37 #include <tls_handshake.h>
41 #include <Security/SecBase.h>
43 #include <TargetConditionals.h>
46 /* SecureTransport needs it's own copy of KnownCipherSuites for now, there is a copy in coreTLS,
47 that is exported, but it actually should only included the "default" not the supported */
50 #define ENABLE_AES_GCM 1
53 static const uint16_t STKnownCipherSuites
[] = {
55 TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
,
56 TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
,
58 TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384
,
59 TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256
,
60 TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA
,
61 TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA
,
62 TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA
,
64 TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
,
65 TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
,
67 TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384
,
68 TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256
,
69 TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA
,
70 TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA
,
71 TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA
,
74 TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384
,
75 TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256
,
77 TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384
,
78 TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256
,
79 TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA
,
80 TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA
,
81 TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA
,
83 TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384
,
84 TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256
,
86 TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384
,
87 TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256
,
88 TLS_ECDH_RSA_WITH_AES_256_CBC_SHA
,
89 TLS_ECDH_RSA_WITH_AES_128_CBC_SHA
,
90 TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA
,
94 TLS_DHE_RSA_WITH_AES_256_GCM_SHA384
,
95 TLS_DHE_RSA_WITH_AES_128_GCM_SHA256
,
96 #endif // ENABLE_AES_GCM
97 TLS_DHE_RSA_WITH_AES_256_CBC_SHA256
,
98 TLS_DHE_RSA_WITH_AES_128_CBC_SHA256
,
99 TLS_DHE_RSA_WITH_AES_256_CBC_SHA
,
100 TLS_DHE_RSA_WITH_AES_128_CBC_SHA
,
101 SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA
,
104 TLS_RSA_WITH_AES_256_GCM_SHA384
,
105 TLS_RSA_WITH_AES_128_GCM_SHA256
,
107 TLS_RSA_WITH_AES_256_CBC_SHA256
,
108 TLS_RSA_WITH_AES_128_CBC_SHA256
,
109 TLS_RSA_WITH_AES_256_CBC_SHA
,
110 TLS_RSA_WITH_AES_128_CBC_SHA
,
111 SSL_RSA_WITH_3DES_EDE_CBC_SHA
,
114 TLS_ECDHE_ECDSA_WITH_RC4_128_SHA
,
115 TLS_ECDHE_RSA_WITH_RC4_128_SHA
,
116 TLS_ECDH_ECDSA_WITH_RC4_128_SHA
,
117 TLS_ECDH_RSA_WITH_RC4_128_SHA
,
118 SSL_RSA_WITH_RC4_128_SHA
,
119 SSL_RSA_WITH_RC4_128_MD5
,
123 /* Unsafe ciphersuites */
126 TLS_DH_anon_WITH_AES_256_GCM_SHA384
,
127 TLS_DH_anon_WITH_AES_128_GCM_SHA256
,
129 TLS_DH_anon_WITH_AES_128_CBC_SHA256
,
130 TLS_DH_anon_WITH_AES_256_CBC_SHA256
,
131 TLS_DH_anon_WITH_AES_128_CBC_SHA
,
132 TLS_DH_anon_WITH_AES_256_CBC_SHA
,
133 SSL_DH_anon_WITH_RC4_128_MD5
,
134 SSL_DH_anon_WITH_3DES_EDE_CBC_SHA
,
136 TLS_ECDHE_ECDSA_WITH_NULL_SHA
,
137 TLS_ECDHE_RSA_WITH_NULL_SHA
,
139 TLS_ECDH_ECDSA_WITH_NULL_SHA
,
140 TLS_ECDH_RSA_WITH_NULL_SHA
,
144 TLS_PSK_WITH_AES_256_CBC_SHA384
,
145 TLS_PSK_WITH_AES_128_CBC_SHA256
,
146 TLS_PSK_WITH_AES_256_CBC_SHA
,
147 TLS_PSK_WITH_AES_128_CBC_SHA
,
148 TLS_PSK_WITH_RC4_128_SHA
,
149 TLS_PSK_WITH_3DES_EDE_CBC_SHA
,
150 TLS_PSK_WITH_NULL_SHA384
,
151 TLS_PSK_WITH_NULL_SHA256
,
152 TLS_PSK_WITH_NULL_SHA
,
155 TLS_RSA_WITH_NULL_SHA256
,
156 SSL_RSA_WITH_NULL_SHA
,
157 SSL_RSA_WITH_NULL_MD5
161 static const unsigned STCipherSuiteCount
= sizeof(STKnownCipherSuites
)/sizeof(STKnownCipherSuites
[0]);
164 * Build ctx->validCipherSpecs as a copy of KnownCipherSpecs, assuming that
165 * validCipherSpecs is currently not valid (i.e., SSLSetEnabledCiphers() has
168 OSStatus
sslBuildCipherSuiteArray(SSLContext
*ctx
)
174 assert(ctx
->validCipherSuites
== NULL
);
176 ctx
->numValidCipherSuites
= STCipherSuiteCount
;
177 size
= STCipherSuiteCount
* sizeof(uint16_t);
178 ctx
->validCipherSuites
= (uint16_t *)sslMalloc(size
);
179 if(ctx
->validCipherSuites
== NULL
) {
180 ctx
->numValidCipherSuites
= 0;
181 return errSecAllocate
;
185 * Trim out inappropriate ciphers:
186 * -- trim anonymous ciphers if !ctx->anonCipherEnable
187 * -- trim ECDSA ciphers for server side if appropriate
188 * -- trim ECDSA ciphers if TLSv1 disable or SSLv2 enabled (since
189 * we MUST do the Client Hello extensions to make these ciphers
191 * -- trim Stream ciphers if DTLSv1 enable
192 * -- trim CBC ciphers when doing SSLv3 fallback
194 uint16_t *dst
= ctx
->validCipherSuites
;
195 const uint16_t *src
= STKnownCipherSuites
;
197 bool trimDHE
= !ctx
->dheEnabled
;
198 bool trimECDHE
= false;
199 const bool trimECDH
= true;
201 if(ctx
->maxProtocolVersion
== SSL_Version_3_0
) {
202 /* We trim ECDSA cipher suites if SSL2 is enabled or
203 The maximum allowed protocol is SSL3. Note that this
204 won't trim ECDSA cipherspecs for DTLS which should be
205 the right thing to do here. */
209 /* trim Stream Ciphers for DTLS */
210 bool trimRC4
= ctx
->isDTLS
;
212 /* trim CBC cipher when doing SSLv3 only fallback */
213 bool trimCBC
= (ctx
->protocolSide
==kSSLClientSide
)
214 && (ctx
->maxProtocolVersion
== SSL_Version_3_0
)
215 && ctx
->fallbackEnabled
;
217 for(dex
=0; dex
<STCipherSuiteCount
; dex
++) {
218 KeyExchangeMethod kem
= sslCipherSuiteGetKeyExchangeMethod(*src
);
219 uint8_t keySize
= sslCipherSuiteGetSymmetricCipherKeySize(*src
);
220 HMAC_Algs mac
= sslCipherSuiteGetMacAlgorithm(*src
);
221 SSL_CipherAlgorithm cipher
= sslCipherSuiteGetSymmetricCipherAlgorithm(*src
);
222 /* Skip ciphers as appropriate */
224 case SSL_ECDHE_ECDSA
:
228 ctx
->numValidCipherSuites
--;
240 ctx
->numValidCipherSuites
--;
250 ctx
->numValidCipherSuites
--;
257 if(!ctx
->anonCipherEnable
) {
258 /* trim out the anonymous (and null-auth-cipher) ciphers */
261 ctx
->numValidCipherSuites
--;
267 case SSL_DH_anon_EXPORT
:
270 ctx
->numValidCipherSuites
--;
278 /* This will skip the simple DES cipher suites, but not the NULL cipher ones */
282 ctx
->numValidCipherSuites
--;
287 /* Trim PSK ciphersuites, they need to be enabled explicitely */
289 ctx
->numValidCipherSuites
--;
294 if (trimRC4
&& (cipher
==SSL_CipherAlgorithmRC4_128
)) {
295 ctx
->numValidCipherSuites
--;
302 case SSL_CipherAlgorithmAES_128_CBC
:
303 case SSL_CipherAlgorithmAES_256_CBC
:
304 case SSL_CipherAlgorithm3DES_CBC
:
305 ctx
->numValidCipherSuites
--;
313 if(cipher
==SSL_CipherAlgorithmNull
) {
314 ctx
->numValidCipherSuites
--;
319 /* This one is good to go */
323 tls_handshake_set_ciphersuites(ctx
->hdsk
, ctx
->validCipherSuites
, ctx
->numValidCipherSuites
);
325 return errSecSuccess
;
330 * Convert an array of uint16_t
331 * to an array of SSLCipherSuites.
334 cipherSuitesToCipherSuites(
335 size_t numCipherSuites
,
336 const uint16_t *cipherSuites
,
337 SSLCipherSuite
*ciphers
, /* RETURNED */
338 size_t *numCiphers
) /* IN/OUT */
341 if(*numCiphers
< numCipherSuites
) {
342 return errSSLBufferOverflow
;
345 /* NOTE: this is required to go from uint16_t to SSLCipherSuite
346 which is either 32 or 16 bits, depending on the platform */
347 for(i
=0;i
<numCipherSuites
; i
++) {
348 ciphers
[i
]=cipherSuites
[i
];
350 *numCiphers
= numCipherSuites
;
351 return errSecSuccess
;
355 *** Publically exported functions declared in SecureTransport.h
359 * Determine number and values of all of the SSLCipherSuites we support.
360 * Caller allocates output buffer for SSLGetSupportedCiphers() and passes in
361 * its size in *numCiphers. If supplied buffer is too small, errSSLBufferOverflow
365 SSLGetNumberSupportedCiphers (SSLContextRef ctx
,
368 if((ctx
== NULL
) || (numCiphers
== NULL
)) {
371 *numCiphers
= STCipherSuiteCount
;
372 return errSecSuccess
;
376 SSLGetSupportedCiphers (SSLContextRef ctx
,
377 SSLCipherSuite
*ciphers
, /* RETURNED */
378 size_t *numCiphers
) /* IN/OUT */
380 if((ctx
== NULL
) || (ciphers
== NULL
) || (numCiphers
== NULL
)) {
383 return cipherSuitesToCipherSuites(STCipherSuiteCount
,
390 * Specify a (typically) restricted set of SSLCipherSuites to be enabled by
391 * the current SSLContext. Can only be called when no session is active. Default
392 * set of enabled SSLCipherSuites is NOT the same as the complete set of supported
393 * SSLCipherSuites as obtained by SSLGetSupportedCiphers().
396 SSLSetEnabledCiphers (SSLContextRef ctx
,
397 const SSLCipherSuite
*ciphers
,
401 unsigned foundCiphers
=0;
405 if((ctx
== NULL
) || (ciphers
== NULL
) || (numCiphers
== 0)) {
408 if(sslIsSessionActive(ctx
)) {
409 /* can't do this with an active session */
412 size
= numCiphers
* sizeof(uint16_t);
413 ctx
->validCipherSuites
= (uint16_t *)sslMalloc(size
);
414 if(ctx
->validCipherSuites
== NULL
) {
415 ctx
->numValidCipherSuites
= 0;
416 return errSecAllocate
;
420 * Run thru caller's specs, keep only the supported ones.
422 for(callerDex
=0; callerDex
<numCiphers
; callerDex
++) {
423 /* find matching CipherSpec in our known table */
424 for(tableDex
=0; tableDex
<STCipherSuiteCount
; tableDex
++) {
425 if(ciphers
[callerDex
] == STKnownCipherSuites
[tableDex
]) {
426 ctx
->validCipherSuites
[foundCiphers
] = STKnownCipherSuites
[tableDex
];
433 if(foundCiphers
==0) {
434 /* caller specified only unsupported ciphersuites */
435 sslFree(ctx
->validCipherSuites
);
436 ctx
->validCipherSuites
= NULL
;
437 return errSSLBadCipherSuite
;
441 ctx
->numValidCipherSuites
= foundCiphers
;
443 tls_handshake_set_ciphersuites(ctx
->hdsk
, ctx
->validCipherSuites
, ctx
->numValidCipherSuites
);
445 return errSecSuccess
;
449 * Determine number and values of all of the SSLCipherSuites currently enabled.
450 * Caller allocates output buffer for SSLGetEnabledCiphers() and passes in
451 * its size in *numCiphers. If supplied buffer is too small, errSSLBufferOverflow
455 SSLGetNumberEnabledCiphers (SSLContextRef ctx
,
458 if((ctx
== NULL
) || (numCiphers
== NULL
)) {
463 const uint16_t *ciphersuites
;
466 err
= tls_handshake_get_ciphersuites(ctx
->hdsk
, &ciphersuites
, &n
);
472 return errSecSuccess
;
477 SSLGetEnabledCiphers (SSLContextRef ctx
,
478 SSLCipherSuite
*ciphers
, /* RETURNED */
479 size_t *numCiphers
) /* IN/OUT */
481 if((ctx
== NULL
) || (ciphers
== NULL
) || (numCiphers
== NULL
)) {
486 const uint16_t *ciphersuites
;
489 err
= tls_handshake_get_ciphersuites(ctx
->hdsk
, &ciphersuites
, &n
);
491 return cipherSuitesToCipherSuites(n
,