Index: net/cert/internal/signature_policy.cc |
diff --git a/net/cert/internal/signature_policy.cc b/net/cert/internal/signature_policy.cc |
index 0785cbf65321c719711e25f76109fe2d5cf0fd40..b98cb7ae0524aa58f2213798312308198e10c34c 100644 |
--- a/net/cert/internal/signature_policy.cc |
+++ b/net/cert/internal/signature_policy.cc |
@@ -29,16 +29,56 @@ bool IsModulusSizeGreaterOrEqual(size_t modulus_length_bits, |
return true; |
} |
+// Whitelist of default permitted signature digest algorithms. |
+WARN_UNUSED_RESULT bool IsAcceptableDigest(DigestAlgorithm digest) { |
+ switch (digest) { |
+ case DigestAlgorithm::Md2: |
+ case DigestAlgorithm::Md4: |
+ case DigestAlgorithm::Md5: |
+ return false; |
+ |
+ case DigestAlgorithm::Sha1: |
+ case DigestAlgorithm::Sha256: |
+ case DigestAlgorithm::Sha384: |
+ case DigestAlgorithm::Sha512: |
+ return true; |
+ } |
+ |
+ return false; |
+} |
+ |
} // namespace |
bool SignaturePolicy::IsAcceptableSignatureAlgorithm( |
const SignatureAlgorithm& algorithm, |
CertErrors* errors) const { |
- return true; |
+ // Whitelist default permitted signature algorithms to: |
+ // |
+ // RSA PKCS#1 v1.5 |
+ // RSASSA-PSS |
+ // ECDSA |
+ // |
+ // When used with digest algorithms: |
+ // |
+ // SHA1 |
+ // SHA256 |
+ // SHA384 |
+ // SHA512 |
+ switch (algorithm.algorithm()) { |
+ case SignatureAlgorithmId::Ecdsa: |
+ case SignatureAlgorithmId::RsaPkcs1: |
+ return IsAcceptableDigest(algorithm.digest()); |
+ case SignatureAlgorithmId::RsaPss: |
+ return IsAcceptableDigest(algorithm.digest()) && |
+ IsAcceptableDigest(algorithm.ParamsForRsaPss()->mgf1_hash()); |
+ } |
+ |
+ return false; |
} |
bool SignaturePolicy::IsAcceptableCurveForEcdsa(int curve_nid, |
CertErrors* errors) const { |
+ // Whitelist default permitted named curves. |
switch (curve_nid) { |
case NID_X9_62_prime256v1: |
case NID_secp384r1: |