blob: 177a1ba91800162b14c2653fe60dcd04f9eea5d2 [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"
[email protected]ee0f2aa82013-10-25 11:59:2633#include "crypto/ec_private_key.h"
[email protected]4b559b4d2011-04-14 17:37:1434#include "crypto/openssl_util.h"
martijna2e83bd2016-03-18 13:10:4535#include "net/base/ip_address.h"
[email protected]d518cd92010-09-29 12:27:4436#include "net/base/net_errors.h"
[email protected]6e7845ae2013-03-29 21:48:1137#include "net/cert/cert_verifier.h"
eranmefbd3132014-10-28 16:35:1638#include "net/cert/ct_ev_whitelist.h"
estark6f9b3d82016-01-12 21:37:0539#include "net/cert/ct_policy_enforcer.h"
estark723b5eeb2016-02-18 21:01:1240#include "net/cert/ct_policy_status.h"
davidbeneb5f8ef32014-09-04 14:14:3241#include "net/cert/ct_verifier.h"
[email protected]6e7845ae2013-03-29 21:48:1142#include "net/cert/x509_certificate_net_log_param.h"
davidben30798ed82014-09-19 19:28:2043#include "net/cert/x509_util_openssl.h"
[email protected]8bd4e7a2014-08-09 14:49:1744#include "net/http/transport_security_state.h"
mikecironef22f9812016-10-04 03:40:1945#include "net/log/net_log.h"
mikecirone8b85c432016-09-08 19:11:0046#include "net/log/net_log_event_type.h"
mikecironef22f9812016-10-04 03:40:1947#include "net/log/net_log_parameters_callback.h"
[email protected]536fd0b2013-03-14 17:41:5748#include "net/ssl/ssl_cert_request_info.h"
davidben281d13f02016-04-27 20:43:2849#include "net/ssl/ssl_cipher_suite_names.h"
svaldeze83af292016-04-26 14:33:3750#include "net/ssl/ssl_client_session_cache.h"
[email protected]536fd0b2013-03-14 17:41:5751#include "net/ssl/ssl_connection_status_flags.h"
52#include "net/ssl/ssl_info.h"
davidben1d489522015-07-01 18:48:4653#include "net/ssl/ssl_private_key.h"
nharperd5cddca2016-02-27 03:37:5254#include "net/ssl/token_binding.h"
[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
haavardm2d92e722014-12-19 13:45:4472// Default size of the internal BoringSSL buffers.
mmenke1beda3d2016-07-22 03:33:4573const int kDefaultOpenSSLBufferSize = 17 * 1024;
haavardm2d92e722014-12-19 13:45:4474
nharper736ceda2015-11-07 00:16:5975// TLS extension number use for Token Binding.
nharperb5ad8a802016-02-05 19:40:0076const unsigned int kTbExtNum = 24;
nharper736ceda2015-11-07 00:16:5977
78// Token Binding ProtocolVersions supported.
79const uint8_t kTbProtocolVersionMajor = 0;
nharper78e6d2b2016-09-21 05:42:3580const uint8_t kTbProtocolVersionMinor = 10;
nharper736ceda2015-11-07 00:16:5981const uint8_t kTbMinProtocolVersionMajor = 0;
nharper78e6d2b2016-09-21 05:42:3582const uint8_t kTbMinProtocolVersionMinor = 10;
nharper736ceda2015-11-07 00:16:5983
davidben1d489522015-07-01 18:48:4684bool EVP_MDToPrivateKeyHash(const EVP_MD* md, SSLPrivateKey::Hash* hash) {
85 switch (EVP_MD_type(md)) {
86 case NID_md5_sha1:
87 *hash = SSLPrivateKey::Hash::MD5_SHA1;
88 return true;
89 case NID_sha1:
90 *hash = SSLPrivateKey::Hash::SHA1;
91 return true;
92 case NID_sha256:
93 *hash = SSLPrivateKey::Hash::SHA256;
94 return true;
95 case NID_sha384:
96 *hash = SSLPrivateKey::Hash::SHA384;
97 return true;
98 case NID_sha512:
99 *hash = SSLPrivateKey::Hash::SHA512;
100 return true;
101 default:
102 return false;
103 }
104}
105
danakj655b66c2016-04-16 00:51:38106std::unique_ptr<base::Value> NetLogPrivateKeyOperationCallback(
davidben752bcf22015-12-21 22:55:50107 SSLPrivateKey::Type type,
108 SSLPrivateKey::Hash hash,
109 NetLogCaptureMode mode) {
110 std::string type_str;
111 switch (type) {
112 case SSLPrivateKey::Type::RSA:
113 type_str = "RSA";
114 break;
115 case SSLPrivateKey::Type::ECDSA:
116 type_str = "ECDSA";
117 break;
118 }
119
120 std::string hash_str;
121 switch (hash) {
122 case SSLPrivateKey::Hash::MD5_SHA1:
123 hash_str = "MD5_SHA1";
124 break;
125 case SSLPrivateKey::Hash::SHA1:
126 hash_str = "SHA1";
127 break;
128 case SSLPrivateKey::Hash::SHA256:
129 hash_str = "SHA256";
130 break;
131 case SSLPrivateKey::Hash::SHA384:
132 hash_str = "SHA384";
133 break;
134 case SSLPrivateKey::Hash::SHA512:
135 hash_str = "SHA512";
136 break;
137 }
138
danakj655b66c2016-04-16 00:51:38139 std::unique_ptr<base::DictionaryValue> value(new base::DictionaryValue);
davidben752bcf22015-12-21 22:55:50140 value->SetString("type", type_str);
141 value->SetString("hash", hash_str);
142 return std::move(value);
143}
144
danakj655b66c2016-04-16 00:51:38145std::unique_ptr<base::Value> NetLogChannelIDLookupCallback(
nharper49b27d992016-02-09 18:28:51146 ChannelIDService* channel_id_service,
147 NetLogCaptureMode capture_mode) {
148 ChannelIDStore* store = channel_id_service->GetChannelIDStore();
danakj655b66c2016-04-16 00:51:38149 std::unique_ptr<base::DictionaryValue> dict(new base::DictionaryValue());
nharper49b27d992016-02-09 18:28:51150 dict->SetBoolean("ephemeral", store->IsEphemeral());
151 dict->SetString("service", base::HexEncode(&channel_id_service,
152 sizeof(channel_id_service)));
153 dict->SetString("store", base::HexEncode(&store, sizeof(store)));
154 return std::move(dict);
155}
156
danakj655b66c2016-04-16 00:51:38157std::unique_ptr<base::Value> NetLogChannelIDLookupCompleteCallback(
nharper49b27d992016-02-09 18:28:51158 crypto::ECPrivateKey* key,
159 int result,
160 NetLogCaptureMode capture_mode) {
danakj655b66c2016-04-16 00:51:38161 std::unique_ptr<base::DictionaryValue> dict(new base::DictionaryValue());
nharper49b27d992016-02-09 18:28:51162 dict->SetInteger("net_error", result);
163 std::string raw_key;
164 if (result == OK && key && key->ExportRawPublicKey(&raw_key)) {
165 std::string key_to_log = "redacted";
166 if (capture_mode.include_cookies_and_credentials()) {
167 key_to_log = base::HexEncode(raw_key.data(), raw_key.length());
168 }
169 dict->SetString("key", key_to_log);
170 }
171 return std::move(dict);
172}
173
davidben281d13f02016-04-27 20:43:28174std::unique_ptr<base::Value> NetLogSSLInfoCallback(
175 SSLClientSocketImpl* socket,
176 NetLogCaptureMode capture_mode) {
177 SSLInfo ssl_info;
178 if (!socket->GetSSLInfo(&ssl_info))
179 return nullptr;
180
181 std::unique_ptr<base::DictionaryValue> dict(new base::DictionaryValue());
182 const char* version_str;
183 SSLVersionToString(&version_str,
184 SSLConnectionStatusToVersion(ssl_info.connection_status));
185 dict->SetString("version", version_str);
186 dict->SetBoolean("is_resumed",
187 ssl_info.handshake_type == SSLInfo::HANDSHAKE_RESUME);
188 dict->SetInteger("cipher_suite", SSLConnectionStatusToCipherSuite(
189 ssl_info.connection_status));
190
bnc3cf2a592016-08-11 14:48:36191 dict->SetString("next_proto", SSLClientSocket::NextProtoToString(
192 socket->GetNegotiatedProtocol()));
davidben281d13f02016-04-27 20:43:28193
194 return std::move(dict);
195}
196
[email protected]821e3bb2013-11-08 01:06:01197} // namespace
198
svaldeze83af292016-04-26 14:33:37199class SSLClientSocketImpl::SSLContext {
[email protected]fbef13932010-11-23 12:38:53200 public:
olli.raula36aa8be2015-09-10 11:14:22201 static SSLContext* GetInstance() {
202 return base::Singleton<SSLContext>::get();
203 }
[email protected]fbef13932010-11-23 12:38:53204 SSL_CTX* ssl_ctx() { return ssl_ctx_.get(); }
svaldeze83af292016-04-26 14:33:37205 SSLClientSessionCache* session_cache() { return &session_cache_; }
[email protected]fbef13932010-11-23 12:38:53206
svaldeze83af292016-04-26 14:33:37207 SSLClientSocketImpl* GetClientSocketFromSSL(const SSL* ssl) {
[email protected]fbef13932010-11-23 12:38:53208 DCHECK(ssl);
svaldeze83af292016-04-26 14:33:37209 SSLClientSocketImpl* socket = static_cast<SSLClientSocketImpl*>(
[email protected]fbef13932010-11-23 12:38:53210 SSL_get_ex_data(ssl, ssl_socket_data_index_));
211 DCHECK(socket);
212 return socket;
213 }
214
svaldeze83af292016-04-26 14:33:37215 bool SetClientSocketForSSL(SSL* ssl, SSLClientSocketImpl* socket) {
[email protected]fbef13932010-11-23 12:38:53216 return SSL_set_ex_data(ssl, ssl_socket_data_index_, socket) != 0;
217 }
218
davidben2a811e4e2015-12-01 10:49:34219#if !defined(OS_NACL)
220 void SetSSLKeyLogFile(
221 const base::FilePath& path,
222 const scoped_refptr<base::SequencedTaskRunner>& task_runner) {
223 DCHECK(!ssl_key_logger_);
224 ssl_key_logger_.reset(new SSLKeyLogger(path, task_runner));
225 SSL_CTX_set_keylog_callback(ssl_ctx_.get(), KeyLogCallback);
226 }
227#endif
228
davidben1d489522015-07-01 18:48:46229 static const SSL_PRIVATE_KEY_METHOD kPrivateKeyMethod;
230
[email protected]fbef13932010-11-23 12:38:53231 private:
olli.raula36aa8be2015-09-10 11:14:22232 friend struct base::DefaultSingletonTraits<SSLContext>;
[email protected]fbef13932010-11-23 12:38:53233
svaldeze83af292016-04-26 14:33:37234 SSLContext() : session_cache_(SSLClientSessionCache::Config()) {
[email protected]4b559b4d2011-04-14 17:37:14235 crypto::EnsureOpenSSLInit();
[email protected]fbef13932010-11-23 12:38:53236 ssl_socket_data_index_ = SSL_get_ex_new_index(0, 0, 0, 0, 0);
237 DCHECK_NE(ssl_socket_data_index_, -1);
238 ssl_ctx_.reset(SSL_CTX_new(SSLv23_client_method()));
[email protected]b051cdb62014-02-28 02:20:16239 SSL_CTX_set_cert_verify_callback(ssl_ctx_.get(), CertVerifyCallback, NULL);
[email protected]82c59022014-08-15 09:38:27240 SSL_CTX_set_cert_cb(ssl_ctx_.get(), ClientCertRequestCallback, NULL);
[email protected]b051cdb62014-02-28 02:20:16241 SSL_CTX_set_verify(ssl_ctx_.get(), SSL_VERIFY_PEER, NULL);
haavardmc80b0ee32015-01-30 09:16:08242 // This stops |SSL_shutdown| from generating the close_notify message, which
243 // is currently not sent on the network.
244 // TODO(haavardm): Remove setting quiet shutdown once 118366 is fixed.
245 SSL_CTX_set_quiet_shutdown(ssl_ctx_.get(), 1);
davidbendafe4e52015-04-08 22:53:52246
247 // Disable the internal session cache. Session caching is handled
svaldeze83af292016-04-26 14:33:37248 // externally (i.e. by SSLClientSessionCache).
davidbendafe4e52015-04-08 22:53:52249 SSL_CTX_set_session_cache_mode(
250 ssl_ctx_.get(), SSL_SESS_CACHE_CLIENT | SSL_SESS_CACHE_NO_INTERNAL);
davidben44aeae62015-06-24 20:47:43251 SSL_CTX_sess_set_new_cb(ssl_ctx_.get(), NewSessionCallback);
nharper736ceda2015-11-07 00:16:59252
davidbenfacfac7b2016-09-27 22:39:53253 SSL_CTX_set_grease_enabled(ssl_ctx_.get(), 1);
254
nharper736ceda2015-11-07 00:16:59255 if (!SSL_CTX_add_client_custom_ext(ssl_ctx_.get(), kTbExtNum,
256 &TokenBindingAddCallback,
257 &TokenBindingFreeCallback, nullptr,
258 &TokenBindingParseCallback, nullptr)) {
259 NOTREACHED();
260 }
261 }
262
263 static int TokenBindingAddCallback(SSL* ssl,
264 unsigned int extension_value,
265 const uint8_t** out,
266 size_t* out_len,
267 int* out_alert_value,
268 void* add_arg) {
269 DCHECK_EQ(extension_value, kTbExtNum);
svaldeze83af292016-04-26 14:33:37270 SSLClientSocketImpl* socket =
271 SSLClientSocketImpl::SSLContext::GetInstance()->GetClientSocketFromSSL(
272 ssl);
nharper736ceda2015-11-07 00:16:59273 return socket->TokenBindingAdd(out, out_len, out_alert_value);
274 }
275
276 static void TokenBindingFreeCallback(SSL* ssl,
277 unsigned extension_value,
278 const uint8_t* out,
279 void* add_arg) {
280 DCHECK_EQ(extension_value, kTbExtNum);
281 OPENSSL_free(const_cast<unsigned char*>(out));
282 }
283
284 static int TokenBindingParseCallback(SSL* ssl,
285 unsigned int extension_value,
286 const uint8_t* contents,
287 size_t contents_len,
288 int* out_alert_value,
289 void* parse_arg) {
290 DCHECK_EQ(extension_value, kTbExtNum);
svaldeze83af292016-04-26 14:33:37291 SSLClientSocketImpl* socket =
292 SSLClientSocketImpl::SSLContext::GetInstance()->GetClientSocketFromSSL(
293 ssl);
nharper736ceda2015-11-07 00:16:59294 return socket->TokenBindingParse(contents, contents_len, out_alert_value);
[email protected]fbef13932010-11-23 12:38:53295 }
296
[email protected]82c59022014-08-15 09:38:27297 static int ClientCertRequestCallback(SSL* ssl, void* arg) {
svaldeze83af292016-04-26 14:33:37298 SSLClientSocketImpl* socket = GetInstance()->GetClientSocketFromSSL(ssl);
[email protected]82c59022014-08-15 09:38:27299 DCHECK(socket);
300 return socket->ClientCertRequestCallback(ssl);
[email protected]718c9672010-12-02 10:04:10301 }
302
svaldeze83af292016-04-26 14:33:37303 static int CertVerifyCallback(X509_STORE_CTX* store_ctx, void* arg) {
[email protected]b051cdb62014-02-28 02:20:16304 SSL* ssl = reinterpret_cast<SSL*>(X509_STORE_CTX_get_ex_data(
305 store_ctx, SSL_get_ex_data_X509_STORE_CTX_idx()));
svaldeze83af292016-04-26 14:33:37306 SSLClientSocketImpl* socket = GetInstance()->GetClientSocketFromSSL(ssl);
[email protected]b051cdb62014-02-28 02:20:16307 CHECK(socket);
308
309 return socket->CertVerifyCallback(store_ctx);
310 }
311
davidben44aeae62015-06-24 20:47:43312 static int NewSessionCallback(SSL* ssl, SSL_SESSION* session) {
svaldeze83af292016-04-26 14:33:37313 SSLClientSocketImpl* socket = GetInstance()->GetClientSocketFromSSL(ssl);
davidben44aeae62015-06-24 20:47:43314 return socket->NewSessionCallback(session);
davidbendafe4e52015-04-08 22:53:52315 }
316
davidben1d489522015-07-01 18:48:46317 static int PrivateKeyTypeCallback(SSL* ssl) {
svaldeze83af292016-04-26 14:33:37318 SSLClientSocketImpl* socket = GetInstance()->GetClientSocketFromSSL(ssl);
davidben1d489522015-07-01 18:48:46319 return socket->PrivateKeyTypeCallback();
320 }
321
davidben1d489522015-07-01 18:48:46322 static size_t PrivateKeyMaxSignatureLenCallback(SSL* ssl) {
svaldeze83af292016-04-26 14:33:37323 SSLClientSocketImpl* socket = GetInstance()->GetClientSocketFromSSL(ssl);
davidben1d489522015-07-01 18:48:46324 return socket->PrivateKeyMaxSignatureLenCallback();
325 }
326
davidben0bca07fd2016-07-18 15:12:03327 static ssl_private_key_result_t PrivateKeySignDigestCallback(
davidben1d489522015-07-01 18:48:46328 SSL* ssl,
329 uint8_t* out,
330 size_t* out_len,
davidben0bca07fd2016-07-18 15:12:03331 size_t max_out,
332 const EVP_MD* md,
333 const uint8_t* in,
334 size_t in_len) {
svaldeze83af292016-04-26 14:33:37335 SSLClientSocketImpl* socket = GetInstance()->GetClientSocketFromSSL(ssl);
davidben0bca07fd2016-07-18 15:12:03336 return socket->PrivateKeySignDigestCallback(out, out_len, max_out, md, in,
337 in_len);
338 }
339
340 static ssl_private_key_result_t PrivateKeyCompleteCallback(SSL* ssl,
341 uint8_t* out,
342 size_t* out_len,
343 size_t max_out) {
344 SSLClientSocketImpl* socket = GetInstance()->GetClientSocketFromSSL(ssl);
345 return socket->PrivateKeyCompleteCallback(out, out_len, max_out);
davidben1d489522015-07-01 18:48:46346 }
347
davidben2a811e4e2015-12-01 10:49:34348#if !defined(OS_NACL)
349 static void KeyLogCallback(const SSL* ssl, const char* line) {
350 GetInstance()->ssl_key_logger_->WriteLine(line);
351 }
352#endif
353
[email protected]fbef13932010-11-23 12:38:53354 // This is the index used with SSL_get_ex_data to retrieve the owner
svaldeze83af292016-04-26 14:33:37355 // SSLClientSocketImpl object from an SSL instance.
[email protected]fbef13932010-11-23 12:38:53356 int ssl_socket_data_index_;
357
davidbend80c12c2016-10-11 00:13:49358 bssl::UniquePtr<SSL_CTX> ssl_ctx_;
davidbendafe4e52015-04-08 22:53:52359
davidben2a811e4e2015-12-01 10:49:34360#if !defined(OS_NACL)
danakj655b66c2016-04-16 00:51:38361 std::unique_ptr<SSLKeyLogger> ssl_key_logger_;
davidben2a811e4e2015-12-01 10:49:34362#endif
363
davidbendafe4e52015-04-08 22:53:52364 // TODO(davidben): Use a separate cache per URLRequestContext.
365 // https://crbug.com/458365
366 //
367 // TODO(davidben): Sessions should be invalidated on fatal
368 // alerts. https://crbug.com/466352
svaldeze83af292016-04-26 14:33:37369 SSLClientSessionCache session_cache_;
[email protected]1279de12013-12-03 15:13:32370};
371
davidben0bca07fd2016-07-18 15:12:03372// TODO(davidben): Switch from sign_digest to sign.
davidben1d489522015-07-01 18:48:46373const SSL_PRIVATE_KEY_METHOD
svaldeze83af292016-04-26 14:33:37374 SSLClientSocketImpl::SSLContext::kPrivateKeyMethod = {
375 &SSLClientSocketImpl::SSLContext::PrivateKeyTypeCallback,
376 &SSLClientSocketImpl::SSLContext::PrivateKeyMaxSignatureLenCallback,
davidben0bca07fd2016-07-18 15:12:03377 nullptr /* sign */,
378 &SSLClientSocketImpl::SSLContext::PrivateKeySignDigestCallback,
379 nullptr /* decrypt */,
380 &SSLClientSocketImpl::SSLContext::PrivateKeyCompleteCallback,
davidben1d489522015-07-01 18:48:46381};
382
[email protected]7f38da8a2014-03-17 16:44:26383// PeerCertificateChain is a helper object which extracts the certificate
384// chain, as given by the server, from an OpenSSL socket and performs the needed
385// resource management. The first element of the chain is the leaf certificate
386// and the other elements are in the order given by the server.
svaldeze83af292016-04-26 14:33:37387class SSLClientSocketImpl::PeerCertificateChain {
[email protected]7f38da8a2014-03-17 16:44:26388 public:
svaldeze83af292016-04-26 14:33:37389 explicit PeerCertificateChain(STACK_OF(X509) * chain) { Reset(chain); }
[email protected]7f38da8a2014-03-17 16:44:26390 PeerCertificateChain(const PeerCertificateChain& other) { *this = other; }
391 ~PeerCertificateChain() {}
392 PeerCertificateChain& operator=(const PeerCertificateChain& other);
393
[email protected]76e85392014-03-20 17:54:14394 // Resets the PeerCertificateChain to the set of certificates in|chain|,
395 // which may be NULL, indicating to empty the store certificates.
396 // Note: If an error occurs, such as being unable to parse the certificates,
397 // this will behave as if Reset(NULL) was called.
svaldeze83af292016-04-26 14:33:37398 void Reset(STACK_OF(X509) * chain);
[email protected]76e85392014-03-20 17:54:14399
svaldez2135be52016-04-20 16:34:53400 // Note that when USE_OPENSSL_CERTS is defined, OSCertHandle is X509*
davidben30798ed82014-09-19 19:28:20401 scoped_refptr<X509Certificate> AsOSChain() const;
[email protected]7f38da8a2014-03-17 16:44:26402
403 size_t size() const {
404 if (!openssl_chain_.get())
405 return 0;
406 return sk_X509_num(openssl_chain_.get());
407 }
408
svaldeze83af292016-04-26 14:33:37409 bool empty() const { return size() == 0; }
davidben30798ed82014-09-19 19:28:20410
411 X509* Get(size_t index) const {
[email protected]7f38da8a2014-03-17 16:44:26412 DCHECK_LT(index, size());
413 return sk_X509_value(openssl_chain_.get(), index);
414 }
415
416 private:
davidbend80c12c2016-10-11 00:13:49417 bssl::UniquePtr<STACK_OF(X509)> openssl_chain_;
[email protected]7f38da8a2014-03-17 16:44:26418};
419
svaldeze83af292016-04-26 14:33:37420SSLClientSocketImpl::PeerCertificateChain&
421SSLClientSocketImpl::PeerCertificateChain::operator=(
[email protected]7f38da8a2014-03-17 16:44:26422 const PeerCertificateChain& other) {
423 if (this == &other)
424 return *this;
425
[email protected]24176af2014-08-14 09:31:04426 openssl_chain_.reset(X509_chain_up_ref(other.openssl_chain_.get()));
[email protected]7f38da8a2014-03-17 16:44:26427 return *this;
428}
429
svaldeze83af292016-04-26 14:33:37430void SSLClientSocketImpl::PeerCertificateChain::Reset(STACK_OF(X509) * chain) {
davidben30798ed82014-09-19 19:28:20431 openssl_chain_.reset(chain ? X509_chain_up_ref(chain) : NULL);
[email protected]7f38da8a2014-03-17 16:44:26432}
[email protected]7f38da8a2014-03-17 16:44:26433
davidben30798ed82014-09-19 19:28:20434scoped_refptr<X509Certificate>
svaldeze83af292016-04-26 14:33:37435SSLClientSocketImpl::PeerCertificateChain::AsOSChain() const {
davidben30798ed82014-09-19 19:28:20436 // DER-encode the chain and convert to a platform certificate handle.
rsleevi74e99742016-09-13 20:35:25437 std::vector<std::string> chain;
438 chain.reserve(sk_X509_num(openssl_chain_.get()));
[email protected]edfd0f42014-07-22 18:20:37439 for (size_t i = 0; i < sk_X509_num(openssl_chain_.get()); ++i) {
[email protected]7f38da8a2014-03-17 16:44:26440 X509* x = sk_X509_value(openssl_chain_.get(), i);
rsleevi74e99742016-09-13 20:35:25441 // Note: This intentionally avoids using x509_util::GetDER(), which may
442 // cache the encoded DER on |x|, as |x| is shared with the underlying
443 // socket (SSL*) this chain belongs to. As the DER will only be used
444 // once in //net, within this code, this avoids needlessly caching
445 // additional data. See https://crbug.com/642082
446 int len = i2d_X509(x, nullptr);
447 if (len < 0)
448 return nullptr;
449 std::string cert;
450 uint8_t* ptr = reinterpret_cast<uint8_t*>(base::WriteInto(&cert, len + 1));
451 len = i2d_X509(x, &ptr);
452 if (len < 0) {
453 NOTREACHED();
454 return nullptr;
455 }
456 chain.push_back(std::move(cert));
[email protected]7f38da8a2014-03-17 16:44:26457 }
rsleevi74e99742016-09-13 20:35:25458 std::vector<base::StringPiece> stringpiece_chain;
459 for (const auto& cert : chain)
460 stringpiece_chain.push_back(cert);
[email protected]7f38da8a2014-03-17 16:44:26461
rsleevi74e99742016-09-13 20:35:25462 return X509Certificate::CreateFromDERCertChain(stringpiece_chain);
[email protected]7f38da8a2014-03-17 16:44:26463}
[email protected]7f38da8a2014-03-17 16:44:26464
[email protected]1279de12013-12-03 15:13:32465// static
[email protected]c3456bb2011-12-12 22:22:19466void SSLClientSocket::ClearSessionCache() {
svaldeze83af292016-04-26 14:33:37467 SSLClientSocketImpl::SSLContext* context =
468 SSLClientSocketImpl::SSLContext::GetInstance();
[email protected]c3456bb2011-12-12 22:22:19469 context->session_cache()->Flush();
470}
471
svaldeze83af292016-04-26 14:33:37472SSLClientSocketImpl::SSLClientSocketImpl(
danakj655b66c2016-04-16 00:51:38473 std::unique_ptr<ClientSocketHandle> transport_socket,
[email protected]055d7f22010-11-15 12:03:12474 const HostPortPair& host_and_port,
[email protected]822581d2010-12-16 17:27:15475 const SSLConfig& ssl_config,
[email protected]feb79bcd2011-07-21 16:55:17476 const SSLClientSocketContext& context)
[email protected]83039bb2011-12-09 18:43:55477 : transport_send_busy_(false),
[email protected]d518cd92010-09-29 12:27:44478 transport_recv_busy_(false),
davidben1d489522015-07-01 18:48:46479 pending_read_error_(kNoPendingResult),
davidbenb8c23212014-10-28 00:12:16480 pending_read_ssl_error_(SSL_ERROR_NONE),
[email protected]5aea79182014-07-14 20:43:41481 transport_read_error_(OK),
[email protected]3e5c6922014-02-06 02:42:16482 transport_write_error_(OK),
[email protected]7f38da8a2014-03-17 16:44:26483 server_cert_chain_(new PeerCertificateChain(NULL)),
[email protected]64b5c892014-08-08 09:39:26484 completed_connect_(false),
[email protected]0dc88b32014-03-26 20:12:28485 was_ever_used_(false),
[email protected]feb79bcd2011-07-21 16:55:17486 cert_verifier_(context.cert_verifier),
davidbeneb5f8ef32014-09-04 14:14:32487 cert_transparency_verifier_(context.cert_transparency_verifier),
[email protected]6b8a3c742014-07-25 00:25:35488 channel_id_service_(context.channel_id_service),
nharper736ceda2015-11-07 00:16:59489 tb_was_negotiated_(false),
490 tb_negotiated_param_(TB_PARAM_ECDSAP256),
nharper78e6d2b2016-09-21 05:42:35491 tb_signature_map_(10),
dchengc7eeda422015-12-26 03:56:48492 transport_(std::move(transport_socket)),
[email protected]055d7f22010-11-15 12:03:12493 host_and_port_(host_and_port),
[email protected]d518cd92010-09-29 12:27:44494 ssl_config_(ssl_config),
[email protected]c3456bb2011-12-12 22:22:19495 ssl_session_cache_shard_(context.ssl_session_cache_shard),
[email protected]013c17c2012-01-21 19:09:01496 next_handshake_state_(STATE_NONE),
svaldez4af14d22015-08-20 13:48:24497 disconnected_(false),
bnc3cf2a592016-08-11 14:48:36498 negotiated_protocol_(kProtoUnknown),
davidben52053b382015-04-27 19:22:29499 channel_id_sent_(false),
davidbendafe4e52015-04-08 22:53:52500 certificate_verified_(false),
davidbenfe132d92016-09-27 18:07:21501 certificate_requested_(false),
davidben1d489522015-07-01 18:48:46502 signature_result_(kNoPendingResult),
[email protected]8bd4e7a2014-08-09 14:49:17503 transport_security_state_(context.transport_security_state),
estark6f9b3d82016-01-12 21:37:05504 policy_enforcer_(context.ct_policy_enforcer),
dadriandf302c42016-06-10 18:48:59505 pkp_bypassed_(false),
kulkarni.acd7b4462014-08-28 07:41:34506 net_log_(transport_->socket()->NetLog()),
507 weak_factory_(this) {
rsleevibe81cd62016-06-24 01:38:59508 CHECK(cert_verifier_);
509 CHECK(transport_security_state_);
510 CHECK(cert_transparency_verifier_);
511 CHECK(policy_enforcer_);
[email protected]8e458552014-08-05 00:02:15512}
[email protected]d518cd92010-09-29 12:27:44513
svaldeze83af292016-04-26 14:33:37514SSLClientSocketImpl::~SSLClientSocketImpl() {
[email protected]d518cd92010-09-29 12:27:44515 Disconnect();
516}
517
davidben2a811e4e2015-12-01 10:49:34518#if !defined(OS_NACL)
svaldeze83af292016-04-26 14:33:37519void SSLClientSocketImpl::SetSSLKeyLogFile(
davidben2a811e4e2015-12-01 10:49:34520 const base::FilePath& ssl_keylog_file,
521 const scoped_refptr<base::SequencedTaskRunner>& task_runner) {
522 SSLContext::GetInstance()->SetSSLKeyLogFile(ssl_keylog_file, task_runner);
zhongyi81f85c6d92015-10-16 19:34:14523}
davidben2a811e4e2015-12-01 10:49:34524#endif
zhongyi81f85c6d92015-10-16 19:34:14525
svaldeze83af292016-04-26 14:33:37526void SSLClientSocketImpl::GetSSLCertRequestInfo(
[email protected]b9b651f2013-11-09 04:32:22527 SSLCertRequestInfo* cert_request_info) {
[email protected]791879c2013-12-17 07:22:41528 cert_request_info->host_and_port = host_and_port_;
[email protected]b9b651f2013-11-09 04:32:22529 cert_request_info->cert_authorities = cert_authorities_;
[email protected]c0787702014-05-20 21:51:44530 cert_request_info->cert_key_types = cert_key_types_;
[email protected]b9b651f2013-11-09 04:32:22531}
532
svaldeze83af292016-04-26 14:33:37533ChannelIDService* SSLClientSocketImpl::GetChannelIDService() const {
[email protected]6b8a3c742014-07-25 00:25:35534 return channel_id_service_;
[email protected]b9b651f2013-11-09 04:32:22535}
536
nharper78e6d2b2016-09-21 05:42:35537Error SSLClientSocketImpl::GetTokenBindingSignature(crypto::ECPrivateKey* key,
538 TokenBindingType tb_type,
539 std::vector<uint8_t>* out) {
nharperb7441ef2016-01-25 23:54:14540 // The same key will be used across multiple requests to sign the same value,
541 // so the signature is cached.
542 std::string raw_public_key;
543 if (!key->ExportRawPublicKey(&raw_public_key))
544 return ERR_FAILED;
nharper78e6d2b2016-09-21 05:42:35545 auto it = tb_signature_map_.Get(std::make_pair(tb_type, raw_public_key));
546 if (it != tb_signature_map_.end()) {
nharperb7441ef2016-01-25 23:54:14547 *out = it->second;
548 return OK;
549 }
550
551 uint8_t tb_ekm_buf[32];
552 static const char kTokenBindingExporterLabel[] = "EXPORTER-Token-Binding";
davidbend80c12c2016-10-11 00:13:49553 if (!SSL_export_keying_material(ssl_.get(), tb_ekm_buf, sizeof(tb_ekm_buf),
nharperb7441ef2016-01-25 23:54:14554 kTokenBindingExporterLabel,
555 strlen(kTokenBindingExporterLabel), nullptr,
556 0, false /* no context */)) {
557 return ERR_FAILED;
558 }
559
nharper78e6d2b2016-09-21 05:42:35560 if (!CreateTokenBindingSignature(
nharperd5cddca2016-02-27 03:37:52561 base::StringPiece(reinterpret_cast<char*>(tb_ekm_buf),
562 sizeof(tb_ekm_buf)),
nharper78e6d2b2016-09-21 05:42:35563 tb_type, key, out))
nharperb7441ef2016-01-25 23:54:14564 return ERR_FAILED;
nharperb7441ef2016-01-25 23:54:14565
nharper78e6d2b2016-09-21 05:42:35566 tb_signature_map_.Put(std::make_pair(tb_type, raw_public_key), *out);
nharperb7441ef2016-01-25 23:54:14567 return OK;
568}
569
svaldeze83af292016-04-26 14:33:37570crypto::ECPrivateKey* SSLClientSocketImpl::GetChannelIDKey() const {
nharperb36644f2016-02-22 23:14:43571 return channel_id_key_.get();
572}
573
svaldeze83af292016-04-26 14:33:37574int SSLClientSocketImpl::ExportKeyingMaterial(const base::StringPiece& label,
575 bool has_context,
576 const base::StringPiece& context,
577 unsigned char* out,
578 unsigned int outlen) {
davidben86935f72015-05-06 22:24:49579 if (!IsConnected())
580 return ERR_SOCKET_NOT_CONNECTED;
581
[email protected]b9b651f2013-11-09 04:32:22582 crypto::OpenSSLErrStackTracer err_tracer(FROM_HERE);
583
davidbenf225b262016-09-15 22:09:22584 if (!SSL_export_keying_material(
davidbend80c12c2016-10-11 00:13:49585 ssl_.get(), out, outlen, label.data(), label.size(),
davidbenf225b262016-09-15 22:09:22586 reinterpret_cast<const unsigned char*>(context.data()),
587 context.length(), has_context ? 1 : 0)) {
588 LOG(ERROR) << "Failed to export keying material.";
589 return ERR_FAILED;
[email protected]b9b651f2013-11-09 04:32:22590 }
davidbenf225b262016-09-15 22:09:22591
[email protected]b9b651f2013-11-09 04:32:22592 return OK;
593}
594
svaldeze83af292016-04-26 14:33:37595int SSLClientSocketImpl::Connect(const CompletionCallback& callback) {
svaldez4af14d22015-08-20 13:48:24596 // Although StreamSocket does allow calling Connect() after Disconnect(),
597 // this has never worked for layered sockets. CHECK to detect any consumers
598 // reconnecting an SSL socket.
599 //
600 // TODO(davidben,mmenke): Remove this API feature. See
601 // https://crbug.com/499289.
602 CHECK(!disconnected_);
603
mikecirone8b85c432016-09-08 19:11:00604 net_log_.BeginEvent(NetLogEventType::SSL_CONNECT);
[email protected]b9b651f2013-11-09 04:32:22605
606 // Set up new ssl object.
[email protected]c8a80e92014-05-17 16:02:08607 int rv = Init();
608 if (rv != OK) {
davidben281d13f02016-04-27 20:43:28609 LogConnectEndEvent(rv);
[email protected]c8a80e92014-05-17 16:02:08610 return rv;
[email protected]b9b651f2013-11-09 04:32:22611 }
612
613 // Set SSL to client mode. Handshake happens in the loop below.
davidbend80c12c2016-10-11 00:13:49614 SSL_set_connect_state(ssl_.get());
[email protected]b9b651f2013-11-09 04:32:22615
rsleeviadbd4982016-06-13 22:10:27616 next_handshake_state_ = STATE_HANDSHAKE;
[email protected]c8a80e92014-05-17 16:02:08617 rv = DoHandshakeLoop(OK);
[email protected]b9b651f2013-11-09 04:32:22618 if (rv == ERR_IO_PENDING) {
619 user_connect_callback_ = callback;
620 } else {
davidben281d13f02016-04-27 20:43:28621 LogConnectEndEvent(rv);
[email protected]b9b651f2013-11-09 04:32:22622 }
623
624 return rv > OK ? OK : rv;
625}
626
svaldeze83af292016-04-26 14:33:37627void SSLClientSocketImpl::Disconnect() {
davidbened3764bb2016-03-14 19:53:16628 crypto::OpenSSLErrStackTracer tracer(FROM_HERE);
629
[email protected]b9b651f2013-11-09 04:32:22630 if (ssl_) {
631 // Calling SSL_shutdown prevents the session from being marked as
632 // unresumable.
davidbend80c12c2016-10-11 00:13:49633 SSL_shutdown(ssl_.get());
634 ssl_.reset();
[email protected]b9b651f2013-11-09 04:32:22635 }
davidbend80c12c2016-10-11 00:13:49636 transport_bio_.reset();
[email protected]b9b651f2013-11-09 04:32:22637
svaldez4af14d22015-08-20 13:48:24638 disconnected_ = true;
639
[email protected]b9b651f2013-11-09 04:32:22640 // Shut down anything that may call us back.
eroman7f9236a2015-05-11 21:23:43641 cert_verifier_request_.reset();
[email protected]b9b651f2013-11-09 04:32:22642 transport_->socket()->Disconnect();
643
644 // Null all callbacks, delete all buffers.
645 transport_send_busy_ = false;
646 send_buffer_ = NULL;
647 transport_recv_busy_ = false;
[email protected]b9b651f2013-11-09 04:32:22648 recv_buffer_ = NULL;
649
650 user_connect_callback_.Reset();
651 user_read_callback_.Reset();
652 user_write_callback_.Reset();
svaldeze83af292016-04-26 14:33:37653 user_read_buf_ = NULL;
654 user_read_buf_len_ = 0;
655 user_write_buf_ = NULL;
656 user_write_buf_len_ = 0;
[email protected]b9b651f2013-11-09 04:32:22657
davidben1d489522015-07-01 18:48:46658 pending_read_error_ = kNoPendingResult;
davidbenb8c23212014-10-28 00:12:16659 pending_read_ssl_error_ = SSL_ERROR_NONE;
660 pending_read_error_info_ = OpenSSLErrorInfo();
661
[email protected]5aea79182014-07-14 20:43:41662 transport_read_error_ = OK;
[email protected]3e5c6922014-02-06 02:42:16663 transport_write_error_ = OK;
664
[email protected]b9b651f2013-11-09 04:32:22665 server_cert_verify_result_.Reset();
[email protected]64b5c892014-08-08 09:39:26666 completed_connect_ = false;
[email protected]b9b651f2013-11-09 04:32:22667
668 cert_authorities_.clear();
[email protected]c0787702014-05-20 21:51:44669 cert_key_types_.clear();
[email protected]faff9852014-06-21 06:13:46670
davidben09c3d072014-08-25 20:33:58671 start_cert_verification_time_ = base::TimeTicks();
672
bnc3cf2a592016-08-11 14:48:36673 negotiated_protocol_ = kProtoUnknown;
[email protected]abc44b752014-07-30 03:52:15674
davidben52053b382015-04-27 19:22:29675 channel_id_sent_ = false;
nharper736ceda2015-11-07 00:16:59676 tb_was_negotiated_ = false;
davidbenc269cc4b2016-07-27 14:55:03677 pending_session_ = nullptr;
davidbenf2eaaf92015-05-15 22:18:42678 certificate_verified_ = false;
davidbenfe132d92016-09-27 18:07:21679 certificate_requested_ = false;
nharper75ade892015-06-10 19:05:35680 channel_id_request_.Cancel();
davidben1d489522015-07-01 18:48:46681
davidben1d489522015-07-01 18:48:46682 signature_result_ = kNoPendingResult;
683 signature_.clear();
[email protected]b9b651f2013-11-09 04:32:22684}
685
svaldeze83af292016-04-26 14:33:37686bool SSLClientSocketImpl::IsConnected() const {
[email protected]b9b651f2013-11-09 04:32:22687 // If the handshake has not yet completed.
[email protected]64b5c892014-08-08 09:39:26688 if (!completed_connect_)
[email protected]b9b651f2013-11-09 04:32:22689 return false;
690 // If an asynchronous operation is still pending.
691 if (user_read_buf_.get() || user_write_buf_.get())
692 return true;
693
694 return transport_->socket()->IsConnected();
695}
696
svaldeze83af292016-04-26 14:33:37697bool SSLClientSocketImpl::IsConnectedAndIdle() const {
[email protected]b9b651f2013-11-09 04:32:22698 // If the handshake has not yet completed.
[email protected]64b5c892014-08-08 09:39:26699 if (!completed_connect_)
[email protected]b9b651f2013-11-09 04:32:22700 return false;
701 // If an asynchronous operation is still pending.
702 if (user_read_buf_.get() || user_write_buf_.get())
703 return false;
davidbenfc9a6b82015-04-15 23:47:32704
705 // If there is data read from the network that has not yet been consumed, do
706 // not treat the connection as idle.
707 //
708 // Note that this does not check |BIO_pending|, whether there is ciphertext
709 // that has not yet been flushed to the network. |Write| returns early, so
710 // this can cause race conditions which cause a socket to not be treated
711 // reusable when it should be. See https://crbug.com/466147.
davidbend80c12c2016-10-11 00:13:49712 if (BIO_wpending(transport_bio_.get()) > 0)
[email protected]b9b651f2013-11-09 04:32:22713 return false;
[email protected]b9b651f2013-11-09 04:32:22714
715 return transport_->socket()->IsConnectedAndIdle();
716}
717
svaldeze83af292016-04-26 14:33:37718int SSLClientSocketImpl::GetPeerAddress(IPEndPoint* addressList) const {
[email protected]b9b651f2013-11-09 04:32:22719 return transport_->socket()->GetPeerAddress(addressList);
720}
721
svaldeze83af292016-04-26 14:33:37722int SSLClientSocketImpl::GetLocalAddress(IPEndPoint* addressList) const {
[email protected]b9b651f2013-11-09 04:32:22723 return transport_->socket()->GetLocalAddress(addressList);
724}
725
tfarina42834112016-09-22 13:38:20726const NetLogWithSource& SSLClientSocketImpl::NetLog() const {
[email protected]b9b651f2013-11-09 04:32:22727 return net_log_;
728}
729
svaldeze83af292016-04-26 14:33:37730void SSLClientSocketImpl::SetSubresourceSpeculation() {
[email protected]b9b651f2013-11-09 04:32:22731 if (transport_.get() && transport_->socket()) {
732 transport_->socket()->SetSubresourceSpeculation();
733 } else {
734 NOTREACHED();
735 }
736}
737
svaldeze83af292016-04-26 14:33:37738void SSLClientSocketImpl::SetOmniboxSpeculation() {
[email protected]b9b651f2013-11-09 04:32:22739 if (transport_.get() && transport_->socket()) {
740 transport_->socket()->SetOmniboxSpeculation();
741 } else {
742 NOTREACHED();
743 }
744}
745
svaldeze83af292016-04-26 14:33:37746bool SSLClientSocketImpl::WasEverUsed() const {
[email protected]0dc88b32014-03-26 20:12:28747 return was_ever_used_;
[email protected]b9b651f2013-11-09 04:32:22748}
749
bnc3cf2a592016-08-11 14:48:36750bool SSLClientSocketImpl::WasNpnNegotiated() const {
751 return negotiated_protocol_ != kProtoUnknown;
752}
753
754NextProto SSLClientSocketImpl::GetNegotiatedProtocol() const {
755 return negotiated_protocol_;
756}
757
svaldeze83af292016-04-26 14:33:37758bool SSLClientSocketImpl::GetSSLInfo(SSLInfo* ssl_info) {
[email protected]b9b651f2013-11-09 04:32:22759 ssl_info->Reset();
davidben30798ed82014-09-19 19:28:20760 if (server_cert_chain_->empty())
[email protected]b9b651f2013-11-09 04:32:22761 return false;
762
763 ssl_info->cert = server_cert_verify_result_.verified_cert;
estark03d644f2015-06-13 00:11:32764 ssl_info->unverified_cert = server_cert_;
[email protected]b9b651f2013-11-09 04:32:22765 ssl_info->cert_status = server_cert_verify_result_.cert_status;
766 ssl_info->is_issued_by_known_root =
767 server_cert_verify_result_.is_issued_by_known_root;
dadriandf302c42016-06-10 18:48:59768 ssl_info->pkp_bypassed = pkp_bypassed_;
svaldeze83af292016-04-26 14:33:37769 ssl_info->public_key_hashes = server_cert_verify_result_.public_key_hashes;
[email protected]b9b651f2013-11-09 04:32:22770 ssl_info->client_cert_sent =
771 ssl_config_.send_client_cert && ssl_config_.client_cert.get();
davidben52053b382015-04-27 19:22:29772 ssl_info->channel_id_sent = channel_id_sent_;
nharper736ceda2015-11-07 00:16:59773 ssl_info->token_binding_negotiated = tb_was_negotiated_;
774 ssl_info->token_binding_key_param = tb_negotiated_param_;
[email protected]8bd4e7a2014-08-09 14:49:17775 ssl_info->pinning_failure_log = pinning_failure_log_;
dadrian612337a2016-07-20 22:36:58776 ssl_info->ocsp_result = server_cert_verify_result_.ocsp_result;
[email protected]b9b651f2013-11-09 04:32:22777
estark723b5eeb2016-02-18 21:01:12778 AddCTInfoToSSLInfo(ssl_info);
davidbeneb5f8ef32014-09-04 14:14:32779
davidbend80c12c2016-10-11 00:13:49780 const SSL_CIPHER* cipher = SSL_get_current_cipher(ssl_.get());
[email protected]b9b651f2013-11-09 04:32:22781 CHECK(cipher);
782 ssl_info->security_bits = SSL_CIPHER_get_bits(cipher, NULL);
davidben3b00e402016-09-20 14:31:06783 // Historically, the "group" was known as "curve".
davidbend80c12c2016-10-11 00:13:49784 ssl_info->key_exchange_group = SSL_get_curve_id(ssl_.get());
[email protected]b9b651f2013-11-09 04:32:22785
ryanchung987b2ff2016-02-19 00:17:12786 SSLConnectionStatusSetCipherSuite(
787 static_cast<uint16_t>(SSL_CIPHER_get_id(cipher)),
788 &ssl_info->connection_status);
davidbend80c12c2016-10-11 00:13:49789 SSLConnectionStatusSetVersion(GetNetSSLVersion(ssl_.get()),
ryanchung987b2ff2016-02-19 00:17:12790 &ssl_info->connection_status);
[email protected]b9b651f2013-11-09 04:32:22791
davidbend80c12c2016-10-11 00:13:49792 if (!SSL_get_secure_renegotiation_support(ssl_.get()))
[email protected]b9b651f2013-11-09 04:32:22793 ssl_info->connection_status |= SSL_CONNECTION_NO_RENEGOTIATION_EXTENSION;
[email protected]b9b651f2013-11-09 04:32:22794
davidbend80c12c2016-10-11 00:13:49795 ssl_info->handshake_type = SSL_session_reused(ssl_.get())
svaldeze83af292016-04-26 14:33:37796 ? SSLInfo::HANDSHAKE_RESUME
797 : SSLInfo::HANDSHAKE_FULL;
[email protected]b9b651f2013-11-09 04:32:22798
[email protected]b9b651f2013-11-09 04:32:22799 return true;
800}
801
svaldeze83af292016-04-26 14:33:37802void SSLClientSocketImpl::GetConnectionAttempts(ConnectionAttempts* out) const {
ttuttle23fdb7b2015-05-15 01:28:03803 out->clear();
804}
805
svaldeze83af292016-04-26 14:33:37806int64_t SSLClientSocketImpl::GetTotalReceivedBytes() const {
tbansalf82cc8e2015-10-14 20:05:49807 return transport_->socket()->GetTotalReceivedBytes();
808}
809
svaldeze83af292016-04-26 14:33:37810int SSLClientSocketImpl::Read(IOBuffer* buf,
811 int buf_len,
812 const CompletionCallback& callback) {
[email protected]b9b651f2013-11-09 04:32:22813 user_read_buf_ = buf;
814 user_read_buf_len_ = buf_len;
815
davidben1b133ad2014-10-23 04:23:13816 int rv = DoReadLoop();
[email protected]b9b651f2013-11-09 04:32:22817
818 if (rv == ERR_IO_PENDING) {
819 user_read_callback_ = callback;
820 } else {
[email protected]0dc88b32014-03-26 20:12:28821 if (rv > 0)
822 was_ever_used_ = true;
[email protected]b9b651f2013-11-09 04:32:22823 user_read_buf_ = NULL;
824 user_read_buf_len_ = 0;
825 }
826
827 return rv;
828}
829
svaldeze83af292016-04-26 14:33:37830int SSLClientSocketImpl::Write(IOBuffer* buf,
831 int buf_len,
832 const CompletionCallback& callback) {
[email protected]b9b651f2013-11-09 04:32:22833 user_write_buf_ = buf;
834 user_write_buf_len_ = buf_len;
835
davidben1b133ad2014-10-23 04:23:13836 int rv = DoWriteLoop();
[email protected]b9b651f2013-11-09 04:32:22837
838 if (rv == ERR_IO_PENDING) {
839 user_write_callback_ = callback;
840 } else {
[email protected]0dc88b32014-03-26 20:12:28841 if (rv > 0)
842 was_ever_used_ = true;
[email protected]b9b651f2013-11-09 04:32:22843 user_write_buf_ = NULL;
844 user_write_buf_len_ = 0;
845 }
846
847 return rv;
848}
849
svaldeze83af292016-04-26 14:33:37850int SSLClientSocketImpl::SetReceiveBufferSize(int32_t size) {
[email protected]b9b651f2013-11-09 04:32:22851 return transport_->socket()->SetReceiveBufferSize(size);
852}
853
svaldeze83af292016-04-26 14:33:37854int SSLClientSocketImpl::SetSendBufferSize(int32_t size) {
[email protected]b9b651f2013-11-09 04:32:22855 return transport_->socket()->SetSendBufferSize(size);
856}
857
svaldeze83af292016-04-26 14:33:37858int SSLClientSocketImpl::Init() {
[email protected]9e733f32010-10-04 18:19:08859 DCHECK(!ssl_);
860 DCHECK(!transport_bio_);
861
svaldez2135be52016-04-20 16:34:53862#if defined(USE_NSS_CERTS)
davidbena477a70a2015-10-06 04:38:29863 if (ssl_config_.cert_io_enabled) {
864 // TODO(davidben): Move this out of SSLClientSocket. See
865 // https://crbug.com/539520.
866 EnsureNSSHttpIOInit();
867 }
868#endif
869
[email protected]b29af7d2010-12-14 11:52:47870 SSLContext* context = SSLContext::GetInstance();
[email protected]4b559b4d2011-04-14 17:37:14871 crypto::OpenSSLErrStackTracer err_tracer(FROM_HERE);
[email protected]d518cd92010-09-29 12:27:44872
davidbend80c12c2016-10-11 00:13:49873 ssl_.reset(SSL_new(context->ssl_ctx()));
874 if (!ssl_ || !context->SetClientSocketForSSL(ssl_.get(), this))
[email protected]c8a80e92014-05-17 16:02:08875 return ERR_UNEXPECTED;
[email protected]fbef13932010-11-23 12:38:53876
davidben9bc0466f2015-06-16 22:21:27877 // SNI should only contain valid DNS hostnames, not IP addresses (see RFC
878 // 6066, Section 3).
879 //
880 // TODO(rsleevi): Should this code allow hostnames that violate the LDH rule?
881 // See https://crbug.com/496472 and https://crbug.com/496468 for discussion.
martijna2e83bd2016-03-18 13:10:45882 IPAddress unused;
883 if (!unused.AssignFromIPLiteral(host_and_port_.host()) &&
davidbend80c12c2016-10-11 00:13:49884 !SSL_set_tlsext_host_name(ssl_.get(), host_and_port_.host().c_str())) {
[email protected]c8a80e92014-05-17 16:02:08885 return ERR_UNEXPECTED;
davidben9bc0466f2015-06-16 22:21:27886 }
[email protected]fbef13932010-11-23 12:38:53887
davidbend80c12c2016-10-11 00:13:49888 bssl::UniquePtr<SSL_SESSION> session =
davidbenf4c9a6122015-10-20 02:45:29889 context->session_cache()->Lookup(GetSessionCacheKey());
890 if (session)
davidbend80c12c2016-10-11 00:13:49891 SSL_set_session(ssl_.get(), session.get());
[email protected]d518cd92010-09-29 12:27:44892
mmenke1beda3d2016-07-22 03:33:45893 // Get read and write buffer sizes from field trials, if possible. If values
894 // not present, use default. Also make sure values are in reasonable range.
895 int send_buffer_size = kDefaultOpenSSLBufferSize;
896#if !defined(OS_NACL)
897 int override_send_buffer_size;
898 if (base::StringToInt(base::FieldTrialList::FindFullName("SSLBufferSizeSend"),
899 &override_send_buffer_size)) {
900 send_buffer_size = override_send_buffer_size;
901 send_buffer_size = std::max(send_buffer_size, 1000);
902 send_buffer_size =
903 std::min(send_buffer_size, 2 * kDefaultOpenSSLBufferSize);
904 }
905#endif // !defined(OS_NACL)
haavardm2d92e722014-12-19 13:45:44906 send_buffer_ = new GrowableIOBuffer();
mmenke1beda3d2016-07-22 03:33:45907 send_buffer_->SetCapacity(send_buffer_size);
908
909 int recv_buffer_size = kDefaultOpenSSLBufferSize;
910#if !defined(OS_NACL)
911 int override_recv_buffer_size;
912 if (base::StringToInt(base::FieldTrialList::FindFullName("SSLBufferSizeRecv"),
913 &override_recv_buffer_size)) {
914 recv_buffer_size = override_recv_buffer_size;
915 recv_buffer_size = std::max(recv_buffer_size, 1000);
916 recv_buffer_size =
917 std::min(recv_buffer_size, 2 * kDefaultOpenSSLBufferSize);
918 }
919#endif // !defined(OS_NACL)
haavardm2d92e722014-12-19 13:45:44920 recv_buffer_ = new GrowableIOBuffer();
mmenke1beda3d2016-07-22 03:33:45921 recv_buffer_->SetCapacity(recv_buffer_size);
haavardm2d92e722014-12-19 13:45:44922
[email protected]d518cd92010-09-29 12:27:44923 BIO* ssl_bio = NULL;
haavardm2d92e722014-12-19 13:45:44924
svaldeze83af292016-04-26 14:33:37925 // SSLClientSocketImpl retains ownership of the BIO buffers.
davidbend80c12c2016-10-11 00:13:49926 BIO* transport_bio_raw;
haavardm2d92e722014-12-19 13:45:44927 if (!BIO_new_bio_pair_external_buf(
928 &ssl_bio, send_buffer_->capacity(),
davidbend80c12c2016-10-11 00:13:49929 reinterpret_cast<uint8_t*>(send_buffer_->data()), &transport_bio_raw,
haavardm2d92e722014-12-19 13:45:44930 recv_buffer_->capacity(),
931 reinterpret_cast<uint8_t*>(recv_buffer_->data())))
[email protected]c8a80e92014-05-17 16:02:08932 return ERR_UNEXPECTED;
davidbend80c12c2016-10-11 00:13:49933 transport_bio_.reset(transport_bio_raw);
[email protected]d518cd92010-09-29 12:27:44934 DCHECK(ssl_bio);
935 DCHECK(transport_bio_);
936
[email protected]5aea79182014-07-14 20:43:41937 // Install a callback on OpenSSL's end to plumb transport errors through.
svaldeze83af292016-04-26 14:33:37938 BIO_set_callback(ssl_bio, &SSLClientSocketImpl::BIOCallback);
[email protected]5aea79182014-07-14 20:43:41939 BIO_set_callback_arg(ssl_bio, reinterpret_cast<char*>(this));
940
davidbend80c12c2016-10-11 00:13:49941 SSL_set_bio(ssl_.get(), ssl_bio, ssl_bio);
[email protected]d518cd92010-09-29 12:27:44942
davidbenb937d6c2015-05-14 04:53:42943 DCHECK_LT(SSL3_VERSION, ssl_config_.version_min);
944 DCHECK_LT(SSL3_VERSION, ssl_config_.version_max);
davidbend80c12c2016-10-11 00:13:49945 if (!SSL_set_min_proto_version(ssl_.get(), ssl_config_.version_min) ||
946 !SSL_set_max_proto_version(ssl_.get(), ssl_config_.version_max)) {
davidben952bdf22016-09-21 23:42:16947 return ERR_UNEXPECTED;
948 }
davidbenb937d6c2015-05-14 04:53:42949
[email protected]9e733f32010-10-04 18:19:08950 // OpenSSL defaults some options to on, others to off. To avoid ambiguity,
951 // set everything we care about to an absolute value.
[email protected]fb10e2282010-12-01 17:08:48952 SslSetClearMask options;
[email protected]d0f00492012-08-03 22:35:13953 options.ConfigureFlag(SSL_OP_NO_COMPRESSION, true);
[email protected]9e733f32010-10-04 18:19:08954
955 // TODO(joth): Set this conditionally, see http://crbug.com/55410
[email protected]fb10e2282010-12-01 17:08:48956 options.ConfigureFlag(SSL_OP_LEGACY_SERVER_CONNECT, true);
[email protected]9e733f32010-10-04 18:19:08957
davidbend80c12c2016-10-11 00:13:49958 SSL_set_options(ssl_.get(), options.set_mask);
959 SSL_clear_options(ssl_.get(), options.clear_mask);
[email protected]9e733f32010-10-04 18:19:08960
[email protected]fb10e2282010-12-01 17:08:48961 // Same as above, this time for the SSL mode.
962 SslSetClearMask mode;
[email protected]9e733f32010-10-04 18:19:08963
[email protected]fb10e2282010-12-01 17:08:48964 mode.ConfigureFlag(SSL_MODE_RELEASE_BUFFERS, true);
ishermane5c05e12014-09-09 20:32:15965 mode.ConfigureFlag(SSL_MODE_CBC_RECORD_SPLITTING, true);
[email protected]fb10e2282010-12-01 17:08:48966
davidben818d93b2015-02-19 22:27:32967 mode.ConfigureFlag(SSL_MODE_ENABLE_FALSE_START,
[email protected]b788de02014-04-23 18:06:07968 ssl_config_.false_start_enabled);
969
davidbend80c12c2016-10-11 00:13:49970 SSL_set_mode(ssl_.get(), mode.set_mask);
971 SSL_clear_mode(ssl_.get(), mode.clear_mask);
[email protected]109805a2010-12-07 18:17:06972
davidbenb3c2d972016-03-11 22:36:17973 // Use BoringSSL defaults, but disable HMAC-SHA256 and HMAC-SHA384 ciphers
974 // (note that SHA256 and SHA384 only select legacy CBC ciphers). Also disable
975 // DHE_RSA_WITH_AES_256_GCM_SHA384. Historically, AES_256_GCM was not
976 // supported. As DHE is being deprecated, don't add a cipher only to remove it
977 // immediately.
petewilec5f5df222016-06-29 17:21:34978 std::string command;
mabe0d8c582016-08-12 02:06:40979 if (SSLClientSocket::IsPostQuantumExperimentEnabled()) {
petewilec5f5df222016-06-29 17:21:34980 // These are experimental, non-standard ciphersuites. They are part of an
981 // experiment in post-quantum cryptography. They're not intended to
982 // represent a de-facto standard, and will be removed from BoringSSL in
983 // ~2018.
984 if (EVP_has_aes_hardware()) {
985 command.append(
986 "CECPQ1-RSA-AES256-GCM-SHA384:"
987 "CECPQ1-ECDSA-AES256-GCM-SHA384:");
988 }
989 command.append(
990 "CECPQ1-RSA-CHACHA20-POLY1305-SHA256:"
991 "CECPQ1-ECDSA-CHACHA20-POLY1305-SHA256:");
992 if (!EVP_has_aes_hardware()) {
993 command.append(
994 "CECPQ1-RSA-AES256-GCM-SHA384:"
995 "CECPQ1-ECDSA-AES256-GCM-SHA384:");
996 }
997 }
petewilec5f5df222016-06-29 17:21:34998 command.append("ALL:!SHA256:!SHA384:!DHE-RSA-AES256-GCM-SHA384:!aPSK:!RC4");
davidben9b4a9b9c2015-10-12 18:46:51999
1000 if (ssl_config_.require_ecdhe)
1001 command.append(":!kRSA:!kDHE");
davidben8ecc3072014-09-03 23:19:091002
davidben68dcc582016-01-12 22:09:361003 if (!ssl_config_.deprecated_cipher_suites_enabled) {
davidben01d8e332015-11-20 17:08:581004 // Only offer DHE on the second handshake. https://crbug.com/538690
1005 command.append(":!kDHE");
davidben91585692015-09-28 23:46:081006 }
davidbena4c9d062015-04-03 22:34:251007
davidben9b4a9b9c2015-10-12 18:46:511008 // Remove any disabled ciphers.
1009 for (uint16_t id : ssl_config_.disabled_cipher_suites) {
1010 const SSL_CIPHER* cipher = SSL_get_cipher_by_value(id);
1011 if (cipher) {
1012 command.append(":!");
1013 command.append(SSL_CIPHER_get_name(cipher));
1014 }
1015 }
1016
davidbend80c12c2016-10-11 00:13:491017 int rv = SSL_set_cipher_list(ssl_.get(), command.c_str());
[email protected]109805a2010-12-07 18:17:061018 // If this fails (rv = 0) it means there are no ciphers enabled on this SSL.
1019 // This will almost certainly result in the socket failing to complete the
1020 // handshake at which point the appropriate error is bubbled up to the client.
1021 LOG_IF(WARNING, rv != 1) << "SSL_set_cipher_list('" << command << "') "
svaldeze83af292016-04-26 14:33:371022 "returned "
1023 << rv;
[email protected]ee0f2aa82013-10-25 11:59:261024
1025 // TLS channel ids.
bnc3cf2a592016-08-11 14:48:361026 if (IsChannelIDEnabled()) {
davidbend80c12c2016-10-11 00:13:491027 SSL_enable_tls_channel_id(ssl_.get());
[email protected]ee0f2aa82013-10-25 11:59:261028 }
1029
bnc1f295372015-10-21 23:24:221030 if (!ssl_config_.alpn_protos.empty()) {
bnc988e68d2016-06-27 14:03:211031 std::vector<uint8_t> wire_protos =
1032 SerializeNextProtos(ssl_config_.alpn_protos);
davidbend80c12c2016-10-11 00:13:491033 SSL_set_alpn_protos(ssl_.get(),
1034 wire_protos.empty() ? NULL : &wire_protos[0],
[email protected]abc44b752014-07-30 03:52:151035 wire_protos.size());
1036 }
1037
davidbeneb5f8ef32014-09-04 14:14:321038 if (ssl_config_.signed_cert_timestamps_enabled) {
davidbend80c12c2016-10-11 00:13:491039 SSL_enable_signed_cert_timestamps(ssl_.get());
1040 SSL_enable_ocsp_stapling(ssl_.get());
davidbeneb5f8ef32014-09-04 14:14:321041 }
1042
davidben15f57132015-04-27 18:08:361043 if (cert_verifier_->SupportsOCSPStapling())
davidbend80c12c2016-10-11 00:13:491044 SSL_enable_ocsp_stapling(ssl_.get());
davidbeneb5f8ef32014-09-04 14:14:321045
[email protected]c8a80e92014-05-17 16:02:081046 return OK;
[email protected]d518cd92010-09-29 12:27:441047}
1048
svaldeze83af292016-04-26 14:33:371049void SSLClientSocketImpl::DoReadCallback(int rv) {
[email protected]b9b651f2013-11-09 04:32:221050 // Since Run may result in Read being called, clear |user_read_callback_|
1051 // up front.
[email protected]0dc88b32014-03-26 20:12:281052 if (rv > 0)
1053 was_ever_used_ = true;
[email protected]b9b651f2013-11-09 04:32:221054 user_read_buf_ = NULL;
1055 user_read_buf_len_ = 0;
1056 base::ResetAndReturn(&user_read_callback_).Run(rv);
1057}
1058
svaldeze83af292016-04-26 14:33:371059void SSLClientSocketImpl::DoWriteCallback(int rv) {
[email protected]b9b651f2013-11-09 04:32:221060 // Since Run may result in Write being called, clear |user_write_callback_|
1061 // up front.
[email protected]0dc88b32014-03-26 20:12:281062 if (rv > 0)
1063 was_ever_used_ = true;
[email protected]b9b651f2013-11-09 04:32:221064 user_write_buf_ = NULL;
1065 user_write_buf_len_ = 0;
1066 base::ResetAndReturn(&user_write_callback_).Run(rv);
1067}
1068
svaldeze83af292016-04-26 14:33:371069bool SSLClientSocketImpl::DoTransportIO() {
[email protected]b9b651f2013-11-09 04:32:221070 bool network_moved = false;
1071 int rv;
1072 // Read and write as much data as possible. The loop is necessary because
1073 // Write() may return synchronously.
1074 do {
1075 rv = BufferSend();
1076 if (rv != ERR_IO_PENDING && rv != 0)
1077 network_moved = true;
1078 } while (rv > 0);
[email protected]5aea79182014-07-14 20:43:411079 if (transport_read_error_ == OK && BufferRecv() != ERR_IO_PENDING)
[email protected]b9b651f2013-11-09 04:32:221080 network_moved = true;
1081 return network_moved;
1082}
1083
pkasting379234c2015-04-08 04:42:121084// TODO(cbentzel): Remove including "base/threading/thread_local.h" and
vadimt6b43dec22015-01-06 01:59:581085// g_first_run_completed once crbug.com/424386 is fixed.
1086base::LazyInstance<base::ThreadLocalBoolean>::Leaky g_first_run_completed =
1087 LAZY_INSTANCE_INITIALIZER;
1088
svaldeze83af292016-04-26 14:33:371089int SSLClientSocketImpl::DoHandshake() {
[email protected]b9b651f2013-11-09 04:32:221090 crypto::OpenSSLErrStackTracer err_tracer(FROM_HERE);
vadimt5a243282014-12-24 00:26:161091
1092 int rv;
1093
pkasting379234c2015-04-08 04:42:121094 // TODO(cbentzel): Leave only 1 call to SSL_do_handshake once crbug.com/424386
vadimt5a243282014-12-24 00:26:161095 // is fixed.
1096 if (ssl_config_.send_client_cert && ssl_config_.client_cert.get()) {
davidbend80c12c2016-10-11 00:13:491097 rv = SSL_do_handshake(ssl_.get());
vadimt5a243282014-12-24 00:26:161098 } else {
vadimt6b43dec22015-01-06 01:59:581099 if (g_first_run_completed.Get().Get()) {
pkasting379234c2015-04-08 04:42:121100 // TODO(cbentzel): Remove ScopedTracker below once crbug.com/424386 is
vadimt6b43dec22015-01-06 01:59:581101 // fixed.
pkasting379234c2015-04-08 04:42:121102 tracked_objects::ScopedTracker tracking_profile(
1103 FROM_HERE_WITH_EXPLICIT_FUNCTION("424386 SSL_do_handshake()"));
vadimt5a243282014-12-24 00:26:161104
davidbend80c12c2016-10-11 00:13:491105 rv = SSL_do_handshake(ssl_.get());
vadimt6b43dec22015-01-06 01:59:581106 } else {
1107 g_first_run_completed.Get().Set(true);
davidbend80c12c2016-10-11 00:13:491108 rv = SSL_do_handshake(ssl_.get());
vadimt6b43dec22015-01-06 01:59:581109 }
vadimt5a243282014-12-24 00:26:161110 }
[email protected]b9b651f2013-11-09 04:32:221111
davidbenc4212c02015-05-12 22:30:181112 int net_error = OK;
1113 if (rv <= 0) {
davidbend80c12c2016-10-11 00:13:491114 int ssl_error = SSL_get_error(ssl_.get(), rv);
[email protected]b9b651f2013-11-09 04:32:221115 if (ssl_error == SSL_ERROR_WANT_CHANNEL_ID_LOOKUP) {
[email protected]faff9852014-06-21 06:13:461116 // The server supports channel ID. Stop to look one up before returning to
1117 // the handshake.
rsleeviadbd4982016-06-13 22:10:271118 next_handshake_state_ = STATE_CHANNEL_ID_LOOKUP;
[email protected]faff9852014-06-21 06:13:461119 return OK;
[email protected]b9b651f2013-11-09 04:32:221120 }
davidbenced4aa9b2015-05-12 21:22:351121 if (ssl_error == SSL_ERROR_WANT_X509_LOOKUP &&
1122 !ssl_config_.send_client_cert) {
1123 return ERR_SSL_CLIENT_AUTH_CERT_NEEDED;
1124 }
davidben1d489522015-07-01 18:48:461125 if (ssl_error == SSL_ERROR_WANT_PRIVATE_KEY_OPERATION) {
svaldez7872fd02015-11-19 21:10:541126 DCHECK(ssl_config_.client_private_key);
davidben1d489522015-07-01 18:48:461127 DCHECK_NE(kNoPendingResult, signature_result_);
rsleeviadbd4982016-06-13 22:10:271128 next_handshake_state_ = STATE_HANDSHAKE;
davidben1d489522015-07-01 18:48:461129 return ERR_IO_PENDING;
1130 }
[email protected]b9b651f2013-11-09 04:32:221131
davidbena4409c62014-08-27 17:05:511132 OpenSSLErrorInfo error_info;
davidbenfe132d92016-09-27 18:07:211133 net_error = MapLastOpenSSLError(ssl_error, err_tracer, &error_info);
[email protected]b9b651f2013-11-09 04:32:221134 if (net_error == ERR_IO_PENDING) {
davidbenc4212c02015-05-12 22:30:181135 // If not done, stay in this state
rsleeviadbd4982016-06-13 22:10:271136 next_handshake_state_ = STATE_HANDSHAKE;
davidbenc4212c02015-05-12 22:30:181137 return ERR_IO_PENDING;
1138 }
1139
1140 LOG(ERROR) << "handshake failed; returned " << rv << ", SSL error code "
1141 << ssl_error << ", net_error " << net_error;
1142 net_log_.AddEvent(
mikecirone8b85c432016-09-08 19:11:001143 NetLogEventType::SSL_HANDSHAKE_ERROR,
davidbenc4212c02015-05-12 22:30:181144 CreateNetLogOpenSSLErrorCallback(net_error, ssl_error, error_info));
1145 }
1146
rsleeviadbd4982016-06-13 22:10:271147 next_handshake_state_ = STATE_HANDSHAKE_COMPLETE;
davidbenc4212c02015-05-12 22:30:181148 return net_error;
1149}
1150
svaldeze83af292016-04-26 14:33:371151int SSLClientSocketImpl::DoHandshakeComplete(int result) {
davidbenc4212c02015-05-12 22:30:181152 if (result < 0)
1153 return result;
1154
davidbenb4c25b62016-06-24 02:39:271155 // DHE is offered on the deprecated cipher fallback and then rejected
1156 // afterwards. This is to aid in diagnosing connection failures because a
1157 // server requires DHE ciphers.
1158 //
1159 // TODO(davidben): A few releases after DHE's removal, remove this logic.
1160 if (!ssl_config_.dhe_enabled &&
davidbend80c12c2016-10-11 00:13:491161 SSL_CIPHER_is_DHE(SSL_get_current_cipher(ssl_.get()))) {
davidbenb4c25b62016-06-24 02:39:271162 return ERR_SSL_OBSOLETE_CIPHER;
1163 }
1164
nharper736ceda2015-11-07 00:16:591165 // Check that if token binding was negotiated, then extended master secret
nharper78e6d2b2016-09-21 05:42:351166 // and renegotiation indication must also be negotiated.
1167 if (tb_was_negotiated_ &&
davidbend80c12c2016-10-11 00:13:491168 !(SSL_get_extms_support(ssl_.get()) &&
1169 SSL_get_secure_renegotiation_support(ssl_.get()))) {
nharper736ceda2015-11-07 00:16:591170 return ERR_SSL_PROTOCOL_ERROR;
nharper78e6d2b2016-09-21 05:42:351171 }
nharper736ceda2015-11-07 00:16:591172
bncce6ea242016-09-15 20:22:321173 const uint8_t* alpn_proto = NULL;
1174 unsigned alpn_len = 0;
davidbend80c12c2016-10-11 00:13:491175 SSL_get0_alpn_selected(ssl_.get(), &alpn_proto, &alpn_len);
bncce6ea242016-09-15 20:22:321176 if (alpn_len > 0) {
1177 base::StringPiece proto(reinterpret_cast<const char*>(alpn_proto),
1178 alpn_len);
1179 negotiated_protocol_ = NextProtoFromString(proto);
[email protected]b9b651f2013-11-09 04:32:221180 }
davidbenc4212c02015-05-12 22:30:181181
bncbd442c22016-09-14 20:49:161182 RecordNegotiatedProtocol();
bnc3cf2a592016-08-11 14:48:361183 RecordChannelIDSupport();
davidbenc4212c02015-05-12 22:30:181184
dadriand476e652016-07-26 21:33:241185 const uint8_t* ocsp_response_raw;
1186 size_t ocsp_response_len;
davidbend80c12c2016-10-11 00:13:491187 SSL_get0_ocsp_response(ssl_.get(), &ocsp_response_raw, &ocsp_response_len);
dadriand476e652016-07-26 21:33:241188 std::string ocsp_response;
1189 if (ocsp_response_len > 0) {
1190 ocsp_response_.assign(reinterpret_cast<const char*>(ocsp_response_raw),
1191 ocsp_response_len);
davidbenc4212c02015-05-12 22:30:181192 }
dadriand476e652016-07-26 21:33:241193 set_stapled_ocsp_response_received(ocsp_response_len != 0);
1194 UMA_HISTOGRAM_BOOLEAN("Net.OCSPResponseStapled", ocsp_response_len != 0);
davidbenc4212c02015-05-12 22:30:181195
1196 const uint8_t* sct_list;
1197 size_t sct_list_len;
davidbend80c12c2016-10-11 00:13:491198 SSL_get0_signed_cert_timestamp_list(ssl_.get(), &sct_list, &sct_list_len);
davidbenc4212c02015-05-12 22:30:181199 set_signed_cert_timestamps_received(sct_list_len != 0);
1200
1201 if (IsRenegotiationAllowed())
davidbend80c12c2016-10-11 00:13:491202 SSL_set_renegotiate_mode(ssl_.get(), ssl_renegotiate_freely);
davidbenc4212c02015-05-12 22:30:181203
davidbend80c12c2016-10-11 00:13:491204 uint16_t signature_algorithm = SSL_get_peer_signature_algorithm(ssl_.get());
davidben0653c8d2016-07-08 02:16:171205 if (signature_algorithm != 0) {
1206 UMA_HISTOGRAM_SPARSE_SLOWLY("Net.SSLSignatureAlgorithm",
1207 signature_algorithm);
davidben4fe4f982015-11-11 22:00:121208 }
1209
davidbenc4212c02015-05-12 22:30:181210 // Verify the certificate.
1211 UpdateServerCert();
rsleeviadbd4982016-06-13 22:10:271212 next_handshake_state_ = STATE_VERIFY_CERT;
davidbenc4212c02015-05-12 22:30:181213 return OK;
[email protected]b9b651f2013-11-09 04:32:221214}
1215
svaldeze83af292016-04-26 14:33:371216int SSLClientSocketImpl::DoChannelIDLookup() {
mikecironef22f9812016-10-04 03:40:191217 NetLogParametersCallback callback = base::Bind(
nharper49b27d992016-02-09 18:28:511218 &NetLogChannelIDLookupCallback, base::Unretained(channel_id_service_));
mikecirone8b85c432016-09-08 19:11:001219 net_log_.BeginEvent(NetLogEventType::SSL_GET_CHANNEL_ID, callback);
rsleeviadbd4982016-06-13 22:10:271220 next_handshake_state_ = STATE_CHANNEL_ID_LOOKUP_COMPLETE;
[email protected]6b8a3c742014-07-25 00:25:351221 return channel_id_service_->GetOrCreateChannelID(
nharper2e171cf2015-06-01 20:29:231222 host_and_port_.host(), &channel_id_key_,
svaldeze83af292016-04-26 14:33:371223 base::Bind(&SSLClientSocketImpl::OnHandshakeIOComplete,
[email protected]faff9852014-06-21 06:13:461224 base::Unretained(this)),
nharper75ade892015-06-10 19:05:351225 &channel_id_request_);
[email protected]faff9852014-06-21 06:13:461226}
1227
svaldeze83af292016-04-26 14:33:371228int SSLClientSocketImpl::DoChannelIDLookupComplete(int result) {
mikecirone8b85c432016-09-08 19:11:001229 net_log_.EndEvent(NetLogEventType::SSL_GET_CHANNEL_ID,
nharper49b27d992016-02-09 18:28:511230 base::Bind(&NetLogChannelIDLookupCompleteCallback,
1231 channel_id_key_.get(), result));
[email protected]faff9852014-06-21 06:13:461232 if (result < 0)
1233 return result;
1234
[email protected]faff9852014-06-21 06:13:461235 // Hand the key to OpenSSL. Check for error in case OpenSSL rejects the key
1236 // type.
davidben8a208fc2016-01-22 17:08:081237 DCHECK(channel_id_key_);
[email protected]faff9852014-06-21 06:13:461238 crypto::OpenSSLErrStackTracer err_tracer(FROM_HERE);
davidbend80c12c2016-10-11 00:13:491239 if (!SSL_set1_tls_channel_id(ssl_.get(), channel_id_key_->key())) {
[email protected]faff9852014-06-21 06:13:461240 LOG(ERROR) << "Failed to set Channel ID.";
davidbenf225b262016-09-15 22:09:221241 return ERR_FAILED;
[email protected]faff9852014-06-21 06:13:461242 }
1243
1244 // Return to the handshake.
davidben52053b382015-04-27 19:22:291245 channel_id_sent_ = true;
rsleeviadbd4982016-06-13 22:10:271246 next_handshake_state_ = STATE_HANDSHAKE;
[email protected]faff9852014-06-21 06:13:461247 return OK;
1248}
1249
svaldeze83af292016-04-26 14:33:371250int SSLClientSocketImpl::DoVerifyCert(int result) {
davidben30798ed82014-09-19 19:28:201251 DCHECK(!server_cert_chain_->empty());
davidben09c3d072014-08-25 20:33:581252 DCHECK(start_cert_verification_time_.is_null());
davidben30798ed82014-09-19 19:28:201253
rsleeviadbd4982016-06-13 22:10:271254 next_handshake_state_ = STATE_VERIFY_CERT_COMPLETE;
[email protected]b9b651f2013-11-09 04:32:221255
davidbenc6435a72015-08-17 18:28:521256 // OpenSSL decoded the certificate, but the platform certificate
1257 // implementation could not. This is treated as a fatal SSL-level protocol
1258 // error rather than a certificate error. See https://crbug.com/91341.
rsleevi74e99742016-09-13 20:35:251259 if (!server_cert_)
davidbenc6435a72015-08-17 18:28:521260 return ERR_SSL_SERVER_CERT_BAD_FORMAT;
1261
davidben30798ed82014-09-19 19:28:201262 // If the certificate is bad and has been previously accepted, use
1263 // the previous status and bypass the error.
[email protected]b9b651f2013-11-09 04:32:221264 CertStatus cert_status;
rsleevi74e99742016-09-13 20:35:251265 if (ssl_config_.IsAllowedBadCert(server_cert_.get(), &cert_status)) {
[email protected]b9b651f2013-11-09 04:32:221266 server_cert_verify_result_.Reset();
1267 server_cert_verify_result_.cert_status = cert_status;
1268 server_cert_verify_result_.verified_cert = server_cert_;
1269 return OK;
1270 }
1271
davidben09c3d072014-08-25 20:33:581272 start_cert_verification_time_ = base::TimeTicks::Now();
1273
eroman7f9236a2015-05-11 21:23:431274 return cert_verifier_->Verify(
rsleevi06bd78552016-06-08 22:34:461275 CertVerifier::RequestParams(server_cert_, host_and_port_.host(),
1276 ssl_config_.GetCertVerifyFlags(),
dadriand476e652016-07-26 21:33:241277 ocsp_response_, CertificateList()),
[email protected]591cffcd2014-08-18 20:02:301278 // TODO(davidben): Route the CRLSet through SSLConfig so
1279 // SSLClientSocket doesn't depend on SSLConfigService.
davidben15f57132015-04-27 18:08:361280 SSLConfigService::GetCRLSet().get(), &server_cert_verify_result_,
svaldeze83af292016-04-26 14:33:371281 base::Bind(&SSLClientSocketImpl::OnHandshakeIOComplete,
[email protected]b9b651f2013-11-09 04:32:221282 base::Unretained(this)),
eroman7f9236a2015-05-11 21:23:431283 &cert_verifier_request_, net_log_);
[email protected]b9b651f2013-11-09 04:32:221284}
1285
svaldeze83af292016-04-26 14:33:371286int SSLClientSocketImpl::DoVerifyCertComplete(int result) {
eroman7f9236a2015-05-11 21:23:431287 cert_verifier_request_.reset();
[email protected]b9b651f2013-11-09 04:32:221288
davidben09c3d072014-08-25 20:33:581289 if (!start_cert_verification_time_.is_null()) {
1290 base::TimeDelta verify_time =
1291 base::TimeTicks::Now() - start_cert_verification_time_;
1292 if (result == OK) {
1293 UMA_HISTOGRAM_TIMES("Net.SSLCertVerificationTime", verify_time);
1294 } else {
1295 UMA_HISTOGRAM_TIMES("Net.SSLCertVerificationTimeError", verify_time);
1296 }
1297 }
1298
rsleevi4a6ca8c2016-06-24 03:05:221299 // If the connection was good, check HPKP and CT status simultaneously,
1300 // but prefer to treat the HPKP error as more serious, if there was one.
[email protected]8bd4e7a2014-08-09 14:49:171301 const CertStatus cert_status = server_cert_verify_result_.cert_status;
rsleevi4a6ca8c2016-06-24 03:05:221302 if ((result == OK ||
dadrian8f8946652016-06-21 23:48:311303 (IsCertificateError(result) && IsCertStatusMinorError(cert_status)))) {
rsleevi4a6ca8c2016-06-24 03:05:221304 int ct_result = VerifyCT();
dadrian8f8946652016-06-21 23:48:311305 TransportSecurityState::PKPStatus pin_validity =
1306 transport_security_state_->CheckPublicKeyPins(
1307 host_and_port_, server_cert_verify_result_.is_issued_by_known_root,
1308 server_cert_verify_result_.public_key_hashes, server_cert_.get(),
1309 server_cert_verify_result_.verified_cert.get(),
1310 TransportSecurityState::ENABLE_PIN_REPORTS, &pinning_failure_log_);
1311 switch (pin_validity) {
1312 case TransportSecurityState::PKPStatus::VIOLATED:
1313 server_cert_verify_result_.cert_status |=
1314 CERT_STATUS_PINNED_KEY_MISSING;
1315 result = ERR_SSL_PINNED_KEY_NOT_IN_CERT_CHAIN;
1316 break;
1317 case TransportSecurityState::PKPStatus::BYPASSED:
1318 pkp_bypassed_ = true;
1319 // Fall through.
1320 case TransportSecurityState::PKPStatus::OK:
1321 // Do nothing.
1322 break;
rsleevi9545d342016-06-21 03:17:371323 }
rsleevi4a6ca8c2016-06-24 03:05:221324 if (result != ERR_SSL_PINNED_KEY_NOT_IN_CERT_CHAIN && ct_result != OK)
1325 result = ct_result;
[email protected]8bd4e7a2014-08-09 14:49:171326 }
1327
[email protected]b9b651f2013-11-09 04:32:221328 if (result == OK) {
davidbendafe4e52015-04-08 22:53:521329 DCHECK(!certificate_verified_);
1330 certificate_verified_ = true;
1331 MaybeCacheSession();
dadriand476e652016-07-26 21:33:241332 SSLInfo ssl_info;
1333 bool ok = GetSSLInfo(&ssl_info);
1334 DCHECK(ok);
1335 transport_security_state_->CheckExpectStaple(host_and_port_, ssl_info,
1336 ocsp_response_);
[email protected]b9b651f2013-11-09 04:32:221337 }
1338
[email protected]64b5c892014-08-08 09:39:261339 completed_connect_ = true;
[email protected]b9b651f2013-11-09 04:32:221340 // Exit DoHandshakeLoop and return the result to the caller to Connect.
1341 DCHECK_EQ(STATE_NONE, next_handshake_state_);
1342 return result;
1343}
1344
svaldeze83af292016-04-26 14:33:371345void SSLClientSocketImpl::DoConnectCallback(int rv) {
[email protected]b9b651f2013-11-09 04:32:221346 if (!user_connect_callback_.is_null()) {
1347 CompletionCallback c = user_connect_callback_;
1348 user_connect_callback_.Reset();
1349 c.Run(rv > OK ? OK : rv);
1350 }
1351}
1352
svaldeze83af292016-04-26 14:33:371353void SSLClientSocketImpl::UpdateServerCert() {
davidbend80c12c2016-10-11 00:13:491354 server_cert_chain_->Reset(SSL_get_peer_cert_chain(ssl_.get()));
[email protected]7f38da8a2014-03-17 16:44:261355 server_cert_ = server_cert_chain_->AsOSChain();
davidben30798ed82014-09-19 19:28:201356 if (server_cert_.get()) {
mikecirone8b85c432016-09-08 19:11:001357 net_log_.AddEvent(NetLogEventType::SSL_CERTIFICATES_RECEIVED,
svaldeze83af292016-04-26 14:33:371358 base::Bind(&NetLogX509CertificateCallback,
1359 base::Unretained(server_cert_.get())));
davidben30798ed82014-09-19 19:28:201360 }
[email protected]b9b651f2013-11-09 04:32:221361}
1362
svaldeze83af292016-04-26 14:33:371363void SSLClientSocketImpl::OnHandshakeIOComplete(int result) {
[email protected]b9b651f2013-11-09 04:32:221364 int rv = DoHandshakeLoop(result);
1365 if (rv != ERR_IO_PENDING) {
davidben281d13f02016-04-27 20:43:281366 LogConnectEndEvent(rv);
[email protected]b9b651f2013-11-09 04:32:221367 DoConnectCallback(rv);
1368 }
1369}
1370
svaldeze83af292016-04-26 14:33:371371void SSLClientSocketImpl::OnSendComplete(int result) {
[email protected]b9b651f2013-11-09 04:32:221372 if (next_handshake_state_ == STATE_HANDSHAKE) {
1373 // In handshake phase.
1374 OnHandshakeIOComplete(result);
1375 return;
1376 }
1377
davidben1d489522015-07-01 18:48:461378 // During a renegotiation, a Read call may also be blocked on a transport
1379 // write, so retry both operations.
1380 PumpReadWriteEvents();
[email protected]b9b651f2013-11-09 04:32:221381}
1382
svaldeze83af292016-04-26 14:33:371383void SSLClientSocketImpl::OnRecvComplete(int result) {
1384 TRACE_EVENT0("net", "SSLClientSocketImpl::OnRecvComplete");
[email protected]b9b651f2013-11-09 04:32:221385 if (next_handshake_state_ == STATE_HANDSHAKE) {
1386 // In handshake phase.
1387 OnHandshakeIOComplete(result);
1388 return;
1389 }
1390
1391 // Network layer received some data, check if client requested to read
1392 // decrypted data.
1393 if (!user_read_buf_.get())
1394 return;
1395
davidben1b133ad2014-10-23 04:23:131396 int rv = DoReadLoop();
[email protected]b9b651f2013-11-09 04:32:221397 if (rv != ERR_IO_PENDING)
1398 DoReadCallback(rv);
1399}
1400
svaldeze83af292016-04-26 14:33:371401int SSLClientSocketImpl::DoHandshakeLoop(int last_io_result) {
1402 TRACE_EVENT0("net", "SSLClientSocketImpl::DoHandshakeLoop");
[email protected]b9b651f2013-11-09 04:32:221403 int rv = last_io_result;
1404 do {
1405 // Default to STATE_NONE for next state.
1406 // (This is a quirk carried over from the windows
1407 // implementation. It makes reading the logs a bit harder.)
1408 // State handlers can and often do call GotoState just
1409 // to stay in the current state.
1410 State state = next_handshake_state_;
rsleeviadbd4982016-06-13 22:10:271411 next_handshake_state_ = STATE_NONE;
[email protected]b9b651f2013-11-09 04:32:221412 switch (state) {
1413 case STATE_HANDSHAKE:
1414 rv = DoHandshake();
1415 break;
davidbenc4212c02015-05-12 22:30:181416 case STATE_HANDSHAKE_COMPLETE:
1417 rv = DoHandshakeComplete(rv);
1418 break;
[email protected]faff9852014-06-21 06:13:461419 case STATE_CHANNEL_ID_LOOKUP:
1420 DCHECK_EQ(OK, rv);
1421 rv = DoChannelIDLookup();
svaldeze83af292016-04-26 14:33:371422 break;
[email protected]faff9852014-06-21 06:13:461423 case STATE_CHANNEL_ID_LOOKUP_COMPLETE:
1424 rv = DoChannelIDLookupComplete(rv);
1425 break;
[email protected]b9b651f2013-11-09 04:32:221426 case STATE_VERIFY_CERT:
[email protected]faff9852014-06-21 06:13:461427 DCHECK_EQ(OK, rv);
[email protected]b9b651f2013-11-09 04:32:221428 rv = DoVerifyCert(rv);
svaldeze83af292016-04-26 14:33:371429 break;
[email protected]b9b651f2013-11-09 04:32:221430 case STATE_VERIFY_CERT_COMPLETE:
1431 rv = DoVerifyCertComplete(rv);
1432 break;
1433 case STATE_NONE:
1434 default:
1435 rv = ERR_UNEXPECTED;
1436 NOTREACHED() << "unexpected state" << state;
1437 break;
1438 }
1439
1440 bool network_moved = DoTransportIO();
1441 if (network_moved && next_handshake_state_ == STATE_HANDSHAKE) {
1442 // In general we exit the loop if rv is ERR_IO_PENDING. In this
1443 // special case we keep looping even if rv is ERR_IO_PENDING because
1444 // the transport IO may allow DoHandshake to make progress.
1445 rv = OK; // This causes us to stay in the loop.
1446 }
1447 } while (rv != ERR_IO_PENDING && next_handshake_state_ != STATE_NONE);
1448 return rv;
1449}
1450
svaldeze83af292016-04-26 14:33:371451int SSLClientSocketImpl::DoReadLoop() {
[email protected]b9b651f2013-11-09 04:32:221452 bool network_moved;
1453 int rv;
1454 do {
1455 rv = DoPayloadRead();
1456 network_moved = DoTransportIO();
1457 } while (rv == ERR_IO_PENDING && network_moved);
1458
1459 return rv;
1460}
1461
svaldeze83af292016-04-26 14:33:371462int SSLClientSocketImpl::DoWriteLoop() {
[email protected]b9b651f2013-11-09 04:32:221463 bool network_moved;
1464 int rv;
1465 do {
1466 rv = DoPayloadWrite();
1467 network_moved = DoTransportIO();
1468 } while (rv == ERR_IO_PENDING && network_moved);
1469
1470 return rv;
1471}
1472
svaldeze83af292016-04-26 14:33:371473int SSLClientSocketImpl::DoPayloadRead() {
[email protected]b9b651f2013-11-09 04:32:221474 crypto::OpenSSLErrStackTracer err_tracer(FROM_HERE);
1475
davidben7e555daf2015-03-25 17:03:291476 DCHECK_LT(0, user_read_buf_len_);
1477 DCHECK(user_read_buf_.get());
1478
[email protected]b9b651f2013-11-09 04:32:221479 int rv;
davidben1d489522015-07-01 18:48:461480 if (pending_read_error_ != kNoPendingResult) {
[email protected]b9b651f2013-11-09 04:32:221481 rv = pending_read_error_;
davidben1d489522015-07-01 18:48:461482 pending_read_error_ = kNoPendingResult;
[email protected]b9b651f2013-11-09 04:32:221483 if (rv == 0) {
mikecirone8b85c432016-09-08 19:11:001484 net_log_.AddByteTransferEvent(NetLogEventType::SSL_SOCKET_BYTES_RECEIVED,
1485 rv, user_read_buf_->data());
davidbenb8c23212014-10-28 00:12:161486 } else {
1487 net_log_.AddEvent(
mikecirone8b85c432016-09-08 19:11:001488 NetLogEventType::SSL_READ_ERROR,
davidbenb8c23212014-10-28 00:12:161489 CreateNetLogOpenSSLErrorCallback(rv, pending_read_ssl_error_,
1490 pending_read_error_info_));
[email protected]b9b651f2013-11-09 04:32:221491 }
davidbenb8c23212014-10-28 00:12:161492 pending_read_ssl_error_ = SSL_ERROR_NONE;
1493 pending_read_error_info_ = OpenSSLErrorInfo();
[email protected]b9b651f2013-11-09 04:32:221494 return rv;
1495 }
1496
1497 int total_bytes_read = 0;
davidben7e555daf2015-03-25 17:03:291498 int ssl_ret;
[email protected]b9b651f2013-11-09 04:32:221499 do {
davidbend80c12c2016-10-11 00:13:491500 ssl_ret = SSL_read(ssl_.get(), user_read_buf_->data() + total_bytes_read,
davidben7e555daf2015-03-25 17:03:291501 user_read_buf_len_ - total_bytes_read);
1502 if (ssl_ret > 0)
1503 total_bytes_read += ssl_ret;
1504 } while (total_bytes_read < user_read_buf_len_ && ssl_ret > 0);
[email protected]b9b651f2013-11-09 04:32:221505
davidben7e555daf2015-03-25 17:03:291506 // Although only the final SSL_read call may have failed, the failure needs to
1507 // processed immediately, while the information still available in OpenSSL's
1508 // error queue.
davidbenced4aa9b2015-05-12 21:22:351509 if (ssl_ret <= 0) {
davidben7e555daf2015-03-25 17:03:291510 // A zero return from SSL_read may mean any of:
1511 // - The underlying BIO_read returned 0.
1512 // - The peer sent a close_notify.
1513 // - Any arbitrary error. https://crbug.com/466303
[email protected]b9b651f2013-11-09 04:32:221514 //
davidben7e555daf2015-03-25 17:03:291515 // TransportReadComplete converts the first to an ERR_CONNECTION_CLOSED
1516 // error, so it does not occur. The second and third are distinguished by
1517 // SSL_ERROR_ZERO_RETURN.
davidbend80c12c2016-10-11 00:13:491518 pending_read_ssl_error_ = SSL_get_error(ssl_.get(), ssl_ret);
davidben7e555daf2015-03-25 17:03:291519 if (pending_read_ssl_error_ == SSL_ERROR_ZERO_RETURN) {
1520 pending_read_error_ = 0;
davidbenced4aa9b2015-05-12 21:22:351521 } else if (pending_read_ssl_error_ == SSL_ERROR_WANT_X509_LOOKUP &&
1522 !ssl_config_.send_client_cert) {
1523 pending_read_error_ = ERR_SSL_CLIENT_AUTH_CERT_NEEDED;
davidben1d489522015-07-01 18:48:461524 } else if (pending_read_ssl_error_ ==
1525 SSL_ERROR_WANT_PRIVATE_KEY_OPERATION) {
svaldez7872fd02015-11-19 21:10:541526 DCHECK(ssl_config_.client_private_key);
davidben1d489522015-07-01 18:48:461527 DCHECK_NE(kNoPendingResult, signature_result_);
1528 pending_read_error_ = ERR_IO_PENDING;
davidben7e555daf2015-03-25 17:03:291529 } else {
davidbenfe132d92016-09-27 18:07:211530 pending_read_error_ = MapLastOpenSSLError(
davidben7e555daf2015-03-25 17:03:291531 pending_read_ssl_error_, err_tracer, &pending_read_error_info_);
[email protected]b9b651f2013-11-09 04:32:221532 }
1533
davidben7e555daf2015-03-25 17:03:291534 // Many servers do not reliably send a close_notify alert when shutting down
1535 // a connection, and instead terminate the TCP connection. This is reported
1536 // as ERR_CONNECTION_CLOSED. Because of this, map the unclean shutdown to a
1537 // graceful EOF, instead of treating it as an error as it should be.
1538 if (pending_read_error_ == ERR_CONNECTION_CLOSED)
1539 pending_read_error_ = 0;
1540 }
davidbenbe6ce7ec2014-10-20 19:15:561541
davidben7e555daf2015-03-25 17:03:291542 if (total_bytes_read > 0) {
1543 // Return any bytes read to the caller. The error will be deferred to the
1544 // next call of DoPayloadRead.
1545 rv = total_bytes_read;
davidbenbe6ce7ec2014-10-20 19:15:561546
davidben7e555daf2015-03-25 17:03:291547 // Do not treat insufficient data as an error to return in the next call to
1548 // DoPayloadRead() - instead, let the call fall through to check SSL_read()
1549 // again. This is because DoTransportIO() may complete in between the next
1550 // call to DoPayloadRead(), and thus it is important to check SSL_read() on
1551 // subsequent invocations to see if a complete record may now be read.
1552 if (pending_read_error_ == ERR_IO_PENDING)
davidben1d489522015-07-01 18:48:461553 pending_read_error_ = kNoPendingResult;
davidben7e555daf2015-03-25 17:03:291554 } else {
1555 // No bytes were returned. Return the pending read error immediately.
davidben1d489522015-07-01 18:48:461556 DCHECK_NE(kNoPendingResult, pending_read_error_);
davidben7e555daf2015-03-25 17:03:291557 rv = pending_read_error_;
davidben1d489522015-07-01 18:48:461558 pending_read_error_ = kNoPendingResult;
[email protected]b9b651f2013-11-09 04:32:221559 }
1560
1561 if (rv >= 0) {
mikecirone8b85c432016-09-08 19:11:001562 net_log_.AddByteTransferEvent(NetLogEventType::SSL_SOCKET_BYTES_RECEIVED,
1563 rv, user_read_buf_->data());
davidbenb8c23212014-10-28 00:12:161564 } else if (rv != ERR_IO_PENDING) {
1565 net_log_.AddEvent(
mikecirone8b85c432016-09-08 19:11:001566 NetLogEventType::SSL_READ_ERROR,
davidbenb8c23212014-10-28 00:12:161567 CreateNetLogOpenSSLErrorCallback(rv, pending_read_ssl_error_,
1568 pending_read_error_info_));
1569 pending_read_ssl_error_ = SSL_ERROR_NONE;
1570 pending_read_error_info_ = OpenSSLErrorInfo();
[email protected]b9b651f2013-11-09 04:32:221571 }
1572 return rv;
1573}
1574
svaldeze83af292016-04-26 14:33:371575int SSLClientSocketImpl::DoPayloadWrite() {
[email protected]b9b651f2013-11-09 04:32:221576 crypto::OpenSSLErrStackTracer err_tracer(FROM_HERE);
davidbend80c12c2016-10-11 00:13:491577 int rv = SSL_write(ssl_.get(), user_write_buf_->data(), user_write_buf_len_);
rsleevif020edc2015-03-16 19:31:241578
[email protected]b9b651f2013-11-09 04:32:221579 if (rv >= 0) {
mikecirone8b85c432016-09-08 19:11:001580 net_log_.AddByteTransferEvent(NetLogEventType::SSL_SOCKET_BYTES_SENT, rv,
[email protected]b9b651f2013-11-09 04:32:221581 user_write_buf_->data());
1582 return rv;
1583 }
1584
davidbend80c12c2016-10-11 00:13:491585 int ssl_error = SSL_get_error(ssl_.get(), rv);
davidben1d489522015-07-01 18:48:461586 if (ssl_error == SSL_ERROR_WANT_PRIVATE_KEY_OPERATION)
1587 return ERR_IO_PENDING;
davidbenb8c23212014-10-28 00:12:161588 OpenSSLErrorInfo error_info;
davidbenfe132d92016-09-27 18:07:211589 int net_error = MapLastOpenSSLError(ssl_error, err_tracer, &error_info);
davidbenb8c23212014-10-28 00:12:161590
1591 if (net_error != ERR_IO_PENDING) {
1592 net_log_.AddEvent(
mikecirone8b85c432016-09-08 19:11:001593 NetLogEventType::SSL_WRITE_ERROR,
davidbenb8c23212014-10-28 00:12:161594 CreateNetLogOpenSSLErrorCallback(net_error, ssl_error, error_info));
1595 }
1596 return net_error;
[email protected]b9b651f2013-11-09 04:32:221597}
1598
svaldeze83af292016-04-26 14:33:371599void SSLClientSocketImpl::PumpReadWriteEvents() {
davidben1d489522015-07-01 18:48:461600 int rv_read = ERR_IO_PENDING;
1601 int rv_write = ERR_IO_PENDING;
1602 bool network_moved;
1603 do {
1604 if (user_read_buf_.get())
1605 rv_read = DoPayloadRead();
1606 if (user_write_buf_.get())
1607 rv_write = DoPayloadWrite();
1608 network_moved = DoTransportIO();
1609 } while (rv_read == ERR_IO_PENDING && rv_write == ERR_IO_PENDING &&
1610 (user_read_buf_.get() || user_write_buf_.get()) && network_moved);
1611
1612 // Performing the Read callback may cause |this| to be deleted. If this
1613 // happens, the Write callback should not be invoked. Guard against this by
1614 // holding a WeakPtr to |this| and ensuring it's still valid.
svaldeze83af292016-04-26 14:33:371615 base::WeakPtr<SSLClientSocketImpl> guard(weak_factory_.GetWeakPtr());
davidben1d489522015-07-01 18:48:461616 if (user_read_buf_.get() && rv_read != ERR_IO_PENDING)
1617 DoReadCallback(rv_read);
1618
1619 if (!guard.get())
1620 return;
1621
1622 if (user_write_buf_.get() && rv_write != ERR_IO_PENDING)
1623 DoWriteCallback(rv_write);
1624}
1625
svaldeze83af292016-04-26 14:33:371626int SSLClientSocketImpl::BufferSend(void) {
[email protected]b9b651f2013-11-09 04:32:221627 if (transport_send_busy_)
1628 return ERR_IO_PENDING;
1629
haavardm2d92e722014-12-19 13:45:441630 size_t buffer_read_offset;
1631 uint8_t* read_buf;
1632 size_t max_read;
davidbend80c12c2016-10-11 00:13:491633 int status = BIO_zero_copy_get_read_buf(transport_bio_.get(), &read_buf,
haavardm2d92e722014-12-19 13:45:441634 &buffer_read_offset, &max_read);
1635 DCHECK_EQ(status, 1); // Should never fail.
1636 if (!max_read)
1637 return 0; // Nothing pending in the OpenSSL write BIO.
1638 CHECK_EQ(read_buf, reinterpret_cast<uint8_t*>(send_buffer_->StartOfBuffer()));
1639 CHECK_LT(buffer_read_offset, static_cast<size_t>(send_buffer_->capacity()));
1640 send_buffer_->set_offset(buffer_read_offset);
[email protected]b9b651f2013-11-09 04:32:221641
1642 int rv = transport_->socket()->Write(
haavardm2d92e722014-12-19 13:45:441643 send_buffer_.get(), max_read,
svaldeze83af292016-04-26 14:33:371644 base::Bind(&SSLClientSocketImpl::BufferSendComplete,
[email protected]b9b651f2013-11-09 04:32:221645 base::Unretained(this)));
1646 if (rv == ERR_IO_PENDING) {
1647 transport_send_busy_ = true;
1648 } else {
1649 TransportWriteComplete(rv);
1650 }
1651 return rv;
1652}
1653
svaldeze83af292016-04-26 14:33:371654int SSLClientSocketImpl::BufferRecv(void) {
[email protected]b9b651f2013-11-09 04:32:221655 if (transport_recv_busy_)
1656 return ERR_IO_PENDING;
1657
1658 // Determine how much was requested from |transport_bio_| that was not
1659 // actually available.
davidbend80c12c2016-10-11 00:13:491660 size_t requested = BIO_ctrl_get_read_request(transport_bio_.get());
[email protected]b9b651f2013-11-09 04:32:221661 if (requested == 0) {
1662 // This is not a perfect match of error codes, as no operation is
1663 // actually pending. However, returning 0 would be interpreted as
1664 // a possible sign of EOF, which is also an inappropriate match.
1665 return ERR_IO_PENDING;
1666 }
1667
1668 // Known Issue: While only reading |requested| data is the more correct
1669 // implementation, it has the downside of resulting in frequent reads:
1670 // One read for the SSL record header (~5 bytes) and one read for the SSL
1671 // record body. Rather than issuing these reads to the underlying socket
1672 // (and constantly allocating new IOBuffers), a single Read() request to
1673 // fill |transport_bio_| is issued. As long as an SSL client socket cannot
1674 // be gracefully shutdown (via SSL close alerts) and re-used for non-SSL
1675 // traffic, this over-subscribed Read()ing will not cause issues.
haavardm2d92e722014-12-19 13:45:441676
1677 size_t buffer_write_offset;
1678 uint8_t* write_buf;
1679 size_t max_write;
davidbend80c12c2016-10-11 00:13:491680 int status = BIO_zero_copy_get_write_buf(transport_bio_.get(), &write_buf,
haavardm2d92e722014-12-19 13:45:441681 &buffer_write_offset, &max_write);
1682 DCHECK_EQ(status, 1); // Should never fail.
[email protected]b9b651f2013-11-09 04:32:221683 if (!max_write)
1684 return ERR_IO_PENDING;
1685
haavardm2d92e722014-12-19 13:45:441686 CHECK_EQ(write_buf,
1687 reinterpret_cast<uint8_t*>(recv_buffer_->StartOfBuffer()));
1688 CHECK_LT(buffer_write_offset, static_cast<size_t>(recv_buffer_->capacity()));
1689
1690 recv_buffer_->set_offset(buffer_write_offset);
[email protected]b9b651f2013-11-09 04:32:221691 int rv = transport_->socket()->Read(
svaldeze83af292016-04-26 14:33:371692 recv_buffer_.get(), max_write,
1693 base::Bind(&SSLClientSocketImpl::BufferRecvComplete,
[email protected]b9b651f2013-11-09 04:32:221694 base::Unretained(this)));
1695 if (rv == ERR_IO_PENDING) {
1696 transport_recv_busy_ = true;
1697 } else {
[email protected]3e5c6922014-02-06 02:42:161698 rv = TransportReadComplete(rv);
[email protected]b9b651f2013-11-09 04:32:221699 }
1700 return rv;
1701}
1702
svaldeze83af292016-04-26 14:33:371703void SSLClientSocketImpl::BufferSendComplete(int result) {
[email protected]b9b651f2013-11-09 04:32:221704 TransportWriteComplete(result);
1705 OnSendComplete(result);
1706}
1707
svaldeze83af292016-04-26 14:33:371708void SSLClientSocketImpl::BufferRecvComplete(int result) {
[email protected]3e5c6922014-02-06 02:42:161709 result = TransportReadComplete(result);
[email protected]b9b651f2013-11-09 04:32:221710 OnRecvComplete(result);
1711}
1712
svaldeze83af292016-04-26 14:33:371713void SSLClientSocketImpl::TransportWriteComplete(int result) {
[email protected]b9b651f2013-11-09 04:32:221714 DCHECK(ERR_IO_PENDING != result);
haavardm2d92e722014-12-19 13:45:441715 int bytes_written = 0;
[email protected]b9b651f2013-11-09 04:32:221716 if (result < 0) {
[email protected]5aea79182014-07-14 20:43:411717 // Record the error. Save it to be reported in a future read or write on
1718 // transport_bio_'s peer.
[email protected]3e5c6922014-02-06 02:42:161719 transport_write_error_ = result;
[email protected]b9b651f2013-11-09 04:32:221720 } else {
haavardm2d92e722014-12-19 13:45:441721 bytes_written = result;
[email protected]b9b651f2013-11-09 04:32:221722 }
haavardm2d92e722014-12-19 13:45:441723 DCHECK_GE(send_buffer_->RemainingCapacity(), bytes_written);
davidbend80c12c2016-10-11 00:13:491724 int ret =
1725 BIO_zero_copy_get_read_buf_done(transport_bio_.get(), bytes_written);
haavardm2d92e722014-12-19 13:45:441726 DCHECK_EQ(1, ret);
1727 transport_send_busy_ = false;
[email protected]b9b651f2013-11-09 04:32:221728}
1729
svaldeze83af292016-04-26 14:33:371730int SSLClientSocketImpl::TransportReadComplete(int result) {
[email protected]b9b651f2013-11-09 04:32:221731 DCHECK(ERR_IO_PENDING != result);
[email protected]5aea79182014-07-14 20:43:411732 // If an EOF, canonicalize to ERR_CONNECTION_CLOSED here so MapOpenSSLError
1733 // does not report success.
1734 if (result == 0)
1735 result = ERR_CONNECTION_CLOSED;
haavardm2d92e722014-12-19 13:45:441736 int bytes_read = 0;
[email protected]5aea79182014-07-14 20:43:411737 if (result < 0) {
[email protected]5aea79182014-07-14 20:43:411738 // Received an error. Save it to be reported in a future read on
1739 // transport_bio_'s peer.
1740 transport_read_error_ = result;
[email protected]b9b651f2013-11-09 04:32:221741 } else {
haavardm2d92e722014-12-19 13:45:441742 bytes_read = result;
[email protected]b9b651f2013-11-09 04:32:221743 }
haavardm2d92e722014-12-19 13:45:441744 DCHECK_GE(recv_buffer_->RemainingCapacity(), bytes_read);
davidbend80c12c2016-10-11 00:13:491745 int ret = BIO_zero_copy_get_write_buf_done(transport_bio_.get(), bytes_read);
haavardm2d92e722014-12-19 13:45:441746 DCHECK_EQ(1, ret);
[email protected]b9b651f2013-11-09 04:32:221747 transport_recv_busy_ = false;
[email protected]3e5c6922014-02-06 02:42:161748 return result;
[email protected]b9b651f2013-11-09 04:32:221749}
1750
rsleevi4a6ca8c2016-06-24 03:05:221751int SSLClientSocketImpl::VerifyCT() {
rsleevi4a6ca8c2016-06-24 03:05:221752 const uint8_t* sct_list_raw;
1753 size_t sct_list_len;
davidbend80c12c2016-10-11 00:13:491754 SSL_get0_signed_cert_timestamp_list(ssl_.get(), &sct_list_raw, &sct_list_len);
rsleevi4a6ca8c2016-06-24 03:05:221755 std::string sct_list;
1756 if (sct_list_len > 0)
1757 sct_list.assign(reinterpret_cast<const char*>(sct_list_raw), sct_list_len);
1758
1759 // Note that this is a completely synchronous operation: The CT Log Verifier
1760 // gets all the data it needs for SCT verification and does not do any
1761 // external communication.
1762 cert_transparency_verifier_->Verify(
dadriand476e652016-07-26 21:33:241763 server_cert_verify_result_.verified_cert.get(), ocsp_response_, sct_list,
eranmdcec9632016-10-10 14:16:101764 &ct_verify_result_.scts, net_log_);
rsleevi4a6ca8c2016-06-24 03:05:221765
1766 ct_verify_result_.ct_policies_applied = true;
1767 ct_verify_result_.ev_policy_compliance =
1768 ct::EVPolicyCompliance::EV_POLICY_DOES_NOT_APPLY;
eranm4bed0b572016-08-14 21:00:351769
1770 SCTList verified_scts =
1771 ct::SCTsMatchingStatus(ct_verify_result_.scts, ct::SCT_STATUS_OK);
1772
rsleevi4a6ca8c2016-06-24 03:05:221773 if (server_cert_verify_result_.cert_status & CERT_STATUS_IS_EV) {
1774 scoped_refptr<ct::EVCertsWhitelist> ev_whitelist =
1775 SSLConfigService::GetEVCertsWhitelist();
1776 ct::EVPolicyCompliance ev_policy_compliance =
1777 policy_enforcer_->DoesConformToCTEVPolicy(
1778 server_cert_verify_result_.verified_cert.get(), ev_whitelist.get(),
eranm4bed0b572016-08-14 21:00:351779 verified_scts, net_log_);
rsleevi4a6ca8c2016-06-24 03:05:221780 ct_verify_result_.ev_policy_compliance = ev_policy_compliance;
1781 if (ev_policy_compliance !=
1782 ct::EVPolicyCompliance::EV_POLICY_DOES_NOT_APPLY &&
1783 ev_policy_compliance !=
1784 ct::EVPolicyCompliance::EV_POLICY_COMPLIES_VIA_WHITELIST &&
1785 ev_policy_compliance !=
1786 ct::EVPolicyCompliance::EV_POLICY_COMPLIES_VIA_SCTS) {
1787 server_cert_verify_result_.cert_status |=
1788 CERT_STATUS_CT_COMPLIANCE_FAILED;
1789 server_cert_verify_result_.cert_status &= ~CERT_STATUS_IS_EV;
1790 }
1791 }
1792 ct_verify_result_.cert_policy_compliance =
1793 policy_enforcer_->DoesConformToCertPolicy(
eranm4bed0b572016-08-14 21:00:351794 server_cert_verify_result_.verified_cert.get(), verified_scts,
1795 net_log_);
rsleevi4a6ca8c2016-06-24 03:05:221796
1797 if (ct_verify_result_.cert_policy_compliance !=
1798 ct::CertPolicyCompliance::CERT_POLICY_COMPLIES_VIA_SCTS &&
1799 transport_security_state_->ShouldRequireCT(
1800 host_and_port_.host(), server_cert_verify_result_.verified_cert.get(),
1801 server_cert_verify_result_.public_key_hashes)) {
1802 server_cert_verify_result_.cert_status |=
1803 CERT_STATUS_CERTIFICATE_TRANSPARENCY_REQUIRED;
1804 return ERR_CERTIFICATE_TRANSPARENCY_REQUIRED;
1805 }
1806
1807 return OK;
1808}
1809
svaldeze83af292016-04-26 14:33:371810int SSLClientSocketImpl::ClientCertRequestCallback(SSL* ssl) {
davidbend80c12c2016-10-11 00:13:491811 DCHECK(ssl == ssl_.get());
[email protected]82c59022014-08-15 09:38:271812
mikecirone8b85c432016-09-08 19:11:001813 net_log_.AddEvent(NetLogEventType::SSL_CLIENT_CERT_REQUESTED);
davidbenfe132d92016-09-27 18:07:211814 certificate_requested_ = true;
davidbenaf42cbe2014-11-13 03:27:461815
[email protected]82c59022014-08-15 09:38:271816 // Clear any currently configured certificates.
davidbend80c12c2016-10-11 00:13:491817 SSL_certs_clear(ssl_.get());
[email protected]97a854f2014-07-29 07:51:361818
1819#if defined(OS_IOS)
1820 // TODO(droger): Support client auth on iOS. See http://crbug.com/145954).
1821 LOG(WARNING) << "Client auth is not supported";
svaldeze83af292016-04-26 14:33:371822#else // !defined(OS_IOS)
[email protected]5ac981e182010-12-06 17:56:271823 if (!ssl_config_.send_client_cert) {
[email protected]515adc22013-01-09 16:01:231824 // First pass: we know that a client certificate is needed, but we do not
1825 // have one at hand.
svaldeze83af292016-04-26 14:33:371826 STACK_OF(X509_NAME)* authorities = SSL_get_client_CA_list(ssl);
[email protected]edfd0f42014-07-22 18:20:371827 for (size_t i = 0; i < sk_X509_NAME_num(authorities); i++) {
svaldeze83af292016-04-26 14:33:371828 X509_NAME* ca_name = (X509_NAME*)sk_X509_NAME_value(authorities, i);
[email protected]515adc22013-01-09 16:01:231829 unsigned char* str = NULL;
1830 int length = i2d_X509_NAME(ca_name, &str);
1831 cert_authorities_.push_back(std::string(
svaldeze83af292016-04-26 14:33:371832 reinterpret_cast<const char*>(str), static_cast<size_t>(length)));
[email protected]515adc22013-01-09 16:01:231833 OPENSSL_free(str);
1834 }
1835
[email protected]c0787702014-05-20 21:51:441836 const unsigned char* client_cert_types;
[email protected]e7e883e2014-07-25 06:03:081837 size_t num_client_cert_types =
1838 SSL_get0_certificate_types(ssl, &client_cert_types);
[email protected]c0787702014-05-20 21:51:441839 for (size_t i = 0; i < num_client_cert_types; i++) {
1840 cert_key_types_.push_back(
1841 static_cast<SSLClientCertType>(client_cert_types[i]));
1842 }
1843
davidbenced4aa9b2015-05-12 21:22:351844 // Suspends handshake. SSL_get_error will return SSL_ERROR_WANT_X509_LOOKUP.
1845 return -1;
[email protected]5ac981e182010-12-06 17:56:271846 }
1847
1848 // Second pass: a client certificate should have been selected.
[email protected]13914c92013-06-13 22:42:421849 if (ssl_config_.client_cert.get()) {
davidbend80c12c2016-10-11 00:13:491850 bssl::UniquePtr<X509> leaf_x509 =
[email protected]6bad5052014-07-12 01:25:131851 OSCertHandleToOpenSSL(ssl_config_.client_cert->os_cert_handle());
1852 if (!leaf_x509) {
1853 LOG(WARNING) << "Failed to import certificate";
1854 OpenSSLPutNetError(FROM_HERE, ERR_SSL_CLIENT_AUTH_CERT_BAD_FORMAT);
1855 return -1;
1856 }
1857
davidbend80c12c2016-10-11 00:13:491858 bssl::UniquePtr<STACK_OF(X509)> chain = OSCertHandlesToOpenSSL(
[email protected]82c59022014-08-15 09:38:271859 ssl_config_.client_cert->GetIntermediateCertificates());
1860 if (!chain) {
1861 LOG(WARNING) << "Failed to import intermediate certificates";
1862 OpenSSLPutNetError(FROM_HERE, ERR_SSL_CLIENT_AUTH_CERT_BAD_FORMAT);
1863 return -1;
1864 }
1865
davidbend80c12c2016-10-11 00:13:491866 if (!SSL_use_certificate(ssl_.get(), leaf_x509.get()) ||
1867 !SSL_set1_chain(ssl_.get(), chain.get())) {
davidben1d489522015-07-01 18:48:461868 LOG(WARNING) << "Failed to set client certificate";
1869 return -1;
1870 }
1871
svaldez7872fd02015-11-19 21:10:541872 if (!ssl_config_.client_private_key) {
1873 // The caller supplied a null private key. Fail the handshake and surface
1874 // an appropriate error to the caller.
davidben1d489522015-07-01 18:48:461875 LOG(WARNING) << "Client cert found without private key";
1876 OpenSSLPutNetError(FROM_HERE, ERR_SSL_CLIENT_AUTH_CERT_NO_PRIVATE_KEY);
1877 return -1;
1878 }
1879
davidbend80c12c2016-10-11 00:13:491880 SSL_set_private_key_method(ssl_.get(), &SSLContext::kPrivateKeyMethod);
svaldezf3db006f2015-09-29 16:43:581881
1882 std::vector<SSLPrivateKey::Hash> digest_prefs =
svaldez7872fd02015-11-19 21:10:541883 ssl_config_.client_private_key->GetDigestPreferences();
svaldezf3db006f2015-09-29 16:43:581884
1885 size_t digests_len = digest_prefs.size();
1886 std::vector<int> digests;
1887 for (size_t i = 0; i < digests_len; i++) {
1888 switch (digest_prefs[i]) {
1889 case SSLPrivateKey::Hash::SHA1:
1890 digests.push_back(NID_sha1);
1891 break;
1892 case SSLPrivateKey::Hash::SHA256:
1893 digests.push_back(NID_sha256);
1894 break;
1895 case SSLPrivateKey::Hash::SHA384:
1896 digests.push_back(NID_sha384);
1897 break;
1898 case SSLPrivateKey::Hash::SHA512:
1899 digests.push_back(NID_sha512);
1900 break;
1901 case SSLPrivateKey::Hash::MD5_SHA1:
1902 // MD5-SHA1 is not used in TLS 1.2.
1903 break;
1904 }
1905 }
1906
davidbend80c12c2016-10-11 00:13:491907 SSL_set_private_key_digest_prefs(ssl_.get(), digests.data(),
1908 digests.size());
davidbenaf42cbe2014-11-13 03:27:461909
1910 int cert_count = 1 + sk_X509_num(chain.get());
mikecirone8b85c432016-09-08 19:11:001911 net_log_.AddEvent(NetLogEventType::SSL_CLIENT_CERT_PROVIDED,
tfarina5e24b242015-10-27 13:11:281912 NetLog::IntCallback("cert_count", cert_count));
[email protected]6bad5052014-07-12 01:25:131913 return 1;
[email protected]c0787702014-05-20 21:51:441914 }
[email protected]97a854f2014-07-29 07:51:361915#endif // defined(OS_IOS)
[email protected]5ac981e182010-12-06 17:56:271916
1917 // Send no client certificate.
mikecirone8b85c432016-09-08 19:11:001918 net_log_.AddEvent(NetLogEventType::SSL_CLIENT_CERT_PROVIDED,
tfarina5e24b242015-10-27 13:11:281919 NetLog::IntCallback("cert_count", 0));
[email protected]82c59022014-08-15 09:38:271920 return 1;
[email protected]5ac981e182010-12-06 17:56:271921}
1922
svaldeze83af292016-04-26 14:33:371923int SSLClientSocketImpl::CertVerifyCallback(X509_STORE_CTX* store_ctx) {
[email protected]64b5c892014-08-08 09:39:261924 if (!completed_connect_) {
[email protected]b051cdb62014-02-28 02:20:161925 // If the first handshake hasn't completed then we accept any certificates
1926 // because we verify after the handshake.
1927 return 1;
1928 }
1929
davidben30798ed82014-09-19 19:28:201930 // Disallow the server certificate to change in a renegotiation.
1931 if (server_cert_chain_->empty()) {
[email protected]76e85392014-03-20 17:54:141932 LOG(ERROR) << "Received invalid certificate chain between handshakes";
davidben30798ed82014-09-19 19:28:201933 return 0;
1934 }
1935 base::StringPiece old_der, new_der;
1936 if (store_ctx->cert == NULL ||
1937 !x509_util::GetDER(server_cert_chain_->Get(0), &old_der) ||
1938 !x509_util::GetDER(store_ctx->cert, &new_der)) {
1939 LOG(ERROR) << "Failed to encode certificates";
1940 return 0;
1941 }
1942 if (old_der != new_der) {
[email protected]76e85392014-03-20 17:54:141943 LOG(ERROR) << "Server certificate changed between handshakes";
davidben30798ed82014-09-19 19:28:201944 return 0;
1945 }
1946
1947 return 1;
[email protected]b051cdb62014-02-28 02:20:161948}
1949
svaldeze83af292016-04-26 14:33:371950long SSLClientSocketImpl::MaybeReplayTransportError(BIO* bio,
1951 int cmd,
1952 const char* argp,
1953 int argi,
1954 long argl,
1955 long retvalue) {
1956 if (cmd == (BIO_CB_READ | BIO_CB_RETURN) && retvalue <= 0) {
[email protected]5aea79182014-07-14 20:43:411957 // If there is no more data in the buffer, report any pending errors that
1958 // were observed. Note that both the readbuf and the writebuf are checked
1959 // for errors, since the application may have encountered a socket error
1960 // while writing that would otherwise not be reported until the application
1961 // attempted to write again - which it may never do. See
1962 // https://crbug.com/249848.
1963 if (transport_read_error_ != OK) {
1964 OpenSSLPutNetError(FROM_HERE, transport_read_error_);
1965 return -1;
1966 }
1967 if (transport_write_error_ != OK) {
1968 OpenSSLPutNetError(FROM_HERE, transport_write_error_);
1969 return -1;
1970 }
1971 } else if (cmd == BIO_CB_WRITE) {
1972 // Because of the write buffer, this reports a failure from the previous
1973 // write payload. If the current payload fails to write, the error will be
1974 // reported in a future write or read to |bio|.
1975 if (transport_write_error_ != OK) {
1976 OpenSSLPutNetError(FROM_HERE, transport_write_error_);
1977 return -1;
1978 }
1979 }
1980 return retvalue;
1981}
1982
1983// static
svaldeze83af292016-04-26 14:33:371984long SSLClientSocketImpl::BIOCallback(BIO* bio,
1985 int cmd,
1986 const char* argp,
1987 int argi,
1988 long argl,
1989 long retvalue) {
1990 SSLClientSocketImpl* socket =
1991 reinterpret_cast<SSLClientSocketImpl*>(BIO_get_callback_arg(bio));
[email protected]5aea79182014-07-14 20:43:411992 CHECK(socket);
svaldeze83af292016-04-26 14:33:371993 return socket->MaybeReplayTransportError(bio, cmd, argp, argi, argl,
1994 retvalue);
[email protected]5aea79182014-07-14 20:43:411995}
1996
svaldeze83af292016-04-26 14:33:371997void SSLClientSocketImpl::MaybeCacheSession() {
davidben44aeae62015-06-24 20:47:431998 // Only cache the session once both a new session has been established and the
1999 // certificate has been verified. Due to False Start, these events may happen
2000 // in either order.
davidbenc269cc4b2016-07-27 14:55:032001 if (!pending_session_ || !certificate_verified_)
davidbendafe4e52015-04-08 22:53:522002 return;
davidbendafe4e52015-04-08 22:53:522003
2004 SSLContext::GetInstance()->session_cache()->Insert(GetSessionCacheKey(),
davidbenc269cc4b2016-07-27 14:55:032005 pending_session_.get());
2006 pending_session_ = nullptr;
davidbendafe4e52015-04-08 22:53:522007}
2008
svaldeze83af292016-04-26 14:33:372009int SSLClientSocketImpl::NewSessionCallback(SSL_SESSION* session) {
davidbenc269cc4b2016-07-27 14:55:032010 // OpenSSL passes a reference to |session|.
2011 pending_session_.reset(session);
davidbendafe4e52015-04-08 22:53:522012 MaybeCacheSession();
davidben44aeae62015-06-24 20:47:432013 return 1;
davidbendafe4e52015-04-08 22:53:522014}
2015
svaldeze83af292016-04-26 14:33:372016void SSLClientSocketImpl::AddCTInfoToSSLInfo(SSLInfo* ssl_info) const {
estark723b5eeb2016-02-18 21:01:122017 ssl_info->UpdateCertificateTransparencyInfo(ct_verify_result_);
davidbeneb5f8ef32014-09-04 14:14:322018}
2019
svaldeze83af292016-04-26 14:33:372020std::string SSLClientSocketImpl::GetSessionCacheKey() const {
rsleevif020edc2015-03-16 19:31:242021 std::string result = host_and_port_.ToString();
2022 result.append("/");
2023 result.append(ssl_session_cache_shard_);
2024
davidbena4c9d062015-04-03 22:34:252025 result.append("/");
davidben14b1a532015-10-30 16:01:092026 if (ssl_config_.deprecated_cipher_suites_enabled)
davidbena4c9d062015-04-03 22:34:252027 result.append("deprecated");
2028
davidbenee39de02015-10-16 19:53:182029 result.append("/");
2030 if (ssl_config_.channel_id_enabled)
2031 result.append("channelid");
2032
rsleevif020edc2015-03-16 19:31:242033 return result;
2034}
2035
svaldeze83af292016-04-26 14:33:372036bool SSLClientSocketImpl::IsRenegotiationAllowed() const {
nharper736ceda2015-11-07 00:16:592037 if (tb_was_negotiated_)
2038 return false;
2039
bncce6ea242016-09-15 20:22:322040 if (negotiated_protocol_ == kProtoUnknown)
davidben421116c2015-05-12 19:56:512041 return ssl_config_.renego_allowed_default;
2042
davidben421116c2015-05-12 19:56:512043 for (NextProto allowed : ssl_config_.renego_allowed_for_protos) {
bnc3cf2a592016-08-11 14:48:362044 if (negotiated_protocol_ == allowed)
davidben421116c2015-05-12 19:56:512045 return true;
2046 }
2047 return false;
2048}
2049
svaldeze83af292016-04-26 14:33:372050int SSLClientSocketImpl::PrivateKeyTypeCallback() {
svaldez7872fd02015-11-19 21:10:542051 switch (ssl_config_.client_private_key->GetType()) {
davidben1d489522015-07-01 18:48:462052 case SSLPrivateKey::Type::RSA:
2053 return EVP_PKEY_RSA;
2054 case SSLPrivateKey::Type::ECDSA:
2055 return EVP_PKEY_EC;
2056 }
2057 NOTREACHED();
2058 return EVP_PKEY_NONE;
2059}
2060
svaldeze83af292016-04-26 14:33:372061size_t SSLClientSocketImpl::PrivateKeyMaxSignatureLenCallback() {
svaldez7872fd02015-11-19 21:10:542062 return ssl_config_.client_private_key->GetMaxSignatureLengthInBytes();
davidben1d489522015-07-01 18:48:462063}
2064
davidben0bca07fd2016-07-18 15:12:032065ssl_private_key_result_t SSLClientSocketImpl::PrivateKeySignDigestCallback(
davidben1d489522015-07-01 18:48:462066 uint8_t* out,
2067 size_t* out_len,
2068 size_t max_out,
2069 const EVP_MD* md,
2070 const uint8_t* in,
2071 size_t in_len) {
2072 DCHECK_EQ(kNoPendingResult, signature_result_);
2073 DCHECK(signature_.empty());
svaldez7872fd02015-11-19 21:10:542074 DCHECK(ssl_config_.client_private_key);
davidben1d489522015-07-01 18:48:462075
davidben1d489522015-07-01 18:48:462076 SSLPrivateKey::Hash hash;
2077 if (!EVP_MDToPrivateKeyHash(md, &hash)) {
2078 OpenSSLPutNetError(FROM_HERE, ERR_SSL_CLIENT_AUTH_SIGNATURE_FAILED);
2079 return ssl_private_key_failure;
2080 }
2081
davidben752bcf22015-12-21 22:55:502082 net_log_.BeginEvent(
mikecirone8b85c432016-09-08 19:11:002083 NetLogEventType::SSL_PRIVATE_KEY_OP,
davidben752bcf22015-12-21 22:55:502084 base::Bind(&NetLogPrivateKeyOperationCallback,
2085 ssl_config_.client_private_key->GetType(), hash));
2086
davidben1d489522015-07-01 18:48:462087 signature_result_ = ERR_IO_PENDING;
svaldez7872fd02015-11-19 21:10:542088 ssl_config_.client_private_key->SignDigest(
davidben1d489522015-07-01 18:48:462089 hash, base::StringPiece(reinterpret_cast<const char*>(in), in_len),
davidben0bca07fd2016-07-18 15:12:032090 base::Bind(&SSLClientSocketImpl::OnPrivateKeyComplete,
davidben1d489522015-07-01 18:48:462091 weak_factory_.GetWeakPtr()));
2092 return ssl_private_key_retry;
2093}
2094
davidben0bca07fd2016-07-18 15:12:032095ssl_private_key_result_t SSLClientSocketImpl::PrivateKeyCompleteCallback(
davidben1d489522015-07-01 18:48:462096 uint8_t* out,
2097 size_t* out_len,
2098 size_t max_out) {
2099 DCHECK_NE(kNoPendingResult, signature_result_);
svaldez7872fd02015-11-19 21:10:542100 DCHECK(ssl_config_.client_private_key);
davidben1d489522015-07-01 18:48:462101
2102 if (signature_result_ == ERR_IO_PENDING)
2103 return ssl_private_key_retry;
2104 if (signature_result_ != OK) {
2105 OpenSSLPutNetError(FROM_HERE, signature_result_);
2106 return ssl_private_key_failure;
2107 }
2108 if (signature_.size() > max_out) {
2109 OpenSSLPutNetError(FROM_HERE, ERR_SSL_CLIENT_AUTH_SIGNATURE_FAILED);
2110 return ssl_private_key_failure;
2111 }
davidben5f8b6bc2015-11-25 03:19:542112 memcpy(out, signature_.data(), signature_.size());
davidben1d489522015-07-01 18:48:462113 *out_len = signature_.size();
2114 signature_.clear();
2115 return ssl_private_key_success;
2116}
2117
davidben0bca07fd2016-07-18 15:12:032118void SSLClientSocketImpl::OnPrivateKeyComplete(
davidben1d489522015-07-01 18:48:462119 Error error,
2120 const std::vector<uint8_t>& signature) {
2121 DCHECK_EQ(ERR_IO_PENDING, signature_result_);
2122 DCHECK(signature_.empty());
svaldez7872fd02015-11-19 21:10:542123 DCHECK(ssl_config_.client_private_key);
davidben1d489522015-07-01 18:48:462124
mikecirone8b85c432016-09-08 19:11:002125 net_log_.EndEventWithNetErrorCode(NetLogEventType::SSL_PRIVATE_KEY_OP, error);
davidben1d489522015-07-01 18:48:462126
2127 signature_result_ = error;
2128 if (signature_result_ == OK)
2129 signature_ = signature;
2130
2131 if (next_handshake_state_ == STATE_HANDSHAKE) {
2132 OnHandshakeIOComplete(signature_result_);
2133 return;
2134 }
2135
2136 // During a renegotiation, either Read or Write calls may be blocked on an
2137 // asynchronous private key operation.
2138 PumpReadWriteEvents();
2139}
2140
svaldeze83af292016-04-26 14:33:372141int SSLClientSocketImpl::TokenBindingAdd(const uint8_t** out,
2142 size_t* out_len,
2143 int* out_alert_value) {
nharper736ceda2015-11-07 00:16:592144 if (ssl_config_.token_binding_params.empty()) {
2145 return 0;
2146 }
davidbend80c12c2016-10-11 00:13:492147 bssl::ScopedCBB output;
nharper736ceda2015-11-07 00:16:592148 CBB parameters_list;
2149 if (!CBB_init(output.get(), 7) ||
2150 !CBB_add_u8(output.get(), kTbProtocolVersionMajor) ||
2151 !CBB_add_u8(output.get(), kTbProtocolVersionMinor) ||
2152 !CBB_add_u8_length_prefixed(output.get(), &parameters_list)) {
2153 *out_alert_value = SSL_AD_INTERNAL_ERROR;
2154 return -1;
2155 }
2156 for (size_t i = 0; i < ssl_config_.token_binding_params.size(); ++i) {
2157 if (!CBB_add_u8(&parameters_list, ssl_config_.token_binding_params[i])) {
2158 *out_alert_value = SSL_AD_INTERNAL_ERROR;
2159 return -1;
2160 }
2161 }
2162 // |*out| will be freed by TokenBindingFreeCallback.
2163 if (!CBB_finish(output.get(), const_cast<uint8_t**>(out), out_len)) {
2164 *out_alert_value = SSL_AD_INTERNAL_ERROR;
2165 return -1;
2166 }
2167
2168 return 1;
2169}
2170
svaldeze83af292016-04-26 14:33:372171int SSLClientSocketImpl::TokenBindingParse(const uint8_t* contents,
2172 size_t contents_len,
2173 int* out_alert_value) {
nharper736ceda2015-11-07 00:16:592174 if (completed_connect_) {
2175 // Token Binding may only be negotiated on the initial handshake.
2176 *out_alert_value = SSL_AD_ILLEGAL_PARAMETER;
2177 return 0;
2178 }
2179
2180 CBS extension;
2181 CBS_init(&extension, contents, contents_len);
2182
2183 CBS parameters_list;
2184 uint8_t version_major, version_minor, param;
2185 if (!CBS_get_u8(&extension, &version_major) ||
2186 !CBS_get_u8(&extension, &version_minor) ||
2187 !CBS_get_u8_length_prefixed(&extension, &parameters_list) ||
2188 !CBS_get_u8(&parameters_list, &param) || CBS_len(&parameters_list) > 0 ||
2189 CBS_len(&extension) > 0) {
2190 *out_alert_value = SSL_AD_DECODE_ERROR;
2191 return 0;
2192 }
2193 // The server-negotiated version must be less than or equal to our version.
2194 if (version_major > kTbProtocolVersionMajor ||
2195 (version_minor > kTbProtocolVersionMinor &&
2196 version_major == kTbProtocolVersionMajor)) {
2197 *out_alert_value = SSL_AD_ILLEGAL_PARAMETER;
2198 return 0;
2199 }
2200 // If the version the server negotiated is older than we support, don't fail
2201 // parsing the extension, but also don't set |negotiated_|.
2202 if (version_major < kTbMinProtocolVersionMajor ||
2203 (version_minor < kTbMinProtocolVersionMinor &&
2204 version_major == kTbMinProtocolVersionMajor)) {
2205 return 1;
2206 }
2207
2208 for (size_t i = 0; i < ssl_config_.token_binding_params.size(); ++i) {
2209 if (param == ssl_config_.token_binding_params[i]) {
2210 tb_negotiated_param_ = ssl_config_.token_binding_params[i];
2211 tb_was_negotiated_ = true;
2212 return 1;
2213 }
2214 }
2215
2216 *out_alert_value = SSL_AD_ILLEGAL_PARAMETER;
2217 return 0;
2218}
2219
davidben281d13f02016-04-27 20:43:282220void SSLClientSocketImpl::LogConnectEndEvent(int rv) {
2221 if (rv != OK) {
mikecirone8b85c432016-09-08 19:11:002222 net_log_.EndEventWithNetErrorCode(NetLogEventType::SSL_CONNECT, rv);
davidben281d13f02016-04-27 20:43:282223 return;
2224 }
2225
mikecirone8b85c432016-09-08 19:11:002226 net_log_.EndEvent(NetLogEventType::SSL_CONNECT,
davidben281d13f02016-04-27 20:43:282227 base::Bind(&NetLogSSLInfoCallback, base::Unretained(this)));
2228}
2229
bncbd442c22016-09-14 20:49:162230void SSLClientSocketImpl::RecordNegotiatedProtocol() const {
2231 UMA_HISTOGRAM_ENUMERATION("Net.SSLNegotiatedAlpnProtocol",
2232 negotiated_protocol_, kProtoLast + 1);
bnc3cf2a592016-08-11 14:48:362233}
2234
2235void SSLClientSocketImpl::RecordChannelIDSupport() const {
2236 // Since this enum is used for a histogram, do not change or re-use values.
2237 enum {
2238 DISABLED = 0,
2239 CLIENT_ONLY = 1,
2240 CLIENT_AND_SERVER = 2,
2241 // CLIENT_NO_ECC is unused now.
2242 // CLIENT_BAD_SYSTEM_TIME is unused now.
2243 CLIENT_BAD_SYSTEM_TIME = 4,
2244 CLIENT_NO_CHANNEL_ID_SERVICE = 5,
2245 CHANNEL_ID_USAGE_MAX
2246 } supported = DISABLED;
2247 if (channel_id_sent_) {
2248 supported = CLIENT_AND_SERVER;
2249 } else if (ssl_config_.channel_id_enabled) {
2250 if (!channel_id_service_)
2251 supported = CLIENT_NO_CHANNEL_ID_SERVICE;
2252 else
2253 supported = CLIENT_ONLY;
2254 }
2255 UMA_HISTOGRAM_ENUMERATION("DomainBoundCerts.Support", supported,
2256 CHANNEL_ID_USAGE_MAX);
2257}
2258
2259bool SSLClientSocketImpl::IsChannelIDEnabled() const {
2260 return ssl_config_.channel_id_enabled && channel_id_service_;
2261}
2262
davidbenfe132d92016-09-27 18:07:212263int SSLClientSocketImpl::MapLastOpenSSLError(
2264 int ssl_error,
2265 const crypto::OpenSSLErrStackTracer& tracer,
2266 OpenSSLErrorInfo* info) {
2267 int net_error = MapOpenSSLErrorWithDetails(ssl_error, tracer, info);
2268
2269 if (ssl_error == SSL_ERROR_SSL &&
2270 ERR_GET_LIB(info->error_code) == ERR_LIB_SSL) {
2271 // TLS does not provide an alert for missing client certificates, so most
2272 // servers send a generic handshake_failure alert. Detect this case by
2273 // checking if we have received a CertificateRequest but sent no
2274 // certificate. See https://crbug.com/646567.
2275 if (ERR_GET_REASON(info->error_code) ==
2276 SSL_R_SSLV3_ALERT_HANDSHAKE_FAILURE &&
2277 certificate_requested_ && ssl_config_.send_client_cert &&
2278 !ssl_config_.client_cert) {
2279 net_error = ERR_BAD_SSL_CLIENT_AUTH_CERT;
2280 }
2281
2282 // Per spec, access_denied is only for client-certificate-based access
2283 // control, but some buggy firewalls use it when blocking a page. To avoid a
2284 // confusing error, map it to a generic protocol error if no
2285 // CertificateRequest was sent. See https://crbug.com/630883.
2286 if (ERR_GET_REASON(info->error_code) == SSL_R_TLSV1_ALERT_ACCESS_DENIED &&
2287 !certificate_requested_) {
2288 net_error = ERR_SSL_PROTOCOL_ERROR;
2289 }
2290 }
2291
2292 return net_error;
2293}
2294
[email protected]7e5dd49f2010-12-08 18:33:492295} // namespace net