| Index: net/socket/ssl_client_socket_openssl.cc
|
| diff --git a/net/socket/ssl_client_socket_openssl.cc b/net/socket/ssl_client_socket_openssl.cc
|
| index 05eb1cb6ceab3798581bc792ca87e215c71332f8..1c52e29b9a9a845eed0853ec0ad8b0c265ffc764 100644
|
| --- a/net/socket/ssl_client_socket_openssl.cc
|
| +++ b/net/socket/ssl_client_socket_openssl.cc
|
| @@ -24,6 +24,7 @@
|
| #include "crypto/openssl_util.h"
|
| #include "crypto/scoped_openssl_types.h"
|
| #include "net/base/net_errors.h"
|
| +#include "net/cert/cert_policy_enforcer.h"
|
| #include "net/cert/cert_verifier.h"
|
| #include "net/cert/ct_ev_whitelist.h"
|
| #include "net/cert/ct_verifier.h"
|
| @@ -376,6 +377,7 @@ SSLClientSocketOpenSSL::SSLClientSocketOpenSSL(
|
| handshake_succeeded_(false),
|
| marked_session_as_good_(false),
|
| transport_security_state_(context.transport_security_state),
|
| + policy_enforcer_(context.cert_policy_enforcer),
|
| net_log_(transport_->socket()->NetLog()),
|
| weak_factory_(this) {
|
| }
|
| @@ -1140,21 +1142,6 @@ int SSLClientSocketOpenSSL::DoVerifyCertComplete(int result) {
|
| result = ERR_SSL_PINNED_KEY_NOT_IN_CERT_CHAIN;
|
| }
|
|
|
| - scoped_refptr<ct::EVCertsWhitelist> ev_whitelist =
|
| - SSLConfigService::GetEVCertsWhitelist();
|
| - if (server_cert_verify_result_.cert_status & CERT_STATUS_IS_EV) {
|
| - if (ev_whitelist.get() && ev_whitelist->IsValid()) {
|
| - const SHA256HashValue fingerprint(
|
| - X509Certificate::CalculateFingerprint256(
|
| - server_cert_verify_result_.verified_cert->os_cert_handle()));
|
| -
|
| - UMA_HISTOGRAM_BOOLEAN(
|
| - "Net.SSL_EVCertificateInWhitelist",
|
| - ev_whitelist->ContainsCertificateHash(
|
| - std::string(reinterpret_cast<const char*>(fingerprint.data), 8)));
|
| - }
|
| - }
|
| -
|
| if (result == OK) {
|
| // Only check Certificate Transparency if there were no other errors with
|
| // the connection.
|
| @@ -1247,15 +1234,28 @@ void SSLClientSocketOpenSSL::VerifyCT() {
|
| // Note that this is a completely synchronous operation: The CT Log Verifier
|
| // gets all the data it needs for SCT verification and does not do any
|
| // external communication.
|
| - int result = cert_transparency_verifier_->Verify(
|
| - server_cert_verify_result_.verified_cert.get(),
|
| - ocsp_response, sct_list, &ct_verify_result_, net_log_);
|
| -
|
| - VLOG(1) << "CT Verification complete: result " << result
|
| - << " Invalid scts: " << ct_verify_result_.invalid_scts.size()
|
| - << " Verified scts: " << ct_verify_result_.verified_scts.size()
|
| - << " scts from unknown logs: "
|
| - << ct_verify_result_.unknown_logs_scts.size();
|
| + cert_transparency_verifier_->Verify(
|
| + server_cert_verify_result_.verified_cert.get(), ocsp_response, sct_list,
|
| + &ct_verify_result_, net_log_);
|
| +
|
| + if (!policy_enforcer_) {
|
| + server_cert_verify_result_.cert_status &= ~CERT_STATUS_IS_EV;
|
| + } else {
|
| + if (server_cert_verify_result_.cert_status & CERT_STATUS_IS_EV) {
|
| + scoped_refptr<ct::EVCertsWhitelist> ev_whitelist =
|
| + SSLConfigService::GetEVCertsWhitelist();
|
| + if (!policy_enforcer_->DoesConformToCTEVPolicy(
|
| + server_cert_verify_result_.verified_cert.get(),
|
| + ev_whitelist.get(), ct_verify_result_)) {
|
| + // TODO(eranm): Log via the BoundNetLog, see crbug.com/437766
|
| + VLOG(1) << "EV certificate for "
|
| + << server_cert_verify_result_.verified_cert->subject()
|
| + .GetDisplayName()
|
| + << " does not conform to CT policy, removing EV status.";
|
| + server_cert_verify_result_.cert_status &= ~CERT_STATUS_IS_EV;
|
| + }
|
| + }
|
| + }
|
| }
|
|
|
| void SSLClientSocketOpenSSL::OnHandshakeIOComplete(int result) {
|
|
|