| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "net/ssl/ssl_config_service.h" | 5 #include "net/ssl/ssl_config_service.h" |
| 6 | 6 |
| 7 #include "base/lazy_instance.h" | 7 #include "base/lazy_instance.h" |
| 8 #include "base/memory/ref_counted.h" | 8 #include "base/memory/ref_counted.h" |
| 9 #include "base/synchronization/lock.h" | 9 #include "base/synchronization/lock.h" |
| 10 #include "net/cert/crl_set.h" | 10 #include "net/cert/crl_set.h" |
| (...skipping 22 matching lines...) Expand all Loading... |
| 33 | 33 |
| 34 SSLConfig::CertAndStatus::~CertAndStatus() {} | 34 SSLConfig::CertAndStatus::~CertAndStatus() {} |
| 35 | 35 |
| 36 SSLConfig::SSLConfig() | 36 SSLConfig::SSLConfig() |
| 37 : rev_checking_enabled(false), | 37 : rev_checking_enabled(false), |
| 38 version_min(g_default_version_min), | 38 version_min(g_default_version_min), |
| 39 version_max(g_default_version_max), | 39 version_max(g_default_version_max), |
| 40 cached_info_enabled(false), | 40 cached_info_enabled(false), |
| 41 channel_id_enabled(true), | 41 channel_id_enabled(true), |
| 42 false_start_enabled(true), | 42 false_start_enabled(true), |
| 43 ssl_version_min_preloaded_disabled(false), |
| 43 send_client_cert(false), | 44 send_client_cert(false), |
| 44 verify_ev_cert(false), | 45 verify_ev_cert(false), |
| 45 version_fallback(false), | 46 version_fallback(false), |
| 46 cert_io_enabled(true) { | 47 cert_io_enabled(true) { |
| 47 } | 48 } |
| 48 | 49 |
| 49 SSLConfig::~SSLConfig() { | 50 SSLConfig::~SSLConfig() { |
| 50 } | 51 } |
| 51 | 52 |
| 52 bool SSLConfig::IsAllowedBadCert(X509Certificate* cert, | 53 bool SSLConfig::IsAllowedBadCert(X509Certificate* cert, |
| 53 CertStatus* cert_status) const { | 54 CertStatus* cert_status) const { |
| 54 std::string der_cert; | 55 std::string der_cert; |
| 55 if (!X509Certificate::GetDEREncoded(cert->os_cert_handle(), &der_cert)) | 56 if (!X509Certificate::GetDEREncoded(cert->os_cert_handle(), &der_cert)) |
| 56 return false; | 57 return false; |
| 57 return IsAllowedBadCert(der_cert, cert_status); | 58 return IsAllowedBadCert(der_cert, cert_status); |
| 58 } | 59 } |
| 59 | 60 |
| 60 bool SSLConfig::IsAllowedBadCert(const base::StringPiece& der_cert, | 61 bool SSLConfig::IsAllowedBadCert(const base::StringPiece& der_cert, |
| 61 CertStatus* cert_status) const { | 62 CertStatus* cert_status) const { |
| 62 for (size_t i = 0; i < allowed_bad_certs.size(); ++i) { | 63 for (size_t i = 0; i < allowed_bad_certs.size(); ++i) { |
| 63 if (der_cert == allowed_bad_certs[i].der_cert) { | 64 if (der_cert == allowed_bad_certs[i].der_cert) { |
| 64 if (cert_status) | 65 if (cert_status) |
| 65 *cert_status = allowed_bad_certs[i].cert_status; | 66 *cert_status = allowed_bad_certs[i].cert_status; |
| 66 return true; | 67 return true; |
| 67 } | 68 } |
| 68 } | 69 } |
| 69 return false; | 70 return false; |
| 70 } | 71 } |
| 71 | 72 |
| 73 // static |
| 74 std::string SSLConfig::SSLProtocolVersionToString(uint16 version) { |
| 75 switch (version) { |
| 76 case net::SSL_PROTOCOL_VERSION_SSL3: |
| 77 return "ssl3"; |
| 78 case net::SSL_PROTOCOL_VERSION_TLS1: |
| 79 return "tls1"; |
| 80 case net::SSL_PROTOCOL_VERSION_TLS1_1: |
| 81 return "tls1.1"; |
| 82 case net::SSL_PROTOCOL_VERSION_TLS1_2: |
| 83 return "tls1.2"; |
| 84 default: |
| 85 NOTREACHED(); |
| 86 return std::string(); |
| 87 } |
| 88 } |
| 89 |
| 90 // static |
| 91 uint16 SSLConfig::SSLProtocolVersionFromString(const std::string& version_str) { |
| 92 uint16 version = 0; // Invalid. |
| 93 if (version_str == "ssl3") { |
| 94 version = net::SSL_PROTOCOL_VERSION_SSL3; |
| 95 } else if (version_str == "tls1") { |
| 96 version = net::SSL_PROTOCOL_VERSION_TLS1; |
| 97 } else if (version_str == "tls1.1") { |
| 98 version = net::SSL_PROTOCOL_VERSION_TLS1_1; |
| 99 } else if (version_str == "tls1.2") { |
| 100 version = net::SSL_PROTOCOL_VERSION_TLS1_2; |
| 101 } |
| 102 return version; |
| 103 } |
| 104 |
| 72 SSLConfigService::SSLConfigService() | 105 SSLConfigService::SSLConfigService() |
| 73 : observer_list_(ObserverList<Observer>::NOTIFY_EXISTING_ONLY) { | 106 : observer_list_(ObserverList<Observer>::NOTIFY_EXISTING_ONLY) { |
| 74 } | 107 } |
| 75 | 108 |
| 76 static bool g_cached_info_enabled = false; | 109 static bool g_cached_info_enabled = false; |
| 77 | 110 |
| 78 // GlobalCRLSet holds a reference to the global CRLSet. It simply wraps a lock | 111 // GlobalCRLSet holds a reference to the global CRLSet. It simply wraps a lock |
| 79 // around a scoped_refptr so that getting a reference doesn't race with | 112 // around a scoped_refptr so that getting a reference doesn't race with |
| 80 // updating the CRLSet. | 113 // updating the CRLSet. |
| 81 class GlobalCRLSet { | 114 class GlobalCRLSet { |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 147 ssl_config->cached_info_enabled = g_cached_info_enabled; | 180 ssl_config->cached_info_enabled = g_cached_info_enabled; |
| 148 } | 181 } |
| 149 | 182 |
| 150 void SSLConfigService::ProcessConfigUpdate(const SSLConfig& orig_config, | 183 void SSLConfigService::ProcessConfigUpdate(const SSLConfig& orig_config, |
| 151 const SSLConfig& new_config) { | 184 const SSLConfig& new_config) { |
| 152 bool config_changed = | 185 bool config_changed = |
| 153 (orig_config.rev_checking_enabled != new_config.rev_checking_enabled) || | 186 (orig_config.rev_checking_enabled != new_config.rev_checking_enabled) || |
| 154 (orig_config.version_min != new_config.version_min) || | 187 (orig_config.version_min != new_config.version_min) || |
| 155 (orig_config.version_max != new_config.version_max) || | 188 (orig_config.version_max != new_config.version_max) || |
| 156 (orig_config.disabled_cipher_suites != | 189 (orig_config.disabled_cipher_suites != |
| 157 new_config.disabled_cipher_suites) || | 190 new_config.disabled_cipher_suites) || |
| 158 (orig_config.channel_id_enabled != new_config.channel_id_enabled) || | 191 (orig_config.channel_id_enabled != new_config.channel_id_enabled) || |
| 192 (orig_config.ssl_version_min_preloaded_disabled != |
| 193 new_config.ssl_version_min_preloaded_disabled) || |
| 159 (orig_config.false_start_enabled != new_config.false_start_enabled); | 194 (orig_config.false_start_enabled != new_config.false_start_enabled); |
| 160 | 195 |
| 161 if (config_changed) | 196 if (config_changed) |
| 162 NotifySSLConfigChange(); | 197 NotifySSLConfigChange(); |
| 163 } | 198 } |
| 164 | 199 |
| 165 // static | 200 // static |
| 166 bool SSLConfigService::IsSNIAvailable(SSLConfigService* service) { | 201 bool SSLConfigService::IsSNIAvailable(SSLConfigService* service) { |
| 167 if (!service) | 202 if (!service) |
| 168 return false; | 203 return false; |
| 169 | 204 |
| 170 SSLConfig ssl_config; | 205 SSLConfig ssl_config; |
| 171 service->GetSSLConfig(&ssl_config); | 206 service->GetSSLConfig(&ssl_config); |
| 172 return ssl_config.version_max >= SSL_PROTOCOL_VERSION_TLS1; | 207 return ssl_config.version_max >= SSL_PROTOCOL_VERSION_TLS1; |
| 173 } | 208 } |
| 174 | 209 |
| 175 } // namespace net | 210 } // namespace net |
| OLD | NEW |