// This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this
// file, You can obtain one at http://mozilla.org/MPL/2.0/.
// Tests that the extended key usage extension is properly processed by the
// platform when verifying certificates. There are already comprehensive tests
// in mozilla::pkix itself, but these tests serve as integration tests to ensure
// that the cases we're particularly concerned about are correctly handled.
"use strict";
do_get_profile();
// must be called before getting nsIX509CertDB
const certdb = Cc[
"@mozilla.org/security/x509certdb;1"].getService(
Ci.nsIX509CertDB
);
function certFromFile(certName) {
return constructCertFromFile(`test_cert_eku/${certName}.pem`);
}
function loadCertWithTrust(certName, trustString) {
addCertFromFile(certdb, `test_cert_eku/${certName}.pem`, trustString);
}
function checkEndEntity(cert, expectedResult) {
return checkCertErrorGeneric(
certdb,
cert,
expectedResult,
Ci.nsIX509CertDB.verifyUsageTLSServer
);
}
function checkCertOn25August2016(cert, expectedResult) {
// (new Date("2016-08-25T00:00:00Z")).getTime() / 1000
const VALIDATION_TIME =
1472083200;
return checkCertErrorGenericAtTime(
certdb,
cert,
expectedResult,
Ci.nsIX509CertDB.verifyUsageTLSServer,
VALIDATION_TIME
);
}
add_task(async
function () {
registerCleanupFunction(() => {
Services.prefs.clearUserPref(
"privacy.reduceTimerPrecision");
});
Services.prefs.setBoolPref(
"privacy.reduceTimerPrecision",
false);
loadCertWithTrust(
"ca",
"CTu,,");
// end-entity has id-kp-serverAuth => success
await checkEndEntity(certFromFile(
"ee-SA"), PRErrorCodeSuccess);
// end-entity has id-kp-serverAuth => success
await checkEndEntity(certFromFile(
"ee-SA-CA"), PRErrorCodeSuccess);
// end-entity has extended key usage, but id-kp-serverAuth is not present =>
// failure
await checkEndEntity(certFromFile(
"ee-CA"), SEC_ERROR_INADEQUATE_CERT_TYPE);
// end-entity has id-kp-serverAuth => success
await checkEndEntity(certFromFile(
"ee-SA-nsSGC"), PRErrorCodeSuccess);
// end-entity has extended key usage, but id-kp-serverAuth is not present =>
// failure (in particular, Netscape Server Gated Crypto (also known as
// Netscape Step Up) is not an acceptable substitute for end-entity
// certificates).
await checkEndEntity(
certFromFile(
"ee-nsSGC"),
SEC_ERROR_INADEQUATE_CERT_TYPE
);
// end-entity has id-kp-OCSPSigning, which is not acceptable for end-entity
// certificates being verified as TLS server certificates => failure
await checkEndEntity(
certFromFile(
"ee-SA-OCSP"),
SEC_ERROR_INADEQUATE_CERT_TYPE
);
// intermediate has id-kp-serverAuth => success
loadCertWithTrust(
"int-SA",
",,");
await checkEndEntity(certFromFile(
"ee-int-SA"), PRErrorCodeSuccess);
// intermediate has id-kp-serverAuth => success
loadCertWithTrust(
"int-SA-CA",
",,");
await checkEndEntity(certFromFile(
"ee-int-SA-CA"), PRErrorCodeSuccess);
// intermediate has extended key usage, but id-kp-serverAuth is not present
// => failure
loadCertWithTrust(
"int-CA",
",,");
await checkEndEntity(
certFromFile(
"ee-int-CA"),
SEC_ERROR_INADEQUATE_CERT_TYPE
);
// intermediate has id-kp-serverAuth => success
loadCertWithTrust(
"int-SA-nsSGC",
",,");
await checkEndEntity(certFromFile(
"ee-int-SA-nsSGC"), PRErrorCodeSuccess);
// Intermediate has Netscape Server Gated Crypto, but no other suitable EKU
// => failure
loadCertWithTrust(
"int-nsSGC",
",,");
await checkCertOn25August2016(
certFromFile(
"ee-int-nsSGC"),
SEC_ERROR_INADEQUATE_CERT_TYPE
);
// intermediate has id-kp-OCSPSigning, which is acceptable for CA
// certificates => success
loadCertWithTrust(
"int-SA-OCSP",
",,");
await checkEndEntity(certFromFile(
"ee-int-SA-OCSP"), PRErrorCodeSuccess);
});