@@ -213,7 +213,7 @@ int writeAeadAuthData(WOLFSSL* ssl, word16 sz, byte type, byte* additional,
213213#include <Security/SecCertificate.h>
214214#include <Security/SecTrust.h>
215215#include <Security/SecPolicy.h>
216- static int DoAppleNativeCertValidation(const WOLFSSL_BUFFER_INFO* certs,
216+ static int DoAppleNativeCertValidation(WOLFSSL* ssl, const WOLFSSL_BUFFER_INFO* certs,
217217 int totalCerts);
218218#endif /* #if defined(__APPLE__) && defined(WOLFSSL_SYS_CA_CERTS) */
219219
@@ -16809,8 +16809,9 @@ int ProcessPeerCerts(WOLFSSL* ssl, byte* input, word32* inOutIdx,
1680916809 /* If we can't validate the peer cert chain against the CAs loaded
1681016810 * into wolfSSL, try to validate against the system certificates
1681116811 * using Apple's native trust APIs */
16812- if ((ret != 0) && (ssl->ctx->doAppleNativeCertValidationFlag)) {
16813- if (DoAppleNativeCertValidation(args->certs,
16812+ if ((ret == WC_NO_ERR_TRACE(ASN_NO_SIGNER_E)) &&
16813+ (ssl->ctx->doAppleNativeCertValidationFlag)) {
16814+ if (DoAppleNativeCertValidation(ssl, args->certs,
1681416815 args->totalCerts)) {
1681516816 WOLFSSL_MSG("Apple native cert chain validation SUCCESS");
1681616817 ret = 0;
@@ -42744,7 +42745,8 @@ static SecCertificateRef ConvertToSecCertificateRef(const byte* derCert,
4274442745 * wolfSSL's built-in certificate validation mechanisms anymore. We instead
4274542746 * must call into the Security Framework APIs to authenticate peer certificates
4274642747 */
42747- static int DoAppleNativeCertValidation(const WOLFSSL_BUFFER_INFO* certs,
42748+ static int DoAppleNativeCertValidation(WOLFSSL* ssl,
42749+ const WOLFSSL_BUFFER_INFO* certs,
4274842750 int totalCerts)
4274942751{
4275042752 int i;
@@ -42753,7 +42755,8 @@ static int DoAppleNativeCertValidation(const WOLFSSL_BUFFER_INFO* certs,
4275342755 CFMutableArrayRef certArray = NULL;
4275442756 SecCertificateRef secCert = NULL;
4275542757 SecTrustRef trust = NULL;
42756- SecPolicyRef policy = NULL ;
42758+ SecPolicyRef policy = NULL;
42759+ CFStringRef hostname = NULL;
4275742760
4275842761 WOLFSSL_ENTER("DoAppleNativeCertValidation");
4275942762
@@ -42782,7 +42785,18 @@ static int DoAppleNativeCertValidation(const WOLFSSL_BUFFER_INFO* certs,
4278242785 }
4278342786
4278442787 /* Create trust object for SecCertifiate Ref */
42785- policy = SecPolicyCreateSSL(true, NULL);
42788+ if (ssl->buffers.domainName.buffer &&
42789+ ssl->buffers.domainName.length > 0) {
42790+ /* Create policy with specified value to require host name match */
42791+ hostname = CFStringCreateWithCString(kCFAllocatorDefault,
42792+ (const char*)ssl->buffers.domainName.buffer,
42793+ kCFStringEncodingUTF8);
42794+ }
42795+ if (hostname != NULL) {
42796+ policy = SecPolicyCreateSSL(true, hostname);
42797+ } else {
42798+ policy = SecPolicyCreateSSL(true, NULL);
42799+ }
4278642800 status = SecTrustCreateWithCertificates(certArray, policy, &trust);
4278742801 if (status != errSecSuccess) {
4278842802 WOLFSSL_MSG_EX("Error creating trust object, "
@@ -42813,6 +42827,9 @@ static int DoAppleNativeCertValidation(const WOLFSSL_BUFFER_INFO* certs,
4281342827 if (policy) {
4281442828 CFRelease(policy);
4281542829 }
42830+ if (hostname) {
42831+ CFRelease(hostname);
42832+ }
4281642833
4281742834 WOLFSSL_LEAVE("DoAppleNativeCertValidation", ret);
4281842835
0 commit comments