Thu, 22 Jan 2015 13:21:57 +0100
Incorporate requested changes from Mozilla in review:
https://bugzilla.mozilla.org/show_bug.cgi?id=1123480#c6
1 "use strict";
3 /* To regenerate the certificates and apps for this test:
5 cd security/manager/ssl/tests/unit/test_certificate_usages
6 PATH=$NSS/bin:$NSS/lib:$PATH ./generate.pl
7 cd ../../../../../..
8 make -C $OBJDIR/security/manager/ssl/tests
10 $NSS is the path to NSS binaries and libraries built for the host platform.
11 If you get error messages about "CertUtil" on Windows, then it means that
12 the Windows CertUtil.exe is ahead of the NSS certutil.exe in $PATH.
14 Check in the generated files. These steps are not done as part of the build
15 because we do not want to add a build-time dependency on the OpenSSL or NSS
16 tools or libraries built for the host platform.
17 */
19 do_get_profile(); // must be called before getting nsIX509CertDB
20 const certdb = Cc["@mozilla.org/security/x509certdb;1"].getService(Ci.nsIX509CertDB);
22 const gNumCAs = 4;
24 function run_test() {
25 //ca's are one based!
26 for (var i = 0; i < gNumCAs; i++) {
27 var ca_name = "ca-" + (i + 1);
28 var ca_filename = ca_name + ".der";
29 addCertFromFile(certdb, "test_certificate_usages/" + ca_filename, "CTu,CTu,CTu");
30 do_print("ca_name=" + ca_name);
31 var cert = certdb.findCertByNickname(null, ca_name);
32 }
34 run_test_in_mode(true);
35 run_test_in_mode(false);
36 }
38 function run_test_in_mode(useMozillaPKIX) {
39 Services.prefs.setBoolPref("security.use_mozillapkix_verification", useMozillaPKIX);
40 clearOCSPCache();
41 clearSessionCache();
43 // mozilla::pkix does not allow CA certs to be validated for non-CA usages.
44 var allCAUsages = useMozillaPKIX
45 ? 'SSL CA'
46 : 'Client,Server,Sign,Encrypt,SSL CA,Status Responder';
48 // mozilla::pkix doesn't allow CA certificates to have the Status Responder
49 // EKU.
50 var ca_usages = [allCAUsages,
51 'SSL CA',
52 allCAUsages,
53 useMozillaPKIX ? ''
54 : 'Client,Server,Sign,Encrypt,Status Responder'];
56 // mozilla::pkix doesn't implement the Netscape Object Signer restriction.
57 var basicEndEntityUsages = useMozillaPKIX
58 ? 'Client,Server,Sign,Encrypt,Object Signer'
59 : 'Client,Server,Sign,Encrypt';
60 var basicEndEntityUsagesWithObjectSigner = basicEndEntityUsages + ",Object Signer"
62 // mozilla::pkix won't let a certificate with the "Status Responder" EKU get
63 // validated for any other usage.
64 var statusResponderUsages = (useMozillaPKIX ? "" : "Server,") + "Status Responder";
65 var statusResponderUsagesFull
66 = useMozillaPKIX ? statusResponderUsages
67 : basicEndEntityUsages + ',Object Signer,Status Responder';
69 var ee_usages = [
70 [ basicEndEntityUsages,
71 basicEndEntityUsages,
72 basicEndEntityUsages,
73 '',
74 statusResponderUsagesFull,
75 'Client,Server',
76 'Sign,Encrypt,Object Signer',
77 statusResponderUsages
78 ],
80 [ basicEndEntityUsages,
81 basicEndEntityUsages,
82 basicEndEntityUsages,
83 '',
84 statusResponderUsagesFull,
85 'Client,Server',
86 'Sign,Encrypt,Object Signer',
87 statusResponderUsages
88 ],
90 [ basicEndEntityUsages,
91 basicEndEntityUsages,
92 basicEndEntityUsages,
93 '',
94 statusResponderUsagesFull,
95 'Client,Server',
96 'Sign,Encrypt,Object Signer',
97 statusResponderUsages
98 ],
100 // The CA has isCA=true without keyCertSign.
101 //
102 // The 'classic' NSS mode uses the 'union' of the
103 // capabilites so the cert is considered a CA.
104 // mozilla::pkix and libpkix use the intersection of
105 // capabilites, so the cert is NOT considered a CA.
106 [ useMozillaPKIX ? '' : basicEndEntityUsages,
107 useMozillaPKIX ? '' : basicEndEntityUsages,
108 useMozillaPKIX ? '' : basicEndEntityUsages,
109 '',
110 useMozillaPKIX ? '' : statusResponderUsagesFull,
111 useMozillaPKIX ? '' : 'Client,Server',
112 useMozillaPKIX ? '' : 'Sign,Encrypt,Object Signer',
113 useMozillaPKIX ? '' : 'Server,Status Responder'
114 ]
115 ];
117 do_check_eq(gNumCAs, ca_usages.length);
119 for (var i = 0; i < gNumCAs; i++) {
120 var ca_name = "ca-" + (i + 1);
121 var verified = {};
122 var usages = {};
123 var cert = certdb.findCertByNickname(null, ca_name);
124 cert.getUsagesString(true, verified, usages);
125 do_print("usages.value=" + usages.value);
126 do_check_eq(ca_usages[i], usages.value);
127 if (ca_usages[i].indexOf('SSL CA') != -1) {
128 checkCertErrorGeneric(certdb, cert, 0, certificateUsageVerifyCA);
129 }
130 //now the ee, names also one based
131 for (var j = 0; j < ee_usages[i].length; j++) {
132 var ee_name = "ee-" + (j + 1) + "-" + ca_name;
133 var ee_filename = ee_name + ".der";
134 //do_print("ee_filename" + ee_filename);
135 addCertFromFile(certdb, "test_certificate_usages/" + ee_filename, ",,");
136 var ee_cert;
137 ee_cert = certdb.findCertByNickname(null, ee_name);
138 var verified = {};
139 var usages = {};
140 ee_cert.getUsagesString(true, verified, usages);
141 do_print("cert usages.value=" + usages.value);
142 do_check_eq(ee_usages[i][j], usages.value);
143 }
144 }
145 }