security/manager/ssl/tests/unit/test_certificate_usages.js

changeset 0
6474c204b198
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/security/manager/ssl/tests/unit/test_certificate_usages.js	Wed Dec 31 06:09:35 2014 +0100
     1.3 @@ -0,0 +1,145 @@
     1.4 +"use strict";
     1.5 +
     1.6 +/* To regenerate the certificates and apps for this test:
     1.7 +
     1.8 +        cd security/manager/ssl/tests/unit/test_certificate_usages
     1.9 +        PATH=$NSS/bin:$NSS/lib:$PATH ./generate.pl
    1.10 +        cd ../../../../../..
    1.11 +        make -C $OBJDIR/security/manager/ssl/tests
    1.12 +
    1.13 +   $NSS is the path to NSS binaries and libraries built for the host platform.
    1.14 +   If you get error messages about "CertUtil" on Windows, then it means that
    1.15 +   the Windows CertUtil.exe is ahead of the NSS certutil.exe in $PATH.
    1.16 +
    1.17 +   Check in the generated files. These steps are not done as part of the build
    1.18 +   because we do not want to add a build-time dependency on the OpenSSL or NSS
    1.19 +   tools or libraries built for the host platform.
    1.20 +*/
    1.21 +
    1.22 +do_get_profile(); // must be called before getting nsIX509CertDB
    1.23 +const certdb = Cc["@mozilla.org/security/x509certdb;1"].getService(Ci.nsIX509CertDB);
    1.24 +
    1.25 +const gNumCAs = 4;
    1.26 +
    1.27 +function run_test() {
    1.28 +  //ca's are one based!
    1.29 +  for (var i = 0; i < gNumCAs; i++) {
    1.30 +    var ca_name = "ca-" + (i + 1);
    1.31 +    var ca_filename = ca_name + ".der";
    1.32 +    addCertFromFile(certdb, "test_certificate_usages/" + ca_filename, "CTu,CTu,CTu");
    1.33 +    do_print("ca_name=" + ca_name);
    1.34 +    var cert = certdb.findCertByNickname(null, ca_name);
    1.35 +  }
    1.36 +
    1.37 +  run_test_in_mode(true);
    1.38 +  run_test_in_mode(false);
    1.39 +}
    1.40 +
    1.41 +function run_test_in_mode(useMozillaPKIX) {
    1.42 +  Services.prefs.setBoolPref("security.use_mozillapkix_verification", useMozillaPKIX);
    1.43 +  clearOCSPCache();
    1.44 +  clearSessionCache();
    1.45 +
    1.46 +  // mozilla::pkix does not allow CA certs to be validated for non-CA usages.
    1.47 +  var allCAUsages = useMozillaPKIX
    1.48 +                  ? 'SSL CA'
    1.49 +                  : 'Client,Server,Sign,Encrypt,SSL CA,Status Responder';
    1.50 +
    1.51 +  // mozilla::pkix doesn't allow CA certificates to have the Status Responder
    1.52 +  // EKU.
    1.53 +  var ca_usages = [allCAUsages,
    1.54 +                   'SSL CA',
    1.55 +                   allCAUsages,
    1.56 +                   useMozillaPKIX ? ''
    1.57 +                                  : 'Client,Server,Sign,Encrypt,Status Responder'];
    1.58 +
    1.59 +  // mozilla::pkix doesn't implement the Netscape Object Signer restriction.
    1.60 +  var basicEndEntityUsages = useMozillaPKIX
    1.61 +                           ? 'Client,Server,Sign,Encrypt,Object Signer'
    1.62 +                           : 'Client,Server,Sign,Encrypt';
    1.63 +  var basicEndEntityUsagesWithObjectSigner = basicEndEntityUsages + ",Object Signer"
    1.64 +
    1.65 +  // mozilla::pkix won't let a certificate with the "Status Responder" EKU get
    1.66 +  // validated for any other usage.
    1.67 +  var statusResponderUsages = (useMozillaPKIX ? "" : "Server,") + "Status Responder";
    1.68 +  var statusResponderUsagesFull
    1.69 +      = useMozillaPKIX ? statusResponderUsages
    1.70 +                       : basicEndEntityUsages + ',Object Signer,Status Responder';
    1.71 +
    1.72 +  var ee_usages = [
    1.73 +    [ basicEndEntityUsages,
    1.74 +      basicEndEntityUsages,
    1.75 +      basicEndEntityUsages,
    1.76 +      '',
    1.77 +      statusResponderUsagesFull,
    1.78 +      'Client,Server',
    1.79 +      'Sign,Encrypt,Object Signer',
    1.80 +      statusResponderUsages
    1.81 +    ],
    1.82 +
    1.83 +    [ basicEndEntityUsages,
    1.84 +      basicEndEntityUsages,
    1.85 +      basicEndEntityUsages,
    1.86 +      '',
    1.87 +      statusResponderUsagesFull,
    1.88 +      'Client,Server',
    1.89 +      'Sign,Encrypt,Object Signer',
    1.90 +      statusResponderUsages
    1.91 +    ],
    1.92 +
    1.93 +    [ basicEndEntityUsages,
    1.94 +      basicEndEntityUsages,
    1.95 +      basicEndEntityUsages,
    1.96 +      '',
    1.97 +      statusResponderUsagesFull,
    1.98 +      'Client,Server',
    1.99 +      'Sign,Encrypt,Object Signer',
   1.100 +      statusResponderUsages
   1.101 +    ],
   1.102 +
   1.103 +    // The CA has isCA=true without keyCertSign.
   1.104 +    //
   1.105 +    // The 'classic' NSS mode uses the 'union' of the
   1.106 +    // capabilites so the cert is considered a CA.
   1.107 +    // mozilla::pkix and libpkix use the intersection of
   1.108 +    // capabilites, so the cert is NOT considered a CA.
   1.109 +    [ useMozillaPKIX ? '' : basicEndEntityUsages,
   1.110 +      useMozillaPKIX ? '' : basicEndEntityUsages,
   1.111 +      useMozillaPKIX ? '' : basicEndEntityUsages,
   1.112 +      '',
   1.113 +      useMozillaPKIX ? '' : statusResponderUsagesFull,
   1.114 +      useMozillaPKIX ? '' : 'Client,Server',
   1.115 +      useMozillaPKIX ? '' : 'Sign,Encrypt,Object Signer',
   1.116 +      useMozillaPKIX ? '' : 'Server,Status Responder'
   1.117 +     ]
   1.118 +  ];
   1.119 +
   1.120 +  do_check_eq(gNumCAs, ca_usages.length);
   1.121 +
   1.122 +  for (var i = 0; i < gNumCAs; i++) {
   1.123 +    var ca_name = "ca-" + (i + 1);
   1.124 +    var verified = {};
   1.125 +    var usages = {};
   1.126 +    var cert = certdb.findCertByNickname(null, ca_name);
   1.127 +    cert.getUsagesString(true, verified, usages);
   1.128 +    do_print("usages.value=" + usages.value);
   1.129 +    do_check_eq(ca_usages[i], usages.value);
   1.130 +    if (ca_usages[i].indexOf('SSL CA') != -1) {
   1.131 +      checkCertErrorGeneric(certdb, cert, 0, certificateUsageVerifyCA);
   1.132 +    }
   1.133 +    //now the ee, names also one based
   1.134 +    for (var j = 0; j < ee_usages[i].length; j++) {
   1.135 +      var ee_name = "ee-" + (j + 1) + "-" + ca_name;
   1.136 +      var ee_filename = ee_name + ".der";
   1.137 +      //do_print("ee_filename" + ee_filename);
   1.138 +      addCertFromFile(certdb, "test_certificate_usages/" + ee_filename, ",,");
   1.139 +      var ee_cert;
   1.140 +      ee_cert = certdb.findCertByNickname(null, ee_name);
   1.141 +      var verified = {};
   1.142 +      var usages = {};
   1.143 +      ee_cert.getUsagesString(true, verified, usages);
   1.144 +      do_print("cert usages.value=" + usages.value);
   1.145 +      do_check_eq(ee_usages[i][j], usages.value);
   1.146 +    }
   1.147 +  }
   1.148 +}

mercurial