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     securetransport 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
; 
  79 #define CIPHER(cipher, dh_anonymous, dtls) { cipher, #cipher, dh_anonymous, dtls}, 
  81 static const CipherSuiteName ciphers
[] = { 
  82     //SSL_NULL_WITH_NULL_NULL, unsupported 
  83     CIPHER(SSL_RSA_WITH_NULL_SHA
, false, true) 
  84     CIPHER(SSL_RSA_WITH_NULL_MD5
, false, true) 
  85     CIPHER(TLS_RSA_WITH_NULL_SHA256
, false, true) 
  87     CIPHER(SSL_RSA_WITH_3DES_EDE_CBC_SHA
, false, true) 
  89     CIPHER(SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA
, false, true) 
  90     CIPHER(SSL_DH_anon_WITH_3DES_EDE_CBC_SHA
, true, true) 
  91     CIPHER(TLS_DHE_RSA_WITH_AES_128_CBC_SHA
, false, true) 
  92     CIPHER(TLS_DH_anon_WITH_AES_128_CBC_SHA
, true, true) 
  93     CIPHER(TLS_DHE_RSA_WITH_AES_256_CBC_SHA
, false, true) 
  94     CIPHER(TLS_DH_anon_WITH_AES_256_CBC_SHA
, true, true) 
  96     CIPHER(TLS_RSA_WITH_AES_128_CBC_SHA
, false, true) 
  97     CIPHER(TLS_RSA_WITH_AES_256_CBC_SHA
, false, true) 
 100     CIPHER(TLS_PSK_WITH_AES_128_CBC_SHA
, true, true) 
 101     CIPHER(TLS_PSK_WITH_AES_256_CBC_SHA384
, true, true) 
 102     CIPHER(TLS_PSK_WITH_AES_128_CBC_SHA256
, true, true) 
 103     CIPHER(TLS_PSK_WITH_AES_256_CBC_SHA
, true, true) 
 104     CIPHER(TLS_PSK_WITH_AES_128_CBC_SHA
, true, true) 
 105     CIPHER(TLS_PSK_WITH_3DES_EDE_CBC_SHA
, true, true) 
 106     CIPHER(TLS_PSK_WITH_NULL_SHA384
, true, true) 
 107     CIPHER(TLS_PSK_WITH_NULL_SHA256
, true, true) 
 108     CIPHER(TLS_PSK_WITH_NULL_SHA
, true, true) 
 111     // Put all the RC4 ciphers at the end: no DTLS for them. 
 112     CIPHER(SSL_RSA_WITH_RC4_128_MD5
, false, false) 
 113     CIPHER(SSL_RSA_WITH_RC4_128_SHA
, false, false) 
 114     CIPHER(SSL_DH_anon_WITH_RC4_128_MD5
, true, false) 
 115     CIPHER(TLS_PSK_WITH_RC4_128_SHA
, true, false) 
 119     // ECDH and ECDHE not supported on server yet 
 120     CIPHER(TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA
, false) 
 121     CIPHER(TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA
, false) 
 123     CIPHER(TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA
, false) 
 124     CIPHER(TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA
, false) 
 126     CIPHER(TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA
, false) 
 127     CIPHER(TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA
, false) 
 129     CIPHER(TLS_ECDH_anon_WITH_AES_128_CBC_SHA
, true) 
 130     CIPHER(TLS_ECDH_anon_WITH_AES_256_CBC_SHA
, true) 
 132     CIPHER(TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256
, false) 
 133     CIPHER(TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384
, false) 
 134     CIPHER(TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256
, false) 
 135     CIPHER(TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384
, false) 
 139     // GCM not supported yet 
 140     CIPHER(TLS_RSA_WITH_AES_256_GCM_SHA384
, false) 
 141     CIPHER(TLS_RSA_WITH_AES_128_GCM_SHA256
, false) 
 147 static int ciphers_len 
= array_size(ciphers
); 
 150 static int protos
[]={kTLSProtocol1
, kTLSProtocol11
, kTLSProtocol12 
}; 
 151 static int nprotos 
= sizeof(protos
)/sizeof(protos
[0]); 
 154 #if 0 // currently unused 
 155 static SSLCipherSuite 
sslcipher_atoi(const char *name
) 
 157        const CipherSuiteName 
*a 
= ciphers
; 
 159            if (0 == strcmp(a
->name
, name
)) break; 
 165 static const char * sslcipher_itoa(SSLCipherSuite num
) 
 167        const CipherSuiteName 
*a 
= ciphers
; 
 168        while(a
->cipher 
>= 0) { 
 169            if (num 
== a
->cipher
) break; 
 174 #endif // currently unused 
 176 static unsigned char dh_param_512_bytes
[] = { 
 177   0x30, 0x46, 0x02, 0x41, 0x00, 0xdb, 0x3c, 0xfa, 0x13, 0xa6, 0xd2, 0x64, 
 178   0xdf, 0xcc, 0x40, 0xb1, 0x21, 0xd4, 0xf2, 0xad, 0x22, 0x7f, 0xce, 0xa0, 
 179   0xb9, 0x5b, 0x95, 0x1c, 0x2e, 0x99, 0xb0, 0x27, 0xd0, 0xed, 0xf4, 0xbd, 
 180   0xbb, 0x36, 0x93, 0xd0, 0x9d, 0x2b, 0x32, 0xa3, 0x56, 0x53, 0xe3, 0x7b, 
 181   0xed, 0xa1, 0x71, 0x82, 0x2e, 0x83, 0x14, 0xf9, 0xc0, 0x2f, 0x15, 0xcb, 
 182   0xcf, 0x97, 0xab, 0x88, 0x49, 0x20, 0x28, 0x2e, 0x63, 0x02, 0x01, 0x02 
 184 static unsigned char *dh_param_512_der 
= dh_param_512_bytes
; 
 185 static unsigned int dh_param_512_der_len 
= 72; 
 190     bool is_session_resume
; 
 194     bool client_side_auth
; 
 201 #if 0 // currently unused 
 202 static CFArrayRef 
SecIdentityCopySSLClientAuthenticationChain(SecIdentityRef identity
) 
 204    CFMutableArrayRef chain 
= NULL
; 
 205    SecPolicyRef policy 
= NULL
; 
 206    SecTrustRef trust 
= NULL
; 
 207    SecTrustResultType trust_result
; 
 210        policy 
= SecPolicyCreateSSL(false, NULL
); 
 214        SecCertificateRef cert 
= NULL
; 
 215        if (SecIdentityCopyCertificate(identity
, &cert
)) 
 218        CFArrayRef certs 
= CFArrayCreate(NULL
, (const void **)&cert
, 
 219                  1, &kCFTypeArrayCallBacks
); 
 224        if (SecTrustCreateWithCertificates(certs
, policy
, &trust
)) 
 228        if (SecTrustEvaluate(trust
, &trust_result
)) 
 231        int i
, count 
= SecTrustGetCertificateCount(trust
); 
 232        chain 
= CFArrayCreateMutable(NULL
, count
, &kCFTypeArrayCallBacks
); 
 233        CFArrayAppendValue(chain
, identity
); 
 234        for (i 
= 1; i 
< count
; i
++) { 
 235            if ((i
+1 == count
) && (trust_result 
== kSecTrustResultUnspecified
)) 
 236                continue; /* skip anchor if chain is complete */ 
 237            SecCertificateRef s 
= SecTrustGetCertificateAtIndex(trust
, i
); 
 238            CFArrayAppendValue(chain
, s
); 
 247 #endif // currently unused 
 250 // MARK: SecureTransport support 
 253 static void hexdump(const uint8_t *bytes
, size_t len
) { 
 255     printf("socket write(%p, %lu)\n", bytes
, len
); 
 256         for (ix 
= 0; ix 
< len
; ++ix
) { 
 259                 printf("%02X ", bytes
[ix
]); 
 264 #define hexdump(bytes, len) 
 267 static OSStatus 
SocketWrite(SSLConnectionRef conn
, const void *data
, size_t *length
) 
 269         size_t len 
= *length
; 
 270         uint8_t *ptr 
= (uint8_t *)data
; 
 276             ret 
= write((int)conn
, ptr
, len
); 
 277         } while ((ret 
< 0) && (errno 
== EAGAIN 
|| errno 
== EINTR
)); 
 286     *length 
= *length 
- len
; 
 287     return errSecSuccess
; 
 290 static OSStatus 
SocketRead(SSLConnectionRef conn
, void *data
, size_t *length
) 
 292         size_t len 
= *length
; 
 293         uint8_t *ptr 
= (uint8_t *)data
; 
 298             ret 
= read((int)conn
, ptr
, len
); 
 299         } while ((ret 
< 0) && (errno 
== EINPROGRESS 
|| errno 
== EAGAIN 
|| errno 
== EINTR
)); 
 304             printf("read error(%d): ret=%zd, errno=%d\n", (int)conn
, ret
, errno
); 
 309     *length 
= *length 
- len
; 
 310     return errSecSuccess
; 
 313 static unsigned char dn
[] = { 
 314   0x30, 0x5e, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 
 315   0x02, 0x55, 0x53, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x0a, 
 316   0x13, 0x0a, 0x41, 0x70, 0x70, 0x6c, 0x65, 0x20, 0x49, 0x6e, 0x63, 0x2e, 
 317   0x31, 0x26, 0x30, 0x24, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x1d, 0x41, 
 318   0x70, 0x70, 0x6c, 0x65, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 
 319   0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 
 320   0x72, 0x69, 0x74, 0x79, 0x31, 0x12, 0x30, 0x10, 0x06, 0x03, 0x55, 0x04, 
 321   0x03, 0x13, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x68, 0x6f, 0x73, 0x74 
 323 static unsigned int dn_len 
= 96; 
 325 static SSLContextRef 
make_ssl_ref(bool server
, bool client_side_auth
, bool dh_anonymous
, 
 326     bool dtls
, int sock
, CFArrayRef certs
, SSLProtocol proto
) 
 328     SSLContextRef ctx 
= SSLCreateContext(kCFAllocatorDefault
, server
?kSSLServerSide
:kSSLClientSide
, dtls
?kSSLDatagramType
:kSSLStreamType
); 
 333         require_noerr(SSLSetMaxDatagramRecordSize(ctx
, 400), out
); 
 334         require_noerr(SSLGetMaxDatagramRecordSize(ctx
, &mtu
), out
); 
 336         require_noerr(SSLSetProtocolVersionMax(ctx
, proto
), out
); 
 338     require_noerr(SSLSetIOFuncs(ctx
, 
 339         (SSLReadFunc
)SocketRead
, (SSLWriteFunc
)SocketWrite
), out
); 
 340     require_noerr(SSLSetConnection(ctx
, (SSLConnectionRef
)(intptr_t)sock
), out
); 
 341     static const char *peer_domain_name 
= "localhost"; 
 342     require_noerr(SSLSetPeerDomainName(ctx
, peer_domain_name
, 
 343         strlen(peer_domain_name
)), out
); 
 348             require_noerr(SSLSetCertificate(ctx
, certs
), out
); 
 349         if (client_side_auth 
&& server
) { 
 350             SSLAuthenticate auth
; 
 351             require_noerr(SSLSetClientSideAuthenticate(ctx
, kAlwaysAuthenticate
), out
); 
 352             require_noerr(SSLGetClientSideAuthenticate(ctx
, &auth
), out
); 
 353             require(auth
==kAlwaysAuthenticate
, out
); 
 354             require_noerr(SSLAddDistinguishedName(ctx
, dn
, dn_len
), out
); 
 356 #if 0 /* Setting client certificate in advance */ 
 357         if (client_side_auth 
&& !server
) 
 358             require_noerr(SSLSetCertificate(ctx
, certs
), out
); 
 360         if (client_side_auth 
&& !server
) /* enable break from SSLHandshake */ 
 361             require_noerr(SSLSetSessionOption(ctx
, 
 362                 kSSLSessionOptionBreakOnCertRequested
, true), out
); 
 363         require_noerr(SSLSetSessionOption(ctx
, 
 364             kSSLSessionOptionBreakOnServerAuth
, true), out
); 
 367     /* Tell SecureTransport to not check certs itself: it will break out of the 
 368        handshake to let us take care of it instead. */ 
 369     require_noerr(SSLSetEnableCertVerify(ctx
, false), out
); 
 372         require_noerr(SSLSetDiffieHellmanParams(ctx
, 
 373             dh_param_512_der
, dh_param_512_der_len
), out
); 
 375     else /* if client */ { 
 385 static bool check_peer_cert(SSLContextRef ctx
, const ssl_test_handle 
*ssl
, SecTrustRef 
*trust
) 
 387     /* verify peer cert chain */ 
 388     require_noerr(SSLCopyPeerTrust(ctx
, trust
), out
); 
 389     SecTrustResultType trust_result 
= 0; 
 390     /* this won't verify without setting up a trusted anchor */ 
 391     require_noerr(SecTrustEvaluate(*trust
, &trust_result
), out
); 
 393     CFIndex n_certs 
= SecTrustGetCertificateCount(*trust
); 
 394     /* fprintf(stderr, "%ld certs; trust_eval: %d\n", n_certs, trust_result); */ 
 396     CFMutableArrayRef peer_cert_array 
= 
 397     CFArrayCreateMutable(NULL
, n_certs
, &kCFTypeArrayCallBacks
); 
 398     CFMutableArrayRef orig_peer_cert_array 
= 
 399         CFArrayCreateMutableCopy(NULL
, n_certs
, ssl
->certs
); 
 401         CFArrayInsertValueAtIndex(peer_cert_array
, 0, 
 402                                   SecTrustGetCertificateAtIndex(*trust
, n_certs
)); 
 404     SecIdentityRef ident 
= 
 405     (SecIdentityRef
)CFArrayGetValueAtIndex(orig_peer_cert_array
, 0); 
 406     SecCertificateRef peer_cert 
= NULL
; 
 407     require_noerr(SecIdentityCopyCertificate(ident
, &peer_cert
), out
); 
 408     CFArraySetValueAtIndex(orig_peer_cert_array
, 0, peer_cert
); 
 409     CFRelease(peer_cert
); 
 411     require(CFEqual(orig_peer_cert_array
, peer_cert_array
), out
); 
 412     CFRelease(orig_peer_cert_array
); 
 413     CFRelease(peer_cert_array
); 
 416      CFStringRef cert_name = SecCertificateCopySubjectSummary(cert); 
 417      char cert_name_buffer[1024]; 
 418      require(CFStringGetFileSystemRepresentation(cert_name, 
 419      cert_name_buffer, sizeof(cert_name_buffer)), out); 
 420      fprintf(stderr, "cert name: %s\n", cert_name_buffer); 
 428 static void *securetransport_ssl_thread(void *arg
) 
 431     ssl_test_handle 
* ssl 
= (ssl_test_handle 
*)arg
; 
 432     SSLContextRef ctx 
= ssl
->st
; 
 433     SecTrustRef trust 
= NULL
; 
 434     bool got_server_auth 
= false, got_client_cert_req 
= false; 
 435     SSLSessionState ssl_state
; 
 437     pthread_setname_np(ssl
->is_server
?"server thread":"client thread"); 
 439     require_noerr(ortn
=SSLGetSessionState(ctx
,&ssl_state
), out
); 
 440     require_action(ssl_state
==kSSLIdle
, out
, ortn 
= -1); 
 442     //uint64_t start = mach_absolute_time(); 
 444         ortn 
= SSLHandshake(ctx
); 
 445         require_noerr(SSLGetSessionState(ctx
,&ssl_state
), out
); 
 447         if (ortn 
== errSSLPeerAuthCompleted
) 
 449             require_action(ssl_state
==kSSLHandshake
, out
, ortn 
= -1); 
 450             require_string(!got_server_auth
, out
, "second server auth"); 
 451             require_string(!got_client_cert_req
, out
, "got client cert req before server auth"); 
 452             got_server_auth 
= true; 
 453             require_string(!trust
, out
, "Got errSSLServerAuthCompleted twice?"); 
 454             require_string(check_peer_cert(ctx
, ssl
, &trust
), out
, "Certificate check failed"); 
 455         } else if (ortn 
== errSSLClientCertRequested
) { 
 456             require_action(ssl_state
==kSSLHandshake
, out
, ortn 
= -1); 
 457             require_string(!got_client_cert_req
, out
, "second client cert req"); 
 458             require_string(got_server_auth
, out
, "didn't get server auth first"); 
 459             got_client_cert_req 
= true; 
 461             /* set client cert */ 
 462             require_string(!ssl
->is_server
, out
, "errSSLClientCertRequested while running server"); 
 463             require_string(!ssl
->dh_anonymous
, out
, "errSSLClientCertRequested while running anon DH"); 
 465             CFArrayRef DNs 
= NULL
; 
 466             require_noerr(SSLCopyDistinguishedNames     (ctx
, &DNs
), out
); 
 470             require_string(ssl
->client_side_auth
, out
, "errSSLClientCertRequested in run not testing that"); 
 471             require_noerr(SSLSetCertificate(ctx
, ssl
->certs
), out
); 
 472         } else if (ortn 
== errSSLWouldBlock
) { 
 473             require_action(ssl_state
==kSSLHandshake
, out
, ortn 
= -1); 
 475     } while (ortn 
== errSSLWouldBlock
 
 476         || ortn 
== errSSLServerAuthCompleted
 
 477         || ortn 
== errSSLClientCertRequested
); 
 478     require_noerr_action_quiet(ortn
, out
, 
 479         fprintf(stderr
, "Fell out of SSLHandshake with error: %d\n", (int)ortn
)); 
 481     require_action(ssl_state
==kSSLConnected
, out
, ortn 
= -1); 
 483     if (!ssl
->is_server 
&& !ssl
->dh_anonymous 
&& !ssl
->is_session_resume
) { 
 484         require_string(got_server_auth
, out
, "never got server auth"); 
 485         if (ssl
->client_side_auth
) 
 486             require_string(got_client_cert_req
, out
, "never got client cert req"); 
 489     if (!ssl
->is_server 
&& !ssl
->dh_anonymous 
&& ssl
->is_session_resume
) { 
 490         require_string(!got_server_auth
, out
, "got server auth during resumption??"); 
 491         require_string(check_peer_cert(ctx
, ssl
, &trust
), out
, "Certificate check failed (resumption case)"); 
 493     //uint64_t elapsed = mach_absolute_time() - start; 
 494     //fprintf(stderr, "setr elapsed: %lld\n", elapsed); 
 497     SSLProtocol proto = kSSLProtocolUnknown; 
 498     require_noerr_quiet(SSLGetNegotiatedProtocolVersion(ctx, &proto), out); */ 
 500     SSLCipherSuite cipherSuite
; 
 501     require_noerr_quiet(ortn 
= SSLGetNegotiatedCipher(ctx
, &cipherSuite
), out
); 
 502     //fprintf(stderr, "st negotiated %s\n", sslcipher_itoa(cipherSuite)); 
 506         SSLGetDatagramWriteSize(ctx
, &sz
); 
 507         //fprintf(stderr, "Max Write Size = %ld\n", sz); 
 510         Boolean sessionWasResumed 
= false; 
 511     uint8_t session_id_data
[MAX_SESSION_ID_LENGTH
]; 
 512     size_t session_id_length 
= sizeof(session_id_data
); 
 513     require_noerr_quiet(ortn 
= SSLGetResumableSessionInfo(ctx
, &sessionWasResumed
, session_id_data
, &session_id_length
), out
); 
 514     require_action(ssl
->dh_anonymous 
|| (ssl
->is_session_resume 
== sessionWasResumed
), out
, ortn 
= -1); 
 515     // if (sessionWasResumed) fprintf(stderr, "st resumed session\n"); 
 516     //hexdump(session_id_data, session_id_length); 
 518 #define BUFSIZE (8*1024) 
 519     unsigned char ibuf
[BUFSIZE
], obuf
[BUFSIZE
]; 
 521     for(int i
=0; i
<10; i
++) { 
 523         if (ssl
->is_server
) { 
 524             memset(obuf
, i
, BUFSIZE
); 
 525             // SecRandomCopyBytes(kSecRandomDefault, sizeof(obuf), obuf); 
 526             require_noerr(ortn 
= SSLWrite(ctx
, obuf
, BUFSIZE
, &len
), out
); 
 527             require_action(len 
== BUFSIZE
, out
, ortn 
= -1); 
 529             require_noerr(ortn 
= SSLWrite(ctx
, obuf
, 0, &len
), out
); 
 530             require_action(len 
== 0, out
, ortn 
= -1); 
 536             ortn 
= SSLRead(ctx
, ibuf
+len
, BUFSIZE
-len
, &l
); 
 538             //printf("SSLRead [%p] %d, l=%zd len=%zd\n", ctx, (int)ortn, l, len); 
 541         //printf("SSLRead [%p] done\n", ctx); 
 543         require_noerr(ortn
, out
); 
 544         require_action(len 
== BUFSIZE
, out
, ortn 
= -1); 
 546         if (ssl
->is_server
) { 
 547             require_noerr(memcmp(ibuf
, obuf
, BUFSIZE
), out
); 
 549             require_noerr(ortn 
= SSLWrite(ctx
, ibuf
, BUFSIZE
, &len
), out
); 
 550             require_action(len 
== BUFSIZE
, out
, ortn 
= -1); 
 557     if (trust
) CFRelease(trust
); 
 559     pthread_exit((void *)(intptr_t)ortn
); 
 565 static ssl_test_handle 
* 
 566 ssl_test_handle_create(uint32_t session_id
, bool resume
, bool server
, bool client_side_auth
, bool dh_anonymous
, bool dtls
, 
 567     int comm
, CFArrayRef certs
, SSLProtocol proto
) 
 569     ssl_test_handle 
*handle 
= calloc(1, sizeof(ssl_test_handle
)); 
 571         handle
->session_id 
= session_id
; 
 572         handle
->is_session_resume 
= resume
; 
 573         handle
->is_server 
= server
; 
 574         handle
->is_dtls 
= dtls
; 
 575         handle
->client_side_auth 
= client_side_auth
; 
 576         handle
->dh_anonymous 
= dh_anonymous
; 
 578         handle
->certs 
= certs
; 
 579         handle
->proto 
= proto
; 
 580         handle
->st 
= make_ssl_ref(server
, client_side_auth
, dh_anonymous
, dtls
, comm
, certs
, proto
); 
 588     pthread_t client_thread
, server_thread
; 
 589     CFArrayRef server_certs 
= server_chain(); 
 590     ok(server_certs
, "got server certs"); 
 592 /* Enable this if you want to test a specific d/i/k/l combination */ 
 594     int d
=0, i
=0, l
=0, k
=0; { { 
 598     for (p
=0; p
<nprotos
; p
++) 
 599     for (d
=0;d
<2; d
++)  /* dtls or not dtls */ 
 602         for (i
=0; ciphers
[i
].cipher 
!= (SSLCipherSuite
)(-1); i
++) 
 603         for (l 
= 0; l
<2; l
++) { 
 606                 skip("This ciphersuite is not supported for DTLS", 1, !d 
|| ciphers
[i
].dtls
); 
 609                 if (socketpair(AF_UNIX
, SOCK_STREAM
, 0, sp
)) exit(errno
); 
 610                 fcntl(sp
[0], F_SETNOSIGPIPE
, 1); 
 611                 fcntl(sp
[1], F_SETNOSIGPIPE
, 1); 
 613                 ssl_test_handle 
*server
, *client
; 
 615                 bool client_side_auth 
= (k
); 
 617                 uint32_t session_id 
= (k
+1) << 16 | (i
+1); 
 618                 //fprintf(stderr, "session_id: %d\n", session_id); 
 619                 server 
= ssl_test_handle_create(session_id
, (l 
== 1), true /*server*/, 
 620                     client_side_auth
, ciphers
[i
].dh_anonymous
, d
, 
 621                     sp
[0], server_certs
, protos
[p
]); 
 622                 client 
= ssl_test_handle_create(session_id
, (l 
== 1), false/*client*/, 
 623                     client_side_auth
, ciphers
[i
].dh_anonymous
, d
, 
 624                     sp
[1], server_certs
, protos
[p
]); 
 626                 require_noerr(SSLSetPeerID(server
->st
, &session_id
, sizeof(session_id
)), out
); 
 627                 require_noerr(SSLSetPeerID(client
->st
, &session_id
, sizeof(session_id
)), out
); 
 629                 /* set fixed cipher on client and server */ 
 630                 require_noerr(SSLSetEnabledCiphers(client
->st
, &ciphers
[i
].cipher
, 1), out
); 
 631                 require_noerr(SSLSetEnabledCiphers(server
->st
, &ciphers
[i
].cipher
, 1), out
); 
 633                 require_noerr(SSLSetPSKSharedSecret(client
->st
, "123456789", 9), out
); 
 634                 require_noerr(SSLSetPSKSharedSecret(server
->st
, "123456789", 9), out
); 
 637                 pthread_create(&client_thread
, NULL
, securetransport_ssl_thread
, client
); 
 638                 pthread_create(&server_thread
, NULL
, securetransport_ssl_thread
, server
); 
 640                 int server_err
, client_err
; 
 641                 pthread_join(client_thread
, (void*)&client_err
); 
 642                 pthread_join(server_thread
, (void*)&server_err
); 
 645                 ok(!server_err 
&& !client_err
, 
 646                    "%40s ADH:%d CSA:%d DTLS:%d RESUME:%d PROTO:%d", 
 648                    server
->dh_anonymous
, 
 649                    server
->client_side_auth
, 
 659     CFRelease(server_certs
); 
 662 int ssl_42_ciphers(int argc
, char *const *argv
) 
 665     plan_tests(2 * 2 * 2 * nprotos 
* (ciphers_len
-1)/* client auth on/off * #configs * #ciphers */ 
 675 TODO: count errSSLWouldBlock 
 676 TODO: skip tests that don't matter: client_auth and anonymous dh 
 677 TODO: we seem to only be negotiating tls - force a round of sslv3 
 678 TODO: allow secure transport to also defer client side auth to client 
 679 TODO: make sure anonymous dh is never selected if not expicitly enabled 
 680 TODO: make sure DHE is not available if not explicitly enabled and no parameters 
 682 TODO: resumable sessions