8 #include <CoreFoundation/CoreFoundation.h>
10 #include <AssertMacros.h>
11 #include <Security/SecureTransportPriv.h> /* SSLSetOption */
12 #include <Security/SecureTransport.h>
13 #include <Security/SecPolicy.h>
14 #include <Security/SecTrust.h>
15 #include <Security/SecIdentity.h>
16 #include <Security/SecIdentityPriv.h>
17 #include <Security/SecCertificatePriv.h>
18 #include <Security/SecKeyPriv.h>
19 #include <Security/SecItem.h>
20 #include <Security/SecRandom.h>
22 #include <utilities/array_size.h>
23 #include <utilities/SecCFRelease.h>
25 #include <sys/types.h>
26 #include <sys/socket.h>
29 #include <mach/mach_time.h>
31 #include <tls_ciphersuites.h>
34 #include <Security/SecRSAKey.h>
37 #include "ssl_regressions.h"
38 #include "ssl-utils.h"
44 static const SSLCipherSuite SupportedCipherSuites
[] = {
46 TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
,
47 TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
,
48 TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384
,
49 TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256
,
50 TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA
,
51 TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA
,
52 TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA
,
54 TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
,
55 TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
,
56 TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384
,
57 TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256
,
58 TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA
,
59 TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA
,
60 TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA
,
62 TLS_DHE_RSA_WITH_AES_256_GCM_SHA384
,
63 TLS_DHE_RSA_WITH_AES_128_GCM_SHA256
,
64 TLS_DHE_RSA_WITH_AES_256_CBC_SHA256
,
65 TLS_DHE_RSA_WITH_AES_128_CBC_SHA256
,
66 TLS_DHE_RSA_WITH_AES_256_CBC_SHA
,
67 TLS_DHE_RSA_WITH_AES_128_CBC_SHA
,
68 SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA
,
70 TLS_RSA_WITH_AES_256_GCM_SHA384
,
71 TLS_RSA_WITH_AES_128_GCM_SHA256
,
72 TLS_RSA_WITH_AES_256_CBC_SHA256
,
73 TLS_RSA_WITH_AES_128_CBC_SHA256
,
74 TLS_RSA_WITH_AES_256_CBC_SHA
,
75 TLS_RSA_WITH_AES_128_CBC_SHA
,
76 SSL_RSA_WITH_3DES_EDE_CBC_SHA
,
79 TLS_ECDHE_ECDSA_WITH_RC4_128_SHA
,
80 TLS_ECDHE_RSA_WITH_RC4_128_SHA
,
81 SSL_RSA_WITH_RC4_128_SHA
,
82 SSL_RSA_WITH_RC4_128_MD5
,
84 /* Unsafe ciphersuites */
86 TLS_DH_anon_WITH_AES_256_GCM_SHA384
,
87 TLS_DH_anon_WITH_AES_128_GCM_SHA256
,
88 TLS_DH_anon_WITH_AES_128_CBC_SHA256
,
89 TLS_DH_anon_WITH_AES_256_CBC_SHA256
,
90 TLS_DH_anon_WITH_AES_128_CBC_SHA
,
91 TLS_DH_anon_WITH_AES_256_CBC_SHA
,
92 SSL_DH_anon_WITH_RC4_128_MD5
,
93 SSL_DH_anon_WITH_3DES_EDE_CBC_SHA
,
95 TLS_ECDH_anon_WITH_NULL_SHA
,
96 TLS_ECDH_anon_WITH_RC4_128_SHA
,
97 TLS_ECDH_anon_WITH_3DES_EDE_CBC_SHA
,
98 TLS_ECDH_anon_WITH_AES_128_CBC_SHA
,
99 TLS_ECDH_anon_WITH_AES_256_CBC_SHA
,
101 TLS_ECDHE_ECDSA_WITH_NULL_SHA
,
102 TLS_ECDHE_RSA_WITH_NULL_SHA
,
104 TLS_PSK_WITH_AES_256_CBC_SHA384
,
105 TLS_PSK_WITH_AES_128_CBC_SHA256
,
106 TLS_PSK_WITH_AES_256_CBC_SHA
,
107 TLS_PSK_WITH_AES_128_CBC_SHA
,
108 TLS_PSK_WITH_RC4_128_SHA
,
109 TLS_PSK_WITH_3DES_EDE_CBC_SHA
,
110 TLS_PSK_WITH_NULL_SHA384
,
111 TLS_PSK_WITH_NULL_SHA256
,
112 TLS_PSK_WITH_NULL_SHA
,
114 TLS_RSA_WITH_NULL_SHA256
,
115 SSL_RSA_WITH_NULL_SHA
,
116 SSL_RSA_WITH_NULL_MD5
120 static const unsigned SupportedCipherSuitesCount
= sizeof(SupportedCipherSuites
)/sizeof(SupportedCipherSuites
[0]);
123 static int protos
[]={kTLSProtocol1
, kTLSProtocol11
, kTLSProtocol12
, kDTLSProtocol1
};
124 static int nprotos
= sizeof(protos
)/sizeof(protos
[0]);
127 static unsigned char dh_param_1024_bytes
[] = {
128 0x30, 0x81, 0x87, 0x02, 0x81, 0x81, 0x00, 0xf2, 0x56, 0xb9, 0x41, 0x74,
129 0x8c, 0x54, 0x22, 0xad, 0x94, 0x2b, 0xed, 0x83, 0xb9, 0xa0, 0x2f, 0x40,
130 0xce, 0xf8, 0xec, 0x96, 0xed, 0xcd, 0x8e, 0xfc, 0xf8, 0xdd, 0x06, 0x15,
131 0xbc, 0x68, 0x0d, 0x0e, 0x2c, 0xef, 0x00, 0x71, 0x28, 0x3d, 0x27, 0x6d,
132 0x5e, 0x42, 0x8c, 0xbd, 0x0f, 0x07, 0x23, 0x9d, 0x07, 0x8e, 0x52, 0x47,
133 0xa2, 0x5d, 0xf8, 0xd9, 0x9a, 0x7b, 0xb4, 0xab, 0xd2, 0xa3, 0x39, 0xe9,
134 0x2c, 0x3b, 0x9b, 0xaa, 0xbe, 0x4e, 0x01, 0x36, 0x16, 0xc2, 0x9e, 0x7b,
135 0x38, 0x78, 0x82, 0xd0, 0xed, 0x8e, 0x1e, 0xce, 0xa6, 0x23, 0x95, 0xae,
136 0x31, 0x66, 0x58, 0x60, 0x44, 0xdf, 0x1f, 0x9c, 0x68, 0xbf, 0x8b, 0xf1,
137 0xb4, 0xa8, 0xe7, 0xb2, 0x43, 0x8b, 0xa9, 0x3d, 0xa1, 0xb7, 0x1a, 0x11,
138 0xcf, 0xf4, 0x5e, 0xf7, 0x08, 0xf6, 0x84, 0x1c, 0xd7, 0xfa, 0x40, 0x10,
139 0xdc, 0x64, 0x83, 0x02, 0x01, 0x02
141 static unsigned char *dh_param_der
= dh_param_1024_bytes
;
142 static unsigned int dh_param_der_len
= sizeof(dh_param_1024_bytes
);
147 bool is_session_resume
;
151 SSLAuthenticate client_side_auth
;
155 CFArrayRef peer_certs
;
157 uint64_t time
; // output
160 #if 0 // currently unused
161 static CFArrayRef
SecIdentityCopySSLClientAuthenticationChain(SecIdentityRef identity
)
163 CFMutableArrayRef chain
= NULL
;
164 SecPolicyRef policy
= NULL
;
165 SecTrustRef trust
= NULL
;
166 SecTrustResultType trust_result
;
169 policy
= SecPolicyCreateSSL(false, NULL
);
173 SecCertificateRef cert
= NULL
;
174 if (SecIdentityCopyCertificate(identity
, &cert
))
177 CFArrayRef certs
= CFArrayCreate(NULL
, (const void **)&cert
,
178 1, &kCFTypeArrayCallBacks
);
183 if (SecTrustCreateWithCertificates(certs
, policy
, &trust
))
187 if (SecTrustEvaluate(trust
, &trust_result
))
190 int i
, count
= SecTrustGetCertificateCount(trust
);
191 chain
= CFArrayCreateMutable(NULL
, count
, &kCFTypeArrayCallBacks
);
192 CFArrayAppendValue(chain
, identity
);
193 for (i
= 1; i
< count
; i
++) {
194 if ((i
+1 == count
) && (trust_result
== kSecTrustResultUnspecified
))
195 continue; /* skip anchor if chain is complete */
196 SecCertificateRef s
= SecTrustGetCertificateAtIndex(trust
, i
);
197 CFArrayAppendValue(chain
, s
);
206 #endif // currently unused
209 // MARK: SecureTransport support
212 static void hexdump(const uint8_t *bytes
, size_t len
) {
214 printf("socket write(%p, %lu)\n", bytes
, len
);
215 for (ix
= 0; ix
< len
; ++ix
) {
218 printf("%02X ", bytes
[ix
]);
223 #define hexdump(bytes, len)
226 static OSStatus
SocketWrite(SSLConnectionRef conn
, const void *data
, size_t *length
)
228 size_t len
= *length
;
229 uint8_t *ptr
= (uint8_t *)data
;
235 ret
= write((int)conn
, ptr
, len
);
236 } while ((ret
< 0) && (errno
== EAGAIN
|| errno
== EINTR
));
245 *length
= *length
- len
;
246 return errSecSuccess
;
249 static OSStatus
SocketRead(SSLConnectionRef conn
, void *data
, size_t *length
)
251 size_t len
= *length
;
252 uint8_t *ptr
= (uint8_t *)data
;
257 ret
= read((int)conn
, ptr
, len
);
258 } while ((ret
< 0) && (errno
== EINPROGRESS
|| errno
== EAGAIN
|| errno
== EINTR
));
263 printf("read error(%d): ret=%zd, errno=%d\n", (int)conn
, ret
, errno
);
268 *length
= *length
- len
;
269 return errSecSuccess
;
272 static unsigned char dn
[] = {
273 0x30, 0x5e, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13,
274 0x02, 0x55, 0x53, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x0a,
275 0x13, 0x0a, 0x41, 0x70, 0x70, 0x6c, 0x65, 0x20, 0x49, 0x6e, 0x63, 0x2e,
276 0x31, 0x26, 0x30, 0x24, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x1d, 0x41,
277 0x70, 0x70, 0x6c, 0x65, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69,
278 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f,
279 0x72, 0x69, 0x74, 0x79, 0x31, 0x12, 0x30, 0x10, 0x06, 0x03, 0x55, 0x04,
280 0x03, 0x13, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x68, 0x6f, 0x73, 0x74
282 static unsigned int dn_len
= 96;
284 static SSLContextRef
make_ssl_ref(bool server
, SSLAuthenticate client_side_auth
, bool dh_anonymous
,
285 bool dtls
, int sock
, CFArrayRef certs
, SSLProtocol proto
)
287 SSLContextRef ctx
= SSLCreateContext(kCFAllocatorDefault
, server
?kSSLServerSide
:kSSLClientSide
, dtls
?kSSLDatagramType
:kSSLStreamType
);
292 require_noerr(SSLSetMaxDatagramRecordSize(ctx
, 400), out
);
293 require_noerr(SSLGetMaxDatagramRecordSize(ctx
, &mtu
), out
);
295 require_noerr(SSLSetProtocolVersionMax(ctx
, proto
), out
);
297 require_noerr(SSLSetIOFuncs(ctx
,
298 (SSLReadFunc
)SocketRead
, (SSLWriteFunc
)SocketWrite
), out
);
299 require_noerr(SSLSetConnection(ctx
, (SSLConnectionRef
)(intptr_t)sock
), out
);
300 static const char *peer_domain_name
= "localhost";
301 require_noerr(SSLSetPeerDomainName(ctx
, peer_domain_name
,
302 strlen(peer_domain_name
)), out
);
304 require_noerr(SSLSetMinimumDHGroupSize(ctx
, 512), out
);
308 require_noerr(SSLSetCertificate(ctx
, certs
), out
);
309 if ((client_side_auth
!= kNeverAuthenticate
) && server
) {
310 SSLAuthenticate auth
;
311 require_noerr(SSLSetClientSideAuthenticate(ctx
, client_side_auth
), out
);
312 require_noerr(SSLGetClientSideAuthenticate(ctx
, &auth
), out
);
313 require(auth
==client_side_auth
, out
);
314 require_noerr(SSLAddDistinguishedName(ctx
, dn
, dn_len
), out
);
316 #if 0 /* Setting client certificate in advance */
317 if ((client_side_auth
== kAlwaysAuthenticate
) && !server
)
318 require_noerr(SSLSetCertificate(ctx
, certs
), out
);
320 if ((client_side_auth
!= kNeverAuthenticate
) && !server
) /* enable break from SSLHandshake */
321 require_noerr(SSLSetSessionOption(ctx
,
322 kSSLSessionOptionBreakOnCertRequested
, true), out
);
325 /* Set this option, even if doing anonDH or PSK - it should NOT break out in those case */
326 require_noerr(SSLSetSessionOption(ctx
, kSSLSessionOptionBreakOnServerAuth
, true), out
);
328 /* Tell SecureTransport to not check certs itself: it will break out of the
329 handshake to let us take care of it instead. */
330 require_noerr(SSLSetEnableCertVerify(ctx
, false), out
);
333 require_noerr(SSLSetDiffieHellmanParams(ctx
,
334 dh_param_der
, dh_param_der_len
), out
);
336 else /* if client */ {
346 static bool check_peer_cert(SSLContextRef ctx
, const ssl_test_handle
*ssl
, SecTrustRef
*trust
)
348 CFMutableArrayRef peer_cert_array
= NULL
;
349 CFMutableArrayRef orig_peer_cert_array
= NULL
;
351 /* verify peer cert chain */
352 require_noerr(SSLCopyPeerTrust(ctx
, trust
), out
);
353 SecTrustResultType trust_result
= 0;
354 /* this won't verify without setting up a trusted anchor */
355 require_noerr(SecTrustEvaluate(*trust
, &trust_result
), out
);
357 CFIndex n_certs
= SecTrustGetCertificateCount(*trust
);
359 peer_cert_array
= CFArrayCreateMutable(NULL
, n_certs
, &kCFTypeArrayCallBacks
);
360 orig_peer_cert_array
= CFArrayCreateMutableCopy(NULL
, n_certs
, ssl
->peer_certs
);
362 CFArrayInsertValueAtIndex(peer_cert_array
, 0,
363 SecTrustGetCertificateAtIndex(*trust
, n_certs
));
365 SecIdentityRef ident
=
366 (SecIdentityRef
)CFArrayGetValueAtIndex(orig_peer_cert_array
, 0);
367 SecCertificateRef peer_cert
= NULL
;
368 require_noerr(SecIdentityCopyCertificate(ident
, &peer_cert
), out
);
369 CFArraySetValueAtIndex(orig_peer_cert_array
, 0, peer_cert
);
370 CFRelease(peer_cert
);
372 require(CFEqual(orig_peer_cert_array
, peer_cert_array
), out
);
373 CFReleaseNull(orig_peer_cert_array
);
374 CFReleaseNull(peer_cert_array
);
378 CFReleaseNull(orig_peer_cert_array
);
379 CFReleaseNull(peer_cert_array
);
384 #include <mach/mach_time.h>
386 #define perf_start() uint64_t _perf_time = mach_absolute_time();
387 #define perf_scale_factor() ({struct mach_timebase_info info; mach_timebase_info(&info); ((double)info.numer) / (1000000.0 * info.denom);})
388 #define perf_time() ((mach_absolute_time() - _perf_time) * perf_scale_factor())
391 static void *securetransport_ssl_thread(void *arg
)
394 ssl_test_handle
* ssl
= (ssl_test_handle
*)arg
;
395 SSLContextRef ctx
= ssl
->st
;
396 SecTrustRef trust
= NULL
;
397 bool got_server_auth
= false, got_client_cert_req
= false;
398 SSLSessionState ssl_state
;
402 pthread_setname_np(ssl
->is_server
?"server thread":"client thread");
404 require_noerr(ortn
=SSLGetSessionState(ctx
,&ssl_state
), out
);
405 require_action(ssl_state
==kSSLIdle
, out
, ortn
= -1);
408 ortn
= SSLHandshake(ctx
);
409 require_noerr(SSLGetSessionState(ctx
,&ssl_state
), out
);
411 if (ortn
== errSSLPeerAuthCompleted
)
413 require_action(ssl_state
==kSSLHandshake
, out
, ortn
= -1);
414 require_string(!got_server_auth
, out
, "second server auth");
415 require_string(!ssl
->dh_anonymous
, out
, "server auth with anon cipher");
416 // Note: Previously, the implementation always returned errSSLPeerAuthCompleted before
417 // errSSLClientCertRequested. Due to OCSP stappling implementation, this is no longer guaranteed.
418 // This behavior change should not be an issue, but it's possible that some applications will
419 // have issue with this new behavior. If we do find out that this is causing an issue, then
420 // the following require statement should be re-enabled, and the implementation changed
421 // to implement the former behavior.
422 //require_string(!got_client_cert_req, out, "got client cert req before server auth");
423 got_server_auth
= true;
424 require_string(!trust
, out
, "Got errSSLServerAuthCompleted twice?");
425 require_string(check_peer_cert(ctx
, ssl
, &trust
), out
, "Certificate check failed");
426 } else if (ortn
== errSSLClientCertRequested
) {
427 require_action(ssl_state
==kSSLHandshake
, out
, ortn
= -1);
428 require_string(!got_client_cert_req
, out
, "second client cert req");
429 // Note: see Note above.
430 //require_string(got_server_auth, out, "didn't get server auth first");
431 got_client_cert_req
= true;
433 /* set client cert */
434 require_string(!ssl
->is_server
, out
, "errSSLClientCertRequested while running server");
435 require_string(!ssl
->dh_anonymous
, out
, "errSSLClientCertRequested while running anon DH");
437 CFArrayRef DNs
= NULL
;
438 require_noerr(SSLCopyDistinguishedNames (ctx
, &DNs
), out
);
442 require_string(ssl
->client_side_auth
!= kNeverAuthenticate
, out
, "errSSLClientCertRequested in run not testing that");
443 if(ssl
->client_side_auth
== kAlwaysAuthenticate
) { // Only set a client cert in mode 1.
444 require_noerr(SSLSetCertificate(ctx
, ssl
->certs
), out
);
446 } else if (ortn
== errSSLWouldBlock
) {
447 require_action(ssl_state
==kSSLHandshake
, out
, ortn
= -1);
449 } while (ortn
== errSSLWouldBlock
450 || ortn
== errSSLServerAuthCompleted
451 || ortn
== errSSLClientCertRequested
);
452 require_noerr_action_quiet(ortn
, out
,
453 fprintf(stderr
, "Fell out of SSLHandshake with error: %d (%s)\n", (int)ortn
, ssl
->is_server
?"server":"client"));
455 require_action(ssl_state
==kSSLConnected
, out
, ortn
= -1);
457 if (!ssl
->is_server
&& !ssl
->dh_anonymous
&& !ssl
->is_session_resume
) {
458 require_string(got_server_auth
, out
, "never got server auth");
459 if (ssl
->client_side_auth
!= kNeverAuthenticate
)
460 require_string(got_client_cert_req
, out
, "never got client cert req");
463 if (!ssl
->is_server
&& !ssl
->dh_anonymous
&& ssl
->is_session_resume
) {
464 require_string(!got_server_auth
, out
, "got server auth during resumption??");
465 require_string(check_peer_cert(ctx
, ssl
, &trust
), out
, "Certificate check failed (resumption case)");
468 SSLCipherSuite cipherSuite
;
469 require_noerr_quiet(ortn
= SSLGetNegotiatedCipher(ctx
, &cipherSuite
), out
);
473 SSLGetDatagramWriteSize(ctx
, &sz
);
476 Boolean sessionWasResumed
= false;
477 uint8_t session_id_data
[MAX_SESSION_ID_LENGTH
];
478 size_t session_id_length
= sizeof(session_id_data
);
479 require_noerr_quiet(ortn
= SSLGetResumableSessionInfo(ctx
, &sessionWasResumed
, session_id_data
, &session_id_length
), out
);
480 require_action(ssl
->dh_anonymous
|| (ssl
->is_session_resume
== sessionWasResumed
), out
, ortn
= -1);
482 #define BUFSIZE (8*1024)
483 unsigned char ibuf
[BUFSIZE
], obuf
[BUFSIZE
];
485 for(int i
=0; i
<10; i
++) {
487 if (ssl
->is_server
) {
488 memset(obuf
, i
, BUFSIZE
);
489 require_noerr(ortn
= SSLWrite(ctx
, obuf
, BUFSIZE
, &len
), out
);
490 require_action(len
== BUFSIZE
, out
, ortn
= -1);
492 require_noerr(ortn
= SSLWrite(ctx
, obuf
, 0, &len
), out
);
493 require_action(len
== 0, out
, ortn
= -1);
499 ortn
= SSLRead(ctx
, ibuf
+len
, BUFSIZE
-len
, &l
);
503 require_noerr(ortn
, out
);
504 require_action(len
== BUFSIZE
, out
, ortn
= -1);
506 if (ssl
->is_server
) {
507 require_noerr(memcmp(ibuf
, obuf
, BUFSIZE
), out
);
509 require_noerr(ortn
= SSLWrite(ctx
, ibuf
, BUFSIZE
, &len
), out
);
510 require_action(len
== BUFSIZE
, out
, ortn
= -1);
517 if (trust
) CFRelease(trust
);
520 ssl
->time
= perf_time();
522 pthread_exit((void *)(intptr_t)ortn
);
528 static ssl_test_handle
*
529 ssl_test_handle_create(uint32_t session_id
, bool resume
, bool server
, SSLAuthenticate client_side_auth
, bool dh_anonymous
, bool dtls
,
530 int comm
, CFArrayRef certs
, CFArrayRef peer_certs
, SSLProtocol proto
)
532 ssl_test_handle
*handle
= calloc(1, sizeof(ssl_test_handle
));
534 handle
->session_id
= session_id
;
535 handle
->is_session_resume
= resume
;
536 handle
->is_server
= server
;
537 handle
->is_dtls
= dtls
;
538 handle
->client_side_auth
= client_side_auth
;
539 handle
->dh_anonymous
= dh_anonymous
;
541 handle
->certs
= certs
;
542 handle
->peer_certs
= peer_certs
;
543 handle
->proto
= proto
;
544 handle
->st
= make_ssl_ref(server
, client_side_auth
, dh_anonymous
, dtls
, comm
, certs
, proto
);
552 pthread_t client_thread
, server_thread
;
554 CFArrayRef server_rsa_certs
= server_chain();
555 CFArrayRef server_ec_certs
= server_ec_chain();
556 CFArrayRef client_certs
= trusted_client_chain();
557 require(server_rsa_certs
!= NULL
, end
);
558 require(server_ec_certs
!= NULL
, end
);
559 require(client_certs
!= NULL
, end
);
563 for (p
=0; p
<nprotos
; p
++)
564 for (k
=0; k
<3; k
++) /* client side auth mode:
565 0 (kSSLNeverAuthenticate): server doesn't request ,
566 1 (kSSLAlwaysAuthenticate): server request, client provide,
567 2 (kSSLTryAuthenticate): server request, client does not provide */
570 for (i
=0; i
<SupportedCipherSuitesCount
; i
++)
571 for (l
= 0; l
<2; l
++) { /* resumption or not */
572 uint16_t cs
= (uint16_t)(SupportedCipherSuites
[i
]);
573 KeyExchangeMethod kem
= sslCipherSuiteGetKeyExchangeMethod(cs
);
574 SSL_CipherAlgorithm cipher
= sslCipherSuiteGetSymmetricCipherAlgorithm(cs
);
575 tls_protocol_version min_version
= sslCipherSuiteGetMinSupportedTLSVersion(cs
);
577 CFArrayRef server_certs
;
579 if(kem
== SSL_ECDHE_ECDSA
) {
580 server_certs
= server_ec_certs
;
582 server_certs
= server_rsa_certs
;
587 bool dtls
= (protos
[p
] == kDTLSProtocol1
);
588 bool server_ok
= ((kem
!= SSL_ECDH_ECDSA
) && (kem
!= SSL_ECDH_RSA
) && (kem
!= SSL_ECDH_anon
));
589 bool dh_anonymous
= ((kem
== SSL_DH_anon
) || (kem
== TLS_PSK
));
594 version_ok
= cipher
!= SSL_CipherAlgorithmRC4_128
&& (min_version
!= tls_protocol_version_TLS_1_2
);
597 version_ok
= (min_version
== tls_protocol_version_SSL_3
);
601 version_ok
= (min_version
!= tls_protocol_version_TLS_1_2
);
611 skip("This ciphersuite is not supported by Server", 1, server_ok
);
612 skip("This ciphersuite is not supported for this protocol version", 1, version_ok
);
615 if (socketpair(AF_UNIX
, SOCK_STREAM
, 0, sp
)) {
618 fcntl(sp
[0], F_SETNOSIGPIPE
, 1);
619 fcntl(sp
[1], F_SETNOSIGPIPE
, 1);
621 ssl_test_handle
*server
, *client
;
622 size_t num_supported_ciphers
= 0;
623 SSLCipherSuite
*supported_ciphers
= NULL
;
625 SSLAuthenticate client_side_auth
= k
;
627 uint32_t session_id
= (p
<<24) | (k
<<16) | (i
+1);
628 server
= ssl_test_handle_create(session_id
, (l
== 1), true /*server*/,
629 client_side_auth
, dh_anonymous
, dtls
,
630 sp
[0], server_certs
, client_certs
, protos
[p
]);
631 client
= ssl_test_handle_create(session_id
, (l
== 1), false /*client*/,
632 client_side_auth
, dh_anonymous
, dtls
,
633 sp
[1], client_certs
, server_certs
, protos
[p
]);
635 require_noerr(SSLSetPeerID(server
->st
, &session_id
, sizeof(session_id
)), out
);
636 require_noerr(SSLSetPeerID(client
->st
, &session_id
, sizeof(session_id
)), out
);
638 /* set single cipher on client, default ciphers on server */
639 num_supported_ciphers
= 0;
640 require_noerr(SSLSetEnabledCiphers(client
->st
, &(SupportedCipherSuites
[i
]), 1), out
);
641 require_noerr(SSLGetNumberSupportedCiphers(server
->st
, &num_supported_ciphers
), out
);
642 require(supported_ciphers
=malloc(num_supported_ciphers
*sizeof(SSLCipherSuite
)), out
);
643 require_noerr(SSLGetSupportedCiphers(server
->st
, supported_ciphers
, &num_supported_ciphers
), out
);
644 require_noerr(SSLSetEnabledCiphers(server
->st
, supported_ciphers
, num_supported_ciphers
), out
);
646 require_noerr(SSLSetPSKSharedSecret(client
->st
, "123456789", 9), out
);
647 require_noerr(SSLSetPSKSharedSecret(server
->st
, "123456789", 9), out
);
649 pthread_create(&client_thread
, NULL
, securetransport_ssl_thread
, client
);
650 pthread_create(&server_thread
, NULL
, securetransport_ssl_thread
, server
);
652 intptr_t server_err
, client_err
;
653 pthread_join(client_thread
, (void*)&client_err
);
654 pthread_join(server_thread
, (void*)&server_err
);
657 // If you want to print an approximate time for each handshake.
658 printf("%4llu - %40s CSA:%d RESUME:%d PROTO:0x%04x\n",
660 ciphersuite_name(SupportedCipherSuites
[i
]),
661 server
->client_side_auth
,
665 ok(!server_err
&& !client_err
,
666 "%40s CSA:%d RESUME:%d PROTO:0x%04x",
667 ciphersuite_name(SupportedCipherSuites
[i
]),
668 server
->client_side_auth
,
673 free(supported_ciphers
);
680 CFReleaseSafe(client_certs
);
681 CFReleaseSafe(server_ec_certs
);
682 CFReleaseSafe(server_rsa_certs
);
685 int ssl_42_ciphers(int argc
, char *const *argv
)
688 plan_tests(3 * 2 * nprotos
* SupportedCipherSuitesCount
/* client auth 0/1/2 * #resumptions * #protos * #ciphers */);
696 TODO: count errSSLWouldBlock
697 TODO: skip tests that don't matter: client_auth and anonymous dh
698 TODO: we seem to only be negotiating tls - force a round of sslv3
699 TODO: allow secure transport to also defer client side auth to client
700 TODO: make sure anonymous dh is never selected if not expicitly enabled
701 TODO: make sure DHE is not available if not explicitly enabled and no parameters
703 TODO: resumable sessions