darwinssl: reform OS-specific #defines
This doesn't need to be in the release notes. I cleaned up a lot of the #if lines in the code to use MAC_OS_X_VERSION_MIN_REQUIRED and MAC_OS_X_VERSION_MAX_ALLOWED instead of checking for whether things like __MAC_10_6 or whatever were defined, because for some SDKs Apple has released they were defined out of place.
This commit is contained in:
parent
832c195179
commit
631e3e13a9
@ -38,9 +38,56 @@
|
|||||||
#include <Security/SecureTransport.h>
|
#include <Security/SecureTransport.h>
|
||||||
#include <CoreFoundation/CoreFoundation.h>
|
#include <CoreFoundation/CoreFoundation.h>
|
||||||
#include <CommonCrypto/CommonDigest.h>
|
#include <CommonCrypto/CommonDigest.h>
|
||||||
|
|
||||||
|
/* The Security framework has changed greatly between iOS and different OS X
|
||||||
|
versions, and we will try to support as many of them as we can (back to
|
||||||
|
Leopard and iOS 5) by using macros and weak-linking.
|
||||||
|
|
||||||
|
IMPORTANT: If TLS 1.1 and 1.2 support are important for you on OS X, then
|
||||||
|
you must build this project against the 10.8 SDK or later. */
|
||||||
#if (TARGET_OS_MAC && !(TARGET_OS_EMBEDDED || TARGET_OS_IPHONE))
|
#if (TARGET_OS_MAC && !(TARGET_OS_EMBEDDED || TARGET_OS_IPHONE))
|
||||||
|
|
||||||
|
#if MAC_OS_X_VERSION_MAX_ALLOWED < 1050
|
||||||
|
#error "The darwinssl back-end requires Leopard or later."
|
||||||
|
#endif /* MAC_OS_X_VERSION_MAX_ALLOWED < 1050 */
|
||||||
|
|
||||||
|
#define CURL_BUILD_IOS 0
|
||||||
|
#define CURL_BUILD_MAC 1
|
||||||
|
/* This is the maximum API level we are allowed to use when building: */
|
||||||
|
#define CURL_BUILD_MAC_10_5 MAC_OS_X_VERSION_MAX_ALLOWED >= 1050
|
||||||
|
#define CURL_BUILD_MAC_10_6 MAC_OS_X_VERSION_MAX_ALLOWED >= 1060
|
||||||
|
#define CURL_BUILD_MAC_10_7 MAC_OS_X_VERSION_MAX_ALLOWED >= 1070
|
||||||
|
#define CURL_BUILD_MAC_10_8 MAC_OS_X_VERSION_MAX_ALLOWED >= 1080
|
||||||
|
/* These macros mean "the following code is present to allow runtime backward
|
||||||
|
compatibility with at least this cat or earlier":
|
||||||
|
(You set this at build-time by setting the MACOSX_DEPLOYMENT_TARGET
|
||||||
|
environmental variable.) */
|
||||||
|
#define CURL_SUPPORT_MAC_10_5 MAC_OS_X_VERSION_MIN_REQUIRED <= 1050
|
||||||
|
#define CURL_SUPPORT_MAC_10_6 MAC_OS_X_VERSION_MIN_REQUIRED <= 1060
|
||||||
|
#define CURL_SUPPORT_MAC_10_7 MAC_OS_X_VERSION_MIN_REQUIRED <= 1070
|
||||||
|
#define CURL_SUPPORT_MAC_10_8 MAC_OS_X_VERSION_MIN_REQUIRED <= 1080
|
||||||
|
|
||||||
|
#elif TARGET_OS_EMBEDDED || TARGET_OS_IPHONE
|
||||||
|
#define CURL_BUILD_IOS 1
|
||||||
|
#define CURL_BUILD_MAC 0
|
||||||
|
#define CURL_BUILD_MAC_10_5 0
|
||||||
|
#define CURL_BUILD_MAC_10_6 0
|
||||||
|
#define CURL_BUILD_MAC_10_7 0
|
||||||
|
#define CURL_BUILD_MAC_10_8 0
|
||||||
|
#define CURL_BUILD_MAC_10_9 0
|
||||||
|
#define CURL_SUPPORT_MAC_10_5 0
|
||||||
|
#define CURL_SUPPORT_MAC_10_6 0
|
||||||
|
#define CURL_SUPPORT_MAC_10_7 0
|
||||||
|
#define CURL_SUPPORT_MAC_10_8 0
|
||||||
|
#define CURL_SUPPORT_MAC_10_9 0
|
||||||
|
|
||||||
|
#else
|
||||||
|
#error "The darwinssl back-end requires iOS or OS X."
|
||||||
|
#endif /* (TARGET_OS_MAC && !(TARGET_OS_EMBEDDED || TARGET_OS_IPHONE)) */
|
||||||
|
|
||||||
|
#if CURL_BUILD_MAC
|
||||||
#include <sys/sysctl.h>
|
#include <sys/sysctl.h>
|
||||||
#endif
|
#endif /* CURL_BUILD_MAC */
|
||||||
|
|
||||||
#include "urldata.h"
|
#include "urldata.h"
|
||||||
#include "sendf.h"
|
#include "sendf.h"
|
||||||
@ -61,16 +108,6 @@
|
|||||||
#define ioErr -36
|
#define ioErr -36
|
||||||
#define paramErr -50
|
#define paramErr -50
|
||||||
|
|
||||||
/* In Mountain Lion and iOS 5, Apple made some changes to the API. They
|
|
||||||
added TLS 1.1 and 1.2 support, and deprecated and replaced some
|
|
||||||
functions. You need to build against the Mountain Lion or iOS 5 SDK
|
|
||||||
or later to get TLS 1.1 or 1.2 support working in cURL. We'll weak-link
|
|
||||||
to the newer functions and use them if present in the user's OS.
|
|
||||||
|
|
||||||
Builders: If you want TLS 1.1 and 1.2 but still want to retain support
|
|
||||||
for older cats, don't forget to set the MACOSX_DEPLOYMENT_TARGET
|
|
||||||
environmental variable prior to building cURL. */
|
|
||||||
|
|
||||||
/* The following two functions were ripped from Apple sample code,
|
/* The following two functions were ripped from Apple sample code,
|
||||||
* with some modifications: */
|
* with some modifications: */
|
||||||
static OSStatus SocketRead(SSLConnectionRef connection,
|
static OSStatus SocketRead(SSLConnectionRef connection,
|
||||||
@ -361,7 +398,7 @@ CF_INLINE const char *TLSCipherNameForNumber(SSLCipherSuite cipher) {
|
|||||||
case TLS_DH_anon_WITH_AES_256_CBC_SHA:
|
case TLS_DH_anon_WITH_AES_256_CBC_SHA:
|
||||||
return "TLS_DH_anon_WITH_AES_256_CBC_SHA";
|
return "TLS_DH_anon_WITH_AES_256_CBC_SHA";
|
||||||
break;
|
break;
|
||||||
#if defined(__MAC_10_6) || defined(__IPHONE_5_0)
|
#if CURL_BUILD_MAC_10_6 || CURL_BUILD_IOS
|
||||||
/* TLS 1.0 with ECDSA (RFC 4492) */
|
/* TLS 1.0 with ECDSA (RFC 4492) */
|
||||||
case TLS_ECDH_ECDSA_WITH_NULL_SHA:
|
case TLS_ECDH_ECDSA_WITH_NULL_SHA:
|
||||||
return "TLS_ECDH_ECDSA_WITH_NULL_SHA";
|
return "TLS_ECDH_ECDSA_WITH_NULL_SHA";
|
||||||
@ -438,8 +475,8 @@ CF_INLINE const char *TLSCipherNameForNumber(SSLCipherSuite cipher) {
|
|||||||
case TLS_ECDH_anon_WITH_AES_256_CBC_SHA:
|
case TLS_ECDH_anon_WITH_AES_256_CBC_SHA:
|
||||||
return "TLS_ECDH_anon_WITH_AES_256_CBC_SHA";
|
return "TLS_ECDH_anon_WITH_AES_256_CBC_SHA";
|
||||||
break;
|
break;
|
||||||
#endif /* defined(__MAC_10_6) || defined(__IPHONE_5_0) */
|
#endif /* CURL_BUILD_MAC_10_6 || CURL_BUILD_IOS */
|
||||||
#if defined(__MAC_10_8) || defined(__IPHONE_5_0)
|
#if CURL_BUILD_MAC_10_8 || CURL_BUILD_IOS
|
||||||
/* TLS 1.2 (RFC 5246) */
|
/* TLS 1.2 (RFC 5246) */
|
||||||
case TLS_RSA_WITH_NULL_MD5:
|
case TLS_RSA_WITH_NULL_MD5:
|
||||||
return "TLS_RSA_WITH_NULL_MD5";
|
return "TLS_RSA_WITH_NULL_MD5";
|
||||||
@ -624,12 +661,12 @@ CF_INLINE const char *TLSCipherNameForNumber(SSLCipherSuite cipher) {
|
|||||||
case SSL_DH_anon_WITH_3DES_EDE_CBC_SHA:
|
case SSL_DH_anon_WITH_3DES_EDE_CBC_SHA:
|
||||||
return "TLS_DH_anon_WITH_3DES_EDE_CBC_SHA";
|
return "TLS_DH_anon_WITH_3DES_EDE_CBC_SHA";
|
||||||
break;
|
break;
|
||||||
#endif /* defined(__MAC_10_8) || defined(__IPHONE_5_0) */
|
#endif /* CURL_BUILD_MAC_10_8 || CURL_BUILD_IOS */
|
||||||
}
|
}
|
||||||
return "TLS_NULL_WITH_NULL_NULL";
|
return "TLS_NULL_WITH_NULL_NULL";
|
||||||
}
|
}
|
||||||
|
|
||||||
#if (TARGET_OS_MAC && !(TARGET_OS_EMBEDDED || TARGET_OS_IPHONE))
|
#if CURL_BUILD_MAC
|
||||||
CF_INLINE void GetDarwinVersionNumber(int *major, int *minor)
|
CF_INLINE void GetDarwinVersionNumber(int *major, int *minor)
|
||||||
{
|
{
|
||||||
int mib[2];
|
int mib[2];
|
||||||
@ -658,7 +695,7 @@ CF_INLINE void GetDarwinVersionNumber(int *major, int *minor)
|
|||||||
*minor = atoi(os_version_minor);
|
*minor = atoi(os_version_minor);
|
||||||
free(os_version);
|
free(os_version);
|
||||||
}
|
}
|
||||||
#endif
|
#endif /* CURL_BUILD_MAC */
|
||||||
|
|
||||||
/* Apple provides a myriad of ways of getting information about a certificate
|
/* Apple provides a myriad of ways of getting information about a certificate
|
||||||
into a string. Some aren't available under iOS or newer cats. So here's
|
into a string. Some aren't available under iOS or newer cats. So here's
|
||||||
@ -668,37 +705,36 @@ CF_INLINE CFStringRef CopyCertSubject(SecCertificateRef cert)
|
|||||||
{
|
{
|
||||||
CFStringRef server_cert_summary = CFSTR("(null)");
|
CFStringRef server_cert_summary = CFSTR("(null)");
|
||||||
|
|
||||||
#if (TARGET_OS_EMBEDDED || TARGET_OS_IPHONE)
|
#if CURL_BUILD_IOS
|
||||||
/* iOS: There's only one way to do this. */
|
/* iOS: There's only one way to do this. */
|
||||||
server_cert_summary = SecCertificateCopySubjectSummary(cert);
|
server_cert_summary = SecCertificateCopySubjectSummary(cert);
|
||||||
#else
|
#else
|
||||||
#if defined(__MAC_10_7)
|
#if CURL_BUILD_MAC_10_7
|
||||||
/* Lion & later: Get the long description if we can. */
|
/* Lion & later: Get the long description if we can. */
|
||||||
if(SecCertificateCopyLongDescription != NULL)
|
if(SecCertificateCopyLongDescription != NULL)
|
||||||
server_cert_summary =
|
server_cert_summary =
|
||||||
SecCertificateCopyLongDescription(NULL, cert, NULL);
|
SecCertificateCopyLongDescription(NULL, cert, NULL);
|
||||||
else
|
else
|
||||||
#endif /* defined(__MAC_10_7) */
|
#endif /* CURL_BUILD_MAC_10_7 */
|
||||||
#if defined(__MAC_10_6)
|
#if CURL_BUILD_MAC_10_6
|
||||||
/* Snow Leopard: Get the certificate summary. */
|
/* Snow Leopard: Get the certificate summary. */
|
||||||
if(SecCertificateCopySubjectSummary != NULL)
|
if(SecCertificateCopySubjectSummary != NULL)
|
||||||
server_cert_summary = SecCertificateCopySubjectSummary(cert);
|
server_cert_summary = SecCertificateCopySubjectSummary(cert);
|
||||||
else
|
else
|
||||||
#endif /* defined(__MAC_10_6) */
|
#endif /* CURL_BUILD_MAC_10_6 */
|
||||||
/* Leopard is as far back as we go... */
|
/* Leopard is as far back as we go... */
|
||||||
(void)SecCertificateCopyCommonName(cert, &server_cert_summary);
|
(void)SecCertificateCopyCommonName(cert, &server_cert_summary);
|
||||||
#endif /* (TARGET_OS_EMBEDDED || TARGET_OS_IPHONE) */
|
#endif /* CURL_BUILD_IOS */
|
||||||
return server_cert_summary;
|
return server_cert_summary;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if (TARGET_OS_MAC && !(TARGET_OS_EMBEDDED || TARGET_OS_IPHONE))
|
#if CURL_SUPPORT_MAC_10_6
|
||||||
|
/* The SecKeychainSearch API was deprecated in Lion, and using it will raise
|
||||||
|
deprecation warnings, so let's not compile this unless it's necessary: */
|
||||||
static OSStatus CopyIdentityWithLabelOldSchool(char *label,
|
static OSStatus CopyIdentityWithLabelOldSchool(char *label,
|
||||||
SecIdentityRef *out_c_a_k)
|
SecIdentityRef *out_c_a_k)
|
||||||
{
|
{
|
||||||
OSStatus status = errSecItemNotFound;
|
OSStatus status = errSecItemNotFound;
|
||||||
/* The SecKeychainSearch API was deprecated in Lion, and using it will raise
|
|
||||||
deprecation warnings, so let's not compile this unless it's necessary: */
|
|
||||||
#if MAC_OS_X_VERSION_MIN_REQUIRED < 1070
|
|
||||||
SecKeychainAttributeList attr_list;
|
SecKeychainAttributeList attr_list;
|
||||||
SecKeychainAttribute attr;
|
SecKeychainAttribute attr;
|
||||||
SecKeychainSearchRef search = NULL;
|
SecKeychainSearchRef search = NULL;
|
||||||
@ -730,19 +766,16 @@ static OSStatus CopyIdentityWithLabelOldSchool(char *label,
|
|||||||
|
|
||||||
if(search)
|
if(search)
|
||||||
CFRelease(search);
|
CFRelease(search);
|
||||||
#else
|
|
||||||
#pragma unused(label, out_c_a_k)
|
|
||||||
#endif /* MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_7 */
|
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
#endif /* (TARGET_OS_MAC && !(TARGET_OS_EMBEDDED || TARGET_OS_IPHONE)) */
|
#endif /* CURL_SUPPORT_MAC_10_6 */
|
||||||
|
|
||||||
static OSStatus CopyIdentityWithLabel(char *label,
|
static OSStatus CopyIdentityWithLabel(char *label,
|
||||||
SecIdentityRef *out_cert_and_key)
|
SecIdentityRef *out_cert_and_key)
|
||||||
{
|
{
|
||||||
OSStatus status = errSecItemNotFound;
|
OSStatus status = errSecItemNotFound;
|
||||||
|
|
||||||
#if defined(__MAC_10_6) || defined(__IPHONE_2_0)
|
#if CURL_BUILD_MAC_10_6 || CURL_BUILD_IOS
|
||||||
/* SecItemCopyMatching() was introduced in iOS and Snow Leopard. If it
|
/* SecItemCopyMatching() was introduced in iOS and Snow Leopard. If it
|
||||||
exists, let's use that to find the certificate. */
|
exists, let's use that to find the certificate. */
|
||||||
if(SecItemCopyMatching != NULL) {
|
if(SecItemCopyMatching != NULL) {
|
||||||
@ -774,15 +807,15 @@ static OSStatus CopyIdentityWithLabel(char *label,
|
|||||||
CFRelease(query_dict);
|
CFRelease(query_dict);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
#if (TARGET_OS_MAC && !(TARGET_OS_EMBEDDED || TARGET_OS_IPHONE))
|
#if CURL_SUPPORT_MAC_10_6
|
||||||
/* On Leopard, fall back to SecKeychainSearch. */
|
/* On Leopard, fall back to SecKeychainSearch. */
|
||||||
status = CopyIdentityWithLabelOldSchool(label, out_cert_and_key);
|
status = CopyIdentityWithLabelOldSchool(label, out_cert_and_key);
|
||||||
#endif /* (TARGET_OS_MAC && !(TARGET_OS_EMBEDDED || TARGET_OS_IPHONE)) */
|
#endif /* CURL_SUPPORT_MAC_10_6 */
|
||||||
}
|
}
|
||||||
#elif (TARGET_OS_MAC && !(TARGET_OS_EMBEDDED || TARGET_OS_IPHONE))
|
#elif CURL_SUPPORT_MAC_10_6
|
||||||
/* For developers building on Leopard, we have no choice but to fall back. */
|
/* For developers building on Leopard, we have no choice but to fall back. */
|
||||||
status = CopyIdentityWithLabelOldSchool(label, out_cert_and_key);
|
status = CopyIdentityWithLabelOldSchool(label, out_cert_and_key);
|
||||||
#endif /* defined(__MAC_10_6) || defined(__IPHONE_2_0) */
|
#endif /* CURL_BUILD_MAC_10_6 || CURL_BUILD_IOS */
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -796,19 +829,19 @@ static CURLcode darwinssl_connect_step1(struct connectdata *conn,
|
|||||||
struct in6_addr addr;
|
struct in6_addr addr;
|
||||||
#else
|
#else
|
||||||
struct in_addr addr;
|
struct in_addr addr;
|
||||||
#endif
|
#endif /* ENABLE_IPV6 */
|
||||||
size_t all_ciphers_count = 0UL, allowed_ciphers_count = 0UL, i;
|
size_t all_ciphers_count = 0UL, allowed_ciphers_count = 0UL, i;
|
||||||
SSLCipherSuite *all_ciphers = NULL, *allowed_ciphers = NULL;
|
SSLCipherSuite *all_ciphers = NULL, *allowed_ciphers = NULL;
|
||||||
char *ssl_sessionid;
|
char *ssl_sessionid;
|
||||||
size_t ssl_sessionid_len;
|
size_t ssl_sessionid_len;
|
||||||
OSStatus err = noErr;
|
OSStatus err = noErr;
|
||||||
#if (TARGET_OS_MAC && !(TARGET_OS_EMBEDDED || TARGET_OS_IPHONE))
|
#if CURL_BUILD_MAC
|
||||||
int darwinver_maj = 0, darwinver_min = 0;
|
int darwinver_maj = 0, darwinver_min = 0;
|
||||||
|
|
||||||
GetDarwinVersionNumber(&darwinver_maj, &darwinver_min);
|
GetDarwinVersionNumber(&darwinver_maj, &darwinver_min);
|
||||||
#endif
|
#endif /* CURL_BUILD_MAC */
|
||||||
|
|
||||||
#if defined(__MAC_10_8) || defined(__IPHONE_5_0)
|
#if CURL_BUILD_MAC_10_8 || CURL_BUILD_IOS
|
||||||
if(SSLCreateContext != NULL) { /* use the newer API if avaialble */
|
if(SSLCreateContext != NULL) { /* use the newer API if avaialble */
|
||||||
if(connssl->ssl_ctx)
|
if(connssl->ssl_ctx)
|
||||||
CFRelease(connssl->ssl_ctx);
|
CFRelease(connssl->ssl_ctx);
|
||||||
@ -820,7 +853,7 @@ static CURLcode darwinssl_connect_step1(struct connectdata *conn,
|
|||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
/* The old ST API does not exist under iOS, so don't compile it: */
|
/* The old ST API does not exist under iOS, so don't compile it: */
|
||||||
#if (TARGET_OS_MAC && !(TARGET_OS_EMBEDDED || TARGET_OS_IPHONE))
|
#if CURL_SUPPORT_MAC_10_8
|
||||||
if(connssl->ssl_ctx)
|
if(connssl->ssl_ctx)
|
||||||
(void)SSLDisposeContext(connssl->ssl_ctx);
|
(void)SSLDisposeContext(connssl->ssl_ctx);
|
||||||
err = SSLNewContext(false, &(connssl->ssl_ctx));
|
err = SSLNewContext(false, &(connssl->ssl_ctx));
|
||||||
@ -828,7 +861,7 @@ static CURLcode darwinssl_connect_step1(struct connectdata *conn,
|
|||||||
failf(data, "SSL: couldn't create a context: OSStatus %d", err);
|
failf(data, "SSL: couldn't create a context: OSStatus %d", err);
|
||||||
return CURLE_OUT_OF_MEMORY;
|
return CURLE_OUT_OF_MEMORY;
|
||||||
}
|
}
|
||||||
#endif /* (TARGET_OS_MAC && !(TARGET_OS_EMBEDDED || TARGET_OS_IPHONE)) */
|
#endif /* CURL_SUPPORT_MAC_10_8 */
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
if(connssl->ssl_ctx)
|
if(connssl->ssl_ctx)
|
||||||
@ -838,11 +871,11 @@ static CURLcode darwinssl_connect_step1(struct connectdata *conn,
|
|||||||
failf(data, "SSL: couldn't create a context: OSStatus %d", err);
|
failf(data, "SSL: couldn't create a context: OSStatus %d", err);
|
||||||
return CURLE_OUT_OF_MEMORY;
|
return CURLE_OUT_OF_MEMORY;
|
||||||
}
|
}
|
||||||
#endif /* defined(__MAC_10_8) || defined(__IPHONE_5_0) */
|
#endif /* CURL_BUILD_MAC_10_8 || CURL_BUILD_IOS */
|
||||||
connssl->ssl_write_buffered_length = 0UL; /* reset buffered write length */
|
connssl->ssl_write_buffered_length = 0UL; /* reset buffered write length */
|
||||||
|
|
||||||
/* check to see if we've been told to use an explicit SSL/TLS version */
|
/* check to see if we've been told to use an explicit SSL/TLS version */
|
||||||
#if defined(__MAC_10_8) || defined(__IPHONE_5_0)
|
#if CURL_BUILD_MAC_10_8 || CURL_BUILD_IOS
|
||||||
if(SSLSetProtocolVersionMax != NULL) {
|
if(SSLSetProtocolVersionMax != NULL) {
|
||||||
switch(data->set.ssl.version) {
|
switch(data->set.ssl.version) {
|
||||||
case CURL_SSLVERSION_DEFAULT: default:
|
case CURL_SSLVERSION_DEFAULT: default:
|
||||||
@ -863,7 +896,7 @@ static CURLcode darwinssl_connect_step1(struct connectdata *conn,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
#if (TARGET_OS_MAC && !(TARGET_OS_EMBEDDED || TARGET_OS_IPHONE))
|
#if CURL_SUPPORT_MAC_10_8
|
||||||
(void)SSLSetProtocolVersionEnabled(connssl->ssl_ctx,
|
(void)SSLSetProtocolVersionEnabled(connssl->ssl_ctx,
|
||||||
kSSLProtocolAll,
|
kSSLProtocolAll,
|
||||||
false);
|
false);
|
||||||
@ -904,7 +937,7 @@ static CURLcode darwinssl_connect_step1(struct connectdata *conn,
|
|||||||
true);
|
true);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
#endif /* (TARGET_OS_MAC && !(TARGET_OS_EMBEDDED || TARGET_OS_IPHONE)) */
|
#endif /* CURL_SUPPORT_MAC_10_8 */
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
(void)SSLSetProtocolVersionEnabled(connssl->ssl_ctx, kSSLProtocolAll, false);
|
(void)SSLSetProtocolVersionEnabled(connssl->ssl_ctx, kSSLProtocolAll, false);
|
||||||
@ -934,7 +967,7 @@ static CURLcode darwinssl_connect_step1(struct connectdata *conn,
|
|||||||
true);
|
true);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
#endif /* defined(__MAC_10_8) || defined(__IPHONE_5_0) */
|
#endif /* CURL_BUILD_MAC_10_8 || CURL_BUILD_IOS */
|
||||||
|
|
||||||
if(data->set.str[STRING_KEY]) {
|
if(data->set.str[STRING_KEY]) {
|
||||||
infof(data, "WARNING: SSL: CURLOPT_SSLKEY is ignored by Secure "
|
infof(data, "WARNING: SSL: CURLOPT_SSLKEY is ignored by Secure "
|
||||||
@ -992,7 +1025,7 @@ static CURLcode darwinssl_connect_step1(struct connectdata *conn,
|
|||||||
* fail to connect if the verification fails, or if it should continue
|
* fail to connect if the verification fails, or if it should continue
|
||||||
* anyway. In the latter case the result of the verification is checked with
|
* anyway. In the latter case the result of the verification is checked with
|
||||||
* SSL_get_verify_result() below. */
|
* SSL_get_verify_result() below. */
|
||||||
#if defined(__MAC_10_6) || defined(__IPHONE_5_0)
|
#if CURL_BUILD_MAC_10_6 || CURL_BUILD_IOS
|
||||||
/* Snow Leopard introduced the SSLSetSessionOption() function, but due to
|
/* Snow Leopard introduced the SSLSetSessionOption() function, but due to
|
||||||
a library bug with the way the kSSLSessionOptionBreakOnServerAuth flag
|
a library bug with the way the kSSLSessionOptionBreakOnServerAuth flag
|
||||||
works, it doesn't work as expected under Snow Leopard or Lion.
|
works, it doesn't work as expected under Snow Leopard or Lion.
|
||||||
@ -1001,11 +1034,11 @@ static CURLcode darwinssl_connect_step1(struct connectdata *conn,
|
|||||||
(SecureTransport will always validate the certificate chain by
|
(SecureTransport will always validate the certificate chain by
|
||||||
default.) */
|
default.) */
|
||||||
/* (Note: Darwin 12.x.x is Mountain Lion.) */
|
/* (Note: Darwin 12.x.x is Mountain Lion.) */
|
||||||
#if (TARGET_OS_MAC && !(TARGET_OS_EMBEDDED || TARGET_OS_IPHONE))
|
#if CURL_BUILD_MAC
|
||||||
if(SSLSetSessionOption != NULL && darwinver_maj >= 12) {
|
if(SSLSetSessionOption != NULL && darwinver_maj >= 12) {
|
||||||
#else
|
#else
|
||||||
if(SSLSetSessionOption != NULL) {
|
if(SSLSetSessionOption != NULL) {
|
||||||
#endif /* (TARGET_OS_MAC && !(TARGET_OS_EMBEDDED || TARGET_OS_IPHONE)) */
|
#endif /* CURL_BUILD_MAC */
|
||||||
err = SSLSetSessionOption(connssl->ssl_ctx,
|
err = SSLSetSessionOption(connssl->ssl_ctx,
|
||||||
kSSLSessionOptionBreakOnServerAuth,
|
kSSLSessionOptionBreakOnServerAuth,
|
||||||
data->set.ssl.verifypeer?false:true);
|
data->set.ssl.verifypeer?false:true);
|
||||||
@ -1015,14 +1048,14 @@ static CURLcode darwinssl_connect_step1(struct connectdata *conn,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
#if (TARGET_OS_MAC && !(TARGET_OS_EMBEDDED || TARGET_OS_IPHONE))
|
#if CURL_SUPPORT_MAC_10_8
|
||||||
err = SSLSetEnableCertVerify(connssl->ssl_ctx,
|
err = SSLSetEnableCertVerify(connssl->ssl_ctx,
|
||||||
data->set.ssl.verifypeer?true:false);
|
data->set.ssl.verifypeer?true:false);
|
||||||
if(err != noErr) {
|
if(err != noErr) {
|
||||||
failf(data, "SSL: SSLSetEnableCertVerify() failed: OSStatus %d", err);
|
failf(data, "SSL: SSLSetEnableCertVerify() failed: OSStatus %d", err);
|
||||||
return CURLE_SSL_CONNECT_ERROR;
|
return CURLE_SSL_CONNECT_ERROR;
|
||||||
}
|
}
|
||||||
#endif /* (TARGET_OS_MAC && !(TARGET_OS_EMBEDDED || TARGET_OS_IPHONE)) */
|
#endif /* CURL_SUPPORT_MAC_10_8 */
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
err = SSLSetEnableCertVerify(connssl->ssl_ctx,
|
err = SSLSetEnableCertVerify(connssl->ssl_ctx,
|
||||||
@ -1031,7 +1064,7 @@ static CURLcode darwinssl_connect_step1(struct connectdata *conn,
|
|||||||
failf(data, "SSL: SSLSetEnableCertVerify() failed: OSStatus %d", err);
|
failf(data, "SSL: SSLSetEnableCertVerify() failed: OSStatus %d", err);
|
||||||
return CURLE_SSL_CONNECT_ERROR;
|
return CURLE_SSL_CONNECT_ERROR;
|
||||||
}
|
}
|
||||||
#endif /* defined(__MAC_10_6) || defined(__IPHONE_5_0) */
|
#endif /* CURL_BUILD_MAC_10_6 || CURL_BUILD_IOS */
|
||||||
|
|
||||||
/* If this is a domain name and not an IP address, then configure SNI.
|
/* If this is a domain name and not an IP address, then configure SNI.
|
||||||
* Also: the verifyhost setting influences SNI usage */
|
* Also: the verifyhost setting influences SNI usage */
|
||||||
@ -1061,7 +1094,7 @@ static CURLcode darwinssl_connect_step1(struct connectdata *conn,
|
|||||||
SSLGetSupportedCiphers(connssl->ssl_ctx, all_ciphers,
|
SSLGetSupportedCiphers(connssl->ssl_ctx, all_ciphers,
|
||||||
&all_ciphers_count) == noErr) {
|
&all_ciphers_count) == noErr) {
|
||||||
for(i = 0UL ; i < all_ciphers_count ; i++) {
|
for(i = 0UL ; i < all_ciphers_count ; i++) {
|
||||||
#if (TARGET_OS_MAC && !(TARGET_OS_EMBEDDED || TARGET_OS_IPHONE))
|
#if CURL_BUILD_MAC
|
||||||
/* There's a known bug in early versions of Mountain Lion where ST's ECC
|
/* There's a known bug in early versions of Mountain Lion where ST's ECC
|
||||||
ciphers (cipher suite 0xC001 through 0xC032) simply do not work.
|
ciphers (cipher suite 0xC001 through 0xC032) simply do not work.
|
||||||
Work around the problem here by disabling those ciphers if we are
|
Work around the problem here by disabling those ciphers if we are
|
||||||
@ -1070,7 +1103,7 @@ static CURLcode darwinssl_connect_step1(struct connectdata *conn,
|
|||||||
all_ciphers[i] >= 0xC001 && all_ciphers[i] <= 0xC032) {
|
all_ciphers[i] >= 0xC001 && all_ciphers[i] <= 0xC032) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
#endif
|
#endif /* CURL_BUILD_MAC */
|
||||||
switch(all_ciphers[i]) {
|
switch(all_ciphers[i]) {
|
||||||
/* Disable NULL ciphersuites: */
|
/* Disable NULL ciphersuites: */
|
||||||
case SSL_NULL_WITH_NULL_NULL:
|
case SSL_NULL_WITH_NULL_NULL:
|
||||||
@ -1303,7 +1336,7 @@ darwinssl_connect_step2(struct connectdata *conn, int sockindex)
|
|||||||
infof(data, "TLS 1.0 connection using %s\n",
|
infof(data, "TLS 1.0 connection using %s\n",
|
||||||
TLSCipherNameForNumber(cipher));
|
TLSCipherNameForNumber(cipher));
|
||||||
break;
|
break;
|
||||||
#if defined(__MAC_10_8) || defined(__IPHONE_5_0)
|
#if CURL_BUILD_MAC_10_8 || CURL_BUILD_IOS
|
||||||
case kTLSProtocol11:
|
case kTLSProtocol11:
|
||||||
infof(data, "TLS 1.1 connection using %s\n",
|
infof(data, "TLS 1.1 connection using %s\n",
|
||||||
TLSCipherNameForNumber(cipher));
|
TLSCipherNameForNumber(cipher));
|
||||||
@ -1339,8 +1372,8 @@ darwinssl_connect_step3(struct connectdata *conn,
|
|||||||
/* There is no step 3!
|
/* There is no step 3!
|
||||||
* Well, okay, if verbose mode is on, let's print the details of the
|
* Well, okay, if verbose mode is on, let's print the details of the
|
||||||
* server certificates. */
|
* server certificates. */
|
||||||
#if defined(__MAC_10_7) || defined(__IPHONE_5_0)
|
#if CURL_BUILD_MAC_10_7 || CURL_BUILD_IOS
|
||||||
#if (TARGET_OS_EMBEDDED || TARGET_OS_IPHONE)
|
#if CURL_BUILD_IOS
|
||||||
#pragma unused(server_certs)
|
#pragma unused(server_certs)
|
||||||
err = SSLCopyPeerTrust(connssl->ssl_ctx, &trust);
|
err = SSLCopyPeerTrust(connssl->ssl_ctx, &trust);
|
||||||
if(err == noErr) {
|
if(err == noErr) {
|
||||||
@ -1387,6 +1420,7 @@ darwinssl_connect_step3(struct connectdata *conn,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
#if CURL_SUPPORT_MAC_10_8
|
||||||
err = SSLCopyPeerCertificates(connssl->ssl_ctx, &server_certs);
|
err = SSLCopyPeerCertificates(connssl->ssl_ctx, &server_certs);
|
||||||
if(err == noErr) {
|
if(err == noErr) {
|
||||||
count = CFArrayGetCount(server_certs);
|
count = CFArrayGetCount(server_certs);
|
||||||
@ -1406,8 +1440,9 @@ darwinssl_connect_step3(struct connectdata *conn,
|
|||||||
}
|
}
|
||||||
CFRelease(server_certs);
|
CFRelease(server_certs);
|
||||||
}
|
}
|
||||||
|
#endif /* CURL_SUPPORT_MAC_10_8 */
|
||||||
}
|
}
|
||||||
#endif /* (TARGET_OS_EMBEDDED || TARGET_OS_IPHONE) */
|
#endif /* CURL_BUILD_IOS */
|
||||||
#else
|
#else
|
||||||
#pragma unused(trust)
|
#pragma unused(trust)
|
||||||
err = SSLCopyPeerCertificates(connssl->ssl_ctx, &server_certs);
|
err = SSLCopyPeerCertificates(connssl->ssl_ctx, &server_certs);
|
||||||
@ -1427,7 +1462,7 @@ darwinssl_connect_step3(struct connectdata *conn,
|
|||||||
}
|
}
|
||||||
CFRelease(server_certs);
|
CFRelease(server_certs);
|
||||||
}
|
}
|
||||||
#endif /* defined(__MAC_10_7) || defined(__IPHONE_5_0) */
|
#endif /* CURL_BUILD_MAC_10_7 || CURL_BUILD_IOS */
|
||||||
|
|
||||||
connssl->connecting_state = ssl_connect_done;
|
connssl->connecting_state = ssl_connect_done;
|
||||||
return CURLE_OK;
|
return CURLE_OK;
|
||||||
@ -1579,16 +1614,16 @@ void Curl_darwinssl_close(struct connectdata *conn, int sockindex)
|
|||||||
|
|
||||||
if(connssl->ssl_ctx) {
|
if(connssl->ssl_ctx) {
|
||||||
(void)SSLClose(connssl->ssl_ctx);
|
(void)SSLClose(connssl->ssl_ctx);
|
||||||
#if defined(__MAC_10_8) || defined(__IPHONE_5_0)
|
#if CURL_BUILD_MAC_10_8 || CURL_BUILD_IOS
|
||||||
if(SSLCreateContext != NULL)
|
if(SSLCreateContext != NULL)
|
||||||
CFRelease(connssl->ssl_ctx);
|
CFRelease(connssl->ssl_ctx);
|
||||||
#if (TARGET_OS_MAC && !(TARGET_OS_EMBEDDED || TARGET_OS_IPHONE))
|
#if CURL_SUPPORT_MAC_10_8
|
||||||
else
|
else
|
||||||
(void)SSLDisposeContext(connssl->ssl_ctx);
|
(void)SSLDisposeContext(connssl->ssl_ctx);
|
||||||
#endif /* (TARGET_OS_MAC && !(TARGET_OS_EMBEDDED || TARGET_OS_IPHONE)) */
|
#endif /* CURL_SUPPORT_MAC_10_8 */
|
||||||
#else
|
#else
|
||||||
(void)SSLDisposeContext(connssl->ssl_ctx);
|
(void)SSLDisposeContext(connssl->ssl_ctx);
|
||||||
#endif /* defined(__MAC_10_8) || defined(__IPHONE_5_0) */
|
#endif /* CURL_BUILD_MAC_10_8 || CURL_BUILD_IOS */
|
||||||
connssl->ssl_ctx = NULL;
|
connssl->ssl_ctx = NULL;
|
||||||
}
|
}
|
||||||
connssl->ssl_sockfd = 0;
|
connssl->ssl_sockfd = 0;
|
||||||
|
Loading…
Reference in New Issue
Block a user