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

Thu, 22 Jan 2015 13:21:57 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Thu, 22 Jan 2015 13:21:57 +0100
branch
TOR_BUG_9701
changeset 15
b8a032363ba2
permissions
-rw-r--r--

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 }

mercurial