Chromium Code Reviews| Index: net/cert/cert_verifier.cc |
| diff --git a/net/cert/cert_verifier.cc b/net/cert/cert_verifier.cc |
| index c308e93ebbdd61bd7d7c9f17c26302e06a706f62..3077588f45ac31d87bcfd39758a0a96077ba76ba 100644 |
| --- a/net/cert/cert_verifier.cc |
| +++ b/net/cert/cert_verifier.cc |
| @@ -4,11 +4,13 @@ |
| #include "net/cert/cert_verifier.h" |
| +#include <openssl/sha.h> |
| + |
| #include <algorithm> |
| #include <memory> |
| #include "base/memory/ptr_util.h" |
| -#include "base/sha1.h" |
| +#include "base/strings/string_util.h" |
| #include "build/build_config.h" |
| #include "net/cert/cert_verify_proc.h" |
| @@ -21,25 +23,39 @@ |
| namespace net { |
| CertVerifier::RequestParams::RequestParams( |
| - X509Certificate* certificate, |
| + scoped_refptr<X509Certificate> certificate, |
| const std::string& hostname, |
| int flags, |
| const std::string& ocsp_response, |
| - const CertificateList& additional_trust_anchors) |
| - : hostname_(hostname), flags_(flags) { |
| - // Rather than store all of the original data, create a fingerprint based |
| - // on the hash of the request data. |
| - SHA1HashValue ocsp_hash; |
| - base::SHA1HashBytes( |
| - reinterpret_cast<const unsigned char*>(ocsp_response.data()), |
| - ocsp_response.size(), ocsp_hash.data); |
| - |
| - request_data_.reserve(additional_trust_anchors.size() + 3); |
| - request_data_.push_back(ocsp_hash); |
| - request_data_.push_back(certificate->fingerprint()); |
| - request_data_.push_back(certificate->ca_fingerprint()); |
| - for (const auto& trust_anchor : additional_trust_anchors) |
| - request_data_.push_back(trust_anchor->fingerprint()); |
| + CertificateList additional_trust_anchors) |
| + : certificate_(std::move(certificate)), |
| + hostname_(hostname), |
| + flags_(flags), |
| + ocsp_response_(ocsp_response), |
| + additional_trust_anchors_(std::move(additional_trust_anchors)) { |
| + // For efficiency sake, rather than compare all of the fields for each |
|
eroman
2016/05/20 00:41:18
Have you confirmed this is worth doing with benchm
Ryan Sleevi
2016/05/20 02:39:43
It should be obviously beneficial; computing the D
Ryan Sleevi
2016/05/20 06:27:36
On 2016/05/20 02:39:43, Ryan Sleevi wrote:
> > Gi
|
| + // comparison, compute a hash of their values. This is done directly in |
| + // this class, rather than as an overloaded hash operator, for efficiency's |
| + // sake. |
| + SHA256_CTX ctx; |
| + SHA256_Init(&ctx); |
| + std::string cert_der; |
| + X509Certificate::GetDEREncoded(certificate_->os_cert_handle(), &cert_der); |
| + SHA256_Update(&ctx, cert_der.data(), cert_der.size()); |
| + for (const auto& cert_handle : certificate_->GetIntermediateCertificates()) { |
|
eroman
2016/05/20 00:41:18
Do you expect to separately change the fingerprint
Ryan Sleevi
2016/05/20 02:39:43
No, I intend to remove those.
|
| + X509Certificate::GetDEREncoded(cert_handle, &cert_der); |
| + SHA256_Update(&ctx, cert_der.data(), cert_der.size()); |
| + } |
| + SHA256_Update(&ctx, hostname_.data(), hostname.size()); |
| + SHA256_Update(&ctx, &flags, sizeof(flags)); |
| + SHA256_Update(&ctx, ocsp_response.data(), ocsp_response.size()); |
| + for (const auto& trust_anchor : additional_trust_anchors_) { |
| + X509Certificate::GetDEREncoded(trust_anchor->os_cert_handle(), &cert_der); |
| + SHA256_Update(&ctx, cert_der.data(), cert_der.size()); |
| + } |
| + SHA256_Final(reinterpret_cast<uint8_t*>( |
| + base::WriteInto(&key_, SHA256_DIGEST_LENGTH + 1)), |
| + &ctx); |
| } |
| CertVerifier::RequestParams::RequestParams(const RequestParams& other) = |
| @@ -48,13 +64,7 @@ CertVerifier::RequestParams::~RequestParams() {} |
| bool CertVerifier::RequestParams::operator<( |
| const CertVerifier::RequestParams& other) const { |
| - if (flags_ != other.flags_) |
| - return flags_ < other.flags_; |
| - if (hostname_ != other.hostname_) |
| - return hostname_ < other.hostname_; |
| - return std::lexicographical_compare( |
| - request_data_.begin(), request_data_.end(), other.request_data_.begin(), |
| - other.request_data_.end(), SHA1HashValueLessThan()); |
| + return key_ < other.key_; |
| } |
| bool CertVerifier::SupportsOCSPStapling() { |