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>
24 #include <sys/types.h>
25 #include <sys/socket.h>
28 #include <mach/mach_time.h>
31 #include <Security/SecRSAKey.h>
34 #include "ssl_regressions.h"
35 #include "ssl-utils.h"
40 Below are all the ciphers that are individually tested. The first element
41 is the SecureTransport/RFC name; the second is what openssl calls it, which
42 can be looked up in ciphers(1).
44 All SSL_DH_* and TLS_DH_* are disabled because neither openssl nor
45 securetranport support them:
46 SSL_DH_DSS_EXPORT_WITH_DES40_CBC_SHA, SSL_DH_DSS_WITH_DES_CBC_SHA,
47 SSL_DH_DSS_WITH_3DES_EDE_CBC_SHA, SSL_DH_RSA_EXPORT_WITH_DES40_CBC_SHA,
48 SSL_DH_RSA_WITH_DES_CBC_SHA, SSL_DH_RSA_WITH_3DES_EDE_CBC_SHA,
49 TLS_DH_DSS_WITH_AES_128_CBC_SHA, TLS_DH_RSA_WITH_AES_128_CBC_SHA,
50 TLS_DH_DSS_WITH_AES_256_CBC_SHA, TLS_DH_RSA_WITH_AES_256_CBC_SHA,
52 DSS is unimplemented by securetransport on the phone:
53 SSL_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA, SSL_DHE_DSS_WITH_DES_CBC_SHA,
54 SSL_DHE_DSS_WITH_3DES_EDE_CBC_SHA, TLS_DHE_DSS_WITH_AES_128_CBC_SHA,
55 TLS_DHE_DSS_WITH_AES_256_CBC_SHA,
57 SSLv2 ciphersuites disabled by securetransport on phone:
58 SSL_RSA_WITH_RC2_CBC_MD5, SSL_RSA_WITH_IDEA_CBC_MD5,
59 SSL_RSA_WITH_DES_CBC_MD5, SSL_RSA_WITH_3DES_EDE_CBC_MD5,
61 SSLv3 ciphersuites disabled by securetransport on phone:
62 SSL_RSA_WITH_IDEA_CBC_SHA, SSL_RSA_EXPORT_WITH_RC2_CBC_40_MD5
64 Export ciphersuites disabled on iOS 5.0:
65 SSL_RSA_EXPORT_WITH_RC4_40_MD5, SSL_RSA_EXPORT_WITH_DES40_CBC_SHA,
66 SSL_RSA_WITH_DES_CBC_SHA, SSL_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA,
67 SSL_DHE_RSA_WITH_DES_CBC_SHA, SSL_DH_anon_EXPORT_WITH_RC4_40_MD5,
68 SSL_DH_anon_EXPORT_WITH_DES40_CBC_SHA, SSL_DH_anon_WITH_DES_CBC_SHA
72 typedef struct _CipherSuiteName
{
73 SSLCipherSuite cipher
;
78 #define CIPHER(cipher, dh_anonymous) { cipher, #cipher, dh_anonymous },
80 static const CipherSuiteName ciphers
[] = {
81 //SSL_NULL_WITH_NULL_NULL, unsupported
82 CIPHER(SSL_RSA_WITH_NULL_SHA
, false)
83 CIPHER(SSL_RSA_WITH_NULL_MD5
, false)
84 CIPHER(TLS_RSA_WITH_NULL_SHA256
, false)
86 CIPHER(SSL_RSA_WITH_RC4_128_MD5
, false)
87 CIPHER(SSL_RSA_WITH_RC4_128_SHA
, false)
88 CIPHER(SSL_RSA_WITH_3DES_EDE_CBC_SHA
, false)
90 CIPHER(SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA
, false)
91 CIPHER(SSL_DH_anon_WITH_RC4_128_MD5
, true)
92 CIPHER(SSL_DH_anon_WITH_3DES_EDE_CBC_SHA
, true)
93 CIPHER(TLS_DHE_RSA_WITH_AES_128_CBC_SHA
, false)
94 CIPHER(TLS_DH_anon_WITH_AES_128_CBC_SHA
, true)
95 CIPHER(TLS_DHE_RSA_WITH_AES_256_CBC_SHA
, false)
96 CIPHER(TLS_DH_anon_WITH_AES_256_CBC_SHA
, true)
98 CIPHER(TLS_RSA_WITH_AES_128_CBC_SHA
, false)
99 CIPHER(TLS_RSA_WITH_AES_256_CBC_SHA
, false)
102 CIPHER(TLS_PSK_WITH_AES_128_CBC_SHA
, true)
103 CIPHER(TLS_PSK_WITH_AES_256_CBC_SHA384
, true)
104 CIPHER(TLS_PSK_WITH_AES_128_CBC_SHA256
, true)
105 CIPHER(TLS_PSK_WITH_AES_256_CBC_SHA
, true)
106 CIPHER(TLS_PSK_WITH_AES_128_CBC_SHA
, true)
107 CIPHER(TLS_PSK_WITH_RC4_128_SHA
, true)
108 CIPHER(TLS_PSK_WITH_3DES_EDE_CBC_SHA
, true)
109 CIPHER(TLS_PSK_WITH_NULL_SHA384
, true)
110 CIPHER(TLS_PSK_WITH_NULL_SHA256
, true)
111 CIPHER(TLS_PSK_WITH_NULL_SHA
, true)
115 CIPHER(TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA
, false)
116 CIPHER(TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA
, false)
118 CIPHER(TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA
, false)
119 CIPHER(TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA
, false)
121 CIPHER(TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA
, false)
122 CIPHER(TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA
, false)
124 CIPHER(TLS_ECDH_anon_WITH_AES_128_CBC_SHA
, true)
125 CIPHER(TLS_ECDH_anon_WITH_AES_256_CBC_SHA
, true)
127 CIPHER(TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256
, false)
128 CIPHER(TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384
, false)
129 CIPHER(TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256
, false)
130 CIPHER(TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384
, false)
134 CIPHER(TLS_RSA_WITH_AES_256_GCM_SHA384
, false)
135 CIPHER(TLS_RSA_WITH_AES_128_GCM_SHA256
, false)
138 /* Export ciphers are disabled */
140 CIPHER(SSL_RSA_EXPORT_WITH_RC4_40_MD5
, false)
141 CIPHER(SSL_RSA_EXPORT_WITH_DES40_CBC_SHA
, false)
142 CIPHER(SSL_RSA_WITH_DES_CBC_SHA
, false)
143 CIPHER(SSL_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA
, false)
144 CIPHER(SSL_DHE_RSA_WITH_DES_CBC_SHA
, false)
145 CIPHER(SSL_DH_anon_EXPORT_WITH_RC4_40_MD5
, true)
146 CIPHER(SSL_DH_anon_EXPORT_WITH_DES40_CBC_SHA
, true)
147 CIPHER(SSL_DH_anon_WITH_DES_CBC_SHA
, true)
153 static int ciphers_len
= array_size(ciphers
);
156 static int protos
[]={kTLSProtocol1
, kTLSProtocol11
, kTLSProtocol12
};
157 static int nprotos
= sizeof(protos
)/sizeof(protos
[0]);
160 #if 0 // currently unused
161 static SSLCipherSuite
sslcipher_atoi(const char *name
)
163 const CipherSuiteName
*a
= ciphers
;
165 if (0 == strcmp(a
->name
, name
)) break;
171 static const char * sslcipher_itoa(SSLCipherSuite num
)
173 const CipherSuiteName
*a
= ciphers
;
174 while(a
->cipher
>= 0) {
175 if (num
== a
->cipher
) break;
180 #endif // currently unused
182 static unsigned char dh_param_512_bytes
[] = {
183 0x30, 0x46, 0x02, 0x41, 0x00, 0xdb, 0x3c, 0xfa, 0x13, 0xa6, 0xd2, 0x64,
184 0xdf, 0xcc, 0x40, 0xb1, 0x21, 0xd4, 0xf2, 0xad, 0x22, 0x7f, 0xce, 0xa0,
185 0xb9, 0x5b, 0x95, 0x1c, 0x2e, 0x99, 0xb0, 0x27, 0xd0, 0xed, 0xf4, 0xbd,
186 0xbb, 0x36, 0x93, 0xd0, 0x9d, 0x2b, 0x32, 0xa3, 0x56, 0x53, 0xe3, 0x7b,
187 0xed, 0xa1, 0x71, 0x82, 0x2e, 0x83, 0x14, 0xf9, 0xc0, 0x2f, 0x15, 0xcb,
188 0xcf, 0x97, 0xab, 0x88, 0x49, 0x20, 0x28, 0x2e, 0x63, 0x02, 0x01, 0x02
190 static unsigned char *dh_param_512_der
= dh_param_512_bytes
;
191 static unsigned int dh_param_512_der_len
= 72;
196 bool is_session_resume
;
200 bool client_side_auth
;
207 #if 0 // currently unused
208 static CFArrayRef
SecIdentityCopySSLClientAuthenticationChain(SecIdentityRef identity
)
210 CFMutableArrayRef chain
= NULL
;
211 SecPolicyRef policy
= NULL
;
212 SecTrustRef trust
= NULL
;
213 SecTrustResultType trust_result
;
216 policy
= SecPolicyCreateSSL(false, NULL
);
220 SecCertificateRef cert
= NULL
;
221 if (SecIdentityCopyCertificate(identity
, &cert
))
224 CFArrayRef certs
= CFArrayCreate(NULL
, (const void **)&cert
,
225 1, &kCFTypeArrayCallBacks
);
230 if (SecTrustCreateWithCertificates(certs
, policy
, &trust
))
234 if (SecTrustEvaluate(trust
, &trust_result
))
237 int i
, count
= SecTrustGetCertificateCount(trust
);
238 chain
= CFArrayCreateMutable(NULL
, count
, &kCFTypeArrayCallBacks
);
239 CFArrayAppendValue(chain
, identity
);
240 for (i
= 1; i
< count
; i
++) {
241 if ((i
+1 == count
) && (trust_result
== kSecTrustResultUnspecified
))
242 continue; /* skip anchor if chain is complete */
243 SecCertificateRef s
= SecTrustGetCertificateAtIndex(trust
, i
);
244 CFArrayAppendValue(chain
, s
);
253 #endif // currently unused
256 // MARK: SecureTransport support
259 static void hexdump(const uint8_t *bytes
, size_t len
) {
261 printf("socket write(%p, %lu)\n", bytes
, len
);
262 for (ix
= 0; ix
< len
; ++ix
) {
265 printf("%02X ", bytes
[ix
]);
270 #define hexdump(bytes, len)
273 static OSStatus
SocketWrite(SSLConnectionRef conn
, const void *data
, size_t *length
)
275 size_t len
= *length
;
276 uint8_t *ptr
= (uint8_t *)data
;
282 ret
= write((int)conn
, ptr
, len
);
283 } while ((ret
< 0) && (errno
== EAGAIN
|| errno
== EINTR
));
292 *length
= *length
- len
;
293 return errSecSuccess
;
296 static OSStatus
SocketRead(SSLConnectionRef conn
, void *data
, size_t *length
)
298 size_t len
= *length
;
299 uint8_t *ptr
= (uint8_t *)data
;
304 ret
= read((int)conn
, ptr
, len
);
305 } while ((ret
< 0) && (errno
== EAGAIN
|| errno
== EINTR
));
314 *length
= *length
- len
;
315 return errSecSuccess
;
318 static unsigned char dn
[] = {
319 0x30, 0x5e, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13,
320 0x02, 0x55, 0x53, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x0a,
321 0x13, 0x0a, 0x41, 0x70, 0x70, 0x6c, 0x65, 0x20, 0x49, 0x6e, 0x63, 0x2e,
322 0x31, 0x26, 0x30, 0x24, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x1d, 0x41,
323 0x70, 0x70, 0x6c, 0x65, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69,
324 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f,
325 0x72, 0x69, 0x74, 0x79, 0x31, 0x12, 0x30, 0x10, 0x06, 0x03, 0x55, 0x04,
326 0x03, 0x13, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x68, 0x6f, 0x73, 0x74
328 static unsigned int dn_len
= 96;
330 static SSLContextRef
make_ssl_ref(bool server
, bool client_side_auth
, bool dh_anonymous
,
331 bool dtls
, int sock
, CFArrayRef certs
, SSLProtocol proto
)
333 SSLContextRef ctx
= SSLCreateContext(kCFAllocatorDefault
, server
?kSSLServerSide
:kSSLClientSide
, dtls
?kSSLDatagramType
:kSSLStreamType
);
338 require_noerr(SSLSetMaxDatagramRecordSize(ctx
, 400), out
);
339 require_noerr(SSLGetMaxDatagramRecordSize(ctx
, &mtu
), out
);
341 require_noerr(SSLSetProtocolVersionMax(ctx
, proto
), out
);
343 require_noerr(SSLSetIOFuncs(ctx
,
344 (SSLReadFunc
)SocketRead
, (SSLWriteFunc
)SocketWrite
), out
);
345 require_noerr(SSLSetConnection(ctx
, (SSLConnectionRef
)(intptr_t)sock
), out
);
346 static const char *peer_domain_name
= "localhost";
347 require_noerr(SSLSetPeerDomainName(ctx
, peer_domain_name
,
348 strlen(peer_domain_name
)), out
);
353 require_noerr(SSLSetCertificate(ctx
, certs
), out
);
354 if (client_side_auth
&& server
) {
355 SSLAuthenticate auth
;
356 require_noerr(SSLSetClientSideAuthenticate(ctx
, kAlwaysAuthenticate
), out
);
357 require_noerr(SSLGetClientSideAuthenticate(ctx
, &auth
), out
);
358 require(auth
==kAlwaysAuthenticate
, out
);
359 require_noerr(SSLAddDistinguishedName(ctx
, dn
, dn_len
), out
);
361 #if 0 /* Setting client certificate in advance */
362 if (client_side_auth
&& !server
)
363 require_noerr(SSLSetCertificate(ctx
, certs
), out
);
365 if (client_side_auth
&& !server
) /* enable break from SSLHandshake */
366 require_noerr(SSLSetSessionOption(ctx
,
367 kSSLSessionOptionBreakOnCertRequested
, true), out
);
368 require_noerr(SSLSetSessionOption(ctx
,
369 kSSLSessionOptionBreakOnServerAuth
, true), out
);
372 /* Tell SecureTransport to not check certs itself: it will break out of the
373 handshake to let us take care of it instead. */
374 require_noerr(SSLSetEnableCertVerify(ctx
, false), out
);
377 require_noerr(SSLSetDiffieHellmanParams(ctx
,
378 dh_param_512_der
, dh_param_512_der_len
), out
);
380 else /* if client */ {
390 static void *securetransport_ssl_thread(void *arg
)
393 ssl_test_handle
* ssl
= (ssl_test_handle
*)arg
;
394 SSLContextRef ctx
= ssl
->st
;
395 SecTrustRef trust
= NULL
;
396 bool got_server_auth
= false, got_client_cert_req
= false;
398 pthread_setname_np(ssl
->is_server
?"server thread":"client thread");
400 //uint64_t start = mach_absolute_time();
402 ortn
= SSLHandshake(ctx
);
404 if (ortn
== errSSLPeerAuthCompleted
)
406 require_string(!got_server_auth
, out
, "second server auth");
407 require_string(!got_client_cert_req
, out
, "got client cert req before server auth");
408 got_server_auth
= true;
409 require_string(!trust
, out
, "Got errSSLServerAuthCompleted twice?");
410 /* verify peer cert chain */
411 require_noerr(SSLCopyPeerTrust(ctx
, &trust
), out
);
412 SecTrustResultType trust_result
= 0;
413 /* this won't verify without setting up a trusted anchor */
414 require_noerr(SecTrustEvaluate(trust
, &trust_result
), out
);
416 CFIndex n_certs
= SecTrustGetCertificateCount(trust
);
417 /*fprintf(stderr, "%ld certs; trust_eval: %d\n", n_certs, trust_result); */
419 CFMutableArrayRef peer_cert_array
=
420 CFArrayCreateMutable(NULL
, n_certs
, &kCFTypeArrayCallBacks
);
421 CFMutableArrayRef orig_peer_cert_array
=
422 CFArrayCreateMutableCopy(NULL
, n_certs
, ssl
->certs
);
424 CFArrayInsertValueAtIndex(peer_cert_array
, 0,
425 SecTrustGetCertificateAtIndex(trust
, n_certs
));
427 SecIdentityRef ident
=
428 (SecIdentityRef
)CFArrayGetValueAtIndex(orig_peer_cert_array
, 0);
429 SecCertificateRef peer_cert
= NULL
;
430 require_noerr(SecIdentityCopyCertificate(ident
, &peer_cert
), out
);
431 CFArraySetValueAtIndex(orig_peer_cert_array
, 0, peer_cert
);
432 CFRelease(peer_cert
);
434 require(CFEqual(orig_peer_cert_array
, peer_cert_array
), out
);
435 CFRelease(orig_peer_cert_array
);
436 CFRelease(peer_cert_array
);
439 CFStringRef cert_name = SecCertificateCopySubjectSummary(cert);
440 char cert_name_buffer[1024];
441 require(CFStringGetFileSystemRepresentation(cert_name,
442 cert_name_buffer, sizeof(cert_name_buffer)), out);
443 fprintf(stderr, "cert name: %s\n", cert_name_buffer);
446 } else if (ortn
== errSSLClientCertRequested
) {
447 require_string(!got_client_cert_req
, out
, "second client cert req");
448 require_string(got_server_auth
, out
, "didn't get server auth first");
449 got_client_cert_req
= true;
451 /* set client cert */
452 require_string(!ssl
->is_server
, out
, "errSSLClientCertRequested while running server");
453 require_string(!ssl
->dh_anonymous
, out
, "errSSLClientCertRequested while running anon DH");
455 CFArrayRef DNs
= NULL
;
456 require_noerr(SSLCopyDistinguishedNames (ctx
, &DNs
), out
);
460 require_string(ssl
->client_side_auth
, out
, "errSSLClientCertRequested in run not testing that");
461 require_noerr(SSLSetCertificate(ctx
, ssl
->certs
), out
);
463 } while (ortn
== errSSLWouldBlock
464 || ortn
== errSSLServerAuthCompleted
465 || ortn
== errSSLClientCertRequested
);
466 require_noerr_action_quiet(ortn
, out
,
467 fprintf(stderr
, "Fell out of SSLHandshake with error: %d\n", (int)ortn
));
469 if (!ssl
->is_server
&& !ssl
->dh_anonymous
&& !ssl
->is_session_resume
) {
470 require_string(got_server_auth
, out
, "never got server auth");
471 if (ssl
->client_side_auth
)
472 require_string(got_client_cert_req
, out
, "never got client cert req");
474 //uint64_t elapsed = mach_absolute_time() - start;
475 //fprintf(stderr, "setr elapsed: %lld\n", elapsed);
478 SSLProtocol proto = kSSLProtocolUnknown;
479 require_noerr_quiet(SSLGetNegotiatedProtocolVersion(ctx, &proto), out); */
481 SSLCipherSuite cipherSuite
;
482 require_noerr_quiet(ortn
= SSLGetNegotiatedCipher(ctx
, &cipherSuite
), out
);
483 //fprintf(stderr, "st negotiated %s\n", sslcipher_itoa(cipherSuite));
487 SSLGetDatagramWriteSize(ctx
, &sz
);
488 //fprintf(stderr, "Max Write Size = %ld\n", sz);
491 Boolean sessionWasResumed
= false;
492 uint8_t session_id_data
[MAX_SESSION_ID_LENGTH
];
493 size_t session_id_length
= sizeof(session_id_data
);
494 require_noerr_quiet(ortn
= SSLGetResumableSessionInfo(ctx
, &sessionWasResumed
, session_id_data
, &session_id_length
), out
);
495 require_action(ssl
->dh_anonymous
|| (ssl
->is_session_resume
== sessionWasResumed
), out
, ortn
= -1);
496 // if (sessionWasResumed) fprintf(stderr, "st resumed session\n");
497 //hexdump(session_id_data, session_id_length);
499 unsigned char ibuf
[4096], obuf
[4096];
501 if (ssl
->is_server
) {
502 SecRandomCopyBytes(kSecRandomDefault
, sizeof(obuf
), obuf
);
503 require_noerr_quiet(ortn
= SSLWrite(ctx
, obuf
, sizeof(obuf
), &len
), out
);
504 require_action_quiet(len
== sizeof(obuf
), out
, ortn
= -1);
506 require_noerr_quiet(ortn
= SSLRead(ctx
, ibuf
, sizeof(ibuf
), &len
), out
);
507 require_action_quiet(len
== sizeof(ibuf
), out
, ortn
= -1);
509 if (ssl
->is_server
) {
510 require_noerr(memcmp(ibuf
, obuf
, sizeof(ibuf
)), out
);
512 require_noerr_quiet(ortn
= SSLWrite(ctx
, ibuf
, sizeof(ibuf
), &len
), out
);
513 require_action_quiet(len
== sizeof(ibuf
), out
, ortn
= -1);
519 if (trust
) CFRelease(trust
);
521 pthread_exit((void *)(intptr_t)ortn
);
527 static ssl_test_handle
*
528 ssl_test_handle_create(uint32_t session_id
, bool resume
, bool server
, bool client_side_auth
, bool dh_anonymous
, bool dtls
,
529 int comm
, CFArrayRef certs
, SSLProtocol proto
)
531 ssl_test_handle
*handle
= calloc(1, sizeof(ssl_test_handle
));
533 handle
->session_id
= session_id
;
534 handle
->is_session_resume
= resume
;
535 handle
->is_server
= server
;
536 handle
->is_dtls
= dtls
;
537 handle
->client_side_auth
= client_side_auth
;
538 handle
->dh_anonymous
= dh_anonymous
;
540 handle
->certs
= certs
;
541 handle
->proto
= proto
;
542 handle
->st
= make_ssl_ref(server
, client_side_auth
, dh_anonymous
, dtls
, comm
, certs
, proto
);
550 pthread_t client_thread
, server_thread
;
551 CFArrayRef server_certs
= server_chain();
552 ok(server_certs
, "got server certs");
554 /* Enable this if you want to test a specific d/i/k/l combination */
556 int d
=0, i
=0, l
=0, k
=0; { {
560 for (p
=0; p
<nprotos
; p
++)
561 for (d
=0;d
<2; d
++) /* dtls or not dtls */
564 for (i
=0; ciphers
[i
].cipher
!= (SSLCipherSuite
)(-1); i
++)
565 for (l
= 0; l
<2; l
++) {
568 //skip("Session resumption tests do not work at this point", 1, l != 1);
571 if (socketpair(AF_UNIX
, SOCK_STREAM
, 0, sp
)) exit(errno
);
572 fcntl(sp
[0], F_SETNOSIGPIPE
, 1);
573 fcntl(sp
[1], F_SETNOSIGPIPE
, 1);
575 ssl_test_handle
*server
, *client
;
577 bool client_side_auth
= (k
);
579 uint32_t session_id
= (k
+1) << 16 | (i
+1);
580 //fprintf(stderr, "session_id: %d\n", session_id);
581 server
= ssl_test_handle_create(session_id
, (l
== 1), true /*server*/,
582 client_side_auth
, ciphers
[i
].dh_anonymous
, d
,
583 sp
[0], server_certs
, protos
[p
]);
584 client
= ssl_test_handle_create(session_id
, (l
== 1), false/*client*/,
585 client_side_auth
, ciphers
[i
].dh_anonymous
, d
,
586 sp
[1], server_certs
, protos
[p
]);
588 require_noerr(SSLSetPeerID(server
->st
, &session_id
, sizeof(session_id
)), out
);
589 require_noerr(SSLSetPeerID(client
->st
, &session_id
, sizeof(session_id
)), out
);
591 /* set fixed cipher on client and server */
592 require_noerr(SSLSetEnabledCiphers(client
->st
, &ciphers
[i
].cipher
, 1), out
);
593 require_noerr(SSLSetEnabledCiphers(server
->st
, &ciphers
[i
].cipher
, 1), out
);
595 require_noerr(SSLSetPSKSharedSecret(client
->st
, "123456789", 9), out
);
596 require_noerr(SSLSetPSKSharedSecret(server
->st
, "123456789", 9), out
);
599 pthread_create(&client_thread
, NULL
, securetransport_ssl_thread
, client
);
600 pthread_create(&server_thread
, NULL
, securetransport_ssl_thread
, server
);
602 int server_err
, client_err
;
603 pthread_join(client_thread
, (void*)&client_err
);
604 pthread_join(server_thread
, (void*)&server_err
);
607 ok(!server_err
&& !client_err
,
608 "%40s ADH:%d CSA:%d DTLS:%d RESUME:%d PROTO:%d",
610 server
->dh_anonymous
,
611 server
->client_side_auth
,
621 CFRelease(server_certs
);
624 int ssl_42_ciphers(int argc
, char *const *argv
)
627 plan_tests(2 * 2 * 2 * nprotos
* (ciphers_len
-1)/* client auth on/off * #configs * #ciphers */
637 TODO: count errSSLWouldBlock
638 TODO: skip tests that don't matter: client_auth and anonymous dh
639 TODO: we seem to only be negotiating tls - force a round of sslv3
640 TODO: allow secure transport to also defer client side auth to client
641 TODO: make sure anonymous dh is never selected if not expicitly enabled
642 TODO: make sure DHE is not available if not explicitly enabled and no parameters
644 TODO: resumable sessions