]> granicus.if.org Git - curl/commitdiff
darwinssl: Use CopyCertSubject() to check CA cert.
authorVilmos Nebehaj <v.nebehaj@gmail.com>
Wed, 3 Sep 2014 09:39:16 +0000 (11:39 +0200)
committerNick Zitzmann <nickzman@gmail.com>
Fri, 5 Sep 2014 00:00:02 +0000 (19:00 -0500)
SecCertificateCopyPublicKey() is not available on iPhone. Use
CopyCertSubject() instead to see if the certificate returned by
SecCertificateCreateWithData() is valid.

Reported-by: Toby Peterson
lib/vtls/curl_darwinssl.c

index 3726357472fc3f5d01e6a5959a20c121ba6a0966..f229c6fe2866e3a3353c1e4b299029ace1384554 100644 (file)
@@ -1672,14 +1672,25 @@ static int append_cert_to_array(struct SessionHandle *data,
     }
 
     /* Check if cacert is valid. */
-    SecKeyRef key;
-    OSStatus ret = SecCertificateCopyPublicKey(cacert, &key);
-    if(ret != noErr) {
+    CFStringRef subject = CopyCertSubject(cacert);
+    if(subject) {
+      char subject_cbuf[128];
+      memset(subject_cbuf, 0, 128);
+      if(!CFStringGetCString(subject,
+                            subject_cbuf,
+                            128,
+                            kCFStringEncodingUTF8)) {
+        CFRelease(cacert);
+        failf(data, "SSL: invalid CA certificate subject");
+        return CURLE_SSL_CACERT;
+      }
+      CFRelease(subject);
+    }
+    else {
       CFRelease(cacert);
       failf(data, "SSL: invalid CA certificate");
       return CURLE_SSL_CACERT;
     }
-    CFRelease(key);
 
     CFArrayAppendValue(array, cacert);
     CFRelease(cacert);