blob: ac4b8337253ab9c3e9fb0c066642b97d74d3763f [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>
davidben018aad62014-09-12 02:25:198#include <openssl/bio.h>
nharper736ceda2015-11-07 00:16:599#include <openssl/bytestring.h>
[email protected]d518cd92010-09-29 12:27:4410#include <openssl/err.h>
nharper736ceda2015-11-07 00:16:5911#include <openssl/evp.h>
davidben121e9c962015-05-01 00:40:4912#include <openssl/mem.h>
[email protected]536fd0b2013-03-14 17:41:5713#include <openssl/ssl.h>
bnc67da3de2015-01-15 21:02:2614#include <string.h>
[email protected]d518cd92010-09-29 12:27:4415
davidben752bcf22015-12-21 22:55:5016#include <utility>
17
[email protected]0f7804ec2011-10-07 20:04:1818#include "base/bind.h"
[email protected]f2da6ac2013-02-04 08:22:5319#include "base/callback_helpers.h"
davidben1d489522015-07-01 18:48:4620#include "base/lazy_instance.h"
Avi Drissman13fc8932015-12-20 04:40:4621#include "base/macros.h"
[email protected]3b63f8f42011-03-28 01:54:1522#include "base/memory/singleton.h"
mmenke1beda3d2016-07-22 03:33:4523#include "base/metrics/field_trial.h"
asvitkinec3c93722015-06-17 14:48:3724#include "base/metrics/histogram_macros.h"
davidben4fe4f982015-11-11 22:00:1225#include "base/metrics/sparse_histogram.h"
vadimtb2a77c762014-11-21 19:49:2226#include "base/profiler/scoped_tracker.h"
nharper49b27d992016-02-09 18:28:5127#include "base/strings/string_number_conversions.h"
davidben018aad62014-09-12 02:25:1928#include "base/strings/string_piece.h"
[email protected]20305ec2011-01-21 04:55:5229#include "base/synchronization/lock.h"
vadimt6b43dec22015-01-06 01:59:5830#include "base/threading/thread_local.h"
ssid6d6b40102016-04-05 18:59:5631#include "base/trace_event/trace_event.h"
estade5e5529d2015-05-21 20:59:1132#include "base/values.h"
davidben7dad2a32016-03-01 23:47:4733#include "crypto/auto_cbb.h"
[email protected]ee0f2aa82013-10-25 11:59:2634#include "crypto/ec_private_key.h"
[email protected]4b559b4d2011-04-14 17:37:1435#include "crypto/openssl_util.h"
[email protected]cd9b75b2014-07-10 04:39:3836#include "crypto/scoped_openssl_types.h"
martijna2e83bd2016-03-18 13:10:4537#include "net/base/ip_address.h"
[email protected]d518cd92010-09-29 12:27:4438#include "net/base/net_errors.h"
[email protected]6e7845ae2013-03-29 21:48:1139#include "net/cert/cert_verifier.h"
eranmefbd3132014-10-28 16:35:1640#include "net/cert/ct_ev_whitelist.h"
estark6f9b3d82016-01-12 21:37:0541#include "net/cert/ct_policy_enforcer.h"
estark723b5eeb2016-02-18 21:01:1242#include "net/cert/ct_policy_status.h"
davidbeneb5f8ef32014-09-04 14:14:3243#include "net/cert/ct_verifier.h"
[email protected]6e7845ae2013-03-29 21:48:1144#include "net/cert/x509_certificate_net_log_param.h"
davidben30798ed82014-09-19 19:28:2045#include "net/cert/x509_util_openssl.h"
[email protected]8bd4e7a2014-08-09 14:49:1746#include "net/http/transport_security_state.h"
davidbenc879af02015-02-20 07:57:2147#include "net/ssl/scoped_openssl_types.h"
[email protected]536fd0b2013-03-14 17:41:5748#include "net/ssl/ssl_cert_request_info.h"
davidben281d13f02016-04-27 20:43:2849#include "net/ssl/ssl_cipher_suite_names.h"
svaldeze83af292016-04-26 14:33:3750#include "net/ssl/ssl_client_session_cache.h"
[email protected]536fd0b2013-03-14 17:41:5751#include "net/ssl/ssl_connection_status_flags.h"
52#include "net/ssl/ssl_info.h"
davidben1d489522015-07-01 18:48:4653#include "net/ssl/ssl_private_key.h"
nharperd5cddca2016-02-27 03:37:5254#include "net/ssl/token_binding.h"
[email protected]d518cd92010-09-29 12:27:4455
davidben2a811e4e2015-12-01 10:49:3456#if !defined(OS_NACL)
57#include "net/ssl/ssl_key_logger.h"
58#endif
59
svaldez2135be52016-04-20 16:34:5360#if defined(USE_NSS_CERTS)
davidbena477a70a2015-10-06 04:38:2961#include "net/cert_net/nss_ocsp.h"
62#endif
63
[email protected]d518cd92010-09-29 12:27:4464namespace net {
65
66namespace {
67
[email protected]4b768562013-02-16 04:10:0768// This constant can be any non-negative/non-zero value (eg: it does not
69// overlap with any value of the net::Error range, including net::OK).
davidben1d489522015-07-01 18:48:4670const int kNoPendingResult = 1;
[email protected]4b768562013-02-16 04:10:0771
[email protected]168a8412012-06-14 05:05:4972// If a client doesn't have a list of protocols that it supports, but
73// the server supports NPN, choosing "http/1.1" is the best answer.
74const char kDefaultSupportedNPNProtocol[] = "http/1.1";
75
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;
nharper86f0be22016-07-14 00:49:3684const uint8_t kTbProtocolVersionMinor = 8;
nharper736ceda2015-11-07 00:16:5985const uint8_t kTbMinProtocolVersionMajor = 0;
nharper2840f952016-06-28 01:38:2186const uint8_t kTbMinProtocolVersionMinor = 6;
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::Type type,
112 SSLPrivateKey::Hash hash,
113 NetLogCaptureMode mode) {
114 std::string type_str;
115 switch (type) {
116 case SSLPrivateKey::Type::RSA:
117 type_str = "RSA";
118 break;
119 case SSLPrivateKey::Type::ECDSA:
120 type_str = "ECDSA";
121 break;
122 }
123
124 std::string hash_str;
125 switch (hash) {
126 case SSLPrivateKey::Hash::MD5_SHA1:
127 hash_str = "MD5_SHA1";
128 break;
129 case SSLPrivateKey::Hash::SHA1:
130 hash_str = "SHA1";
131 break;
132 case SSLPrivateKey::Hash::SHA256:
133 hash_str = "SHA256";
134 break;
135 case SSLPrivateKey::Hash::SHA384:
136 hash_str = "SHA384";
137 break;
138 case SSLPrivateKey::Hash::SHA512:
139 hash_str = "SHA512";
140 break;
141 }
142
danakj655b66c2016-04-16 00:51:38143 std::unique_ptr<base::DictionaryValue> value(new base::DictionaryValue);
davidben752bcf22015-12-21 22:55:50144 value->SetString("type", type_str);
145 value->SetString("hash", hash_str);
146 return std::move(value);
147}
148
danakj655b66c2016-04-16 00:51:38149std::unique_ptr<base::Value> NetLogChannelIDLookupCallback(
nharper49b27d992016-02-09 18:28:51150 ChannelIDService* channel_id_service,
151 NetLogCaptureMode capture_mode) {
152 ChannelIDStore* store = channel_id_service->GetChannelIDStore();
danakj655b66c2016-04-16 00:51:38153 std::unique_ptr<base::DictionaryValue> dict(new base::DictionaryValue());
nharper49b27d992016-02-09 18:28:51154 dict->SetBoolean("ephemeral", store->IsEphemeral());
155 dict->SetString("service", base::HexEncode(&channel_id_service,
156 sizeof(channel_id_service)));
157 dict->SetString("store", base::HexEncode(&store, sizeof(store)));
158 return std::move(dict);
159}
160
danakj655b66c2016-04-16 00:51:38161std::unique_ptr<base::Value> NetLogChannelIDLookupCompleteCallback(
nharper49b27d992016-02-09 18:28:51162 crypto::ECPrivateKey* key,
163 int result,
164 NetLogCaptureMode capture_mode) {
danakj655b66c2016-04-16 00:51:38165 std::unique_ptr<base::DictionaryValue> dict(new base::DictionaryValue());
nharper49b27d992016-02-09 18:28:51166 dict->SetInteger("net_error", result);
167 std::string raw_key;
168 if (result == OK && key && key->ExportRawPublicKey(&raw_key)) {
169 std::string key_to_log = "redacted";
170 if (capture_mode.include_cookies_and_credentials()) {
171 key_to_log = base::HexEncode(raw_key.data(), raw_key.length());
172 }
173 dict->SetString("key", key_to_log);
174 }
175 return std::move(dict);
176}
177
davidben281d13f02016-04-27 20:43:28178std::unique_ptr<base::Value> NetLogSSLInfoCallback(
179 SSLClientSocketImpl* socket,
180 NetLogCaptureMode capture_mode) {
181 SSLInfo ssl_info;
182 if (!socket->GetSSLInfo(&ssl_info))
183 return nullptr;
184
185 std::unique_ptr<base::DictionaryValue> dict(new base::DictionaryValue());
186 const char* version_str;
187 SSLVersionToString(&version_str,
188 SSLConnectionStatusToVersion(ssl_info.connection_status));
189 dict->SetString("version", version_str);
190 dict->SetBoolean("is_resumed",
191 ssl_info.handshake_type == SSLInfo::HANDSHAKE_RESUME);
192 dict->SetInteger("cipher_suite", SSLConnectionStatusToCipherSuite(
193 ssl_info.connection_status));
194
bnc3cf2a592016-08-11 14:48:36195 dict->SetString("next_proto", SSLClientSocket::NextProtoToString(
196 socket->GetNegotiatedProtocol()));
davidben281d13f02016-04-27 20:43:28197
198 return std::move(dict);
199}
200
[email protected]821e3bb2013-11-08 01:06:01201} // namespace
202
svaldeze83af292016-04-26 14:33:37203class SSLClientSocketImpl::SSLContext {
[email protected]fbef13932010-11-23 12:38:53204 public:
olli.raula36aa8be2015-09-10 11:14:22205 static SSLContext* GetInstance() {
206 return base::Singleton<SSLContext>::get();
207 }
[email protected]fbef13932010-11-23 12:38:53208 SSL_CTX* ssl_ctx() { return ssl_ctx_.get(); }
svaldeze83af292016-04-26 14:33:37209 SSLClientSessionCache* session_cache() { return &session_cache_; }
[email protected]fbef13932010-11-23 12:38:53210
svaldeze83af292016-04-26 14:33:37211 SSLClientSocketImpl* GetClientSocketFromSSL(const SSL* ssl) {
[email protected]fbef13932010-11-23 12:38:53212 DCHECK(ssl);
svaldeze83af292016-04-26 14:33:37213 SSLClientSocketImpl* socket = static_cast<SSLClientSocketImpl*>(
[email protected]fbef13932010-11-23 12:38:53214 SSL_get_ex_data(ssl, ssl_socket_data_index_));
215 DCHECK(socket);
216 return socket;
217 }
218
svaldeze83af292016-04-26 14:33:37219 bool SetClientSocketForSSL(SSL* ssl, SSLClientSocketImpl* socket) {
[email protected]fbef13932010-11-23 12:38:53220 return SSL_set_ex_data(ssl, ssl_socket_data_index_, socket) != 0;
221 }
222
davidben2a811e4e2015-12-01 10:49:34223#if !defined(OS_NACL)
224 void SetSSLKeyLogFile(
225 const base::FilePath& path,
226 const scoped_refptr<base::SequencedTaskRunner>& task_runner) {
227 DCHECK(!ssl_key_logger_);
228 ssl_key_logger_.reset(new SSLKeyLogger(path, task_runner));
229 SSL_CTX_set_keylog_callback(ssl_ctx_.get(), KeyLogCallback);
230 }
231#endif
232
davidben1d489522015-07-01 18:48:46233 static const SSL_PRIVATE_KEY_METHOD kPrivateKeyMethod;
234
[email protected]fbef13932010-11-23 12:38:53235 private:
olli.raula36aa8be2015-09-10 11:14:22236 friend struct base::DefaultSingletonTraits<SSLContext>;
[email protected]fbef13932010-11-23 12:38:53237
svaldeze83af292016-04-26 14:33:37238 SSLContext() : session_cache_(SSLClientSessionCache::Config()) {
[email protected]4b559b4d2011-04-14 17:37:14239 crypto::EnsureOpenSSLInit();
[email protected]fbef13932010-11-23 12:38:53240 ssl_socket_data_index_ = SSL_get_ex_new_index(0, 0, 0, 0, 0);
241 DCHECK_NE(ssl_socket_data_index_, -1);
242 ssl_ctx_.reset(SSL_CTX_new(SSLv23_client_method()));
[email protected]b051cdb62014-02-28 02:20:16243 SSL_CTX_set_cert_verify_callback(ssl_ctx_.get(), CertVerifyCallback, NULL);
[email protected]82c59022014-08-15 09:38:27244 SSL_CTX_set_cert_cb(ssl_ctx_.get(), ClientCertRequestCallback, NULL);
[email protected]b051cdb62014-02-28 02:20:16245 SSL_CTX_set_verify(ssl_ctx_.get(), SSL_VERIFY_PEER, NULL);
haavardmc80b0ee32015-01-30 09:16:08246 // This stops |SSL_shutdown| from generating the close_notify message, which
247 // is currently not sent on the network.
248 // TODO(haavardm): Remove setting quiet shutdown once 118366 is fixed.
249 SSL_CTX_set_quiet_shutdown(ssl_ctx_.get(), 1);
bnc2d6bd0f2015-10-28 01:52:05250 // Note that SSL_OP_DISABLE_NPN is used to disable NPN if
251 // ssl_config_.next_proto is empty.
[email protected]ea4a1c6a2010-12-09 13:33:28252 SSL_CTX_set_next_proto_select_cb(ssl_ctx_.get(), SelectNextProtoCallback,
253 NULL);
davidbendafe4e52015-04-08 22:53:52254
255 // Disable the internal session cache. Session caching is handled
svaldeze83af292016-04-26 14:33:37256 // externally (i.e. by SSLClientSessionCache).
davidbendafe4e52015-04-08 22:53:52257 SSL_CTX_set_session_cache_mode(
258 ssl_ctx_.get(), SSL_SESS_CACHE_CLIENT | SSL_SESS_CACHE_NO_INTERNAL);
davidben44aeae62015-06-24 20:47:43259 SSL_CTX_sess_set_new_cb(ssl_ctx_.get(), NewSessionCallback);
nharper736ceda2015-11-07 00:16:59260
261 if (!SSL_CTX_add_client_custom_ext(ssl_ctx_.get(), kTbExtNum,
262 &TokenBindingAddCallback,
263 &TokenBindingFreeCallback, nullptr,
264 &TokenBindingParseCallback, nullptr)) {
265 NOTREACHED();
266 }
267 }
268
269 static int TokenBindingAddCallback(SSL* ssl,
270 unsigned int extension_value,
271 const uint8_t** out,
272 size_t* out_len,
273 int* out_alert_value,
274 void* add_arg) {
275 DCHECK_EQ(extension_value, kTbExtNum);
svaldeze83af292016-04-26 14:33:37276 SSLClientSocketImpl* socket =
277 SSLClientSocketImpl::SSLContext::GetInstance()->GetClientSocketFromSSL(
278 ssl);
nharper736ceda2015-11-07 00:16:59279 return socket->TokenBindingAdd(out, out_len, out_alert_value);
280 }
281
282 static void TokenBindingFreeCallback(SSL* ssl,
283 unsigned extension_value,
284 const uint8_t* out,
285 void* add_arg) {
286 DCHECK_EQ(extension_value, kTbExtNum);
287 OPENSSL_free(const_cast<unsigned char*>(out));
288 }
289
290 static int TokenBindingParseCallback(SSL* ssl,
291 unsigned int extension_value,
292 const uint8_t* contents,
293 size_t contents_len,
294 int* out_alert_value,
295 void* parse_arg) {
296 DCHECK_EQ(extension_value, kTbExtNum);
svaldeze83af292016-04-26 14:33:37297 SSLClientSocketImpl* socket =
298 SSLClientSocketImpl::SSLContext::GetInstance()->GetClientSocketFromSSL(
299 ssl);
nharper736ceda2015-11-07 00:16:59300 return socket->TokenBindingParse(contents, contents_len, out_alert_value);
[email protected]fbef13932010-11-23 12:38:53301 }
302
[email protected]82c59022014-08-15 09:38:27303 static int ClientCertRequestCallback(SSL* ssl, void* arg) {
svaldeze83af292016-04-26 14:33:37304 SSLClientSocketImpl* socket = GetInstance()->GetClientSocketFromSSL(ssl);
[email protected]82c59022014-08-15 09:38:27305 DCHECK(socket);
306 return socket->ClientCertRequestCallback(ssl);
[email protected]718c9672010-12-02 10:04:10307 }
308
svaldeze83af292016-04-26 14:33:37309 static int CertVerifyCallback(X509_STORE_CTX* store_ctx, void* arg) {
[email protected]b051cdb62014-02-28 02:20:16310 SSL* ssl = reinterpret_cast<SSL*>(X509_STORE_CTX_get_ex_data(
311 store_ctx, SSL_get_ex_data_X509_STORE_CTX_idx()));
svaldeze83af292016-04-26 14:33:37312 SSLClientSocketImpl* socket = GetInstance()->GetClientSocketFromSSL(ssl);
[email protected]b051cdb62014-02-28 02:20:16313 CHECK(socket);
314
315 return socket->CertVerifyCallback(store_ctx);
316 }
317
[email protected]ea4a1c6a2010-12-09 13:33:28318 static int SelectNextProtoCallback(SSL* ssl,
svaldeze83af292016-04-26 14:33:37319 unsigned char** out,
320 unsigned char* outlen,
[email protected]ea4a1c6a2010-12-09 13:33:28321 const unsigned char* in,
svaldeze83af292016-04-26 14:33:37322 unsigned int inlen,
323 void* arg) {
324 SSLClientSocketImpl* socket = GetInstance()->GetClientSocketFromSSL(ssl);
[email protected]ea4a1c6a2010-12-09 13:33:28325 return socket->SelectNextProtoCallback(out, outlen, in, inlen);
326 }
327
davidben44aeae62015-06-24 20:47:43328 static int NewSessionCallback(SSL* ssl, SSL_SESSION* session) {
svaldeze83af292016-04-26 14:33:37329 SSLClientSocketImpl* socket = GetInstance()->GetClientSocketFromSSL(ssl);
davidben44aeae62015-06-24 20:47:43330 return socket->NewSessionCallback(session);
davidbendafe4e52015-04-08 22:53:52331 }
332
davidben1d489522015-07-01 18:48:46333 static int PrivateKeyTypeCallback(SSL* ssl) {
svaldeze83af292016-04-26 14:33:37334 SSLClientSocketImpl* socket = GetInstance()->GetClientSocketFromSSL(ssl);
davidben1d489522015-07-01 18:48:46335 return socket->PrivateKeyTypeCallback();
336 }
337
davidben1d489522015-07-01 18:48:46338 static size_t PrivateKeyMaxSignatureLenCallback(SSL* ssl) {
svaldeze83af292016-04-26 14:33:37339 SSLClientSocketImpl* socket = GetInstance()->GetClientSocketFromSSL(ssl);
davidben1d489522015-07-01 18:48:46340 return socket->PrivateKeyMaxSignatureLenCallback();
341 }
342
davidben0bca07fd2016-07-18 15:12:03343 static ssl_private_key_result_t PrivateKeySignDigestCallback(
davidben1d489522015-07-01 18:48:46344 SSL* ssl,
345 uint8_t* out,
346 size_t* out_len,
davidben0bca07fd2016-07-18 15:12:03347 size_t max_out,
348 const EVP_MD* md,
349 const uint8_t* in,
350 size_t in_len) {
svaldeze83af292016-04-26 14:33:37351 SSLClientSocketImpl* socket = GetInstance()->GetClientSocketFromSSL(ssl);
davidben0bca07fd2016-07-18 15:12:03352 return socket->PrivateKeySignDigestCallback(out, out_len, max_out, md, in,
353 in_len);
354 }
355
356 static ssl_private_key_result_t PrivateKeyCompleteCallback(SSL* ssl,
357 uint8_t* out,
358 size_t* out_len,
359 size_t max_out) {
360 SSLClientSocketImpl* socket = GetInstance()->GetClientSocketFromSSL(ssl);
361 return socket->PrivateKeyCompleteCallback(out, out_len, max_out);
davidben1d489522015-07-01 18:48:46362 }
363
davidben2a811e4e2015-12-01 10:49:34364#if !defined(OS_NACL)
365 static void KeyLogCallback(const SSL* ssl, const char* line) {
366 GetInstance()->ssl_key_logger_->WriteLine(line);
367 }
368#endif
369
[email protected]fbef13932010-11-23 12:38:53370 // This is the index used with SSL_get_ex_data to retrieve the owner
svaldeze83af292016-04-26 14:33:37371 // SSLClientSocketImpl object from an SSL instance.
[email protected]fbef13932010-11-23 12:38:53372 int ssl_socket_data_index_;
373
davidbenc879af02015-02-20 07:57:21374 ScopedSSL_CTX ssl_ctx_;
davidbendafe4e52015-04-08 22:53:52375
davidben2a811e4e2015-12-01 10:49:34376#if !defined(OS_NACL)
danakj655b66c2016-04-16 00:51:38377 std::unique_ptr<SSLKeyLogger> ssl_key_logger_;
davidben2a811e4e2015-12-01 10:49:34378#endif
379
davidbendafe4e52015-04-08 22:53:52380 // TODO(davidben): Use a separate cache per URLRequestContext.
381 // https://crbug.com/458365
382 //
383 // TODO(davidben): Sessions should be invalidated on fatal
384 // alerts. https://crbug.com/466352
svaldeze83af292016-04-26 14:33:37385 SSLClientSessionCache session_cache_;
[email protected]1279de12013-12-03 15:13:32386};
387
davidben0bca07fd2016-07-18 15:12:03388// TODO(davidben): Switch from sign_digest to sign.
davidben1d489522015-07-01 18:48:46389const SSL_PRIVATE_KEY_METHOD
svaldeze83af292016-04-26 14:33:37390 SSLClientSocketImpl::SSLContext::kPrivateKeyMethod = {
391 &SSLClientSocketImpl::SSLContext::PrivateKeyTypeCallback,
392 &SSLClientSocketImpl::SSLContext::PrivateKeyMaxSignatureLenCallback,
davidben0bca07fd2016-07-18 15:12:03393 nullptr /* sign */,
394 &SSLClientSocketImpl::SSLContext::PrivateKeySignDigestCallback,
395 nullptr /* decrypt */,
396 &SSLClientSocketImpl::SSLContext::PrivateKeyCompleteCallback,
davidben1d489522015-07-01 18:48:46397};
398
[email protected]7f38da8a2014-03-17 16:44:26399// PeerCertificateChain is a helper object which extracts the certificate
400// chain, as given by the server, from an OpenSSL socket and performs the needed
401// resource management. The first element of the chain is the leaf certificate
402// and the other elements are in the order given by the server.
svaldeze83af292016-04-26 14:33:37403class SSLClientSocketImpl::PeerCertificateChain {
[email protected]7f38da8a2014-03-17 16:44:26404 public:
svaldeze83af292016-04-26 14:33:37405 explicit PeerCertificateChain(STACK_OF(X509) * chain) { Reset(chain); }
[email protected]7f38da8a2014-03-17 16:44:26406 PeerCertificateChain(const PeerCertificateChain& other) { *this = other; }
407 ~PeerCertificateChain() {}
408 PeerCertificateChain& operator=(const PeerCertificateChain& other);
409
[email protected]76e85392014-03-20 17:54:14410 // Resets the PeerCertificateChain to the set of certificates in|chain|,
411 // which may be NULL, indicating to empty the store certificates.
412 // Note: If an error occurs, such as being unable to parse the certificates,
413 // this will behave as if Reset(NULL) was called.
svaldeze83af292016-04-26 14:33:37414 void Reset(STACK_OF(X509) * chain);
[email protected]76e85392014-03-20 17:54:14415
svaldez2135be52016-04-20 16:34:53416 // Note that when USE_OPENSSL_CERTS is defined, OSCertHandle is X509*
davidben30798ed82014-09-19 19:28:20417 scoped_refptr<X509Certificate> AsOSChain() const;
[email protected]7f38da8a2014-03-17 16:44:26418
419 size_t size() const {
420 if (!openssl_chain_.get())
421 return 0;
422 return sk_X509_num(openssl_chain_.get());
423 }
424
svaldeze83af292016-04-26 14:33:37425 bool empty() const { return size() == 0; }
davidben30798ed82014-09-19 19:28:20426
427 X509* Get(size_t index) const {
[email protected]7f38da8a2014-03-17 16:44:26428 DCHECK_LT(index, size());
429 return sk_X509_value(openssl_chain_.get(), index);
430 }
431
432 private:
[email protected]cd9b75b2014-07-10 04:39:38433 ScopedX509Stack openssl_chain_;
[email protected]7f38da8a2014-03-17 16:44:26434};
435
svaldeze83af292016-04-26 14:33:37436SSLClientSocketImpl::PeerCertificateChain&
437SSLClientSocketImpl::PeerCertificateChain::operator=(
[email protected]7f38da8a2014-03-17 16:44:26438 const PeerCertificateChain& other) {
439 if (this == &other)
440 return *this;
441
[email protected]24176af2014-08-14 09:31:04442 openssl_chain_.reset(X509_chain_up_ref(other.openssl_chain_.get()));
[email protected]7f38da8a2014-03-17 16:44:26443 return *this;
444}
445
svaldeze83af292016-04-26 14:33:37446void SSLClientSocketImpl::PeerCertificateChain::Reset(STACK_OF(X509) * chain) {
davidben30798ed82014-09-19 19:28:20447 openssl_chain_.reset(chain ? X509_chain_up_ref(chain) : NULL);
[email protected]7f38da8a2014-03-17 16:44:26448}
[email protected]7f38da8a2014-03-17 16:44:26449
davidben30798ed82014-09-19 19:28:20450scoped_refptr<X509Certificate>
svaldeze83af292016-04-26 14:33:37451SSLClientSocketImpl::PeerCertificateChain::AsOSChain() const {
davidben30798ed82014-09-19 19:28:20452#if defined(USE_OPENSSL_CERTS)
453 // When OSCertHandle is typedef'ed to X509, this implementation does a short
454 // cut to avoid converting back and forth between DER and the X509 struct.
455 X509Certificate::OSCertHandles intermediates;
456 for (size_t i = 1; i < sk_X509_num(openssl_chain_.get()); ++i) {
457 intermediates.push_back(sk_X509_value(openssl_chain_.get(), i));
458 }
[email protected]7f38da8a2014-03-17 16:44:26459
svaldezc4b6f122016-01-20 22:13:59460 return X509Certificate::CreateFromHandle(
461 sk_X509_value(openssl_chain_.get(), 0), intermediates);
davidben30798ed82014-09-19 19:28:20462#else
463 // DER-encode the chain and convert to a platform certificate handle.
[email protected]7f38da8a2014-03-17 16:44:26464 std::vector<base::StringPiece> der_chain;
[email protected]edfd0f42014-07-22 18:20:37465 for (size_t i = 0; i < sk_X509_num(openssl_chain_.get()); ++i) {
[email protected]7f38da8a2014-03-17 16:44:26466 X509* x = sk_X509_value(openssl_chain_.get(), i);
davidben30798ed82014-09-19 19:28:20467 base::StringPiece der;
468 if (!x509_util::GetDER(x, &der))
469 return NULL;
470 der_chain.push_back(der);
[email protected]7f38da8a2014-03-17 16:44:26471 }
472
svaldezc4b6f122016-01-20 22:13:59473 return X509Certificate::CreateFromDERCertChain(der_chain);
davidben30798ed82014-09-19 19:28:20474#endif
[email protected]7f38da8a2014-03-17 16:44:26475}
[email protected]7f38da8a2014-03-17 16:44:26476
[email protected]1279de12013-12-03 15:13:32477// static
[email protected]c3456bb2011-12-12 22:22:19478void SSLClientSocket::ClearSessionCache() {
svaldeze83af292016-04-26 14:33:37479 SSLClientSocketImpl::SSLContext* context =
480 SSLClientSocketImpl::SSLContext::GetInstance();
[email protected]c3456bb2011-12-12 22:22:19481 context->session_cache()->Flush();
482}
483
svaldeze83af292016-04-26 14:33:37484SSLClientSocketImpl::SSLClientSocketImpl(
danakj655b66c2016-04-16 00:51:38485 std::unique_ptr<ClientSocketHandle> transport_socket,
[email protected]055d7f22010-11-15 12:03:12486 const HostPortPair& host_and_port,
[email protected]822581d2010-12-16 17:27:15487 const SSLConfig& ssl_config,
[email protected]feb79bcd2011-07-21 16:55:17488 const SSLClientSocketContext& context)
[email protected]83039bb2011-12-09 18:43:55489 : transport_send_busy_(false),
[email protected]d518cd92010-09-29 12:27:44490 transport_recv_busy_(false),
davidben1d489522015-07-01 18:48:46491 pending_read_error_(kNoPendingResult),
davidbenb8c23212014-10-28 00:12:16492 pending_read_ssl_error_(SSL_ERROR_NONE),
[email protected]5aea79182014-07-14 20:43:41493 transport_read_error_(OK),
[email protected]3e5c6922014-02-06 02:42:16494 transport_write_error_(OK),
[email protected]7f38da8a2014-03-17 16:44:26495 server_cert_chain_(new PeerCertificateChain(NULL)),
[email protected]64b5c892014-08-08 09:39:26496 completed_connect_(false),
[email protected]0dc88b32014-03-26 20:12:28497 was_ever_used_(false),
[email protected]feb79bcd2011-07-21 16:55:17498 cert_verifier_(context.cert_verifier),
davidbeneb5f8ef32014-09-04 14:14:32499 cert_transparency_verifier_(context.cert_transparency_verifier),
[email protected]6b8a3c742014-07-25 00:25:35500 channel_id_service_(context.channel_id_service),
nharper736ceda2015-11-07 00:16:59501 tb_was_negotiated_(false),
502 tb_negotiated_param_(TB_PARAM_ECDSAP256),
nharperb7441ef2016-01-25 23:54:14503 tb_signed_ekm_map_(10),
[email protected]d518cd92010-09-29 12:27:44504 ssl_(NULL),
505 transport_bio_(NULL),
dchengc7eeda422015-12-26 03:56:48506 transport_(std::move(transport_socket)),
[email protected]055d7f22010-11-15 12:03:12507 host_and_port_(host_and_port),
[email protected]d518cd92010-09-29 12:27:44508 ssl_config_(ssl_config),
[email protected]c3456bb2011-12-12 22:22:19509 ssl_session_cache_shard_(context.ssl_session_cache_shard),
[email protected]013c17c2012-01-21 19:09:01510 next_handshake_state_(STATE_NONE),
svaldez4af14d22015-08-20 13:48:24511 disconnected_(false),
[email protected]ea4a1c6a2010-12-09 13:33:28512 npn_status_(kNextProtoUnsupported),
bnc3cf2a592016-08-11 14:48:36513 negotiated_protocol_(kProtoUnknown),
514 negotiation_extension_(kExtensionUnknown),
davidben52053b382015-04-27 19:22:29515 channel_id_sent_(false),
davidbendafe4e52015-04-08 22:53:52516 certificate_verified_(false),
davidben1d489522015-07-01 18:48:46517 signature_result_(kNoPendingResult),
[email protected]8bd4e7a2014-08-09 14:49:17518 transport_security_state_(context.transport_security_state),
estark6f9b3d82016-01-12 21:37:05519 policy_enforcer_(context.ct_policy_enforcer),
dadriandf302c42016-06-10 18:48:59520 pkp_bypassed_(false),
kulkarni.acd7b4462014-08-28 07:41:34521 net_log_(transport_->socket()->NetLog()),
522 weak_factory_(this) {
rsleevibe81cd62016-06-24 01:38:59523 CHECK(cert_verifier_);
524 CHECK(transport_security_state_);
525 CHECK(cert_transparency_verifier_);
526 CHECK(policy_enforcer_);
[email protected]8e458552014-08-05 00:02:15527}
[email protected]d518cd92010-09-29 12:27:44528
svaldeze83af292016-04-26 14:33:37529SSLClientSocketImpl::~SSLClientSocketImpl() {
[email protected]d518cd92010-09-29 12:27:44530 Disconnect();
531}
532
davidben2a811e4e2015-12-01 10:49:34533#if !defined(OS_NACL)
svaldeze83af292016-04-26 14:33:37534void SSLClientSocketImpl::SetSSLKeyLogFile(
davidben2a811e4e2015-12-01 10:49:34535 const base::FilePath& ssl_keylog_file,
536 const scoped_refptr<base::SequencedTaskRunner>& task_runner) {
537 SSLContext::GetInstance()->SetSSLKeyLogFile(ssl_keylog_file, task_runner);
zhongyi81f85c6d92015-10-16 19:34:14538}
davidben2a811e4e2015-12-01 10:49:34539#endif
zhongyi81f85c6d92015-10-16 19:34:14540
svaldeze83af292016-04-26 14:33:37541void SSLClientSocketImpl::GetSSLCertRequestInfo(
[email protected]b9b651f2013-11-09 04:32:22542 SSLCertRequestInfo* cert_request_info) {
[email protected]791879c2013-12-17 07:22:41543 cert_request_info->host_and_port = host_and_port_;
[email protected]b9b651f2013-11-09 04:32:22544 cert_request_info->cert_authorities = cert_authorities_;
[email protected]c0787702014-05-20 21:51:44545 cert_request_info->cert_key_types = cert_key_types_;
[email protected]b9b651f2013-11-09 04:32:22546}
547
svaldeze83af292016-04-26 14:33:37548ChannelIDService* SSLClientSocketImpl::GetChannelIDService() const {
[email protected]6b8a3c742014-07-25 00:25:35549 return channel_id_service_;
[email protected]b9b651f2013-11-09 04:32:22550}
551
svaldeze83af292016-04-26 14:33:37552Error SSLClientSocketImpl::GetSignedEKMForTokenBinding(
nharperb7441ef2016-01-25 23:54:14553 crypto::ECPrivateKey* key,
554 std::vector<uint8_t>* out) {
555 // The same key will be used across multiple requests to sign the same value,
556 // so the signature is cached.
557 std::string raw_public_key;
558 if (!key->ExportRawPublicKey(&raw_public_key))
559 return ERR_FAILED;
560 SignedEkmMap::iterator it = tb_signed_ekm_map_.Get(raw_public_key);
561 if (it != tb_signed_ekm_map_.end()) {
562 *out = it->second;
563 return OK;
564 }
565
566 uint8_t tb_ekm_buf[32];
567 static const char kTokenBindingExporterLabel[] = "EXPORTER-Token-Binding";
568 if (!SSL_export_keying_material(ssl_, tb_ekm_buf, sizeof(tb_ekm_buf),
569 kTokenBindingExporterLabel,
570 strlen(kTokenBindingExporterLabel), nullptr,
571 0, false /* no context */)) {
572 return ERR_FAILED;
573 }
574
nharperd5cddca2016-02-27 03:37:52575 if (!SignTokenBindingEkm(
576 base::StringPiece(reinterpret_cast<char*>(tb_ekm_buf),
577 sizeof(tb_ekm_buf)),
578 key, out))
nharperb7441ef2016-01-25 23:54:14579 return ERR_FAILED;
nharperb7441ef2016-01-25 23:54:14580
581 tb_signed_ekm_map_.Put(raw_public_key, *out);
582 return OK;
583}
584
svaldeze83af292016-04-26 14:33:37585crypto::ECPrivateKey* SSLClientSocketImpl::GetChannelIDKey() const {
nharperb36644f2016-02-22 23:14:43586 return channel_id_key_.get();
587}
588
svaldeze83af292016-04-26 14:33:37589int SSLClientSocketImpl::ExportKeyingMaterial(const base::StringPiece& label,
590 bool has_context,
591 const base::StringPiece& context,
592 unsigned char* out,
593 unsigned int outlen) {
davidben86935f72015-05-06 22:24:49594 if (!IsConnected())
595 return ERR_SOCKET_NOT_CONNECTED;
596
[email protected]b9b651f2013-11-09 04:32:22597 crypto::OpenSSLErrStackTracer err_tracer(FROM_HERE);
598
599 int rv = SSL_export_keying_material(
[email protected]c8a80e92014-05-17 16:02:08600 ssl_, out, outlen, label.data(), label.size(),
davidben866c3d4a72015-04-06 21:56:43601 reinterpret_cast<const unsigned char*>(context.data()), context.length(),
602 has_context ? 1 : 0);
[email protected]b9b651f2013-11-09 04:32:22603
604 if (rv != 1) {
605 int ssl_error = SSL_get_error(ssl_, rv);
606 LOG(ERROR) << "Failed to export keying material;"
svaldeze83af292016-04-26 14:33:37607 << " returned " << rv << ", SSL error code " << ssl_error;
[email protected]b9b651f2013-11-09 04:32:22608 return MapOpenSSLError(ssl_error, err_tracer);
609 }
610 return OK;
611}
612
svaldeze83af292016-04-26 14:33:37613int SSLClientSocketImpl::Connect(const CompletionCallback& callback) {
svaldez4af14d22015-08-20 13:48:24614 // Although StreamSocket does allow calling Connect() after Disconnect(),
615 // this has never worked for layered sockets. CHECK to detect any consumers
616 // reconnecting an SSL socket.
617 //
618 // TODO(davidben,mmenke): Remove this API feature. See
619 // https://crbug.com/499289.
620 CHECK(!disconnected_);
621
[email protected]b9b651f2013-11-09 04:32:22622 net_log_.BeginEvent(NetLog::TYPE_SSL_CONNECT);
623
624 // Set up new ssl object.
[email protected]c8a80e92014-05-17 16:02:08625 int rv = Init();
626 if (rv != OK) {
davidben281d13f02016-04-27 20:43:28627 LogConnectEndEvent(rv);
[email protected]c8a80e92014-05-17 16:02:08628 return rv;
[email protected]b9b651f2013-11-09 04:32:22629 }
630
631 // Set SSL to client mode. Handshake happens in the loop below.
632 SSL_set_connect_state(ssl_);
633
rsleeviadbd4982016-06-13 22:10:27634 next_handshake_state_ = STATE_HANDSHAKE;
[email protected]c8a80e92014-05-17 16:02:08635 rv = DoHandshakeLoop(OK);
[email protected]b9b651f2013-11-09 04:32:22636 if (rv == ERR_IO_PENDING) {
637 user_connect_callback_ = callback;
638 } else {
davidben281d13f02016-04-27 20:43:28639 LogConnectEndEvent(rv);
[email protected]b9b651f2013-11-09 04:32:22640 }
641
642 return rv > OK ? OK : rv;
643}
644
svaldeze83af292016-04-26 14:33:37645void SSLClientSocketImpl::Disconnect() {
davidbened3764bb2016-03-14 19:53:16646 crypto::OpenSSLErrStackTracer tracer(FROM_HERE);
647
[email protected]b9b651f2013-11-09 04:32:22648 if (ssl_) {
649 // Calling SSL_shutdown prevents the session from being marked as
650 // unresumable.
651 SSL_shutdown(ssl_);
652 SSL_free(ssl_);
653 ssl_ = NULL;
654 }
655 if (transport_bio_) {
656 BIO_free_all(transport_bio_);
657 transport_bio_ = NULL;
658 }
659
svaldez4af14d22015-08-20 13:48:24660 disconnected_ = true;
661
[email protected]b9b651f2013-11-09 04:32:22662 // Shut down anything that may call us back.
eroman7f9236a2015-05-11 21:23:43663 cert_verifier_request_.reset();
[email protected]b9b651f2013-11-09 04:32:22664 transport_->socket()->Disconnect();
665
666 // Null all callbacks, delete all buffers.
667 transport_send_busy_ = false;
668 send_buffer_ = NULL;
669 transport_recv_busy_ = false;
[email protected]b9b651f2013-11-09 04:32:22670 recv_buffer_ = NULL;
671
672 user_connect_callback_.Reset();
673 user_read_callback_.Reset();
674 user_write_callback_.Reset();
svaldeze83af292016-04-26 14:33:37675 user_read_buf_ = NULL;
676 user_read_buf_len_ = 0;
677 user_write_buf_ = NULL;
678 user_write_buf_len_ = 0;
[email protected]b9b651f2013-11-09 04:32:22679
davidben1d489522015-07-01 18:48:46680 pending_read_error_ = kNoPendingResult;
davidbenb8c23212014-10-28 00:12:16681 pending_read_ssl_error_ = SSL_ERROR_NONE;
682 pending_read_error_info_ = OpenSSLErrorInfo();
683
[email protected]5aea79182014-07-14 20:43:41684 transport_read_error_ = OK;
[email protected]3e5c6922014-02-06 02:42:16685 transport_write_error_ = OK;
686
[email protected]b9b651f2013-11-09 04:32:22687 server_cert_verify_result_.Reset();
[email protected]64b5c892014-08-08 09:39:26688 completed_connect_ = false;
[email protected]b9b651f2013-11-09 04:32:22689
690 cert_authorities_.clear();
[email protected]c0787702014-05-20 21:51:44691 cert_key_types_.clear();
[email protected]faff9852014-06-21 06:13:46692
davidben09c3d072014-08-25 20:33:58693 start_cert_verification_time_ = base::TimeTicks();
694
[email protected]abc44b752014-07-30 03:52:15695 npn_status_ = kNextProtoUnsupported;
bnc3cf2a592016-08-11 14:48:36696 negotiated_protocol_ = kProtoUnknown;
[email protected]abc44b752014-07-30 03:52:15697
davidben52053b382015-04-27 19:22:29698 channel_id_sent_ = false;
nharper736ceda2015-11-07 00:16:59699 tb_was_negotiated_ = false;
davidbenc269cc4b2016-07-27 14:55:03700 pending_session_ = nullptr;
davidbenf2eaaf92015-05-15 22:18:42701 certificate_verified_ = false;
nharper75ade892015-06-10 19:05:35702 channel_id_request_.Cancel();
davidben1d489522015-07-01 18:48:46703
davidben1d489522015-07-01 18:48:46704 signature_result_ = kNoPendingResult;
705 signature_.clear();
[email protected]b9b651f2013-11-09 04:32:22706}
707
svaldeze83af292016-04-26 14:33:37708bool SSLClientSocketImpl::IsConnected() const {
[email protected]b9b651f2013-11-09 04:32:22709 // If the handshake has not yet completed.
[email protected]64b5c892014-08-08 09:39:26710 if (!completed_connect_)
[email protected]b9b651f2013-11-09 04:32:22711 return false;
712 // If an asynchronous operation is still pending.
713 if (user_read_buf_.get() || user_write_buf_.get())
714 return true;
715
716 return transport_->socket()->IsConnected();
717}
718
svaldeze83af292016-04-26 14:33:37719bool SSLClientSocketImpl::IsConnectedAndIdle() const {
[email protected]b9b651f2013-11-09 04:32:22720 // If the handshake has not yet completed.
[email protected]64b5c892014-08-08 09:39:26721 if (!completed_connect_)
[email protected]b9b651f2013-11-09 04:32:22722 return false;
723 // If an asynchronous operation is still pending.
724 if (user_read_buf_.get() || user_write_buf_.get())
725 return false;
davidbenfc9a6b82015-04-15 23:47:32726
727 // If there is data read from the network that has not yet been consumed, do
728 // not treat the connection as idle.
729 //
730 // Note that this does not check |BIO_pending|, whether there is ciphertext
731 // that has not yet been flushed to the network. |Write| returns early, so
732 // this can cause race conditions which cause a socket to not be treated
733 // reusable when it should be. See https://crbug.com/466147.
734 if (BIO_wpending(transport_bio_) > 0)
[email protected]b9b651f2013-11-09 04:32:22735 return false;
[email protected]b9b651f2013-11-09 04:32:22736
737 return transport_->socket()->IsConnectedAndIdle();
738}
739
svaldeze83af292016-04-26 14:33:37740int SSLClientSocketImpl::GetPeerAddress(IPEndPoint* addressList) const {
[email protected]b9b651f2013-11-09 04:32:22741 return transport_->socket()->GetPeerAddress(addressList);
742}
743
svaldeze83af292016-04-26 14:33:37744int SSLClientSocketImpl::GetLocalAddress(IPEndPoint* addressList) const {
[email protected]b9b651f2013-11-09 04:32:22745 return transport_->socket()->GetLocalAddress(addressList);
746}
747
svaldeze83af292016-04-26 14:33:37748const BoundNetLog& SSLClientSocketImpl::NetLog() const {
[email protected]b9b651f2013-11-09 04:32:22749 return net_log_;
750}
751
svaldeze83af292016-04-26 14:33:37752void SSLClientSocketImpl::SetSubresourceSpeculation() {
[email protected]b9b651f2013-11-09 04:32:22753 if (transport_.get() && transport_->socket()) {
754 transport_->socket()->SetSubresourceSpeculation();
755 } else {
756 NOTREACHED();
757 }
758}
759
svaldeze83af292016-04-26 14:33:37760void SSLClientSocketImpl::SetOmniboxSpeculation() {
[email protected]b9b651f2013-11-09 04:32:22761 if (transport_.get() && transport_->socket()) {
762 transport_->socket()->SetOmniboxSpeculation();
763 } else {
764 NOTREACHED();
765 }
766}
767
svaldeze83af292016-04-26 14:33:37768bool SSLClientSocketImpl::WasEverUsed() const {
[email protected]0dc88b32014-03-26 20:12:28769 return was_ever_used_;
[email protected]b9b651f2013-11-09 04:32:22770}
771
bnc3cf2a592016-08-11 14:48:36772bool SSLClientSocketImpl::WasNpnNegotiated() const {
773 return negotiated_protocol_ != kProtoUnknown;
774}
775
776NextProto SSLClientSocketImpl::GetNegotiatedProtocol() const {
777 return negotiated_protocol_;
778}
779
svaldeze83af292016-04-26 14:33:37780bool SSLClientSocketImpl::GetSSLInfo(SSLInfo* ssl_info) {
[email protected]b9b651f2013-11-09 04:32:22781 ssl_info->Reset();
davidben30798ed82014-09-19 19:28:20782 if (server_cert_chain_->empty())
[email protected]b9b651f2013-11-09 04:32:22783 return false;
784
785 ssl_info->cert = server_cert_verify_result_.verified_cert;
estark03d644f2015-06-13 00:11:32786 ssl_info->unverified_cert = server_cert_;
[email protected]b9b651f2013-11-09 04:32:22787 ssl_info->cert_status = server_cert_verify_result_.cert_status;
788 ssl_info->is_issued_by_known_root =
789 server_cert_verify_result_.is_issued_by_known_root;
dadriandf302c42016-06-10 18:48:59790 ssl_info->pkp_bypassed = pkp_bypassed_;
svaldeze83af292016-04-26 14:33:37791 ssl_info->public_key_hashes = server_cert_verify_result_.public_key_hashes;
[email protected]b9b651f2013-11-09 04:32:22792 ssl_info->client_cert_sent =
793 ssl_config_.send_client_cert && ssl_config_.client_cert.get();
davidben52053b382015-04-27 19:22:29794 ssl_info->channel_id_sent = channel_id_sent_;
nharper736ceda2015-11-07 00:16:59795 ssl_info->token_binding_negotiated = tb_was_negotiated_;
796 ssl_info->token_binding_key_param = tb_negotiated_param_;
[email protected]8bd4e7a2014-08-09 14:49:17797 ssl_info->pinning_failure_log = pinning_failure_log_;
dadrian612337a2016-07-20 22:36:58798 ssl_info->ocsp_result = server_cert_verify_result_.ocsp_result;
[email protected]b9b651f2013-11-09 04:32:22799
estark723b5eeb2016-02-18 21:01:12800 AddCTInfoToSSLInfo(ssl_info);
davidbeneb5f8ef32014-09-04 14:14:32801
[email protected]b9b651f2013-11-09 04:32:22802 const SSL_CIPHER* cipher = SSL_get_current_cipher(ssl_);
803 CHECK(cipher);
804 ssl_info->security_bits = SSL_CIPHER_get_bits(cipher, NULL);
davidbenc269cc4b2016-07-27 14:55:03805 if (SSL_CIPHER_is_ECDHE(cipher)) {
806 ssl_info->key_exchange_info = SSL_get_curve_id(ssl_);
807 } else if (SSL_CIPHER_is_DHE(cipher)) {
808 ssl_info->key_exchange_info = SSL_get_dhe_group_size(ssl_);
809 }
[email protected]b9b651f2013-11-09 04:32:22810
ryanchung987b2ff2016-02-19 00:17:12811 SSLConnectionStatusSetCipherSuite(
812 static_cast<uint16_t>(SSL_CIPHER_get_id(cipher)),
813 &ssl_info->connection_status);
814 SSLConnectionStatusSetVersion(GetNetSSLVersion(ssl_),
815 &ssl_info->connection_status);
[email protected]b9b651f2013-11-09 04:32:22816
davidben09c3d072014-08-25 20:33:58817 if (!SSL_get_secure_renegotiation_support(ssl_))
[email protected]b9b651f2013-11-09 04:32:22818 ssl_info->connection_status |= SSL_CONNECTION_NO_RENEGOTIATION_EXTENSION;
[email protected]b9b651f2013-11-09 04:32:22819
820 if (ssl_config_.version_fallback)
821 ssl_info->connection_status |= SSL_CONNECTION_VERSION_FALLBACK;
822
svaldeze83af292016-04-26 14:33:37823 ssl_info->handshake_type = SSL_session_reused(ssl_)
824 ? SSLInfo::HANDSHAKE_RESUME
825 : SSLInfo::HANDSHAKE_FULL;
[email protected]b9b651f2013-11-09 04:32:22826
[email protected]b9b651f2013-11-09 04:32:22827 return true;
828}
829
svaldeze83af292016-04-26 14:33:37830void SSLClientSocketImpl::GetConnectionAttempts(ConnectionAttempts* out) const {
ttuttle23fdb7b2015-05-15 01:28:03831 out->clear();
832}
833
svaldeze83af292016-04-26 14:33:37834int64_t SSLClientSocketImpl::GetTotalReceivedBytes() const {
tbansalf82cc8e2015-10-14 20:05:49835 return transport_->socket()->GetTotalReceivedBytes();
836}
837
svaldeze83af292016-04-26 14:33:37838int SSLClientSocketImpl::Read(IOBuffer* buf,
839 int buf_len,
840 const CompletionCallback& callback) {
[email protected]b9b651f2013-11-09 04:32:22841 user_read_buf_ = buf;
842 user_read_buf_len_ = buf_len;
843
davidben1b133ad2014-10-23 04:23:13844 int rv = DoReadLoop();
[email protected]b9b651f2013-11-09 04:32:22845
846 if (rv == ERR_IO_PENDING) {
847 user_read_callback_ = callback;
848 } else {
[email protected]0dc88b32014-03-26 20:12:28849 if (rv > 0)
850 was_ever_used_ = true;
[email protected]b9b651f2013-11-09 04:32:22851 user_read_buf_ = NULL;
852 user_read_buf_len_ = 0;
853 }
854
855 return rv;
856}
857
svaldeze83af292016-04-26 14:33:37858int SSLClientSocketImpl::Write(IOBuffer* buf,
859 int buf_len,
860 const CompletionCallback& callback) {
[email protected]b9b651f2013-11-09 04:32:22861 user_write_buf_ = buf;
862 user_write_buf_len_ = buf_len;
863
davidben1b133ad2014-10-23 04:23:13864 int rv = DoWriteLoop();
[email protected]b9b651f2013-11-09 04:32:22865
866 if (rv == ERR_IO_PENDING) {
867 user_write_callback_ = callback;
868 } else {
[email protected]0dc88b32014-03-26 20:12:28869 if (rv > 0)
870 was_ever_used_ = true;
[email protected]b9b651f2013-11-09 04:32:22871 user_write_buf_ = NULL;
872 user_write_buf_len_ = 0;
873 }
874
875 return rv;
876}
877
svaldeze83af292016-04-26 14:33:37878int SSLClientSocketImpl::SetReceiveBufferSize(int32_t size) {
[email protected]b9b651f2013-11-09 04:32:22879 return transport_->socket()->SetReceiveBufferSize(size);
880}
881
svaldeze83af292016-04-26 14:33:37882int SSLClientSocketImpl::SetSendBufferSize(int32_t size) {
[email protected]b9b651f2013-11-09 04:32:22883 return transport_->socket()->SetSendBufferSize(size);
884}
885
svaldeze83af292016-04-26 14:33:37886int SSLClientSocketImpl::Init() {
[email protected]9e733f32010-10-04 18:19:08887 DCHECK(!ssl_);
888 DCHECK(!transport_bio_);
889
svaldez2135be52016-04-20 16:34:53890#if defined(USE_NSS_CERTS)
davidbena477a70a2015-10-06 04:38:29891 if (ssl_config_.cert_io_enabled) {
892 // TODO(davidben): Move this out of SSLClientSocket. See
893 // https://crbug.com/539520.
894 EnsureNSSHttpIOInit();
895 }
896#endif
897
[email protected]b29af7d2010-12-14 11:52:47898 SSLContext* context = SSLContext::GetInstance();
[email protected]4b559b4d2011-04-14 17:37:14899 crypto::OpenSSLErrStackTracer err_tracer(FROM_HERE);
[email protected]d518cd92010-09-29 12:27:44900
[email protected]fbef13932010-11-23 12:38:53901 ssl_ = SSL_new(context->ssl_ctx());
902 if (!ssl_ || !context->SetClientSocketForSSL(ssl_, this))
[email protected]c8a80e92014-05-17 16:02:08903 return ERR_UNEXPECTED;
[email protected]fbef13932010-11-23 12:38:53904
davidben9bc0466f2015-06-16 22:21:27905 // SNI should only contain valid DNS hostnames, not IP addresses (see RFC
906 // 6066, Section 3).
907 //
908 // TODO(rsleevi): Should this code allow hostnames that violate the LDH rule?
909 // See https://crbug.com/496472 and https://crbug.com/496468 for discussion.
martijna2e83bd2016-03-18 13:10:45910 IPAddress unused;
911 if (!unused.AssignFromIPLiteral(host_and_port_.host()) &&
davidben9bc0466f2015-06-16 22:21:27912 !SSL_set_tlsext_host_name(ssl_, host_and_port_.host().c_str())) {
[email protected]c8a80e92014-05-17 16:02:08913 return ERR_UNEXPECTED;
davidben9bc0466f2015-06-16 22:21:27914 }
[email protected]fbef13932010-11-23 12:38:53915
davidbenf4c9a6122015-10-20 02:45:29916 ScopedSSL_SESSION session =
917 context->session_cache()->Lookup(GetSessionCacheKey());
918 if (session)
919 SSL_set_session(ssl_, session.get());
[email protected]d518cd92010-09-29 12:27:44920
mmenke1beda3d2016-07-22 03:33:45921 // Get read and write buffer sizes from field trials, if possible. If values
922 // not present, use default. Also make sure values are in reasonable range.
923 int send_buffer_size = kDefaultOpenSSLBufferSize;
924#if !defined(OS_NACL)
925 int override_send_buffer_size;
926 if (base::StringToInt(base::FieldTrialList::FindFullName("SSLBufferSizeSend"),
927 &override_send_buffer_size)) {
928 send_buffer_size = override_send_buffer_size;
929 send_buffer_size = std::max(send_buffer_size, 1000);
930 send_buffer_size =
931 std::min(send_buffer_size, 2 * kDefaultOpenSSLBufferSize);
932 }
933#endif // !defined(OS_NACL)
haavardm2d92e722014-12-19 13:45:44934 send_buffer_ = new GrowableIOBuffer();
mmenke1beda3d2016-07-22 03:33:45935 send_buffer_->SetCapacity(send_buffer_size);
936
937 int recv_buffer_size = kDefaultOpenSSLBufferSize;
938#if !defined(OS_NACL)
939 int override_recv_buffer_size;
940 if (base::StringToInt(base::FieldTrialList::FindFullName("SSLBufferSizeRecv"),
941 &override_recv_buffer_size)) {
942 recv_buffer_size = override_recv_buffer_size;
943 recv_buffer_size = std::max(recv_buffer_size, 1000);
944 recv_buffer_size =
945 std::min(recv_buffer_size, 2 * kDefaultOpenSSLBufferSize);
946 }
947#endif // !defined(OS_NACL)
haavardm2d92e722014-12-19 13:45:44948 recv_buffer_ = new GrowableIOBuffer();
mmenke1beda3d2016-07-22 03:33:45949 recv_buffer_->SetCapacity(recv_buffer_size);
haavardm2d92e722014-12-19 13:45:44950
[email protected]d518cd92010-09-29 12:27:44951 BIO* ssl_bio = NULL;
haavardm2d92e722014-12-19 13:45:44952
svaldeze83af292016-04-26 14:33:37953 // SSLClientSocketImpl retains ownership of the BIO buffers.
haavardm2d92e722014-12-19 13:45:44954 if (!BIO_new_bio_pair_external_buf(
955 &ssl_bio, send_buffer_->capacity(),
956 reinterpret_cast<uint8_t*>(send_buffer_->data()), &transport_bio_,
957 recv_buffer_->capacity(),
958 reinterpret_cast<uint8_t*>(recv_buffer_->data())))
[email protected]c8a80e92014-05-17 16:02:08959 return ERR_UNEXPECTED;
[email protected]d518cd92010-09-29 12:27:44960 DCHECK(ssl_bio);
961 DCHECK(transport_bio_);
962
[email protected]5aea79182014-07-14 20:43:41963 // Install a callback on OpenSSL's end to plumb transport errors through.
svaldeze83af292016-04-26 14:33:37964 BIO_set_callback(ssl_bio, &SSLClientSocketImpl::BIOCallback);
[email protected]5aea79182014-07-14 20:43:41965 BIO_set_callback_arg(ssl_bio, reinterpret_cast<char*>(this));
966
[email protected]d518cd92010-09-29 12:27:44967 SSL_set_bio(ssl_, ssl_bio, ssl_bio);
968
davidbenb937d6c2015-05-14 04:53:42969 DCHECK_LT(SSL3_VERSION, ssl_config_.version_min);
970 DCHECK_LT(SSL3_VERSION, ssl_config_.version_max);
971 SSL_set_min_version(ssl_, ssl_config_.version_min);
972 SSL_set_max_version(ssl_, ssl_config_.version_max);
973
[email protected]9e733f32010-10-04 18:19:08974 // OpenSSL defaults some options to on, others to off. To avoid ambiguity,
975 // set everything we care about to an absolute value.
[email protected]fb10e2282010-12-01 17:08:48976 SslSetClearMask options;
[email protected]d0f00492012-08-03 22:35:13977 options.ConfigureFlag(SSL_OP_NO_COMPRESSION, true);
[email protected]9e733f32010-10-04 18:19:08978
979 // TODO(joth): Set this conditionally, see http://crbug.com/55410
[email protected]fb10e2282010-12-01 17:08:48980 options.ConfigureFlag(SSL_OP_LEGACY_SERVER_CONNECT, true);
[email protected]9e733f32010-10-04 18:19:08981
[email protected]fb10e2282010-12-01 17:08:48982 SSL_set_options(ssl_, options.set_mask);
983 SSL_clear_options(ssl_, options.clear_mask);
[email protected]9e733f32010-10-04 18:19:08984
[email protected]fb10e2282010-12-01 17:08:48985 // Same as above, this time for the SSL mode.
986 SslSetClearMask mode;
[email protected]9e733f32010-10-04 18:19:08987
[email protected]fb10e2282010-12-01 17:08:48988 mode.ConfigureFlag(SSL_MODE_RELEASE_BUFFERS, true);
ishermane5c05e12014-09-09 20:32:15989 mode.ConfigureFlag(SSL_MODE_CBC_RECORD_SPLITTING, true);
[email protected]fb10e2282010-12-01 17:08:48990
davidben818d93b2015-02-19 22:27:32991 mode.ConfigureFlag(SSL_MODE_ENABLE_FALSE_START,
[email protected]b788de02014-04-23 18:06:07992 ssl_config_.false_start_enabled);
993
davidben6b8131c2015-02-25 23:30:14994 mode.ConfigureFlag(SSL_MODE_SEND_FALLBACK_SCSV, ssl_config_.version_fallback);
995
[email protected]fb10e2282010-12-01 17:08:48996 SSL_set_mode(ssl_, mode.set_mask);
997 SSL_clear_mode(ssl_, mode.clear_mask);
[email protected]109805a2010-12-07 18:17:06998
davidbenb3c2d972016-03-11 22:36:17999 // Use BoringSSL defaults, but disable HMAC-SHA256 and HMAC-SHA384 ciphers
1000 // (note that SHA256 and SHA384 only select legacy CBC ciphers). Also disable
1001 // DHE_RSA_WITH_AES_256_GCM_SHA384. Historically, AES_256_GCM was not
1002 // supported. As DHE is being deprecated, don't add a cipher only to remove it
1003 // immediately.
petewilec5f5df222016-06-29 17:21:341004 std::string command;
mabe0d8c582016-08-12 02:06:401005 if (SSLClientSocket::IsPostQuantumExperimentEnabled()) {
petewilec5f5df222016-06-29 17:21:341006 // These are experimental, non-standard ciphersuites. They are part of an
1007 // experiment in post-quantum cryptography. They're not intended to
1008 // represent a de-facto standard, and will be removed from BoringSSL in
1009 // ~2018.
1010 if (EVP_has_aes_hardware()) {
1011 command.append(
1012 "CECPQ1-RSA-AES256-GCM-SHA384:"
1013 "CECPQ1-ECDSA-AES256-GCM-SHA384:");
1014 }
1015 command.append(
1016 "CECPQ1-RSA-CHACHA20-POLY1305-SHA256:"
1017 "CECPQ1-ECDSA-CHACHA20-POLY1305-SHA256:");
1018 if (!EVP_has_aes_hardware()) {
1019 command.append(
1020 "CECPQ1-RSA-AES256-GCM-SHA384:"
1021 "CECPQ1-ECDSA-AES256-GCM-SHA384:");
1022 }
1023 }
petewilec5f5df222016-06-29 17:21:341024 command.append("ALL:!SHA256:!SHA384:!DHE-RSA-AES256-GCM-SHA384:!aPSK:!RC4");
davidben9b4a9b9c2015-10-12 18:46:511025
1026 if (ssl_config_.require_ecdhe)
1027 command.append(":!kRSA:!kDHE");
davidben8ecc3072014-09-03 23:19:091028
davidben68dcc582016-01-12 22:09:361029 if (!ssl_config_.deprecated_cipher_suites_enabled) {
davidben01d8e332015-11-20 17:08:581030 // Only offer DHE on the second handshake. https://crbug.com/538690
1031 command.append(":!kDHE");
davidben91585692015-09-28 23:46:081032 }
davidbena4c9d062015-04-03 22:34:251033
davidben9b4a9b9c2015-10-12 18:46:511034 // Remove any disabled ciphers.
1035 for (uint16_t id : ssl_config_.disabled_cipher_suites) {
1036 const SSL_CIPHER* cipher = SSL_get_cipher_by_value(id);
1037 if (cipher) {
1038 command.append(":!");
1039 command.append(SSL_CIPHER_get_name(cipher));
1040 }
1041 }
1042
[email protected]109805a2010-12-07 18:17:061043 int rv = SSL_set_cipher_list(ssl_, command.c_str());
1044 // If this fails (rv = 0) it means there are no ciphers enabled on this SSL.
1045 // This will almost certainly result in the socket failing to complete the
1046 // handshake at which point the appropriate error is bubbled up to the client.
1047 LOG_IF(WARNING, rv != 1) << "SSL_set_cipher_list('" << command << "') "
svaldeze83af292016-04-26 14:33:371048 "returned "
1049 << rv;
[email protected]ee0f2aa82013-10-25 11:59:261050
1051 // TLS channel ids.
bnc3cf2a592016-08-11 14:48:361052 if (IsChannelIDEnabled()) {
[email protected]ee0f2aa82013-10-25 11:59:261053 SSL_enable_tls_channel_id(ssl_);
1054 }
1055
bnc1f295372015-10-21 23:24:221056 if (!ssl_config_.alpn_protos.empty()) {
bnc988e68d2016-06-27 14:03:211057 std::vector<uint8_t> wire_protos =
1058 SerializeNextProtos(ssl_config_.alpn_protos);
[email protected]abc44b752014-07-30 03:52:151059 SSL_set_alpn_protos(ssl_, wire_protos.empty() ? NULL : &wire_protos[0],
1060 wire_protos.size());
1061 }
1062
bnc2d6bd0f2015-10-28 01:52:051063 if (ssl_config_.npn_protos.empty())
1064 SSL_set_options(ssl_, SSL_OP_DISABLE_NPN);
1065
davidbeneb5f8ef32014-09-04 14:14:321066 if (ssl_config_.signed_cert_timestamps_enabled) {
1067 SSL_enable_signed_cert_timestamps(ssl_);
1068 SSL_enable_ocsp_stapling(ssl_);
1069 }
1070
davidben15f57132015-04-27 18:08:361071 if (cert_verifier_->SupportsOCSPStapling())
davidbend1fb2f12014-11-08 02:51:001072 SSL_enable_ocsp_stapling(ssl_);
davidbeneb5f8ef32014-09-04 14:14:321073
[email protected]c8a80e92014-05-17 16:02:081074 return OK;
[email protected]d518cd92010-09-29 12:27:441075}
1076
svaldeze83af292016-04-26 14:33:371077void SSLClientSocketImpl::DoReadCallback(int rv) {
[email protected]b9b651f2013-11-09 04:32:221078 // Since Run may result in Read being called, clear |user_read_callback_|
1079 // up front.
[email protected]0dc88b32014-03-26 20:12:281080 if (rv > 0)
1081 was_ever_used_ = true;
[email protected]b9b651f2013-11-09 04:32:221082 user_read_buf_ = NULL;
1083 user_read_buf_len_ = 0;
1084 base::ResetAndReturn(&user_read_callback_).Run(rv);
1085}
1086
svaldeze83af292016-04-26 14:33:371087void SSLClientSocketImpl::DoWriteCallback(int rv) {
[email protected]b9b651f2013-11-09 04:32:221088 // Since Run may result in Write being called, clear |user_write_callback_|
1089 // up front.
[email protected]0dc88b32014-03-26 20:12:281090 if (rv > 0)
1091 was_ever_used_ = true;
[email protected]b9b651f2013-11-09 04:32:221092 user_write_buf_ = NULL;
1093 user_write_buf_len_ = 0;
1094 base::ResetAndReturn(&user_write_callback_).Run(rv);
1095}
1096
svaldeze83af292016-04-26 14:33:371097bool SSLClientSocketImpl::DoTransportIO() {
[email protected]b9b651f2013-11-09 04:32:221098 bool network_moved = false;
1099 int rv;
1100 // Read and write as much data as possible. The loop is necessary because
1101 // Write() may return synchronously.
1102 do {
1103 rv = BufferSend();
1104 if (rv != ERR_IO_PENDING && rv != 0)
1105 network_moved = true;
1106 } while (rv > 0);
[email protected]5aea79182014-07-14 20:43:411107 if (transport_read_error_ == OK && BufferRecv() != ERR_IO_PENDING)
[email protected]b9b651f2013-11-09 04:32:221108 network_moved = true;
1109 return network_moved;
1110}
1111
pkasting379234c2015-04-08 04:42:121112// TODO(cbentzel): Remove including "base/threading/thread_local.h" and
vadimt6b43dec22015-01-06 01:59:581113// g_first_run_completed once crbug.com/424386 is fixed.
1114base::LazyInstance<base::ThreadLocalBoolean>::Leaky g_first_run_completed =
1115 LAZY_INSTANCE_INITIALIZER;
1116
svaldeze83af292016-04-26 14:33:371117int SSLClientSocketImpl::DoHandshake() {
[email protected]b9b651f2013-11-09 04:32:221118 crypto::OpenSSLErrStackTracer err_tracer(FROM_HERE);
vadimt5a243282014-12-24 00:26:161119
1120 int rv;
1121
pkasting379234c2015-04-08 04:42:121122 // TODO(cbentzel): Leave only 1 call to SSL_do_handshake once crbug.com/424386
vadimt5a243282014-12-24 00:26:161123 // is fixed.
1124 if (ssl_config_.send_client_cert && ssl_config_.client_cert.get()) {
vadimt5a243282014-12-24 00:26:161125 rv = SSL_do_handshake(ssl_);
1126 } else {
vadimt6b43dec22015-01-06 01:59:581127 if (g_first_run_completed.Get().Get()) {
pkasting379234c2015-04-08 04:42:121128 // TODO(cbentzel): Remove ScopedTracker below once crbug.com/424386 is
vadimt6b43dec22015-01-06 01:59:581129 // fixed.
pkasting379234c2015-04-08 04:42:121130 tracked_objects::ScopedTracker tracking_profile(
1131 FROM_HERE_WITH_EXPLICIT_FUNCTION("424386 SSL_do_handshake()"));
vadimt5a243282014-12-24 00:26:161132
vadimt6b43dec22015-01-06 01:59:581133 rv = SSL_do_handshake(ssl_);
1134 } else {
1135 g_first_run_completed.Get().Set(true);
vadimt6b43dec22015-01-06 01:59:581136 rv = SSL_do_handshake(ssl_);
1137 }
vadimt5a243282014-12-24 00:26:161138 }
[email protected]b9b651f2013-11-09 04:32:221139
davidbenc4212c02015-05-12 22:30:181140 int net_error = OK;
1141 if (rv <= 0) {
[email protected]b9b651f2013-11-09 04:32:221142 int ssl_error = SSL_get_error(ssl_, rv);
[email protected]b9b651f2013-11-09 04:32:221143 if (ssl_error == SSL_ERROR_WANT_CHANNEL_ID_LOOKUP) {
[email protected]faff9852014-06-21 06:13:461144 // The server supports channel ID. Stop to look one up before returning to
1145 // the handshake.
rsleeviadbd4982016-06-13 22:10:271146 next_handshake_state_ = STATE_CHANNEL_ID_LOOKUP;
[email protected]faff9852014-06-21 06:13:461147 return OK;
[email protected]b9b651f2013-11-09 04:32:221148 }
davidbenced4aa9b2015-05-12 21:22:351149 if (ssl_error == SSL_ERROR_WANT_X509_LOOKUP &&
1150 !ssl_config_.send_client_cert) {
1151 return ERR_SSL_CLIENT_AUTH_CERT_NEEDED;
1152 }
davidben1d489522015-07-01 18:48:461153 if (ssl_error == SSL_ERROR_WANT_PRIVATE_KEY_OPERATION) {
svaldez7872fd02015-11-19 21:10:541154 DCHECK(ssl_config_.client_private_key);
davidben1d489522015-07-01 18:48:461155 DCHECK_NE(kNoPendingResult, signature_result_);
rsleeviadbd4982016-06-13 22:10:271156 next_handshake_state_ = STATE_HANDSHAKE;
davidben1d489522015-07-01 18:48:461157 return ERR_IO_PENDING;
1158 }
[email protected]b9b651f2013-11-09 04:32:221159
davidbena4409c62014-08-27 17:05:511160 OpenSSLErrorInfo error_info;
1161 net_error = MapOpenSSLErrorWithDetails(ssl_error, err_tracer, &error_info);
[email protected]b9b651f2013-11-09 04:32:221162 if (net_error == ERR_IO_PENDING) {
davidbenc4212c02015-05-12 22:30:181163 // If not done, stay in this state
rsleeviadbd4982016-06-13 22:10:271164 next_handshake_state_ = STATE_HANDSHAKE;
davidbenc4212c02015-05-12 22:30:181165 return ERR_IO_PENDING;
1166 }
1167
1168 LOG(ERROR) << "handshake failed; returned " << rv << ", SSL error code "
1169 << ssl_error << ", net_error " << net_error;
1170 net_log_.AddEvent(
1171 NetLog::TYPE_SSL_HANDSHAKE_ERROR,
1172 CreateNetLogOpenSSLErrorCallback(net_error, ssl_error, error_info));
1173 }
1174
rsleeviadbd4982016-06-13 22:10:271175 next_handshake_state_ = STATE_HANDSHAKE_COMPLETE;
davidbenc4212c02015-05-12 22:30:181176 return net_error;
1177}
1178
svaldeze83af292016-04-26 14:33:371179int SSLClientSocketImpl::DoHandshakeComplete(int result) {
davidbenc4212c02015-05-12 22:30:181180 if (result < 0)
1181 return result;
1182
1183 if (ssl_config_.version_fallback &&
1184 ssl_config_.version_max < ssl_config_.version_fallback_min) {
1185 return ERR_SSL_FALLBACK_BEYOND_MINIMUM_VERSION;
1186 }
1187
davidbenb4c25b62016-06-24 02:39:271188 // DHE is offered on the deprecated cipher fallback and then rejected
1189 // afterwards. This is to aid in diagnosing connection failures because a
1190 // server requires DHE ciphers.
1191 //
1192 // TODO(davidben): A few releases after DHE's removal, remove this logic.
1193 if (!ssl_config_.dhe_enabled &&
1194 SSL_CIPHER_is_DHE(SSL_get_current_cipher(ssl_))) {
1195 return ERR_SSL_OBSOLETE_CIPHER;
1196 }
1197
nharper736ceda2015-11-07 00:16:591198 // Check that if token binding was negotiated, then extended master secret
1199 // must also be negotiated.
1200 if (tb_was_negotiated_ && !SSL_get_extms_support(ssl_))
1201 return ERR_SSL_PROTOCOL_ERROR;
1202
davidbenc4212c02015-05-12 22:30:181203 // SSL handshake is completed. If NPN wasn't negotiated, see if ALPN was.
1204 if (npn_status_ == kNextProtoUnsupported) {
1205 const uint8_t* alpn_proto = NULL;
1206 unsigned alpn_len = 0;
1207 SSL_get0_alpn_selected(ssl_, &alpn_proto, &alpn_len);
1208 if (alpn_len > 0) {
bnc3cf2a592016-08-11 14:48:361209 base::StringPiece proto(reinterpret_cast<const char*>(alpn_proto),
1210 alpn_len);
1211 negotiated_protocol_ = NextProtoFromString(proto);
davidbenc4212c02015-05-12 22:30:181212 npn_status_ = kNextProtoNegotiated;
bnc3cf2a592016-08-11 14:48:361213 negotiation_extension_ = kExtensionALPN;
[email protected]b9b651f2013-11-09 04:32:221214 }
1215 }
davidbenc4212c02015-05-12 22:30:181216
1217 RecordNegotiationExtension();
bnc3cf2a592016-08-11 14:48:361218 RecordChannelIDSupport();
davidbenc4212c02015-05-12 22:30:181219
dadriand476e652016-07-26 21:33:241220 const uint8_t* ocsp_response_raw;
1221 size_t ocsp_response_len;
1222 SSL_get0_ocsp_response(ssl_, &ocsp_response_raw, &ocsp_response_len);
1223 std::string ocsp_response;
1224 if (ocsp_response_len > 0) {
1225 ocsp_response_.assign(reinterpret_cast<const char*>(ocsp_response_raw),
1226 ocsp_response_len);
davidbenc4212c02015-05-12 22:30:181227 }
dadriand476e652016-07-26 21:33:241228 set_stapled_ocsp_response_received(ocsp_response_len != 0);
1229 UMA_HISTOGRAM_BOOLEAN("Net.OCSPResponseStapled", ocsp_response_len != 0);
davidbenc4212c02015-05-12 22:30:181230
1231 const uint8_t* sct_list;
1232 size_t sct_list_len;
1233 SSL_get0_signed_cert_timestamp_list(ssl_, &sct_list, &sct_list_len);
1234 set_signed_cert_timestamps_received(sct_list_len != 0);
1235
1236 if (IsRenegotiationAllowed())
davidben0635886ab2015-11-04 19:24:041237 SSL_set_renegotiate_mode(ssl_, ssl_renegotiate_freely);
davidbenc4212c02015-05-12 22:30:181238
davidben0653c8d2016-07-08 02:16:171239 uint16_t signature_algorithm = SSL_get_peer_signature_algorithm(ssl_);
1240 if (signature_algorithm != 0) {
1241 UMA_HISTOGRAM_SPARSE_SLOWLY("Net.SSLSignatureAlgorithm",
1242 signature_algorithm);
davidben4fe4f982015-11-11 22:00:121243 }
1244
davidbenc4212c02015-05-12 22:30:181245 // Verify the certificate.
1246 UpdateServerCert();
rsleeviadbd4982016-06-13 22:10:271247 next_handshake_state_ = STATE_VERIFY_CERT;
davidbenc4212c02015-05-12 22:30:181248 return OK;
[email protected]b9b651f2013-11-09 04:32:221249}
1250
svaldeze83af292016-04-26 14:33:371251int SSLClientSocketImpl::DoChannelIDLookup() {
nharper49b27d992016-02-09 18:28:511252 NetLog::ParametersCallback callback = base::Bind(
1253 &NetLogChannelIDLookupCallback, base::Unretained(channel_id_service_));
1254 net_log_.BeginEvent(NetLog::TYPE_SSL_GET_CHANNEL_ID, callback);
rsleeviadbd4982016-06-13 22:10:271255 next_handshake_state_ = STATE_CHANNEL_ID_LOOKUP_COMPLETE;
[email protected]6b8a3c742014-07-25 00:25:351256 return channel_id_service_->GetOrCreateChannelID(
nharper2e171cf2015-06-01 20:29:231257 host_and_port_.host(), &channel_id_key_,
svaldeze83af292016-04-26 14:33:371258 base::Bind(&SSLClientSocketImpl::OnHandshakeIOComplete,
[email protected]faff9852014-06-21 06:13:461259 base::Unretained(this)),
nharper75ade892015-06-10 19:05:351260 &channel_id_request_);
[email protected]faff9852014-06-21 06:13:461261}
1262
svaldeze83af292016-04-26 14:33:371263int SSLClientSocketImpl::DoChannelIDLookupComplete(int result) {
nharper49b27d992016-02-09 18:28:511264 net_log_.EndEvent(NetLog::TYPE_SSL_GET_CHANNEL_ID,
1265 base::Bind(&NetLogChannelIDLookupCompleteCallback,
1266 channel_id_key_.get(), result));
[email protected]faff9852014-06-21 06:13:461267 if (result < 0)
1268 return result;
1269
[email protected]faff9852014-06-21 06:13:461270 // Hand the key to OpenSSL. Check for error in case OpenSSL rejects the key
1271 // type.
davidben8a208fc2016-01-22 17:08:081272 DCHECK(channel_id_key_);
[email protected]faff9852014-06-21 06:13:461273 crypto::OpenSSLErrStackTracer err_tracer(FROM_HERE);
nharper2e171cf2015-06-01 20:29:231274 int rv = SSL_set1_tls_channel_id(ssl_, channel_id_key_->key());
[email protected]faff9852014-06-21 06:13:461275 if (!rv) {
1276 LOG(ERROR) << "Failed to set Channel ID.";
1277 int err = SSL_get_error(ssl_, rv);
1278 return MapOpenSSLError(err, err_tracer);
1279 }
1280
1281 // Return to the handshake.
davidben52053b382015-04-27 19:22:291282 channel_id_sent_ = true;
rsleeviadbd4982016-06-13 22:10:271283 next_handshake_state_ = STATE_HANDSHAKE;
[email protected]faff9852014-06-21 06:13:461284 return OK;
1285}
1286
svaldeze83af292016-04-26 14:33:371287int SSLClientSocketImpl::DoVerifyCert(int result) {
davidben30798ed82014-09-19 19:28:201288 DCHECK(!server_cert_chain_->empty());
davidben09c3d072014-08-25 20:33:581289 DCHECK(start_cert_verification_time_.is_null());
davidben30798ed82014-09-19 19:28:201290
rsleeviadbd4982016-06-13 22:10:271291 next_handshake_state_ = STATE_VERIFY_CERT_COMPLETE;
[email protected]b9b651f2013-11-09 04:32:221292
davidbenc6435a72015-08-17 18:28:521293 // OpenSSL decoded the certificate, but the platform certificate
1294 // implementation could not. This is treated as a fatal SSL-level protocol
1295 // error rather than a certificate error. See https://crbug.com/91341.
1296 if (!server_cert_.get())
1297 return ERR_SSL_SERVER_CERT_BAD_FORMAT;
1298
davidben30798ed82014-09-19 19:28:201299 // If the certificate is bad and has been previously accepted, use
1300 // the previous status and bypass the error.
1301 base::StringPiece der_cert;
1302 if (!x509_util::GetDER(server_cert_chain_->Get(0), &der_cert)) {
1303 NOTREACHED();
1304 return ERR_CERT_INVALID;
1305 }
[email protected]b9b651f2013-11-09 04:32:221306 CertStatus cert_status;
davidben30798ed82014-09-19 19:28:201307 if (ssl_config_.IsAllowedBadCert(der_cert, &cert_status)) {
[email protected]b9b651f2013-11-09 04:32:221308 server_cert_verify_result_.Reset();
1309 server_cert_verify_result_.cert_status = cert_status;
1310 server_cert_verify_result_.verified_cert = server_cert_;
1311 return OK;
1312 }
1313
davidben09c3d072014-08-25 20:33:581314 start_cert_verification_time_ = base::TimeTicks::Now();
1315
eroman7f9236a2015-05-11 21:23:431316 return cert_verifier_->Verify(
rsleevi06bd78552016-06-08 22:34:461317 CertVerifier::RequestParams(server_cert_, host_and_port_.host(),
1318 ssl_config_.GetCertVerifyFlags(),
dadriand476e652016-07-26 21:33:241319 ocsp_response_, CertificateList()),
[email protected]591cffcd2014-08-18 20:02:301320 // TODO(davidben): Route the CRLSet through SSLConfig so
1321 // SSLClientSocket doesn't depend on SSLConfigService.
davidben15f57132015-04-27 18:08:361322 SSLConfigService::GetCRLSet().get(), &server_cert_verify_result_,
svaldeze83af292016-04-26 14:33:371323 base::Bind(&SSLClientSocketImpl::OnHandshakeIOComplete,
[email protected]b9b651f2013-11-09 04:32:221324 base::Unretained(this)),
eroman7f9236a2015-05-11 21:23:431325 &cert_verifier_request_, net_log_);
[email protected]b9b651f2013-11-09 04:32:221326}
1327
svaldeze83af292016-04-26 14:33:371328int SSLClientSocketImpl::DoVerifyCertComplete(int result) {
eroman7f9236a2015-05-11 21:23:431329 cert_verifier_request_.reset();
[email protected]b9b651f2013-11-09 04:32:221330
davidben09c3d072014-08-25 20:33:581331 if (!start_cert_verification_time_.is_null()) {
1332 base::TimeDelta verify_time =
1333 base::TimeTicks::Now() - start_cert_verification_time_;
1334 if (result == OK) {
1335 UMA_HISTOGRAM_TIMES("Net.SSLCertVerificationTime", verify_time);
1336 } else {
1337 UMA_HISTOGRAM_TIMES("Net.SSLCertVerificationTimeError", verify_time);
1338 }
1339 }
1340
rsleevi4a6ca8c2016-06-24 03:05:221341 // If the connection was good, check HPKP and CT status simultaneously,
1342 // but prefer to treat the HPKP error as more serious, if there was one.
[email protected]8bd4e7a2014-08-09 14:49:171343 const CertStatus cert_status = server_cert_verify_result_.cert_status;
rsleevi4a6ca8c2016-06-24 03:05:221344 if ((result == OK ||
dadrian8f8946652016-06-21 23:48:311345 (IsCertificateError(result) && IsCertStatusMinorError(cert_status)))) {
rsleevi4a6ca8c2016-06-24 03:05:221346 int ct_result = VerifyCT();
dadrian8f8946652016-06-21 23:48:311347 TransportSecurityState::PKPStatus pin_validity =
1348 transport_security_state_->CheckPublicKeyPins(
1349 host_and_port_, server_cert_verify_result_.is_issued_by_known_root,
1350 server_cert_verify_result_.public_key_hashes, server_cert_.get(),
1351 server_cert_verify_result_.verified_cert.get(),
1352 TransportSecurityState::ENABLE_PIN_REPORTS, &pinning_failure_log_);
1353 switch (pin_validity) {
1354 case TransportSecurityState::PKPStatus::VIOLATED:
1355 server_cert_verify_result_.cert_status |=
1356 CERT_STATUS_PINNED_KEY_MISSING;
1357 result = ERR_SSL_PINNED_KEY_NOT_IN_CERT_CHAIN;
1358 break;
1359 case TransportSecurityState::PKPStatus::BYPASSED:
1360 pkp_bypassed_ = true;
1361 // Fall through.
1362 case TransportSecurityState::PKPStatus::OK:
1363 // Do nothing.
1364 break;
rsleevi9545d342016-06-21 03:17:371365 }
rsleevi4a6ca8c2016-06-24 03:05:221366 if (result != ERR_SSL_PINNED_KEY_NOT_IN_CERT_CHAIN && ct_result != OK)
1367 result = ct_result;
[email protected]8bd4e7a2014-08-09 14:49:171368 }
1369
[email protected]b9b651f2013-11-09 04:32:221370 if (result == OK) {
davidbendafe4e52015-04-08 22:53:521371 DCHECK(!certificate_verified_);
1372 certificate_verified_ = true;
1373 MaybeCacheSession();
dadriand476e652016-07-26 21:33:241374 SSLInfo ssl_info;
1375 bool ok = GetSSLInfo(&ssl_info);
1376 DCHECK(ok);
1377 transport_security_state_->CheckExpectStaple(host_and_port_, ssl_info,
1378 ocsp_response_);
[email protected]b9b651f2013-11-09 04:32:221379 }
1380
[email protected]64b5c892014-08-08 09:39:261381 completed_connect_ = true;
[email protected]b9b651f2013-11-09 04:32:221382 // Exit DoHandshakeLoop and return the result to the caller to Connect.
1383 DCHECK_EQ(STATE_NONE, next_handshake_state_);
1384 return result;
1385}
1386
svaldeze83af292016-04-26 14:33:371387void SSLClientSocketImpl::DoConnectCallback(int rv) {
[email protected]b9b651f2013-11-09 04:32:221388 if (!user_connect_callback_.is_null()) {
1389 CompletionCallback c = user_connect_callback_;
1390 user_connect_callback_.Reset();
1391 c.Run(rv > OK ? OK : rv);
1392 }
1393}
1394
svaldeze83af292016-04-26 14:33:371395void SSLClientSocketImpl::UpdateServerCert() {
[email protected]76e85392014-03-20 17:54:141396 server_cert_chain_->Reset(SSL_get_peer_cert_chain(ssl_));
[email protected]7f38da8a2014-03-17 16:44:261397 server_cert_ = server_cert_chain_->AsOSChain();
davidben30798ed82014-09-19 19:28:201398 if (server_cert_.get()) {
svaldeze83af292016-04-26 14:33:371399 net_log_.AddEvent(NetLog::TYPE_SSL_CERTIFICATES_RECEIVED,
1400 base::Bind(&NetLogX509CertificateCallback,
1401 base::Unretained(server_cert_.get())));
davidben30798ed82014-09-19 19:28:201402 }
[email protected]b9b651f2013-11-09 04:32:221403}
1404
svaldeze83af292016-04-26 14:33:371405void SSLClientSocketImpl::OnHandshakeIOComplete(int result) {
[email protected]b9b651f2013-11-09 04:32:221406 int rv = DoHandshakeLoop(result);
1407 if (rv != ERR_IO_PENDING) {
davidben281d13f02016-04-27 20:43:281408 LogConnectEndEvent(rv);
[email protected]b9b651f2013-11-09 04:32:221409 DoConnectCallback(rv);
1410 }
1411}
1412
svaldeze83af292016-04-26 14:33:371413void SSLClientSocketImpl::OnSendComplete(int result) {
[email protected]b9b651f2013-11-09 04:32:221414 if (next_handshake_state_ == STATE_HANDSHAKE) {
1415 // In handshake phase.
1416 OnHandshakeIOComplete(result);
1417 return;
1418 }
1419
davidben1d489522015-07-01 18:48:461420 // During a renegotiation, a Read call may also be blocked on a transport
1421 // write, so retry both operations.
1422 PumpReadWriteEvents();
[email protected]b9b651f2013-11-09 04:32:221423}
1424
svaldeze83af292016-04-26 14:33:371425void SSLClientSocketImpl::OnRecvComplete(int result) {
1426 TRACE_EVENT0("net", "SSLClientSocketImpl::OnRecvComplete");
[email protected]b9b651f2013-11-09 04:32:221427 if (next_handshake_state_ == STATE_HANDSHAKE) {
1428 // In handshake phase.
1429 OnHandshakeIOComplete(result);
1430 return;
1431 }
1432
1433 // Network layer received some data, check if client requested to read
1434 // decrypted data.
1435 if (!user_read_buf_.get())
1436 return;
1437
davidben1b133ad2014-10-23 04:23:131438 int rv = DoReadLoop();
[email protected]b9b651f2013-11-09 04:32:221439 if (rv != ERR_IO_PENDING)
1440 DoReadCallback(rv);
1441}
1442
svaldeze83af292016-04-26 14:33:371443int SSLClientSocketImpl::DoHandshakeLoop(int last_io_result) {
1444 TRACE_EVENT0("net", "SSLClientSocketImpl::DoHandshakeLoop");
[email protected]b9b651f2013-11-09 04:32:221445 int rv = last_io_result;
1446 do {
1447 // Default to STATE_NONE for next state.
1448 // (This is a quirk carried over from the windows
1449 // implementation. It makes reading the logs a bit harder.)
1450 // State handlers can and often do call GotoState just
1451 // to stay in the current state.
1452 State state = next_handshake_state_;
rsleeviadbd4982016-06-13 22:10:271453 next_handshake_state_ = STATE_NONE;
[email protected]b9b651f2013-11-09 04:32:221454 switch (state) {
1455 case STATE_HANDSHAKE:
1456 rv = DoHandshake();
1457 break;
davidbenc4212c02015-05-12 22:30:181458 case STATE_HANDSHAKE_COMPLETE:
1459 rv = DoHandshakeComplete(rv);
1460 break;
[email protected]faff9852014-06-21 06:13:461461 case STATE_CHANNEL_ID_LOOKUP:
1462 DCHECK_EQ(OK, rv);
1463 rv = DoChannelIDLookup();
svaldeze83af292016-04-26 14:33:371464 break;
[email protected]faff9852014-06-21 06:13:461465 case STATE_CHANNEL_ID_LOOKUP_COMPLETE:
1466 rv = DoChannelIDLookupComplete(rv);
1467 break;
[email protected]b9b651f2013-11-09 04:32:221468 case STATE_VERIFY_CERT:
[email protected]faff9852014-06-21 06:13:461469 DCHECK_EQ(OK, rv);
[email protected]b9b651f2013-11-09 04:32:221470 rv = DoVerifyCert(rv);
svaldeze83af292016-04-26 14:33:371471 break;
[email protected]b9b651f2013-11-09 04:32:221472 case STATE_VERIFY_CERT_COMPLETE:
1473 rv = DoVerifyCertComplete(rv);
1474 break;
1475 case STATE_NONE:
1476 default:
1477 rv = ERR_UNEXPECTED;
1478 NOTREACHED() << "unexpected state" << state;
1479 break;
1480 }
1481
1482 bool network_moved = DoTransportIO();
1483 if (network_moved && next_handshake_state_ == STATE_HANDSHAKE) {
1484 // In general we exit the loop if rv is ERR_IO_PENDING. In this
1485 // special case we keep looping even if rv is ERR_IO_PENDING because
1486 // the transport IO may allow DoHandshake to make progress.
1487 rv = OK; // This causes us to stay in the loop.
1488 }
1489 } while (rv != ERR_IO_PENDING && next_handshake_state_ != STATE_NONE);
1490 return rv;
1491}
1492
svaldeze83af292016-04-26 14:33:371493int SSLClientSocketImpl::DoReadLoop() {
[email protected]b9b651f2013-11-09 04:32:221494 bool network_moved;
1495 int rv;
1496 do {
1497 rv = DoPayloadRead();
1498 network_moved = DoTransportIO();
1499 } while (rv == ERR_IO_PENDING && network_moved);
1500
1501 return rv;
1502}
1503
svaldeze83af292016-04-26 14:33:371504int SSLClientSocketImpl::DoWriteLoop() {
[email protected]b9b651f2013-11-09 04:32:221505 bool network_moved;
1506 int rv;
1507 do {
1508 rv = DoPayloadWrite();
1509 network_moved = DoTransportIO();
1510 } while (rv == ERR_IO_PENDING && network_moved);
1511
1512 return rv;
1513}
1514
svaldeze83af292016-04-26 14:33:371515int SSLClientSocketImpl::DoPayloadRead() {
[email protected]b9b651f2013-11-09 04:32:221516 crypto::OpenSSLErrStackTracer err_tracer(FROM_HERE);
1517
davidben7e555daf2015-03-25 17:03:291518 DCHECK_LT(0, user_read_buf_len_);
1519 DCHECK(user_read_buf_.get());
1520
[email protected]b9b651f2013-11-09 04:32:221521 int rv;
davidben1d489522015-07-01 18:48:461522 if (pending_read_error_ != kNoPendingResult) {
[email protected]b9b651f2013-11-09 04:32:221523 rv = pending_read_error_;
davidben1d489522015-07-01 18:48:461524 pending_read_error_ = kNoPendingResult;
[email protected]b9b651f2013-11-09 04:32:221525 if (rv == 0) {
svaldeze83af292016-04-26 14:33:371526 net_log_.AddByteTransferEvent(NetLog::TYPE_SSL_SOCKET_BYTES_RECEIVED, rv,
1527 user_read_buf_->data());
davidbenb8c23212014-10-28 00:12:161528 } else {
1529 net_log_.AddEvent(
1530 NetLog::TYPE_SSL_READ_ERROR,
1531 CreateNetLogOpenSSLErrorCallback(rv, pending_read_ssl_error_,
1532 pending_read_error_info_));
[email protected]b9b651f2013-11-09 04:32:221533 }
davidbenb8c23212014-10-28 00:12:161534 pending_read_ssl_error_ = SSL_ERROR_NONE;
1535 pending_read_error_info_ = OpenSSLErrorInfo();
[email protected]b9b651f2013-11-09 04:32:221536 return rv;
1537 }
1538
1539 int total_bytes_read = 0;
davidben7e555daf2015-03-25 17:03:291540 int ssl_ret;
[email protected]b9b651f2013-11-09 04:32:221541 do {
davidben7e555daf2015-03-25 17:03:291542 ssl_ret = SSL_read(ssl_, user_read_buf_->data() + total_bytes_read,
1543 user_read_buf_len_ - total_bytes_read);
1544 if (ssl_ret > 0)
1545 total_bytes_read += ssl_ret;
1546 } while (total_bytes_read < user_read_buf_len_ && ssl_ret > 0);
[email protected]b9b651f2013-11-09 04:32:221547
davidben7e555daf2015-03-25 17:03:291548 // Although only the final SSL_read call may have failed, the failure needs to
1549 // processed immediately, while the information still available in OpenSSL's
1550 // error queue.
davidbenced4aa9b2015-05-12 21:22:351551 if (ssl_ret <= 0) {
davidben7e555daf2015-03-25 17:03:291552 // A zero return from SSL_read may mean any of:
1553 // - The underlying BIO_read returned 0.
1554 // - The peer sent a close_notify.
1555 // - Any arbitrary error. https://crbug.com/466303
[email protected]b9b651f2013-11-09 04:32:221556 //
davidben7e555daf2015-03-25 17:03:291557 // TransportReadComplete converts the first to an ERR_CONNECTION_CLOSED
1558 // error, so it does not occur. The second and third are distinguished by
1559 // SSL_ERROR_ZERO_RETURN.
1560 pending_read_ssl_error_ = SSL_get_error(ssl_, ssl_ret);
1561 if (pending_read_ssl_error_ == SSL_ERROR_ZERO_RETURN) {
1562 pending_read_error_ = 0;
davidbenced4aa9b2015-05-12 21:22:351563 } else if (pending_read_ssl_error_ == SSL_ERROR_WANT_X509_LOOKUP &&
1564 !ssl_config_.send_client_cert) {
1565 pending_read_error_ = ERR_SSL_CLIENT_AUTH_CERT_NEEDED;
davidben1d489522015-07-01 18:48:461566 } else if (pending_read_ssl_error_ ==
1567 SSL_ERROR_WANT_PRIVATE_KEY_OPERATION) {
svaldez7872fd02015-11-19 21:10:541568 DCHECK(ssl_config_.client_private_key);
davidben1d489522015-07-01 18:48:461569 DCHECK_NE(kNoPendingResult, signature_result_);
1570 pending_read_error_ = ERR_IO_PENDING;
davidben7e555daf2015-03-25 17:03:291571 } else {
1572 pending_read_error_ = MapOpenSSLErrorWithDetails(
1573 pending_read_ssl_error_, err_tracer, &pending_read_error_info_);
[email protected]b9b651f2013-11-09 04:32:221574 }
1575
davidben7e555daf2015-03-25 17:03:291576 // Many servers do not reliably send a close_notify alert when shutting down
1577 // a connection, and instead terminate the TCP connection. This is reported
1578 // as ERR_CONNECTION_CLOSED. Because of this, map the unclean shutdown to a
1579 // graceful EOF, instead of treating it as an error as it should be.
1580 if (pending_read_error_ == ERR_CONNECTION_CLOSED)
1581 pending_read_error_ = 0;
1582 }
davidbenbe6ce7ec2014-10-20 19:15:561583
davidben7e555daf2015-03-25 17:03:291584 if (total_bytes_read > 0) {
1585 // Return any bytes read to the caller. The error will be deferred to the
1586 // next call of DoPayloadRead.
1587 rv = total_bytes_read;
davidbenbe6ce7ec2014-10-20 19:15:561588
davidben7e555daf2015-03-25 17:03:291589 // Do not treat insufficient data as an error to return in the next call to
1590 // DoPayloadRead() - instead, let the call fall through to check SSL_read()
1591 // again. This is because DoTransportIO() may complete in between the next
1592 // call to DoPayloadRead(), and thus it is important to check SSL_read() on
1593 // subsequent invocations to see if a complete record may now be read.
1594 if (pending_read_error_ == ERR_IO_PENDING)
davidben1d489522015-07-01 18:48:461595 pending_read_error_ = kNoPendingResult;
davidben7e555daf2015-03-25 17:03:291596 } else {
1597 // No bytes were returned. Return the pending read error immediately.
davidben1d489522015-07-01 18:48:461598 DCHECK_NE(kNoPendingResult, pending_read_error_);
davidben7e555daf2015-03-25 17:03:291599 rv = pending_read_error_;
davidben1d489522015-07-01 18:48:461600 pending_read_error_ = kNoPendingResult;
[email protected]b9b651f2013-11-09 04:32:221601 }
1602
1603 if (rv >= 0) {
1604 net_log_.AddByteTransferEvent(NetLog::TYPE_SSL_SOCKET_BYTES_RECEIVED, rv,
1605 user_read_buf_->data());
davidbenb8c23212014-10-28 00:12:161606 } else if (rv != ERR_IO_PENDING) {
1607 net_log_.AddEvent(
1608 NetLog::TYPE_SSL_READ_ERROR,
1609 CreateNetLogOpenSSLErrorCallback(rv, pending_read_ssl_error_,
1610 pending_read_error_info_));
1611 pending_read_ssl_error_ = SSL_ERROR_NONE;
1612 pending_read_error_info_ = OpenSSLErrorInfo();
[email protected]b9b651f2013-11-09 04:32:221613 }
1614 return rv;
1615}
1616
svaldeze83af292016-04-26 14:33:371617int SSLClientSocketImpl::DoPayloadWrite() {
[email protected]b9b651f2013-11-09 04:32:221618 crypto::OpenSSLErrStackTracer err_tracer(FROM_HERE);
1619 int rv = SSL_write(ssl_, user_write_buf_->data(), user_write_buf_len_);
rsleevif020edc2015-03-16 19:31:241620
[email protected]b9b651f2013-11-09 04:32:221621 if (rv >= 0) {
1622 net_log_.AddByteTransferEvent(NetLog::TYPE_SSL_SOCKET_BYTES_SENT, rv,
1623 user_write_buf_->data());
1624 return rv;
1625 }
1626
davidbenb8c23212014-10-28 00:12:161627 int ssl_error = SSL_get_error(ssl_, rv);
davidben1d489522015-07-01 18:48:461628 if (ssl_error == SSL_ERROR_WANT_PRIVATE_KEY_OPERATION)
1629 return ERR_IO_PENDING;
davidbenb8c23212014-10-28 00:12:161630 OpenSSLErrorInfo error_info;
svaldeze83af292016-04-26 14:33:371631 int net_error =
1632 MapOpenSSLErrorWithDetails(ssl_error, err_tracer, &error_info);
davidbenb8c23212014-10-28 00:12:161633
1634 if (net_error != ERR_IO_PENDING) {
1635 net_log_.AddEvent(
1636 NetLog::TYPE_SSL_WRITE_ERROR,
1637 CreateNetLogOpenSSLErrorCallback(net_error, ssl_error, error_info));
1638 }
1639 return net_error;
[email protected]b9b651f2013-11-09 04:32:221640}
1641
svaldeze83af292016-04-26 14:33:371642void SSLClientSocketImpl::PumpReadWriteEvents() {
davidben1d489522015-07-01 18:48:461643 int rv_read = ERR_IO_PENDING;
1644 int rv_write = ERR_IO_PENDING;
1645 bool network_moved;
1646 do {
1647 if (user_read_buf_.get())
1648 rv_read = DoPayloadRead();
1649 if (user_write_buf_.get())
1650 rv_write = DoPayloadWrite();
1651 network_moved = DoTransportIO();
1652 } while (rv_read == ERR_IO_PENDING && rv_write == ERR_IO_PENDING &&
1653 (user_read_buf_.get() || user_write_buf_.get()) && network_moved);
1654
1655 // Performing the Read callback may cause |this| to be deleted. If this
1656 // happens, the Write callback should not be invoked. Guard against this by
1657 // holding a WeakPtr to |this| and ensuring it's still valid.
svaldeze83af292016-04-26 14:33:371658 base::WeakPtr<SSLClientSocketImpl> guard(weak_factory_.GetWeakPtr());
davidben1d489522015-07-01 18:48:461659 if (user_read_buf_.get() && rv_read != ERR_IO_PENDING)
1660 DoReadCallback(rv_read);
1661
1662 if (!guard.get())
1663 return;
1664
1665 if (user_write_buf_.get() && rv_write != ERR_IO_PENDING)
1666 DoWriteCallback(rv_write);
1667}
1668
svaldeze83af292016-04-26 14:33:371669int SSLClientSocketImpl::BufferSend(void) {
[email protected]b9b651f2013-11-09 04:32:221670 if (transport_send_busy_)
1671 return ERR_IO_PENDING;
1672
haavardm2d92e722014-12-19 13:45:441673 size_t buffer_read_offset;
1674 uint8_t* read_buf;
1675 size_t max_read;
1676 int status = BIO_zero_copy_get_read_buf(transport_bio_, &read_buf,
1677 &buffer_read_offset, &max_read);
1678 DCHECK_EQ(status, 1); // Should never fail.
1679 if (!max_read)
1680 return 0; // Nothing pending in the OpenSSL write BIO.
1681 CHECK_EQ(read_buf, reinterpret_cast<uint8_t*>(send_buffer_->StartOfBuffer()));
1682 CHECK_LT(buffer_read_offset, static_cast<size_t>(send_buffer_->capacity()));
1683 send_buffer_->set_offset(buffer_read_offset);
[email protected]b9b651f2013-11-09 04:32:221684
1685 int rv = transport_->socket()->Write(
haavardm2d92e722014-12-19 13:45:441686 send_buffer_.get(), max_read,
svaldeze83af292016-04-26 14:33:371687 base::Bind(&SSLClientSocketImpl::BufferSendComplete,
[email protected]b9b651f2013-11-09 04:32:221688 base::Unretained(this)));
1689 if (rv == ERR_IO_PENDING) {
1690 transport_send_busy_ = true;
1691 } else {
1692 TransportWriteComplete(rv);
1693 }
1694 return rv;
1695}
1696
svaldeze83af292016-04-26 14:33:371697int SSLClientSocketImpl::BufferRecv(void) {
[email protected]b9b651f2013-11-09 04:32:221698 if (transport_recv_busy_)
1699 return ERR_IO_PENDING;
1700
1701 // Determine how much was requested from |transport_bio_| that was not
1702 // actually available.
1703 size_t requested = BIO_ctrl_get_read_request(transport_bio_);
1704 if (requested == 0) {
1705 // This is not a perfect match of error codes, as no operation is
1706 // actually pending. However, returning 0 would be interpreted as
1707 // a possible sign of EOF, which is also an inappropriate match.
1708 return ERR_IO_PENDING;
1709 }
1710
1711 // Known Issue: While only reading |requested| data is the more correct
1712 // implementation, it has the downside of resulting in frequent reads:
1713 // One read for the SSL record header (~5 bytes) and one read for the SSL
1714 // record body. Rather than issuing these reads to the underlying socket
1715 // (and constantly allocating new IOBuffers), a single Read() request to
1716 // fill |transport_bio_| is issued. As long as an SSL client socket cannot
1717 // be gracefully shutdown (via SSL close alerts) and re-used for non-SSL
1718 // traffic, this over-subscribed Read()ing will not cause issues.
haavardm2d92e722014-12-19 13:45:441719
1720 size_t buffer_write_offset;
1721 uint8_t* write_buf;
1722 size_t max_write;
1723 int status = BIO_zero_copy_get_write_buf(transport_bio_, &write_buf,
1724 &buffer_write_offset, &max_write);
1725 DCHECK_EQ(status, 1); // Should never fail.
[email protected]b9b651f2013-11-09 04:32:221726 if (!max_write)
1727 return ERR_IO_PENDING;
1728
haavardm2d92e722014-12-19 13:45:441729 CHECK_EQ(write_buf,
1730 reinterpret_cast<uint8_t*>(recv_buffer_->StartOfBuffer()));
1731 CHECK_LT(buffer_write_offset, static_cast<size_t>(recv_buffer_->capacity()));
1732
1733 recv_buffer_->set_offset(buffer_write_offset);
[email protected]b9b651f2013-11-09 04:32:221734 int rv = transport_->socket()->Read(
svaldeze83af292016-04-26 14:33:371735 recv_buffer_.get(), max_write,
1736 base::Bind(&SSLClientSocketImpl::BufferRecvComplete,
[email protected]b9b651f2013-11-09 04:32:221737 base::Unretained(this)));
1738 if (rv == ERR_IO_PENDING) {
1739 transport_recv_busy_ = true;
1740 } else {
[email protected]3e5c6922014-02-06 02:42:161741 rv = TransportReadComplete(rv);
[email protected]b9b651f2013-11-09 04:32:221742 }
1743 return rv;
1744}
1745
svaldeze83af292016-04-26 14:33:371746void SSLClientSocketImpl::BufferSendComplete(int result) {
[email protected]b9b651f2013-11-09 04:32:221747 TransportWriteComplete(result);
1748 OnSendComplete(result);
1749}
1750
svaldeze83af292016-04-26 14:33:371751void SSLClientSocketImpl::BufferRecvComplete(int result) {
[email protected]3e5c6922014-02-06 02:42:161752 result = TransportReadComplete(result);
[email protected]b9b651f2013-11-09 04:32:221753 OnRecvComplete(result);
1754}
1755
svaldeze83af292016-04-26 14:33:371756void SSLClientSocketImpl::TransportWriteComplete(int result) {
[email protected]b9b651f2013-11-09 04:32:221757 DCHECK(ERR_IO_PENDING != result);
haavardm2d92e722014-12-19 13:45:441758 int bytes_written = 0;
[email protected]b9b651f2013-11-09 04:32:221759 if (result < 0) {
[email protected]5aea79182014-07-14 20:43:411760 // Record the error. Save it to be reported in a future read or write on
1761 // transport_bio_'s peer.
[email protected]3e5c6922014-02-06 02:42:161762 transport_write_error_ = result;
[email protected]b9b651f2013-11-09 04:32:221763 } else {
haavardm2d92e722014-12-19 13:45:441764 bytes_written = result;
[email protected]b9b651f2013-11-09 04:32:221765 }
haavardm2d92e722014-12-19 13:45:441766 DCHECK_GE(send_buffer_->RemainingCapacity(), bytes_written);
1767 int ret = BIO_zero_copy_get_read_buf_done(transport_bio_, bytes_written);
1768 DCHECK_EQ(1, ret);
1769 transport_send_busy_ = false;
[email protected]b9b651f2013-11-09 04:32:221770}
1771
svaldeze83af292016-04-26 14:33:371772int SSLClientSocketImpl::TransportReadComplete(int result) {
[email protected]b9b651f2013-11-09 04:32:221773 DCHECK(ERR_IO_PENDING != result);
[email protected]5aea79182014-07-14 20:43:411774 // If an EOF, canonicalize to ERR_CONNECTION_CLOSED here so MapOpenSSLError
1775 // does not report success.
1776 if (result == 0)
1777 result = ERR_CONNECTION_CLOSED;
haavardm2d92e722014-12-19 13:45:441778 int bytes_read = 0;
[email protected]5aea79182014-07-14 20:43:411779 if (result < 0) {
[email protected]5aea79182014-07-14 20:43:411780 // Received an error. Save it to be reported in a future read on
1781 // transport_bio_'s peer.
1782 transport_read_error_ = result;
[email protected]b9b651f2013-11-09 04:32:221783 } else {
haavardm2d92e722014-12-19 13:45:441784 bytes_read = result;
[email protected]b9b651f2013-11-09 04:32:221785 }
haavardm2d92e722014-12-19 13:45:441786 DCHECK_GE(recv_buffer_->RemainingCapacity(), bytes_read);
1787 int ret = BIO_zero_copy_get_write_buf_done(transport_bio_, bytes_read);
1788 DCHECK_EQ(1, ret);
[email protected]b9b651f2013-11-09 04:32:221789 transport_recv_busy_ = false;
[email protected]3e5c6922014-02-06 02:42:161790 return result;
[email protected]b9b651f2013-11-09 04:32:221791}
1792
rsleevi4a6ca8c2016-06-24 03:05:221793int SSLClientSocketImpl::VerifyCT() {
rsleevi4a6ca8c2016-06-24 03:05:221794 const uint8_t* sct_list_raw;
1795 size_t sct_list_len;
1796 SSL_get0_signed_cert_timestamp_list(ssl_, &sct_list_raw, &sct_list_len);
1797 std::string sct_list;
1798 if (sct_list_len > 0)
1799 sct_list.assign(reinterpret_cast<const char*>(sct_list_raw), sct_list_len);
1800
1801 // Note that this is a completely synchronous operation: The CT Log Verifier
1802 // gets all the data it needs for SCT verification and does not do any
1803 // external communication.
1804 cert_transparency_verifier_->Verify(
dadriand476e652016-07-26 21:33:241805 server_cert_verify_result_.verified_cert.get(), ocsp_response_, sct_list,
rsleevi4a6ca8c2016-06-24 03:05:221806 &ct_verify_result_, net_log_);
1807
1808 ct_verify_result_.ct_policies_applied = true;
1809 ct_verify_result_.ev_policy_compliance =
1810 ct::EVPolicyCompliance::EV_POLICY_DOES_NOT_APPLY;
eranm4bed0b572016-08-14 21:00:351811
1812 SCTList verified_scts =
1813 ct::SCTsMatchingStatus(ct_verify_result_.scts, ct::SCT_STATUS_OK);
1814
rsleevi4a6ca8c2016-06-24 03:05:221815 if (server_cert_verify_result_.cert_status & CERT_STATUS_IS_EV) {
1816 scoped_refptr<ct::EVCertsWhitelist> ev_whitelist =
1817 SSLConfigService::GetEVCertsWhitelist();
1818 ct::EVPolicyCompliance ev_policy_compliance =
1819 policy_enforcer_->DoesConformToCTEVPolicy(
1820 server_cert_verify_result_.verified_cert.get(), ev_whitelist.get(),
eranm4bed0b572016-08-14 21:00:351821 verified_scts, net_log_);
rsleevi4a6ca8c2016-06-24 03:05:221822 ct_verify_result_.ev_policy_compliance = ev_policy_compliance;
1823 if (ev_policy_compliance !=
1824 ct::EVPolicyCompliance::EV_POLICY_DOES_NOT_APPLY &&
1825 ev_policy_compliance !=
1826 ct::EVPolicyCompliance::EV_POLICY_COMPLIES_VIA_WHITELIST &&
1827 ev_policy_compliance !=
1828 ct::EVPolicyCompliance::EV_POLICY_COMPLIES_VIA_SCTS) {
1829 server_cert_verify_result_.cert_status |=
1830 CERT_STATUS_CT_COMPLIANCE_FAILED;
1831 server_cert_verify_result_.cert_status &= ~CERT_STATUS_IS_EV;
1832 }
1833 }
1834 ct_verify_result_.cert_policy_compliance =
1835 policy_enforcer_->DoesConformToCertPolicy(
eranm4bed0b572016-08-14 21:00:351836 server_cert_verify_result_.verified_cert.get(), verified_scts,
1837 net_log_);
rsleevi4a6ca8c2016-06-24 03:05:221838
1839 if (ct_verify_result_.cert_policy_compliance !=
1840 ct::CertPolicyCompliance::CERT_POLICY_COMPLIES_VIA_SCTS &&
1841 transport_security_state_->ShouldRequireCT(
1842 host_and_port_.host(), server_cert_verify_result_.verified_cert.get(),
1843 server_cert_verify_result_.public_key_hashes)) {
1844 server_cert_verify_result_.cert_status |=
1845 CERT_STATUS_CERTIFICATE_TRANSPARENCY_REQUIRED;
1846 return ERR_CERTIFICATE_TRANSPARENCY_REQUIRED;
1847 }
1848
1849 return OK;
1850}
1851
svaldeze83af292016-04-26 14:33:371852int SSLClientSocketImpl::ClientCertRequestCallback(SSL* ssl) {
[email protected]5ac981e182010-12-06 17:56:271853 DCHECK(ssl == ssl_);
[email protected]82c59022014-08-15 09:38:271854
davidbenaf42cbe2014-11-13 03:27:461855 net_log_.AddEvent(NetLog::TYPE_SSL_CLIENT_CERT_REQUESTED);
1856
[email protected]82c59022014-08-15 09:38:271857 // Clear any currently configured certificates.
1858 SSL_certs_clear(ssl_);
[email protected]97a854f2014-07-29 07:51:361859
1860#if defined(OS_IOS)
1861 // TODO(droger): Support client auth on iOS. See http://crbug.com/145954).
1862 LOG(WARNING) << "Client auth is not supported";
svaldeze83af292016-04-26 14:33:371863#else // !defined(OS_IOS)
[email protected]5ac981e182010-12-06 17:56:271864 if (!ssl_config_.send_client_cert) {
[email protected]515adc22013-01-09 16:01:231865 // First pass: we know that a client certificate is needed, but we do not
1866 // have one at hand.
svaldeze83af292016-04-26 14:33:371867 STACK_OF(X509_NAME)* authorities = SSL_get_client_CA_list(ssl);
[email protected]edfd0f42014-07-22 18:20:371868 for (size_t i = 0; i < sk_X509_NAME_num(authorities); i++) {
svaldeze83af292016-04-26 14:33:371869 X509_NAME* ca_name = (X509_NAME*)sk_X509_NAME_value(authorities, i);
[email protected]515adc22013-01-09 16:01:231870 unsigned char* str = NULL;
1871 int length = i2d_X509_NAME(ca_name, &str);
1872 cert_authorities_.push_back(std::string(
svaldeze83af292016-04-26 14:33:371873 reinterpret_cast<const char*>(str), static_cast<size_t>(length)));
[email protected]515adc22013-01-09 16:01:231874 OPENSSL_free(str);
1875 }
1876
[email protected]c0787702014-05-20 21:51:441877 const unsigned char* client_cert_types;
[email protected]e7e883e2014-07-25 06:03:081878 size_t num_client_cert_types =
1879 SSL_get0_certificate_types(ssl, &client_cert_types);
[email protected]c0787702014-05-20 21:51:441880 for (size_t i = 0; i < num_client_cert_types; i++) {
1881 cert_key_types_.push_back(
1882 static_cast<SSLClientCertType>(client_cert_types[i]));
1883 }
1884
davidbenced4aa9b2015-05-12 21:22:351885 // Suspends handshake. SSL_get_error will return SSL_ERROR_WANT_X509_LOOKUP.
1886 return -1;
[email protected]5ac981e182010-12-06 17:56:271887 }
1888
1889 // Second pass: a client certificate should have been selected.
[email protected]13914c92013-06-13 22:42:421890 if (ssl_config_.client_cert.get()) {
[email protected]6bad5052014-07-12 01:25:131891 ScopedX509 leaf_x509 =
1892 OSCertHandleToOpenSSL(ssl_config_.client_cert->os_cert_handle());
1893 if (!leaf_x509) {
1894 LOG(WARNING) << "Failed to import certificate";
1895 OpenSSLPutNetError(FROM_HERE, ERR_SSL_CLIENT_AUTH_CERT_BAD_FORMAT);
1896 return -1;
1897 }
1898
[email protected]82c59022014-08-15 09:38:271899 ScopedX509Stack chain = OSCertHandlesToOpenSSL(
1900 ssl_config_.client_cert->GetIntermediateCertificates());
1901 if (!chain) {
1902 LOG(WARNING) << "Failed to import intermediate certificates";
1903 OpenSSLPutNetError(FROM_HERE, ERR_SSL_CLIENT_AUTH_CERT_BAD_FORMAT);
1904 return -1;
1905 }
1906
davidben1d489522015-07-01 18:48:461907 if (!SSL_use_certificate(ssl_, leaf_x509.get()) ||
1908 !SSL_set1_chain(ssl_, chain.get())) {
1909 LOG(WARNING) << "Failed to set client certificate";
1910 return -1;
1911 }
1912
svaldez7872fd02015-11-19 21:10:541913 if (!ssl_config_.client_private_key) {
1914 // The caller supplied a null private key. Fail the handshake and surface
1915 // an appropriate error to the caller.
davidben1d489522015-07-01 18:48:461916 LOG(WARNING) << "Client cert found without private key";
1917 OpenSSLPutNetError(FROM_HERE, ERR_SSL_CLIENT_AUTH_CERT_NO_PRIVATE_KEY);
1918 return -1;
1919 }
1920
1921 SSL_set_private_key_method(ssl_, &SSLContext::kPrivateKeyMethod);
svaldezf3db006f2015-09-29 16:43:581922
1923 std::vector<SSLPrivateKey::Hash> digest_prefs =
svaldez7872fd02015-11-19 21:10:541924 ssl_config_.client_private_key->GetDigestPreferences();
svaldezf3db006f2015-09-29 16:43:581925
1926 size_t digests_len = digest_prefs.size();
1927 std::vector<int> digests;
1928 for (size_t i = 0; i < digests_len; i++) {
1929 switch (digest_prefs[i]) {
1930 case SSLPrivateKey::Hash::SHA1:
1931 digests.push_back(NID_sha1);
1932 break;
1933 case SSLPrivateKey::Hash::SHA256:
1934 digests.push_back(NID_sha256);
1935 break;
1936 case SSLPrivateKey::Hash::SHA384:
1937 digests.push_back(NID_sha384);
1938 break;
1939 case SSLPrivateKey::Hash::SHA512:
1940 digests.push_back(NID_sha512);
1941 break;
1942 case SSLPrivateKey::Hash::MD5_SHA1:
1943 // MD5-SHA1 is not used in TLS 1.2.
1944 break;
1945 }
1946 }
1947
davidben5f8b6bc2015-11-25 03:19:541948 SSL_set_private_key_digest_prefs(ssl_, digests.data(), digests.size());
davidbenaf42cbe2014-11-13 03:27:461949
1950 int cert_count = 1 + sk_X509_num(chain.get());
1951 net_log_.AddEvent(NetLog::TYPE_SSL_CLIENT_CERT_PROVIDED,
tfarina5e24b242015-10-27 13:11:281952 NetLog::IntCallback("cert_count", cert_count));
[email protected]6bad5052014-07-12 01:25:131953 return 1;
[email protected]c0787702014-05-20 21:51:441954 }
[email protected]97a854f2014-07-29 07:51:361955#endif // defined(OS_IOS)
[email protected]5ac981e182010-12-06 17:56:271956
1957 // Send no client certificate.
davidbenaf42cbe2014-11-13 03:27:461958 net_log_.AddEvent(NetLog::TYPE_SSL_CLIENT_CERT_PROVIDED,
tfarina5e24b242015-10-27 13:11:281959 NetLog::IntCallback("cert_count", 0));
[email protected]82c59022014-08-15 09:38:271960 return 1;
[email protected]5ac981e182010-12-06 17:56:271961}
1962
svaldeze83af292016-04-26 14:33:371963int SSLClientSocketImpl::CertVerifyCallback(X509_STORE_CTX* store_ctx) {
[email protected]64b5c892014-08-08 09:39:261964 if (!completed_connect_) {
[email protected]b051cdb62014-02-28 02:20:161965 // If the first handshake hasn't completed then we accept any certificates
1966 // because we verify after the handshake.
1967 return 1;
1968 }
1969
davidben30798ed82014-09-19 19:28:201970 // Disallow the server certificate to change in a renegotiation.
1971 if (server_cert_chain_->empty()) {
[email protected]76e85392014-03-20 17:54:141972 LOG(ERROR) << "Received invalid certificate chain between handshakes";
davidben30798ed82014-09-19 19:28:201973 return 0;
1974 }
1975 base::StringPiece old_der, new_der;
1976 if (store_ctx->cert == NULL ||
1977 !x509_util::GetDER(server_cert_chain_->Get(0), &old_der) ||
1978 !x509_util::GetDER(store_ctx->cert, &new_der)) {
1979 LOG(ERROR) << "Failed to encode certificates";
1980 return 0;
1981 }
1982 if (old_der != new_der) {
[email protected]76e85392014-03-20 17:54:141983 LOG(ERROR) << "Server certificate changed between handshakes";
davidben30798ed82014-09-19 19:28:201984 return 0;
1985 }
1986
1987 return 1;
[email protected]b051cdb62014-02-28 02:20:161988}
1989
[email protected]ae7c9f42011-11-21 11:41:161990// SelectNextProtoCallback is called by OpenSSL during the handshake. If the
1991// server supports NPN, selects a protocol from the list that the server
thestigc23b8ec42016-01-08 01:41:121992// provides. According to third_party/boringssl/src/ssl/ssl_lib.c, the
[email protected]ae7c9f42011-11-21 11:41:161993// callback can assume that |in| is syntactically valid.
svaldeze83af292016-04-26 14:33:371994int SSLClientSocketImpl::SelectNextProtoCallback(unsigned char** out,
1995 unsigned char* outlen,
1996 const unsigned char* in,
1997 unsigned int inlen) {
bnc1f295372015-10-21 23:24:221998 if (ssl_config_.npn_protos.empty()) {
Avi Drissman13fc8932015-12-20 04:40:461999 *out = reinterpret_cast<uint8_t*>(
[email protected]168a8412012-06-14 05:05:492000 const_cast<char*>(kDefaultSupportedNPNProtocol));
2001 *outlen = arraysize(kDefaultSupportedNPNProtocol) - 1;
2002 npn_status_ = kNextProtoUnsupported;
[email protected]ea4a1c6a2010-12-09 13:33:282003 return SSL_TLSEXT_ERR_OK;
2004 }
2005
[email protected]ae7c9f42011-11-21 11:41:162006 // Assume there's no overlap between our protocols and the server's list.
[email protected]168a8412012-06-14 05:05:492007 npn_status_ = kNextProtoNoOverlap;
[email protected]ae7c9f42011-11-21 11:41:162008
2009 // For each protocol in server preference order, see if we support it.
2010 for (unsigned int i = 0; i < inlen; i += in[i] + 1) {
bnc1f295372015-10-21 23:24:222011 for (NextProto next_proto : ssl_config_.npn_protos) {
bnc0d23cf42014-12-11 14:09:462012 const std::string proto = NextProtoToString(next_proto);
2013 if (in[i] == proto.size() &&
2014 memcmp(&in[i + 1], proto.data(), in[i]) == 0) {
[email protected]168a8412012-06-14 05:05:492015 // We found a match.
bnc3cf2a592016-08-11 14:48:362016 negotiated_protocol_ = next_proto;
[email protected]ae7c9f42011-11-21 11:41:162017 *out = const_cast<unsigned char*>(in) + i + 1;
2018 *outlen = in[i];
[email protected]168a8412012-06-14 05:05:492019 npn_status_ = kNextProtoNegotiated;
[email protected]ae7c9f42011-11-21 11:41:162020 break;
2021 }
2022 }
[email protected]168a8412012-06-14 05:05:492023 if (npn_status_ == kNextProtoNegotiated)
[email protected]ae7c9f42011-11-21 11:41:162024 break;
2025 }
[email protected]ea4a1c6a2010-12-09 13:33:282026
bncde27dae2015-10-06 07:11:022027 // If we didn't find a protocol, we select the last one from our list.
[email protected]168a8412012-06-14 05:05:492028 if (npn_status_ == kNextProtoNoOverlap) {
bnc3cf2a592016-08-11 14:48:362029 negotiated_protocol_ = ssl_config_.npn_protos.back();
bnc67da3de2015-01-15 21:02:262030 // NextProtoToString returns a pointer to a static string.
bnc3cf2a592016-08-11 14:48:362031 const char* proto = NextProtoToString(negotiated_protocol_);
bnc67da3de2015-01-15 21:02:262032 *out = reinterpret_cast<unsigned char*>(const_cast<char*>(proto));
2033 *outlen = strlen(proto);
[email protected]168a8412012-06-14 05:05:492034 }
2035
bnc3cf2a592016-08-11 14:48:362036 negotiation_extension_ = kExtensionNPN;
[email protected]ea4a1c6a2010-12-09 13:33:282037 return SSL_TLSEXT_ERR_OK;
2038}
2039
svaldeze83af292016-04-26 14:33:372040long SSLClientSocketImpl::MaybeReplayTransportError(BIO* bio,
2041 int cmd,
2042 const char* argp,
2043 int argi,
2044 long argl,
2045 long retvalue) {
2046 if (cmd == (BIO_CB_READ | BIO_CB_RETURN) && retvalue <= 0) {
[email protected]5aea79182014-07-14 20:43:412047 // If there is no more data in the buffer, report any pending errors that
2048 // were observed. Note that both the readbuf and the writebuf are checked
2049 // for errors, since the application may have encountered a socket error
2050 // while writing that would otherwise not be reported until the application
2051 // attempted to write again - which it may never do. See
2052 // https://crbug.com/249848.
2053 if (transport_read_error_ != OK) {
2054 OpenSSLPutNetError(FROM_HERE, transport_read_error_);
2055 return -1;
2056 }
2057 if (transport_write_error_ != OK) {
2058 OpenSSLPutNetError(FROM_HERE, transport_write_error_);
2059 return -1;
2060 }
2061 } else if (cmd == BIO_CB_WRITE) {
2062 // Because of the write buffer, this reports a failure from the previous
2063 // write payload. If the current payload fails to write, the error will be
2064 // reported in a future write or read to |bio|.
2065 if (transport_write_error_ != OK) {
2066 OpenSSLPutNetError(FROM_HERE, transport_write_error_);
2067 return -1;
2068 }
2069 }
2070 return retvalue;
2071}
2072
2073// static
svaldeze83af292016-04-26 14:33:372074long SSLClientSocketImpl::BIOCallback(BIO* bio,
2075 int cmd,
2076 const char* argp,
2077 int argi,
2078 long argl,
2079 long retvalue) {
2080 SSLClientSocketImpl* socket =
2081 reinterpret_cast<SSLClientSocketImpl*>(BIO_get_callback_arg(bio));
[email protected]5aea79182014-07-14 20:43:412082 CHECK(socket);
svaldeze83af292016-04-26 14:33:372083 return socket->MaybeReplayTransportError(bio, cmd, argp, argi, argl,
2084 retvalue);
[email protected]5aea79182014-07-14 20:43:412085}
2086
svaldeze83af292016-04-26 14:33:372087void SSLClientSocketImpl::MaybeCacheSession() {
davidben44aeae62015-06-24 20:47:432088 // Only cache the session once both a new session has been established and the
2089 // certificate has been verified. Due to False Start, these events may happen
2090 // in either order.
davidbenc269cc4b2016-07-27 14:55:032091 if (!pending_session_ || !certificate_verified_)
davidbendafe4e52015-04-08 22:53:522092 return;
davidbendafe4e52015-04-08 22:53:522093
2094 SSLContext::GetInstance()->session_cache()->Insert(GetSessionCacheKey(),
davidbenc269cc4b2016-07-27 14:55:032095 pending_session_.get());
2096 pending_session_ = nullptr;
davidbendafe4e52015-04-08 22:53:522097}
2098
svaldeze83af292016-04-26 14:33:372099int SSLClientSocketImpl::NewSessionCallback(SSL_SESSION* session) {
davidbenc269cc4b2016-07-27 14:55:032100 // OpenSSL passes a reference to |session|.
2101 pending_session_.reset(session);
davidbendafe4e52015-04-08 22:53:522102 MaybeCacheSession();
davidben44aeae62015-06-24 20:47:432103 return 1;
davidbendafe4e52015-04-08 22:53:522104}
2105
svaldeze83af292016-04-26 14:33:372106void SSLClientSocketImpl::AddCTInfoToSSLInfo(SSLInfo* ssl_info) const {
estark723b5eeb2016-02-18 21:01:122107 ssl_info->UpdateCertificateTransparencyInfo(ct_verify_result_);
davidbeneb5f8ef32014-09-04 14:14:322108}
2109
svaldeze83af292016-04-26 14:33:372110std::string SSLClientSocketImpl::GetSessionCacheKey() const {
rsleevif020edc2015-03-16 19:31:242111 std::string result = host_and_port_.ToString();
2112 result.append("/");
2113 result.append(ssl_session_cache_shard_);
2114
2115 // Shard the session cache based on maximum protocol version. This causes
2116 // fallback connections to use a separate session cache.
2117 result.append("/");
2118 switch (ssl_config_.version_max) {
rsleevif020edc2015-03-16 19:31:242119 case SSL_PROTOCOL_VERSION_TLS1:
2120 result.append("tls1");
2121 break;
2122 case SSL_PROTOCOL_VERSION_TLS1_1:
2123 result.append("tls1.1");
2124 break;
2125 case SSL_PROTOCOL_VERSION_TLS1_2:
2126 result.append("tls1.2");
2127 break;
svaldezd3fd3ee2016-07-18 16:06:082128 case SSL_PROTOCOL_VERSION_TLS1_3:
2129 result.append("tls1.3");
2130 break;
rsleevif020edc2015-03-16 19:31:242131 default:
2132 NOTREACHED();
2133 }
2134
davidbena4c9d062015-04-03 22:34:252135 result.append("/");
davidben14b1a532015-10-30 16:01:092136 if (ssl_config_.deprecated_cipher_suites_enabled)
davidbena4c9d062015-04-03 22:34:252137 result.append("deprecated");
2138
davidbenee39de02015-10-16 19:53:182139 result.append("/");
2140 if (ssl_config_.channel_id_enabled)
2141 result.append("channelid");
2142
rsleevif020edc2015-03-16 19:31:242143 return result;
2144}
2145
svaldeze83af292016-04-26 14:33:372146bool SSLClientSocketImpl::IsRenegotiationAllowed() const {
nharper736ceda2015-11-07 00:16:592147 if (tb_was_negotiated_)
2148 return false;
2149
davidben421116c2015-05-12 19:56:512150 if (npn_status_ == kNextProtoUnsupported)
2151 return ssl_config_.renego_allowed_default;
2152
davidben421116c2015-05-12 19:56:512153 for (NextProto allowed : ssl_config_.renego_allowed_for_protos) {
bnc3cf2a592016-08-11 14:48:362154 if (negotiated_protocol_ == allowed)
davidben421116c2015-05-12 19:56:512155 return true;
2156 }
2157 return false;
2158}
2159
svaldeze83af292016-04-26 14:33:372160int SSLClientSocketImpl::PrivateKeyTypeCallback() {
svaldez7872fd02015-11-19 21:10:542161 switch (ssl_config_.client_private_key->GetType()) {
davidben1d489522015-07-01 18:48:462162 case SSLPrivateKey::Type::RSA:
2163 return EVP_PKEY_RSA;
2164 case SSLPrivateKey::Type::ECDSA:
2165 return EVP_PKEY_EC;
2166 }
2167 NOTREACHED();
2168 return EVP_PKEY_NONE;
2169}
2170
svaldeze83af292016-04-26 14:33:372171size_t SSLClientSocketImpl::PrivateKeyMaxSignatureLenCallback() {
svaldez7872fd02015-11-19 21:10:542172 return ssl_config_.client_private_key->GetMaxSignatureLengthInBytes();
davidben1d489522015-07-01 18:48:462173}
2174
davidben0bca07fd2016-07-18 15:12:032175ssl_private_key_result_t SSLClientSocketImpl::PrivateKeySignDigestCallback(
davidben1d489522015-07-01 18:48:462176 uint8_t* out,
2177 size_t* out_len,
2178 size_t max_out,
2179 const EVP_MD* md,
2180 const uint8_t* in,
2181 size_t in_len) {
2182 DCHECK_EQ(kNoPendingResult, signature_result_);
2183 DCHECK(signature_.empty());
svaldez7872fd02015-11-19 21:10:542184 DCHECK(ssl_config_.client_private_key);
davidben1d489522015-07-01 18:48:462185
davidben1d489522015-07-01 18:48:462186 SSLPrivateKey::Hash hash;
2187 if (!EVP_MDToPrivateKeyHash(md, &hash)) {
2188 OpenSSLPutNetError(FROM_HERE, ERR_SSL_CLIENT_AUTH_SIGNATURE_FAILED);
2189 return ssl_private_key_failure;
2190 }
2191
davidben752bcf22015-12-21 22:55:502192 net_log_.BeginEvent(
2193 NetLog::TYPE_SSL_PRIVATE_KEY_OPERATION,
2194 base::Bind(&NetLogPrivateKeyOperationCallback,
2195 ssl_config_.client_private_key->GetType(), hash));
2196
davidben1d489522015-07-01 18:48:462197 signature_result_ = ERR_IO_PENDING;
svaldez7872fd02015-11-19 21:10:542198 ssl_config_.client_private_key->SignDigest(
davidben1d489522015-07-01 18:48:462199 hash, base::StringPiece(reinterpret_cast<const char*>(in), in_len),
davidben0bca07fd2016-07-18 15:12:032200 base::Bind(&SSLClientSocketImpl::OnPrivateKeyComplete,
davidben1d489522015-07-01 18:48:462201 weak_factory_.GetWeakPtr()));
2202 return ssl_private_key_retry;
2203}
2204
davidben0bca07fd2016-07-18 15:12:032205ssl_private_key_result_t SSLClientSocketImpl::PrivateKeyCompleteCallback(
davidben1d489522015-07-01 18:48:462206 uint8_t* out,
2207 size_t* out_len,
2208 size_t max_out) {
2209 DCHECK_NE(kNoPendingResult, signature_result_);
svaldez7872fd02015-11-19 21:10:542210 DCHECK(ssl_config_.client_private_key);
davidben1d489522015-07-01 18:48:462211
2212 if (signature_result_ == ERR_IO_PENDING)
2213 return ssl_private_key_retry;
2214 if (signature_result_ != OK) {
2215 OpenSSLPutNetError(FROM_HERE, signature_result_);
2216 return ssl_private_key_failure;
2217 }
2218 if (signature_.size() > max_out) {
2219 OpenSSLPutNetError(FROM_HERE, ERR_SSL_CLIENT_AUTH_SIGNATURE_FAILED);
2220 return ssl_private_key_failure;
2221 }
davidben5f8b6bc2015-11-25 03:19:542222 memcpy(out, signature_.data(), signature_.size());
davidben1d489522015-07-01 18:48:462223 *out_len = signature_.size();
2224 signature_.clear();
2225 return ssl_private_key_success;
2226}
2227
davidben0bca07fd2016-07-18 15:12:032228void SSLClientSocketImpl::OnPrivateKeyComplete(
davidben1d489522015-07-01 18:48:462229 Error error,
2230 const std::vector<uint8_t>& signature) {
2231 DCHECK_EQ(ERR_IO_PENDING, signature_result_);
2232 DCHECK(signature_.empty());
svaldez7872fd02015-11-19 21:10:542233 DCHECK(ssl_config_.client_private_key);
davidben1d489522015-07-01 18:48:462234
2235 net_log_.EndEventWithNetErrorCode(NetLog::TYPE_SSL_PRIVATE_KEY_OPERATION,
2236 error);
2237
2238 signature_result_ = error;
2239 if (signature_result_ == OK)
2240 signature_ = signature;
2241
2242 if (next_handshake_state_ == STATE_HANDSHAKE) {
2243 OnHandshakeIOComplete(signature_result_);
2244 return;
2245 }
2246
2247 // During a renegotiation, either Read or Write calls may be blocked on an
2248 // asynchronous private key operation.
2249 PumpReadWriteEvents();
2250}
2251
svaldeze83af292016-04-26 14:33:372252int SSLClientSocketImpl::TokenBindingAdd(const uint8_t** out,
2253 size_t* out_len,
2254 int* out_alert_value) {
nharper736ceda2015-11-07 00:16:592255 if (ssl_config_.token_binding_params.empty()) {
2256 return 0;
2257 }
davidben7dad2a32016-03-01 23:47:472258 crypto::AutoCBB output;
nharper736ceda2015-11-07 00:16:592259 CBB parameters_list;
2260 if (!CBB_init(output.get(), 7) ||
2261 !CBB_add_u8(output.get(), kTbProtocolVersionMajor) ||
2262 !CBB_add_u8(output.get(), kTbProtocolVersionMinor) ||
2263 !CBB_add_u8_length_prefixed(output.get(), &parameters_list)) {
2264 *out_alert_value = SSL_AD_INTERNAL_ERROR;
2265 return -1;
2266 }
2267 for (size_t i = 0; i < ssl_config_.token_binding_params.size(); ++i) {
2268 if (!CBB_add_u8(&parameters_list, ssl_config_.token_binding_params[i])) {
2269 *out_alert_value = SSL_AD_INTERNAL_ERROR;
2270 return -1;
2271 }
2272 }
2273 // |*out| will be freed by TokenBindingFreeCallback.
2274 if (!CBB_finish(output.get(), const_cast<uint8_t**>(out), out_len)) {
2275 *out_alert_value = SSL_AD_INTERNAL_ERROR;
2276 return -1;
2277 }
2278
2279 return 1;
2280}
2281
svaldeze83af292016-04-26 14:33:372282int SSLClientSocketImpl::TokenBindingParse(const uint8_t* contents,
2283 size_t contents_len,
2284 int* out_alert_value) {
nharper736ceda2015-11-07 00:16:592285 if (completed_connect_) {
2286 // Token Binding may only be negotiated on the initial handshake.
2287 *out_alert_value = SSL_AD_ILLEGAL_PARAMETER;
2288 return 0;
2289 }
2290
2291 CBS extension;
2292 CBS_init(&extension, contents, contents_len);
2293
2294 CBS parameters_list;
2295 uint8_t version_major, version_minor, param;
2296 if (!CBS_get_u8(&extension, &version_major) ||
2297 !CBS_get_u8(&extension, &version_minor) ||
2298 !CBS_get_u8_length_prefixed(&extension, &parameters_list) ||
2299 !CBS_get_u8(&parameters_list, &param) || CBS_len(&parameters_list) > 0 ||
2300 CBS_len(&extension) > 0) {
2301 *out_alert_value = SSL_AD_DECODE_ERROR;
2302 return 0;
2303 }
2304 // The server-negotiated version must be less than or equal to our version.
2305 if (version_major > kTbProtocolVersionMajor ||
2306 (version_minor > kTbProtocolVersionMinor &&
2307 version_major == kTbProtocolVersionMajor)) {
2308 *out_alert_value = SSL_AD_ILLEGAL_PARAMETER;
2309 return 0;
2310 }
2311 // If the version the server negotiated is older than we support, don't fail
2312 // parsing the extension, but also don't set |negotiated_|.
2313 if (version_major < kTbMinProtocolVersionMajor ||
2314 (version_minor < kTbMinProtocolVersionMinor &&
2315 version_major == kTbMinProtocolVersionMajor)) {
2316 return 1;
2317 }
2318
2319 for (size_t i = 0; i < ssl_config_.token_binding_params.size(); ++i) {
2320 if (param == ssl_config_.token_binding_params[i]) {
2321 tb_negotiated_param_ = ssl_config_.token_binding_params[i];
2322 tb_was_negotiated_ = true;
2323 return 1;
2324 }
2325 }
2326
2327 *out_alert_value = SSL_AD_ILLEGAL_PARAMETER;
2328 return 0;
2329}
2330
davidben281d13f02016-04-27 20:43:282331void SSLClientSocketImpl::LogConnectEndEvent(int rv) {
2332 if (rv != OK) {
2333 net_log_.EndEventWithNetErrorCode(NetLog::TYPE_SSL_CONNECT, rv);
2334 return;
2335 }
2336
2337 net_log_.EndEvent(NetLog::TYPE_SSL_CONNECT,
2338 base::Bind(&NetLogSSLInfoCallback, base::Unretained(this)));
2339}
2340
bnc3cf2a592016-08-11 14:48:362341void SSLClientSocketImpl::RecordNegotiationExtension() const {
2342 if (negotiation_extension_ == kExtensionUnknown)
2343 return;
2344 if (npn_status_ == kNextProtoUnsupported)
2345 return;
2346 base::HistogramBase::Sample sample =
2347 static_cast<base::HistogramBase::Sample>(negotiated_protocol_);
2348 // In addition to the protocol negotiated, we want to record which TLS
2349 // extension was used, and in case of NPN, whether there was overlap between
2350 // server and client list of supported protocols.
2351 if (negotiation_extension_ == kExtensionNPN) {
2352 if (npn_status_ == kNextProtoNoOverlap) {
2353 sample += 1000;
2354 } else {
2355 sample += 500;
2356 }
2357 } else {
2358 DCHECK_EQ(kExtensionALPN, negotiation_extension_);
2359 }
2360 UMA_HISTOGRAM_SPARSE_SLOWLY("Net.SSLProtocolNegotiation", sample);
2361}
2362
2363void SSLClientSocketImpl::RecordChannelIDSupport() const {
2364 // Since this enum is used for a histogram, do not change or re-use values.
2365 enum {
2366 DISABLED = 0,
2367 CLIENT_ONLY = 1,
2368 CLIENT_AND_SERVER = 2,
2369 // CLIENT_NO_ECC is unused now.
2370 // CLIENT_BAD_SYSTEM_TIME is unused now.
2371 CLIENT_BAD_SYSTEM_TIME = 4,
2372 CLIENT_NO_CHANNEL_ID_SERVICE = 5,
2373 CHANNEL_ID_USAGE_MAX
2374 } supported = DISABLED;
2375 if (channel_id_sent_) {
2376 supported = CLIENT_AND_SERVER;
2377 } else if (ssl_config_.channel_id_enabled) {
2378 if (!channel_id_service_)
2379 supported = CLIENT_NO_CHANNEL_ID_SERVICE;
2380 else
2381 supported = CLIENT_ONLY;
2382 }
2383 UMA_HISTOGRAM_ENUMERATION("DomainBoundCerts.Support", supported,
2384 CHANNEL_ID_USAGE_MAX);
2385}
2386
2387bool SSLClientSocketImpl::IsChannelIDEnabled() const {
2388 return ssl_config_.channel_id_enabled && channel_id_service_;
2389}
2390
[email protected]7e5dd49f2010-12-08 18:33:492391} // namespace net