Chromium Code Reviews| Index: net/base/x509_certificate.cc |
| =================================================================== |
| --- net/base/x509_certificate.cc (revision 114272) |
| +++ net/base/x509_certificate.cc (working copy) |
| @@ -224,6 +224,16 @@ |
| } |
| #endif |
| +bool IsWeakKey(X509Certificate::PublicKeyType type, size_t size_bits) { |
| + switch (type) { |
| + case X509Certificate::kPublicKeyTypeRSA: |
| + case X509Certificate::kPublicKeyTypeDSA: |
| + return size_bits < 1024; |
| + default: |
| + return false; |
|
wtc
2011/12/14 00:18:03
Nit: I think it's important to document here or be
|
| + } |
|
Ryan Sleevi
2011/12/13 23:54:16
nit: whitespace
|
| +} |
| + |
| } // namespace |
| bool X509Certificate::LessThan::operator()(X509Certificate* lhs, |
| @@ -597,6 +607,31 @@ |
| rv = MapCertStatusToNetError(verify_result->cert_status); |
| } |
| + // Check for weak keys in the entire verified chain. |
| + size_t size_bits = 0; |
| + PublicKeyType type = kPublicKeyTypeUnknown; |
| + bool weak_key = false; |
| + |
| + GetPublicKeyInfo(verify_result->verified_cert->os_cert_handle(), &size_bits, |
| + &type); |
| + if (IsWeakKey(type, size_bits)) { |
| + weak_key = true; |
| + } else { |
| + const OSCertHandles& intermediates = |
| + verify_result->verified_cert->GetIntermediateCertificates(); |
| + for (OSCertHandles::const_iterator i = intermediates.begin(); |
| + i != intermediates.end(); ++i) { |
| + GetPublicKeyInfo(*i, &size_bits, &type); |
| + if (IsWeakKey(type, size_bits)) |
| + weak_key = true; |
| + } |
| + } |
| + |
| + if (weak_key) { |
| + verify_result->cert_status |= CERT_STATUS_WEAK_KEY; |
| + return MapCertStatusToNetError(verify_result->cert_status); |
|
wtc
2011/12/14 00:18:03
IMPORTANT: this needs the same kind of care that r
|
| + } |
| + |
| return rv; |
| } |