]> git.saurik.com Git - apple/security.git/blobdiff - OSX/shared_regressions/si-88-sectrust-valid.m
Security-58286.260.20.tar.gz
[apple/security.git] / OSX / shared_regressions / si-88-sectrust-valid.m
index ee7e2ece661c1e4f6a52bc1c5b8ff03d0925ca73..b8d6798273186c6419d4d20c48d84c352260d886 100644 (file)
 
 #include "shared_regressions.h"
 
-static void test_valid_trust(SecCertificateRef leaf, SecCertificateRef ca, CFArrayRef anchors,
-                             CFDateRef date, CFIndex policyID, SecTrustResultType expected, const char *test_name)
+enum {
+    kBasicPolicy = 0,
+    kSSLServerPolicy = 1,
+};
+
+/* number of tests in the test_valid_trust function */
+#define TVT_COUNT 8
+
+static void test_valid_trust(SecCertificateRef leaf, SecCertificateRef ca, SecCertificateRef subca,
+                             CFArrayRef anchors, CFDateRef date, CFIndex policyID,
+                             SecTrustResultType expected, const char *test_name)
 {
     CFArrayRef policies=NULL;
     SecPolicyRef policy=NULL;
@@ -34,9 +43,12 @@ static void test_valid_trust(SecCertificateRef leaf, SecCertificateRef ca, CFArr
         if (ca) {
             CFArrayAppendValue(certs, ca);
         }
+        if (subca) {
+            CFArrayAppendValue(certs, subca);
+        }
     }
 
-    if (policyID == 1) {
+    if (policyID == kSSLServerPolicy) {
         isnt(policy = SecPolicyCreateSSL(true, NULL), NULL, "create ssl policy");
     } else {
         isnt(policy = SecPolicyCreateBasicX509(), NULL, "create basic policy");
@@ -80,7 +92,10 @@ static SecCertificateRef SecCertificateCreateFromResource(NSString *name)
     return SecCertificateCreateWithPEM(kCFAllocatorDefault, (__bridge CFDataRef)certData);
 }
 
-static void tests()
+/* number of tests in date_constraints_tests function, plus calls to test_valid_trust */
+#define DC_COUNT (12+(TVT_COUNT*6))
+
+static void date_constraints_tests()
 {
     SecCertificateRef ca_na=NULL, ca_nb=NULL, root=NULL;
     SecCertificateRef leaf_na_ok1=NULL, leaf_na_ok2=NULL;
@@ -111,47 +126,120 @@ static void tests()
     /* Case 0: leaf_na_ok1 (not revoked) */
     /* -- OK: cert issued 2017-10-20, before the CA not-after date of 2017-10-21 */
     /*        test cert has no SCT, but is expected to be OK since we now only apply the CT restriction for SSL. */
-    test_valid_trust(leaf_na_ok1, ca_na, anchors, date_20180102, 0, kSecTrustResultUnspecified, "leaf_na_ok1 basic test");
+    test_valid_trust(leaf_na_ok1, ca_na, NULL, anchors, date_20180102,
+                     kBasicPolicy, kSecTrustResultUnspecified,
+                     "leaf_na_ok1 basic");
 
     /* Case 1: leaf_na_ok1 (not revoked) */
     /* -- BAD: since a not-after date now requires CT (for SSL) and the test cert has no SCT, this is fatal. */
-    test_valid_trust(leaf_na_ok1, ca_na, anchors, date_20180102, 1, kSecTrustResultFatalTrustFailure, "leaf_na_ok1 ssl test");
+    test_valid_trust(leaf_na_ok1, ca_na, NULL, anchors, date_20180102,
+                     kSSLServerPolicy, kSecTrustResultFatalTrustFailure,
+                     "leaf_na_ok1 ssl");
 
     /* Case 2: leaf_na_ok2 (revoked) */
     /* -- BAD: cert issued 2017-10-26, after the CA not-after date of 2017-10-21 */
-    test_valid_trust(leaf_na_ok2, ca_na, anchors, date_20180102, 0, kSecTrustResultFatalTrustFailure, "leaf_na_ok2 basic test");
+    test_valid_trust(leaf_na_ok2, ca_na, NULL, anchors, date_20180102,
+                     kBasicPolicy, kSecTrustResultFatalTrustFailure,
+                     "leaf_na_ok2 basic");
 
     /* Case 3: leaf_nb_ok1 (revoked) */
     /* -- BAD: cert issued 2017-10-20, before the CA not-before date of 2017-10-22 */
-    test_valid_trust(leaf_nb_ok1, ca_nb, anchors, date_20180102, 0, kSecTrustResultFatalTrustFailure, "leaf_nb_ok1 basic test");
+    test_valid_trust(leaf_nb_ok1, ca_nb, NULL, anchors, date_20180102,
+                     kBasicPolicy, kSecTrustResultFatalTrustFailure,
+                     "leaf_nb_ok1 basic");
 
     /* Case 4: leaf_nb_ok2 (not revoked) */
     /* -- OK: cert issued 2017-10-26, after the CA not-before date of 2017-10-22 */
-    test_valid_trust(leaf_nb_ok2, ca_nb, anchors, date_20180102, 0, kSecTrustResultUnspecified, "leaf_nb_ok2 basic test");
+    test_valid_trust(leaf_nb_ok2, ca_nb, NULL, anchors, date_20180102,
+                     kBasicPolicy, kSecTrustResultUnspecified,
+                     "leaf_nb_ok2 basic");
 
     /* Case 5: leaf_nb_revoked1 (revoked) */
     /* -- BAD: cert issued 2017-10-20, before the CA not-before date of 2017-10-22 */
-    test_valid_trust(leaf_nb_revoked1, ca_nb, anchors, date_20180102, 0, kSecTrustResultFatalTrustFailure, "leaf_nb_revoked1 basic test");
+    test_valid_trust(leaf_nb_revoked1, ca_nb, NULL, anchors, date_20180102,
+                     kBasicPolicy, kSecTrustResultFatalTrustFailure,
+                     "leaf_nb_revoked1 basic");
 
     CFReleaseSafe(ca_na);
     CFReleaseSafe(ca_nb);
-    CFReleaseSafe(root);
     CFReleaseSafe(leaf_na_ok1);
     CFReleaseSafe(leaf_na_ok2);
     CFReleaseSafe(leaf_nb_ok1);
     CFReleaseSafe(leaf_nb_ok2);
     CFReleaseSafe(leaf_nb_revoked1);
+    CFReleaseSafe(root);
     CFReleaseSafe(anchors);
     CFReleaseSafe(cal);
     CFReleaseSafe(date_20180102);
 }
 
+/* number of tests in known_intermediate_tests function, plus calls to test_valid_trust */
+#define KI_COUNT (10+(TVT_COUNT*3))
+
+static void known_intermediate_tests()
+{
+    SecCertificateRef ca_ki=NULL, root=NULL;
+    SecCertificateRef leaf_ki_ok1=NULL, leaf_ki_revoked1=NULL;
+    SecCertificateRef leaf_unknown=NULL, ca_unknown=NULL;
+
+    isnt(ca_ki = SecCertificateCreateFromResource(@"ca-ki"), NULL, "create ca-ki cert");
+    isnt(root = SecCertificateCreateFromResource(@"root"), NULL, "create root cert");
+    isnt(leaf_ki_ok1 = SecCertificateCreateFromResource(@"leaf-ki-ok1"), NULL, "create leaf-ki-ok1 cert");
+    isnt(leaf_ki_revoked1 = SecCertificateCreateFromResource(@"leaf-ki-revoked1"), NULL, "create leaf-ki-revoked1 cert");
+    isnt(ca_unknown = SecCertificateCreateFromResource(@"ca-unknown"), NULL, "create ca-unknown cert");
+    isnt(leaf_unknown = SecCertificateCreateFromResource(@"leaf-unknown"), NULL, "create leaf-unknown cert");
+
+    CFMutableArrayRef anchors=NULL;
+    isnt(anchors = CFArrayCreateMutable(kCFAllocatorDefault, 0, &kCFTypeArrayCallBacks), NULL, "create anchors array");
+    if (anchors && root) {
+        CFArrayAppendValue(anchors, root);
+    }
+    CFCalendarRef cal = NULL;
+    CFAbsoluteTime at;
+    CFDateRef date_20180310 = NULL; // a date when our test certs would all be valid, in the absence of Valid db info
+
+    isnt(cal = CFCalendarCreateWithIdentifier(kCFAllocatorDefault, kCFGregorianCalendar), NULL, "create calendar");
+    ok(CFCalendarComposeAbsoluteTime(cal, &at, "yMd", 2018, 3, 10), "create verify absolute time 20180310");
+    isnt(date_20180310 = CFDateCreate(kCFAllocatorDefault, at), NULL, "create verify date 20180310");
+
+    /* Case 1: leaf_ki_ok1 */
+    /* -- OK: cert issued by a known intermediate */
+    test_valid_trust(leaf_ki_ok1, ca_ki, NULL, anchors, date_20180310,
+                     kBasicPolicy, kSecTrustResultUnspecified,
+                     "leaf_ki_ok1");
+
+    /* Case 2: leaf_ki_revoked1 */
+    /* -- BAD: CA specifies known-only+complete serial blocklist; this cert is on the blocklist. */
+    test_valid_trust(leaf_ki_revoked1, ca_ki, NULL, anchors, date_20180310,
+                     kBasicPolicy, kSecTrustResultFatalTrustFailure,
+                     "leaf_ki_revoked1");
+
+    /* Case 3: leaf_unknown */
+    /* -- BAD: ca_unknown issued from ca_ki, but is not a known intermediate.
+     * ca_ki has a path len of 0 which would normally result in kSecTrustResultRecoverableTrustFailure;
+     * however, since known-intermediates is asserted for ca_ki (non-overridable), we expect a fatal failure. */
+    test_valid_trust(leaf_unknown, ca_unknown, ca_ki, anchors, date_20180310,
+                     kBasicPolicy, kSecTrustResultFatalTrustFailure,
+                     "leaf_unknown test");
+
+    CFReleaseSafe(ca_ki);
+    CFReleaseSafe(leaf_ki_ok1);
+    CFReleaseSafe(leaf_ki_revoked1);
+    CFReleaseSafe(ca_unknown);
+    CFReleaseSafe(leaf_unknown);
+    CFReleaseSafe(root);
+    CFReleaseSafe(anchors);
+    CFReleaseSafe(cal);
+    CFReleaseSafe(date_20180310);
+}
+
 
 int si_88_sectrust_valid(int argc, char *const *argv)
 {
-    plan_tests(12+(6*8));
+    plan_tests(DC_COUNT+KI_COUNT);
 
-    tests();
+    date_constraints_tests();
+    known_intermediate_tests();
 
     return 0;
 }