test_crlite_preexisting.js (4368B)
1 // -*- indent-tabs-mode: nil; js-indent-level: 2 -*- 2 // This Source Code Form is subject to the terms of the Mozilla Public 3 // License, v. 2.0. If a copy of the MPL was not distributed with this 4 // file, You can obtain one at http://mozilla.org/MPL/2.0/. 5 6 // Tests that starting a profile with a preexisting CRLite filter and stash 7 // works correctly. 8 9 "use strict"; 10 11 const CHECK_AT_TIME = new Date("2020-01-01T00:00:00Z").getTime() / 1000; 12 13 async function test_crlite_preexisting(ctMode) { 14 Services.prefs.setIntPref( 15 "security.pki.certificate_transparency.mode", 16 ctMode 17 ); 18 19 let certdb = Cc["@mozilla.org/security/x509certdb;1"].getService( 20 Ci.nsIX509CertDB 21 ); 22 23 let validCert = constructCertFromFile( 24 "test_crlite_filters/valid.example.com.pem" 25 ); 26 await checkCertErrorGenericAtTime( 27 certdb, 28 validCert, 29 PRErrorCodeSuccess, 30 Ci.nsIX509CertDB.verifyUsageTLSServer, 31 CHECK_AT_TIME, 32 false, 33 "valid.example.com", 34 0 35 ); 36 37 let revokedCert = constructCertFromFile( 38 "test_crlite_filters/revoked.example.com.pem" 39 ); 40 await checkCertErrorGenericAtTime( 41 certdb, 42 revokedCert, 43 SEC_ERROR_REVOKED_CERTIFICATE, 44 Ci.nsIX509CertDB.verifyUsageTLSServer, 45 CHECK_AT_TIME, 46 false, 47 "revoked.example.com", 48 0 49 ); 50 51 let revokedInDeltaCert = constructCertFromFile( 52 "test_crlite_filters/revoked-in-delta.example.com.pem" 53 ); 54 await checkCertErrorGenericAtTime( 55 certdb, 56 revokedInDeltaCert, 57 SEC_ERROR_REVOKED_CERTIFICATE, 58 Ci.nsIX509CertDB.verifyUsageTLSServer, 59 CHECK_AT_TIME, 60 false, 61 "revoked-in-delta.example.com", 62 0 63 ); 64 65 // This certificate has no embedded SCTs, but it should be considered revoked 66 // if the appropriate SCT is side-loaded. 67 let revokedNoSctCert = constructCertFromFile( 68 "test_crlite_filters/revoked-no-sct.example.com.pem" 69 ); 70 71 let sctFile = do_get_file( 72 "test_crlite_filters/revoked-no-sct.example.com.sct", 73 false 74 ); 75 let sctBytes = readBinaryFile(sctFile); 76 let sctList = new Uint8Array(2 + 2 + sctBytes.length); 77 sctList[0] = (2 + sctBytes.length) / 256; 78 sctList[1] = (2 + sctBytes.length) % 256; 79 sctList[2] = sctBytes.length / 256; 80 sctList[3] = sctBytes.length % 256; 81 sctList.set(sctBytes, 4); 82 83 await checkCertErrorGenericAtTime( 84 certdb, 85 revokedNoSctCert, 86 PRErrorCodeSuccess, 87 Ci.nsIX509CertDB.verifyUsageTLSServer, 88 CHECK_AT_TIME, 89 false, 90 "revoked-no-sct.example.com", 91 0, 92 [] // no side-loaded SCTs 93 ); 94 95 await checkCertErrorGenericAtTime( 96 certdb, 97 revokedNoSctCert, 98 ctMode == CT_MODE_DISABLE 99 ? PRErrorCodeSuccess 100 : SEC_ERROR_REVOKED_CERTIFICATE, 101 Ci.nsIX509CertDB.verifyUsageTLSServer, 102 CHECK_AT_TIME, 103 false, 104 "revoked-no-sct.example.com", 105 0, 106 sctList 107 ); 108 } 109 110 add_task(async function () { 111 Services.prefs.setIntPref( 112 "security.pki.crlite_mode", 113 CRLiteModeEnforcePrefValue 114 ); 115 116 let securityStateDirectory = do_get_profile(); 117 securityStateDirectory.append("security_state"); 118 119 // For simplicity, re-use the filters from test_crlite_filters.js. 120 do_get_file("test_crlite_filters/20200101-0-filter").copyTo( 121 securityStateDirectory, 122 "crlite.filter" 123 ); 124 125 do_get_file("test_crlite_filters/20200101-1-filter.delta").copyTo( 126 securityStateDirectory, 127 "20201017-1-filter.delta" 128 ); 129 130 let certStorage = Cc["@mozilla.org/security/certstorage;1"].getService( 131 Ci.nsICertStorage 132 ); 133 134 let certdb = Cc["@mozilla.org/security/x509certdb;1"].getService( 135 Ci.nsIX509CertDB 136 ); 137 138 // These need to be available for path building. 139 let ca = addCertFromFile(certdb, "test_crlite_filters/ca.pem", "C,C,"); 140 ok(ca, "ca certificate should decode successfully"); 141 142 let issuerCert = constructCertFromFile("test_crlite_filters/int.pem"); 143 ok(issuerCert, "issuer certificate should decode successfully"); 144 145 // Mark CRLite filter as fresh 146 await new Promise(resolve => { 147 certStorage.testNoteCRLiteUpdateTime((rv, _) => { 148 Assert.equal(rv, Cr.NS_OK, "marked filter as fresh"); 149 resolve(); 150 }); 151 }); 152 153 info(`testing with CT disabled`); 154 await test_crlite_preexisting(CT_MODE_DISABLE); 155 156 info(`testing with CT in telemetry only mode`); 157 await test_crlite_preexisting(CT_MODE_COLLECT_TELEMETRY); 158 159 info(`testing with CT enabled`); 160 await test_crlite_preexisting(CT_MODE_ENFORCE); 161 });