blob: 9bbc41d8f0c4b869120d59839ebbe4f608f16dc4 [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"
davidben1d489522015-07-01 18:48:4615#include "base/lazy_instance.h"
Avi Drissman13fc8932015-12-20 04:40:4616#include "base/macros.h"
[email protected]3b63f8f42011-03-28 01:54:1517#include "base/memory/singleton.h"
mmenke1beda3d2016-07-22 03:33:4518#include "base/metrics/field_trial.h"
asvitkinec3c93722015-06-17 14:48:3719#include "base/metrics/histogram_macros.h"
davidben4fe4f982015-11-11 22:00:1220#include "base/metrics/sparse_histogram.h"
vadimtb2a77c762014-11-21 19:49:2221#include "base/profiler/scoped_tracker.h"
nharper49b27d992016-02-09 18:28:5122#include "base/strings/string_number_conversions.h"
davidben018aad62014-09-12 02:25:1923#include "base/strings/string_piece.h"
xunjieli9f8c5fb52016-12-07 22:59:3324#include "base/strings/stringprintf.h"
[email protected]20305ec2011-01-21 04:55:5225#include "base/synchronization/lock.h"
vadimt6b43dec22015-01-06 01:59:5826#include "base/threading/thread_local.h"
xunjieli9f8c5fb52016-12-07 22:59:3327#include "base/trace_event/process_memory_dump.h"
ssid6d6b40102016-04-05 18:59:5628#include "base/trace_event/trace_event.h"
estade5e5529d2015-05-21 20:59:1129#include "base/values.h"
[email protected]ee0f2aa82013-10-25 11:59:2630#include "crypto/ec_private_key.h"
[email protected]4b559b4d2011-04-14 17:37:1431#include "crypto/openssl_util.h"
martijna2e83bd2016-03-18 13:10:4532#include "net/base/ip_address.h"
[email protected]d518cd92010-09-29 12:27:4433#include "net/base/net_errors.h"
xunjieli0b7f5b62016-12-06 20:43:4834#include "net/base/trace_constants.h"
[email protected]6e7845ae2013-03-29 21:48:1135#include "net/cert/cert_verifier.h"
eranmefbd3132014-10-28 16:35:1636#include "net/cert/ct_ev_whitelist.h"
estark6f9b3d82016-01-12 21:37:0537#include "net/cert/ct_policy_enforcer.h"
estark723b5eeb2016-02-18 21:01:1238#include "net/cert/ct_policy_status.h"
davidbeneb5f8ef32014-09-04 14:14:3239#include "net/cert/ct_verifier.h"
[email protected]6e7845ae2013-03-29 21:48:1140#include "net/cert/x509_certificate_net_log_param.h"
mattm316af822017-02-23 04:05:5641#include "net/cert/x509_util.h"
[email protected]8bd4e7a2014-08-09 14:49:1742#include "net/http/transport_security_state.h"
mikecironef22f9812016-10-04 03:40:1943#include "net/log/net_log.h"
mikecirone8b85c432016-09-08 19:11:0044#include "net/log/net_log_event_type.h"
mikecironef22f9812016-10-04 03:40:1945#include "net/log/net_log_parameters_callback.h"
[email protected]536fd0b2013-03-14 17:41:5746#include "net/ssl/ssl_cert_request_info.h"
davidben281d13f02016-04-27 20:43:2847#include "net/ssl/ssl_cipher_suite_names.h"
svaldeze83af292016-04-26 14:33:3748#include "net/ssl/ssl_client_session_cache.h"
[email protected]536fd0b2013-03-14 17:41:5749#include "net/ssl/ssl_connection_status_flags.h"
50#include "net/ssl/ssl_info.h"
davidben1d489522015-07-01 18:48:4651#include "net/ssl/ssl_private_key.h"
nharperd5cddca2016-02-27 03:37:5252#include "net/ssl/token_binding.h"
tfarinae8cb8aa2016-10-21 02:44:0153#include "third_party/boringssl/src/include/openssl/bio.h"
54#include "third_party/boringssl/src/include/openssl/bytestring.h"
55#include "third_party/boringssl/src/include/openssl/err.h"
56#include "third_party/boringssl/src/include/openssl/evp.h"
57#include "third_party/boringssl/src/include/openssl/mem.h"
58#include "third_party/boringssl/src/include/openssl/ssl.h"
[email protected]d518cd92010-09-29 12:27:4459
davidben2a811e4e2015-12-01 10:49:3460#if !defined(OS_NACL)
61#include "net/ssl/ssl_key_logger.h"
62#endif
63
svaldez2135be52016-04-20 16:34:5364#if defined(USE_NSS_CERTS)
davidbena477a70a2015-10-06 04:38:2965#include "net/cert_net/nss_ocsp.h"
66#endif
67
[email protected]d518cd92010-09-29 12:27:4468namespace net {
69
70namespace {
71
[email protected]4b768562013-02-16 04:10:0772// This constant can be any non-negative/non-zero value (eg: it does not
73// overlap with any value of the net::Error range, including net::OK).
davidben1d489522015-07-01 18:48:4674const int kNoPendingResult = 1;
[email protected]4b768562013-02-16 04:10:0775
haavardm2d92e722014-12-19 13:45:4476// Default size of the internal BoringSSL buffers.
mmenke1beda3d2016-07-22 03:33:4577const int kDefaultOpenSSLBufferSize = 17 * 1024;
haavardm2d92e722014-12-19 13:45:4478
nharper736ceda2015-11-07 00:16:5979// TLS extension number use for Token Binding.
nharperb5ad8a802016-02-05 19:40:0080const unsigned int kTbExtNum = 24;
nharper736ceda2015-11-07 00:16:5981
82// Token Binding ProtocolVersions supported.
83const uint8_t kTbProtocolVersionMajor = 0;
nharper96d085c2017-02-22 20:10:2184const uint8_t kTbProtocolVersionMinor = 13;
nharper736ceda2015-11-07 00:16:5985const uint8_t kTbMinProtocolVersionMajor = 0;
nharper78e6d2b2016-09-21 05:42:3586const uint8_t kTbMinProtocolVersionMinor = 10;
nharper736ceda2015-11-07 00:16:5987
davidben1d489522015-07-01 18:48:4688bool EVP_MDToPrivateKeyHash(const EVP_MD* md, SSLPrivateKey::Hash* hash) {
89 switch (EVP_MD_type(md)) {
90 case NID_md5_sha1:
91 *hash = SSLPrivateKey::Hash::MD5_SHA1;
92 return true;
93 case NID_sha1:
94 *hash = SSLPrivateKey::Hash::SHA1;
95 return true;
96 case NID_sha256:
97 *hash = SSLPrivateKey::Hash::SHA256;
98 return true;
99 case NID_sha384:
100 *hash = SSLPrivateKey::Hash::SHA384;
101 return true;
102 case NID_sha512:
103 *hash = SSLPrivateKey::Hash::SHA512;
104 return true;
105 default:
106 return false;
107 }
108}
109
danakj655b66c2016-04-16 00:51:38110std::unique_ptr<base::Value> NetLogPrivateKeyOperationCallback(
davidben752bcf22015-12-21 22:55:50111 SSLPrivateKey::Hash hash,
112 NetLogCaptureMode mode) {
davidben752bcf22015-12-21 22:55:50113 std::string hash_str;
114 switch (hash) {
115 case SSLPrivateKey::Hash::MD5_SHA1:
116 hash_str = "MD5_SHA1";
117 break;
118 case SSLPrivateKey::Hash::SHA1:
119 hash_str = "SHA1";
120 break;
121 case SSLPrivateKey::Hash::SHA256:
122 hash_str = "SHA256";
123 break;
124 case SSLPrivateKey::Hash::SHA384:
125 hash_str = "SHA384";
126 break;
127 case SSLPrivateKey::Hash::SHA512:
128 hash_str = "SHA512";
129 break;
130 }
131
danakj655b66c2016-04-16 00:51:38132 std::unique_ptr<base::DictionaryValue> value(new base::DictionaryValue);
davidben752bcf22015-12-21 22:55:50133 value->SetString("hash", hash_str);
134 return std::move(value);
135}
136
danakj655b66c2016-04-16 00:51:38137std::unique_ptr<base::Value> NetLogChannelIDLookupCallback(
nharper49b27d992016-02-09 18:28:51138 ChannelIDService* channel_id_service,
139 NetLogCaptureMode capture_mode) {
140 ChannelIDStore* store = channel_id_service->GetChannelIDStore();
danakj655b66c2016-04-16 00:51:38141 std::unique_ptr<base::DictionaryValue> dict(new base::DictionaryValue());
nharper49b27d992016-02-09 18:28:51142 dict->SetBoolean("ephemeral", store->IsEphemeral());
143 dict->SetString("service", base::HexEncode(&channel_id_service,
144 sizeof(channel_id_service)));
145 dict->SetString("store", base::HexEncode(&store, sizeof(store)));
146 return std::move(dict);
147}
148
danakj655b66c2016-04-16 00:51:38149std::unique_ptr<base::Value> NetLogChannelIDLookupCompleteCallback(
nharper49b27d992016-02-09 18:28:51150 crypto::ECPrivateKey* key,
151 int result,
152 NetLogCaptureMode capture_mode) {
danakj655b66c2016-04-16 00:51:38153 std::unique_ptr<base::DictionaryValue> dict(new base::DictionaryValue());
nharper49b27d992016-02-09 18:28:51154 dict->SetInteger("net_error", result);
155 std::string raw_key;
156 if (result == OK && key && key->ExportRawPublicKey(&raw_key)) {
nharper837b2af2016-12-21 21:48:36157 std::string key_to_log = base::HexEncode(raw_key.data(), raw_key.length());
nharper49b27d992016-02-09 18:28:51158 dict->SetString("key", key_to_log);
159 }
160 return std::move(dict);
161}
162
davidben281d13f02016-04-27 20:43:28163std::unique_ptr<base::Value> NetLogSSLInfoCallback(
164 SSLClientSocketImpl* socket,
165 NetLogCaptureMode capture_mode) {
166 SSLInfo ssl_info;
167 if (!socket->GetSSLInfo(&ssl_info))
168 return nullptr;
169
170 std::unique_ptr<base::DictionaryValue> dict(new base::DictionaryValue());
171 const char* version_str;
172 SSLVersionToString(&version_str,
173 SSLConnectionStatusToVersion(ssl_info.connection_status));
174 dict->SetString("version", version_str);
175 dict->SetBoolean("is_resumed",
176 ssl_info.handshake_type == SSLInfo::HANDSHAKE_RESUME);
177 dict->SetInteger("cipher_suite", SSLConnectionStatusToCipherSuite(
178 ssl_info.connection_status));
179
bnc3472afd2016-11-17 15:27:21180 dict->SetString("next_proto",
181 NextProtoToString(socket->GetNegotiatedProtocol()));
davidben281d13f02016-04-27 20:43:28182
183 return std::move(dict);
184}
185
davidben3418e81f2016-10-19 00:09:45186int GetBufferSize(const char* field_trial) {
187 // Get buffer sizes from field trials, if possible. If values not present,
188 // use default. Also make sure values are in reasonable range.
189 int buffer_size = kDefaultOpenSSLBufferSize;
190#if !defined(OS_NACL)
191 int override_buffer_size;
192 if (base::StringToInt(base::FieldTrialList::FindFullName(field_trial),
193 &override_buffer_size)) {
194 buffer_size = override_buffer_size;
195 buffer_size = std::max(buffer_size, 1000);
196 buffer_size = std::min(buffer_size, 2 * kDefaultOpenSSLBufferSize);
197 }
198#endif // !defined(OS_NACL)
199 return buffer_size;
200}
201
davidbena35b40c32017-03-09 17:33:45202scoped_refptr<X509Certificate> OSChainFromBuffers(STACK_OF(CRYPTO_BUFFER) *
davidbenc7e06c92017-03-07 18:54:11203 openssl_chain) {
davidbena35b40c32017-03-09 17:33:45204 if (sk_CRYPTO_BUFFER_num(openssl_chain) == 0) {
davidbenc7e06c92017-03-07 18:54:11205 NOTREACHED();
206 return nullptr;
207 }
208
mattm4cede8d2017-04-11 02:55:01209#if BUILDFLAG(USE_BYTE_CERTS)
210 std::vector<CRYPTO_BUFFER*> intermediate_chain;
211 for (size_t i = 1; i < sk_CRYPTO_BUFFER_num(openssl_chain); ++i)
212 intermediate_chain.push_back(sk_CRYPTO_BUFFER_value(openssl_chain, i));
213 return X509Certificate::CreateFromHandle(
214 sk_CRYPTO_BUFFER_value(openssl_chain, 0), intermediate_chain);
215#else
davidbenc7e06c92017-03-07 18:54:11216 // Convert the certificate chains to a platform certificate handle.
217 std::vector<base::StringPiece> der_chain;
davidbena35b40c32017-03-09 17:33:45218 der_chain.reserve(sk_CRYPTO_BUFFER_num(openssl_chain));
219 for (size_t i = 0; i < sk_CRYPTO_BUFFER_num(openssl_chain); ++i) {
220 const CRYPTO_BUFFER* cert = sk_CRYPTO_BUFFER_value(openssl_chain, i);
davidbenc7e06c92017-03-07 18:54:11221 base::StringPiece der;
davidbena35b40c32017-03-09 17:33:45222 der_chain.push_back(base::StringPiece(
223 reinterpret_cast<const char*>(CRYPTO_BUFFER_data(cert)),
224 CRYPTO_BUFFER_len(cert)));
davidbenc7e06c92017-03-07 18:54:11225 }
226 return X509Certificate::CreateFromDERCertChain(der_chain);
mattm4cede8d2017-04-11 02:55:01227#endif
davidbenc7e06c92017-03-07 18:54:11228}
229
mattm4cede8d2017-04-11 02:55:01230#if !defined(OS_IOS) && !BUILDFLAG(USE_BYTE_CERTS)
davidbena35b40c32017-03-09 17:33:45231bssl::UniquePtr<CRYPTO_BUFFER> OSCertHandleToBuffer(
232 X509Certificate::OSCertHandle os_handle) {
233 std::string der_encoded;
234 if (!X509Certificate::GetDEREncoded(os_handle, &der_encoded))
235 return nullptr;
236 return x509_util::CreateCryptoBuffer(der_encoded);
237}
238#endif
239
davidbencef9e212017-04-19 15:00:10240std::unique_ptr<base::Value> NetLogSSLAlertCallback(
241 const void* bytes,
242 size_t len,
243 NetLogCaptureMode capture_mode) {
244 std::unique_ptr<base::DictionaryValue> dict(new base::DictionaryValue());
245 dict->SetString("hex_encoded_bytes", base::HexEncode(bytes, len));
246 return std::move(dict);
247}
248
249std::unique_ptr<base::Value> NetLogSSLMessageCallback(
250 bool is_write,
251 const void* bytes,
252 size_t len,
253 NetLogCaptureMode capture_mode) {
254 std::unique_ptr<base::DictionaryValue> dict(new base::DictionaryValue());
255 if (len == 0) {
256 NOTREACHED();
257 return std::move(dict);
258 }
259
260 // The handshake message type is the first byte. Include it so elided messages
261 // still report their type.
262 uint8_t type = reinterpret_cast<const uint8_t*>(bytes)[0];
263 dict->SetInteger("type", type);
264
265 // Elide client certificate messages unless logging socket bytes. The client
266 // certificate does not contain information needed to impersonate the user
267 // (that's the private key which isn't sent over the wire), but it may contain
268 // information on the user's identity.
269 if (!is_write || type != SSL3_MT_CERTIFICATE ||
270 capture_mode.include_socket_bytes()) {
271 dict->SetString("hex_encoded_bytes", base::HexEncode(bytes, len));
272 }
273
274 return std::move(dict);
275}
276
[email protected]821e3bb2013-11-08 01:06:01277} // namespace
278
svaldeze83af292016-04-26 14:33:37279class SSLClientSocketImpl::SSLContext {
[email protected]fbef13932010-11-23 12:38:53280 public:
olli.raula36aa8be2015-09-10 11:14:22281 static SSLContext* GetInstance() {
fdoray33e7c3c52017-01-19 18:37:23282 return base::Singleton<SSLContext,
283 base::LeakySingletonTraits<SSLContext>>::get();
olli.raula36aa8be2015-09-10 11:14:22284 }
[email protected]fbef13932010-11-23 12:38:53285 SSL_CTX* ssl_ctx() { return ssl_ctx_.get(); }
svaldeze83af292016-04-26 14:33:37286 SSLClientSessionCache* session_cache() { return &session_cache_; }
[email protected]fbef13932010-11-23 12:38:53287
svaldeze83af292016-04-26 14:33:37288 SSLClientSocketImpl* GetClientSocketFromSSL(const SSL* ssl) {
[email protected]fbef13932010-11-23 12:38:53289 DCHECK(ssl);
svaldeze83af292016-04-26 14:33:37290 SSLClientSocketImpl* socket = static_cast<SSLClientSocketImpl*>(
[email protected]fbef13932010-11-23 12:38:53291 SSL_get_ex_data(ssl, ssl_socket_data_index_));
292 DCHECK(socket);
293 return socket;
294 }
295
svaldeze83af292016-04-26 14:33:37296 bool SetClientSocketForSSL(SSL* ssl, SSLClientSocketImpl* socket) {
[email protected]fbef13932010-11-23 12:38:53297 return SSL_set_ex_data(ssl, ssl_socket_data_index_, socket) != 0;
298 }
299
davidben2a811e4e2015-12-01 10:49:34300#if !defined(OS_NACL)
301 void SetSSLKeyLogFile(
302 const base::FilePath& path,
303 const scoped_refptr<base::SequencedTaskRunner>& task_runner) {
304 DCHECK(!ssl_key_logger_);
305 ssl_key_logger_.reset(new SSLKeyLogger(path, task_runner));
306 SSL_CTX_set_keylog_callback(ssl_ctx_.get(), KeyLogCallback);
307 }
308#endif
309
davidben1d489522015-07-01 18:48:46310 static const SSL_PRIVATE_KEY_METHOD kPrivateKeyMethod;
311
[email protected]fbef13932010-11-23 12:38:53312 private:
olli.raula36aa8be2015-09-10 11:14:22313 friend struct base::DefaultSingletonTraits<SSLContext>;
[email protected]fbef13932010-11-23 12:38:53314
svaldeze83af292016-04-26 14:33:37315 SSLContext() : session_cache_(SSLClientSessionCache::Config()) {
[email protected]4b559b4d2011-04-14 17:37:14316 crypto::EnsureOpenSSLInit();
[email protected]fbef13932010-11-23 12:38:53317 ssl_socket_data_index_ = SSL_get_ex_new_index(0, 0, 0, 0, 0);
318 DCHECK_NE(ssl_socket_data_index_, -1);
davidbena35b40c32017-03-09 17:33:45319 ssl_ctx_.reset(SSL_CTX_new(TLS_with_buffers_method()));
[email protected]82c59022014-08-15 09:38:27320 SSL_CTX_set_cert_cb(ssl_ctx_.get(), ClientCertRequestCallback, NULL);
davidbena35b40c32017-03-09 17:33:45321
322 // The server certificate is verified after the handshake in DoVerifyCert.
323 SSL_CTX_i_promise_to_verify_certs_after_the_handshake(ssl_ctx_.get());
davidbendafe4e52015-04-08 22:53:52324
325 // Disable the internal session cache. Session caching is handled
svaldeze83af292016-04-26 14:33:37326 // externally (i.e. by SSLClientSessionCache).
davidbendafe4e52015-04-08 22:53:52327 SSL_CTX_set_session_cache_mode(
328 ssl_ctx_.get(), SSL_SESS_CACHE_CLIENT | SSL_SESS_CACHE_NO_INTERNAL);
davidben44aeae62015-06-24 20:47:43329 SSL_CTX_sess_set_new_cb(ssl_ctx_.get(), NewSessionCallback);
davidben99ce6302016-11-09 17:30:28330 SSL_CTX_set_timeout(ssl_ctx_.get(), 1 * 60 * 60 /* one hour */);
nharper736ceda2015-11-07 00:16:59331
davidbenfacfac7b2016-09-27 22:39:53332 SSL_CTX_set_grease_enabled(ssl_ctx_.get(), 1);
333
davidbenbf0fcf12017-02-10 21:00:34334 // Deduplicate all certificates minted from the SSL_CTX in memory.
335 SSL_CTX_set0_buffer_pool(ssl_ctx_.get(), x509_util::GetBufferPool());
336
davidbencef9e212017-04-19 15:00:10337 SSL_CTX_set_msg_callback(ssl_ctx_.get(), MessageCallback);
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
davidben44aeae62015-06-24 20:47:43387 static int NewSessionCallback(SSL* ssl, SSL_SESSION* session) {
svaldeze83af292016-04-26 14:33:37388 SSLClientSocketImpl* socket = GetInstance()->GetClientSocketFromSSL(ssl);
davidben44aeae62015-06-24 20:47:43389 return socket->NewSessionCallback(session);
davidbendafe4e52015-04-08 22:53:52390 }
391
davidben0bca07fd2016-07-18 15:12:03392 static ssl_private_key_result_t PrivateKeySignDigestCallback(
davidben1d489522015-07-01 18:48:46393 SSL* ssl,
394 uint8_t* out,
395 size_t* out_len,
davidben0bca07fd2016-07-18 15:12:03396 size_t max_out,
397 const EVP_MD* md,
398 const uint8_t* in,
399 size_t in_len) {
svaldeze83af292016-04-26 14:33:37400 SSLClientSocketImpl* socket = GetInstance()->GetClientSocketFromSSL(ssl);
davidben0bca07fd2016-07-18 15:12:03401 return socket->PrivateKeySignDigestCallback(out, out_len, max_out, md, in,
402 in_len);
403 }
404
405 static ssl_private_key_result_t PrivateKeyCompleteCallback(SSL* ssl,
406 uint8_t* out,
407 size_t* out_len,
408 size_t max_out) {
409 SSLClientSocketImpl* socket = GetInstance()->GetClientSocketFromSSL(ssl);
410 return socket->PrivateKeyCompleteCallback(out, out_len, max_out);
davidben1d489522015-07-01 18:48:46411 }
412
davidben2a811e4e2015-12-01 10:49:34413#if !defined(OS_NACL)
414 static void KeyLogCallback(const SSL* ssl, const char* line) {
415 GetInstance()->ssl_key_logger_->WriteLine(line);
416 }
417#endif
418
davidbencef9e212017-04-19 15:00:10419 static void MessageCallback(int is_write,
420 int version,
421 int content_type,
422 const void* buf,
423 size_t len,
424 SSL* ssl,
425 void* arg) {
426 SSLClientSocketImpl* socket = GetInstance()->GetClientSocketFromSSL(ssl);
427 return socket->MessageCallback(is_write, content_type, buf, len);
428 }
429
[email protected]fbef13932010-11-23 12:38:53430 // This is the index used with SSL_get_ex_data to retrieve the owner
svaldeze83af292016-04-26 14:33:37431 // SSLClientSocketImpl object from an SSL instance.
[email protected]fbef13932010-11-23 12:38:53432 int ssl_socket_data_index_;
433
davidbend80c12c2016-10-11 00:13:49434 bssl::UniquePtr<SSL_CTX> ssl_ctx_;
davidbendafe4e52015-04-08 22:53:52435
davidben2a811e4e2015-12-01 10:49:34436#if !defined(OS_NACL)
danakj655b66c2016-04-16 00:51:38437 std::unique_ptr<SSLKeyLogger> ssl_key_logger_;
davidben2a811e4e2015-12-01 10:49:34438#endif
439
davidbendafe4e52015-04-08 22:53:52440 // TODO(davidben): Use a separate cache per URLRequestContext.
441 // https://crbug.com/458365
442 //
443 // TODO(davidben): Sessions should be invalidated on fatal
444 // alerts. https://crbug.com/466352
svaldeze83af292016-04-26 14:33:37445 SSLClientSessionCache session_cache_;
[email protected]1279de12013-12-03 15:13:32446};
447
davidben0bca07fd2016-07-18 15:12:03448// TODO(davidben): Switch from sign_digest to sign.
davidben1d489522015-07-01 18:48:46449const SSL_PRIVATE_KEY_METHOD
svaldeze83af292016-04-26 14:33:37450 SSLClientSocketImpl::SSLContext::kPrivateKeyMethod = {
davidbene422380772017-04-19 22:20:01451 nullptr /* type (unused) */,
452 nullptr /* max_signature_len (unused) */,
davidben0bca07fd2016-07-18 15:12:03453 nullptr /* sign */,
454 &SSLClientSocketImpl::SSLContext::PrivateKeySignDigestCallback,
455 nullptr /* decrypt */,
456 &SSLClientSocketImpl::SSLContext::PrivateKeyCompleteCallback,
davidben1d489522015-07-01 18:48:46457};
458
[email protected]1279de12013-12-03 15:13:32459// static
[email protected]c3456bb2011-12-12 22:22:19460void SSLClientSocket::ClearSessionCache() {
svaldeze83af292016-04-26 14:33:37461 SSLClientSocketImpl::SSLContext* context =
462 SSLClientSocketImpl::SSLContext::GetInstance();
[email protected]c3456bb2011-12-12 22:22:19463 context->session_cache()->Flush();
464}
465
svaldeze83af292016-04-26 14:33:37466SSLClientSocketImpl::SSLClientSocketImpl(
danakj655b66c2016-04-16 00:51:38467 std::unique_ptr<ClientSocketHandle> transport_socket,
[email protected]055d7f22010-11-15 12:03:12468 const HostPortPair& host_and_port,
[email protected]822581d2010-12-16 17:27:15469 const SSLConfig& ssl_config,
[email protected]feb79bcd2011-07-21 16:55:17470 const SSLClientSocketContext& context)
davidben3418e81f2016-10-19 00:09:45471 : pending_read_error_(kNoPendingResult),
davidbenb8c23212014-10-28 00:12:16472 pending_read_ssl_error_(SSL_ERROR_NONE),
[email protected]64b5c892014-08-08 09:39:26473 completed_connect_(false),
[email protected]0dc88b32014-03-26 20:12:28474 was_ever_used_(false),
[email protected]feb79bcd2011-07-21 16:55:17475 cert_verifier_(context.cert_verifier),
davidbeneb5f8ef32014-09-04 14:14:32476 cert_transparency_verifier_(context.cert_transparency_verifier),
[email protected]6b8a3c742014-07-25 00:25:35477 channel_id_service_(context.channel_id_service),
nharper736ceda2015-11-07 00:16:59478 tb_was_negotiated_(false),
479 tb_negotiated_param_(TB_PARAM_ECDSAP256),
nharper78e6d2b2016-09-21 05:42:35480 tb_signature_map_(10),
dchengc7eeda422015-12-26 03:56:48481 transport_(std::move(transport_socket)),
[email protected]055d7f22010-11-15 12:03:12482 host_and_port_(host_and_port),
[email protected]d518cd92010-09-29 12:27:44483 ssl_config_(ssl_config),
[email protected]c3456bb2011-12-12 22:22:19484 ssl_session_cache_shard_(context.ssl_session_cache_shard),
[email protected]013c17c2012-01-21 19:09:01485 next_handshake_state_(STATE_NONE),
svaldez4af14d22015-08-20 13:48:24486 disconnected_(false),
bnc3cf2a592016-08-11 14:48:36487 negotiated_protocol_(kProtoUnknown),
davidben52053b382015-04-27 19:22:29488 channel_id_sent_(false),
davidbendafe4e52015-04-08 22:53:52489 certificate_verified_(false),
davidbenfe132d92016-09-27 18:07:21490 certificate_requested_(false),
davidben1d489522015-07-01 18:48:46491 signature_result_(kNoPendingResult),
[email protected]8bd4e7a2014-08-09 14:49:17492 transport_security_state_(context.transport_security_state),
estark6f9b3d82016-01-12 21:37:05493 policy_enforcer_(context.ct_policy_enforcer),
dadriandf302c42016-06-10 18:48:59494 pkp_bypassed_(false),
kulkarni.acd7b4462014-08-28 07:41:34495 net_log_(transport_->socket()->NetLog()),
496 weak_factory_(this) {
rsleevibe81cd62016-06-24 01:38:59497 CHECK(cert_verifier_);
498 CHECK(transport_security_state_);
499 CHECK(cert_transparency_verifier_);
500 CHECK(policy_enforcer_);
[email protected]8e458552014-08-05 00:02:15501}
[email protected]d518cd92010-09-29 12:27:44502
svaldeze83af292016-04-26 14:33:37503SSLClientSocketImpl::~SSLClientSocketImpl() {
[email protected]d518cd92010-09-29 12:27:44504 Disconnect();
505}
506
davidben2a811e4e2015-12-01 10:49:34507#if !defined(OS_NACL)
svaldeze83af292016-04-26 14:33:37508void SSLClientSocketImpl::SetSSLKeyLogFile(
davidben2a811e4e2015-12-01 10:49:34509 const base::FilePath& ssl_keylog_file,
510 const scoped_refptr<base::SequencedTaskRunner>& task_runner) {
511 SSLContext::GetInstance()->SetSSLKeyLogFile(ssl_keylog_file, task_runner);
zhongyi81f85c6d92015-10-16 19:34:14512}
davidben2a811e4e2015-12-01 10:49:34513#endif
zhongyi81f85c6d92015-10-16 19:34:14514
svaldeze83af292016-04-26 14:33:37515void SSLClientSocketImpl::GetSSLCertRequestInfo(
[email protected]b9b651f2013-11-09 04:32:22516 SSLCertRequestInfo* cert_request_info) {
davidbenb11fd212017-01-12 17:08:03517 if (!ssl_) {
518 NOTREACHED();
519 return;
520 }
521
[email protected]791879c2013-12-17 07:22:41522 cert_request_info->host_and_port = host_and_port_;
davidbenb11fd212017-01-12 17:08:03523
524 cert_request_info->cert_authorities.clear();
davidbena35b40c32017-03-09 17:33:45525 const STACK_OF(CRYPTO_BUFFER)* authorities =
526 SSL_get0_server_requested_CAs(ssl_.get());
527 for (size_t i = 0; i < sk_CRYPTO_BUFFER_num(authorities); i++) {
528 const CRYPTO_BUFFER* ca_name = sk_CRYPTO_BUFFER_value(authorities, i);
529 cert_request_info->cert_authorities.push_back(
530 std::string(reinterpret_cast<const char*>(CRYPTO_BUFFER_data(ca_name)),
531 CRYPTO_BUFFER_len(ca_name)));
davidbenb11fd212017-01-12 17:08:03532 }
533
534 cert_request_info->cert_key_types.clear();
535 const uint8_t* client_cert_types;
536 size_t num_client_cert_types =
537 SSL_get0_certificate_types(ssl_.get(), &client_cert_types);
538 for (size_t i = 0; i < num_client_cert_types; i++) {
539 cert_request_info->cert_key_types.push_back(
540 static_cast<SSLClientCertType>(client_cert_types[i]));
541 }
[email protected]b9b651f2013-11-09 04:32:22542}
543
svaldeze83af292016-04-26 14:33:37544ChannelIDService* SSLClientSocketImpl::GetChannelIDService() const {
[email protected]6b8a3c742014-07-25 00:25:35545 return channel_id_service_;
[email protected]b9b651f2013-11-09 04:32:22546}
547
nharper78e6d2b2016-09-21 05:42:35548Error SSLClientSocketImpl::GetTokenBindingSignature(crypto::ECPrivateKey* key,
549 TokenBindingType tb_type,
550 std::vector<uint8_t>* out) {
nharperb7441ef2016-01-25 23:54:14551 // The same key will be used across multiple requests to sign the same value,
552 // so the signature is cached.
553 std::string raw_public_key;
554 if (!key->ExportRawPublicKey(&raw_public_key))
555 return ERR_FAILED;
nharper78e6d2b2016-09-21 05:42:35556 auto it = tb_signature_map_.Get(std::make_pair(tb_type, raw_public_key));
557 if (it != tb_signature_map_.end()) {
nharperb7441ef2016-01-25 23:54:14558 *out = it->second;
559 return OK;
560 }
561
562 uint8_t tb_ekm_buf[32];
563 static const char kTokenBindingExporterLabel[] = "EXPORTER-Token-Binding";
davidbend80c12c2016-10-11 00:13:49564 if (!SSL_export_keying_material(ssl_.get(), tb_ekm_buf, sizeof(tb_ekm_buf),
nharperb7441ef2016-01-25 23:54:14565 kTokenBindingExporterLabel,
566 strlen(kTokenBindingExporterLabel), nullptr,
567 0, false /* no context */)) {
568 return ERR_FAILED;
569 }
570
nharper78e6d2b2016-09-21 05:42:35571 if (!CreateTokenBindingSignature(
nharperd5cddca2016-02-27 03:37:52572 base::StringPiece(reinterpret_cast<char*>(tb_ekm_buf),
573 sizeof(tb_ekm_buf)),
nharper78e6d2b2016-09-21 05:42:35574 tb_type, key, out))
nharperb7441ef2016-01-25 23:54:14575 return ERR_FAILED;
nharperb7441ef2016-01-25 23:54:14576
nharper78e6d2b2016-09-21 05:42:35577 tb_signature_map_.Put(std::make_pair(tb_type, raw_public_key), *out);
nharperb7441ef2016-01-25 23:54:14578 return OK;
579}
580
svaldeze83af292016-04-26 14:33:37581crypto::ECPrivateKey* SSLClientSocketImpl::GetChannelIDKey() const {
nharperb36644f2016-02-22 23:14:43582 return channel_id_key_.get();
583}
584
svaldeze83af292016-04-26 14:33:37585int SSLClientSocketImpl::ExportKeyingMaterial(const base::StringPiece& label,
586 bool has_context,
587 const base::StringPiece& context,
588 unsigned char* out,
589 unsigned int outlen) {
davidben86935f72015-05-06 22:24:49590 if (!IsConnected())
591 return ERR_SOCKET_NOT_CONNECTED;
592
[email protected]b9b651f2013-11-09 04:32:22593 crypto::OpenSSLErrStackTracer err_tracer(FROM_HERE);
594
davidbenf225b262016-09-15 22:09:22595 if (!SSL_export_keying_material(
davidbend80c12c2016-10-11 00:13:49596 ssl_.get(), out, outlen, label.data(), label.size(),
davidbenf225b262016-09-15 22:09:22597 reinterpret_cast<const unsigned char*>(context.data()),
598 context.length(), has_context ? 1 : 0)) {
599 LOG(ERROR) << "Failed to export keying material.";
600 return ERR_FAILED;
[email protected]b9b651f2013-11-09 04:32:22601 }
davidbenf225b262016-09-15 22:09:22602
[email protected]b9b651f2013-11-09 04:32:22603 return OK;
604}
605
svaldeze83af292016-04-26 14:33:37606int SSLClientSocketImpl::Connect(const CompletionCallback& callback) {
svaldez4af14d22015-08-20 13:48:24607 // Although StreamSocket does allow calling Connect() after Disconnect(),
608 // this has never worked for layered sockets. CHECK to detect any consumers
609 // reconnecting an SSL socket.
610 //
611 // TODO(davidben,mmenke): Remove this API feature. See
612 // https://crbug.com/499289.
613 CHECK(!disconnected_);
614
mikecirone8b85c432016-09-08 19:11:00615 net_log_.BeginEvent(NetLogEventType::SSL_CONNECT);
[email protected]b9b651f2013-11-09 04:32:22616
617 // Set up new ssl object.
[email protected]c8a80e92014-05-17 16:02:08618 int rv = Init();
619 if (rv != OK) {
davidben281d13f02016-04-27 20:43:28620 LogConnectEndEvent(rv);
[email protected]c8a80e92014-05-17 16:02:08621 return rv;
[email protected]b9b651f2013-11-09 04:32:22622 }
623
624 // Set SSL to client mode. Handshake happens in the loop below.
davidbend80c12c2016-10-11 00:13:49625 SSL_set_connect_state(ssl_.get());
[email protected]b9b651f2013-11-09 04:32:22626
rsleeviadbd4982016-06-13 22:10:27627 next_handshake_state_ = STATE_HANDSHAKE;
[email protected]c8a80e92014-05-17 16:02:08628 rv = DoHandshakeLoop(OK);
[email protected]b9b651f2013-11-09 04:32:22629 if (rv == ERR_IO_PENDING) {
630 user_connect_callback_ = callback;
631 } else {
davidben281d13f02016-04-27 20:43:28632 LogConnectEndEvent(rv);
[email protected]b9b651f2013-11-09 04:32:22633 }
634
635 return rv > OK ? OK : rv;
636}
637
svaldeze83af292016-04-26 14:33:37638void SSLClientSocketImpl::Disconnect() {
svaldez4af14d22015-08-20 13:48:24639 disconnected_ = true;
640
[email protected]b9b651f2013-11-09 04:32:22641 // Shut down anything that may call us back.
eroman7f9236a2015-05-11 21:23:43642 cert_verifier_request_.reset();
davidben67e83912016-10-12 18:36:32643 channel_id_request_.Cancel();
644 weak_factory_.InvalidateWeakPtrs();
davidben3418e81f2016-10-19 00:09:45645 transport_adapter_.reset();
[email protected]b9b651f2013-11-09 04:32:22646
davidben67e83912016-10-12 18:36:32647 // Release user callbacks.
[email protected]b9b651f2013-11-09 04:32:22648 user_connect_callback_.Reset();
649 user_read_callback_.Reset();
650 user_write_callback_.Reset();
svaldeze83af292016-04-26 14:33:37651 user_read_buf_ = NULL;
652 user_read_buf_len_ = 0;
653 user_write_buf_ = NULL;
654 user_write_buf_len_ = 0;
[email protected]b9b651f2013-11-09 04:32:22655
davidben67e83912016-10-12 18:36:32656 transport_->socket()->Disconnect();
[email protected]b9b651f2013-11-09 04:32:22657}
658
svaldeze83af292016-04-26 14:33:37659bool SSLClientSocketImpl::IsConnected() const {
davidben67e83912016-10-12 18:36:32660 // If the handshake has not yet completed or the socket has been explicitly
661 // disconnected.
662 if (!completed_connect_ || disconnected_)
[email protected]b9b651f2013-11-09 04:32:22663 return false;
664 // If an asynchronous operation is still pending.
665 if (user_read_buf_.get() || user_write_buf_.get())
666 return true;
667
668 return transport_->socket()->IsConnected();
669}
670
svaldeze83af292016-04-26 14:33:37671bool SSLClientSocketImpl::IsConnectedAndIdle() const {
davidben67e83912016-10-12 18:36:32672 // If the handshake has not yet completed or the socket has been explicitly
673 // disconnected.
674 if (!completed_connect_ || disconnected_)
[email protected]b9b651f2013-11-09 04:32:22675 return false;
676 // If an asynchronous operation is still pending.
677 if (user_read_buf_.get() || user_write_buf_.get())
678 return false;
davidbenfc9a6b82015-04-15 23:47:32679
680 // If there is data read from the network that has not yet been consumed, do
681 // not treat the connection as idle.
682 //
davidben3418e81f2016-10-19 00:09:45683 // Note that this does not check whether there is ciphertext that has not yet
684 // been flushed to the network. |Write| returns early, so this can cause race
685 // conditions which cause a socket to not be treated reusable when it should
686 // be. See https://crbug.com/466147.
687 if (transport_adapter_->HasPendingReadData())
[email protected]b9b651f2013-11-09 04:32:22688 return false;
[email protected]b9b651f2013-11-09 04:32:22689
690 return transport_->socket()->IsConnectedAndIdle();
691}
692
svaldeze83af292016-04-26 14:33:37693int SSLClientSocketImpl::GetPeerAddress(IPEndPoint* addressList) const {
[email protected]b9b651f2013-11-09 04:32:22694 return transport_->socket()->GetPeerAddress(addressList);
695}
696
svaldeze83af292016-04-26 14:33:37697int SSLClientSocketImpl::GetLocalAddress(IPEndPoint* addressList) const {
[email protected]b9b651f2013-11-09 04:32:22698 return transport_->socket()->GetLocalAddress(addressList);
699}
700
tfarina428341112016-09-22 13:38:20701const NetLogWithSource& SSLClientSocketImpl::NetLog() const {
[email protected]b9b651f2013-11-09 04:32:22702 return net_log_;
703}
704
svaldeze83af292016-04-26 14:33:37705void SSLClientSocketImpl::SetSubresourceSpeculation() {
[email protected]b9b651f2013-11-09 04:32:22706 if (transport_.get() && transport_->socket()) {
707 transport_->socket()->SetSubresourceSpeculation();
708 } else {
709 NOTREACHED();
710 }
711}
712
svaldeze83af292016-04-26 14:33:37713void SSLClientSocketImpl::SetOmniboxSpeculation() {
[email protected]b9b651f2013-11-09 04:32:22714 if (transport_.get() && transport_->socket()) {
715 transport_->socket()->SetOmniboxSpeculation();
716 } else {
717 NOTREACHED();
718 }
719}
720
svaldeze83af292016-04-26 14:33:37721bool SSLClientSocketImpl::WasEverUsed() const {
[email protected]0dc88b32014-03-26 20:12:28722 return was_ever_used_;
[email protected]b9b651f2013-11-09 04:32:22723}
724
tfarina2846404c2016-12-25 14:31:37725bool SSLClientSocketImpl::WasAlpnNegotiated() const {
bnc3cf2a592016-08-11 14:48:36726 return negotiated_protocol_ != kProtoUnknown;
727}
728
729NextProto SSLClientSocketImpl::GetNegotiatedProtocol() const {
730 return negotiated_protocol_;
731}
732
svaldeze83af292016-04-26 14:33:37733bool SSLClientSocketImpl::GetSSLInfo(SSLInfo* ssl_info) {
[email protected]b9b651f2013-11-09 04:32:22734 ssl_info->Reset();
davidbenc7e06c92017-03-07 18:54:11735 if (!server_cert_)
[email protected]b9b651f2013-11-09 04:32:22736 return false;
737
738 ssl_info->cert = server_cert_verify_result_.verified_cert;
estark03d644f2015-06-13 00:11:32739 ssl_info->unverified_cert = server_cert_;
[email protected]b9b651f2013-11-09 04:32:22740 ssl_info->cert_status = server_cert_verify_result_.cert_status;
741 ssl_info->is_issued_by_known_root =
742 server_cert_verify_result_.is_issued_by_known_root;
dadriandf302c42016-06-10 18:48:59743 ssl_info->pkp_bypassed = pkp_bypassed_;
svaldeze83af292016-04-26 14:33:37744 ssl_info->public_key_hashes = server_cert_verify_result_.public_key_hashes;
[email protected]b9b651f2013-11-09 04:32:22745 ssl_info->client_cert_sent =
746 ssl_config_.send_client_cert && ssl_config_.client_cert.get();
davidben52053b382015-04-27 19:22:29747 ssl_info->channel_id_sent = channel_id_sent_;
nharper736ceda2015-11-07 00:16:59748 ssl_info->token_binding_negotiated = tb_was_negotiated_;
749 ssl_info->token_binding_key_param = tb_negotiated_param_;
[email protected]8bd4e7a2014-08-09 14:49:17750 ssl_info->pinning_failure_log = pinning_failure_log_;
dadrian612337a2016-07-20 22:36:58751 ssl_info->ocsp_result = server_cert_verify_result_.ocsp_result;
[email protected]b9b651f2013-11-09 04:32:22752
estark723b5eeb2016-02-18 21:01:12753 AddCTInfoToSSLInfo(ssl_info);
davidbeneb5f8ef32014-09-04 14:14:32754
davidbend80c12c2016-10-11 00:13:49755 const SSL_CIPHER* cipher = SSL_get_current_cipher(ssl_.get());
[email protected]b9b651f2013-11-09 04:32:22756 CHECK(cipher);
757 ssl_info->security_bits = SSL_CIPHER_get_bits(cipher, NULL);
davidben3b00e402016-09-20 14:31:06758 // Historically, the "group" was known as "curve".
davidbend80c12c2016-10-11 00:13:49759 ssl_info->key_exchange_group = SSL_get_curve_id(ssl_.get());
[email protected]b9b651f2013-11-09 04:32:22760
ryanchung987b2ff2016-02-19 00:17:12761 SSLConnectionStatusSetCipherSuite(
762 static_cast<uint16_t>(SSL_CIPHER_get_id(cipher)),
763 &ssl_info->connection_status);
davidbend80c12c2016-10-11 00:13:49764 SSLConnectionStatusSetVersion(GetNetSSLVersion(ssl_.get()),
ryanchung987b2ff2016-02-19 00:17:12765 &ssl_info->connection_status);
[email protected]b9b651f2013-11-09 04:32:22766
davidbend80c12c2016-10-11 00:13:49767 ssl_info->handshake_type = SSL_session_reused(ssl_.get())
svaldeze83af292016-04-26 14:33:37768 ? SSLInfo::HANDSHAKE_RESUME
769 : SSLInfo::HANDSHAKE_FULL;
[email protected]b9b651f2013-11-09 04:32:22770
[email protected]b9b651f2013-11-09 04:32:22771 return true;
772}
773
svaldeze83af292016-04-26 14:33:37774void SSLClientSocketImpl::GetConnectionAttempts(ConnectionAttempts* out) const {
ttuttle23fdb7b2015-05-15 01:28:03775 out->clear();
776}
777
svaldeze83af292016-04-26 14:33:37778int64_t SSLClientSocketImpl::GetTotalReceivedBytes() const {
tbansalf82cc8e2015-10-14 20:05:49779 return transport_->socket()->GetTotalReceivedBytes();
780}
781
xunjieli998d2472017-01-12 01:12:28782void SSLClientSocketImpl::DumpMemoryStats(SocketMemoryStats* stats) const {
783 if (transport_adapter_)
784 stats->buffer_size = transport_adapter_->GetAllocationSize();
davidbena35b40c32017-03-09 17:33:45785 const STACK_OF(CRYPTO_BUFFER)* server_cert_chain =
786 SSL_get0_peer_certificates(ssl_.get());
davidbenc7e06c92017-03-07 18:54:11787 if (server_cert_chain) {
davidbena35b40c32017-03-09 17:33:45788 for (size_t i = 0; i < sk_CRYPTO_BUFFER_num(server_cert_chain); ++i) {
789 const CRYPTO_BUFFER* cert = sk_CRYPTO_BUFFER_value(server_cert_chain, i);
790 stats->cert_size += CRYPTO_BUFFER_len(cert);
xunjieli9f8c5fb52016-12-07 22:59:33791 }
davidbena35b40c32017-03-09 17:33:45792 stats->cert_count = sk_CRYPTO_BUFFER_num(server_cert_chain);
xunjieli9f8c5fb52016-12-07 22:59:33793 }
xunjieliffe62df62017-02-23 18:22:41794 stats->total_size = stats->buffer_size + stats->cert_size;
xunjieli9f8c5fb52016-12-07 22:59:33795}
796
797// static
798void SSLClientSocketImpl::DumpSSLClientSessionMemoryStats(
799 base::trace_event::ProcessMemoryDump* pmd) {
800 SSLContext::GetInstance()->session_cache()->DumpMemoryStats(pmd);
801}
802
svaldeze83af292016-04-26 14:33:37803int SSLClientSocketImpl::Read(IOBuffer* buf,
804 int buf_len,
805 const CompletionCallback& callback) {
xunjieli321a96f32017-03-07 19:42:17806 int rv = ReadIfReady(buf, buf_len, callback);
807 if (rv == ERR_IO_PENDING) {
808 user_read_buf_ = buf;
809 user_read_buf_len_ = buf_len;
810 }
811 return rv;
812}
[email protected]b9b651f2013-11-09 04:32:22813
xunjieli321a96f32017-03-07 19:42:17814int SSLClientSocketImpl::ReadIfReady(IOBuffer* buf,
815 int buf_len,
816 const CompletionCallback& callback) {
817 int rv = DoPayloadRead(buf, buf_len);
[email protected]b9b651f2013-11-09 04:32:22818
819 if (rv == ERR_IO_PENDING) {
820 user_read_callback_ = callback;
821 } else {
[email protected]0dc88b32014-03-26 20:12:28822 if (rv > 0)
823 was_ever_used_ = true;
[email protected]b9b651f2013-11-09 04:32:22824 }
[email protected]b9b651f2013-11-09 04:32:22825 return rv;
826}
827
svaldeze83af292016-04-26 14:33:37828int SSLClientSocketImpl::Write(IOBuffer* buf,
829 int buf_len,
830 const CompletionCallback& callback) {
[email protected]b9b651f2013-11-09 04:32:22831 user_write_buf_ = buf;
832 user_write_buf_len_ = buf_len;
833
davidben3418e81f2016-10-19 00:09:45834 int rv = DoPayloadWrite();
[email protected]b9b651f2013-11-09 04:32:22835
836 if (rv == ERR_IO_PENDING) {
837 user_write_callback_ = callback;
838 } else {
[email protected]0dc88b32014-03-26 20:12:28839 if (rv > 0)
840 was_ever_used_ = true;
[email protected]b9b651f2013-11-09 04:32:22841 user_write_buf_ = NULL;
842 user_write_buf_len_ = 0;
843 }
844
845 return rv;
846}
847
svaldeze83af292016-04-26 14:33:37848int SSLClientSocketImpl::SetReceiveBufferSize(int32_t size) {
[email protected]b9b651f2013-11-09 04:32:22849 return transport_->socket()->SetReceiveBufferSize(size);
850}
851
svaldeze83af292016-04-26 14:33:37852int SSLClientSocketImpl::SetSendBufferSize(int32_t size) {
[email protected]b9b651f2013-11-09 04:32:22853 return transport_->socket()->SetSendBufferSize(size);
854}
855
davidben3418e81f2016-10-19 00:09:45856void SSLClientSocketImpl::OnReadReady() {
857 // During a renegotiation, either Read or Write calls may be blocked on a
858 // transport read.
859 RetryAllOperations();
860}
861
862void SSLClientSocketImpl::OnWriteReady() {
863 // During a renegotiation, either Read or Write calls may be blocked on a
864 // transport read.
865 RetryAllOperations();
866}
867
svaldeze83af292016-04-26 14:33:37868int SSLClientSocketImpl::Init() {
[email protected]9e733f32010-10-04 18:19:08869 DCHECK(!ssl_);
[email protected]9e733f32010-10-04 18:19:08870
svaldez2135be52016-04-20 16:34:53871#if defined(USE_NSS_CERTS)
davidbena477a70a2015-10-06 04:38:29872 if (ssl_config_.cert_io_enabled) {
873 // TODO(davidben): Move this out of SSLClientSocket. See
874 // https://crbug.com/539520.
875 EnsureNSSHttpIOInit();
876 }
877#endif
878
[email protected]b29af7d2010-12-14 11:52:47879 SSLContext* context = SSLContext::GetInstance();
[email protected]4b559b4d2011-04-14 17:37:14880 crypto::OpenSSLErrStackTracer err_tracer(FROM_HERE);
[email protected]d518cd92010-09-29 12:27:44881
davidbend80c12c2016-10-11 00:13:49882 ssl_.reset(SSL_new(context->ssl_ctx()));
883 if (!ssl_ || !context->SetClientSocketForSSL(ssl_.get(), this))
[email protected]c8a80e92014-05-17 16:02:08884 return ERR_UNEXPECTED;
[email protected]fbef13932010-11-23 12:38:53885
davidben9bc0466f2015-06-16 22:21:27886 // SNI should only contain valid DNS hostnames, not IP addresses (see RFC
887 // 6066, Section 3).
888 //
889 // TODO(rsleevi): Should this code allow hostnames that violate the LDH rule?
890 // See https://crbug.com/496472 and https://crbug.com/496468 for discussion.
martijna2e83bd2016-03-18 13:10:45891 IPAddress unused;
892 if (!unused.AssignFromIPLiteral(host_and_port_.host()) &&
davidbend80c12c2016-10-11 00:13:49893 !SSL_set_tlsext_host_name(ssl_.get(), host_and_port_.host().c_str())) {
[email protected]c8a80e92014-05-17 16:02:08894 return ERR_UNEXPECTED;
davidben9bc0466f2015-06-16 22:21:27895 }
[email protected]fbef13932010-11-23 12:38:53896
nharper00d06ff2017-01-20 00:55:56897 bssl::UniquePtr<SSL_SESSION> session = context->session_cache()->Lookup(
898 GetSessionCacheKey(), &ssl_session_cache_lookup_count_);
davidbenf4c9a6122015-10-20 02:45:29899 if (session)
davidbend80c12c2016-10-11 00:13:49900 SSL_set_session(ssl_.get(), session.get());
[email protected]d518cd92010-09-29 12:27:44901
davidben3418e81f2016-10-19 00:09:45902 transport_adapter_.reset(new SocketBIOAdapter(
903 transport_->socket(), GetBufferSize("SSLBufferSizeRecv"),
904 GetBufferSize("SSLBufferSizeSend"), this));
905 BIO* transport_bio = transport_adapter_->bio();
mmenke1beda3d2016-07-22 03:33:45906
davidben3418e81f2016-10-19 00:09:45907 BIO_up_ref(transport_bio); // SSL_set0_rbio takes ownership.
908 SSL_set0_rbio(ssl_.get(), transport_bio);
haavardm2d92e722014-12-19 13:45:44909
davidben3418e81f2016-10-19 00:09:45910 BIO_up_ref(transport_bio); // SSL_set0_wbio takes ownership.
911 SSL_set0_wbio(ssl_.get(), transport_bio);
[email protected]d518cd92010-09-29 12:27:44912
davidbenb937d6c2015-05-14 04:53:42913 DCHECK_LT(SSL3_VERSION, ssl_config_.version_min);
914 DCHECK_LT(SSL3_VERSION, ssl_config_.version_max);
davidbend80c12c2016-10-11 00:13:49915 if (!SSL_set_min_proto_version(ssl_.get(), ssl_config_.version_min) ||
916 !SSL_set_max_proto_version(ssl_.get(), ssl_config_.version_max)) {
davidben952bdf22016-09-21 23:42:16917 return ERR_UNEXPECTED;
918 }
davidbenb937d6c2015-05-14 04:53:42919
[email protected]9e733f32010-10-04 18:19:08920 // OpenSSL defaults some options to on, others to off. To avoid ambiguity,
921 // set everything we care about to an absolute value.
[email protected]fb10e2282010-12-01 17:08:48922 SslSetClearMask options;
[email protected]d0f00492012-08-03 22:35:13923 options.ConfigureFlag(SSL_OP_NO_COMPRESSION, true);
[email protected]9e733f32010-10-04 18:19:08924
925 // TODO(joth): Set this conditionally, see http://crbug.com/55410
[email protected]fb10e2282010-12-01 17:08:48926 options.ConfigureFlag(SSL_OP_LEGACY_SERVER_CONNECT, true);
[email protected]9e733f32010-10-04 18:19:08927
davidbend80c12c2016-10-11 00:13:49928 SSL_set_options(ssl_.get(), options.set_mask);
929 SSL_clear_options(ssl_.get(), options.clear_mask);
[email protected]9e733f32010-10-04 18:19:08930
[email protected]fb10e2282010-12-01 17:08:48931 // Same as above, this time for the SSL mode.
932 SslSetClearMask mode;
[email protected]9e733f32010-10-04 18:19:08933
[email protected]fb10e2282010-12-01 17:08:48934 mode.ConfigureFlag(SSL_MODE_RELEASE_BUFFERS, true);
ishermane5c05e12014-09-09 20:32:15935 mode.ConfigureFlag(SSL_MODE_CBC_RECORD_SPLITTING, true);
[email protected]fb10e2282010-12-01 17:08:48936
davidben818d93b2015-02-19 22:27:32937 mode.ConfigureFlag(SSL_MODE_ENABLE_FALSE_START,
[email protected]b788de02014-04-23 18:06:07938 ssl_config_.false_start_enabled);
939
davidbend80c12c2016-10-11 00:13:49940 SSL_set_mode(ssl_.get(), mode.set_mask);
941 SSL_clear_mode(ssl_.get(), mode.clear_mask);
[email protected]109805a2010-12-07 18:17:06942
davidben4177ecb2016-10-22 01:47:18943 // Use BoringSSL defaults, but disable HMAC-SHA256 and HMAC-SHA384 ciphers
kjellander1ae83a02017-01-26 07:35:09944 // (note that SHA256 and SHA384 only select legacy CBC ciphers).
davidben0b6de432017-03-23 22:11:05945 // Additionally disable HMAC-SHA1 ciphers in ECDSA. These are the remaining
946 // CBC-mode ECDSA ciphers.
947 std::string command("ALL:!SHA256:!SHA384:!kDHE:!aPSK:!RC4:!ECDSA+SHA1");
davidben9b4a9b9c2015-10-12 18:46:51948
949 if (ssl_config_.require_ecdhe)
950 command.append(":!kRSA:!kDHE");
davidben8ecc3072014-09-03 23:19:09951
davidben9b4a9b9c2015-10-12 18:46:51952 // Remove any disabled ciphers.
953 for (uint16_t id : ssl_config_.disabled_cipher_suites) {
954 const SSL_CIPHER* cipher = SSL_get_cipher_by_value(id);
955 if (cipher) {
956 command.append(":!");
957 command.append(SSL_CIPHER_get_name(cipher));
958 }
959 }
960
davidbend80c12c2016-10-11 00:13:49961 int rv = SSL_set_cipher_list(ssl_.get(), command.c_str());
[email protected]109805a2010-12-07 18:17:06962 // If this fails (rv = 0) it means there are no ciphers enabled on this SSL.
963 // This will almost certainly result in the socket failing to complete the
964 // handshake at which point the appropriate error is bubbled up to the client.
965 LOG_IF(WARNING, rv != 1) << "SSL_set_cipher_list('" << command << "') "
svaldeze83af292016-04-26 14:33:37966 "returned "
967 << rv;
[email protected]ee0f2aa82013-10-25 11:59:26968
969 // TLS channel ids.
bnc3cf2a592016-08-11 14:48:36970 if (IsChannelIDEnabled()) {
davidbend80c12c2016-10-11 00:13:49971 SSL_enable_tls_channel_id(ssl_.get());
[email protected]ee0f2aa82013-10-25 11:59:26972 }
973
bnc1f295372015-10-21 23:24:22974 if (!ssl_config_.alpn_protos.empty()) {
bnc988e68d2016-06-27 14:03:21975 std::vector<uint8_t> wire_protos =
976 SerializeNextProtos(ssl_config_.alpn_protos);
davidbend80c12c2016-10-11 00:13:49977 SSL_set_alpn_protos(ssl_.get(),
978 wire_protos.empty() ? NULL : &wire_protos[0],
[email protected]abc44b752014-07-30 03:52:15979 wire_protos.size());
980 }
981
davidbeneb5f8ef32014-09-04 14:14:32982 if (ssl_config_.signed_cert_timestamps_enabled) {
davidbend80c12c2016-10-11 00:13:49983 SSL_enable_signed_cert_timestamps(ssl_.get());
984 SSL_enable_ocsp_stapling(ssl_.get());
davidbeneb5f8ef32014-09-04 14:14:32985 }
986
davidben15f57132015-04-27 18:08:36987 if (cert_verifier_->SupportsOCSPStapling())
davidbend80c12c2016-10-11 00:13:49988 SSL_enable_ocsp_stapling(ssl_.get());
davidbeneb5f8ef32014-09-04 14:14:32989
davidben971a681a2017-02-16 18:57:46990 // Configure BoringSSL to allow renegotiations. Once the initial handshake
991 // completes, if renegotiations are not allowed, the default reject value will
992 // be restored. This is done in this order to permit a BoringSSL
993 // optimization. See https://crbug.com/boringssl/123.
994 SSL_set_renegotiate_mode(ssl_.get(), ssl_renegotiate_freely);
995
[email protected]c8a80e92014-05-17 16:02:08996 return OK;
[email protected]d518cd92010-09-29 12:27:44997}
998
svaldeze83af292016-04-26 14:33:37999void SSLClientSocketImpl::DoReadCallback(int rv) {
[email protected]b9b651f2013-11-09 04:32:221000 // Since Run may result in Read being called, clear |user_read_callback_|
1001 // up front.
[email protected]0dc88b32014-03-26 20:12:281002 if (rv > 0)
1003 was_ever_used_ = true;
xunjieli321a96f32017-03-07 19:42:171004 user_read_buf_ = nullptr;
[email protected]b9b651f2013-11-09 04:32:221005 user_read_buf_len_ = 0;
1006 base::ResetAndReturn(&user_read_callback_).Run(rv);
1007}
1008
svaldeze83af292016-04-26 14:33:371009void SSLClientSocketImpl::DoWriteCallback(int rv) {
[email protected]b9b651f2013-11-09 04:32:221010 // Since Run may result in Write being called, clear |user_write_callback_|
1011 // up front.
[email protected]0dc88b32014-03-26 20:12:281012 if (rv > 0)
1013 was_ever_used_ = true;
[email protected]b9b651f2013-11-09 04:32:221014 user_write_buf_ = NULL;
1015 user_write_buf_len_ = 0;
1016 base::ResetAndReturn(&user_write_callback_).Run(rv);
1017}
1018
pkasting379234c2015-04-08 04:42:121019// TODO(cbentzel): Remove including "base/threading/thread_local.h" and
vadimt6b43dec22015-01-06 01:59:581020// g_first_run_completed once crbug.com/424386 is fixed.
1021base::LazyInstance<base::ThreadLocalBoolean>::Leaky g_first_run_completed =
1022 LAZY_INSTANCE_INITIALIZER;
1023
svaldeze83af292016-04-26 14:33:371024int SSLClientSocketImpl::DoHandshake() {
[email protected]b9b651f2013-11-09 04:32:221025 crypto::OpenSSLErrStackTracer err_tracer(FROM_HERE);
vadimt5a243282014-12-24 00:26:161026
1027 int rv;
1028
pkasting379234c2015-04-08 04:42:121029 // TODO(cbentzel): Leave only 1 call to SSL_do_handshake once crbug.com/424386
vadimt5a243282014-12-24 00:26:161030 // is fixed.
1031 if (ssl_config_.send_client_cert && ssl_config_.client_cert.get()) {
davidbend80c12c2016-10-11 00:13:491032 rv = SSL_do_handshake(ssl_.get());
vadimt5a243282014-12-24 00:26:161033 } else {
vadimt6b43dec22015-01-06 01:59:581034 if (g_first_run_completed.Get().Get()) {
pkasting379234c2015-04-08 04:42:121035 // TODO(cbentzel): Remove ScopedTracker below once crbug.com/424386 is
vadimt6b43dec22015-01-06 01:59:581036 // fixed.
pkasting379234c2015-04-08 04:42:121037 tracked_objects::ScopedTracker tracking_profile(
1038 FROM_HERE_WITH_EXPLICIT_FUNCTION("424386 SSL_do_handshake()"));
vadimt5a243282014-12-24 00:26:161039
davidbend80c12c2016-10-11 00:13:491040 rv = SSL_do_handshake(ssl_.get());
vadimt6b43dec22015-01-06 01:59:581041 } else {
1042 g_first_run_completed.Get().Set(true);
davidbend80c12c2016-10-11 00:13:491043 rv = SSL_do_handshake(ssl_.get());
vadimt6b43dec22015-01-06 01:59:581044 }
vadimt5a243282014-12-24 00:26:161045 }
[email protected]b9b651f2013-11-09 04:32:221046
davidbenc4212c02015-05-12 22:30:181047 int net_error = OK;
1048 if (rv <= 0) {
davidbend80c12c2016-10-11 00:13:491049 int ssl_error = SSL_get_error(ssl_.get(), rv);
[email protected]b9b651f2013-11-09 04:32:221050 if (ssl_error == SSL_ERROR_WANT_CHANNEL_ID_LOOKUP) {
[email protected]faff9852014-06-21 06:13:461051 // The server supports channel ID. Stop to look one up before returning to
1052 // the handshake.
rsleeviadbd4982016-06-13 22:10:271053 next_handshake_state_ = STATE_CHANNEL_ID_LOOKUP;
[email protected]faff9852014-06-21 06:13:461054 return OK;
[email protected]b9b651f2013-11-09 04:32:221055 }
davidbenced4aa9b2015-05-12 21:22:351056 if (ssl_error == SSL_ERROR_WANT_X509_LOOKUP &&
1057 !ssl_config_.send_client_cert) {
1058 return ERR_SSL_CLIENT_AUTH_CERT_NEEDED;
1059 }
davidben1d489522015-07-01 18:48:461060 if (ssl_error == SSL_ERROR_WANT_PRIVATE_KEY_OPERATION) {
svaldez7872fd02015-11-19 21:10:541061 DCHECK(ssl_config_.client_private_key);
davidben1d489522015-07-01 18:48:461062 DCHECK_NE(kNoPendingResult, signature_result_);
rsleeviadbd4982016-06-13 22:10:271063 next_handshake_state_ = STATE_HANDSHAKE;
davidben1d489522015-07-01 18:48:461064 return ERR_IO_PENDING;
1065 }
[email protected]b9b651f2013-11-09 04:32:221066
davidbena4409c62014-08-27 17:05:511067 OpenSSLErrorInfo error_info;
davidbenfe132d92016-09-27 18:07:211068 net_error = MapLastOpenSSLError(ssl_error, err_tracer, &error_info);
[email protected]b9b651f2013-11-09 04:32:221069 if (net_error == ERR_IO_PENDING) {
davidbenc4212c02015-05-12 22:30:181070 // If not done, stay in this state
rsleeviadbd4982016-06-13 22:10:271071 next_handshake_state_ = STATE_HANDSHAKE;
davidbenc4212c02015-05-12 22:30:181072 return ERR_IO_PENDING;
1073 }
1074
1075 LOG(ERROR) << "handshake failed; returned " << rv << ", SSL error code "
1076 << ssl_error << ", net_error " << net_error;
1077 net_log_.AddEvent(
mikecirone8b85c432016-09-08 19:11:001078 NetLogEventType::SSL_HANDSHAKE_ERROR,
davidbenc4212c02015-05-12 22:30:181079 CreateNetLogOpenSSLErrorCallback(net_error, ssl_error, error_info));
1080 }
1081
rsleeviadbd4982016-06-13 22:10:271082 next_handshake_state_ = STATE_HANDSHAKE_COMPLETE;
davidbenc4212c02015-05-12 22:30:181083 return net_error;
1084}
1085
svaldeze83af292016-04-26 14:33:371086int SSLClientSocketImpl::DoHandshakeComplete(int result) {
davidbenc4212c02015-05-12 22:30:181087 if (result < 0)
1088 return result;
1089
davidben095ebb52017-04-12 22:23:341090 if (ssl_config_.version_interference_probe) {
1091 DCHECK_LT(ssl_config_.version_max, TLS1_3_VERSION);
1092 return ERR_SSL_VERSION_INTERFERENCE;
1093 }
1094
nharper00d06ff2017-01-20 00:55:561095 SSLContext::GetInstance()->session_cache()->ResetLookupCount(
1096 GetSessionCacheKey());
nharper736ceda2015-11-07 00:16:591097 // Check that if token binding was negotiated, then extended master secret
nharper78e6d2b2016-09-21 05:42:351098 // and renegotiation indication must also be negotiated.
1099 if (tb_was_negotiated_ &&
davidbend80c12c2016-10-11 00:13:491100 !(SSL_get_extms_support(ssl_.get()) &&
1101 SSL_get_secure_renegotiation_support(ssl_.get()))) {
nharper736ceda2015-11-07 00:16:591102 return ERR_SSL_PROTOCOL_ERROR;
nharper78e6d2b2016-09-21 05:42:351103 }
nharper736ceda2015-11-07 00:16:591104
bncce6ea242016-09-15 20:22:321105 const uint8_t* alpn_proto = NULL;
1106 unsigned alpn_len = 0;
davidbend80c12c2016-10-11 00:13:491107 SSL_get0_alpn_selected(ssl_.get(), &alpn_proto, &alpn_len);
bncce6ea242016-09-15 20:22:321108 if (alpn_len > 0) {
1109 base::StringPiece proto(reinterpret_cast<const char*>(alpn_proto),
1110 alpn_len);
1111 negotiated_protocol_ = NextProtoFromString(proto);
[email protected]b9b651f2013-11-09 04:32:221112 }
davidbenc4212c02015-05-12 22:30:181113
nharperf5f8823d2017-03-01 23:52:401114 // If we got a session from the session cache, log how many concurrent
1115 // handshakes that session was used in before we finished our handshake. This
1116 // is only recorded if the session from the cache was actually used, and only
1117 // if the ALPN protocol is h2 (under the assumption that TLS 1.3 servers will
1118 // be speaking h2). See https://crbug.com/631988.
1119 if (ssl_session_cache_lookup_count_ && negotiated_protocol_ == kProtoHTTP2 &&
1120 SSL_session_reused(ssl_.get())) {
1121 UMA_HISTOGRAM_EXACT_LINEAR("Net.SSLSessionConcurrentLookupCount",
1122 ssl_session_cache_lookup_count_, 20);
1123 }
1124
bncbd442c22016-09-14 20:49:161125 RecordNegotiatedProtocol();
bnc3cf2a592016-08-11 14:48:361126 RecordChannelIDSupport();
davidbenc4212c02015-05-12 22:30:181127
dadriand476e652016-07-26 21:33:241128 const uint8_t* ocsp_response_raw;
1129 size_t ocsp_response_len;
davidbend80c12c2016-10-11 00:13:491130 SSL_get0_ocsp_response(ssl_.get(), &ocsp_response_raw, &ocsp_response_len);
dadriand476e652016-07-26 21:33:241131 set_stapled_ocsp_response_received(ocsp_response_len != 0);
1132 UMA_HISTOGRAM_BOOLEAN("Net.OCSPResponseStapled", ocsp_response_len != 0);
davidbenc4212c02015-05-12 22:30:181133
1134 const uint8_t* sct_list;
1135 size_t sct_list_len;
davidbend80c12c2016-10-11 00:13:491136 SSL_get0_signed_cert_timestamp_list(ssl_.get(), &sct_list, &sct_list_len);
davidbenc4212c02015-05-12 22:30:181137 set_signed_cert_timestamps_received(sct_list_len != 0);
1138
davidben971a681a2017-02-16 18:57:461139 if (!IsRenegotiationAllowed())
1140 SSL_set_renegotiate_mode(ssl_.get(), ssl_renegotiate_never);
davidbenc4212c02015-05-12 22:30:181141
davidbend80c12c2016-10-11 00:13:491142 uint16_t signature_algorithm = SSL_get_peer_signature_algorithm(ssl_.get());
davidben0653c8d2016-07-08 02:16:171143 if (signature_algorithm != 0) {
1144 UMA_HISTOGRAM_SPARSE_SLOWLY("Net.SSLSignatureAlgorithm",
1145 signature_algorithm);
davidben4fe4f982015-11-11 22:00:121146 }
1147
davidbenc4212c02015-05-12 22:30:181148 // Verify the certificate.
rsleeviadbd4982016-06-13 22:10:271149 next_handshake_state_ = STATE_VERIFY_CERT;
davidbenc4212c02015-05-12 22:30:181150 return OK;
[email protected]b9b651f2013-11-09 04:32:221151}
1152
svaldeze83af292016-04-26 14:33:371153int SSLClientSocketImpl::DoChannelIDLookup() {
mikecironef22f9812016-10-04 03:40:191154 NetLogParametersCallback callback = base::Bind(
nharper49b27d992016-02-09 18:28:511155 &NetLogChannelIDLookupCallback, base::Unretained(channel_id_service_));
mikecirone8b85c432016-09-08 19:11:001156 net_log_.BeginEvent(NetLogEventType::SSL_GET_CHANNEL_ID, callback);
rsleeviadbd4982016-06-13 22:10:271157 next_handshake_state_ = STATE_CHANNEL_ID_LOOKUP_COMPLETE;
[email protected]6b8a3c742014-07-25 00:25:351158 return channel_id_service_->GetOrCreateChannelID(
nharper2e171cf2015-06-01 20:29:231159 host_and_port_.host(), &channel_id_key_,
svaldeze83af292016-04-26 14:33:371160 base::Bind(&SSLClientSocketImpl::OnHandshakeIOComplete,
[email protected]faff9852014-06-21 06:13:461161 base::Unretained(this)),
nharper75ade892015-06-10 19:05:351162 &channel_id_request_);
[email protected]faff9852014-06-21 06:13:461163}
1164
svaldeze83af292016-04-26 14:33:371165int SSLClientSocketImpl::DoChannelIDLookupComplete(int result) {
mikecirone8b85c432016-09-08 19:11:001166 net_log_.EndEvent(NetLogEventType::SSL_GET_CHANNEL_ID,
nharper49b27d992016-02-09 18:28:511167 base::Bind(&NetLogChannelIDLookupCompleteCallback,
1168 channel_id_key_.get(), result));
[email protected]faff9852014-06-21 06:13:461169 if (result < 0)
1170 return result;
1171
[email protected]faff9852014-06-21 06:13:461172 // Hand the key to OpenSSL. Check for error in case OpenSSL rejects the key
1173 // type.
davidben8a208fc2016-01-22 17:08:081174 DCHECK(channel_id_key_);
[email protected]faff9852014-06-21 06:13:461175 crypto::OpenSSLErrStackTracer err_tracer(FROM_HERE);
davidbend80c12c2016-10-11 00:13:491176 if (!SSL_set1_tls_channel_id(ssl_.get(), channel_id_key_->key())) {
[email protected]faff9852014-06-21 06:13:461177 LOG(ERROR) << "Failed to set Channel ID.";
davidbenf225b262016-09-15 22:09:221178 return ERR_FAILED;
[email protected]faff9852014-06-21 06:13:461179 }
1180
1181 // Return to the handshake.
davidben52053b382015-04-27 19:22:291182 channel_id_sent_ = true;
rsleeviadbd4982016-06-13 22:10:271183 next_handshake_state_ = STATE_HANDSHAKE;
[email protected]faff9852014-06-21 06:13:461184 return OK;
1185}
1186
svaldeze83af292016-04-26 14:33:371187int SSLClientSocketImpl::DoVerifyCert(int result) {
davidben09c3d072014-08-25 20:33:581188 DCHECK(start_cert_verification_time_.is_null());
davidben30798ed82014-09-19 19:28:201189
davidbena35b40c32017-03-09 17:33:451190 server_cert_ = OSChainFromBuffers(SSL_get0_peer_certificates(ssl_.get()));
[email protected]b9b651f2013-11-09 04:32:221191
davidbenc6435a72015-08-17 18:28:521192 // OpenSSL decoded the certificate, but the platform certificate
1193 // implementation could not. This is treated as a fatal SSL-level protocol
1194 // error rather than a certificate error. See https://crbug.com/91341.
rsleevi74e99742016-09-13 20:35:251195 if (!server_cert_)
davidbenc6435a72015-08-17 18:28:521196 return ERR_SSL_SERVER_CERT_BAD_FORMAT;
1197
davidbenc7e06c92017-03-07 18:54:111198 net_log_.AddEvent(NetLogEventType::SSL_CERTIFICATES_RECEIVED,
1199 base::Bind(&NetLogX509CertificateCallback,
1200 base::Unretained(server_cert_.get())));
1201
1202 next_handshake_state_ = STATE_VERIFY_CERT_COMPLETE;
1203
davidben30798ed82014-09-19 19:28:201204 // If the certificate is bad and has been previously accepted, use
1205 // the previous status and bypass the error.
[email protected]b9b651f2013-11-09 04:32:221206 CertStatus cert_status;
rsleevi74e99742016-09-13 20:35:251207 if (ssl_config_.IsAllowedBadCert(server_cert_.get(), &cert_status)) {
[email protected]b9b651f2013-11-09 04:32:221208 server_cert_verify_result_.Reset();
1209 server_cert_verify_result_.cert_status = cert_status;
1210 server_cert_verify_result_.verified_cert = server_cert_;
1211 return OK;
1212 }
1213
davidben09c3d072014-08-25 20:33:581214 start_cert_verification_time_ = base::TimeTicks::Now();
1215
rsleevi22cae1672016-12-28 01:53:361216 const uint8_t* ocsp_response_raw;
1217 size_t ocsp_response_len;
1218 SSL_get0_ocsp_response(ssl_.get(), &ocsp_response_raw, &ocsp_response_len);
1219 base::StringPiece ocsp_response(
1220 reinterpret_cast<const char*>(ocsp_response_raw), ocsp_response_len);
1221
eroman7f9236a2015-05-11 21:23:431222 return cert_verifier_->Verify(
rsleevi06bd78552016-06-08 22:34:461223 CertVerifier::RequestParams(server_cert_, host_and_port_.host(),
1224 ssl_config_.GetCertVerifyFlags(),
rsleevi22cae1672016-12-28 01:53:361225 ocsp_response.as_string(), CertificateList()),
[email protected]591cffcd2014-08-18 20:02:301226 // TODO(davidben): Route the CRLSet through SSLConfig so
1227 // SSLClientSocket doesn't depend on SSLConfigService.
davidben15f57132015-04-27 18:08:361228 SSLConfigService::GetCRLSet().get(), &server_cert_verify_result_,
svaldeze83af292016-04-26 14:33:371229 base::Bind(&SSLClientSocketImpl::OnHandshakeIOComplete,
[email protected]b9b651f2013-11-09 04:32:221230 base::Unretained(this)),
eroman7f9236a2015-05-11 21:23:431231 &cert_verifier_request_, net_log_);
[email protected]b9b651f2013-11-09 04:32:221232}
1233
svaldeze83af292016-04-26 14:33:371234int SSLClientSocketImpl::DoVerifyCertComplete(int result) {
eroman7f9236a2015-05-11 21:23:431235 cert_verifier_request_.reset();
[email protected]b9b651f2013-11-09 04:32:221236
davidben09c3d072014-08-25 20:33:581237 if (!start_cert_verification_time_.is_null()) {
1238 base::TimeDelta verify_time =
1239 base::TimeTicks::Now() - start_cert_verification_time_;
1240 if (result == OK) {
1241 UMA_HISTOGRAM_TIMES("Net.SSLCertVerificationTime", verify_time);
1242 } else {
1243 UMA_HISTOGRAM_TIMES("Net.SSLCertVerificationTimeError", verify_time);
1244 }
1245 }
1246
rsleevi4a6ca8c2016-06-24 03:05:221247 // If the connection was good, check HPKP and CT status simultaneously,
1248 // but prefer to treat the HPKP error as more serious, if there was one.
[email protected]8bd4e7a2014-08-09 14:49:171249 const CertStatus cert_status = server_cert_verify_result_.cert_status;
rsleevi4a6ca8c2016-06-24 03:05:221250 if ((result == OK ||
dadrian8f8946652016-06-21 23:48:311251 (IsCertificateError(result) && IsCertStatusMinorError(cert_status)))) {
rsleevi4a6ca8c2016-06-24 03:05:221252 int ct_result = VerifyCT();
dadrian8f8946652016-06-21 23:48:311253 TransportSecurityState::PKPStatus pin_validity =
1254 transport_security_state_->CheckPublicKeyPins(
1255 host_and_port_, server_cert_verify_result_.is_issued_by_known_root,
1256 server_cert_verify_result_.public_key_hashes, server_cert_.get(),
1257 server_cert_verify_result_.verified_cert.get(),
1258 TransportSecurityState::ENABLE_PIN_REPORTS, &pinning_failure_log_);
1259 switch (pin_validity) {
1260 case TransportSecurityState::PKPStatus::VIOLATED:
1261 server_cert_verify_result_.cert_status |=
1262 CERT_STATUS_PINNED_KEY_MISSING;
1263 result = ERR_SSL_PINNED_KEY_NOT_IN_CERT_CHAIN;
1264 break;
1265 case TransportSecurityState::PKPStatus::BYPASSED:
1266 pkp_bypassed_ = true;
1267 // Fall through.
1268 case TransportSecurityState::PKPStatus::OK:
1269 // Do nothing.
1270 break;
rsleevi9545d342016-06-21 03:17:371271 }
rsleevi4a6ca8c2016-06-24 03:05:221272 if (result != ERR_SSL_PINNED_KEY_NOT_IN_CERT_CHAIN && ct_result != OK)
1273 result = ct_result;
[email protected]8bd4e7a2014-08-09 14:49:171274 }
1275
[email protected]b9b651f2013-11-09 04:32:221276 if (result == OK) {
davidbendafe4e52015-04-08 22:53:521277 DCHECK(!certificate_verified_);
1278 certificate_verified_ = true;
1279 MaybeCacheSession();
dadriand476e652016-07-26 21:33:241280 SSLInfo ssl_info;
1281 bool ok = GetSSLInfo(&ssl_info);
1282 DCHECK(ok);
rsleevi22cae1672016-12-28 01:53:361283
1284 const uint8_t* ocsp_response_raw;
1285 size_t ocsp_response_len;
1286 SSL_get0_ocsp_response(ssl_.get(), &ocsp_response_raw, &ocsp_response_len);
1287 base::StringPiece ocsp_response(
1288 reinterpret_cast<const char*>(ocsp_response_raw), ocsp_response_len);
1289
dadriand476e652016-07-26 21:33:241290 transport_security_state_->CheckExpectStaple(host_and_port_, ssl_info,
rsleevi22cae1672016-12-28 01:53:361291 ocsp_response);
[email protected]b9b651f2013-11-09 04:32:221292 }
1293
[email protected]64b5c892014-08-08 09:39:261294 completed_connect_ = true;
[email protected]b9b651f2013-11-09 04:32:221295 // Exit DoHandshakeLoop and return the result to the caller to Connect.
1296 DCHECK_EQ(STATE_NONE, next_handshake_state_);
1297 return result;
1298}
1299
svaldeze83af292016-04-26 14:33:371300void SSLClientSocketImpl::DoConnectCallback(int rv) {
[email protected]b9b651f2013-11-09 04:32:221301 if (!user_connect_callback_.is_null()) {
1302 CompletionCallback c = user_connect_callback_;
1303 user_connect_callback_.Reset();
1304 c.Run(rv > OK ? OK : rv);
1305 }
1306}
1307
svaldeze83af292016-04-26 14:33:371308void SSLClientSocketImpl::OnHandshakeIOComplete(int result) {
[email protected]b9b651f2013-11-09 04:32:221309 int rv = DoHandshakeLoop(result);
1310 if (rv != ERR_IO_PENDING) {
davidben281d13f02016-04-27 20:43:281311 LogConnectEndEvent(rv);
[email protected]b9b651f2013-11-09 04:32:221312 DoConnectCallback(rv);
1313 }
1314}
1315
svaldeze83af292016-04-26 14:33:371316int SSLClientSocketImpl::DoHandshakeLoop(int last_io_result) {
xunjieli0b7f5b62016-12-06 20:43:481317 TRACE_EVENT0(kNetTracingCategory, "SSLClientSocketImpl::DoHandshakeLoop");
[email protected]b9b651f2013-11-09 04:32:221318 int rv = last_io_result;
1319 do {
1320 // Default to STATE_NONE for next state.
1321 // (This is a quirk carried over from the windows
1322 // implementation. It makes reading the logs a bit harder.)
1323 // State handlers can and often do call GotoState just
1324 // to stay in the current state.
1325 State state = next_handshake_state_;
rsleeviadbd4982016-06-13 22:10:271326 next_handshake_state_ = STATE_NONE;
[email protected]b9b651f2013-11-09 04:32:221327 switch (state) {
1328 case STATE_HANDSHAKE:
1329 rv = DoHandshake();
1330 break;
davidbenc4212c02015-05-12 22:30:181331 case STATE_HANDSHAKE_COMPLETE:
1332 rv = DoHandshakeComplete(rv);
1333 break;
[email protected]faff9852014-06-21 06:13:461334 case STATE_CHANNEL_ID_LOOKUP:
1335 DCHECK_EQ(OK, rv);
1336 rv = DoChannelIDLookup();
svaldeze83af292016-04-26 14:33:371337 break;
[email protected]faff9852014-06-21 06:13:461338 case STATE_CHANNEL_ID_LOOKUP_COMPLETE:
1339 rv = DoChannelIDLookupComplete(rv);
1340 break;
[email protected]b9b651f2013-11-09 04:32:221341 case STATE_VERIFY_CERT:
[email protected]faff9852014-06-21 06:13:461342 DCHECK_EQ(OK, rv);
[email protected]b9b651f2013-11-09 04:32:221343 rv = DoVerifyCert(rv);
svaldeze83af292016-04-26 14:33:371344 break;
[email protected]b9b651f2013-11-09 04:32:221345 case STATE_VERIFY_CERT_COMPLETE:
1346 rv = DoVerifyCertComplete(rv);
1347 break;
1348 case STATE_NONE:
1349 default:
1350 rv = ERR_UNEXPECTED;
1351 NOTREACHED() << "unexpected state" << state;
1352 break;
1353 }
[email protected]b9b651f2013-11-09 04:32:221354 } while (rv != ERR_IO_PENDING && next_handshake_state_ != STATE_NONE);
1355 return rv;
1356}
1357
xunjieli321a96f32017-03-07 19:42:171358int SSLClientSocketImpl::DoPayloadRead(IOBuffer* buf, int buf_len) {
[email protected]b9b651f2013-11-09 04:32:221359 crypto::OpenSSLErrStackTracer err_tracer(FROM_HERE);
1360
xunjieli321a96f32017-03-07 19:42:171361 DCHECK_LT(0, buf_len);
1362 DCHECK(buf);
davidben7e555daf2015-03-25 17:03:291363
[email protected]b9b651f2013-11-09 04:32:221364 int rv;
davidben1d489522015-07-01 18:48:461365 if (pending_read_error_ != kNoPendingResult) {
[email protected]b9b651f2013-11-09 04:32:221366 rv = pending_read_error_;
davidben1d489522015-07-01 18:48:461367 pending_read_error_ = kNoPendingResult;
[email protected]b9b651f2013-11-09 04:32:221368 if (rv == 0) {
mikecirone8b85c432016-09-08 19:11:001369 net_log_.AddByteTransferEvent(NetLogEventType::SSL_SOCKET_BYTES_RECEIVED,
xunjieli321a96f32017-03-07 19:42:171370 rv, buf->data());
davidbenb8c23212014-10-28 00:12:161371 } else {
1372 net_log_.AddEvent(
mikecirone8b85c432016-09-08 19:11:001373 NetLogEventType::SSL_READ_ERROR,
davidbenb8c23212014-10-28 00:12:161374 CreateNetLogOpenSSLErrorCallback(rv, pending_read_ssl_error_,
1375 pending_read_error_info_));
[email protected]b9b651f2013-11-09 04:32:221376 }
davidbenb8c23212014-10-28 00:12:161377 pending_read_ssl_error_ = SSL_ERROR_NONE;
1378 pending_read_error_info_ = OpenSSLErrorInfo();
[email protected]b9b651f2013-11-09 04:32:221379 return rv;
1380 }
1381
1382 int total_bytes_read = 0;
davidben7e555daf2015-03-25 17:03:291383 int ssl_ret;
[email protected]b9b651f2013-11-09 04:32:221384 do {
xunjieli321a96f32017-03-07 19:42:171385 ssl_ret = SSL_read(ssl_.get(), buf->data() + total_bytes_read,
1386 buf_len - total_bytes_read);
davidben7e555daf2015-03-25 17:03:291387 if (ssl_ret > 0)
1388 total_bytes_read += ssl_ret;
davidben8ea6b172017-03-07 23:53:501389 // Continue processing records as long as there is more data available
1390 // synchronously.
1391 } while (total_bytes_read < buf_len && ssl_ret > 0 &&
1392 transport_adapter_->HasPendingReadData());
[email protected]b9b651f2013-11-09 04:32:221393
davidben7e555daf2015-03-25 17:03:291394 // Although only the final SSL_read call may have failed, the failure needs to
1395 // processed immediately, while the information still available in OpenSSL's
1396 // error queue.
davidbenced4aa9b2015-05-12 21:22:351397 if (ssl_ret <= 0) {
davidben7e555daf2015-03-25 17:03:291398 // A zero return from SSL_read may mean any of:
1399 // - The underlying BIO_read returned 0.
1400 // - The peer sent a close_notify.
1401 // - Any arbitrary error. https://crbug.com/466303
[email protected]b9b651f2013-11-09 04:32:221402 //
davidben7e555daf2015-03-25 17:03:291403 // TransportReadComplete converts the first to an ERR_CONNECTION_CLOSED
1404 // error, so it does not occur. The second and third are distinguished by
1405 // SSL_ERROR_ZERO_RETURN.
davidbend80c12c2016-10-11 00:13:491406 pending_read_ssl_error_ = SSL_get_error(ssl_.get(), ssl_ret);
davidben7e555daf2015-03-25 17:03:291407 if (pending_read_ssl_error_ == SSL_ERROR_ZERO_RETURN) {
1408 pending_read_error_ = 0;
davidbenced4aa9b2015-05-12 21:22:351409 } else if (pending_read_ssl_error_ == SSL_ERROR_WANT_X509_LOOKUP &&
1410 !ssl_config_.send_client_cert) {
1411 pending_read_error_ = ERR_SSL_CLIENT_AUTH_CERT_NEEDED;
davidben1d489522015-07-01 18:48:461412 } else if (pending_read_ssl_error_ ==
1413 SSL_ERROR_WANT_PRIVATE_KEY_OPERATION) {
svaldez7872fd02015-11-19 21:10:541414 DCHECK(ssl_config_.client_private_key);
davidben1d489522015-07-01 18:48:461415 DCHECK_NE(kNoPendingResult, signature_result_);
1416 pending_read_error_ = ERR_IO_PENDING;
davidben7e555daf2015-03-25 17:03:291417 } else {
davidbenfe132d92016-09-27 18:07:211418 pending_read_error_ = MapLastOpenSSLError(
davidben7e555daf2015-03-25 17:03:291419 pending_read_ssl_error_, err_tracer, &pending_read_error_info_);
[email protected]b9b651f2013-11-09 04:32:221420 }
1421
davidben7e555daf2015-03-25 17:03:291422 // Many servers do not reliably send a close_notify alert when shutting down
1423 // a connection, and instead terminate the TCP connection. This is reported
1424 // as ERR_CONNECTION_CLOSED. Because of this, map the unclean shutdown to a
1425 // graceful EOF, instead of treating it as an error as it should be.
1426 if (pending_read_error_ == ERR_CONNECTION_CLOSED)
1427 pending_read_error_ = 0;
1428 }
davidbenbe6ce7ec2014-10-20 19:15:561429
davidben7e555daf2015-03-25 17:03:291430 if (total_bytes_read > 0) {
1431 // Return any bytes read to the caller. The error will be deferred to the
1432 // next call of DoPayloadRead.
1433 rv = total_bytes_read;
davidbenbe6ce7ec2014-10-20 19:15:561434
davidben7e555daf2015-03-25 17:03:291435 // Do not treat insufficient data as an error to return in the next call to
1436 // DoPayloadRead() - instead, let the call fall through to check SSL_read()
davidben3418e81f2016-10-19 00:09:451437 // again. The transport may have data available by then.
davidben7e555daf2015-03-25 17:03:291438 if (pending_read_error_ == ERR_IO_PENDING)
davidben1d489522015-07-01 18:48:461439 pending_read_error_ = kNoPendingResult;
davidben7e555daf2015-03-25 17:03:291440 } else {
1441 // No bytes were returned. Return the pending read error immediately.
davidben1d489522015-07-01 18:48:461442 DCHECK_NE(kNoPendingResult, pending_read_error_);
davidben7e555daf2015-03-25 17:03:291443 rv = pending_read_error_;
davidben1d489522015-07-01 18:48:461444 pending_read_error_ = kNoPendingResult;
[email protected]b9b651f2013-11-09 04:32:221445 }
1446
1447 if (rv >= 0) {
mikecirone8b85c432016-09-08 19:11:001448 net_log_.AddByteTransferEvent(NetLogEventType::SSL_SOCKET_BYTES_RECEIVED,
xunjieli321a96f32017-03-07 19:42:171449 rv, buf->data());
davidbenb8c23212014-10-28 00:12:161450 } else if (rv != ERR_IO_PENDING) {
1451 net_log_.AddEvent(
mikecirone8b85c432016-09-08 19:11:001452 NetLogEventType::SSL_READ_ERROR,
davidbenb8c23212014-10-28 00:12:161453 CreateNetLogOpenSSLErrorCallback(rv, pending_read_ssl_error_,
1454 pending_read_error_info_));
1455 pending_read_ssl_error_ = SSL_ERROR_NONE;
1456 pending_read_error_info_ = OpenSSLErrorInfo();
[email protected]b9b651f2013-11-09 04:32:221457 }
1458 return rv;
1459}
1460
svaldeze83af292016-04-26 14:33:371461int SSLClientSocketImpl::DoPayloadWrite() {
[email protected]b9b651f2013-11-09 04:32:221462 crypto::OpenSSLErrStackTracer err_tracer(FROM_HERE);
davidbend80c12c2016-10-11 00:13:491463 int rv = SSL_write(ssl_.get(), user_write_buf_->data(), user_write_buf_len_);
rsleevif020edc2015-03-16 19:31:241464
[email protected]b9b651f2013-11-09 04:32:221465 if (rv >= 0) {
mikecirone8b85c432016-09-08 19:11:001466 net_log_.AddByteTransferEvent(NetLogEventType::SSL_SOCKET_BYTES_SENT, rv,
[email protected]b9b651f2013-11-09 04:32:221467 user_write_buf_->data());
1468 return rv;
1469 }
1470
davidbend80c12c2016-10-11 00:13:491471 int ssl_error = SSL_get_error(ssl_.get(), rv);
davidben1d489522015-07-01 18:48:461472 if (ssl_error == SSL_ERROR_WANT_PRIVATE_KEY_OPERATION)
1473 return ERR_IO_PENDING;
davidbenb8c23212014-10-28 00:12:161474 OpenSSLErrorInfo error_info;
davidbenfe132d92016-09-27 18:07:211475 int net_error = MapLastOpenSSLError(ssl_error, err_tracer, &error_info);
davidbenb8c23212014-10-28 00:12:161476
1477 if (net_error != ERR_IO_PENDING) {
1478 net_log_.AddEvent(
mikecirone8b85c432016-09-08 19:11:001479 NetLogEventType::SSL_WRITE_ERROR,
davidbenb8c23212014-10-28 00:12:161480 CreateNetLogOpenSSLErrorCallback(net_error, ssl_error, error_info));
1481 }
1482 return net_error;
[email protected]b9b651f2013-11-09 04:32:221483}
1484
davidben3418e81f2016-10-19 00:09:451485void SSLClientSocketImpl::RetryAllOperations() {
1486 // SSL_do_handshake, SSL_read, and SSL_write may all be retried when blocked,
1487 // so retry all operations for simplicity. (Otherwise, SSL_get_error for each
1488 // operation may be remembered to retry only the blocked ones.)
1489
1490 if (next_handshake_state_ == STATE_HANDSHAKE) {
1491 // In handshake phase. The parameter to OnHandshakeIOComplete is unused.
1492 OnHandshakeIOComplete(OK);
1493 return;
1494 }
1495
davidben1d489522015-07-01 18:48:461496 int rv_read = ERR_IO_PENDING;
1497 int rv_write = ERR_IO_PENDING;
xunjieli321a96f32017-03-07 19:42:171498 if (user_read_buf_) {
1499 rv_read = DoPayloadRead(user_read_buf_.get(), user_read_buf_len_);
1500 } else if (!user_read_callback_.is_null()) {
1501 // ReadIfReady() is called by the user. Skip DoPayloadRead() and just let
1502 // the user know that read can be retried.
1503 rv_read = OK;
1504 }
1505
davidben3418e81f2016-10-19 00:09:451506 if (user_write_buf_)
1507 rv_write = DoPayloadWrite();
davidben1d489522015-07-01 18:48:461508
1509 // Performing the Read callback may cause |this| to be deleted. If this
1510 // happens, the Write callback should not be invoked. Guard against this by
1511 // holding a WeakPtr to |this| and ensuring it's still valid.
svaldeze83af292016-04-26 14:33:371512 base::WeakPtr<SSLClientSocketImpl> guard(weak_factory_.GetWeakPtr());
davidben3418e81f2016-10-19 00:09:451513 if (rv_read != ERR_IO_PENDING)
davidben1d489522015-07-01 18:48:461514 DoReadCallback(rv_read);
1515
1516 if (!guard.get())
1517 return;
1518
davidben3418e81f2016-10-19 00:09:451519 if (rv_write != ERR_IO_PENDING)
davidben1d489522015-07-01 18:48:461520 DoWriteCallback(rv_write);
1521}
1522
rsleevi4a6ca8c2016-06-24 03:05:221523int SSLClientSocketImpl::VerifyCT() {
rsleevi4a6ca8c2016-06-24 03:05:221524 const uint8_t* sct_list_raw;
1525 size_t sct_list_len;
davidbend80c12c2016-10-11 00:13:491526 SSL_get0_signed_cert_timestamp_list(ssl_.get(), &sct_list_raw, &sct_list_len);
rsleevi22cae1672016-12-28 01:53:361527 base::StringPiece sct_list(reinterpret_cast<const char*>(sct_list_raw),
1528 sct_list_len);
1529
1530 const uint8_t* ocsp_response_raw;
1531 size_t ocsp_response_len;
1532 SSL_get0_ocsp_response(ssl_.get(), &ocsp_response_raw, &ocsp_response_len);
1533 base::StringPiece ocsp_response(
1534 reinterpret_cast<const char*>(ocsp_response_raw), ocsp_response_len);
rsleevi4a6ca8c2016-06-24 03:05:221535
1536 // Note that this is a completely synchronous operation: The CT Log Verifier
1537 // gets all the data it needs for SCT verification and does not do any
1538 // external communication.
1539 cert_transparency_verifier_->Verify(
rsleevi22cae1672016-12-28 01:53:361540 server_cert_verify_result_.verified_cert.get(), ocsp_response, sct_list,
eranmdcec9632016-10-10 14:16:101541 &ct_verify_result_.scts, net_log_);
rsleevi4a6ca8c2016-06-24 03:05:221542
1543 ct_verify_result_.ct_policies_applied = true;
1544 ct_verify_result_.ev_policy_compliance =
1545 ct::EVPolicyCompliance::EV_POLICY_DOES_NOT_APPLY;
eranm4bed0b572016-08-14 21:00:351546
1547 SCTList verified_scts =
1548 ct::SCTsMatchingStatus(ct_verify_result_.scts, ct::SCT_STATUS_OK);
1549
rsleevi4a6ca8c2016-06-24 03:05:221550 if (server_cert_verify_result_.cert_status & CERT_STATUS_IS_EV) {
1551 scoped_refptr<ct::EVCertsWhitelist> ev_whitelist =
1552 SSLConfigService::GetEVCertsWhitelist();
1553 ct::EVPolicyCompliance ev_policy_compliance =
1554 policy_enforcer_->DoesConformToCTEVPolicy(
1555 server_cert_verify_result_.verified_cert.get(), ev_whitelist.get(),
eranm4bed0b572016-08-14 21:00:351556 verified_scts, net_log_);
rsleevi4a6ca8c2016-06-24 03:05:221557 ct_verify_result_.ev_policy_compliance = ev_policy_compliance;
1558 if (ev_policy_compliance !=
1559 ct::EVPolicyCompliance::EV_POLICY_DOES_NOT_APPLY &&
1560 ev_policy_compliance !=
1561 ct::EVPolicyCompliance::EV_POLICY_COMPLIES_VIA_WHITELIST &&
1562 ev_policy_compliance !=
1563 ct::EVPolicyCompliance::EV_POLICY_COMPLIES_VIA_SCTS) {
1564 server_cert_verify_result_.cert_status |=
1565 CERT_STATUS_CT_COMPLIANCE_FAILED;
1566 server_cert_verify_result_.cert_status &= ~CERT_STATUS_IS_EV;
1567 }
1568 }
1569 ct_verify_result_.cert_policy_compliance =
1570 policy_enforcer_->DoesConformToCertPolicy(
eranm4bed0b572016-08-14 21:00:351571 server_cert_verify_result_.verified_cert.get(), verified_scts,
1572 net_log_);
rsleevi4a6ca8c2016-06-24 03:05:221573
1574 if (ct_verify_result_.cert_policy_compliance !=
1575 ct::CertPolicyCompliance::CERT_POLICY_COMPLIES_VIA_SCTS &&
rsleeviec8e4312016-11-12 00:32:281576 ct_verify_result_.cert_policy_compliance !=
1577 ct::CertPolicyCompliance::CERT_POLICY_BUILD_NOT_TIMELY &&
rsleevi4a6ca8c2016-06-24 03:05:221578 transport_security_state_->ShouldRequireCT(
1579 host_and_port_.host(), server_cert_verify_result_.verified_cert.get(),
1580 server_cert_verify_result_.public_key_hashes)) {
1581 server_cert_verify_result_.cert_status |=
1582 CERT_STATUS_CERTIFICATE_TRANSPARENCY_REQUIRED;
1583 return ERR_CERTIFICATE_TRANSPARENCY_REQUIRED;
1584 }
1585
1586 return OK;
1587}
1588
svaldeze83af292016-04-26 14:33:371589int SSLClientSocketImpl::ClientCertRequestCallback(SSL* ssl) {
davidbend80c12c2016-10-11 00:13:491590 DCHECK(ssl == ssl_.get());
[email protected]82c59022014-08-15 09:38:271591
mikecirone8b85c432016-09-08 19:11:001592 net_log_.AddEvent(NetLogEventType::SSL_CLIENT_CERT_REQUESTED);
davidbenfe132d92016-09-27 18:07:211593 certificate_requested_ = true;
davidbenaf42cbe2014-11-13 03:27:461594
[email protected]82c59022014-08-15 09:38:271595 // Clear any currently configured certificates.
davidbend80c12c2016-10-11 00:13:491596 SSL_certs_clear(ssl_.get());
[email protected]97a854f2014-07-29 07:51:361597
1598#if defined(OS_IOS)
1599 // TODO(droger): Support client auth on iOS. See http://crbug.com/145954).
1600 LOG(WARNING) << "Client auth is not supported";
svaldeze83af292016-04-26 14:33:371601#else // !defined(OS_IOS)
[email protected]5ac981e182010-12-06 17:56:271602 if (!ssl_config_.send_client_cert) {
[email protected]515adc22013-01-09 16:01:231603 // First pass: we know that a client certificate is needed, but we do not
davidbenb11fd212017-01-12 17:08:031604 // have one at hand. Suspend the handshake. SSL_get_error will return
1605 // SSL_ERROR_WANT_X509_LOOKUP.
davidbenced4aa9b2015-05-12 21:22:351606 return -1;
[email protected]5ac981e182010-12-06 17:56:271607 }
1608
1609 // Second pass: a client certificate should have been selected.
[email protected]13914c92013-06-13 22:42:421610 if (ssl_config_.client_cert.get()) {
svaldez7872fd02015-11-19 21:10:541611 if (!ssl_config_.client_private_key) {
1612 // The caller supplied a null private key. Fail the handshake and surface
1613 // an appropriate error to the caller.
davidben1d489522015-07-01 18:48:461614 LOG(WARNING) << "Client cert found without private key";
1615 OpenSSLPutNetError(FROM_HERE, ERR_SSL_CLIENT_AUTH_CERT_NO_PRIVATE_KEY);
1616 return -1;
1617 }
1618
mattm4cede8d2017-04-11 02:55:011619#if BUILDFLAG(USE_BYTE_CERTS)
1620 std::vector<CRYPTO_BUFFER*> chain_raw;
1621 chain_raw.push_back(ssl_config_.client_cert->os_cert_handle());
1622 for (X509Certificate::OSCertHandle cert :
1623 ssl_config_.client_cert->GetIntermediateCertificates()) {
1624 chain_raw.push_back(cert);
1625 }
1626#else
davidbena35b40c32017-03-09 17:33:451627 std::vector<bssl::UniquePtr<CRYPTO_BUFFER>> chain;
1628 std::vector<CRYPTO_BUFFER*> chain_raw;
1629 bssl::UniquePtr<CRYPTO_BUFFER> buf =
1630 OSCertHandleToBuffer(ssl_config_.client_cert->os_cert_handle());
1631 if (!buf) {
1632 LOG(WARNING) << "Failed to import certificate";
1633 OpenSSLPutNetError(FROM_HERE, ERR_SSL_CLIENT_AUTH_CERT_BAD_FORMAT);
1634 return -1;
1635 }
1636 chain_raw.push_back(buf.get());
1637 chain.push_back(std::move(buf));
1638
1639 for (X509Certificate::OSCertHandle cert :
1640 ssl_config_.client_cert->GetIntermediateCertificates()) {
1641 bssl::UniquePtr<CRYPTO_BUFFER> buf = OSCertHandleToBuffer(cert);
1642 if (!buf) {
1643 LOG(WARNING) << "Failed to import intermediate";
1644 OpenSSLPutNetError(FROM_HERE, ERR_SSL_CLIENT_AUTH_CERT_BAD_FORMAT);
1645 return -1;
1646 }
1647 chain_raw.push_back(buf.get());
1648 chain.push_back(std::move(buf));
1649 }
mattm4cede8d2017-04-11 02:55:011650#endif
davidbena35b40c32017-03-09 17:33:451651
1652 if (!SSL_set_chain_and_key(ssl_.get(), chain_raw.data(), chain_raw.size(),
1653 nullptr, &SSLContext::kPrivateKeyMethod)) {
1654 LOG(WARNING) << "Failed to set client certificate";
1655 return -1;
1656 }
svaldezf3db006f2015-09-29 16:43:581657
1658 std::vector<SSLPrivateKey::Hash> digest_prefs =
svaldez7872fd02015-11-19 21:10:541659 ssl_config_.client_private_key->GetDigestPreferences();
svaldezf3db006f2015-09-29 16:43:581660
1661 size_t digests_len = digest_prefs.size();
1662 std::vector<int> digests;
1663 for (size_t i = 0; i < digests_len; i++) {
1664 switch (digest_prefs[i]) {
1665 case SSLPrivateKey::Hash::SHA1:
1666 digests.push_back(NID_sha1);
1667 break;
1668 case SSLPrivateKey::Hash::SHA256:
1669 digests.push_back(NID_sha256);
1670 break;
1671 case SSLPrivateKey::Hash::SHA384:
1672 digests.push_back(NID_sha384);
1673 break;
1674 case SSLPrivateKey::Hash::SHA512:
1675 digests.push_back(NID_sha512);
1676 break;
1677 case SSLPrivateKey::Hash::MD5_SHA1:
1678 // MD5-SHA1 is not used in TLS 1.2.
1679 break;
1680 }
1681 }
1682
davidbend80c12c2016-10-11 00:13:491683 SSL_set_private_key_digest_prefs(ssl_.get(), digests.data(),
1684 digests.size());
davidbenaf42cbe2014-11-13 03:27:461685
mikecirone8b85c432016-09-08 19:11:001686 net_log_.AddEvent(NetLogEventType::SSL_CLIENT_CERT_PROVIDED,
mattm4cede8d2017-04-11 02:55:011687 NetLog::IntCallback("cert_count", chain_raw.size()));
[email protected]6bad5052014-07-12 01:25:131688 return 1;
[email protected]c0787702014-05-20 21:51:441689 }
[email protected]97a854f2014-07-29 07:51:361690#endif // defined(OS_IOS)
[email protected]5ac981e182010-12-06 17:56:271691
1692 // Send no client certificate.
mikecirone8b85c432016-09-08 19:11:001693 net_log_.AddEvent(NetLogEventType::SSL_CLIENT_CERT_PROVIDED,
tfarina5e24b242015-10-27 13:11:281694 NetLog::IntCallback("cert_count", 0));
[email protected]82c59022014-08-15 09:38:271695 return 1;
[email protected]5ac981e182010-12-06 17:56:271696}
1697
svaldeze83af292016-04-26 14:33:371698void SSLClientSocketImpl::MaybeCacheSession() {
davidben44aeae62015-06-24 20:47:431699 // Only cache the session once both a new session has been established and the
1700 // certificate has been verified. Due to False Start, these events may happen
1701 // in either order.
davidbenc269cc4b2016-07-27 14:55:031702 if (!pending_session_ || !certificate_verified_)
davidbendafe4e52015-04-08 22:53:521703 return;
davidbendafe4e52015-04-08 22:53:521704
1705 SSLContext::GetInstance()->session_cache()->Insert(GetSessionCacheKey(),
davidbenc269cc4b2016-07-27 14:55:031706 pending_session_.get());
1707 pending_session_ = nullptr;
davidbendafe4e52015-04-08 22:53:521708}
1709
svaldeze83af292016-04-26 14:33:371710int SSLClientSocketImpl::NewSessionCallback(SSL_SESSION* session) {
davidbenc269cc4b2016-07-27 14:55:031711 // OpenSSL passes a reference to |session|.
1712 pending_session_.reset(session);
davidbendafe4e52015-04-08 22:53:521713 MaybeCacheSession();
davidben44aeae62015-06-24 20:47:431714 return 1;
davidbendafe4e52015-04-08 22:53:521715}
1716
svaldeze83af292016-04-26 14:33:371717void SSLClientSocketImpl::AddCTInfoToSSLInfo(SSLInfo* ssl_info) const {
estark723b5eeb2016-02-18 21:01:121718 ssl_info->UpdateCertificateTransparencyInfo(ct_verify_result_);
davidbeneb5f8ef32014-09-04 14:14:321719}
1720
svaldeze83af292016-04-26 14:33:371721std::string SSLClientSocketImpl::GetSessionCacheKey() const {
rsleevif020edc2015-03-16 19:31:241722 std::string result = host_and_port_.ToString();
davidben095ebb52017-04-12 22:23:341723 result.push_back('/');
rsleevif020edc2015-03-16 19:31:241724 result.append(ssl_session_cache_shard_);
1725
davidben095ebb52017-04-12 22:23:341726 result.push_back('/');
1727 result.push_back(ssl_config_.deprecated_cipher_suites_enabled ? '1' : '0');
1728 result.push_back(ssl_config_.channel_id_enabled ? '1' : '0');
1729 result.push_back(ssl_config_.version_interference_probe ? '1' : '0');
rsleevif020edc2015-03-16 19:31:241730 return result;
1731}
1732
svaldeze83af292016-04-26 14:33:371733bool SSLClientSocketImpl::IsRenegotiationAllowed() const {
nharper736ceda2015-11-07 00:16:591734 if (tb_was_negotiated_)
1735 return false;
1736
bncce6ea242016-09-15 20:22:321737 if (negotiated_protocol_ == kProtoUnknown)
davidben421116c2015-05-12 19:56:511738 return ssl_config_.renego_allowed_default;
1739
davidben421116c2015-05-12 19:56:511740 for (NextProto allowed : ssl_config_.renego_allowed_for_protos) {
bnc3cf2a592016-08-11 14:48:361741 if (negotiated_protocol_ == allowed)
davidben421116c2015-05-12 19:56:511742 return true;
1743 }
1744 return false;
1745}
1746
davidben0bca07fd2016-07-18 15:12:031747ssl_private_key_result_t SSLClientSocketImpl::PrivateKeySignDigestCallback(
davidben1d489522015-07-01 18:48:461748 uint8_t* out,
1749 size_t* out_len,
1750 size_t max_out,
1751 const EVP_MD* md,
1752 const uint8_t* in,
1753 size_t in_len) {
1754 DCHECK_EQ(kNoPendingResult, signature_result_);
1755 DCHECK(signature_.empty());
svaldez7872fd02015-11-19 21:10:541756 DCHECK(ssl_config_.client_private_key);
davidben1d489522015-07-01 18:48:461757
davidben1d489522015-07-01 18:48:461758 SSLPrivateKey::Hash hash;
1759 if (!EVP_MDToPrivateKeyHash(md, &hash)) {
1760 OpenSSLPutNetError(FROM_HERE, ERR_SSL_CLIENT_AUTH_SIGNATURE_FAILED);
1761 return ssl_private_key_failure;
1762 }
1763
davidbene422380772017-04-19 22:20:011764 net_log_.BeginEvent(NetLogEventType::SSL_PRIVATE_KEY_OP,
1765 base::Bind(&NetLogPrivateKeyOperationCallback, hash));
davidben752bcf22015-12-21 22:55:501766
davidben1d489522015-07-01 18:48:461767 signature_result_ = ERR_IO_PENDING;
svaldez7872fd02015-11-19 21:10:541768 ssl_config_.client_private_key->SignDigest(
davidben1d489522015-07-01 18:48:461769 hash, base::StringPiece(reinterpret_cast<const char*>(in), in_len),
davidben0bca07fd2016-07-18 15:12:031770 base::Bind(&SSLClientSocketImpl::OnPrivateKeyComplete,
davidben1d489522015-07-01 18:48:461771 weak_factory_.GetWeakPtr()));
1772 return ssl_private_key_retry;
1773}
1774
davidben0bca07fd2016-07-18 15:12:031775ssl_private_key_result_t SSLClientSocketImpl::PrivateKeyCompleteCallback(
davidben1d489522015-07-01 18:48:461776 uint8_t* out,
1777 size_t* out_len,
1778 size_t max_out) {
1779 DCHECK_NE(kNoPendingResult, signature_result_);
svaldez7872fd02015-11-19 21:10:541780 DCHECK(ssl_config_.client_private_key);
davidben1d489522015-07-01 18:48:461781
1782 if (signature_result_ == ERR_IO_PENDING)
1783 return ssl_private_key_retry;
1784 if (signature_result_ != OK) {
1785 OpenSSLPutNetError(FROM_HERE, signature_result_);
1786 return ssl_private_key_failure;
1787 }
1788 if (signature_.size() > max_out) {
1789 OpenSSLPutNetError(FROM_HERE, ERR_SSL_CLIENT_AUTH_SIGNATURE_FAILED);
1790 return ssl_private_key_failure;
1791 }
davidben5f8b6bc2015-11-25 03:19:541792 memcpy(out, signature_.data(), signature_.size());
davidben1d489522015-07-01 18:48:461793 *out_len = signature_.size();
1794 signature_.clear();
1795 return ssl_private_key_success;
1796}
1797
davidben0bca07fd2016-07-18 15:12:031798void SSLClientSocketImpl::OnPrivateKeyComplete(
davidben1d489522015-07-01 18:48:461799 Error error,
1800 const std::vector<uint8_t>& signature) {
1801 DCHECK_EQ(ERR_IO_PENDING, signature_result_);
1802 DCHECK(signature_.empty());
svaldez7872fd02015-11-19 21:10:541803 DCHECK(ssl_config_.client_private_key);
davidben1d489522015-07-01 18:48:461804
mikecirone8b85c432016-09-08 19:11:001805 net_log_.EndEventWithNetErrorCode(NetLogEventType::SSL_PRIVATE_KEY_OP, error);
davidben1d489522015-07-01 18:48:461806
1807 signature_result_ = error;
1808 if (signature_result_ == OK)
1809 signature_ = signature;
1810
davidben1d489522015-07-01 18:48:461811 // During a renegotiation, either Read or Write calls may be blocked on an
1812 // asynchronous private key operation.
davidben3418e81f2016-10-19 00:09:451813 RetryAllOperations();
davidben1d489522015-07-01 18:48:461814}
1815
davidbencef9e212017-04-19 15:00:101816void SSLClientSocketImpl::MessageCallback(int is_write,
1817 int content_type,
1818 const void* buf,
1819 size_t len) {
1820 switch (content_type) {
1821 case SSL3_RT_ALERT:
1822 net_log_.AddEvent(is_write ? NetLogEventType::SSL_ALERT_SENT
1823 : NetLogEventType::SSL_ALERT_RECEIVED,
1824 base::Bind(&NetLogSSLAlertCallback, buf, len));
1825 break;
1826 case SSL3_RT_HANDSHAKE:
1827 net_log_.AddEvent(
1828 is_write ? NetLogEventType::SSL_HANDSHAKE_MESSAGE_SENT
1829 : NetLogEventType::SSL_HANDSHAKE_MESSAGE_RECEIVED,
1830 base::Bind(&NetLogSSLMessageCallback, !!is_write, buf, len));
1831 break;
1832 default:
1833 return;
1834 }
1835}
1836
svaldeze83af292016-04-26 14:33:371837int SSLClientSocketImpl::TokenBindingAdd(const uint8_t** out,
1838 size_t* out_len,
1839 int* out_alert_value) {
nharper736ceda2015-11-07 00:16:591840 if (ssl_config_.token_binding_params.empty()) {
1841 return 0;
1842 }
davidbend80c12c2016-10-11 00:13:491843 bssl::ScopedCBB output;
nharper736ceda2015-11-07 00:16:591844 CBB parameters_list;
1845 if (!CBB_init(output.get(), 7) ||
1846 !CBB_add_u8(output.get(), kTbProtocolVersionMajor) ||
1847 !CBB_add_u8(output.get(), kTbProtocolVersionMinor) ||
1848 !CBB_add_u8_length_prefixed(output.get(), &parameters_list)) {
1849 *out_alert_value = SSL_AD_INTERNAL_ERROR;
1850 return -1;
1851 }
1852 for (size_t i = 0; i < ssl_config_.token_binding_params.size(); ++i) {
1853 if (!CBB_add_u8(&parameters_list, ssl_config_.token_binding_params[i])) {
1854 *out_alert_value = SSL_AD_INTERNAL_ERROR;
1855 return -1;
1856 }
1857 }
1858 // |*out| will be freed by TokenBindingFreeCallback.
1859 if (!CBB_finish(output.get(), const_cast<uint8_t**>(out), out_len)) {
1860 *out_alert_value = SSL_AD_INTERNAL_ERROR;
1861 return -1;
1862 }
1863
1864 return 1;
1865}
1866
svaldeze83af292016-04-26 14:33:371867int SSLClientSocketImpl::TokenBindingParse(const uint8_t* contents,
1868 size_t contents_len,
1869 int* out_alert_value) {
nharper736ceda2015-11-07 00:16:591870 if (completed_connect_) {
1871 // Token Binding may only be negotiated on the initial handshake.
1872 *out_alert_value = SSL_AD_ILLEGAL_PARAMETER;
1873 return 0;
1874 }
1875
1876 CBS extension;
1877 CBS_init(&extension, contents, contents_len);
1878
1879 CBS parameters_list;
1880 uint8_t version_major, version_minor, param;
1881 if (!CBS_get_u8(&extension, &version_major) ||
1882 !CBS_get_u8(&extension, &version_minor) ||
1883 !CBS_get_u8_length_prefixed(&extension, &parameters_list) ||
1884 !CBS_get_u8(&parameters_list, &param) || CBS_len(&parameters_list) > 0 ||
1885 CBS_len(&extension) > 0) {
1886 *out_alert_value = SSL_AD_DECODE_ERROR;
1887 return 0;
1888 }
1889 // The server-negotiated version must be less than or equal to our version.
1890 if (version_major > kTbProtocolVersionMajor ||
1891 (version_minor > kTbProtocolVersionMinor &&
1892 version_major == kTbProtocolVersionMajor)) {
1893 *out_alert_value = SSL_AD_ILLEGAL_PARAMETER;
1894 return 0;
1895 }
1896 // If the version the server negotiated is older than we support, don't fail
1897 // parsing the extension, but also don't set |negotiated_|.
1898 if (version_major < kTbMinProtocolVersionMajor ||
1899 (version_minor < kTbMinProtocolVersionMinor &&
1900 version_major == kTbMinProtocolVersionMajor)) {
1901 return 1;
1902 }
1903
1904 for (size_t i = 0; i < ssl_config_.token_binding_params.size(); ++i) {
1905 if (param == ssl_config_.token_binding_params[i]) {
1906 tb_negotiated_param_ = ssl_config_.token_binding_params[i];
1907 tb_was_negotiated_ = true;
1908 return 1;
1909 }
1910 }
1911
1912 *out_alert_value = SSL_AD_ILLEGAL_PARAMETER;
1913 return 0;
1914}
1915
davidben281d13f02016-04-27 20:43:281916void SSLClientSocketImpl::LogConnectEndEvent(int rv) {
1917 if (rv != OK) {
mikecirone8b85c432016-09-08 19:11:001918 net_log_.EndEventWithNetErrorCode(NetLogEventType::SSL_CONNECT, rv);
davidben281d13f02016-04-27 20:43:281919 return;
1920 }
1921
mikecirone8b85c432016-09-08 19:11:001922 net_log_.EndEvent(NetLogEventType::SSL_CONNECT,
davidben281d13f02016-04-27 20:43:281923 base::Bind(&NetLogSSLInfoCallback, base::Unretained(this)));
1924}
1925
bncbd442c22016-09-14 20:49:161926void SSLClientSocketImpl::RecordNegotiatedProtocol() const {
1927 UMA_HISTOGRAM_ENUMERATION("Net.SSLNegotiatedAlpnProtocol",
1928 negotiated_protocol_, kProtoLast + 1);
bnc3cf2a592016-08-11 14:48:361929}
1930
1931void SSLClientSocketImpl::RecordChannelIDSupport() const {
1932 // Since this enum is used for a histogram, do not change or re-use values.
1933 enum {
1934 DISABLED = 0,
1935 CLIENT_ONLY = 1,
1936 CLIENT_AND_SERVER = 2,
1937 // CLIENT_NO_ECC is unused now.
1938 // CLIENT_BAD_SYSTEM_TIME is unused now.
1939 CLIENT_BAD_SYSTEM_TIME = 4,
1940 CLIENT_NO_CHANNEL_ID_SERVICE = 5,
1941 CHANNEL_ID_USAGE_MAX
1942 } supported = DISABLED;
1943 if (channel_id_sent_) {
1944 supported = CLIENT_AND_SERVER;
1945 } else if (ssl_config_.channel_id_enabled) {
1946 if (!channel_id_service_)
1947 supported = CLIENT_NO_CHANNEL_ID_SERVICE;
1948 else
1949 supported = CLIENT_ONLY;
1950 }
1951 UMA_HISTOGRAM_ENUMERATION("DomainBoundCerts.Support", supported,
1952 CHANNEL_ID_USAGE_MAX);
1953}
1954
1955bool SSLClientSocketImpl::IsChannelIDEnabled() const {
1956 return ssl_config_.channel_id_enabled && channel_id_service_;
1957}
1958
davidbenfe132d92016-09-27 18:07:211959int SSLClientSocketImpl::MapLastOpenSSLError(
1960 int ssl_error,
1961 const crypto::OpenSSLErrStackTracer& tracer,
1962 OpenSSLErrorInfo* info) {
1963 int net_error = MapOpenSSLErrorWithDetails(ssl_error, tracer, info);
1964
1965 if (ssl_error == SSL_ERROR_SSL &&
1966 ERR_GET_LIB(info->error_code) == ERR_LIB_SSL) {
1967 // TLS does not provide an alert for missing client certificates, so most
1968 // servers send a generic handshake_failure alert. Detect this case by
1969 // checking if we have received a CertificateRequest but sent no
1970 // certificate. See https://crbug.com/646567.
1971 if (ERR_GET_REASON(info->error_code) ==
1972 SSL_R_SSLV3_ALERT_HANDSHAKE_FAILURE &&
1973 certificate_requested_ && ssl_config_.send_client_cert &&
1974 !ssl_config_.client_cert) {
1975 net_error = ERR_BAD_SSL_CLIENT_AUTH_CERT;
1976 }
1977
1978 // Per spec, access_denied is only for client-certificate-based access
1979 // control, but some buggy firewalls use it when blocking a page. To avoid a
1980 // confusing error, map it to a generic protocol error if no
1981 // CertificateRequest was sent. See https://crbug.com/630883.
1982 if (ERR_GET_REASON(info->error_code) == SSL_R_TLSV1_ALERT_ACCESS_DENIED &&
1983 !certificate_requested_) {
1984 net_error = ERR_SSL_PROTOCOL_ERROR;
1985 }
1986 }
1987
1988 return net_error;
1989}
1990
[email protected]7e5dd49f2010-12-08 18:33:491991} // namespace net