245 lines
12 KiB
Diff
245 lines
12 KiB
Diff
diff --git a/netwerk/protocol/http/WebTransportCertificateVerifier.cpp b/netwerk/protocol/http/WebTransportCertificateVerifier.cpp
|
|
index cc77864..1e978ef 100644
|
|
--- a/netwerk/protocol/http/WebTransportCertificateVerifier.cpp
|
|
+++ b/netwerk/protocol/http/WebTransportCertificateVerifier.cpp
|
|
@@ -53,6 +53,11 @@ class ServerCertHashesTrustDomain : public mozilla::pkix::TrustDomain {
|
|
mozilla::pkix::Input signature,
|
|
mozilla::pkix::Input subjectPublicKeyInfo) override;
|
|
|
|
+ virtual mozilla::pkix::Result VerifyMLDSASignedData(
|
|
+ mozilla::pkix::Input data,
|
|
+ mozilla::pkix::Input signature,
|
|
+ mozilla::pkix::Input subjectPublicKeyInfo) override;
|
|
+
|
|
virtual mozilla::pkix::Result DigestBuf(
|
|
mozilla::pkix::Input item, mozilla::pkix::DigestAlgorithm digestAlg,
|
|
/*out*/ uint8_t* digestBuf, size_t digestBufLen) override;
|
|
@@ -151,6 +156,15 @@ mozilla::pkix::Result ServerCertHashesTrustDomain::VerifyECDSASignedData(
|
|
return mozilla::pkix::Result::FATAL_ERROR_LIBRARY_FAILURE;
|
|
}
|
|
|
|
+mozilla::pkix::Result ServerCertHashesTrustDomain::VerifyMLDSASignedData(
|
|
+ mozilla::pkix::Input data,
|
|
+ mozilla::pkix::Input signature,
|
|
+ mozilla::pkix::Input subjectPublicKeyInfo) {
|
|
+ MOZ_ASSERT_UNREACHABLE("not expecting this to be called");
|
|
+
|
|
+ return mozilla::pkix::Result::FATAL_ERROR_LIBRARY_FAILURE;
|
|
+}
|
|
+
|
|
mozilla::pkix::Result ServerCertHashesTrustDomain::DigestBuf(
|
|
mozilla::pkix::Input item, mozilla::pkix::DigestAlgorithm digestAlg,
|
|
/*out*/ uint8_t* digestBuf, size_t digestBufLen) {
|
|
diff --git a/security/certverifier/CertVerifier.cpp b/security/certverifier/CertVerifier.cpp
|
|
index ca33077..cb96f58 100644
|
|
--- a/security/certverifier/CertVerifier.cpp
|
|
+++ b/security/certverifier/CertVerifier.cpp
|
|
@@ -1048,10 +1048,14 @@ void HashSignatureParams(pkix::Input data, pkix::Input signature,
|
|
sizeof(publicKeyAlgorithm)))) {
|
|
return;
|
|
}
|
|
- if (NS_FAILED(
|
|
+ // Digest algorithm is expected to be null since ML-DSA is not an hash and
|
|
+ // sign algorithm. Skip digestAlgorithm for ML-DSA.
|
|
+ if (publicKeyAlgorithm != der::PublicKeyAlgorithm::MLDSA) {
|
|
+ if (NS_FAILED(
|
|
digest.Update(reinterpret_cast<const uint8_t*>(&digestAlgorithm),
|
|
sizeof(digestAlgorithm)))) {
|
|
- return;
|
|
+ return;
|
|
+ }
|
|
}
|
|
nsTArray<uint8_t> result;
|
|
if (NS_FAILED(digest.End(result))) {
|
|
@@ -1064,12 +1068,19 @@ Result VerifySignedDataWithCache(
|
|
der::PublicKeyAlgorithm publicKeyAlg,
|
|
mozilla::glean::impl::DenominatorMetric telemetryDenominator,
|
|
mozilla::glean::impl::NumeratorMetric telemetryNumerator, Input data,
|
|
- DigestAlgorithm digestAlgorithm, Input signature,
|
|
+ std::optional<DigestAlgorithm> digestAlgorithm, Input signature,
|
|
Input subjectPublicKeyInfo, SignatureCache* signatureCache, void* pinArg) {
|
|
telemetryDenominator.Add(1);
|
|
Maybe<nsTArray<uint8_t>> sha512Hash;
|
|
+
|
|
+ // Currently, it is only acceptable for `digestAlgorithm` to be null when the
|
|
+ // public key algorithm is pure ML-DSA. Fail immediately otherwise.
|
|
+ if ((publicKeyAlg != der::PublicKeyAlgorithm::MLDSA) && !digestAlgorithm) {
|
|
+ return Result::ERROR_INVALID_ALGORITHM;
|
|
+ }
|
|
+
|
|
HashSignatureParams(data, signature, subjectPublicKeyInfo, publicKeyAlg,
|
|
- digestAlgorithm, sha512Hash);
|
|
+ digestAlgorithm.value_or(pkix::DigestAlgorithm::sha512), sha512Hash);
|
|
// If hashing the signature parameters succeeded, see if this signature is in
|
|
// the signature cache.
|
|
if (sha512Hash.isSome() &&
|
|
@@ -1080,16 +1091,23 @@ Result VerifySignedDataWithCache(
|
|
Result result;
|
|
switch (publicKeyAlg) {
|
|
case der::PublicKeyAlgorithm::ECDSA:
|
|
- result = VerifyECDSASignedDataNSS(data, digestAlgorithm, signature,
|
|
- subjectPublicKeyInfo, pinArg);
|
|
+ result = VerifyECDSASignedDataNSS(data, digestAlgorithm.value(),
|
|
+ signature, subjectPublicKeyInfo,
|
|
+ pinArg);
|
|
break;
|
|
case der::PublicKeyAlgorithm::RSA_PKCS1:
|
|
- result = VerifyRSAPKCS1SignedDataNSS(data, digestAlgorithm, signature,
|
|
- subjectPublicKeyInfo, pinArg);
|
|
+ result = VerifyRSAPKCS1SignedDataNSS(data, digestAlgorithm.value(),
|
|
+ signature, subjectPublicKeyInfo,
|
|
+ pinArg);
|
|
break;
|
|
case der::PublicKeyAlgorithm::RSA_PSS:
|
|
- result = VerifyRSAPSSSignedDataNSS(data, digestAlgorithm, signature,
|
|
- subjectPublicKeyInfo, pinArg);
|
|
+ result = VerifyRSAPSSSignedDataNSS(data, digestAlgorithm.value(),
|
|
+ signature, subjectPublicKeyInfo,
|
|
+ pinArg);
|
|
+ break;
|
|
+ case der::PublicKeyAlgorithm::MLDSA:
|
|
+ result = VerifyMLDSASignedDataNSS(data, signature, subjectPublicKeyInfo,
|
|
+ pinArg);
|
|
break;
|
|
default:
|
|
MOZ_ASSERT_UNREACHABLE("unhandled public key algorithm");
|
|
diff --git a/security/certverifier/CertVerifier.h b/security/certverifier/CertVerifier.h
|
|
index 6432547..f9a0365 100644
|
|
--- a/security/certverifier/CertVerifier.h
|
|
+++ b/security/certverifier/CertVerifier.h
|
|
@@ -331,7 +331,7 @@ mozilla::pkix::Result VerifySignedDataWithCache(
|
|
mozilla::pkix::der::PublicKeyAlgorithm publicKeyAlg,
|
|
mozilla::glean::impl::DenominatorMetric telemetryDenominator,
|
|
mozilla::glean::impl::NumeratorMetric telemetryNumerator,
|
|
- mozilla::pkix::Input data, mozilla::pkix::DigestAlgorithm digestAlgorithm,
|
|
+ mozilla::pkix::Input data, std::optional<mozilla::pkix::DigestAlgorithm> digestAlgorithm,
|
|
mozilla::pkix::Input signature, mozilla::pkix::Input subjectPublicKeyInfo,
|
|
SignatureCache* signatureCache, void* pinArg);
|
|
|
|
diff --git a/security/certverifier/NSSCertDBTrustDomain.cpp b/security/certverifier/NSSCertDBTrustDomain.cpp
|
|
index 77c17c1..741892f 100644
|
|
--- a/security/certverifier/NSSCertDBTrustDomain.cpp
|
|
+++ b/security/certverifier/NSSCertDBTrustDomain.cpp
|
|
@@ -1541,6 +1541,17 @@ Result NSSCertDBTrustDomain::VerifyECDSASignedData(
|
|
signature, subjectPublicKeyInfo, mSignatureCache, mPinArg);
|
|
}
|
|
|
|
+Result NSSCertDBTrustDomain::VerifyMLDSASignedData(Input data,
|
|
+ Input signature,
|
|
+ Input subjectPublicKeyInfo)
|
|
+{
|
|
+ return VerifySignedDataWithCache(
|
|
+ der::PublicKeyAlgorithm::MLDSA,
|
|
+ mozilla::glean::cert_signature_cache::total,
|
|
+ mozilla::glean::cert_signature_cache::hits, data, std::nullopt,
|
|
+ signature, subjectPublicKeyInfo, mSignatureCache, mPinArg);
|
|
+}
|
|
+
|
|
Result NSSCertDBTrustDomain::CheckValidityIsAcceptable(
|
|
Time notBefore, Time notAfter, EndEntityOrCA endEntityOrCA,
|
|
KeyPurposeId keyPurpose) {
|
|
diff --git a/security/certverifier/NSSCertDBTrustDomain.h b/security/certverifier/NSSCertDBTrustDomain.h
|
|
index fc210f3..8d17a4f 100644
|
|
--- a/security/certverifier/NSSCertDBTrustDomain.h
|
|
+++ b/security/certverifier/NSSCertDBTrustDomain.h
|
|
@@ -197,6 +197,11 @@ class NSSCertDBTrustDomain : public mozilla::pkix::TrustDomain {
|
|
mozilla::pkix::Input signature,
|
|
mozilla::pkix::Input subjectPublicKeyInfo) override;
|
|
|
|
+ virtual Result VerifyMLDSASignedData(
|
|
+ mozilla::pkix::Input data,
|
|
+ mozilla::pkix::Input signature,
|
|
+ mozilla::pkix::Input subjectPublicKeyInfo) override;
|
|
+
|
|
virtual Result DigestBuf(mozilla::pkix::Input item,
|
|
mozilla::pkix::DigestAlgorithm digestAlg,
|
|
/*out*/ uint8_t* digestBuf,
|
|
diff --git a/security/ct/CTLogVerifier.cpp b/security/ct/CTLogVerifier.cpp
|
|
index d5e665a..4712137 100644
|
|
--- a/security/ct/CTLogVerifier.cpp
|
|
+++ b/security/ct/CTLogVerifier.cpp
|
|
@@ -99,6 +99,10 @@ class SignatureParamsTrustDomain final : public TrustDomain {
|
|
return pkix::Result::FATAL_ERROR_LIBRARY_FAILURE;
|
|
}
|
|
|
|
+ pkix::Result VerifyMLDSASignedData(Input, Input, Input) override {
|
|
+ return pkix::Result::FATAL_ERROR_LIBRARY_FAILURE;
|
|
+ }
|
|
+
|
|
pkix::Result CheckValidityIsAcceptable(Time, Time, EndEntityOrCA,
|
|
KeyPurposeId) override {
|
|
return pkix::Result::FATAL_ERROR_LIBRARY_FAILURE;
|
|
diff --git a/security/ct/tests/gtest/CTTestUtils.cpp b/security/ct/tests/gtest/CTTestUtils.cpp
|
|
index 6a25307..03d19f7 100644
|
|
--- a/security/ct/tests/gtest/CTTestUtils.cpp
|
|
+++ b/security/ct/tests/gtest/CTTestUtils.cpp
|
|
@@ -807,6 +807,15 @@ class OCSPExtensionTrustDomain : public TrustDomain {
|
|
subjectPublicKeyInfo, nullptr);
|
|
}
|
|
|
|
+ pkix::Result VerifyMLDSASignedData(Input data,
|
|
+ Input signature,
|
|
+ Input subjectPublicKeyInfo) override {
|
|
+ return VerifyMLDSASignedDataNSS(data,
|
|
+ signature,
|
|
+ subjectPublicKeyInfo,
|
|
+ nullptr);
|
|
+ }
|
|
+
|
|
pkix::Result CheckValidityIsAcceptable(Time, Time, EndEntityOrCA,
|
|
KeyPurposeId) override {
|
|
ADD_FAILURE();
|
|
diff --git a/security/manager/ssl/AppTrustDomain.cpp b/security/manager/ssl/AppTrustDomain.cpp
|
|
index ab49d7e..36e7e19 100644
|
|
--- a/security/manager/ssl/AppTrustDomain.cpp
|
|
+++ b/security/manager/ssl/AppTrustDomain.cpp
|
|
@@ -322,6 +322,16 @@ pkix::Result AppTrustDomain::VerifyECDSASignedData(
|
|
subjectPublicKeyInfo, nullptr);
|
|
}
|
|
|
|
+pkix::Result AppTrustDomain::VerifyMLDSASignedData(Input data,
|
|
+ Input signature,
|
|
+ Input subjectPublicKeyInfo)
|
|
+{
|
|
+ return VerifyMLDSASignedDataNSS(data,
|
|
+ signature,
|
|
+ subjectPublicKeyInfo,
|
|
+ nullptr);
|
|
+}
|
|
+
|
|
pkix::Result AppTrustDomain::CheckValidityIsAcceptable(
|
|
Time /*notBefore*/, Time /*notAfter*/, EndEntityOrCA /*endEntityOrCA*/,
|
|
KeyPurposeId /*keyPurpose*/) {
|
|
diff --git a/security/manager/ssl/AppTrustDomain.h b/security/manager/ssl/AppTrustDomain.h
|
|
index 4b0212e..083d5fb 100644
|
|
--- a/security/manager/ssl/AppTrustDomain.h
|
|
+++ b/security/manager/ssl/AppTrustDomain.h
|
|
@@ -80,6 +80,10 @@ class AppTrustDomain final : public mozilla::pkix::TrustDomain {
|
|
mozilla::pkix::DigestAlgorithm digestAlg,
|
|
/*out*/ uint8_t* digestBuf,
|
|
size_t digestBufLen) override;
|
|
+ virtual Result VerifyMLDSASignedData(
|
|
+ mozilla::pkix::Input data,
|
|
+ mozilla::pkix::Input signature,
|
|
+ mozilla::pkix::Input subjectPublicKeyInfo) override;
|
|
|
|
private:
|
|
nsTArray<Span<const uint8_t>> mTrustedRoots;
|
|
diff --git a/security/manager/ssl/TLSClientAuthCertSelection.cpp b/security/manager/ssl/TLSClientAuthCertSelection.cpp
|
|
index 3a84b15..8450076 100644
|
|
--- a/security/manager/ssl/TLSClientAuthCertSelection.cpp
|
|
+++ b/security/manager/ssl/TLSClientAuthCertSelection.cpp
|
|
@@ -217,6 +217,12 @@ class ClientAuthCertNonverifyingTrustDomain final : public TrustDomain {
|
|
pkix::Input subjectPublicKeyInfo) override {
|
|
return pkix::Success;
|
|
}
|
|
+ virtual mozilla::pkix::Result VerifyMLDSASignedData(
|
|
+ pkix::Input data,
|
|
+ pkix::Input signature,
|
|
+ pkix::Input subjectPublicKeyInfo) override {
|
|
+ return pkix::Success;
|
|
+ }
|
|
virtual mozilla::pkix::Result CheckValidityIsAcceptable(
|
|
pkix::Time notBefore, pkix::Time notAfter,
|
|
pkix::EndEntityOrCA endEntityOrCA,
|