blob: fe5aabdd4d3f06a9e0a6f9f4c67d638ccb82c2af [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.
davidben1863716b2017-05-03 20:06:20947 std::string command("ALL:!SHA256:!SHA384:!aPSK:!ECDSA+SHA1");
davidben9b4a9b9c2015-10-12 18:46:51948
949 if (ssl_config_.require_ecdhe)
davidben1863716b2017-05-03 20:06:20950 command.append(":!kRSA");
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
davidben1863716b2017-05-03 20:06:20961 if (!SSL_set_strict_cipher_list(ssl_.get(), command.c_str())) {
962 LOG(ERROR) << "SSL_set_cipher_list('" << command << "') failed";
963 return ERR_UNEXPECTED;
964 }
[email protected]ee0f2aa82013-10-25 11:59:26965
966 // TLS channel ids.
bnc3cf2a592016-08-11 14:48:36967 if (IsChannelIDEnabled()) {
davidbend80c12c2016-10-11 00:13:49968 SSL_enable_tls_channel_id(ssl_.get());
[email protected]ee0f2aa82013-10-25 11:59:26969 }
970
bnc1f295372015-10-21 23:24:22971 if (!ssl_config_.alpn_protos.empty()) {
bnc988e68d2016-06-27 14:03:21972 std::vector<uint8_t> wire_protos =
973 SerializeNextProtos(ssl_config_.alpn_protos);
davidbend80c12c2016-10-11 00:13:49974 SSL_set_alpn_protos(ssl_.get(),
975 wire_protos.empty() ? NULL : &wire_protos[0],
[email protected]abc44b752014-07-30 03:52:15976 wire_protos.size());
977 }
978
davidbeneb5f8ef32014-09-04 14:14:32979 if (ssl_config_.signed_cert_timestamps_enabled) {
davidbend80c12c2016-10-11 00:13:49980 SSL_enable_signed_cert_timestamps(ssl_.get());
981 SSL_enable_ocsp_stapling(ssl_.get());
davidbeneb5f8ef32014-09-04 14:14:32982 }
983
davidben15f57132015-04-27 18:08:36984 if (cert_verifier_->SupportsOCSPStapling())
davidbend80c12c2016-10-11 00:13:49985 SSL_enable_ocsp_stapling(ssl_.get());
davidbeneb5f8ef32014-09-04 14:14:32986
davidben971a681a2017-02-16 18:57:46987 // Configure BoringSSL to allow renegotiations. Once the initial handshake
988 // completes, if renegotiations are not allowed, the default reject value will
989 // be restored. This is done in this order to permit a BoringSSL
990 // optimization. See https://crbug.com/boringssl/123.
991 SSL_set_renegotiate_mode(ssl_.get(), ssl_renegotiate_freely);
992
[email protected]c8a80e92014-05-17 16:02:08993 return OK;
[email protected]d518cd92010-09-29 12:27:44994}
995
svaldeze83af292016-04-26 14:33:37996void SSLClientSocketImpl::DoReadCallback(int rv) {
[email protected]b9b651f2013-11-09 04:32:22997 // Since Run may result in Read being called, clear |user_read_callback_|
998 // up front.
[email protected]0dc88b32014-03-26 20:12:28999 if (rv > 0)
1000 was_ever_used_ = true;
xunjieli321a96f32017-03-07 19:42:171001 user_read_buf_ = nullptr;
[email protected]b9b651f2013-11-09 04:32:221002 user_read_buf_len_ = 0;
1003 base::ResetAndReturn(&user_read_callback_).Run(rv);
1004}
1005
svaldeze83af292016-04-26 14:33:371006void SSLClientSocketImpl::DoWriteCallback(int rv) {
[email protected]b9b651f2013-11-09 04:32:221007 // Since Run may result in Write being called, clear |user_write_callback_|
1008 // up front.
[email protected]0dc88b32014-03-26 20:12:281009 if (rv > 0)
1010 was_ever_used_ = true;
[email protected]b9b651f2013-11-09 04:32:221011 user_write_buf_ = NULL;
1012 user_write_buf_len_ = 0;
1013 base::ResetAndReturn(&user_write_callback_).Run(rv);
1014}
1015
pkasting379234c2015-04-08 04:42:121016// TODO(cbentzel): Remove including "base/threading/thread_local.h" and
vadimt6b43dec22015-01-06 01:59:581017// g_first_run_completed once crbug.com/424386 is fixed.
1018base::LazyInstance<base::ThreadLocalBoolean>::Leaky g_first_run_completed =
1019 LAZY_INSTANCE_INITIALIZER;
1020
svaldeze83af292016-04-26 14:33:371021int SSLClientSocketImpl::DoHandshake() {
[email protected]b9b651f2013-11-09 04:32:221022 crypto::OpenSSLErrStackTracer err_tracer(FROM_HERE);
vadimt5a243282014-12-24 00:26:161023
1024 int rv;
1025
pkasting379234c2015-04-08 04:42:121026 // TODO(cbentzel): Leave only 1 call to SSL_do_handshake once crbug.com/424386
vadimt5a243282014-12-24 00:26:161027 // is fixed.
1028 if (ssl_config_.send_client_cert && ssl_config_.client_cert.get()) {
davidbend80c12c2016-10-11 00:13:491029 rv = SSL_do_handshake(ssl_.get());
vadimt5a243282014-12-24 00:26:161030 } else {
vadimt6b43dec22015-01-06 01:59:581031 if (g_first_run_completed.Get().Get()) {
pkasting379234c2015-04-08 04:42:121032 // TODO(cbentzel): Remove ScopedTracker below once crbug.com/424386 is
vadimt6b43dec22015-01-06 01:59:581033 // fixed.
pkasting379234c2015-04-08 04:42:121034 tracked_objects::ScopedTracker tracking_profile(
1035 FROM_HERE_WITH_EXPLICIT_FUNCTION("424386 SSL_do_handshake()"));
vadimt5a243282014-12-24 00:26:161036
davidbend80c12c2016-10-11 00:13:491037 rv = SSL_do_handshake(ssl_.get());
vadimt6b43dec22015-01-06 01:59:581038 } else {
1039 g_first_run_completed.Get().Set(true);
davidbend80c12c2016-10-11 00:13:491040 rv = SSL_do_handshake(ssl_.get());
vadimt6b43dec22015-01-06 01:59:581041 }
vadimt5a243282014-12-24 00:26:161042 }
[email protected]b9b651f2013-11-09 04:32:221043
davidbenc4212c02015-05-12 22:30:181044 int net_error = OK;
1045 if (rv <= 0) {
davidbend80c12c2016-10-11 00:13:491046 int ssl_error = SSL_get_error(ssl_.get(), rv);
[email protected]b9b651f2013-11-09 04:32:221047 if (ssl_error == SSL_ERROR_WANT_CHANNEL_ID_LOOKUP) {
[email protected]faff9852014-06-21 06:13:461048 // The server supports channel ID. Stop to look one up before returning to
1049 // the handshake.
rsleeviadbd4982016-06-13 22:10:271050 next_handshake_state_ = STATE_CHANNEL_ID_LOOKUP;
[email protected]faff9852014-06-21 06:13:461051 return OK;
[email protected]b9b651f2013-11-09 04:32:221052 }
davidbenced4aa9b2015-05-12 21:22:351053 if (ssl_error == SSL_ERROR_WANT_X509_LOOKUP &&
1054 !ssl_config_.send_client_cert) {
1055 return ERR_SSL_CLIENT_AUTH_CERT_NEEDED;
1056 }
davidben1d489522015-07-01 18:48:461057 if (ssl_error == SSL_ERROR_WANT_PRIVATE_KEY_OPERATION) {
svaldez7872fd02015-11-19 21:10:541058 DCHECK(ssl_config_.client_private_key);
davidben1d489522015-07-01 18:48:461059 DCHECK_NE(kNoPendingResult, signature_result_);
rsleeviadbd4982016-06-13 22:10:271060 next_handshake_state_ = STATE_HANDSHAKE;
davidben1d489522015-07-01 18:48:461061 return ERR_IO_PENDING;
1062 }
[email protected]b9b651f2013-11-09 04:32:221063
davidbena4409c62014-08-27 17:05:511064 OpenSSLErrorInfo error_info;
davidbenfe132d92016-09-27 18:07:211065 net_error = MapLastOpenSSLError(ssl_error, err_tracer, &error_info);
[email protected]b9b651f2013-11-09 04:32:221066 if (net_error == ERR_IO_PENDING) {
davidbenc4212c02015-05-12 22:30:181067 // If not done, stay in this state
rsleeviadbd4982016-06-13 22:10:271068 next_handshake_state_ = STATE_HANDSHAKE;
davidbenc4212c02015-05-12 22:30:181069 return ERR_IO_PENDING;
1070 }
1071
1072 LOG(ERROR) << "handshake failed; returned " << rv << ", SSL error code "
1073 << ssl_error << ", net_error " << net_error;
1074 net_log_.AddEvent(
mikecirone8b85c432016-09-08 19:11:001075 NetLogEventType::SSL_HANDSHAKE_ERROR,
davidbenc4212c02015-05-12 22:30:181076 CreateNetLogOpenSSLErrorCallback(net_error, ssl_error, error_info));
1077 }
1078
rsleeviadbd4982016-06-13 22:10:271079 next_handshake_state_ = STATE_HANDSHAKE_COMPLETE;
davidbenc4212c02015-05-12 22:30:181080 return net_error;
1081}
1082
svaldeze83af292016-04-26 14:33:371083int SSLClientSocketImpl::DoHandshakeComplete(int result) {
davidbenc4212c02015-05-12 22:30:181084 if (result < 0)
1085 return result;
1086
davidben095ebb52017-04-12 22:23:341087 if (ssl_config_.version_interference_probe) {
1088 DCHECK_LT(ssl_config_.version_max, TLS1_3_VERSION);
1089 return ERR_SSL_VERSION_INTERFERENCE;
1090 }
1091
nharper00d06ff2017-01-20 00:55:561092 SSLContext::GetInstance()->session_cache()->ResetLookupCount(
1093 GetSessionCacheKey());
nharper736ceda2015-11-07 00:16:591094 // Check that if token binding was negotiated, then extended master secret
nharper78e6d2b2016-09-21 05:42:351095 // and renegotiation indication must also be negotiated.
1096 if (tb_was_negotiated_ &&
davidbend80c12c2016-10-11 00:13:491097 !(SSL_get_extms_support(ssl_.get()) &&
1098 SSL_get_secure_renegotiation_support(ssl_.get()))) {
nharper736ceda2015-11-07 00:16:591099 return ERR_SSL_PROTOCOL_ERROR;
nharper78e6d2b2016-09-21 05:42:351100 }
nharper736ceda2015-11-07 00:16:591101
bncce6ea242016-09-15 20:22:321102 const uint8_t* alpn_proto = NULL;
1103 unsigned alpn_len = 0;
davidbend80c12c2016-10-11 00:13:491104 SSL_get0_alpn_selected(ssl_.get(), &alpn_proto, &alpn_len);
bncce6ea242016-09-15 20:22:321105 if (alpn_len > 0) {
1106 base::StringPiece proto(reinterpret_cast<const char*>(alpn_proto),
1107 alpn_len);
1108 negotiated_protocol_ = NextProtoFromString(proto);
[email protected]b9b651f2013-11-09 04:32:221109 }
davidbenc4212c02015-05-12 22:30:181110
nharperf5f8823d2017-03-01 23:52:401111 // If we got a session from the session cache, log how many concurrent
1112 // handshakes that session was used in before we finished our handshake. This
1113 // is only recorded if the session from the cache was actually used, and only
1114 // if the ALPN protocol is h2 (under the assumption that TLS 1.3 servers will
1115 // be speaking h2). See https://crbug.com/631988.
1116 if (ssl_session_cache_lookup_count_ && negotiated_protocol_ == kProtoHTTP2 &&
1117 SSL_session_reused(ssl_.get())) {
1118 UMA_HISTOGRAM_EXACT_LINEAR("Net.SSLSessionConcurrentLookupCount",
1119 ssl_session_cache_lookup_count_, 20);
1120 }
1121
bncbd442c22016-09-14 20:49:161122 RecordNegotiatedProtocol();
bnc3cf2a592016-08-11 14:48:361123 RecordChannelIDSupport();
davidbenc4212c02015-05-12 22:30:181124
dadriand476e652016-07-26 21:33:241125 const uint8_t* ocsp_response_raw;
1126 size_t ocsp_response_len;
davidbend80c12c2016-10-11 00:13:491127 SSL_get0_ocsp_response(ssl_.get(), &ocsp_response_raw, &ocsp_response_len);
dadriand476e652016-07-26 21:33:241128 set_stapled_ocsp_response_received(ocsp_response_len != 0);
1129 UMA_HISTOGRAM_BOOLEAN("Net.OCSPResponseStapled", ocsp_response_len != 0);
davidbenc4212c02015-05-12 22:30:181130
1131 const uint8_t* sct_list;
1132 size_t sct_list_len;
davidbend80c12c2016-10-11 00:13:491133 SSL_get0_signed_cert_timestamp_list(ssl_.get(), &sct_list, &sct_list_len);
davidbenc4212c02015-05-12 22:30:181134 set_signed_cert_timestamps_received(sct_list_len != 0);
1135
davidben971a681a2017-02-16 18:57:461136 if (!IsRenegotiationAllowed())
1137 SSL_set_renegotiate_mode(ssl_.get(), ssl_renegotiate_never);
davidbenc4212c02015-05-12 22:30:181138
davidbend80c12c2016-10-11 00:13:491139 uint16_t signature_algorithm = SSL_get_peer_signature_algorithm(ssl_.get());
davidben0653c8d2016-07-08 02:16:171140 if (signature_algorithm != 0) {
1141 UMA_HISTOGRAM_SPARSE_SLOWLY("Net.SSLSignatureAlgorithm",
1142 signature_algorithm);
davidben4fe4f982015-11-11 22:00:121143 }
1144
davidbenc4212c02015-05-12 22:30:181145 // Verify the certificate.
rsleeviadbd4982016-06-13 22:10:271146 next_handshake_state_ = STATE_VERIFY_CERT;
davidbenc4212c02015-05-12 22:30:181147 return OK;
[email protected]b9b651f2013-11-09 04:32:221148}
1149
svaldeze83af292016-04-26 14:33:371150int SSLClientSocketImpl::DoChannelIDLookup() {
mikecironef22f9812016-10-04 03:40:191151 NetLogParametersCallback callback = base::Bind(
nharper49b27d992016-02-09 18:28:511152 &NetLogChannelIDLookupCallback, base::Unretained(channel_id_service_));
mikecirone8b85c432016-09-08 19:11:001153 net_log_.BeginEvent(NetLogEventType::SSL_GET_CHANNEL_ID, callback);
rsleeviadbd4982016-06-13 22:10:271154 next_handshake_state_ = STATE_CHANNEL_ID_LOOKUP_COMPLETE;
[email protected]6b8a3c742014-07-25 00:25:351155 return channel_id_service_->GetOrCreateChannelID(
nharper2e171cf2015-06-01 20:29:231156 host_and_port_.host(), &channel_id_key_,
svaldeze83af292016-04-26 14:33:371157 base::Bind(&SSLClientSocketImpl::OnHandshakeIOComplete,
[email protected]faff9852014-06-21 06:13:461158 base::Unretained(this)),
nharper75ade892015-06-10 19:05:351159 &channel_id_request_);
[email protected]faff9852014-06-21 06:13:461160}
1161
svaldeze83af292016-04-26 14:33:371162int SSLClientSocketImpl::DoChannelIDLookupComplete(int result) {
mikecirone8b85c432016-09-08 19:11:001163 net_log_.EndEvent(NetLogEventType::SSL_GET_CHANNEL_ID,
nharper49b27d992016-02-09 18:28:511164 base::Bind(&NetLogChannelIDLookupCompleteCallback,
1165 channel_id_key_.get(), result));
[email protected]faff9852014-06-21 06:13:461166 if (result < 0)
1167 return result;
1168
[email protected]faff9852014-06-21 06:13:461169 // Hand the key to OpenSSL. Check for error in case OpenSSL rejects the key
1170 // type.
davidben8a208fc2016-01-22 17:08:081171 DCHECK(channel_id_key_);
[email protected]faff9852014-06-21 06:13:461172 crypto::OpenSSLErrStackTracer err_tracer(FROM_HERE);
davidbend80c12c2016-10-11 00:13:491173 if (!SSL_set1_tls_channel_id(ssl_.get(), channel_id_key_->key())) {
[email protected]faff9852014-06-21 06:13:461174 LOG(ERROR) << "Failed to set Channel ID.";
davidbenf225b262016-09-15 22:09:221175 return ERR_FAILED;
[email protected]faff9852014-06-21 06:13:461176 }
1177
1178 // Return to the handshake.
davidben52053b382015-04-27 19:22:291179 channel_id_sent_ = true;
rsleeviadbd4982016-06-13 22:10:271180 next_handshake_state_ = STATE_HANDSHAKE;
[email protected]faff9852014-06-21 06:13:461181 return OK;
1182}
1183
svaldeze83af292016-04-26 14:33:371184int SSLClientSocketImpl::DoVerifyCert(int result) {
davidben09c3d072014-08-25 20:33:581185 DCHECK(start_cert_verification_time_.is_null());
davidben30798ed82014-09-19 19:28:201186
davidbena35b40c32017-03-09 17:33:451187 server_cert_ = OSChainFromBuffers(SSL_get0_peer_certificates(ssl_.get()));
[email protected]b9b651f2013-11-09 04:32:221188
davidbenc6435a72015-08-17 18:28:521189 // OpenSSL decoded the certificate, but the platform certificate
1190 // implementation could not. This is treated as a fatal SSL-level protocol
1191 // error rather than a certificate error. See https://crbug.com/91341.
rsleevi74e99742016-09-13 20:35:251192 if (!server_cert_)
davidbenc6435a72015-08-17 18:28:521193 return ERR_SSL_SERVER_CERT_BAD_FORMAT;
1194
davidbenc7e06c92017-03-07 18:54:111195 net_log_.AddEvent(NetLogEventType::SSL_CERTIFICATES_RECEIVED,
1196 base::Bind(&NetLogX509CertificateCallback,
1197 base::Unretained(server_cert_.get())));
1198
1199 next_handshake_state_ = STATE_VERIFY_CERT_COMPLETE;
1200
davidben30798ed82014-09-19 19:28:201201 // If the certificate is bad and has been previously accepted, use
1202 // the previous status and bypass the error.
[email protected]b9b651f2013-11-09 04:32:221203 CertStatus cert_status;
rsleevi74e99742016-09-13 20:35:251204 if (ssl_config_.IsAllowedBadCert(server_cert_.get(), &cert_status)) {
[email protected]b9b651f2013-11-09 04:32:221205 server_cert_verify_result_.Reset();
1206 server_cert_verify_result_.cert_status = cert_status;
1207 server_cert_verify_result_.verified_cert = server_cert_;
1208 return OK;
1209 }
1210
davidben09c3d072014-08-25 20:33:581211 start_cert_verification_time_ = base::TimeTicks::Now();
1212
rsleevi22cae1672016-12-28 01:53:361213 const uint8_t* ocsp_response_raw;
1214 size_t ocsp_response_len;
1215 SSL_get0_ocsp_response(ssl_.get(), &ocsp_response_raw, &ocsp_response_len);
1216 base::StringPiece ocsp_response(
1217 reinterpret_cast<const char*>(ocsp_response_raw), ocsp_response_len);
1218
eroman7f9236a2015-05-11 21:23:431219 return cert_verifier_->Verify(
rsleevi06bd78552016-06-08 22:34:461220 CertVerifier::RequestParams(server_cert_, host_and_port_.host(),
1221 ssl_config_.GetCertVerifyFlags(),
rsleevi22cae1672016-12-28 01:53:361222 ocsp_response.as_string(), CertificateList()),
[email protected]591cffcd2014-08-18 20:02:301223 // TODO(davidben): Route the CRLSet through SSLConfig so
1224 // SSLClientSocket doesn't depend on SSLConfigService.
davidben15f57132015-04-27 18:08:361225 SSLConfigService::GetCRLSet().get(), &server_cert_verify_result_,
svaldeze83af292016-04-26 14:33:371226 base::Bind(&SSLClientSocketImpl::OnHandshakeIOComplete,
[email protected]b9b651f2013-11-09 04:32:221227 base::Unretained(this)),
eroman7f9236a2015-05-11 21:23:431228 &cert_verifier_request_, net_log_);
[email protected]b9b651f2013-11-09 04:32:221229}
1230
svaldeze83af292016-04-26 14:33:371231int SSLClientSocketImpl::DoVerifyCertComplete(int result) {
eroman7f9236a2015-05-11 21:23:431232 cert_verifier_request_.reset();
[email protected]b9b651f2013-11-09 04:32:221233
davidben09c3d072014-08-25 20:33:581234 if (!start_cert_verification_time_.is_null()) {
1235 base::TimeDelta verify_time =
1236 base::TimeTicks::Now() - start_cert_verification_time_;
1237 if (result == OK) {
1238 UMA_HISTOGRAM_TIMES("Net.SSLCertVerificationTime", verify_time);
1239 } else {
1240 UMA_HISTOGRAM_TIMES("Net.SSLCertVerificationTimeError", verify_time);
1241 }
1242 }
1243
rsleevi4a6ca8c2016-06-24 03:05:221244 // If the connection was good, check HPKP and CT status simultaneously,
1245 // but prefer to treat the HPKP error as more serious, if there was one.
[email protected]8bd4e7a2014-08-09 14:49:171246 const CertStatus cert_status = server_cert_verify_result_.cert_status;
rsleevi4a6ca8c2016-06-24 03:05:221247 if ((result == OK ||
dadrian8f8946652016-06-21 23:48:311248 (IsCertificateError(result) && IsCertStatusMinorError(cert_status)))) {
rsleevi4a6ca8c2016-06-24 03:05:221249 int ct_result = VerifyCT();
dadrian8f8946652016-06-21 23:48:311250 TransportSecurityState::PKPStatus pin_validity =
1251 transport_security_state_->CheckPublicKeyPins(
1252 host_and_port_, server_cert_verify_result_.is_issued_by_known_root,
1253 server_cert_verify_result_.public_key_hashes, server_cert_.get(),
1254 server_cert_verify_result_.verified_cert.get(),
1255 TransportSecurityState::ENABLE_PIN_REPORTS, &pinning_failure_log_);
1256 switch (pin_validity) {
1257 case TransportSecurityState::PKPStatus::VIOLATED:
1258 server_cert_verify_result_.cert_status |=
1259 CERT_STATUS_PINNED_KEY_MISSING;
1260 result = ERR_SSL_PINNED_KEY_NOT_IN_CERT_CHAIN;
1261 break;
1262 case TransportSecurityState::PKPStatus::BYPASSED:
1263 pkp_bypassed_ = true;
1264 // Fall through.
1265 case TransportSecurityState::PKPStatus::OK:
1266 // Do nothing.
1267 break;
rsleevi9545d342016-06-21 03:17:371268 }
rsleevi4a6ca8c2016-06-24 03:05:221269 if (result != ERR_SSL_PINNED_KEY_NOT_IN_CERT_CHAIN && ct_result != OK)
1270 result = ct_result;
[email protected]8bd4e7a2014-08-09 14:49:171271 }
1272
[email protected]b9b651f2013-11-09 04:32:221273 if (result == OK) {
davidbendafe4e52015-04-08 22:53:521274 DCHECK(!certificate_verified_);
1275 certificate_verified_ = true;
1276 MaybeCacheSession();
dadriand476e652016-07-26 21:33:241277 SSLInfo ssl_info;
1278 bool ok = GetSSLInfo(&ssl_info);
1279 DCHECK(ok);
rsleevi22cae1672016-12-28 01:53:361280
1281 const uint8_t* ocsp_response_raw;
1282 size_t ocsp_response_len;
1283 SSL_get0_ocsp_response(ssl_.get(), &ocsp_response_raw, &ocsp_response_len);
1284 base::StringPiece ocsp_response(
1285 reinterpret_cast<const char*>(ocsp_response_raw), ocsp_response_len);
1286
dadriand476e652016-07-26 21:33:241287 transport_security_state_->CheckExpectStaple(host_and_port_, ssl_info,
rsleevi22cae1672016-12-28 01:53:361288 ocsp_response);
[email protected]b9b651f2013-11-09 04:32:221289 }
1290
[email protected]64b5c892014-08-08 09:39:261291 completed_connect_ = true;
[email protected]b9b651f2013-11-09 04:32:221292 // Exit DoHandshakeLoop and return the result to the caller to Connect.
1293 DCHECK_EQ(STATE_NONE, next_handshake_state_);
1294 return result;
1295}
1296
svaldeze83af292016-04-26 14:33:371297void SSLClientSocketImpl::DoConnectCallback(int rv) {
[email protected]b9b651f2013-11-09 04:32:221298 if (!user_connect_callback_.is_null()) {
1299 CompletionCallback c = user_connect_callback_;
1300 user_connect_callback_.Reset();
1301 c.Run(rv > OK ? OK : rv);
1302 }
1303}
1304
svaldeze83af292016-04-26 14:33:371305void SSLClientSocketImpl::OnHandshakeIOComplete(int result) {
[email protected]b9b651f2013-11-09 04:32:221306 int rv = DoHandshakeLoop(result);
1307 if (rv != ERR_IO_PENDING) {
davidben281d13f02016-04-27 20:43:281308 LogConnectEndEvent(rv);
[email protected]b9b651f2013-11-09 04:32:221309 DoConnectCallback(rv);
1310 }
1311}
1312
svaldeze83af292016-04-26 14:33:371313int SSLClientSocketImpl::DoHandshakeLoop(int last_io_result) {
xunjieli0b7f5b62016-12-06 20:43:481314 TRACE_EVENT0(kNetTracingCategory, "SSLClientSocketImpl::DoHandshakeLoop");
[email protected]b9b651f2013-11-09 04:32:221315 int rv = last_io_result;
1316 do {
1317 // Default to STATE_NONE for next state.
1318 // (This is a quirk carried over from the windows
1319 // implementation. It makes reading the logs a bit harder.)
1320 // State handlers can and often do call GotoState just
1321 // to stay in the current state.
1322 State state = next_handshake_state_;
rsleeviadbd4982016-06-13 22:10:271323 next_handshake_state_ = STATE_NONE;
[email protected]b9b651f2013-11-09 04:32:221324 switch (state) {
1325 case STATE_HANDSHAKE:
1326 rv = DoHandshake();
1327 break;
davidbenc4212c02015-05-12 22:30:181328 case STATE_HANDSHAKE_COMPLETE:
1329 rv = DoHandshakeComplete(rv);
1330 break;
[email protected]faff9852014-06-21 06:13:461331 case STATE_CHANNEL_ID_LOOKUP:
1332 DCHECK_EQ(OK, rv);
1333 rv = DoChannelIDLookup();
svaldeze83af292016-04-26 14:33:371334 break;
[email protected]faff9852014-06-21 06:13:461335 case STATE_CHANNEL_ID_LOOKUP_COMPLETE:
1336 rv = DoChannelIDLookupComplete(rv);
1337 break;
[email protected]b9b651f2013-11-09 04:32:221338 case STATE_VERIFY_CERT:
[email protected]faff9852014-06-21 06:13:461339 DCHECK_EQ(OK, rv);
[email protected]b9b651f2013-11-09 04:32:221340 rv = DoVerifyCert(rv);
svaldeze83af292016-04-26 14:33:371341 break;
[email protected]b9b651f2013-11-09 04:32:221342 case STATE_VERIFY_CERT_COMPLETE:
1343 rv = DoVerifyCertComplete(rv);
1344 break;
1345 case STATE_NONE:
1346 default:
1347 rv = ERR_UNEXPECTED;
1348 NOTREACHED() << "unexpected state" << state;
1349 break;
1350 }
[email protected]b9b651f2013-11-09 04:32:221351 } while (rv != ERR_IO_PENDING && next_handshake_state_ != STATE_NONE);
1352 return rv;
1353}
1354
xunjieli321a96f32017-03-07 19:42:171355int SSLClientSocketImpl::DoPayloadRead(IOBuffer* buf, int buf_len) {
[email protected]b9b651f2013-11-09 04:32:221356 crypto::OpenSSLErrStackTracer err_tracer(FROM_HERE);
1357
xunjieli321a96f32017-03-07 19:42:171358 DCHECK_LT(0, buf_len);
1359 DCHECK(buf);
davidben7e555daf2015-03-25 17:03:291360
[email protected]b9b651f2013-11-09 04:32:221361 int rv;
davidben1d489522015-07-01 18:48:461362 if (pending_read_error_ != kNoPendingResult) {
[email protected]b9b651f2013-11-09 04:32:221363 rv = pending_read_error_;
davidben1d489522015-07-01 18:48:461364 pending_read_error_ = kNoPendingResult;
[email protected]b9b651f2013-11-09 04:32:221365 if (rv == 0) {
mikecirone8b85c432016-09-08 19:11:001366 net_log_.AddByteTransferEvent(NetLogEventType::SSL_SOCKET_BYTES_RECEIVED,
xunjieli321a96f32017-03-07 19:42:171367 rv, buf->data());
davidbenb8c23212014-10-28 00:12:161368 } else {
1369 net_log_.AddEvent(
mikecirone8b85c432016-09-08 19:11:001370 NetLogEventType::SSL_READ_ERROR,
davidbenb8c23212014-10-28 00:12:161371 CreateNetLogOpenSSLErrorCallback(rv, pending_read_ssl_error_,
1372 pending_read_error_info_));
[email protected]b9b651f2013-11-09 04:32:221373 }
davidbenb8c23212014-10-28 00:12:161374 pending_read_ssl_error_ = SSL_ERROR_NONE;
1375 pending_read_error_info_ = OpenSSLErrorInfo();
[email protected]b9b651f2013-11-09 04:32:221376 return rv;
1377 }
1378
1379 int total_bytes_read = 0;
davidben7e555daf2015-03-25 17:03:291380 int ssl_ret;
[email protected]b9b651f2013-11-09 04:32:221381 do {
xunjieli321a96f32017-03-07 19:42:171382 ssl_ret = SSL_read(ssl_.get(), buf->data() + total_bytes_read,
1383 buf_len - total_bytes_read);
davidben7e555daf2015-03-25 17:03:291384 if (ssl_ret > 0)
1385 total_bytes_read += ssl_ret;
davidben8ea6b172017-03-07 23:53:501386 // Continue processing records as long as there is more data available
1387 // synchronously.
1388 } while (total_bytes_read < buf_len && ssl_ret > 0 &&
1389 transport_adapter_->HasPendingReadData());
[email protected]b9b651f2013-11-09 04:32:221390
davidben7e555daf2015-03-25 17:03:291391 // Although only the final SSL_read call may have failed, the failure needs to
1392 // processed immediately, while the information still available in OpenSSL's
1393 // error queue.
davidbenced4aa9b2015-05-12 21:22:351394 if (ssl_ret <= 0) {
davidben7e555daf2015-03-25 17:03:291395 // A zero return from SSL_read may mean any of:
1396 // - The underlying BIO_read returned 0.
1397 // - The peer sent a close_notify.
1398 // - Any arbitrary error. https://crbug.com/466303
[email protected]b9b651f2013-11-09 04:32:221399 //
davidben7e555daf2015-03-25 17:03:291400 // TransportReadComplete converts the first to an ERR_CONNECTION_CLOSED
1401 // error, so it does not occur. The second and third are distinguished by
1402 // SSL_ERROR_ZERO_RETURN.
davidbend80c12c2016-10-11 00:13:491403 pending_read_ssl_error_ = SSL_get_error(ssl_.get(), ssl_ret);
davidben7e555daf2015-03-25 17:03:291404 if (pending_read_ssl_error_ == SSL_ERROR_ZERO_RETURN) {
1405 pending_read_error_ = 0;
davidbenced4aa9b2015-05-12 21:22:351406 } else if (pending_read_ssl_error_ == SSL_ERROR_WANT_X509_LOOKUP &&
1407 !ssl_config_.send_client_cert) {
1408 pending_read_error_ = ERR_SSL_CLIENT_AUTH_CERT_NEEDED;
davidben1d489522015-07-01 18:48:461409 } else if (pending_read_ssl_error_ ==
1410 SSL_ERROR_WANT_PRIVATE_KEY_OPERATION) {
svaldez7872fd02015-11-19 21:10:541411 DCHECK(ssl_config_.client_private_key);
davidben1d489522015-07-01 18:48:461412 DCHECK_NE(kNoPendingResult, signature_result_);
1413 pending_read_error_ = ERR_IO_PENDING;
davidben7e555daf2015-03-25 17:03:291414 } else {
davidbenfe132d92016-09-27 18:07:211415 pending_read_error_ = MapLastOpenSSLError(
davidben7e555daf2015-03-25 17:03:291416 pending_read_ssl_error_, err_tracer, &pending_read_error_info_);
[email protected]b9b651f2013-11-09 04:32:221417 }
1418
davidben7e555daf2015-03-25 17:03:291419 // Many servers do not reliably send a close_notify alert when shutting down
1420 // a connection, and instead terminate the TCP connection. This is reported
1421 // as ERR_CONNECTION_CLOSED. Because of this, map the unclean shutdown to a
1422 // graceful EOF, instead of treating it as an error as it should be.
1423 if (pending_read_error_ == ERR_CONNECTION_CLOSED)
1424 pending_read_error_ = 0;
1425 }
davidbenbe6ce7ec2014-10-20 19:15:561426
davidben7e555daf2015-03-25 17:03:291427 if (total_bytes_read > 0) {
1428 // Return any bytes read to the caller. The error will be deferred to the
1429 // next call of DoPayloadRead.
1430 rv = total_bytes_read;
davidbenbe6ce7ec2014-10-20 19:15:561431
davidben7e555daf2015-03-25 17:03:291432 // Do not treat insufficient data as an error to return in the next call to
1433 // DoPayloadRead() - instead, let the call fall through to check SSL_read()
davidben3418e81f2016-10-19 00:09:451434 // again. The transport may have data available by then.
davidben7e555daf2015-03-25 17:03:291435 if (pending_read_error_ == ERR_IO_PENDING)
davidben1d489522015-07-01 18:48:461436 pending_read_error_ = kNoPendingResult;
davidben7e555daf2015-03-25 17:03:291437 } else {
1438 // No bytes were returned. Return the pending read error immediately.
davidben1d489522015-07-01 18:48:461439 DCHECK_NE(kNoPendingResult, pending_read_error_);
davidben7e555daf2015-03-25 17:03:291440 rv = pending_read_error_;
davidben1d489522015-07-01 18:48:461441 pending_read_error_ = kNoPendingResult;
[email protected]b9b651f2013-11-09 04:32:221442 }
1443
1444 if (rv >= 0) {
mikecirone8b85c432016-09-08 19:11:001445 net_log_.AddByteTransferEvent(NetLogEventType::SSL_SOCKET_BYTES_RECEIVED,
xunjieli321a96f32017-03-07 19:42:171446 rv, buf->data());
davidbenb8c23212014-10-28 00:12:161447 } else if (rv != ERR_IO_PENDING) {
1448 net_log_.AddEvent(
mikecirone8b85c432016-09-08 19:11:001449 NetLogEventType::SSL_READ_ERROR,
davidbenb8c23212014-10-28 00:12:161450 CreateNetLogOpenSSLErrorCallback(rv, pending_read_ssl_error_,
1451 pending_read_error_info_));
1452 pending_read_ssl_error_ = SSL_ERROR_NONE;
1453 pending_read_error_info_ = OpenSSLErrorInfo();
[email protected]b9b651f2013-11-09 04:32:221454 }
1455 return rv;
1456}
1457
svaldeze83af292016-04-26 14:33:371458int SSLClientSocketImpl::DoPayloadWrite() {
[email protected]b9b651f2013-11-09 04:32:221459 crypto::OpenSSLErrStackTracer err_tracer(FROM_HERE);
davidbend80c12c2016-10-11 00:13:491460 int rv = SSL_write(ssl_.get(), user_write_buf_->data(), user_write_buf_len_);
rsleevif020edc2015-03-16 19:31:241461
[email protected]b9b651f2013-11-09 04:32:221462 if (rv >= 0) {
mikecirone8b85c432016-09-08 19:11:001463 net_log_.AddByteTransferEvent(NetLogEventType::SSL_SOCKET_BYTES_SENT, rv,
[email protected]b9b651f2013-11-09 04:32:221464 user_write_buf_->data());
1465 return rv;
1466 }
1467
davidbend80c12c2016-10-11 00:13:491468 int ssl_error = SSL_get_error(ssl_.get(), rv);
davidben1d489522015-07-01 18:48:461469 if (ssl_error == SSL_ERROR_WANT_PRIVATE_KEY_OPERATION)
1470 return ERR_IO_PENDING;
davidbenb8c23212014-10-28 00:12:161471 OpenSSLErrorInfo error_info;
davidbenfe132d92016-09-27 18:07:211472 int net_error = MapLastOpenSSLError(ssl_error, err_tracer, &error_info);
davidbenb8c23212014-10-28 00:12:161473
1474 if (net_error != ERR_IO_PENDING) {
1475 net_log_.AddEvent(
mikecirone8b85c432016-09-08 19:11:001476 NetLogEventType::SSL_WRITE_ERROR,
davidbenb8c23212014-10-28 00:12:161477 CreateNetLogOpenSSLErrorCallback(net_error, ssl_error, error_info));
1478 }
1479 return net_error;
[email protected]b9b651f2013-11-09 04:32:221480}
1481
davidben3418e81f2016-10-19 00:09:451482void SSLClientSocketImpl::RetryAllOperations() {
1483 // SSL_do_handshake, SSL_read, and SSL_write may all be retried when blocked,
1484 // so retry all operations for simplicity. (Otherwise, SSL_get_error for each
1485 // operation may be remembered to retry only the blocked ones.)
1486
1487 if (next_handshake_state_ == STATE_HANDSHAKE) {
1488 // In handshake phase. The parameter to OnHandshakeIOComplete is unused.
1489 OnHandshakeIOComplete(OK);
1490 return;
1491 }
1492
davidben1d489522015-07-01 18:48:461493 int rv_read = ERR_IO_PENDING;
1494 int rv_write = ERR_IO_PENDING;
xunjieli321a96f32017-03-07 19:42:171495 if (user_read_buf_) {
1496 rv_read = DoPayloadRead(user_read_buf_.get(), user_read_buf_len_);
1497 } else if (!user_read_callback_.is_null()) {
1498 // ReadIfReady() is called by the user. Skip DoPayloadRead() and just let
1499 // the user know that read can be retried.
1500 rv_read = OK;
1501 }
1502
davidben3418e81f2016-10-19 00:09:451503 if (user_write_buf_)
1504 rv_write = DoPayloadWrite();
davidben1d489522015-07-01 18:48:461505
1506 // Performing the Read callback may cause |this| to be deleted. If this
1507 // happens, the Write callback should not be invoked. Guard against this by
1508 // holding a WeakPtr to |this| and ensuring it's still valid.
svaldeze83af292016-04-26 14:33:371509 base::WeakPtr<SSLClientSocketImpl> guard(weak_factory_.GetWeakPtr());
davidben3418e81f2016-10-19 00:09:451510 if (rv_read != ERR_IO_PENDING)
davidben1d489522015-07-01 18:48:461511 DoReadCallback(rv_read);
1512
1513 if (!guard.get())
1514 return;
1515
davidben3418e81f2016-10-19 00:09:451516 if (rv_write != ERR_IO_PENDING)
davidben1d489522015-07-01 18:48:461517 DoWriteCallback(rv_write);
1518}
1519
rsleevi4a6ca8c2016-06-24 03:05:221520int SSLClientSocketImpl::VerifyCT() {
rsleevi4a6ca8c2016-06-24 03:05:221521 const uint8_t* sct_list_raw;
1522 size_t sct_list_len;
davidbend80c12c2016-10-11 00:13:491523 SSL_get0_signed_cert_timestamp_list(ssl_.get(), &sct_list_raw, &sct_list_len);
rsleevi22cae1672016-12-28 01:53:361524 base::StringPiece sct_list(reinterpret_cast<const char*>(sct_list_raw),
1525 sct_list_len);
1526
1527 const uint8_t* ocsp_response_raw;
1528 size_t ocsp_response_len;
1529 SSL_get0_ocsp_response(ssl_.get(), &ocsp_response_raw, &ocsp_response_len);
1530 base::StringPiece ocsp_response(
1531 reinterpret_cast<const char*>(ocsp_response_raw), ocsp_response_len);
rsleevi4a6ca8c2016-06-24 03:05:221532
1533 // Note that this is a completely synchronous operation: The CT Log Verifier
1534 // gets all the data it needs for SCT verification and does not do any
1535 // external communication.
1536 cert_transparency_verifier_->Verify(
rsleevi22cae1672016-12-28 01:53:361537 server_cert_verify_result_.verified_cert.get(), ocsp_response, sct_list,
eranmdcec9632016-10-10 14:16:101538 &ct_verify_result_.scts, net_log_);
rsleevi4a6ca8c2016-06-24 03:05:221539
1540 ct_verify_result_.ct_policies_applied = true;
1541 ct_verify_result_.ev_policy_compliance =
1542 ct::EVPolicyCompliance::EV_POLICY_DOES_NOT_APPLY;
eranm4bed0b572016-08-14 21:00:351543
1544 SCTList verified_scts =
1545 ct::SCTsMatchingStatus(ct_verify_result_.scts, ct::SCT_STATUS_OK);
1546
rsleevi4a6ca8c2016-06-24 03:05:221547 if (server_cert_verify_result_.cert_status & CERT_STATUS_IS_EV) {
1548 scoped_refptr<ct::EVCertsWhitelist> ev_whitelist =
1549 SSLConfigService::GetEVCertsWhitelist();
1550 ct::EVPolicyCompliance ev_policy_compliance =
1551 policy_enforcer_->DoesConformToCTEVPolicy(
1552 server_cert_verify_result_.verified_cert.get(), ev_whitelist.get(),
eranm4bed0b572016-08-14 21:00:351553 verified_scts, net_log_);
rsleevi4a6ca8c2016-06-24 03:05:221554 ct_verify_result_.ev_policy_compliance = ev_policy_compliance;
1555 if (ev_policy_compliance !=
1556 ct::EVPolicyCompliance::EV_POLICY_DOES_NOT_APPLY &&
1557 ev_policy_compliance !=
1558 ct::EVPolicyCompliance::EV_POLICY_COMPLIES_VIA_WHITELIST &&
1559 ev_policy_compliance !=
1560 ct::EVPolicyCompliance::EV_POLICY_COMPLIES_VIA_SCTS) {
1561 server_cert_verify_result_.cert_status |=
1562 CERT_STATUS_CT_COMPLIANCE_FAILED;
1563 server_cert_verify_result_.cert_status &= ~CERT_STATUS_IS_EV;
1564 }
1565 }
1566 ct_verify_result_.cert_policy_compliance =
1567 policy_enforcer_->DoesConformToCertPolicy(
eranm4bed0b572016-08-14 21:00:351568 server_cert_verify_result_.verified_cert.get(), verified_scts,
1569 net_log_);
rsleevi4a6ca8c2016-06-24 03:05:221570
1571 if (ct_verify_result_.cert_policy_compliance !=
1572 ct::CertPolicyCompliance::CERT_POLICY_COMPLIES_VIA_SCTS &&
rsleeviec8e4312016-11-12 00:32:281573 ct_verify_result_.cert_policy_compliance !=
1574 ct::CertPolicyCompliance::CERT_POLICY_BUILD_NOT_TIMELY &&
rsleevi4a6ca8c2016-06-24 03:05:221575 transport_security_state_->ShouldRequireCT(
1576 host_and_port_.host(), server_cert_verify_result_.verified_cert.get(),
1577 server_cert_verify_result_.public_key_hashes)) {
1578 server_cert_verify_result_.cert_status |=
1579 CERT_STATUS_CERTIFICATE_TRANSPARENCY_REQUIRED;
1580 return ERR_CERTIFICATE_TRANSPARENCY_REQUIRED;
1581 }
1582
1583 return OK;
1584}
1585
svaldeze83af292016-04-26 14:33:371586int SSLClientSocketImpl::ClientCertRequestCallback(SSL* ssl) {
davidbend80c12c2016-10-11 00:13:491587 DCHECK(ssl == ssl_.get());
[email protected]82c59022014-08-15 09:38:271588
mikecirone8b85c432016-09-08 19:11:001589 net_log_.AddEvent(NetLogEventType::SSL_CLIENT_CERT_REQUESTED);
davidbenfe132d92016-09-27 18:07:211590 certificate_requested_ = true;
davidbenaf42cbe2014-11-13 03:27:461591
[email protected]82c59022014-08-15 09:38:271592 // Clear any currently configured certificates.
davidbend80c12c2016-10-11 00:13:491593 SSL_certs_clear(ssl_.get());
[email protected]97a854f2014-07-29 07:51:361594
1595#if defined(OS_IOS)
1596 // TODO(droger): Support client auth on iOS. See http://crbug.com/145954).
1597 LOG(WARNING) << "Client auth is not supported";
svaldeze83af292016-04-26 14:33:371598#else // !defined(OS_IOS)
[email protected]5ac981e182010-12-06 17:56:271599 if (!ssl_config_.send_client_cert) {
[email protected]515adc22013-01-09 16:01:231600 // First pass: we know that a client certificate is needed, but we do not
davidbenb11fd212017-01-12 17:08:031601 // have one at hand. Suspend the handshake. SSL_get_error will return
1602 // SSL_ERROR_WANT_X509_LOOKUP.
davidbenced4aa9b2015-05-12 21:22:351603 return -1;
[email protected]5ac981e182010-12-06 17:56:271604 }
1605
1606 // Second pass: a client certificate should have been selected.
[email protected]13914c92013-06-13 22:42:421607 if (ssl_config_.client_cert.get()) {
svaldez7872fd02015-11-19 21:10:541608 if (!ssl_config_.client_private_key) {
1609 // The caller supplied a null private key. Fail the handshake and surface
1610 // an appropriate error to the caller.
davidben1d489522015-07-01 18:48:461611 LOG(WARNING) << "Client cert found without private key";
1612 OpenSSLPutNetError(FROM_HERE, ERR_SSL_CLIENT_AUTH_CERT_NO_PRIVATE_KEY);
1613 return -1;
1614 }
1615
mattm4cede8d2017-04-11 02:55:011616#if BUILDFLAG(USE_BYTE_CERTS)
1617 std::vector<CRYPTO_BUFFER*> chain_raw;
1618 chain_raw.push_back(ssl_config_.client_cert->os_cert_handle());
1619 for (X509Certificate::OSCertHandle cert :
1620 ssl_config_.client_cert->GetIntermediateCertificates()) {
1621 chain_raw.push_back(cert);
1622 }
1623#else
davidbena35b40c32017-03-09 17:33:451624 std::vector<bssl::UniquePtr<CRYPTO_BUFFER>> chain;
1625 std::vector<CRYPTO_BUFFER*> chain_raw;
1626 bssl::UniquePtr<CRYPTO_BUFFER> buf =
1627 OSCertHandleToBuffer(ssl_config_.client_cert->os_cert_handle());
1628 if (!buf) {
1629 LOG(WARNING) << "Failed to import certificate";
1630 OpenSSLPutNetError(FROM_HERE, ERR_SSL_CLIENT_AUTH_CERT_BAD_FORMAT);
1631 return -1;
1632 }
1633 chain_raw.push_back(buf.get());
1634 chain.push_back(std::move(buf));
1635
1636 for (X509Certificate::OSCertHandle cert :
1637 ssl_config_.client_cert->GetIntermediateCertificates()) {
1638 bssl::UniquePtr<CRYPTO_BUFFER> buf = OSCertHandleToBuffer(cert);
1639 if (!buf) {
1640 LOG(WARNING) << "Failed to import intermediate";
1641 OpenSSLPutNetError(FROM_HERE, ERR_SSL_CLIENT_AUTH_CERT_BAD_FORMAT);
1642 return -1;
1643 }
1644 chain_raw.push_back(buf.get());
1645 chain.push_back(std::move(buf));
1646 }
mattm4cede8d2017-04-11 02:55:011647#endif
davidbena35b40c32017-03-09 17:33:451648
1649 if (!SSL_set_chain_and_key(ssl_.get(), chain_raw.data(), chain_raw.size(),
1650 nullptr, &SSLContext::kPrivateKeyMethod)) {
1651 LOG(WARNING) << "Failed to set client certificate";
1652 return -1;
1653 }
svaldezf3db006f2015-09-29 16:43:581654
1655 std::vector<SSLPrivateKey::Hash> digest_prefs =
svaldez7872fd02015-11-19 21:10:541656 ssl_config_.client_private_key->GetDigestPreferences();
svaldezf3db006f2015-09-29 16:43:581657
1658 size_t digests_len = digest_prefs.size();
1659 std::vector<int> digests;
1660 for (size_t i = 0; i < digests_len; i++) {
1661 switch (digest_prefs[i]) {
1662 case SSLPrivateKey::Hash::SHA1:
1663 digests.push_back(NID_sha1);
1664 break;
1665 case SSLPrivateKey::Hash::SHA256:
1666 digests.push_back(NID_sha256);
1667 break;
1668 case SSLPrivateKey::Hash::SHA384:
1669 digests.push_back(NID_sha384);
1670 break;
1671 case SSLPrivateKey::Hash::SHA512:
1672 digests.push_back(NID_sha512);
1673 break;
1674 case SSLPrivateKey::Hash::MD5_SHA1:
1675 // MD5-SHA1 is not used in TLS 1.2.
1676 break;
1677 }
1678 }
1679
davidbend80c12c2016-10-11 00:13:491680 SSL_set_private_key_digest_prefs(ssl_.get(), digests.data(),
1681 digests.size());
davidbenaf42cbe2014-11-13 03:27:461682
mikecirone8b85c432016-09-08 19:11:001683 net_log_.AddEvent(NetLogEventType::SSL_CLIENT_CERT_PROVIDED,
mattm4cede8d2017-04-11 02:55:011684 NetLog::IntCallback("cert_count", chain_raw.size()));
[email protected]6bad5052014-07-12 01:25:131685 return 1;
[email protected]c0787702014-05-20 21:51:441686 }
[email protected]97a854f2014-07-29 07:51:361687#endif // defined(OS_IOS)
[email protected]5ac981e182010-12-06 17:56:271688
1689 // Send no client certificate.
mikecirone8b85c432016-09-08 19:11:001690 net_log_.AddEvent(NetLogEventType::SSL_CLIENT_CERT_PROVIDED,
tfarina5e24b242015-10-27 13:11:281691 NetLog::IntCallback("cert_count", 0));
[email protected]82c59022014-08-15 09:38:271692 return 1;
[email protected]5ac981e182010-12-06 17:56:271693}
1694
svaldeze83af292016-04-26 14:33:371695void SSLClientSocketImpl::MaybeCacheSession() {
davidben44aeae62015-06-24 20:47:431696 // Only cache the session once both a new session has been established and the
1697 // certificate has been verified. Due to False Start, these events may happen
1698 // in either order.
davidbenc269cc4b2016-07-27 14:55:031699 if (!pending_session_ || !certificate_verified_)
davidbendafe4e52015-04-08 22:53:521700 return;
davidbendafe4e52015-04-08 22:53:521701
1702 SSLContext::GetInstance()->session_cache()->Insert(GetSessionCacheKey(),
davidbenc269cc4b2016-07-27 14:55:031703 pending_session_.get());
1704 pending_session_ = nullptr;
davidbendafe4e52015-04-08 22:53:521705}
1706
svaldeze83af292016-04-26 14:33:371707int SSLClientSocketImpl::NewSessionCallback(SSL_SESSION* session) {
davidbenc269cc4b2016-07-27 14:55:031708 // OpenSSL passes a reference to |session|.
1709 pending_session_.reset(session);
davidbendafe4e52015-04-08 22:53:521710 MaybeCacheSession();
davidben44aeae62015-06-24 20:47:431711 return 1;
davidbendafe4e52015-04-08 22:53:521712}
1713
svaldeze83af292016-04-26 14:33:371714void SSLClientSocketImpl::AddCTInfoToSSLInfo(SSLInfo* ssl_info) const {
estark723b5eeb2016-02-18 21:01:121715 ssl_info->UpdateCertificateTransparencyInfo(ct_verify_result_);
davidbeneb5f8ef32014-09-04 14:14:321716}
1717
svaldeze83af292016-04-26 14:33:371718std::string SSLClientSocketImpl::GetSessionCacheKey() const {
rsleevif020edc2015-03-16 19:31:241719 std::string result = host_and_port_.ToString();
davidben095ebb52017-04-12 22:23:341720 result.push_back('/');
rsleevif020edc2015-03-16 19:31:241721 result.append(ssl_session_cache_shard_);
1722
davidben095ebb52017-04-12 22:23:341723 result.push_back('/');
1724 result.push_back(ssl_config_.deprecated_cipher_suites_enabled ? '1' : '0');
1725 result.push_back(ssl_config_.channel_id_enabled ? '1' : '0');
1726 result.push_back(ssl_config_.version_interference_probe ? '1' : '0');
rsleevif020edc2015-03-16 19:31:241727 return result;
1728}
1729
svaldeze83af292016-04-26 14:33:371730bool SSLClientSocketImpl::IsRenegotiationAllowed() const {
nharper736ceda2015-11-07 00:16:591731 if (tb_was_negotiated_)
1732 return false;
1733
bncce6ea242016-09-15 20:22:321734 if (negotiated_protocol_ == kProtoUnknown)
davidben421116c2015-05-12 19:56:511735 return ssl_config_.renego_allowed_default;
1736
davidben421116c2015-05-12 19:56:511737 for (NextProto allowed : ssl_config_.renego_allowed_for_protos) {
bnc3cf2a592016-08-11 14:48:361738 if (negotiated_protocol_ == allowed)
davidben421116c2015-05-12 19:56:511739 return true;
1740 }
1741 return false;
1742}
1743
davidben0bca07fd2016-07-18 15:12:031744ssl_private_key_result_t SSLClientSocketImpl::PrivateKeySignDigestCallback(
davidben1d489522015-07-01 18:48:461745 uint8_t* out,
1746 size_t* out_len,
1747 size_t max_out,
1748 const EVP_MD* md,
1749 const uint8_t* in,
1750 size_t in_len) {
1751 DCHECK_EQ(kNoPendingResult, signature_result_);
1752 DCHECK(signature_.empty());
svaldez7872fd02015-11-19 21:10:541753 DCHECK(ssl_config_.client_private_key);
davidben1d489522015-07-01 18:48:461754
davidben1d489522015-07-01 18:48:461755 SSLPrivateKey::Hash hash;
1756 if (!EVP_MDToPrivateKeyHash(md, &hash)) {
1757 OpenSSLPutNetError(FROM_HERE, ERR_SSL_CLIENT_AUTH_SIGNATURE_FAILED);
1758 return ssl_private_key_failure;
1759 }
1760
davidbene422380772017-04-19 22:20:011761 net_log_.BeginEvent(NetLogEventType::SSL_PRIVATE_KEY_OP,
1762 base::Bind(&NetLogPrivateKeyOperationCallback, hash));
davidben752bcf22015-12-21 22:55:501763
davidben1d489522015-07-01 18:48:461764 signature_result_ = ERR_IO_PENDING;
svaldez7872fd02015-11-19 21:10:541765 ssl_config_.client_private_key->SignDigest(
davidben1d489522015-07-01 18:48:461766 hash, base::StringPiece(reinterpret_cast<const char*>(in), in_len),
davidben0bca07fd2016-07-18 15:12:031767 base::Bind(&SSLClientSocketImpl::OnPrivateKeyComplete,
davidben1d489522015-07-01 18:48:461768 weak_factory_.GetWeakPtr()));
1769 return ssl_private_key_retry;
1770}
1771
davidben0bca07fd2016-07-18 15:12:031772ssl_private_key_result_t SSLClientSocketImpl::PrivateKeyCompleteCallback(
davidben1d489522015-07-01 18:48:461773 uint8_t* out,
1774 size_t* out_len,
1775 size_t max_out) {
1776 DCHECK_NE(kNoPendingResult, signature_result_);
svaldez7872fd02015-11-19 21:10:541777 DCHECK(ssl_config_.client_private_key);
davidben1d489522015-07-01 18:48:461778
1779 if (signature_result_ == ERR_IO_PENDING)
1780 return ssl_private_key_retry;
1781 if (signature_result_ != OK) {
1782 OpenSSLPutNetError(FROM_HERE, signature_result_);
1783 return ssl_private_key_failure;
1784 }
1785 if (signature_.size() > max_out) {
1786 OpenSSLPutNetError(FROM_HERE, ERR_SSL_CLIENT_AUTH_SIGNATURE_FAILED);
1787 return ssl_private_key_failure;
1788 }
davidben5f8b6bc2015-11-25 03:19:541789 memcpy(out, signature_.data(), signature_.size());
davidben1d489522015-07-01 18:48:461790 *out_len = signature_.size();
1791 signature_.clear();
1792 return ssl_private_key_success;
1793}
1794
davidben0bca07fd2016-07-18 15:12:031795void SSLClientSocketImpl::OnPrivateKeyComplete(
davidben1d489522015-07-01 18:48:461796 Error error,
1797 const std::vector<uint8_t>& signature) {
1798 DCHECK_EQ(ERR_IO_PENDING, signature_result_);
1799 DCHECK(signature_.empty());
svaldez7872fd02015-11-19 21:10:541800 DCHECK(ssl_config_.client_private_key);
davidben1d489522015-07-01 18:48:461801
mikecirone8b85c432016-09-08 19:11:001802 net_log_.EndEventWithNetErrorCode(NetLogEventType::SSL_PRIVATE_KEY_OP, error);
davidben1d489522015-07-01 18:48:461803
1804 signature_result_ = error;
1805 if (signature_result_ == OK)
1806 signature_ = signature;
1807
davidben1d489522015-07-01 18:48:461808 // During a renegotiation, either Read or Write calls may be blocked on an
1809 // asynchronous private key operation.
davidben3418e81f2016-10-19 00:09:451810 RetryAllOperations();
davidben1d489522015-07-01 18:48:461811}
1812
davidbencef9e212017-04-19 15:00:101813void SSLClientSocketImpl::MessageCallback(int is_write,
1814 int content_type,
1815 const void* buf,
1816 size_t len) {
1817 switch (content_type) {
1818 case SSL3_RT_ALERT:
1819 net_log_.AddEvent(is_write ? NetLogEventType::SSL_ALERT_SENT
1820 : NetLogEventType::SSL_ALERT_RECEIVED,
1821 base::Bind(&NetLogSSLAlertCallback, buf, len));
1822 break;
1823 case SSL3_RT_HANDSHAKE:
1824 net_log_.AddEvent(
1825 is_write ? NetLogEventType::SSL_HANDSHAKE_MESSAGE_SENT
1826 : NetLogEventType::SSL_HANDSHAKE_MESSAGE_RECEIVED,
1827 base::Bind(&NetLogSSLMessageCallback, !!is_write, buf, len));
1828 break;
1829 default:
1830 return;
1831 }
1832}
1833
svaldeze83af292016-04-26 14:33:371834int SSLClientSocketImpl::TokenBindingAdd(const uint8_t** out,
1835 size_t* out_len,
1836 int* out_alert_value) {
nharper736ceda2015-11-07 00:16:591837 if (ssl_config_.token_binding_params.empty()) {
1838 return 0;
1839 }
davidbend80c12c2016-10-11 00:13:491840 bssl::ScopedCBB output;
nharper736ceda2015-11-07 00:16:591841 CBB parameters_list;
1842 if (!CBB_init(output.get(), 7) ||
1843 !CBB_add_u8(output.get(), kTbProtocolVersionMajor) ||
1844 !CBB_add_u8(output.get(), kTbProtocolVersionMinor) ||
1845 !CBB_add_u8_length_prefixed(output.get(), &parameters_list)) {
1846 *out_alert_value = SSL_AD_INTERNAL_ERROR;
1847 return -1;
1848 }
1849 for (size_t i = 0; i < ssl_config_.token_binding_params.size(); ++i) {
1850 if (!CBB_add_u8(&parameters_list, ssl_config_.token_binding_params[i])) {
1851 *out_alert_value = SSL_AD_INTERNAL_ERROR;
1852 return -1;
1853 }
1854 }
1855 // |*out| will be freed by TokenBindingFreeCallback.
1856 if (!CBB_finish(output.get(), const_cast<uint8_t**>(out), out_len)) {
1857 *out_alert_value = SSL_AD_INTERNAL_ERROR;
1858 return -1;
1859 }
1860
1861 return 1;
1862}
1863
svaldeze83af292016-04-26 14:33:371864int SSLClientSocketImpl::TokenBindingParse(const uint8_t* contents,
1865 size_t contents_len,
1866 int* out_alert_value) {
nharper736ceda2015-11-07 00:16:591867 if (completed_connect_) {
1868 // Token Binding may only be negotiated on the initial handshake.
1869 *out_alert_value = SSL_AD_ILLEGAL_PARAMETER;
1870 return 0;
1871 }
1872
1873 CBS extension;
1874 CBS_init(&extension, contents, contents_len);
1875
1876 CBS parameters_list;
1877 uint8_t version_major, version_minor, param;
1878 if (!CBS_get_u8(&extension, &version_major) ||
1879 !CBS_get_u8(&extension, &version_minor) ||
1880 !CBS_get_u8_length_prefixed(&extension, &parameters_list) ||
1881 !CBS_get_u8(&parameters_list, &param) || CBS_len(&parameters_list) > 0 ||
1882 CBS_len(&extension) > 0) {
1883 *out_alert_value = SSL_AD_DECODE_ERROR;
1884 return 0;
1885 }
1886 // The server-negotiated version must be less than or equal to our version.
1887 if (version_major > kTbProtocolVersionMajor ||
1888 (version_minor > kTbProtocolVersionMinor &&
1889 version_major == kTbProtocolVersionMajor)) {
1890 *out_alert_value = SSL_AD_ILLEGAL_PARAMETER;
1891 return 0;
1892 }
1893 // If the version the server negotiated is older than we support, don't fail
1894 // parsing the extension, but also don't set |negotiated_|.
1895 if (version_major < kTbMinProtocolVersionMajor ||
1896 (version_minor < kTbMinProtocolVersionMinor &&
1897 version_major == kTbMinProtocolVersionMajor)) {
1898 return 1;
1899 }
1900
1901 for (size_t i = 0; i < ssl_config_.token_binding_params.size(); ++i) {
1902 if (param == ssl_config_.token_binding_params[i]) {
1903 tb_negotiated_param_ = ssl_config_.token_binding_params[i];
1904 tb_was_negotiated_ = true;
1905 return 1;
1906 }
1907 }
1908
1909 *out_alert_value = SSL_AD_ILLEGAL_PARAMETER;
1910 return 0;
1911}
1912
davidben281d13f02016-04-27 20:43:281913void SSLClientSocketImpl::LogConnectEndEvent(int rv) {
1914 if (rv != OK) {
mikecirone8b85c432016-09-08 19:11:001915 net_log_.EndEventWithNetErrorCode(NetLogEventType::SSL_CONNECT, rv);
davidben281d13f02016-04-27 20:43:281916 return;
1917 }
1918
mikecirone8b85c432016-09-08 19:11:001919 net_log_.EndEvent(NetLogEventType::SSL_CONNECT,
davidben281d13f02016-04-27 20:43:281920 base::Bind(&NetLogSSLInfoCallback, base::Unretained(this)));
1921}
1922
bncbd442c22016-09-14 20:49:161923void SSLClientSocketImpl::RecordNegotiatedProtocol() const {
1924 UMA_HISTOGRAM_ENUMERATION("Net.SSLNegotiatedAlpnProtocol",
1925 negotiated_protocol_, kProtoLast + 1);
bnc3cf2a592016-08-11 14:48:361926}
1927
1928void SSLClientSocketImpl::RecordChannelIDSupport() const {
1929 // Since this enum is used for a histogram, do not change or re-use values.
1930 enum {
1931 DISABLED = 0,
1932 CLIENT_ONLY = 1,
1933 CLIENT_AND_SERVER = 2,
1934 // CLIENT_NO_ECC is unused now.
1935 // CLIENT_BAD_SYSTEM_TIME is unused now.
1936 CLIENT_BAD_SYSTEM_TIME = 4,
1937 CLIENT_NO_CHANNEL_ID_SERVICE = 5,
1938 CHANNEL_ID_USAGE_MAX
1939 } supported = DISABLED;
1940 if (channel_id_sent_) {
1941 supported = CLIENT_AND_SERVER;
1942 } else if (ssl_config_.channel_id_enabled) {
1943 if (!channel_id_service_)
1944 supported = CLIENT_NO_CHANNEL_ID_SERVICE;
1945 else
1946 supported = CLIENT_ONLY;
1947 }
1948 UMA_HISTOGRAM_ENUMERATION("DomainBoundCerts.Support", supported,
1949 CHANNEL_ID_USAGE_MAX);
1950}
1951
1952bool SSLClientSocketImpl::IsChannelIDEnabled() const {
1953 return ssl_config_.channel_id_enabled && channel_id_service_;
1954}
1955
davidbenfe132d92016-09-27 18:07:211956int SSLClientSocketImpl::MapLastOpenSSLError(
1957 int ssl_error,
1958 const crypto::OpenSSLErrStackTracer& tracer,
1959 OpenSSLErrorInfo* info) {
1960 int net_error = MapOpenSSLErrorWithDetails(ssl_error, tracer, info);
1961
1962 if (ssl_error == SSL_ERROR_SSL &&
1963 ERR_GET_LIB(info->error_code) == ERR_LIB_SSL) {
1964 // TLS does not provide an alert for missing client certificates, so most
1965 // servers send a generic handshake_failure alert. Detect this case by
1966 // checking if we have received a CertificateRequest but sent no
1967 // certificate. See https://crbug.com/646567.
1968 if (ERR_GET_REASON(info->error_code) ==
1969 SSL_R_SSLV3_ALERT_HANDSHAKE_FAILURE &&
1970 certificate_requested_ && ssl_config_.send_client_cert &&
1971 !ssl_config_.client_cert) {
1972 net_error = ERR_BAD_SSL_CLIENT_AUTH_CERT;
1973 }
1974
1975 // Per spec, access_denied is only for client-certificate-based access
1976 // control, but some buggy firewalls use it when blocking a page. To avoid a
1977 // confusing error, map it to a generic protocol error if no
1978 // CertificateRequest was sent. See https://crbug.com/630883.
1979 if (ERR_GET_REASON(info->error_code) == SSL_R_TLSV1_ALERT_ACCESS_DENIED &&
1980 !certificate_requested_) {
1981 net_error = ERR_SSL_PROTOCOL_ERROR;
1982 }
1983 }
1984
1985 return net_error;
1986}
1987
[email protected]7e5dd49f2010-12-08 18:33:491988} // namespace net