blob: 5cfb59643cbc9912178cc78f3cecd1cae2a286e8 [file] [log] [blame]
[email protected]013c17c2012-01-21 19:09:011// Copyright (c) 2012 The Chromium Authors. All rights reserved.
[email protected]d518cd92010-09-29 12:27:442// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
svaldeze83af292016-04-26 14:33:375#include "net/socket/ssl_client_socket_impl.h"
[email protected]d518cd92010-09-29 12:27:446
[email protected]edfd0f42014-07-22 18:20:377#include <errno.h>
bnc67da3de2015-01-15 21:02:268#include <string.h>
[email protected]d518cd92010-09-29 12:27:449
mabb51c5142016-12-07 09:32:4010#include <algorithm>
davidben752bcf22015-12-21 22:55:5011#include <utility>
12
[email protected]0f7804ec2011-10-07 20:04:1813#include "base/bind.h"
[email protected]f2da6ac2013-02-04 08:22:5314#include "base/callback_helpers.h"
davidbend406cdb2016-11-17 08:31:0515#include "base/feature_list.h"
davidben1d489522015-07-01 18:48:4616#include "base/lazy_instance.h"
Avi Drissman13fc8932015-12-20 04:40:4617#include "base/macros.h"
[email protected]3b63f8f42011-03-28 01:54:1518#include "base/memory/singleton.h"
mmenke1beda3d2016-07-22 03:33:4519#include "base/metrics/field_trial.h"
asvitkinec3c93722015-06-17 14:48:3720#include "base/metrics/histogram_macros.h"
davidben4fe4f982015-11-11 22:00:1221#include "base/metrics/sparse_histogram.h"
vadimtb2a77c762014-11-21 19:49:2222#include "base/profiler/scoped_tracker.h"
nharper49b27d992016-02-09 18:28:5123#include "base/strings/string_number_conversions.h"
davidben018aad62014-09-12 02:25:1924#include "base/strings/string_piece.h"
xunjieli9f8c5fb52016-12-07 22:59:3325#include "base/strings/stringprintf.h"
[email protected]20305ec2011-01-21 04:55:5226#include "base/synchronization/lock.h"
vadimt6b43dec22015-01-06 01:59:5827#include "base/threading/thread_local.h"
xunjieli9f8c5fb52016-12-07 22:59:3328#include "base/trace_event/process_memory_dump.h"
ssid6d6b40102016-04-05 18:59:5629#include "base/trace_event/trace_event.h"
estade5e5529d2015-05-21 20:59:1130#include "base/values.h"
[email protected]ee0f2aa82013-10-25 11:59:2631#include "crypto/ec_private_key.h"
[email protected]4b559b4d2011-04-14 17:37:1432#include "crypto/openssl_util.h"
martijna2e83bd2016-03-18 13:10:4533#include "net/base/ip_address.h"
[email protected]d518cd92010-09-29 12:27:4434#include "net/base/net_errors.h"
xunjieli0b7f5b62016-12-06 20:43:4835#include "net/base/trace_constants.h"
[email protected]6e7845ae2013-03-29 21:48:1136#include "net/cert/cert_verifier.h"
eranmefbd3132014-10-28 16:35:1637#include "net/cert/ct_ev_whitelist.h"
estark6f9b3d82016-01-12 21:37:0538#include "net/cert/ct_policy_enforcer.h"
estark723b5eeb2016-02-18 21:01:1239#include "net/cert/ct_policy_status.h"
davidbeneb5f8ef32014-09-04 14:14:3240#include "net/cert/ct_verifier.h"
[email protected]6e7845ae2013-03-29 21:48:1141#include "net/cert/x509_certificate_net_log_param.h"
mattm316af822017-02-23 04:05:5642#include "net/cert/x509_util.h"
davidben30798ed82014-09-19 19:28:2043#include "net/cert/x509_util_openssl.h"
[email protected]8bd4e7a2014-08-09 14:49:1744#include "net/http/transport_security_state.h"
mikecironef22f9812016-10-04 03:40:1945#include "net/log/net_log.h"
mikecirone8b85c432016-09-08 19:11:0046#include "net/log/net_log_event_type.h"
mikecironef22f9812016-10-04 03:40:1947#include "net/log/net_log_parameters_callback.h"
[email protected]536fd0b2013-03-14 17:41:5748#include "net/ssl/ssl_cert_request_info.h"
davidben281d13f02016-04-27 20:43:2849#include "net/ssl/ssl_cipher_suite_names.h"
svaldeze83af292016-04-26 14:33:3750#include "net/ssl/ssl_client_session_cache.h"
[email protected]536fd0b2013-03-14 17:41:5751#include "net/ssl/ssl_connection_status_flags.h"
52#include "net/ssl/ssl_info.h"
davidben1d489522015-07-01 18:48:4653#include "net/ssl/ssl_private_key.h"
nharperd5cddca2016-02-27 03:37:5254#include "net/ssl/token_binding.h"
tfarinae8cb8aa2016-10-21 02:44:0155#include "third_party/boringssl/src/include/openssl/bio.h"
56#include "third_party/boringssl/src/include/openssl/bytestring.h"
57#include "third_party/boringssl/src/include/openssl/err.h"
58#include "third_party/boringssl/src/include/openssl/evp.h"
59#include "third_party/boringssl/src/include/openssl/mem.h"
60#include "third_party/boringssl/src/include/openssl/ssl.h"
[email protected]d518cd92010-09-29 12:27:4461
davidben2a811e4e2015-12-01 10:49:3462#if !defined(OS_NACL)
63#include "net/ssl/ssl_key_logger.h"
64#endif
65
svaldez2135be52016-04-20 16:34:5366#if defined(USE_NSS_CERTS)
davidbena477a70a2015-10-06 04:38:2967#include "net/cert_net/nss_ocsp.h"
68#endif
69
[email protected]d518cd92010-09-29 12:27:4470namespace net {
71
72namespace {
73
[email protected]4b768562013-02-16 04:10:0774// This constant can be any non-negative/non-zero value (eg: it does not
75// overlap with any value of the net::Error range, including net::OK).
davidben1d489522015-07-01 18:48:4676const int kNoPendingResult = 1;
[email protected]4b768562013-02-16 04:10:0777
haavardm2d92e722014-12-19 13:45:4478// Default size of the internal BoringSSL buffers.
mmenke1beda3d2016-07-22 03:33:4579const int kDefaultOpenSSLBufferSize = 17 * 1024;
haavardm2d92e722014-12-19 13:45:4480
nharper736ceda2015-11-07 00:16:5981// TLS extension number use for Token Binding.
nharperb5ad8a802016-02-05 19:40:0082const unsigned int kTbExtNum = 24;
nharper736ceda2015-11-07 00:16:5983
84// Token Binding ProtocolVersions supported.
85const uint8_t kTbProtocolVersionMajor = 0;
nharper96d085c2017-02-22 20:10:2186const uint8_t kTbProtocolVersionMinor = 13;
nharper736ceda2015-11-07 00:16:5987const uint8_t kTbMinProtocolVersionMajor = 0;
nharper78e6d2b2016-09-21 05:42:3588const uint8_t kTbMinProtocolVersionMinor = 10;
nharper736ceda2015-11-07 00:16:5989
davidben1d489522015-07-01 18:48:4690bool EVP_MDToPrivateKeyHash(const EVP_MD* md, SSLPrivateKey::Hash* hash) {
91 switch (EVP_MD_type(md)) {
92 case NID_md5_sha1:
93 *hash = SSLPrivateKey::Hash::MD5_SHA1;
94 return true;
95 case NID_sha1:
96 *hash = SSLPrivateKey::Hash::SHA1;
97 return true;
98 case NID_sha256:
99 *hash = SSLPrivateKey::Hash::SHA256;
100 return true;
101 case NID_sha384:
102 *hash = SSLPrivateKey::Hash::SHA384;
103 return true;
104 case NID_sha512:
105 *hash = SSLPrivateKey::Hash::SHA512;
106 return true;
107 default:
108 return false;
109 }
110}
111
danakj655b66c2016-04-16 00:51:38112std::unique_ptr<base::Value> NetLogPrivateKeyOperationCallback(
davidben752bcf22015-12-21 22:55:50113 SSLPrivateKey::Type type,
114 SSLPrivateKey::Hash hash,
115 NetLogCaptureMode mode) {
116 std::string type_str;
117 switch (type) {
118 case SSLPrivateKey::Type::RSA:
119 type_str = "RSA";
120 break;
davidben1c09a432016-10-13 19:17:34121 case SSLPrivateKey::Type::ECDSA_P256:
122 type_str = "ECDSA_P256";
123 break;
124 case SSLPrivateKey::Type::ECDSA_P384:
125 type_str = "ECDSA_P384";
126 break;
127 case SSLPrivateKey::Type::ECDSA_P521:
128 type_str = "ECDSA_P521";
davidben752bcf22015-12-21 22:55:50129 break;
130 }
131
132 std::string hash_str;
133 switch (hash) {
134 case SSLPrivateKey::Hash::MD5_SHA1:
135 hash_str = "MD5_SHA1";
136 break;
137 case SSLPrivateKey::Hash::SHA1:
138 hash_str = "SHA1";
139 break;
140 case SSLPrivateKey::Hash::SHA256:
141 hash_str = "SHA256";
142 break;
143 case SSLPrivateKey::Hash::SHA384:
144 hash_str = "SHA384";
145 break;
146 case SSLPrivateKey::Hash::SHA512:
147 hash_str = "SHA512";
148 break;
149 }
150
danakj655b66c2016-04-16 00:51:38151 std::unique_ptr<base::DictionaryValue> value(new base::DictionaryValue);
davidben752bcf22015-12-21 22:55:50152 value->SetString("type", type_str);
153 value->SetString("hash", hash_str);
154 return std::move(value);
155}
156
danakj655b66c2016-04-16 00:51:38157std::unique_ptr<base::Value> NetLogChannelIDLookupCallback(
nharper49b27d992016-02-09 18:28:51158 ChannelIDService* channel_id_service,
159 NetLogCaptureMode capture_mode) {
160 ChannelIDStore* store = channel_id_service->GetChannelIDStore();
danakj655b66c2016-04-16 00:51:38161 std::unique_ptr<base::DictionaryValue> dict(new base::DictionaryValue());
nharper49b27d992016-02-09 18:28:51162 dict->SetBoolean("ephemeral", store->IsEphemeral());
163 dict->SetString("service", base::HexEncode(&channel_id_service,
164 sizeof(channel_id_service)));
165 dict->SetString("store", base::HexEncode(&store, sizeof(store)));
166 return std::move(dict);
167}
168
danakj655b66c2016-04-16 00:51:38169std::unique_ptr<base::Value> NetLogChannelIDLookupCompleteCallback(
nharper49b27d992016-02-09 18:28:51170 crypto::ECPrivateKey* key,
171 int result,
172 NetLogCaptureMode capture_mode) {
danakj655b66c2016-04-16 00:51:38173 std::unique_ptr<base::DictionaryValue> dict(new base::DictionaryValue());
nharper49b27d992016-02-09 18:28:51174 dict->SetInteger("net_error", result);
175 std::string raw_key;
176 if (result == OK && key && key->ExportRawPublicKey(&raw_key)) {
nharper837b2af2016-12-21 21:48:36177 std::string key_to_log = base::HexEncode(raw_key.data(), raw_key.length());
nharper49b27d992016-02-09 18:28:51178 dict->SetString("key", key_to_log);
179 }
180 return std::move(dict);
181}
182
davidben281d13f02016-04-27 20:43:28183std::unique_ptr<base::Value> NetLogSSLInfoCallback(
184 SSLClientSocketImpl* socket,
185 NetLogCaptureMode capture_mode) {
186 SSLInfo ssl_info;
187 if (!socket->GetSSLInfo(&ssl_info))
188 return nullptr;
189
190 std::unique_ptr<base::DictionaryValue> dict(new base::DictionaryValue());
191 const char* version_str;
192 SSLVersionToString(&version_str,
193 SSLConnectionStatusToVersion(ssl_info.connection_status));
194 dict->SetString("version", version_str);
195 dict->SetBoolean("is_resumed",
196 ssl_info.handshake_type == SSLInfo::HANDSHAKE_RESUME);
197 dict->SetInteger("cipher_suite", SSLConnectionStatusToCipherSuite(
198 ssl_info.connection_status));
199
bnc3472afd2016-11-17 15:27:21200 dict->SetString("next_proto",
201 NextProtoToString(socket->GetNegotiatedProtocol()));
davidben281d13f02016-04-27 20:43:28202
203 return std::move(dict);
204}
205
davidben3418e81f2016-10-19 00:09:45206int GetBufferSize(const char* field_trial) {
207 // Get buffer sizes from field trials, if possible. If values not present,
208 // use default. Also make sure values are in reasonable range.
209 int buffer_size = kDefaultOpenSSLBufferSize;
210#if !defined(OS_NACL)
211 int override_buffer_size;
212 if (base::StringToInt(base::FieldTrialList::FindFullName(field_trial),
213 &override_buffer_size)) {
214 buffer_size = override_buffer_size;
215 buffer_size = std::max(buffer_size, 1000);
216 buffer_size = std::min(buffer_size, 2 * kDefaultOpenSSLBufferSize);
217 }
218#endif // !defined(OS_NACL)
219 return buffer_size;
220}
221
davidbend406cdb2016-11-17 08:31:05222#if defined(OS_NACL)
223bool AreLegacyECDSACiphersEnabled() {
224 return false;
225}
226#else
227// TODO(davidben): Remove this after the ECDSA CBC removal sticks.
228// https:/crbug.com/666191.
229const base::Feature kLegacyECDSACiphersFeature{
230 "SSLLegacyECDSACiphers", base::FEATURE_DISABLED_BY_DEFAULT};
231
232bool AreLegacyECDSACiphersEnabled() {
233 return base::FeatureList::IsEnabled(kLegacyECDSACiphersFeature);
234}
235#endif
236
svaldez2668d82b2017-01-06 17:42:29237const base::Feature kShortRecordHeaderFeature{
238 "SSLShortRecordHeader", base::FEATURE_DISABLED_BY_DEFAULT};
239
davidbenc7e06c92017-03-07 18:54:11240scoped_refptr<X509Certificate> OSChainFromOpenSSL(STACK_OF(X509) *
241 openssl_chain) {
242 if (sk_X509_num(openssl_chain) == 0) {
243 NOTREACHED();
244 return nullptr;
245 }
246
247#if defined(USE_OPENSSL_CERTS)
248 // When OSCertHandle is typedef'ed to X509, this implementation does a short
249 // cut to avoid converting back and forth between DER and the X509 struct.
250 X509Certificate::OSCertHandles intermediates;
251 for (size_t i = 1; i < sk_X509_num(openssl_chain); ++i) {
252 X509* cert = sk_X509_value(openssl_chain, i);
253 DCHECK(cert->buf);
254 intermediates.push_back(cert);
255 }
256
257 X509* leaf = sk_X509_value(openssl_chain, 0);
258 DCHECK(leaf->buf);
259 return X509Certificate::CreateFromHandle(leaf, intermediates);
260#else
261 // Convert the certificate chains to a platform certificate handle.
262 std::vector<base::StringPiece> der_chain;
263 der_chain.reserve(sk_X509_num(openssl_chain));
264 for (size_t i = 0; i < sk_X509_num(openssl_chain); ++i) {
265 X509* cert = sk_X509_value(openssl_chain, i);
266 DCHECK(cert->buf);
267 base::StringPiece der;
268 if (!x509_util::GetDER(cert, &der))
269 return nullptr;
270 der_chain.push_back(der);
271 }
272 return X509Certificate::CreateFromDERCertChain(der_chain);
273#endif
274}
275
[email protected]821e3bb2013-11-08 01:06:01276} // namespace
277
svaldeze83af292016-04-26 14:33:37278class SSLClientSocketImpl::SSLContext {
[email protected]fbef13932010-11-23 12:38:53279 public:
olli.raula36aa8be2015-09-10 11:14:22280 static SSLContext* GetInstance() {
fdoray33e7c3c52017-01-19 18:37:23281 return base::Singleton<SSLContext,
282 base::LeakySingletonTraits<SSLContext>>::get();
olli.raula36aa8be2015-09-10 11:14:22283 }
[email protected]fbef13932010-11-23 12:38:53284 SSL_CTX* ssl_ctx() { return ssl_ctx_.get(); }
svaldeze83af292016-04-26 14:33:37285 SSLClientSessionCache* session_cache() { return &session_cache_; }
[email protected]fbef13932010-11-23 12:38:53286
svaldeze83af292016-04-26 14:33:37287 SSLClientSocketImpl* GetClientSocketFromSSL(const SSL* ssl) {
[email protected]fbef13932010-11-23 12:38:53288 DCHECK(ssl);
svaldeze83af292016-04-26 14:33:37289 SSLClientSocketImpl* socket = static_cast<SSLClientSocketImpl*>(
[email protected]fbef13932010-11-23 12:38:53290 SSL_get_ex_data(ssl, ssl_socket_data_index_));
291 DCHECK(socket);
292 return socket;
293 }
294
svaldeze83af292016-04-26 14:33:37295 bool SetClientSocketForSSL(SSL* ssl, SSLClientSocketImpl* socket) {
[email protected]fbef13932010-11-23 12:38:53296 return SSL_set_ex_data(ssl, ssl_socket_data_index_, socket) != 0;
297 }
298
davidben2a811e4e2015-12-01 10:49:34299#if !defined(OS_NACL)
300 void SetSSLKeyLogFile(
301 const base::FilePath& path,
302 const scoped_refptr<base::SequencedTaskRunner>& task_runner) {
303 DCHECK(!ssl_key_logger_);
304 ssl_key_logger_.reset(new SSLKeyLogger(path, task_runner));
305 SSL_CTX_set_keylog_callback(ssl_ctx_.get(), KeyLogCallback);
306 }
307#endif
308
davidben1d489522015-07-01 18:48:46309 static const SSL_PRIVATE_KEY_METHOD kPrivateKeyMethod;
310
[email protected]fbef13932010-11-23 12:38:53311 private:
olli.raula36aa8be2015-09-10 11:14:22312 friend struct base::DefaultSingletonTraits<SSLContext>;
[email protected]fbef13932010-11-23 12:38:53313
svaldeze83af292016-04-26 14:33:37314 SSLContext() : session_cache_(SSLClientSessionCache::Config()) {
[email protected]4b559b4d2011-04-14 17:37:14315 crypto::EnsureOpenSSLInit();
[email protected]fbef13932010-11-23 12:38:53316 ssl_socket_data_index_ = SSL_get_ex_new_index(0, 0, 0, 0, 0);
317 DCHECK_NE(ssl_socket_data_index_, -1);
318 ssl_ctx_.reset(SSL_CTX_new(SSLv23_client_method()));
[email protected]b051cdb62014-02-28 02:20:16319 SSL_CTX_set_cert_verify_callback(ssl_ctx_.get(), CertVerifyCallback, NULL);
[email protected]82c59022014-08-15 09:38:27320 SSL_CTX_set_cert_cb(ssl_ctx_.get(), ClientCertRequestCallback, NULL);
[email protected]b051cdb62014-02-28 02:20:16321 SSL_CTX_set_verify(ssl_ctx_.get(), SSL_VERIFY_PEER, NULL);
davidbendafe4e52015-04-08 22:53:52322
323 // Disable the internal session cache. Session caching is handled
svaldeze83af292016-04-26 14:33:37324 // externally (i.e. by SSLClientSessionCache).
davidbendafe4e52015-04-08 22:53:52325 SSL_CTX_set_session_cache_mode(
326 ssl_ctx_.get(), SSL_SESS_CACHE_CLIENT | SSL_SESS_CACHE_NO_INTERNAL);
davidben44aeae62015-06-24 20:47:43327 SSL_CTX_sess_set_new_cb(ssl_ctx_.get(), NewSessionCallback);
davidben99ce6302016-11-09 17:30:28328 SSL_CTX_set_timeout(ssl_ctx_.get(), 1 * 60 * 60 /* one hour */);
nharper736ceda2015-11-07 00:16:59329
davidbenfacfac7b2016-09-27 22:39:53330 SSL_CTX_set_grease_enabled(ssl_ctx_.get(), 1);
331
davidbenbf0fcf12017-02-10 21:00:34332 // Deduplicate all certificates minted from the SSL_CTX in memory.
333 SSL_CTX_set0_buffer_pool(ssl_ctx_.get(), x509_util::GetBufferPool());
334
svaldez2668d82b2017-01-06 17:42:29335 if (base::FeatureList::IsEnabled(kShortRecordHeaderFeature)) {
336 SSL_CTX_set_short_header_enabled(ssl_ctx_.get(), 1);
337 }
338
nharper736ceda2015-11-07 00:16:59339 if (!SSL_CTX_add_client_custom_ext(ssl_ctx_.get(), kTbExtNum,
340 &TokenBindingAddCallback,
341 &TokenBindingFreeCallback, nullptr,
342 &TokenBindingParseCallback, nullptr)) {
343 NOTREACHED();
344 }
345 }
346
347 static int TokenBindingAddCallback(SSL* ssl,
348 unsigned int extension_value,
349 const uint8_t** out,
350 size_t* out_len,
351 int* out_alert_value,
352 void* add_arg) {
353 DCHECK_EQ(extension_value, kTbExtNum);
svaldeze83af292016-04-26 14:33:37354 SSLClientSocketImpl* socket =
355 SSLClientSocketImpl::SSLContext::GetInstance()->GetClientSocketFromSSL(
356 ssl);
nharper736ceda2015-11-07 00:16:59357 return socket->TokenBindingAdd(out, out_len, out_alert_value);
358 }
359
360 static void TokenBindingFreeCallback(SSL* ssl,
361 unsigned extension_value,
362 const uint8_t* out,
363 void* add_arg) {
364 DCHECK_EQ(extension_value, kTbExtNum);
365 OPENSSL_free(const_cast<unsigned char*>(out));
366 }
367
368 static int TokenBindingParseCallback(SSL* ssl,
369 unsigned int extension_value,
370 const uint8_t* contents,
371 size_t contents_len,
372 int* out_alert_value,
373 void* parse_arg) {
374 DCHECK_EQ(extension_value, kTbExtNum);
svaldeze83af292016-04-26 14:33:37375 SSLClientSocketImpl* socket =
376 SSLClientSocketImpl::SSLContext::GetInstance()->GetClientSocketFromSSL(
377 ssl);
nharper736ceda2015-11-07 00:16:59378 return socket->TokenBindingParse(contents, contents_len, out_alert_value);
[email protected]fbef13932010-11-23 12:38:53379 }
380
[email protected]82c59022014-08-15 09:38:27381 static int ClientCertRequestCallback(SSL* ssl, void* arg) {
svaldeze83af292016-04-26 14:33:37382 SSLClientSocketImpl* socket = GetInstance()->GetClientSocketFromSSL(ssl);
[email protected]82c59022014-08-15 09:38:27383 DCHECK(socket);
384 return socket->ClientCertRequestCallback(ssl);
[email protected]718c9672010-12-02 10:04:10385 }
386
svaldeze83af292016-04-26 14:33:37387 static int CertVerifyCallback(X509_STORE_CTX* store_ctx, void* arg) {
[email protected]b051cdb62014-02-28 02:20:16388 SSL* ssl = reinterpret_cast<SSL*>(X509_STORE_CTX_get_ex_data(
389 store_ctx, SSL_get_ex_data_X509_STORE_CTX_idx()));
svaldeze83af292016-04-26 14:33:37390 SSLClientSocketImpl* socket = GetInstance()->GetClientSocketFromSSL(ssl);
[email protected]b051cdb62014-02-28 02:20:16391 CHECK(socket);
392
393 return socket->CertVerifyCallback(store_ctx);
394 }
395
davidben44aeae62015-06-24 20:47:43396 static int NewSessionCallback(SSL* ssl, SSL_SESSION* session) {
svaldeze83af292016-04-26 14:33:37397 SSLClientSocketImpl* socket = GetInstance()->GetClientSocketFromSSL(ssl);
davidben44aeae62015-06-24 20:47:43398 return socket->NewSessionCallback(session);
davidbendafe4e52015-04-08 22:53:52399 }
400
davidben1d489522015-07-01 18:48:46401 static int PrivateKeyTypeCallback(SSL* ssl) {
svaldeze83af292016-04-26 14:33:37402 SSLClientSocketImpl* socket = GetInstance()->GetClientSocketFromSSL(ssl);
davidben1d489522015-07-01 18:48:46403 return socket->PrivateKeyTypeCallback();
404 }
405
davidben1d489522015-07-01 18:48:46406 static size_t PrivateKeyMaxSignatureLenCallback(SSL* ssl) {
svaldeze83af292016-04-26 14:33:37407 SSLClientSocketImpl* socket = GetInstance()->GetClientSocketFromSSL(ssl);
davidben1d489522015-07-01 18:48:46408 return socket->PrivateKeyMaxSignatureLenCallback();
409 }
410
davidben0bca07fd2016-07-18 15:12:03411 static ssl_private_key_result_t PrivateKeySignDigestCallback(
davidben1d489522015-07-01 18:48:46412 SSL* ssl,
413 uint8_t* out,
414 size_t* out_len,
davidben0bca07fd2016-07-18 15:12:03415 size_t max_out,
416 const EVP_MD* md,
417 const uint8_t* in,
418 size_t in_len) {
svaldeze83af292016-04-26 14:33:37419 SSLClientSocketImpl* socket = GetInstance()->GetClientSocketFromSSL(ssl);
davidben0bca07fd2016-07-18 15:12:03420 return socket->PrivateKeySignDigestCallback(out, out_len, max_out, md, in,
421 in_len);
422 }
423
424 static ssl_private_key_result_t PrivateKeyCompleteCallback(SSL* ssl,
425 uint8_t* out,
426 size_t* out_len,
427 size_t max_out) {
428 SSLClientSocketImpl* socket = GetInstance()->GetClientSocketFromSSL(ssl);
429 return socket->PrivateKeyCompleteCallback(out, out_len, max_out);
davidben1d489522015-07-01 18:48:46430 }
431
davidben2a811e4e2015-12-01 10:49:34432#if !defined(OS_NACL)
433 static void KeyLogCallback(const SSL* ssl, const char* line) {
434 GetInstance()->ssl_key_logger_->WriteLine(line);
435 }
436#endif
437
[email protected]fbef13932010-11-23 12:38:53438 // This is the index used with SSL_get_ex_data to retrieve the owner
svaldeze83af292016-04-26 14:33:37439 // SSLClientSocketImpl object from an SSL instance.
[email protected]fbef13932010-11-23 12:38:53440 int ssl_socket_data_index_;
441
davidbend80c12c2016-10-11 00:13:49442 bssl::UniquePtr<SSL_CTX> ssl_ctx_;
davidbendafe4e52015-04-08 22:53:52443
davidben2a811e4e2015-12-01 10:49:34444#if !defined(OS_NACL)
danakj655b66c2016-04-16 00:51:38445 std::unique_ptr<SSLKeyLogger> ssl_key_logger_;
davidben2a811e4e2015-12-01 10:49:34446#endif
447
davidbendafe4e52015-04-08 22:53:52448 // TODO(davidben): Use a separate cache per URLRequestContext.
449 // https://crbug.com/458365
450 //
451 // TODO(davidben): Sessions should be invalidated on fatal
452 // alerts. https://crbug.com/466352
svaldeze83af292016-04-26 14:33:37453 SSLClientSessionCache session_cache_;
[email protected]1279de12013-12-03 15:13:32454};
455
davidben0bca07fd2016-07-18 15:12:03456// TODO(davidben): Switch from sign_digest to sign.
davidben1d489522015-07-01 18:48:46457const SSL_PRIVATE_KEY_METHOD
svaldeze83af292016-04-26 14:33:37458 SSLClientSocketImpl::SSLContext::kPrivateKeyMethod = {
459 &SSLClientSocketImpl::SSLContext::PrivateKeyTypeCallback,
460 &SSLClientSocketImpl::SSLContext::PrivateKeyMaxSignatureLenCallback,
davidben0bca07fd2016-07-18 15:12:03461 nullptr /* sign */,
462 &SSLClientSocketImpl::SSLContext::PrivateKeySignDigestCallback,
463 nullptr /* decrypt */,
464 &SSLClientSocketImpl::SSLContext::PrivateKeyCompleteCallback,
davidben1d489522015-07-01 18:48:46465};
466
[email protected]1279de12013-12-03 15:13:32467// static
[email protected]c3456bb2011-12-12 22:22:19468void SSLClientSocket::ClearSessionCache() {
svaldeze83af292016-04-26 14:33:37469 SSLClientSocketImpl::SSLContext* context =
470 SSLClientSocketImpl::SSLContext::GetInstance();
[email protected]c3456bb2011-12-12 22:22:19471 context->session_cache()->Flush();
472}
473
svaldeze83af292016-04-26 14:33:37474SSLClientSocketImpl::SSLClientSocketImpl(
danakj655b66c2016-04-16 00:51:38475 std::unique_ptr<ClientSocketHandle> transport_socket,
[email protected]055d7f22010-11-15 12:03:12476 const HostPortPair& host_and_port,
[email protected]822581d2010-12-16 17:27:15477 const SSLConfig& ssl_config,
[email protected]feb79bcd2011-07-21 16:55:17478 const SSLClientSocketContext& context)
davidben3418e81f2016-10-19 00:09:45479 : pending_read_error_(kNoPendingResult),
davidbenb8c23212014-10-28 00:12:16480 pending_read_ssl_error_(SSL_ERROR_NONE),
[email protected]64b5c892014-08-08 09:39:26481 completed_connect_(false),
[email protected]0dc88b32014-03-26 20:12:28482 was_ever_used_(false),
[email protected]feb79bcd2011-07-21 16:55:17483 cert_verifier_(context.cert_verifier),
davidbeneb5f8ef32014-09-04 14:14:32484 cert_transparency_verifier_(context.cert_transparency_verifier),
[email protected]6b8a3c742014-07-25 00:25:35485 channel_id_service_(context.channel_id_service),
nharper736ceda2015-11-07 00:16:59486 tb_was_negotiated_(false),
487 tb_negotiated_param_(TB_PARAM_ECDSAP256),
nharper78e6d2b2016-09-21 05:42:35488 tb_signature_map_(10),
dchengc7eeda422015-12-26 03:56:48489 transport_(std::move(transport_socket)),
[email protected]055d7f22010-11-15 12:03:12490 host_and_port_(host_and_port),
[email protected]d518cd92010-09-29 12:27:44491 ssl_config_(ssl_config),
[email protected]c3456bb2011-12-12 22:22:19492 ssl_session_cache_shard_(context.ssl_session_cache_shard),
[email protected]013c17c2012-01-21 19:09:01493 next_handshake_state_(STATE_NONE),
svaldez4af14d22015-08-20 13:48:24494 disconnected_(false),
bnc3cf2a592016-08-11 14:48:36495 negotiated_protocol_(kProtoUnknown),
davidben52053b382015-04-27 19:22:29496 channel_id_sent_(false),
davidbendafe4e52015-04-08 22:53:52497 certificate_verified_(false),
davidbenfe132d92016-09-27 18:07:21498 certificate_requested_(false),
davidben1d489522015-07-01 18:48:46499 signature_result_(kNoPendingResult),
[email protected]8bd4e7a2014-08-09 14:49:17500 transport_security_state_(context.transport_security_state),
estark6f9b3d82016-01-12 21:37:05501 policy_enforcer_(context.ct_policy_enforcer),
dadriandf302c42016-06-10 18:48:59502 pkp_bypassed_(false),
kulkarni.acd7b4462014-08-28 07:41:34503 net_log_(transport_->socket()->NetLog()),
504 weak_factory_(this) {
rsleevibe81cd62016-06-24 01:38:59505 CHECK(cert_verifier_);
506 CHECK(transport_security_state_);
507 CHECK(cert_transparency_verifier_);
508 CHECK(policy_enforcer_);
[email protected]8e458552014-08-05 00:02:15509}
[email protected]d518cd92010-09-29 12:27:44510
svaldeze83af292016-04-26 14:33:37511SSLClientSocketImpl::~SSLClientSocketImpl() {
[email protected]d518cd92010-09-29 12:27:44512 Disconnect();
513}
514
davidben2a811e4e2015-12-01 10:49:34515#if !defined(OS_NACL)
svaldeze83af292016-04-26 14:33:37516void SSLClientSocketImpl::SetSSLKeyLogFile(
davidben2a811e4e2015-12-01 10:49:34517 const base::FilePath& ssl_keylog_file,
518 const scoped_refptr<base::SequencedTaskRunner>& task_runner) {
519 SSLContext::GetInstance()->SetSSLKeyLogFile(ssl_keylog_file, task_runner);
zhongyi81f85c6d92015-10-16 19:34:14520}
davidben2a811e4e2015-12-01 10:49:34521#endif
zhongyi81f85c6d92015-10-16 19:34:14522
svaldeze83af292016-04-26 14:33:37523void SSLClientSocketImpl::GetSSLCertRequestInfo(
[email protected]b9b651f2013-11-09 04:32:22524 SSLCertRequestInfo* cert_request_info) {
davidbenb11fd212017-01-12 17:08:03525 if (!ssl_) {
526 NOTREACHED();
527 return;
528 }
529
[email protected]791879c2013-12-17 07:22:41530 cert_request_info->host_and_port = host_and_port_;
davidbenb11fd212017-01-12 17:08:03531
532 cert_request_info->cert_authorities.clear();
533 STACK_OF(X509_NAME)* authorities = SSL_get_client_CA_list(ssl_.get());
534 for (size_t i = 0; i < sk_X509_NAME_num(authorities); i++) {
535 X509_NAME* ca_name = sk_X509_NAME_value(authorities, i);
536 uint8_t* str = nullptr;
537 int length = i2d_X509_NAME(ca_name, &str);
538 if (length > 0) {
539 cert_request_info->cert_authorities.push_back(std::string(
540 reinterpret_cast<const char*>(str), static_cast<size_t>(length)));
541 } else {
542 NOTREACHED(); // Error serializing |ca_name|.
543 }
544 OPENSSL_free(str);
545 }
546
547 cert_request_info->cert_key_types.clear();
548 const uint8_t* client_cert_types;
549 size_t num_client_cert_types =
550 SSL_get0_certificate_types(ssl_.get(), &client_cert_types);
551 for (size_t i = 0; i < num_client_cert_types; i++) {
552 cert_request_info->cert_key_types.push_back(
553 static_cast<SSLClientCertType>(client_cert_types[i]));
554 }
[email protected]b9b651f2013-11-09 04:32:22555}
556
svaldeze83af292016-04-26 14:33:37557ChannelIDService* SSLClientSocketImpl::GetChannelIDService() const {
[email protected]6b8a3c742014-07-25 00:25:35558 return channel_id_service_;
[email protected]b9b651f2013-11-09 04:32:22559}
560
nharper78e6d2b2016-09-21 05:42:35561Error SSLClientSocketImpl::GetTokenBindingSignature(crypto::ECPrivateKey* key,
562 TokenBindingType tb_type,
563 std::vector<uint8_t>* out) {
nharperb7441ef2016-01-25 23:54:14564 // The same key will be used across multiple requests to sign the same value,
565 // so the signature is cached.
566 std::string raw_public_key;
567 if (!key->ExportRawPublicKey(&raw_public_key))
568 return ERR_FAILED;
nharper78e6d2b2016-09-21 05:42:35569 auto it = tb_signature_map_.Get(std::make_pair(tb_type, raw_public_key));
570 if (it != tb_signature_map_.end()) {
nharperb7441ef2016-01-25 23:54:14571 *out = it->second;
572 return OK;
573 }
574
575 uint8_t tb_ekm_buf[32];
576 static const char kTokenBindingExporterLabel[] = "EXPORTER-Token-Binding";
davidbend80c12c2016-10-11 00:13:49577 if (!SSL_export_keying_material(ssl_.get(), tb_ekm_buf, sizeof(tb_ekm_buf),
nharperb7441ef2016-01-25 23:54:14578 kTokenBindingExporterLabel,
579 strlen(kTokenBindingExporterLabel), nullptr,
580 0, false /* no context */)) {
581 return ERR_FAILED;
582 }
583
nharper78e6d2b2016-09-21 05:42:35584 if (!CreateTokenBindingSignature(
nharperd5cddca2016-02-27 03:37:52585 base::StringPiece(reinterpret_cast<char*>(tb_ekm_buf),
586 sizeof(tb_ekm_buf)),
nharper78e6d2b2016-09-21 05:42:35587 tb_type, key, out))
nharperb7441ef2016-01-25 23:54:14588 return ERR_FAILED;
nharperb7441ef2016-01-25 23:54:14589
nharper78e6d2b2016-09-21 05:42:35590 tb_signature_map_.Put(std::make_pair(tb_type, raw_public_key), *out);
nharperb7441ef2016-01-25 23:54:14591 return OK;
592}
593
svaldeze83af292016-04-26 14:33:37594crypto::ECPrivateKey* SSLClientSocketImpl::GetChannelIDKey() const {
nharperb36644f2016-02-22 23:14:43595 return channel_id_key_.get();
596}
597
svaldeze83af292016-04-26 14:33:37598int SSLClientSocketImpl::ExportKeyingMaterial(const base::StringPiece& label,
599 bool has_context,
600 const base::StringPiece& context,
601 unsigned char* out,
602 unsigned int outlen) {
davidben86935f72015-05-06 22:24:49603 if (!IsConnected())
604 return ERR_SOCKET_NOT_CONNECTED;
605
[email protected]b9b651f2013-11-09 04:32:22606 crypto::OpenSSLErrStackTracer err_tracer(FROM_HERE);
607
davidbenf225b262016-09-15 22:09:22608 if (!SSL_export_keying_material(
davidbend80c12c2016-10-11 00:13:49609 ssl_.get(), out, outlen, label.data(), label.size(),
davidbenf225b262016-09-15 22:09:22610 reinterpret_cast<const unsigned char*>(context.data()),
611 context.length(), has_context ? 1 : 0)) {
612 LOG(ERROR) << "Failed to export keying material.";
613 return ERR_FAILED;
[email protected]b9b651f2013-11-09 04:32:22614 }
davidbenf225b262016-09-15 22:09:22615
[email protected]b9b651f2013-11-09 04:32:22616 return OK;
617}
618
svaldeze83af292016-04-26 14:33:37619int SSLClientSocketImpl::Connect(const CompletionCallback& callback) {
svaldez4af14d22015-08-20 13:48:24620 // Although StreamSocket does allow calling Connect() after Disconnect(),
621 // this has never worked for layered sockets. CHECK to detect any consumers
622 // reconnecting an SSL socket.
623 //
624 // TODO(davidben,mmenke): Remove this API feature. See
625 // https://crbug.com/499289.
626 CHECK(!disconnected_);
627
mikecirone8b85c432016-09-08 19:11:00628 net_log_.BeginEvent(NetLogEventType::SSL_CONNECT);
[email protected]b9b651f2013-11-09 04:32:22629
630 // Set up new ssl object.
[email protected]c8a80e92014-05-17 16:02:08631 int rv = Init();
632 if (rv != OK) {
davidben281d13f02016-04-27 20:43:28633 LogConnectEndEvent(rv);
[email protected]c8a80e92014-05-17 16:02:08634 return rv;
[email protected]b9b651f2013-11-09 04:32:22635 }
636
637 // Set SSL to client mode. Handshake happens in the loop below.
davidbend80c12c2016-10-11 00:13:49638 SSL_set_connect_state(ssl_.get());
[email protected]b9b651f2013-11-09 04:32:22639
rsleeviadbd4982016-06-13 22:10:27640 next_handshake_state_ = STATE_HANDSHAKE;
[email protected]c8a80e92014-05-17 16:02:08641 rv = DoHandshakeLoop(OK);
[email protected]b9b651f2013-11-09 04:32:22642 if (rv == ERR_IO_PENDING) {
643 user_connect_callback_ = callback;
644 } else {
davidben281d13f02016-04-27 20:43:28645 LogConnectEndEvent(rv);
[email protected]b9b651f2013-11-09 04:32:22646 }
647
648 return rv > OK ? OK : rv;
649}
650
svaldeze83af292016-04-26 14:33:37651void SSLClientSocketImpl::Disconnect() {
svaldez4af14d22015-08-20 13:48:24652 disconnected_ = true;
653
[email protected]b9b651f2013-11-09 04:32:22654 // Shut down anything that may call us back.
eroman7f9236a2015-05-11 21:23:43655 cert_verifier_request_.reset();
davidben67e83912016-10-12 18:36:32656 channel_id_request_.Cancel();
657 weak_factory_.InvalidateWeakPtrs();
davidben3418e81f2016-10-19 00:09:45658 transport_adapter_.reset();
[email protected]b9b651f2013-11-09 04:32:22659
davidben67e83912016-10-12 18:36:32660 // Release user callbacks.
[email protected]b9b651f2013-11-09 04:32:22661 user_connect_callback_.Reset();
662 user_read_callback_.Reset();
663 user_write_callback_.Reset();
svaldeze83af292016-04-26 14:33:37664 user_read_buf_ = NULL;
665 user_read_buf_len_ = 0;
666 user_write_buf_ = NULL;
667 user_write_buf_len_ = 0;
[email protected]b9b651f2013-11-09 04:32:22668
davidben67e83912016-10-12 18:36:32669 transport_->socket()->Disconnect();
[email protected]b9b651f2013-11-09 04:32:22670}
671
svaldeze83af292016-04-26 14:33:37672bool SSLClientSocketImpl::IsConnected() const {
davidben67e83912016-10-12 18:36:32673 // If the handshake has not yet completed or the socket has been explicitly
674 // disconnected.
675 if (!completed_connect_ || disconnected_)
[email protected]b9b651f2013-11-09 04:32:22676 return false;
677 // If an asynchronous operation is still pending.
678 if (user_read_buf_.get() || user_write_buf_.get())
679 return true;
680
681 return transport_->socket()->IsConnected();
682}
683
svaldeze83af292016-04-26 14:33:37684bool SSLClientSocketImpl::IsConnectedAndIdle() const {
davidben67e83912016-10-12 18:36:32685 // If the handshake has not yet completed or the socket has been explicitly
686 // disconnected.
687 if (!completed_connect_ || disconnected_)
[email protected]b9b651f2013-11-09 04:32:22688 return false;
689 // If an asynchronous operation is still pending.
690 if (user_read_buf_.get() || user_write_buf_.get())
691 return false;
davidbenfc9a6b82015-04-15 23:47:32692
693 // If there is data read from the network that has not yet been consumed, do
694 // not treat the connection as idle.
695 //
davidben3418e81f2016-10-19 00:09:45696 // Note that this does not check whether there is ciphertext that has not yet
697 // been flushed to the network. |Write| returns early, so this can cause race
698 // conditions which cause a socket to not be treated reusable when it should
699 // be. See https://crbug.com/466147.
700 if (transport_adapter_->HasPendingReadData())
[email protected]b9b651f2013-11-09 04:32:22701 return false;
[email protected]b9b651f2013-11-09 04:32:22702
703 return transport_->socket()->IsConnectedAndIdle();
704}
705
svaldeze83af292016-04-26 14:33:37706int SSLClientSocketImpl::GetPeerAddress(IPEndPoint* addressList) const {
[email protected]b9b651f2013-11-09 04:32:22707 return transport_->socket()->GetPeerAddress(addressList);
708}
709
svaldeze83af292016-04-26 14:33:37710int SSLClientSocketImpl::GetLocalAddress(IPEndPoint* addressList) const {
[email protected]b9b651f2013-11-09 04:32:22711 return transport_->socket()->GetLocalAddress(addressList);
712}
713
tfarina42834112016-09-22 13:38:20714const NetLogWithSource& SSLClientSocketImpl::NetLog() const {
[email protected]b9b651f2013-11-09 04:32:22715 return net_log_;
716}
717
svaldeze83af292016-04-26 14:33:37718void SSLClientSocketImpl::SetSubresourceSpeculation() {
[email protected]b9b651f2013-11-09 04:32:22719 if (transport_.get() && transport_->socket()) {
720 transport_->socket()->SetSubresourceSpeculation();
721 } else {
722 NOTREACHED();
723 }
724}
725
svaldeze83af292016-04-26 14:33:37726void SSLClientSocketImpl::SetOmniboxSpeculation() {
[email protected]b9b651f2013-11-09 04:32:22727 if (transport_.get() && transport_->socket()) {
728 transport_->socket()->SetOmniboxSpeculation();
729 } else {
730 NOTREACHED();
731 }
732}
733
svaldeze83af292016-04-26 14:33:37734bool SSLClientSocketImpl::WasEverUsed() const {
[email protected]0dc88b32014-03-26 20:12:28735 return was_ever_used_;
[email protected]b9b651f2013-11-09 04:32:22736}
737
tfarina2846404c2016-12-25 14:31:37738bool SSLClientSocketImpl::WasAlpnNegotiated() const {
bnc3cf2a592016-08-11 14:48:36739 return negotiated_protocol_ != kProtoUnknown;
740}
741
742NextProto SSLClientSocketImpl::GetNegotiatedProtocol() const {
743 return negotiated_protocol_;
744}
745
svaldeze83af292016-04-26 14:33:37746bool SSLClientSocketImpl::GetSSLInfo(SSLInfo* ssl_info) {
[email protected]b9b651f2013-11-09 04:32:22747 ssl_info->Reset();
davidbenc7e06c92017-03-07 18:54:11748 if (!server_cert_)
[email protected]b9b651f2013-11-09 04:32:22749 return false;
750
751 ssl_info->cert = server_cert_verify_result_.verified_cert;
estark03d644f2015-06-13 00:11:32752 ssl_info->unverified_cert = server_cert_;
[email protected]b9b651f2013-11-09 04:32:22753 ssl_info->cert_status = server_cert_verify_result_.cert_status;
754 ssl_info->is_issued_by_known_root =
755 server_cert_verify_result_.is_issued_by_known_root;
dadriandf302c42016-06-10 18:48:59756 ssl_info->pkp_bypassed = pkp_bypassed_;
svaldeze83af292016-04-26 14:33:37757 ssl_info->public_key_hashes = server_cert_verify_result_.public_key_hashes;
[email protected]b9b651f2013-11-09 04:32:22758 ssl_info->client_cert_sent =
759 ssl_config_.send_client_cert && ssl_config_.client_cert.get();
davidben52053b382015-04-27 19:22:29760 ssl_info->channel_id_sent = channel_id_sent_;
nharper736ceda2015-11-07 00:16:59761 ssl_info->token_binding_negotiated = tb_was_negotiated_;
762 ssl_info->token_binding_key_param = tb_negotiated_param_;
[email protected]8bd4e7a2014-08-09 14:49:17763 ssl_info->pinning_failure_log = pinning_failure_log_;
dadrian612337a2016-07-20 22:36:58764 ssl_info->ocsp_result = server_cert_verify_result_.ocsp_result;
[email protected]b9b651f2013-11-09 04:32:22765
estark723b5eeb2016-02-18 21:01:12766 AddCTInfoToSSLInfo(ssl_info);
davidbeneb5f8ef32014-09-04 14:14:32767
davidbend80c12c2016-10-11 00:13:49768 const SSL_CIPHER* cipher = SSL_get_current_cipher(ssl_.get());
[email protected]b9b651f2013-11-09 04:32:22769 CHECK(cipher);
770 ssl_info->security_bits = SSL_CIPHER_get_bits(cipher, NULL);
davidben3b00e402016-09-20 14:31:06771 // Historically, the "group" was known as "curve".
davidbend80c12c2016-10-11 00:13:49772 ssl_info->key_exchange_group = SSL_get_curve_id(ssl_.get());
[email protected]b9b651f2013-11-09 04:32:22773
ryanchung987b2ff2016-02-19 00:17:12774 SSLConnectionStatusSetCipherSuite(
775 static_cast<uint16_t>(SSL_CIPHER_get_id(cipher)),
776 &ssl_info->connection_status);
davidbend80c12c2016-10-11 00:13:49777 SSLConnectionStatusSetVersion(GetNetSSLVersion(ssl_.get()),
ryanchung987b2ff2016-02-19 00:17:12778 &ssl_info->connection_status);
[email protected]b9b651f2013-11-09 04:32:22779
davidbend80c12c2016-10-11 00:13:49780 ssl_info->handshake_type = SSL_session_reused(ssl_.get())
svaldeze83af292016-04-26 14:33:37781 ? SSLInfo::HANDSHAKE_RESUME
782 : SSLInfo::HANDSHAKE_FULL;
[email protected]b9b651f2013-11-09 04:32:22783
[email protected]b9b651f2013-11-09 04:32:22784 return true;
785}
786
svaldeze83af292016-04-26 14:33:37787void SSLClientSocketImpl::GetConnectionAttempts(ConnectionAttempts* out) const {
ttuttle23fdb7b2015-05-15 01:28:03788 out->clear();
789}
790
svaldeze83af292016-04-26 14:33:37791int64_t SSLClientSocketImpl::GetTotalReceivedBytes() const {
tbansalf82cc8e2015-10-14 20:05:49792 return transport_->socket()->GetTotalReceivedBytes();
793}
794
xunjieli998d2472017-01-12 01:12:28795void SSLClientSocketImpl::DumpMemoryStats(SocketMemoryStats* stats) const {
796 if (transport_adapter_)
797 stats->buffer_size = transport_adapter_->GetAllocationSize();
davidbenc7e06c92017-03-07 18:54:11798 STACK_OF(X509)* server_cert_chain = SSL_get_peer_cert_chain(ssl_.get());
799 if (server_cert_chain) {
800 for (size_t i = 0; i < sk_X509_num(server_cert_chain); ++i) {
801 X509* cert = sk_X509_value(server_cert_chain, i);
xunjieliffe62df62017-02-23 18:22:41802 // Estimate the size of the certificate before deduplication.
803 // The multiplier (4) is added to account for the difference between the
804 // serialized cert size and the actual cert allocation.
805 // TODO(xunjieli): Update this after crbug.com/671420 is done.
806 stats->cert_size += 4 * i2d_X509(cert, nullptr);
xunjieli9f8c5fb52016-12-07 22:59:33807 }
davidbenc7e06c92017-03-07 18:54:11808 stats->cert_count = sk_X509_num(server_cert_chain);
xunjieli9f8c5fb52016-12-07 22:59:33809 }
xunjieliffe62df62017-02-23 18:22:41810 stats->total_size = stats->buffer_size + stats->cert_size;
xunjieli9f8c5fb52016-12-07 22:59:33811}
812
813// static
814void SSLClientSocketImpl::DumpSSLClientSessionMemoryStats(
815 base::trace_event::ProcessMemoryDump* pmd) {
816 SSLContext::GetInstance()->session_cache()->DumpMemoryStats(pmd);
817}
818
svaldeze83af292016-04-26 14:33:37819int SSLClientSocketImpl::Read(IOBuffer* buf,
820 int buf_len,
821 const CompletionCallback& callback) {
xunjieli321a96f32017-03-07 19:42:17822 int rv = ReadIfReady(buf, buf_len, callback);
823 if (rv == ERR_IO_PENDING) {
824 user_read_buf_ = buf;
825 user_read_buf_len_ = buf_len;
826 }
827 return rv;
828}
[email protected]b9b651f2013-11-09 04:32:22829
xunjieli321a96f32017-03-07 19:42:17830int SSLClientSocketImpl::ReadIfReady(IOBuffer* buf,
831 int buf_len,
832 const CompletionCallback& callback) {
833 int rv = DoPayloadRead(buf, buf_len);
[email protected]b9b651f2013-11-09 04:32:22834
835 if (rv == ERR_IO_PENDING) {
836 user_read_callback_ = callback;
837 } else {
[email protected]0dc88b32014-03-26 20:12:28838 if (rv > 0)
839 was_ever_used_ = true;
[email protected]b9b651f2013-11-09 04:32:22840 }
[email protected]b9b651f2013-11-09 04:32:22841 return rv;
842}
843
svaldeze83af292016-04-26 14:33:37844int SSLClientSocketImpl::Write(IOBuffer* buf,
845 int buf_len,
846 const CompletionCallback& callback) {
[email protected]b9b651f2013-11-09 04:32:22847 user_write_buf_ = buf;
848 user_write_buf_len_ = buf_len;
849
davidben3418e81f2016-10-19 00:09:45850 int rv = DoPayloadWrite();
[email protected]b9b651f2013-11-09 04:32:22851
852 if (rv == ERR_IO_PENDING) {
853 user_write_callback_ = callback;
854 } else {
[email protected]0dc88b32014-03-26 20:12:28855 if (rv > 0)
856 was_ever_used_ = true;
[email protected]b9b651f2013-11-09 04:32:22857 user_write_buf_ = NULL;
858 user_write_buf_len_ = 0;
859 }
860
861 return rv;
862}
863
svaldeze83af292016-04-26 14:33:37864int SSLClientSocketImpl::SetReceiveBufferSize(int32_t size) {
[email protected]b9b651f2013-11-09 04:32:22865 return transport_->socket()->SetReceiveBufferSize(size);
866}
867
svaldeze83af292016-04-26 14:33:37868int SSLClientSocketImpl::SetSendBufferSize(int32_t size) {
[email protected]b9b651f2013-11-09 04:32:22869 return transport_->socket()->SetSendBufferSize(size);
870}
871
davidben3418e81f2016-10-19 00:09:45872void SSLClientSocketImpl::OnReadReady() {
873 // During a renegotiation, either Read or Write calls may be blocked on a
874 // transport read.
875 RetryAllOperations();
876}
877
878void SSLClientSocketImpl::OnWriteReady() {
879 // During a renegotiation, either Read or Write calls may be blocked on a
880 // transport read.
881 RetryAllOperations();
882}
883
svaldeze83af292016-04-26 14:33:37884int SSLClientSocketImpl::Init() {
[email protected]9e733f32010-10-04 18:19:08885 DCHECK(!ssl_);
[email protected]9e733f32010-10-04 18:19:08886
svaldez2135be52016-04-20 16:34:53887#if defined(USE_NSS_CERTS)
davidbena477a70a2015-10-06 04:38:29888 if (ssl_config_.cert_io_enabled) {
889 // TODO(davidben): Move this out of SSLClientSocket. See
890 // https://crbug.com/539520.
891 EnsureNSSHttpIOInit();
892 }
893#endif
894
[email protected]b29af7d2010-12-14 11:52:47895 SSLContext* context = SSLContext::GetInstance();
[email protected]4b559b4d2011-04-14 17:37:14896 crypto::OpenSSLErrStackTracer err_tracer(FROM_HERE);
[email protected]d518cd92010-09-29 12:27:44897
davidbend80c12c2016-10-11 00:13:49898 ssl_.reset(SSL_new(context->ssl_ctx()));
899 if (!ssl_ || !context->SetClientSocketForSSL(ssl_.get(), this))
[email protected]c8a80e92014-05-17 16:02:08900 return ERR_UNEXPECTED;
[email protected]fbef13932010-11-23 12:38:53901
davidben9bc0466f2015-06-16 22:21:27902 // SNI should only contain valid DNS hostnames, not IP addresses (see RFC
903 // 6066, Section 3).
904 //
905 // TODO(rsleevi): Should this code allow hostnames that violate the LDH rule?
906 // See https://crbug.com/496472 and https://crbug.com/496468 for discussion.
martijna2e83bd2016-03-18 13:10:45907 IPAddress unused;
908 if (!unused.AssignFromIPLiteral(host_and_port_.host()) &&
davidbend80c12c2016-10-11 00:13:49909 !SSL_set_tlsext_host_name(ssl_.get(), host_and_port_.host().c_str())) {
[email protected]c8a80e92014-05-17 16:02:08910 return ERR_UNEXPECTED;
davidben9bc0466f2015-06-16 22:21:27911 }
[email protected]fbef13932010-11-23 12:38:53912
nharper00d06ff2017-01-20 00:55:56913 bssl::UniquePtr<SSL_SESSION> session = context->session_cache()->Lookup(
914 GetSessionCacheKey(), &ssl_session_cache_lookup_count_);
davidbenf4c9a6122015-10-20 02:45:29915 if (session)
davidbend80c12c2016-10-11 00:13:49916 SSL_set_session(ssl_.get(), session.get());
[email protected]d518cd92010-09-29 12:27:44917
davidben3418e81f2016-10-19 00:09:45918 transport_adapter_.reset(new SocketBIOAdapter(
919 transport_->socket(), GetBufferSize("SSLBufferSizeRecv"),
920 GetBufferSize("SSLBufferSizeSend"), this));
921 BIO* transport_bio = transport_adapter_->bio();
mmenke1beda3d2016-07-22 03:33:45922
davidben3418e81f2016-10-19 00:09:45923 BIO_up_ref(transport_bio); // SSL_set0_rbio takes ownership.
924 SSL_set0_rbio(ssl_.get(), transport_bio);
haavardm2d92e722014-12-19 13:45:44925
davidben3418e81f2016-10-19 00:09:45926 BIO_up_ref(transport_bio); // SSL_set0_wbio takes ownership.
927 SSL_set0_wbio(ssl_.get(), transport_bio);
[email protected]d518cd92010-09-29 12:27:44928
davidbenb937d6c2015-05-14 04:53:42929 DCHECK_LT(SSL3_VERSION, ssl_config_.version_min);
930 DCHECK_LT(SSL3_VERSION, ssl_config_.version_max);
davidbend80c12c2016-10-11 00:13:49931 if (!SSL_set_min_proto_version(ssl_.get(), ssl_config_.version_min) ||
932 !SSL_set_max_proto_version(ssl_.get(), ssl_config_.version_max)) {
davidben952bdf22016-09-21 23:42:16933 return ERR_UNEXPECTED;
934 }
davidbenb937d6c2015-05-14 04:53:42935
[email protected]9e733f32010-10-04 18:19:08936 // OpenSSL defaults some options to on, others to off. To avoid ambiguity,
937 // set everything we care about to an absolute value.
[email protected]fb10e2282010-12-01 17:08:48938 SslSetClearMask options;
[email protected]d0f00492012-08-03 22:35:13939 options.ConfigureFlag(SSL_OP_NO_COMPRESSION, true);
[email protected]9e733f32010-10-04 18:19:08940
941 // TODO(joth): Set this conditionally, see http://crbug.com/55410
[email protected]fb10e2282010-12-01 17:08:48942 options.ConfigureFlag(SSL_OP_LEGACY_SERVER_CONNECT, true);
[email protected]9e733f32010-10-04 18:19:08943
davidbend80c12c2016-10-11 00:13:49944 SSL_set_options(ssl_.get(), options.set_mask);
945 SSL_clear_options(ssl_.get(), options.clear_mask);
[email protected]9e733f32010-10-04 18:19:08946
[email protected]fb10e2282010-12-01 17:08:48947 // Same as above, this time for the SSL mode.
948 SslSetClearMask mode;
[email protected]9e733f32010-10-04 18:19:08949
[email protected]fb10e2282010-12-01 17:08:48950 mode.ConfigureFlag(SSL_MODE_RELEASE_BUFFERS, true);
ishermane5c05e12014-09-09 20:32:15951 mode.ConfigureFlag(SSL_MODE_CBC_RECORD_SPLITTING, true);
[email protected]fb10e2282010-12-01 17:08:48952
davidben818d93b2015-02-19 22:27:32953 mode.ConfigureFlag(SSL_MODE_ENABLE_FALSE_START,
[email protected]b788de02014-04-23 18:06:07954 ssl_config_.false_start_enabled);
955
davidbend80c12c2016-10-11 00:13:49956 SSL_set_mode(ssl_.get(), mode.set_mask);
957 SSL_clear_mode(ssl_.get(), mode.clear_mask);
[email protected]109805a2010-12-07 18:17:06958
davidben4177ecb2016-10-22 01:47:18959 // Use BoringSSL defaults, but disable HMAC-SHA256 and HMAC-SHA384 ciphers
kjellander1ae83a02017-01-26 07:35:09960 // (note that SHA256 and SHA384 only select legacy CBC ciphers).
961 std::string command("ALL:!SHA256:!SHA384:!kDHE:!aPSK:!RC4");
davidben9b4a9b9c2015-10-12 18:46:51962
963 if (ssl_config_.require_ecdhe)
964 command.append(":!kRSA:!kDHE");
davidben8ecc3072014-09-03 23:19:09965
davidbend406cdb2016-11-17 08:31:05966 // Additionally disable HMAC-SHA1 ciphers in ECDSA. These are the remaining
967 // CBC-mode ECDSA ciphers.
968 if (!AreLegacyECDSACiphersEnabled())
969 command.append("!ECDSA+SHA1");
970
davidben9b4a9b9c2015-10-12 18:46:51971 // Remove any disabled ciphers.
972 for (uint16_t id : ssl_config_.disabled_cipher_suites) {
973 const SSL_CIPHER* cipher = SSL_get_cipher_by_value(id);
974 if (cipher) {
975 command.append(":!");
976 command.append(SSL_CIPHER_get_name(cipher));
977 }
978 }
979
davidbend80c12c2016-10-11 00:13:49980 int rv = SSL_set_cipher_list(ssl_.get(), command.c_str());
[email protected]109805a2010-12-07 18:17:06981 // If this fails (rv = 0) it means there are no ciphers enabled on this SSL.
982 // This will almost certainly result in the socket failing to complete the
983 // handshake at which point the appropriate error is bubbled up to the client.
984 LOG_IF(WARNING, rv != 1) << "SSL_set_cipher_list('" << command << "') "
svaldeze83af292016-04-26 14:33:37985 "returned "
986 << rv;
[email protected]ee0f2aa82013-10-25 11:59:26987
988 // TLS channel ids.
bnc3cf2a592016-08-11 14:48:36989 if (IsChannelIDEnabled()) {
davidbend80c12c2016-10-11 00:13:49990 SSL_enable_tls_channel_id(ssl_.get());
[email protected]ee0f2aa82013-10-25 11:59:26991 }
992
bnc1f295372015-10-21 23:24:22993 if (!ssl_config_.alpn_protos.empty()) {
bnc988e68d2016-06-27 14:03:21994 std::vector<uint8_t> wire_protos =
995 SerializeNextProtos(ssl_config_.alpn_protos);
davidbend80c12c2016-10-11 00:13:49996 SSL_set_alpn_protos(ssl_.get(),
997 wire_protos.empty() ? NULL : &wire_protos[0],
[email protected]abc44b752014-07-30 03:52:15998 wire_protos.size());
999 }
1000
davidbeneb5f8ef32014-09-04 14:14:321001 if (ssl_config_.signed_cert_timestamps_enabled) {
davidbend80c12c2016-10-11 00:13:491002 SSL_enable_signed_cert_timestamps(ssl_.get());
1003 SSL_enable_ocsp_stapling(ssl_.get());
davidbeneb5f8ef32014-09-04 14:14:321004 }
1005
davidben15f57132015-04-27 18:08:361006 if (cert_verifier_->SupportsOCSPStapling())
davidbend80c12c2016-10-11 00:13:491007 SSL_enable_ocsp_stapling(ssl_.get());
davidbeneb5f8ef32014-09-04 14:14:321008
davidben971a681a2017-02-16 18:57:461009 // Configure BoringSSL to allow renegotiations. Once the initial handshake
1010 // completes, if renegotiations are not allowed, the default reject value will
1011 // be restored. This is done in this order to permit a BoringSSL
1012 // optimization. See https://crbug.com/boringssl/123.
1013 SSL_set_renegotiate_mode(ssl_.get(), ssl_renegotiate_freely);
1014
[email protected]c8a80e92014-05-17 16:02:081015 return OK;
[email protected]d518cd92010-09-29 12:27:441016}
1017
svaldeze83af292016-04-26 14:33:371018void SSLClientSocketImpl::DoReadCallback(int rv) {
[email protected]b9b651f2013-11-09 04:32:221019 // Since Run may result in Read being called, clear |user_read_callback_|
1020 // up front.
[email protected]0dc88b32014-03-26 20:12:281021 if (rv > 0)
1022 was_ever_used_ = true;
xunjieli321a96f32017-03-07 19:42:171023 user_read_buf_ = nullptr;
[email protected]b9b651f2013-11-09 04:32:221024 user_read_buf_len_ = 0;
1025 base::ResetAndReturn(&user_read_callback_).Run(rv);
1026}
1027
svaldeze83af292016-04-26 14:33:371028void SSLClientSocketImpl::DoWriteCallback(int rv) {
[email protected]b9b651f2013-11-09 04:32:221029 // Since Run may result in Write being called, clear |user_write_callback_|
1030 // up front.
[email protected]0dc88b32014-03-26 20:12:281031 if (rv > 0)
1032 was_ever_used_ = true;
[email protected]b9b651f2013-11-09 04:32:221033 user_write_buf_ = NULL;
1034 user_write_buf_len_ = 0;
1035 base::ResetAndReturn(&user_write_callback_).Run(rv);
1036}
1037
pkasting379234c2015-04-08 04:42:121038// TODO(cbentzel): Remove including "base/threading/thread_local.h" and
vadimt6b43dec22015-01-06 01:59:581039// g_first_run_completed once crbug.com/424386 is fixed.
1040base::LazyInstance<base::ThreadLocalBoolean>::Leaky g_first_run_completed =
1041 LAZY_INSTANCE_INITIALIZER;
1042
svaldeze83af292016-04-26 14:33:371043int SSLClientSocketImpl::DoHandshake() {
[email protected]b9b651f2013-11-09 04:32:221044 crypto::OpenSSLErrStackTracer err_tracer(FROM_HERE);
vadimt5a243282014-12-24 00:26:161045
1046 int rv;
1047
pkasting379234c2015-04-08 04:42:121048 // TODO(cbentzel): Leave only 1 call to SSL_do_handshake once crbug.com/424386
vadimt5a243282014-12-24 00:26:161049 // is fixed.
1050 if (ssl_config_.send_client_cert && ssl_config_.client_cert.get()) {
davidbend80c12c2016-10-11 00:13:491051 rv = SSL_do_handshake(ssl_.get());
vadimt5a243282014-12-24 00:26:161052 } else {
vadimt6b43dec22015-01-06 01:59:581053 if (g_first_run_completed.Get().Get()) {
pkasting379234c2015-04-08 04:42:121054 // TODO(cbentzel): Remove ScopedTracker below once crbug.com/424386 is
vadimt6b43dec22015-01-06 01:59:581055 // fixed.
pkasting379234c2015-04-08 04:42:121056 tracked_objects::ScopedTracker tracking_profile(
1057 FROM_HERE_WITH_EXPLICIT_FUNCTION("424386 SSL_do_handshake()"));
vadimt5a243282014-12-24 00:26:161058
davidbend80c12c2016-10-11 00:13:491059 rv = SSL_do_handshake(ssl_.get());
vadimt6b43dec22015-01-06 01:59:581060 } else {
1061 g_first_run_completed.Get().Set(true);
davidbend80c12c2016-10-11 00:13:491062 rv = SSL_do_handshake(ssl_.get());
vadimt6b43dec22015-01-06 01:59:581063 }
vadimt5a243282014-12-24 00:26:161064 }
[email protected]b9b651f2013-11-09 04:32:221065
davidbenc4212c02015-05-12 22:30:181066 int net_error = OK;
1067 if (rv <= 0) {
davidbend80c12c2016-10-11 00:13:491068 int ssl_error = SSL_get_error(ssl_.get(), rv);
[email protected]b9b651f2013-11-09 04:32:221069 if (ssl_error == SSL_ERROR_WANT_CHANNEL_ID_LOOKUP) {
[email protected]faff9852014-06-21 06:13:461070 // The server supports channel ID. Stop to look one up before returning to
1071 // the handshake.
rsleeviadbd4982016-06-13 22:10:271072 next_handshake_state_ = STATE_CHANNEL_ID_LOOKUP;
[email protected]faff9852014-06-21 06:13:461073 return OK;
[email protected]b9b651f2013-11-09 04:32:221074 }
davidbenced4aa9b2015-05-12 21:22:351075 if (ssl_error == SSL_ERROR_WANT_X509_LOOKUP &&
1076 !ssl_config_.send_client_cert) {
1077 return ERR_SSL_CLIENT_AUTH_CERT_NEEDED;
1078 }
davidben1d489522015-07-01 18:48:461079 if (ssl_error == SSL_ERROR_WANT_PRIVATE_KEY_OPERATION) {
svaldez7872fd02015-11-19 21:10:541080 DCHECK(ssl_config_.client_private_key);
davidben1d489522015-07-01 18:48:461081 DCHECK_NE(kNoPendingResult, signature_result_);
rsleeviadbd4982016-06-13 22:10:271082 next_handshake_state_ = STATE_HANDSHAKE;
davidben1d489522015-07-01 18:48:461083 return ERR_IO_PENDING;
1084 }
[email protected]b9b651f2013-11-09 04:32:221085
davidbena4409c62014-08-27 17:05:511086 OpenSSLErrorInfo error_info;
davidbenfe132d92016-09-27 18:07:211087 net_error = MapLastOpenSSLError(ssl_error, err_tracer, &error_info);
[email protected]b9b651f2013-11-09 04:32:221088 if (net_error == ERR_IO_PENDING) {
davidbenc4212c02015-05-12 22:30:181089 // If not done, stay in this state
rsleeviadbd4982016-06-13 22:10:271090 next_handshake_state_ = STATE_HANDSHAKE;
davidbenc4212c02015-05-12 22:30:181091 return ERR_IO_PENDING;
1092 }
1093
1094 LOG(ERROR) << "handshake failed; returned " << rv << ", SSL error code "
1095 << ssl_error << ", net_error " << net_error;
1096 net_log_.AddEvent(
mikecirone8b85c432016-09-08 19:11:001097 NetLogEventType::SSL_HANDSHAKE_ERROR,
davidbenc4212c02015-05-12 22:30:181098 CreateNetLogOpenSSLErrorCallback(net_error, ssl_error, error_info));
1099 }
1100
rsleeviadbd4982016-06-13 22:10:271101 next_handshake_state_ = STATE_HANDSHAKE_COMPLETE;
davidbenc4212c02015-05-12 22:30:181102 return net_error;
1103}
1104
svaldeze83af292016-04-26 14:33:371105int SSLClientSocketImpl::DoHandshakeComplete(int result) {
davidbenc4212c02015-05-12 22:30:181106 if (result < 0)
1107 return result;
1108
nharper00d06ff2017-01-20 00:55:561109 SSLContext::GetInstance()->session_cache()->ResetLookupCount(
1110 GetSessionCacheKey());
nharper736ceda2015-11-07 00:16:591111 // Check that if token binding was negotiated, then extended master secret
nharper78e6d2b2016-09-21 05:42:351112 // and renegotiation indication must also be negotiated.
1113 if (tb_was_negotiated_ &&
davidbend80c12c2016-10-11 00:13:491114 !(SSL_get_extms_support(ssl_.get()) &&
1115 SSL_get_secure_renegotiation_support(ssl_.get()))) {
nharper736ceda2015-11-07 00:16:591116 return ERR_SSL_PROTOCOL_ERROR;
nharper78e6d2b2016-09-21 05:42:351117 }
nharper736ceda2015-11-07 00:16:591118
bncce6ea242016-09-15 20:22:321119 const uint8_t* alpn_proto = NULL;
1120 unsigned alpn_len = 0;
davidbend80c12c2016-10-11 00:13:491121 SSL_get0_alpn_selected(ssl_.get(), &alpn_proto, &alpn_len);
bncce6ea242016-09-15 20:22:321122 if (alpn_len > 0) {
1123 base::StringPiece proto(reinterpret_cast<const char*>(alpn_proto),
1124 alpn_len);
1125 negotiated_protocol_ = NextProtoFromString(proto);
[email protected]b9b651f2013-11-09 04:32:221126 }
davidbenc4212c02015-05-12 22:30:181127
nharperf5f8823d2017-03-01 23:52:401128 // If we got a session from the session cache, log how many concurrent
1129 // handshakes that session was used in before we finished our handshake. This
1130 // is only recorded if the session from the cache was actually used, and only
1131 // if the ALPN protocol is h2 (under the assumption that TLS 1.3 servers will
1132 // be speaking h2). See https://crbug.com/631988.
1133 if (ssl_session_cache_lookup_count_ && negotiated_protocol_ == kProtoHTTP2 &&
1134 SSL_session_reused(ssl_.get())) {
1135 UMA_HISTOGRAM_EXACT_LINEAR("Net.SSLSessionConcurrentLookupCount",
1136 ssl_session_cache_lookup_count_, 20);
1137 }
1138
bncbd442c22016-09-14 20:49:161139 RecordNegotiatedProtocol();
bnc3cf2a592016-08-11 14:48:361140 RecordChannelIDSupport();
davidbenc4212c02015-05-12 22:30:181141
dadriand476e652016-07-26 21:33:241142 const uint8_t* ocsp_response_raw;
1143 size_t ocsp_response_len;
davidbend80c12c2016-10-11 00:13:491144 SSL_get0_ocsp_response(ssl_.get(), &ocsp_response_raw, &ocsp_response_len);
dadriand476e652016-07-26 21:33:241145 set_stapled_ocsp_response_received(ocsp_response_len != 0);
1146 UMA_HISTOGRAM_BOOLEAN("Net.OCSPResponseStapled", ocsp_response_len != 0);
davidbenc4212c02015-05-12 22:30:181147
1148 const uint8_t* sct_list;
1149 size_t sct_list_len;
davidbend80c12c2016-10-11 00:13:491150 SSL_get0_signed_cert_timestamp_list(ssl_.get(), &sct_list, &sct_list_len);
davidbenc4212c02015-05-12 22:30:181151 set_signed_cert_timestamps_received(sct_list_len != 0);
1152
davidben971a681a2017-02-16 18:57:461153 if (!IsRenegotiationAllowed())
1154 SSL_set_renegotiate_mode(ssl_.get(), ssl_renegotiate_never);
davidbenc4212c02015-05-12 22:30:181155
davidbend80c12c2016-10-11 00:13:491156 uint16_t signature_algorithm = SSL_get_peer_signature_algorithm(ssl_.get());
davidben0653c8d2016-07-08 02:16:171157 if (signature_algorithm != 0) {
1158 UMA_HISTOGRAM_SPARSE_SLOWLY("Net.SSLSignatureAlgorithm",
1159 signature_algorithm);
davidben4fe4f982015-11-11 22:00:121160 }
1161
davidbenc4212c02015-05-12 22:30:181162 // Verify the certificate.
rsleeviadbd4982016-06-13 22:10:271163 next_handshake_state_ = STATE_VERIFY_CERT;
davidbenc4212c02015-05-12 22:30:181164 return OK;
[email protected]b9b651f2013-11-09 04:32:221165}
1166
svaldeze83af292016-04-26 14:33:371167int SSLClientSocketImpl::DoChannelIDLookup() {
mikecironef22f9812016-10-04 03:40:191168 NetLogParametersCallback callback = base::Bind(
nharper49b27d992016-02-09 18:28:511169 &NetLogChannelIDLookupCallback, base::Unretained(channel_id_service_));
mikecirone8b85c432016-09-08 19:11:001170 net_log_.BeginEvent(NetLogEventType::SSL_GET_CHANNEL_ID, callback);
rsleeviadbd4982016-06-13 22:10:271171 next_handshake_state_ = STATE_CHANNEL_ID_LOOKUP_COMPLETE;
[email protected]6b8a3c742014-07-25 00:25:351172 return channel_id_service_->GetOrCreateChannelID(
nharper2e171cf2015-06-01 20:29:231173 host_and_port_.host(), &channel_id_key_,
svaldeze83af292016-04-26 14:33:371174 base::Bind(&SSLClientSocketImpl::OnHandshakeIOComplete,
[email protected]faff9852014-06-21 06:13:461175 base::Unretained(this)),
nharper75ade892015-06-10 19:05:351176 &channel_id_request_);
[email protected]faff9852014-06-21 06:13:461177}
1178
svaldeze83af292016-04-26 14:33:371179int SSLClientSocketImpl::DoChannelIDLookupComplete(int result) {
mikecirone8b85c432016-09-08 19:11:001180 net_log_.EndEvent(NetLogEventType::SSL_GET_CHANNEL_ID,
nharper49b27d992016-02-09 18:28:511181 base::Bind(&NetLogChannelIDLookupCompleteCallback,
1182 channel_id_key_.get(), result));
[email protected]faff9852014-06-21 06:13:461183 if (result < 0)
1184 return result;
1185
[email protected]faff9852014-06-21 06:13:461186 // Hand the key to OpenSSL. Check for error in case OpenSSL rejects the key
1187 // type.
davidben8a208fc2016-01-22 17:08:081188 DCHECK(channel_id_key_);
[email protected]faff9852014-06-21 06:13:461189 crypto::OpenSSLErrStackTracer err_tracer(FROM_HERE);
davidbend80c12c2016-10-11 00:13:491190 if (!SSL_set1_tls_channel_id(ssl_.get(), channel_id_key_->key())) {
[email protected]faff9852014-06-21 06:13:461191 LOG(ERROR) << "Failed to set Channel ID.";
davidbenf225b262016-09-15 22:09:221192 return ERR_FAILED;
[email protected]faff9852014-06-21 06:13:461193 }
1194
1195 // Return to the handshake.
davidben52053b382015-04-27 19:22:291196 channel_id_sent_ = true;
rsleeviadbd4982016-06-13 22:10:271197 next_handshake_state_ = STATE_HANDSHAKE;
[email protected]faff9852014-06-21 06:13:461198 return OK;
1199}
1200
svaldeze83af292016-04-26 14:33:371201int SSLClientSocketImpl::DoVerifyCert(int result) {
davidben09c3d072014-08-25 20:33:581202 DCHECK(start_cert_verification_time_.is_null());
davidben30798ed82014-09-19 19:28:201203
davidbenc7e06c92017-03-07 18:54:111204 server_cert_ = OSChainFromOpenSSL(SSL_get_peer_cert_chain(ssl_.get()));
[email protected]b9b651f2013-11-09 04:32:221205
davidbenc6435a72015-08-17 18:28:521206 // OpenSSL decoded the certificate, but the platform certificate
1207 // implementation could not. This is treated as a fatal SSL-level protocol
1208 // error rather than a certificate error. See https://crbug.com/91341.
rsleevi74e99742016-09-13 20:35:251209 if (!server_cert_)
davidbenc6435a72015-08-17 18:28:521210 return ERR_SSL_SERVER_CERT_BAD_FORMAT;
1211
davidbenc7e06c92017-03-07 18:54:111212 net_log_.AddEvent(NetLogEventType::SSL_CERTIFICATES_RECEIVED,
1213 base::Bind(&NetLogX509CertificateCallback,
1214 base::Unretained(server_cert_.get())));
1215
1216 next_handshake_state_ = STATE_VERIFY_CERT_COMPLETE;
1217
davidben30798ed82014-09-19 19:28:201218 // If the certificate is bad and has been previously accepted, use
1219 // the previous status and bypass the error.
[email protected]b9b651f2013-11-09 04:32:221220 CertStatus cert_status;
rsleevi74e99742016-09-13 20:35:251221 if (ssl_config_.IsAllowedBadCert(server_cert_.get(), &cert_status)) {
[email protected]b9b651f2013-11-09 04:32:221222 server_cert_verify_result_.Reset();
1223 server_cert_verify_result_.cert_status = cert_status;
1224 server_cert_verify_result_.verified_cert = server_cert_;
1225 return OK;
1226 }
1227
davidben09c3d072014-08-25 20:33:581228 start_cert_verification_time_ = base::TimeTicks::Now();
1229
rsleevi22cae1672016-12-28 01:53:361230 const uint8_t* ocsp_response_raw;
1231 size_t ocsp_response_len;
1232 SSL_get0_ocsp_response(ssl_.get(), &ocsp_response_raw, &ocsp_response_len);
1233 base::StringPiece ocsp_response(
1234 reinterpret_cast<const char*>(ocsp_response_raw), ocsp_response_len);
1235
eroman7f9236a2015-05-11 21:23:431236 return cert_verifier_->Verify(
rsleevi06bd78552016-06-08 22:34:461237 CertVerifier::RequestParams(server_cert_, host_and_port_.host(),
1238 ssl_config_.GetCertVerifyFlags(),
rsleevi22cae1672016-12-28 01:53:361239 ocsp_response.as_string(), CertificateList()),
[email protected]591cffcd2014-08-18 20:02:301240 // TODO(davidben): Route the CRLSet through SSLConfig so
1241 // SSLClientSocket doesn't depend on SSLConfigService.
davidben15f57132015-04-27 18:08:361242 SSLConfigService::GetCRLSet().get(), &server_cert_verify_result_,
svaldeze83af292016-04-26 14:33:371243 base::Bind(&SSLClientSocketImpl::OnHandshakeIOComplete,
[email protected]b9b651f2013-11-09 04:32:221244 base::Unretained(this)),
eroman7f9236a2015-05-11 21:23:431245 &cert_verifier_request_, net_log_);
[email protected]b9b651f2013-11-09 04:32:221246}
1247
svaldeze83af292016-04-26 14:33:371248int SSLClientSocketImpl::DoVerifyCertComplete(int result) {
eroman7f9236a2015-05-11 21:23:431249 cert_verifier_request_.reset();
[email protected]b9b651f2013-11-09 04:32:221250
davidben09c3d072014-08-25 20:33:581251 if (!start_cert_verification_time_.is_null()) {
1252 base::TimeDelta verify_time =
1253 base::TimeTicks::Now() - start_cert_verification_time_;
1254 if (result == OK) {
1255 UMA_HISTOGRAM_TIMES("Net.SSLCertVerificationTime", verify_time);
1256 } else {
1257 UMA_HISTOGRAM_TIMES("Net.SSLCertVerificationTimeError", verify_time);
1258 }
1259 }
1260
rsleevi4a6ca8c2016-06-24 03:05:221261 // If the connection was good, check HPKP and CT status simultaneously,
1262 // but prefer to treat the HPKP error as more serious, if there was one.
[email protected]8bd4e7a2014-08-09 14:49:171263 const CertStatus cert_status = server_cert_verify_result_.cert_status;
rsleevi4a6ca8c2016-06-24 03:05:221264 if ((result == OK ||
dadrian8f8946652016-06-21 23:48:311265 (IsCertificateError(result) && IsCertStatusMinorError(cert_status)))) {
rsleevi4a6ca8c2016-06-24 03:05:221266 int ct_result = VerifyCT();
dadrian8f8946652016-06-21 23:48:311267 TransportSecurityState::PKPStatus pin_validity =
1268 transport_security_state_->CheckPublicKeyPins(
1269 host_and_port_, server_cert_verify_result_.is_issued_by_known_root,
1270 server_cert_verify_result_.public_key_hashes, server_cert_.get(),
1271 server_cert_verify_result_.verified_cert.get(),
1272 TransportSecurityState::ENABLE_PIN_REPORTS, &pinning_failure_log_);
1273 switch (pin_validity) {
1274 case TransportSecurityState::PKPStatus::VIOLATED:
1275 server_cert_verify_result_.cert_status |=
1276 CERT_STATUS_PINNED_KEY_MISSING;
1277 result = ERR_SSL_PINNED_KEY_NOT_IN_CERT_CHAIN;
1278 break;
1279 case TransportSecurityState::PKPStatus::BYPASSED:
1280 pkp_bypassed_ = true;
1281 // Fall through.
1282 case TransportSecurityState::PKPStatus::OK:
1283 // Do nothing.
1284 break;
rsleevi9545d342016-06-21 03:17:371285 }
rsleevi4a6ca8c2016-06-24 03:05:221286 if (result != ERR_SSL_PINNED_KEY_NOT_IN_CERT_CHAIN && ct_result != OK)
1287 result = ct_result;
[email protected]8bd4e7a2014-08-09 14:49:171288 }
1289
[email protected]b9b651f2013-11-09 04:32:221290 if (result == OK) {
davidbendafe4e52015-04-08 22:53:521291 DCHECK(!certificate_verified_);
1292 certificate_verified_ = true;
1293 MaybeCacheSession();
dadriand476e652016-07-26 21:33:241294 SSLInfo ssl_info;
1295 bool ok = GetSSLInfo(&ssl_info);
1296 DCHECK(ok);
rsleevi22cae1672016-12-28 01:53:361297
1298 const uint8_t* ocsp_response_raw;
1299 size_t ocsp_response_len;
1300 SSL_get0_ocsp_response(ssl_.get(), &ocsp_response_raw, &ocsp_response_len);
1301 base::StringPiece ocsp_response(
1302 reinterpret_cast<const char*>(ocsp_response_raw), ocsp_response_len);
1303
dadriand476e652016-07-26 21:33:241304 transport_security_state_->CheckExpectStaple(host_and_port_, ssl_info,
rsleevi22cae1672016-12-28 01:53:361305 ocsp_response);
[email protected]b9b651f2013-11-09 04:32:221306 }
1307
[email protected]64b5c892014-08-08 09:39:261308 completed_connect_ = true;
[email protected]b9b651f2013-11-09 04:32:221309 // Exit DoHandshakeLoop and return the result to the caller to Connect.
1310 DCHECK_EQ(STATE_NONE, next_handshake_state_);
1311 return result;
1312}
1313
svaldeze83af292016-04-26 14:33:371314void SSLClientSocketImpl::DoConnectCallback(int rv) {
[email protected]b9b651f2013-11-09 04:32:221315 if (!user_connect_callback_.is_null()) {
1316 CompletionCallback c = user_connect_callback_;
1317 user_connect_callback_.Reset();
1318 c.Run(rv > OK ? OK : rv);
1319 }
1320}
1321
svaldeze83af292016-04-26 14:33:371322void SSLClientSocketImpl::OnHandshakeIOComplete(int result) {
[email protected]b9b651f2013-11-09 04:32:221323 int rv = DoHandshakeLoop(result);
1324 if (rv != ERR_IO_PENDING) {
davidben281d13f02016-04-27 20:43:281325 LogConnectEndEvent(rv);
[email protected]b9b651f2013-11-09 04:32:221326 DoConnectCallback(rv);
1327 }
1328}
1329
svaldeze83af292016-04-26 14:33:371330int SSLClientSocketImpl::DoHandshakeLoop(int last_io_result) {
xunjieli0b7f5b62016-12-06 20:43:481331 TRACE_EVENT0(kNetTracingCategory, "SSLClientSocketImpl::DoHandshakeLoop");
[email protected]b9b651f2013-11-09 04:32:221332 int rv = last_io_result;
1333 do {
1334 // Default to STATE_NONE for next state.
1335 // (This is a quirk carried over from the windows
1336 // implementation. It makes reading the logs a bit harder.)
1337 // State handlers can and often do call GotoState just
1338 // to stay in the current state.
1339 State state = next_handshake_state_;
rsleeviadbd4982016-06-13 22:10:271340 next_handshake_state_ = STATE_NONE;
[email protected]b9b651f2013-11-09 04:32:221341 switch (state) {
1342 case STATE_HANDSHAKE:
1343 rv = DoHandshake();
1344 break;
davidbenc4212c02015-05-12 22:30:181345 case STATE_HANDSHAKE_COMPLETE:
1346 rv = DoHandshakeComplete(rv);
1347 break;
[email protected]faff9852014-06-21 06:13:461348 case STATE_CHANNEL_ID_LOOKUP:
1349 DCHECK_EQ(OK, rv);
1350 rv = DoChannelIDLookup();
svaldeze83af292016-04-26 14:33:371351 break;
[email protected]faff9852014-06-21 06:13:461352 case STATE_CHANNEL_ID_LOOKUP_COMPLETE:
1353 rv = DoChannelIDLookupComplete(rv);
1354 break;
[email protected]b9b651f2013-11-09 04:32:221355 case STATE_VERIFY_CERT:
[email protected]faff9852014-06-21 06:13:461356 DCHECK_EQ(OK, rv);
[email protected]b9b651f2013-11-09 04:32:221357 rv = DoVerifyCert(rv);
svaldeze83af292016-04-26 14:33:371358 break;
[email protected]b9b651f2013-11-09 04:32:221359 case STATE_VERIFY_CERT_COMPLETE:
1360 rv = DoVerifyCertComplete(rv);
1361 break;
1362 case STATE_NONE:
1363 default:
1364 rv = ERR_UNEXPECTED;
1365 NOTREACHED() << "unexpected state" << state;
1366 break;
1367 }
[email protected]b9b651f2013-11-09 04:32:221368 } while (rv != ERR_IO_PENDING && next_handshake_state_ != STATE_NONE);
1369 return rv;
1370}
1371
xunjieli321a96f32017-03-07 19:42:171372int SSLClientSocketImpl::DoPayloadRead(IOBuffer* buf, int buf_len) {
[email protected]b9b651f2013-11-09 04:32:221373 crypto::OpenSSLErrStackTracer err_tracer(FROM_HERE);
1374
xunjieli321a96f32017-03-07 19:42:171375 DCHECK_LT(0, buf_len);
1376 DCHECK(buf);
davidben7e555daf2015-03-25 17:03:291377
[email protected]b9b651f2013-11-09 04:32:221378 int rv;
davidben1d489522015-07-01 18:48:461379 if (pending_read_error_ != kNoPendingResult) {
[email protected]b9b651f2013-11-09 04:32:221380 rv = pending_read_error_;
davidben1d489522015-07-01 18:48:461381 pending_read_error_ = kNoPendingResult;
[email protected]b9b651f2013-11-09 04:32:221382 if (rv == 0) {
mikecirone8b85c432016-09-08 19:11:001383 net_log_.AddByteTransferEvent(NetLogEventType::SSL_SOCKET_BYTES_RECEIVED,
xunjieli321a96f32017-03-07 19:42:171384 rv, buf->data());
davidbenb8c23212014-10-28 00:12:161385 } else {
1386 net_log_.AddEvent(
mikecirone8b85c432016-09-08 19:11:001387 NetLogEventType::SSL_READ_ERROR,
davidbenb8c23212014-10-28 00:12:161388 CreateNetLogOpenSSLErrorCallback(rv, pending_read_ssl_error_,
1389 pending_read_error_info_));
[email protected]b9b651f2013-11-09 04:32:221390 }
davidbenb8c23212014-10-28 00:12:161391 pending_read_ssl_error_ = SSL_ERROR_NONE;
1392 pending_read_error_info_ = OpenSSLErrorInfo();
[email protected]b9b651f2013-11-09 04:32:221393 return rv;
1394 }
1395
1396 int total_bytes_read = 0;
davidben7e555daf2015-03-25 17:03:291397 int ssl_ret;
[email protected]b9b651f2013-11-09 04:32:221398 do {
xunjieli321a96f32017-03-07 19:42:171399 ssl_ret = SSL_read(ssl_.get(), buf->data() + total_bytes_read,
1400 buf_len - total_bytes_read);
davidben7e555daf2015-03-25 17:03:291401 if (ssl_ret > 0)
1402 total_bytes_read += ssl_ret;
xunjieli321a96f32017-03-07 19:42:171403 } while (total_bytes_read < buf_len && ssl_ret > 0);
[email protected]b9b651f2013-11-09 04:32:221404
davidben7e555daf2015-03-25 17:03:291405 // Although only the final SSL_read call may have failed, the failure needs to
1406 // processed immediately, while the information still available in OpenSSL's
1407 // error queue.
davidbenced4aa9b2015-05-12 21:22:351408 if (ssl_ret <= 0) {
davidben7e555daf2015-03-25 17:03:291409 // A zero return from SSL_read may mean any of:
1410 // - The underlying BIO_read returned 0.
1411 // - The peer sent a close_notify.
1412 // - Any arbitrary error. https://crbug.com/466303
[email protected]b9b651f2013-11-09 04:32:221413 //
davidben7e555daf2015-03-25 17:03:291414 // TransportReadComplete converts the first to an ERR_CONNECTION_CLOSED
1415 // error, so it does not occur. The second and third are distinguished by
1416 // SSL_ERROR_ZERO_RETURN.
davidbend80c12c2016-10-11 00:13:491417 pending_read_ssl_error_ = SSL_get_error(ssl_.get(), ssl_ret);
davidben7e555daf2015-03-25 17:03:291418 if (pending_read_ssl_error_ == SSL_ERROR_ZERO_RETURN) {
1419 pending_read_error_ = 0;
davidbenced4aa9b2015-05-12 21:22:351420 } else if (pending_read_ssl_error_ == SSL_ERROR_WANT_X509_LOOKUP &&
1421 !ssl_config_.send_client_cert) {
1422 pending_read_error_ = ERR_SSL_CLIENT_AUTH_CERT_NEEDED;
davidben1d489522015-07-01 18:48:461423 } else if (pending_read_ssl_error_ ==
1424 SSL_ERROR_WANT_PRIVATE_KEY_OPERATION) {
svaldez7872fd02015-11-19 21:10:541425 DCHECK(ssl_config_.client_private_key);
davidben1d489522015-07-01 18:48:461426 DCHECK_NE(kNoPendingResult, signature_result_);
1427 pending_read_error_ = ERR_IO_PENDING;
davidben7e555daf2015-03-25 17:03:291428 } else {
davidbenfe132d92016-09-27 18:07:211429 pending_read_error_ = MapLastOpenSSLError(
davidben7e555daf2015-03-25 17:03:291430 pending_read_ssl_error_, err_tracer, &pending_read_error_info_);
[email protected]b9b651f2013-11-09 04:32:221431 }
1432
davidben7e555daf2015-03-25 17:03:291433 // Many servers do not reliably send a close_notify alert when shutting down
1434 // a connection, and instead terminate the TCP connection. This is reported
1435 // as ERR_CONNECTION_CLOSED. Because of this, map the unclean shutdown to a
1436 // graceful EOF, instead of treating it as an error as it should be.
1437 if (pending_read_error_ == ERR_CONNECTION_CLOSED)
1438 pending_read_error_ = 0;
1439 }
davidbenbe6ce7ec2014-10-20 19:15:561440
davidben7e555daf2015-03-25 17:03:291441 if (total_bytes_read > 0) {
1442 // Return any bytes read to the caller. The error will be deferred to the
1443 // next call of DoPayloadRead.
1444 rv = total_bytes_read;
davidbenbe6ce7ec2014-10-20 19:15:561445
davidben7e555daf2015-03-25 17:03:291446 // Do not treat insufficient data as an error to return in the next call to
1447 // DoPayloadRead() - instead, let the call fall through to check SSL_read()
davidben3418e81f2016-10-19 00:09:451448 // again. The transport may have data available by then.
davidben7e555daf2015-03-25 17:03:291449 if (pending_read_error_ == ERR_IO_PENDING)
davidben1d489522015-07-01 18:48:461450 pending_read_error_ = kNoPendingResult;
davidben7e555daf2015-03-25 17:03:291451 } else {
1452 // No bytes were returned. Return the pending read error immediately.
davidben1d489522015-07-01 18:48:461453 DCHECK_NE(kNoPendingResult, pending_read_error_);
davidben7e555daf2015-03-25 17:03:291454 rv = pending_read_error_;
davidben1d489522015-07-01 18:48:461455 pending_read_error_ = kNoPendingResult;
[email protected]b9b651f2013-11-09 04:32:221456 }
1457
1458 if (rv >= 0) {
mikecirone8b85c432016-09-08 19:11:001459 net_log_.AddByteTransferEvent(NetLogEventType::SSL_SOCKET_BYTES_RECEIVED,
xunjieli321a96f32017-03-07 19:42:171460 rv, buf->data());
davidbenb8c23212014-10-28 00:12:161461 } else if (rv != ERR_IO_PENDING) {
1462 net_log_.AddEvent(
mikecirone8b85c432016-09-08 19:11:001463 NetLogEventType::SSL_READ_ERROR,
davidbenb8c23212014-10-28 00:12:161464 CreateNetLogOpenSSLErrorCallback(rv, pending_read_ssl_error_,
1465 pending_read_error_info_));
1466 pending_read_ssl_error_ = SSL_ERROR_NONE;
1467 pending_read_error_info_ = OpenSSLErrorInfo();
[email protected]b9b651f2013-11-09 04:32:221468 }
1469 return rv;
1470}
1471
svaldeze83af292016-04-26 14:33:371472int SSLClientSocketImpl::DoPayloadWrite() {
[email protected]b9b651f2013-11-09 04:32:221473 crypto::OpenSSLErrStackTracer err_tracer(FROM_HERE);
davidbend80c12c2016-10-11 00:13:491474 int rv = SSL_write(ssl_.get(), user_write_buf_->data(), user_write_buf_len_);
rsleevif020edc2015-03-16 19:31:241475
[email protected]b9b651f2013-11-09 04:32:221476 if (rv >= 0) {
mikecirone8b85c432016-09-08 19:11:001477 net_log_.AddByteTransferEvent(NetLogEventType::SSL_SOCKET_BYTES_SENT, rv,
[email protected]b9b651f2013-11-09 04:32:221478 user_write_buf_->data());
1479 return rv;
1480 }
1481
davidbend80c12c2016-10-11 00:13:491482 int ssl_error = SSL_get_error(ssl_.get(), rv);
davidben1d489522015-07-01 18:48:461483 if (ssl_error == SSL_ERROR_WANT_PRIVATE_KEY_OPERATION)
1484 return ERR_IO_PENDING;
davidbenb8c23212014-10-28 00:12:161485 OpenSSLErrorInfo error_info;
davidbenfe132d92016-09-27 18:07:211486 int net_error = MapLastOpenSSLError(ssl_error, err_tracer, &error_info);
davidbenb8c23212014-10-28 00:12:161487
1488 if (net_error != ERR_IO_PENDING) {
1489 net_log_.AddEvent(
mikecirone8b85c432016-09-08 19:11:001490 NetLogEventType::SSL_WRITE_ERROR,
davidbenb8c23212014-10-28 00:12:161491 CreateNetLogOpenSSLErrorCallback(net_error, ssl_error, error_info));
1492 }
1493 return net_error;
[email protected]b9b651f2013-11-09 04:32:221494}
1495
davidben3418e81f2016-10-19 00:09:451496void SSLClientSocketImpl::RetryAllOperations() {
1497 // SSL_do_handshake, SSL_read, and SSL_write may all be retried when blocked,
1498 // so retry all operations for simplicity. (Otherwise, SSL_get_error for each
1499 // operation may be remembered to retry only the blocked ones.)
1500
1501 if (next_handshake_state_ == STATE_HANDSHAKE) {
1502 // In handshake phase. The parameter to OnHandshakeIOComplete is unused.
1503 OnHandshakeIOComplete(OK);
1504 return;
1505 }
1506
davidben1d489522015-07-01 18:48:461507 int rv_read = ERR_IO_PENDING;
1508 int rv_write = ERR_IO_PENDING;
xunjieli321a96f32017-03-07 19:42:171509 if (user_read_buf_) {
1510 rv_read = DoPayloadRead(user_read_buf_.get(), user_read_buf_len_);
1511 } else if (!user_read_callback_.is_null()) {
1512 // ReadIfReady() is called by the user. Skip DoPayloadRead() and just let
1513 // the user know that read can be retried.
1514 rv_read = OK;
1515 }
1516
davidben3418e81f2016-10-19 00:09:451517 if (user_write_buf_)
1518 rv_write = DoPayloadWrite();
davidben1d489522015-07-01 18:48:461519
1520 // Performing the Read callback may cause |this| to be deleted. If this
1521 // happens, the Write callback should not be invoked. Guard against this by
1522 // holding a WeakPtr to |this| and ensuring it's still valid.
svaldeze83af292016-04-26 14:33:371523 base::WeakPtr<SSLClientSocketImpl> guard(weak_factory_.GetWeakPtr());
davidben3418e81f2016-10-19 00:09:451524 if (rv_read != ERR_IO_PENDING)
davidben1d489522015-07-01 18:48:461525 DoReadCallback(rv_read);
1526
1527 if (!guard.get())
1528 return;
1529
davidben3418e81f2016-10-19 00:09:451530 if (rv_write != ERR_IO_PENDING)
davidben1d489522015-07-01 18:48:461531 DoWriteCallback(rv_write);
1532}
1533
rsleevi4a6ca8c2016-06-24 03:05:221534int SSLClientSocketImpl::VerifyCT() {
rsleevi4a6ca8c2016-06-24 03:05:221535 const uint8_t* sct_list_raw;
1536 size_t sct_list_len;
davidbend80c12c2016-10-11 00:13:491537 SSL_get0_signed_cert_timestamp_list(ssl_.get(), &sct_list_raw, &sct_list_len);
rsleevi22cae1672016-12-28 01:53:361538 base::StringPiece sct_list(reinterpret_cast<const char*>(sct_list_raw),
1539 sct_list_len);
1540
1541 const uint8_t* ocsp_response_raw;
1542 size_t ocsp_response_len;
1543 SSL_get0_ocsp_response(ssl_.get(), &ocsp_response_raw, &ocsp_response_len);
1544 base::StringPiece ocsp_response(
1545 reinterpret_cast<const char*>(ocsp_response_raw), ocsp_response_len);
rsleevi4a6ca8c2016-06-24 03:05:221546
1547 // Note that this is a completely synchronous operation: The CT Log Verifier
1548 // gets all the data it needs for SCT verification and does not do any
1549 // external communication.
1550 cert_transparency_verifier_->Verify(
rsleevi22cae1672016-12-28 01:53:361551 server_cert_verify_result_.verified_cert.get(), ocsp_response, sct_list,
eranmdcec9632016-10-10 14:16:101552 &ct_verify_result_.scts, net_log_);
rsleevi4a6ca8c2016-06-24 03:05:221553
1554 ct_verify_result_.ct_policies_applied = true;
1555 ct_verify_result_.ev_policy_compliance =
1556 ct::EVPolicyCompliance::EV_POLICY_DOES_NOT_APPLY;
eranm4bed0b572016-08-14 21:00:351557
1558 SCTList verified_scts =
1559 ct::SCTsMatchingStatus(ct_verify_result_.scts, ct::SCT_STATUS_OK);
1560
rsleevi4a6ca8c2016-06-24 03:05:221561 if (server_cert_verify_result_.cert_status & CERT_STATUS_IS_EV) {
1562 scoped_refptr<ct::EVCertsWhitelist> ev_whitelist =
1563 SSLConfigService::GetEVCertsWhitelist();
1564 ct::EVPolicyCompliance ev_policy_compliance =
1565 policy_enforcer_->DoesConformToCTEVPolicy(
1566 server_cert_verify_result_.verified_cert.get(), ev_whitelist.get(),
eranm4bed0b572016-08-14 21:00:351567 verified_scts, net_log_);
rsleevi4a6ca8c2016-06-24 03:05:221568 ct_verify_result_.ev_policy_compliance = ev_policy_compliance;
1569 if (ev_policy_compliance !=
1570 ct::EVPolicyCompliance::EV_POLICY_DOES_NOT_APPLY &&
1571 ev_policy_compliance !=
1572 ct::EVPolicyCompliance::EV_POLICY_COMPLIES_VIA_WHITELIST &&
1573 ev_policy_compliance !=
1574 ct::EVPolicyCompliance::EV_POLICY_COMPLIES_VIA_SCTS) {
1575 server_cert_verify_result_.cert_status |=
1576 CERT_STATUS_CT_COMPLIANCE_FAILED;
1577 server_cert_verify_result_.cert_status &= ~CERT_STATUS_IS_EV;
1578 }
1579 }
1580 ct_verify_result_.cert_policy_compliance =
1581 policy_enforcer_->DoesConformToCertPolicy(
eranm4bed0b572016-08-14 21:00:351582 server_cert_verify_result_.verified_cert.get(), verified_scts,
1583 net_log_);
rsleevi4a6ca8c2016-06-24 03:05:221584
1585 if (ct_verify_result_.cert_policy_compliance !=
1586 ct::CertPolicyCompliance::CERT_POLICY_COMPLIES_VIA_SCTS &&
rsleeviec8e4312016-11-12 00:32:281587 ct_verify_result_.cert_policy_compliance !=
1588 ct::CertPolicyCompliance::CERT_POLICY_BUILD_NOT_TIMELY &&
rsleevi4a6ca8c2016-06-24 03:05:221589 transport_security_state_->ShouldRequireCT(
1590 host_and_port_.host(), server_cert_verify_result_.verified_cert.get(),
1591 server_cert_verify_result_.public_key_hashes)) {
1592 server_cert_verify_result_.cert_status |=
1593 CERT_STATUS_CERTIFICATE_TRANSPARENCY_REQUIRED;
1594 return ERR_CERTIFICATE_TRANSPARENCY_REQUIRED;
1595 }
1596
1597 return OK;
1598}
1599
svaldeze83af292016-04-26 14:33:371600int SSLClientSocketImpl::ClientCertRequestCallback(SSL* ssl) {
davidbend80c12c2016-10-11 00:13:491601 DCHECK(ssl == ssl_.get());
[email protected]82c59022014-08-15 09:38:271602
mikecirone8b85c432016-09-08 19:11:001603 net_log_.AddEvent(NetLogEventType::SSL_CLIENT_CERT_REQUESTED);
davidbenfe132d92016-09-27 18:07:211604 certificate_requested_ = true;
davidbenaf42cbe2014-11-13 03:27:461605
[email protected]82c59022014-08-15 09:38:271606 // Clear any currently configured certificates.
davidbend80c12c2016-10-11 00:13:491607 SSL_certs_clear(ssl_.get());
[email protected]97a854f2014-07-29 07:51:361608
1609#if defined(OS_IOS)
1610 // TODO(droger): Support client auth on iOS. See http://crbug.com/145954).
1611 LOG(WARNING) << "Client auth is not supported";
svaldeze83af292016-04-26 14:33:371612#else // !defined(OS_IOS)
[email protected]5ac981e182010-12-06 17:56:271613 if (!ssl_config_.send_client_cert) {
[email protected]515adc22013-01-09 16:01:231614 // First pass: we know that a client certificate is needed, but we do not
davidbenb11fd212017-01-12 17:08:031615 // have one at hand. Suspend the handshake. SSL_get_error will return
1616 // SSL_ERROR_WANT_X509_LOOKUP.
davidbenced4aa9b2015-05-12 21:22:351617 return -1;
[email protected]5ac981e182010-12-06 17:56:271618 }
1619
1620 // Second pass: a client certificate should have been selected.
[email protected]13914c92013-06-13 22:42:421621 if (ssl_config_.client_cert.get()) {
davidbend80c12c2016-10-11 00:13:491622 bssl::UniquePtr<X509> leaf_x509 =
[email protected]6bad5052014-07-12 01:25:131623 OSCertHandleToOpenSSL(ssl_config_.client_cert->os_cert_handle());
1624 if (!leaf_x509) {
1625 LOG(WARNING) << "Failed to import certificate";
1626 OpenSSLPutNetError(FROM_HERE, ERR_SSL_CLIENT_AUTH_CERT_BAD_FORMAT);
1627 return -1;
1628 }
1629
davidbend80c12c2016-10-11 00:13:491630 bssl::UniquePtr<STACK_OF(X509)> chain = OSCertHandlesToOpenSSL(
[email protected]82c59022014-08-15 09:38:271631 ssl_config_.client_cert->GetIntermediateCertificates());
1632 if (!chain) {
1633 LOG(WARNING) << "Failed to import intermediate certificates";
1634 OpenSSLPutNetError(FROM_HERE, ERR_SSL_CLIENT_AUTH_CERT_BAD_FORMAT);
1635 return -1;
1636 }
1637
davidbend80c12c2016-10-11 00:13:491638 if (!SSL_use_certificate(ssl_.get(), leaf_x509.get()) ||
1639 !SSL_set1_chain(ssl_.get(), chain.get())) {
davidben1d489522015-07-01 18:48:461640 LOG(WARNING) << "Failed to set client certificate";
1641 return -1;
1642 }
1643
svaldez7872fd02015-11-19 21:10:541644 if (!ssl_config_.client_private_key) {
1645 // The caller supplied a null private key. Fail the handshake and surface
1646 // an appropriate error to the caller.
davidben1d489522015-07-01 18:48:461647 LOG(WARNING) << "Client cert found without private key";
1648 OpenSSLPutNetError(FROM_HERE, ERR_SSL_CLIENT_AUTH_CERT_NO_PRIVATE_KEY);
1649 return -1;
1650 }
1651
davidbend80c12c2016-10-11 00:13:491652 SSL_set_private_key_method(ssl_.get(), &SSLContext::kPrivateKeyMethod);
svaldezf3db006f2015-09-29 16:43:581653
1654 std::vector<SSLPrivateKey::Hash> digest_prefs =
svaldez7872fd02015-11-19 21:10:541655 ssl_config_.client_private_key->GetDigestPreferences();
svaldezf3db006f2015-09-29 16:43:581656
1657 size_t digests_len = digest_prefs.size();
1658 std::vector<int> digests;
1659 for (size_t i = 0; i < digests_len; i++) {
1660 switch (digest_prefs[i]) {
1661 case SSLPrivateKey::Hash::SHA1:
1662 digests.push_back(NID_sha1);
1663 break;
1664 case SSLPrivateKey::Hash::SHA256:
1665 digests.push_back(NID_sha256);
1666 break;
1667 case SSLPrivateKey::Hash::SHA384:
1668 digests.push_back(NID_sha384);
1669 break;
1670 case SSLPrivateKey::Hash::SHA512:
1671 digests.push_back(NID_sha512);
1672 break;
1673 case SSLPrivateKey::Hash::MD5_SHA1:
1674 // MD5-SHA1 is not used in TLS 1.2.
1675 break;
1676 }
1677 }
1678
davidbend80c12c2016-10-11 00:13:491679 SSL_set_private_key_digest_prefs(ssl_.get(), digests.data(),
1680 digests.size());
davidbenaf42cbe2014-11-13 03:27:461681
1682 int cert_count = 1 + sk_X509_num(chain.get());
mikecirone8b85c432016-09-08 19:11:001683 net_log_.AddEvent(NetLogEventType::SSL_CLIENT_CERT_PROVIDED,
tfarina5e24b242015-10-27 13:11:281684 NetLog::IntCallback("cert_count", cert_count));
[email protected]6bad5052014-07-12 01:25:131685 return 1;
[email protected]c0787702014-05-20 21:51:441686 }
[email protected]97a854f2014-07-29 07:51:361687#endif // defined(OS_IOS)
[email protected]5ac981e182010-12-06 17:56:271688
1689 // Send no client certificate.
mikecirone8b85c432016-09-08 19:11:001690 net_log_.AddEvent(NetLogEventType::SSL_CLIENT_CERT_PROVIDED,
tfarina5e24b242015-10-27 13:11:281691 NetLog::IntCallback("cert_count", 0));
[email protected]82c59022014-08-15 09:38:271692 return 1;
[email protected]5ac981e182010-12-06 17:56:271693}
1694
svaldeze83af292016-04-26 14:33:371695int SSLClientSocketImpl::CertVerifyCallback(X509_STORE_CTX* store_ctx) {
davidbenc7e06c92017-03-07 18:54:111696 // The server certificate is verified later in DoVerifyCert.
davidben30798ed82014-09-19 19:28:201697 return 1;
[email protected]b051cdb62014-02-28 02:20:161698}
1699
svaldeze83af292016-04-26 14:33:371700void SSLClientSocketImpl::MaybeCacheSession() {
davidben44aeae62015-06-24 20:47:431701 // Only cache the session once both a new session has been established and the
1702 // certificate has been verified. Due to False Start, these events may happen
1703 // in either order.
davidbenc269cc4b2016-07-27 14:55:031704 if (!pending_session_ || !certificate_verified_)
davidbendafe4e52015-04-08 22:53:521705 return;
davidbendafe4e52015-04-08 22:53:521706
1707 SSLContext::GetInstance()->session_cache()->Insert(GetSessionCacheKey(),
davidbenc269cc4b2016-07-27 14:55:031708 pending_session_.get());
1709 pending_session_ = nullptr;
davidbendafe4e52015-04-08 22:53:521710}
1711
svaldeze83af292016-04-26 14:33:371712int SSLClientSocketImpl::NewSessionCallback(SSL_SESSION* session) {
davidbenc269cc4b2016-07-27 14:55:031713 // OpenSSL passes a reference to |session|.
1714 pending_session_.reset(session);
davidbendafe4e52015-04-08 22:53:521715 MaybeCacheSession();
davidben44aeae62015-06-24 20:47:431716 return 1;
davidbendafe4e52015-04-08 22:53:521717}
1718
svaldeze83af292016-04-26 14:33:371719void SSLClientSocketImpl::AddCTInfoToSSLInfo(SSLInfo* ssl_info) const {
estark723b5eeb2016-02-18 21:01:121720 ssl_info->UpdateCertificateTransparencyInfo(ct_verify_result_);
davidbeneb5f8ef32014-09-04 14:14:321721}
1722
svaldeze83af292016-04-26 14:33:371723std::string SSLClientSocketImpl::GetSessionCacheKey() const {
rsleevif020edc2015-03-16 19:31:241724 std::string result = host_and_port_.ToString();
1725 result.append("/");
1726 result.append(ssl_session_cache_shard_);
1727
davidbena4c9d062015-04-03 22:34:251728 result.append("/");
davidben14b1a532015-10-30 16:01:091729 if (ssl_config_.deprecated_cipher_suites_enabled)
davidbena4c9d062015-04-03 22:34:251730 result.append("deprecated");
1731
davidbenee39de02015-10-16 19:53:181732 result.append("/");
1733 if (ssl_config_.channel_id_enabled)
1734 result.append("channelid");
1735
rsleevif020edc2015-03-16 19:31:241736 return result;
1737}
1738
svaldeze83af292016-04-26 14:33:371739bool SSLClientSocketImpl::IsRenegotiationAllowed() const {
nharper736ceda2015-11-07 00:16:591740 if (tb_was_negotiated_)
1741 return false;
1742
bncce6ea242016-09-15 20:22:321743 if (negotiated_protocol_ == kProtoUnknown)
davidben421116c2015-05-12 19:56:511744 return ssl_config_.renego_allowed_default;
1745
davidben421116c2015-05-12 19:56:511746 for (NextProto allowed : ssl_config_.renego_allowed_for_protos) {
bnc3cf2a592016-08-11 14:48:361747 if (negotiated_protocol_ == allowed)
davidben421116c2015-05-12 19:56:511748 return true;
1749 }
1750 return false;
1751}
1752
svaldeze83af292016-04-26 14:33:371753int SSLClientSocketImpl::PrivateKeyTypeCallback() {
svaldez7872fd02015-11-19 21:10:541754 switch (ssl_config_.client_private_key->GetType()) {
davidben1d489522015-07-01 18:48:461755 case SSLPrivateKey::Type::RSA:
davidben1c09a432016-10-13 19:17:341756 return NID_rsaEncryption;
1757 case SSLPrivateKey::Type::ECDSA_P256:
1758 return NID_X9_62_prime256v1;
1759 case SSLPrivateKey::Type::ECDSA_P384:
1760 return NID_secp384r1;
1761 case SSLPrivateKey::Type::ECDSA_P521:
1762 return NID_secp521r1;
davidben1d489522015-07-01 18:48:461763 }
1764 NOTREACHED();
davidben1c09a432016-10-13 19:17:341765 return NID_undef;
davidben1d489522015-07-01 18:48:461766}
1767
svaldeze83af292016-04-26 14:33:371768size_t SSLClientSocketImpl::PrivateKeyMaxSignatureLenCallback() {
svaldez7872fd02015-11-19 21:10:541769 return ssl_config_.client_private_key->GetMaxSignatureLengthInBytes();
davidben1d489522015-07-01 18:48:461770}
1771
davidben0bca07fd2016-07-18 15:12:031772ssl_private_key_result_t SSLClientSocketImpl::PrivateKeySignDigestCallback(
davidben1d489522015-07-01 18:48:461773 uint8_t* out,
1774 size_t* out_len,
1775 size_t max_out,
1776 const EVP_MD* md,
1777 const uint8_t* in,
1778 size_t in_len) {
1779 DCHECK_EQ(kNoPendingResult, signature_result_);
1780 DCHECK(signature_.empty());
svaldez7872fd02015-11-19 21:10:541781 DCHECK(ssl_config_.client_private_key);
davidben1d489522015-07-01 18:48:461782
davidben1d489522015-07-01 18:48:461783 SSLPrivateKey::Hash hash;
1784 if (!EVP_MDToPrivateKeyHash(md, &hash)) {
1785 OpenSSLPutNetError(FROM_HERE, ERR_SSL_CLIENT_AUTH_SIGNATURE_FAILED);
1786 return ssl_private_key_failure;
1787 }
1788
davidben752bcf22015-12-21 22:55:501789 net_log_.BeginEvent(
mikecirone8b85c432016-09-08 19:11:001790 NetLogEventType::SSL_PRIVATE_KEY_OP,
davidben752bcf22015-12-21 22:55:501791 base::Bind(&NetLogPrivateKeyOperationCallback,
1792 ssl_config_.client_private_key->GetType(), hash));
1793
davidben1d489522015-07-01 18:48:461794 signature_result_ = ERR_IO_PENDING;
svaldez7872fd02015-11-19 21:10:541795 ssl_config_.client_private_key->SignDigest(
davidben1d489522015-07-01 18:48:461796 hash, base::StringPiece(reinterpret_cast<const char*>(in), in_len),
davidben0bca07fd2016-07-18 15:12:031797 base::Bind(&SSLClientSocketImpl::OnPrivateKeyComplete,
davidben1d489522015-07-01 18:48:461798 weak_factory_.GetWeakPtr()));
1799 return ssl_private_key_retry;
1800}
1801
davidben0bca07fd2016-07-18 15:12:031802ssl_private_key_result_t SSLClientSocketImpl::PrivateKeyCompleteCallback(
davidben1d489522015-07-01 18:48:461803 uint8_t* out,
1804 size_t* out_len,
1805 size_t max_out) {
1806 DCHECK_NE(kNoPendingResult, signature_result_);
svaldez7872fd02015-11-19 21:10:541807 DCHECK(ssl_config_.client_private_key);
davidben1d489522015-07-01 18:48:461808
1809 if (signature_result_ == ERR_IO_PENDING)
1810 return ssl_private_key_retry;
1811 if (signature_result_ != OK) {
1812 OpenSSLPutNetError(FROM_HERE, signature_result_);
1813 return ssl_private_key_failure;
1814 }
1815 if (signature_.size() > max_out) {
1816 OpenSSLPutNetError(FROM_HERE, ERR_SSL_CLIENT_AUTH_SIGNATURE_FAILED);
1817 return ssl_private_key_failure;
1818 }
davidben5f8b6bc2015-11-25 03:19:541819 memcpy(out, signature_.data(), signature_.size());
davidben1d489522015-07-01 18:48:461820 *out_len = signature_.size();
1821 signature_.clear();
1822 return ssl_private_key_success;
1823}
1824
davidben0bca07fd2016-07-18 15:12:031825void SSLClientSocketImpl::OnPrivateKeyComplete(
davidben1d489522015-07-01 18:48:461826 Error error,
1827 const std::vector<uint8_t>& signature) {
1828 DCHECK_EQ(ERR_IO_PENDING, signature_result_);
1829 DCHECK(signature_.empty());
svaldez7872fd02015-11-19 21:10:541830 DCHECK(ssl_config_.client_private_key);
davidben1d489522015-07-01 18:48:461831
mikecirone8b85c432016-09-08 19:11:001832 net_log_.EndEventWithNetErrorCode(NetLogEventType::SSL_PRIVATE_KEY_OP, error);
davidben1d489522015-07-01 18:48:461833
1834 signature_result_ = error;
1835 if (signature_result_ == OK)
1836 signature_ = signature;
1837
davidben1d489522015-07-01 18:48:461838 // During a renegotiation, either Read or Write calls may be blocked on an
1839 // asynchronous private key operation.
davidben3418e81f2016-10-19 00:09:451840 RetryAllOperations();
davidben1d489522015-07-01 18:48:461841}
1842
svaldeze83af292016-04-26 14:33:371843int SSLClientSocketImpl::TokenBindingAdd(const uint8_t** out,
1844 size_t* out_len,
1845 int* out_alert_value) {
nharper736ceda2015-11-07 00:16:591846 if (ssl_config_.token_binding_params.empty()) {
1847 return 0;
1848 }
davidbend80c12c2016-10-11 00:13:491849 bssl::ScopedCBB output;
nharper736ceda2015-11-07 00:16:591850 CBB parameters_list;
1851 if (!CBB_init(output.get(), 7) ||
1852 !CBB_add_u8(output.get(), kTbProtocolVersionMajor) ||
1853 !CBB_add_u8(output.get(), kTbProtocolVersionMinor) ||
1854 !CBB_add_u8_length_prefixed(output.get(), &parameters_list)) {
1855 *out_alert_value = SSL_AD_INTERNAL_ERROR;
1856 return -1;
1857 }
1858 for (size_t i = 0; i < ssl_config_.token_binding_params.size(); ++i) {
1859 if (!CBB_add_u8(&parameters_list, ssl_config_.token_binding_params[i])) {
1860 *out_alert_value = SSL_AD_INTERNAL_ERROR;
1861 return -1;
1862 }
1863 }
1864 // |*out| will be freed by TokenBindingFreeCallback.
1865 if (!CBB_finish(output.get(), const_cast<uint8_t**>(out), out_len)) {
1866 *out_alert_value = SSL_AD_INTERNAL_ERROR;
1867 return -1;
1868 }
1869
1870 return 1;
1871}
1872
svaldeze83af292016-04-26 14:33:371873int SSLClientSocketImpl::TokenBindingParse(const uint8_t* contents,
1874 size_t contents_len,
1875 int* out_alert_value) {
nharper736ceda2015-11-07 00:16:591876 if (completed_connect_) {
1877 // Token Binding may only be negotiated on the initial handshake.
1878 *out_alert_value = SSL_AD_ILLEGAL_PARAMETER;
1879 return 0;
1880 }
1881
1882 CBS extension;
1883 CBS_init(&extension, contents, contents_len);
1884
1885 CBS parameters_list;
1886 uint8_t version_major, version_minor, param;
1887 if (!CBS_get_u8(&extension, &version_major) ||
1888 !CBS_get_u8(&extension, &version_minor) ||
1889 !CBS_get_u8_length_prefixed(&extension, &parameters_list) ||
1890 !CBS_get_u8(&parameters_list, &param) || CBS_len(&parameters_list) > 0 ||
1891 CBS_len(&extension) > 0) {
1892 *out_alert_value = SSL_AD_DECODE_ERROR;
1893 return 0;
1894 }
1895 // The server-negotiated version must be less than or equal to our version.
1896 if (version_major > kTbProtocolVersionMajor ||
1897 (version_minor > kTbProtocolVersionMinor &&
1898 version_major == kTbProtocolVersionMajor)) {
1899 *out_alert_value = SSL_AD_ILLEGAL_PARAMETER;
1900 return 0;
1901 }
1902 // If the version the server negotiated is older than we support, don't fail
1903 // parsing the extension, but also don't set |negotiated_|.
1904 if (version_major < kTbMinProtocolVersionMajor ||
1905 (version_minor < kTbMinProtocolVersionMinor &&
1906 version_major == kTbMinProtocolVersionMajor)) {
1907 return 1;
1908 }
1909
1910 for (size_t i = 0; i < ssl_config_.token_binding_params.size(); ++i) {
1911 if (param == ssl_config_.token_binding_params[i]) {
1912 tb_negotiated_param_ = ssl_config_.token_binding_params[i];
1913 tb_was_negotiated_ = true;
1914 return 1;
1915 }
1916 }
1917
1918 *out_alert_value = SSL_AD_ILLEGAL_PARAMETER;
1919 return 0;
1920}
1921
davidben281d13f02016-04-27 20:43:281922void SSLClientSocketImpl::LogConnectEndEvent(int rv) {
1923 if (rv != OK) {
mikecirone8b85c432016-09-08 19:11:001924 net_log_.EndEventWithNetErrorCode(NetLogEventType::SSL_CONNECT, rv);
davidben281d13f02016-04-27 20:43:281925 return;
1926 }
1927
mikecirone8b85c432016-09-08 19:11:001928 net_log_.EndEvent(NetLogEventType::SSL_CONNECT,
davidben281d13f02016-04-27 20:43:281929 base::Bind(&NetLogSSLInfoCallback, base::Unretained(this)));
1930}
1931
bncbd442c22016-09-14 20:49:161932void SSLClientSocketImpl::RecordNegotiatedProtocol() const {
1933 UMA_HISTOGRAM_ENUMERATION("Net.SSLNegotiatedAlpnProtocol",
1934 negotiated_protocol_, kProtoLast + 1);
bnc3cf2a592016-08-11 14:48:361935}
1936
1937void SSLClientSocketImpl::RecordChannelIDSupport() const {
1938 // Since this enum is used for a histogram, do not change or re-use values.
1939 enum {
1940 DISABLED = 0,
1941 CLIENT_ONLY = 1,
1942 CLIENT_AND_SERVER = 2,
1943 // CLIENT_NO_ECC is unused now.
1944 // CLIENT_BAD_SYSTEM_TIME is unused now.
1945 CLIENT_BAD_SYSTEM_TIME = 4,
1946 CLIENT_NO_CHANNEL_ID_SERVICE = 5,
1947 CHANNEL_ID_USAGE_MAX
1948 } supported = DISABLED;
1949 if (channel_id_sent_) {
1950 supported = CLIENT_AND_SERVER;
1951 } else if (ssl_config_.channel_id_enabled) {
1952 if (!channel_id_service_)
1953 supported = CLIENT_NO_CHANNEL_ID_SERVICE;
1954 else
1955 supported = CLIENT_ONLY;
1956 }
1957 UMA_HISTOGRAM_ENUMERATION("DomainBoundCerts.Support", supported,
1958 CHANNEL_ID_USAGE_MAX);
1959}
1960
1961bool SSLClientSocketImpl::IsChannelIDEnabled() const {
1962 return ssl_config_.channel_id_enabled && channel_id_service_;
1963}
1964
davidbenfe132d92016-09-27 18:07:211965int SSLClientSocketImpl::MapLastOpenSSLError(
1966 int ssl_error,
1967 const crypto::OpenSSLErrStackTracer& tracer,
1968 OpenSSLErrorInfo* info) {
1969 int net_error = MapOpenSSLErrorWithDetails(ssl_error, tracer, info);
1970
1971 if (ssl_error == SSL_ERROR_SSL &&
1972 ERR_GET_LIB(info->error_code) == ERR_LIB_SSL) {
1973 // TLS does not provide an alert for missing client certificates, so most
1974 // servers send a generic handshake_failure alert. Detect this case by
1975 // checking if we have received a CertificateRequest but sent no
1976 // certificate. See https://crbug.com/646567.
1977 if (ERR_GET_REASON(info->error_code) ==
1978 SSL_R_SSLV3_ALERT_HANDSHAKE_FAILURE &&
1979 certificate_requested_ && ssl_config_.send_client_cert &&
1980 !ssl_config_.client_cert) {
1981 net_error = ERR_BAD_SSL_CLIENT_AUTH_CERT;
1982 }
1983
1984 // Per spec, access_denied is only for client-certificate-based access
1985 // control, but some buggy firewalls use it when blocking a page. To avoid a
1986 // confusing error, map it to a generic protocol error if no
1987 // CertificateRequest was sent. See https://crbug.com/630883.
1988 if (ERR_GET_REASON(info->error_code) == SSL_R_TLSV1_ALERT_ACCESS_DENIED &&
1989 !certificate_requested_) {
1990 net_error = ERR_SSL_PROTOCOL_ERROR;
1991 }
1992 }
1993
1994 return net_error;
1995}
1996
[email protected]7e5dd49f2010-12-08 18:33:491997} // namespace net