Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(539)

Unified Diff: net/cert/multi_log_ct_verifier.cc

Issue 992733002: Remove //net (except for Android test stuff) and sdch (Closed) Base URL: git@github.com:domokit/mojo.git@master
Patch Set: Created 5 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « net/cert/multi_log_ct_verifier.h ('k') | net/cert/multi_log_ct_verifier_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: net/cert/multi_log_ct_verifier.cc
diff --git a/net/cert/multi_log_ct_verifier.cc b/net/cert/multi_log_ct_verifier.cc
deleted file mode 100644
index 6c8d5bd2762bafaf5aad25d65b6e404d0a1da1d2..0000000000000000000000000000000000000000
--- a/net/cert/multi_log_ct_verifier.cc
+++ /dev/null
@@ -1,236 +0,0 @@
-// Copyright 2013 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "net/cert/multi_log_ct_verifier.h"
-
-#include <vector>
-
-#include "base/bind.h"
-#include "base/callback_helpers.h"
-#include "base/metrics/histogram.h"
-#include "net/base/net_errors.h"
-#include "net/base/net_log.h"
-#include "net/cert/ct_log_verifier.h"
-#include "net/cert/ct_objects_extractor.h"
-#include "net/cert/ct_serialization.h"
-#include "net/cert/ct_signed_certificate_timestamp_log_param.h"
-#include "net/cert/ct_verify_result.h"
-#include "net/cert/sct_status_flags.h"
-#include "net/cert/x509_certificate.h"
-
-namespace net {
-
-namespace {
-
-// Record SCT verification status. This metric would help detecting presence
-// of unknown CT logs as well as bad deployments (invalid SCTs).
-void LogSCTStatusToUMA(ct::SCTVerifyStatus status) {
- UMA_HISTOGRAM_ENUMERATION(
- "Net.CertificateTransparency.SCTStatus", status, ct::SCT_STATUS_MAX);
-}
-
-// Record SCT origin enum. This metric measure the popularity
-// of the various channels of providing SCTs for a certificate.
-void LogSCTOriginToUMA(ct::SignedCertificateTimestamp::Origin origin) {
- UMA_HISTOGRAM_ENUMERATION("Net.CertificateTransparency.SCTOrigin",
- origin,
- ct::SignedCertificateTimestamp::SCT_ORIGIN_MAX);
-}
-
-// Count the number of SCTs that were available for each SSL connection
-// (including SCTs embedded in the certificate).
-// This metric would allow measuring:
-// * Of all SSL connections, how many had SCTs available for validation.
-// * When SCTs are available, how many are available per connection.
-void LogNumSCTsToUMA(const ct::CTVerifyResult& result) {
- UMA_HISTOGRAM_CUSTOM_COUNTS("Net.CertificateTransparency.SCTsPerConnection",
- result.invalid_scts.size() +
- result.verified_scts.size() +
- result.unknown_logs_scts.size(),
- 1,
- 10,
- 11);
-}
-
-} // namespace
-
-MultiLogCTVerifier::MultiLogCTVerifier() { }
-
-MultiLogCTVerifier::~MultiLogCTVerifier() { }
-
-void MultiLogCTVerifier::AddLog(scoped_ptr<CTLogVerifier> log_verifier) {
- DCHECK(log_verifier);
- if (!log_verifier)
- return;
-
- linked_ptr<CTLogVerifier> log(log_verifier.release());
- logs_[log->key_id()] = log;
-}
-
-void MultiLogCTVerifier::AddLogs(
- ScopedVector<CTLogVerifier> log_verifiers) {
- for (ScopedVector<CTLogVerifier>::iterator it =
- log_verifiers.begin(); it != log_verifiers.end(); ++it) {
- linked_ptr<CTLogVerifier> log(*it);
- VLOG(1) << "Adding CT log: " << log->description();
- logs_[log->key_id()] = log;
- }
-
- // Ownership of the pointers in |log_verifiers| is transferred to |logs_|
- log_verifiers.weak_clear();
-}
-
-int MultiLogCTVerifier::Verify(
- X509Certificate* cert,
- const std::string& stapled_ocsp_response,
- const std::string& sct_list_from_tls_extension,
- ct::CTVerifyResult* result,
- const BoundNetLog& net_log) {
- DCHECK(cert);
- DCHECK(result);
-
- result->verified_scts.clear();
- result->invalid_scts.clear();
- result->unknown_logs_scts.clear();
-
- bool has_verified_scts = false;
-
- std::string embedded_scts;
- if (!cert->GetIntermediateCertificates().empty() &&
- ct::ExtractEmbeddedSCTList(
- cert->os_cert_handle(),
- &embedded_scts)) {
- ct::LogEntry precert_entry;
-
- has_verified_scts =
- ct::GetPrecertLogEntry(
- cert->os_cert_handle(),
- cert->GetIntermediateCertificates().front(),
- &precert_entry) &&
- VerifySCTs(
- embedded_scts,
- precert_entry,
- ct::SignedCertificateTimestamp::SCT_EMBEDDED,
- result);
- }
-
- std::string sct_list_from_ocsp;
- if (!stapled_ocsp_response.empty() &&
- !cert->GetIntermediateCertificates().empty()) {
- ct::ExtractSCTListFromOCSPResponse(
- cert->GetIntermediateCertificates().front(), cert->serial_number(),
- stapled_ocsp_response, &sct_list_from_ocsp);
- }
-
- // Log to Net Log, after extracting SCTs but before possibly failing on
- // X.509 entry creation.
- NetLog::ParametersCallback net_log_callback =
- base::Bind(&NetLogRawSignedCertificateTimestampCallback,
- &embedded_scts, &sct_list_from_ocsp, &sct_list_from_tls_extension);
-
- net_log.AddEvent(
- NetLog::TYPE_SIGNED_CERTIFICATE_TIMESTAMPS_RECEIVED,
- net_log_callback);
-
- ct::LogEntry x509_entry;
- if (ct::GetX509LogEntry(cert->os_cert_handle(), &x509_entry)) {
- has_verified_scts |= VerifySCTs(
- sct_list_from_ocsp,
- x509_entry,
- ct::SignedCertificateTimestamp::SCT_FROM_OCSP_RESPONSE,
- result);
-
- has_verified_scts |= VerifySCTs(
- sct_list_from_tls_extension,
- x509_entry,
- ct::SignedCertificateTimestamp::SCT_FROM_TLS_EXTENSION,
- result);
- }
-
- NetLog::ParametersCallback net_log_checked_callback =
- base::Bind(&NetLogSignedCertificateTimestampCallback, result);
-
- net_log.AddEvent(
- NetLog::TYPE_SIGNED_CERTIFICATE_TIMESTAMPS_CHECKED,
- net_log_checked_callback);
-
- LogNumSCTsToUMA(*result);
-
- if (has_verified_scts)
- return OK;
-
- return ERR_CT_NO_SCTS_VERIFIED_OK;
-}
-
-bool MultiLogCTVerifier::VerifySCTs(
- const std::string& encoded_sct_list,
- const ct::LogEntry& expected_entry,
- ct::SignedCertificateTimestamp::Origin origin,
- ct::CTVerifyResult* result) {
- if (logs_.empty())
- return false;
-
- base::StringPiece temp(encoded_sct_list);
- std::vector<base::StringPiece> sct_list;
-
- if (!ct::DecodeSCTList(&temp, &sct_list))
- return false;
-
- bool verified = false;
- for (std::vector<base::StringPiece>::const_iterator it = sct_list.begin();
- it != sct_list.end(); ++it) {
- base::StringPiece encoded_sct(*it);
- LogSCTOriginToUMA(origin);
-
- scoped_refptr<ct::SignedCertificateTimestamp> decoded_sct;
- if (!DecodeSignedCertificateTimestamp(&encoded_sct, &decoded_sct)) {
- LogSCTStatusToUMA(ct::SCT_STATUS_NONE);
- // XXX(rsleevi): Should we really just skip over bad SCTs?
- continue;
- }
- decoded_sct->origin = origin;
-
- verified |= VerifySingleSCT(decoded_sct, expected_entry, result);
- }
-
- return verified;
-}
-
-bool MultiLogCTVerifier::VerifySingleSCT(
- scoped_refptr<ct::SignedCertificateTimestamp> sct,
- const ct::LogEntry& expected_entry,
- ct::CTVerifyResult* result) {
-
- // Assume this SCT is untrusted until proven otherwise.
- IDToLogMap::iterator it = logs_.find(sct->log_id);
- if (it == logs_.end()) {
- DVLOG(1) << "SCT does not match any known log.";
- result->unknown_logs_scts.push_back(sct);
- LogSCTStatusToUMA(ct::SCT_STATUS_LOG_UNKNOWN);
- return false;
- }
-
- sct->log_description = it->second->description();
-
- if (!it->second->Verify(expected_entry, *sct.get())) {
- DVLOG(1) << "Unable to verify SCT signature.";
- result->invalid_scts.push_back(sct);
- LogSCTStatusToUMA(ct::SCT_STATUS_INVALID);
- return false;
- }
-
- // SCT verified ok, just make sure the timestamp is legitimate.
- if (sct->timestamp > base::Time::Now()) {
- DVLOG(1) << "SCT is from the future!";
- result->invalid_scts.push_back(sct);
- LogSCTStatusToUMA(ct::SCT_STATUS_INVALID);
- return false;
- }
-
- LogSCTStatusToUMA(ct::SCT_STATUS_OK);
- result->verified_scts.push_back(sct);
- return true;
-}
-
-} // namespace net
« no previous file with comments | « net/cert/multi_log_ct_verifier.h ('k') | net/cert/multi_log_ct_verifier_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698