summaryrefslogtreecommitdiffstats
path: root/net
diff options
context:
space:
mode:
authorrsleevi@chromium.org <rsleevi@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-11-03 03:44:29 +0000
committerrsleevi@chromium.org <rsleevi@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-11-03 03:44:29 +0000
commit226a88215117198f1b3216419fc8fac4f8538162 (patch)
treeb6d461e5a10992ce028e3127307978c171c77020 /net
parent15d90ba0a25fae850e207773315ebf8cfcc58056 (diff)
downloadchromium_src-226a88215117198f1b3216419fc8fac4f8538162.zip
chromium_src-226a88215117198f1b3216419fc8fac4f8538162.tar.gz
chromium_src-226a88215117198f1b3216419fc8fac4f8538162.tar.bz2
Record when certificates signed with md[2,4,5] are encountered when using OpenSSL
R=joth@chromium.org BUG=101123 Review URL: http://codereview.chromium.org/8368015 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@108425 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'net')
-rw-r--r--net/base/x509_certificate_openssl.cc95
-rw-r--r--net/base/x509_certificate_unittest.cc5
2 files changed, 63 insertions, 37 deletions
diff --git a/net/base/x509_certificate_openssl.cc b/net/base/x509_certificate_openssl.cc
index 8583e4d..5612d61 100644
--- a/net/base/x509_certificate_openssl.cc
+++ b/net/base/x509_certificate_openssl.cc
@@ -300,6 +300,66 @@ bool GetDERAndCacheIfNeeded(X509Certificate::OSCertHandle cert,
return true;
}
+void GetCertChainInfo(X509_STORE_CTX* store_ctx,
+ CertVerifyResult* verify_result) {
+ STACK_OF(X509)* chain = X509_STORE_CTX_get_chain(store_ctx);
+ X509* verified_cert = NULL;
+ std::vector<X509*> verified_chain;
+ for (int i = 0; i < sk_X509_num(chain); ++i) {
+ X509* cert = sk_X509_value(chain, i);
+ if (i == 0) {
+ verified_cert = cert;
+ } else {
+ verified_chain.push_back(cert);
+ }
+
+ // Only check the algorithm status for certificates that are not in the
+ // trust store.
+ if (i < store_ctx->last_untrusted) {
+ int sig_alg = OBJ_obj2nid(cert->sig_alg->algorithm);
+ if (sig_alg == NID_md2WithRSAEncryption) {
+ verify_result->has_md2 = true;
+ if (i != 0)
+ verify_result->has_md2_ca = true;
+ } else if (sig_alg == NID_md4WithRSAEncryption) {
+ verify_result->has_md4 = true;
+ } else if (sig_alg == NID_md5WithRSAEncryption) {
+ verify_result->has_md5 = true;
+ if (i != 0)
+ verify_result->has_md5_ca = true;
+ }
+ }
+ }
+
+ if (verified_cert) {
+ verify_result->verified_cert =
+ X509Certificate::CreateFromHandle(verified_cert, verified_chain);
+ }
+}
+
+void AppendPublicKeyHashes(X509_STORE_CTX* store_ctx,
+ std::vector<SHA1Fingerprint>* hashes) {
+ STACK_OF(X509)* chain = X509_STORE_CTX_get_chain(store_ctx);
+ for (int i = 0; i < sk_X509_num(chain); ++i) {
+ X509* cert = sk_X509_value(chain, i);
+
+ DERCache der_cache;
+ if (!GetDERAndCacheIfNeeded(cert, &der_cache))
+ continue;
+
+ base::StringPiece der_bytes(reinterpret_cast<const char*>(der_cache.data),
+ der_cache.data_length);
+ base::StringPiece spki_bytes;
+ if (!asn1::ExtractSPKIFromDERCert(der_bytes, &spki_bytes))
+ continue;
+
+ SHA1Fingerprint hash;
+ base::SHA1HashBytes(reinterpret_cast<const uint8*>(spki_bytes.data()),
+ spki_bytes.size(), hash.data);
+ hashes->push_back(hash);
+ }
+}
+
} // namespace
// static
@@ -489,41 +549,12 @@ int X509Certificate::VerifyInternal(const std::string& hostname,
verify_result->cert_status |= cert_status;
}
+ GetCertChainInfo(ctx.get(), verify_result);
+
if (IsCertStatusError(verify_result->cert_status))
return MapCertStatusToNetError(verify_result->cert_status);
- STACK_OF(X509)* chain = X509_STORE_CTX_get_chain(ctx.get());
- X509* verified_cert = NULL;
- std::vector<X509*> verified_chain;
- for (int i = 0; i < sk_X509_num(chain); ++i) {
- X509* cert = sk_X509_value(chain, i);
- if (i == 0) {
- verified_cert = cert;
- } else {
- verified_chain.push_back(cert);
- }
-
- DERCache der_cache;
- if (!GetDERAndCacheIfNeeded(cert, &der_cache))
- continue;
-
- base::StringPiece der_bytes(reinterpret_cast<const char*>(der_cache.data),
- der_cache.data_length);
- base::StringPiece spki_bytes;
- if (!asn1::ExtractSPKIFromDERCert(der_bytes, &spki_bytes))
- continue;
-
- SHA1Fingerprint hash;
- base::SHA1HashBytes(reinterpret_cast<const uint8*>(spki_bytes.data()),
- spki_bytes.size(), hash.data);
- verify_result->public_key_hashes.push_back(hash);
- }
-
- if (verified_cert) {
- verify_result->verified_cert = CreateFromHandle(verified_cert,
- verified_chain);
- }
-
+ AppendPublicKeyHashes(ctx.get(), &verify_result->public_key_hashes);
// Currently we only ues OpenSSL's default root CA paths, so treat all
// correctly verified certs as being from a known root. TODO(joth): if the
// motivations described in http://src.chromium.org/viewvc/chrome?view=rev&revision=80778
diff --git a/net/base/x509_certificate_unittest.cc b/net/base/x509_certificate_unittest.cc
index 17bb919..010aba73 100644
--- a/net/base/x509_certificate_unittest.cc
+++ b/net/base/x509_certificate_unittest.cc
@@ -1490,9 +1490,6 @@ TEST_P(X509CertificateNameVerifyTest, VerifyHostname) {
INSTANTIATE_TEST_CASE_P(, X509CertificateNameVerifyTest,
testing::ValuesIn(kNameVerifyTestData));
-// Not implemented on OpenSSL - http://crbug.com/101123
-#if defined(USE_NSS) || defined(OS_WIN) || defined(OS_MACOSX)
-
struct WeakDigestTestData {
const char* root_cert_filename;
const char* intermediate_cert_filename;
@@ -1697,6 +1694,4 @@ WRAPPED_INSTANTIATE_TEST_CASE_P(
X509CertificateWeakDigestTest,
testing::ValuesIn(kVerifyMixedTestData));
-#endif // defined(USE_NSS) || defined(OS_WIN) || defined(OS_MACOSX)
-
} // namespace net