/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ /* vim: set ts=8 sts=2 et sw=2 tw=80: */ /* 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/. */
// A TrustDomain used to extract the SCT log signature parameters // given its subjectPublicKeyInfo. // Only RSASSA-PKCS1v15 with SHA-256 and ECDSA (using the NIST P-256 curve) // with SHA-256 are allowed. // RSA keys must be at least 2048 bits. // See See RFC 6962, Section 2.1.4. class SignatureParamsTrustDomain final : public TrustDomain { public:
SignatureParamsTrustDomain()
: mSignatureAlgorithm(DigitallySigned::SignatureAlgorithm::Anonymous) {}
// sct.extensions may be empty. If it is, sctExtensionsInput will remain in // its default state, which is valid but of length 0.
Input sctExtensionsInput; if (!sct.extensions.empty()) {
rv = sctExtensionsInput.Init(sct.extensions.data(), sct.extensions.size()); if (rv != Success) { return rv;
}
}
switch (mSignatureAlgorithm) { case DigitallySigned::SignatureAlgorithm::RSA:
rv = psm::VerifySignedDataWithCache(
der::PublicKeyAlgorithm::RSA_PKCS1,
mozilla::glean::sct_signature_cache::total,
mozilla::glean::sct_signature_cache::hits, data,
DigestAlgorithm::sha256, signature, spki, signatureCache, nullptr); break; case DigitallySigned::SignatureAlgorithm::ECDSA:
rv = psm::VerifySignedDataWithCache(
der::PublicKeyAlgorithm::ECDSA,
mozilla::glean::sct_signature_cache::total,
mozilla::glean::sct_signature_cache::hits, data,
DigestAlgorithm::sha256, signature, spki, signatureCache, nullptr); break; // We do not expect new values added to this enum any time soon, // so just listing all the available ones seems to be the easiest way // to suppress warning C4061 on MSVC (which expects all values of the // enum to be explicitly handled). case DigitallySigned::SignatureAlgorithm::Anonymous: case DigitallySigned::SignatureAlgorithm::DSA: default:
assert(false); return pkix::Result::FATAL_ERROR_INVALID_ARGS;
} if (rv != Success) { if (IsFatalError(rv)) { return rv;
} // If the error is non-fatal, we assume the signature was invalid. return pkix::Result::ERROR_BAD_SIGNATURE;
} return Success;
}