summaryrefslogtreecommitdiffstats
path: root/chromium/net/cert/multi_threaded_cert_verifier.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/net/cert/multi_threaded_cert_verifier.cc')
-rw-r--r--chromium/net/cert/multi_threaded_cert_verifier.cc61
1 files changed, 57 insertions, 4 deletions
diff --git a/chromium/net/cert/multi_threaded_cert_verifier.cc b/chromium/net/cert/multi_threaded_cert_verifier.cc
index 4b2f37fbc55..3d1b048616e 100644
--- a/chromium/net/cert/multi_threaded_cert_verifier.cc
+++ b/chromium/net/cert/multi_threaded_cert_verifier.cc
@@ -15,6 +15,8 @@
#include "base/synchronization/lock.h"
#include "base/threading/worker_pool.h"
#include "base/time/time.h"
+#include "base/values.h"
+#include "net/base/hash_value.h"
#include "net/base/net_errors.h"
#include "net/base/net_log.h"
#include "net/cert/cert_trust_anchor_provider.h"
@@ -78,6 +80,35 @@ const unsigned kMaxCacheEntries = 256;
// The number of seconds for which we'll cache a cache entry.
const unsigned kTTLSecs = 1800; // 30 minutes.
+base::Value* CertVerifyResultCallback(const CertVerifyResult& verify_result,
+ NetLog::LogLevel log_level) {
+ base::DictionaryValue* results = new base::DictionaryValue();
+ results->SetBoolean("has_md5", verify_result.has_md5);
+ results->SetBoolean("has_md2", verify_result.has_md2);
+ results->SetBoolean("has_md4", verify_result.has_md4);
+ results->SetBoolean("is_issued_by_known_root",
+ verify_result.is_issued_by_known_root);
+ results->SetBoolean("is_issued_by_additional_trust_anchor",
+ verify_result.is_issued_by_additional_trust_anchor);
+ results->SetBoolean("common_name_fallback_used",
+ verify_result.common_name_fallback_used);
+ results->SetInteger("cert_status", verify_result.cert_status);
+ results->Set(
+ "verified_cert",
+ NetLogX509CertificateCallback(verify_result.verified_cert, log_level));
+
+ base::ListValue* hashes = new base::ListValue();
+ for (std::vector<HashValue>::const_iterator it =
+ verify_result.public_key_hashes.begin();
+ it != verify_result.public_key_hashes.end();
+ ++it) {
+ hashes->AppendString(it->ToString());
+ }
+ results->Set("public_key_hashes", hashes);
+
+ return results;
+}
+
} // namespace
MultiThreadedCertVerifier::CachedResult::CachedResult() : error(ERR_FAILED) {}
@@ -348,14 +379,25 @@ class CertVerifierJob {
}
void HandleResult(
- const MultiThreadedCertVerifier::CachedResult& verify_result) {
+ const MultiThreadedCertVerifier::CachedResult& verify_result,
+ bool is_first_job) {
worker_ = NULL;
- net_log_.EndEvent(NetLog::TYPE_CERT_VERIFIER_JOB);
+ net_log_.EndEvent(
+ NetLog::TYPE_CERT_VERIFIER_JOB,
+ base::Bind(&CertVerifyResultCallback, verify_result.result));
+ base::TimeDelta latency = base::TimeTicks::Now() - start_time_;
UMA_HISTOGRAM_CUSTOM_TIMES("Net.CertVerifier_Job_Latency",
- base::TimeTicks::Now() - start_time_,
+ latency,
base::TimeDelta::FromMilliseconds(1),
base::TimeDelta::FromMinutes(10),
100);
+ if (is_first_job) {
+ UMA_HISTOGRAM_CUSTOM_TIMES("Net.CertVerifier_First_Job_Latency",
+ latency,
+ base::TimeDelta::FromMilliseconds(1),
+ base::TimeDelta::FromMinutes(10),
+ 100);
+ }
PostAll(verify_result);
}
@@ -391,6 +433,7 @@ class CertVerifierJob {
MultiThreadedCertVerifier::MultiThreadedCertVerifier(
CertVerifyProc* verify_proc)
: cache_(kMaxCacheEntries),
+ first_job_(NULL),
requests_(0),
cache_hits_(0),
inflight_joins_(0),
@@ -474,6 +517,10 @@ int MultiThreadedCertVerifier::Verify(X509Certificate* cert,
return ERR_INSUFFICIENT_RESOURCES; // Just a guess.
}
inflight_.insert(std::make_pair(key, job));
+ if (requests_ == 1) {
+ // Cleared in HandleResult.
+ first_job_ = job;
+ }
}
CertVerifierRequest* request =
@@ -551,8 +598,13 @@ void MultiThreadedCertVerifier::HandleResult(
}
CertVerifierJob* job = j->second;
inflight_.erase(j);
+ bool is_first_job = false;
+ if (first_job_ == job) {
+ is_first_job = true;
+ first_job_ = NULL;
+ }
- job->HandleResult(cached_result);
+ job->HandleResult(cached_result, is_first_job);
delete job;
}
@@ -564,3 +616,4 @@ void MultiThreadedCertVerifier::OnCACertChanged(
}
} // namespace net
+