blob: 12867ad2e3a3d44dc10e6373c346b4e2af7adfa0 [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"
davidben1d48952e2015-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"
asvitkinec3c93722015-06-17 14:48:3723#include "base/metrics/histogram_macros.h"
davidben4fe4f982015-11-11 22:00:1224#include "base/metrics/sparse_histogram.h"
vadimtb2a77c762014-11-21 19:49:2225#include "base/profiler/scoped_tracker.h"
nharper49b27d992016-02-09 18:28:5126#include "base/strings/string_number_conversions.h"
davidben018aad62014-09-12 02:25:1927#include "base/strings/string_piece.h"
[email protected]20305ec2011-01-21 04:55:5228#include "base/synchronization/lock.h"
vadimt6b43dec22015-01-06 01:59:5829#include "base/threading/thread_local.h"
ssid6d6b40102016-04-05 18:59:5630#include "base/trace_event/trace_event.h"
estade5e5529d2015-05-21 20:59:1131#include "base/values.h"
davidben7dad2a32016-03-01 23:47:4732#include "crypto/auto_cbb.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"
[email protected]cd9b75b2014-07-10 04:39:3835#include "crypto/scoped_openssl_types.h"
martijna2e83bd2016-03-18 13:10:4536#include "net/base/ip_address.h"
[email protected]d518cd92010-09-29 12:27:4437#include "net/base/net_errors.h"
[email protected]6e7845ae2013-03-29 21:48:1138#include "net/cert/cert_verifier.h"
eranmefbd3132014-10-28 16:35:1639#include "net/cert/ct_ev_whitelist.h"
estark6f9b3d82016-01-12 21:37:0540#include "net/cert/ct_policy_enforcer.h"
estark723b5eeb2016-02-18 21:01:1241#include "net/cert/ct_policy_status.h"
davidbeneb5f8ef32014-09-04 14:14:3242#include "net/cert/ct_verifier.h"
[email protected]6e7845ae2013-03-29 21:48:1143#include "net/cert/x509_certificate_net_log_param.h"
davidben30798ed82014-09-19 19:28:2044#include "net/cert/x509_util_openssl.h"
[email protected]8bd4e7a2014-08-09 14:49:1745#include "net/http/transport_security_state.h"
davidbenc879af02015-02-20 07:57:2146#include "net/ssl/scoped_openssl_types.h"
[email protected]536fd0b2013-03-14 17:41:5747#include "net/ssl/ssl_cert_request_info.h"
davidben281d13f02016-04-27 20:43:2848#include "net/ssl/ssl_cipher_suite_names.h"
svaldeze83af292016-04-26 14:33:3749#include "net/ssl/ssl_client_session_cache.h"
[email protected]536fd0b2013-03-14 17:41:5750#include "net/ssl/ssl_connection_status_flags.h"
davidbenf2eaaf92015-05-15 22:18:4251#include "net/ssl/ssl_failure_state.h"
[email protected]536fd0b2013-03-14 17:41:5752#include "net/ssl/ssl_info.h"
davidben1d48952e2015-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
68// Enable this to see logging for state machine state transitions.
69#if 0
svaldeze83af292016-04-26 14:33:3770#define GotoState(s) \
71 do { \
72 DVLOG(2) << (void*)this << " " << __FUNCTION__ << " jump to state " << s; \
73 next_handshake_state_ = s; \
74 } while (0)
[email protected]d518cd92010-09-29 12:27:4475#else
76#define GotoState(s) next_handshake_state_ = s
77#endif
78
[email protected]4b768562013-02-16 04:10:0779// This constant can be any non-negative/non-zero value (eg: it does not
80// overlap with any value of the net::Error range, including net::OK).
davidben1d48952e2015-07-01 18:48:4681const int kNoPendingResult = 1;
[email protected]4b768562013-02-16 04:10:0782
[email protected]168a8412012-06-14 05:05:4983// If a client doesn't have a list of protocols that it supports, but
84// the server supports NPN, choosing "http/1.1" is the best answer.
85const char kDefaultSupportedNPNProtocol[] = "http/1.1";
86
haavardm2d92e722014-12-19 13:45:4487// Default size of the internal BoringSSL buffers.
88const int KDefaultOpenSSLBufferSize = 17 * 1024;
89
nharper736ceda2015-11-07 00:16:5990// TLS extension number use for Token Binding.
nharperb5ad8a802016-02-05 19:40:0091const unsigned int kTbExtNum = 24;
nharper736ceda2015-11-07 00:16:5992
93// Token Binding ProtocolVersions supported.
94const uint8_t kTbProtocolVersionMajor = 0;
nharperb5a0f6c2016-04-04 21:50:3995const uint8_t kTbProtocolVersionMinor = 5;
nharper736ceda2015-11-07 00:16:5996const uint8_t kTbMinProtocolVersionMajor = 0;
nharper47d408a42016-01-28 23:00:3897const uint8_t kTbMinProtocolVersionMinor = 3;
nharper736ceda2015-11-07 00:16:5998
davidben1d48952e2015-07-01 18:48:4699bool EVP_MDToPrivateKeyHash(const EVP_MD* md, SSLPrivateKey::Hash* hash) {
100 switch (EVP_MD_type(md)) {
101 case NID_md5_sha1:
102 *hash = SSLPrivateKey::Hash::MD5_SHA1;
103 return true;
104 case NID_sha1:
105 *hash = SSLPrivateKey::Hash::SHA1;
106 return true;
107 case NID_sha256:
108 *hash = SSLPrivateKey::Hash::SHA256;
109 return true;
110 case NID_sha384:
111 *hash = SSLPrivateKey::Hash::SHA384;
112 return true;
113 case NID_sha512:
114 *hash = SSLPrivateKey::Hash::SHA512;
115 return true;
116 default:
117 return false;
118 }
119}
120
danakj655b66c2016-04-16 00:51:38121std::unique_ptr<base::Value> NetLogPrivateKeyOperationCallback(
davidben752bcf22015-12-21 22:55:50122 SSLPrivateKey::Type type,
123 SSLPrivateKey::Hash hash,
124 NetLogCaptureMode mode) {
125 std::string type_str;
126 switch (type) {
127 case SSLPrivateKey::Type::RSA:
128 type_str = "RSA";
129 break;
130 case SSLPrivateKey::Type::ECDSA:
131 type_str = "ECDSA";
132 break;
133 }
134
135 std::string hash_str;
136 switch (hash) {
137 case SSLPrivateKey::Hash::MD5_SHA1:
138 hash_str = "MD5_SHA1";
139 break;
140 case SSLPrivateKey::Hash::SHA1:
141 hash_str = "SHA1";
142 break;
143 case SSLPrivateKey::Hash::SHA256:
144 hash_str = "SHA256";
145 break;
146 case SSLPrivateKey::Hash::SHA384:
147 hash_str = "SHA384";
148 break;
149 case SSLPrivateKey::Hash::SHA512:
150 hash_str = "SHA512";
151 break;
152 }
153
danakj655b66c2016-04-16 00:51:38154 std::unique_ptr<base::DictionaryValue> value(new base::DictionaryValue);
davidben752bcf22015-12-21 22:55:50155 value->SetString("type", type_str);
156 value->SetString("hash", hash_str);
157 return std::move(value);
158}
159
danakj655b66c2016-04-16 00:51:38160std::unique_ptr<base::Value> NetLogChannelIDLookupCallback(
nharper49b27d992016-02-09 18:28:51161 ChannelIDService* channel_id_service,
162 NetLogCaptureMode capture_mode) {
163 ChannelIDStore* store = channel_id_service->GetChannelIDStore();
danakj655b66c2016-04-16 00:51:38164 std::unique_ptr<base::DictionaryValue> dict(new base::DictionaryValue());
nharper49b27d992016-02-09 18:28:51165 dict->SetBoolean("ephemeral", store->IsEphemeral());
166 dict->SetString("service", base::HexEncode(&channel_id_service,
167 sizeof(channel_id_service)));
168 dict->SetString("store", base::HexEncode(&store, sizeof(store)));
169 return std::move(dict);
170}
171
danakj655b66c2016-04-16 00:51:38172std::unique_ptr<base::Value> NetLogChannelIDLookupCompleteCallback(
nharper49b27d992016-02-09 18:28:51173 crypto::ECPrivateKey* key,
174 int result,
175 NetLogCaptureMode capture_mode) {
danakj655b66c2016-04-16 00:51:38176 std::unique_ptr<base::DictionaryValue> dict(new base::DictionaryValue());
nharper49b27d992016-02-09 18:28:51177 dict->SetInteger("net_error", result);
178 std::string raw_key;
179 if (result == OK && key && key->ExportRawPublicKey(&raw_key)) {
180 std::string key_to_log = "redacted";
181 if (capture_mode.include_cookies_and_credentials()) {
182 key_to_log = base::HexEncode(raw_key.data(), raw_key.length());
183 }
184 dict->SetString("key", key_to_log);
185 }
186 return std::move(dict);
187}
188
davidben281d13f02016-04-27 20:43:28189std::unique_ptr<base::Value> NetLogSSLInfoCallback(
190 SSLClientSocketImpl* socket,
191 NetLogCaptureMode capture_mode) {
192 SSLInfo ssl_info;
193 if (!socket->GetSSLInfo(&ssl_info))
194 return nullptr;
195
196 std::unique_ptr<base::DictionaryValue> dict(new base::DictionaryValue());
197 const char* version_str;
198 SSLVersionToString(&version_str,
199 SSLConnectionStatusToVersion(ssl_info.connection_status));
200 dict->SetString("version", version_str);
201 dict->SetBoolean("is_resumed",
202 ssl_info.handshake_type == SSLInfo::HANDSHAKE_RESUME);
203 dict->SetInteger("cipher_suite", SSLConnectionStatusToCipherSuite(
204 ssl_info.connection_status));
205
206 std::string next_proto;
207 socket->GetNextProto(&next_proto);
208 dict->SetString("next_proto", next_proto);
209
210 return std::move(dict);
211}
212
[email protected]821e3bb2013-11-08 01:06:01213} // namespace
214
svaldeze83af292016-04-26 14:33:37215class SSLClientSocketImpl::SSLContext {
[email protected]fbef13932010-11-23 12:38:53216 public:
olli.raula36aa8be2015-09-10 11:14:22217 static SSLContext* GetInstance() {
218 return base::Singleton<SSLContext>::get();
219 }
[email protected]fbef13932010-11-23 12:38:53220 SSL_CTX* ssl_ctx() { return ssl_ctx_.get(); }
svaldeze83af292016-04-26 14:33:37221 SSLClientSessionCache* session_cache() { return &session_cache_; }
[email protected]fbef13932010-11-23 12:38:53222
svaldeze83af292016-04-26 14:33:37223 SSLClientSocketImpl* GetClientSocketFromSSL(const SSL* ssl) {
[email protected]fbef13932010-11-23 12:38:53224 DCHECK(ssl);
svaldeze83af292016-04-26 14:33:37225 SSLClientSocketImpl* socket = static_cast<SSLClientSocketImpl*>(
[email protected]fbef13932010-11-23 12:38:53226 SSL_get_ex_data(ssl, ssl_socket_data_index_));
227 DCHECK(socket);
228 return socket;
229 }
230
svaldeze83af292016-04-26 14:33:37231 bool SetClientSocketForSSL(SSL* ssl, SSLClientSocketImpl* socket) {
[email protected]fbef13932010-11-23 12:38:53232 return SSL_set_ex_data(ssl, ssl_socket_data_index_, socket) != 0;
233 }
234
davidben2a811e4e2015-12-01 10:49:34235#if !defined(OS_NACL)
236 void SetSSLKeyLogFile(
237 const base::FilePath& path,
238 const scoped_refptr<base::SequencedTaskRunner>& task_runner) {
239 DCHECK(!ssl_key_logger_);
240 ssl_key_logger_.reset(new SSLKeyLogger(path, task_runner));
241 SSL_CTX_set_keylog_callback(ssl_ctx_.get(), KeyLogCallback);
242 }
243#endif
244
davidben1d48952e2015-07-01 18:48:46245 static const SSL_PRIVATE_KEY_METHOD kPrivateKeyMethod;
246
[email protected]fbef13932010-11-23 12:38:53247 private:
olli.raula36aa8be2015-09-10 11:14:22248 friend struct base::DefaultSingletonTraits<SSLContext>;
[email protected]fbef13932010-11-23 12:38:53249
svaldeze83af292016-04-26 14:33:37250 SSLContext() : session_cache_(SSLClientSessionCache::Config()) {
[email protected]4b559b4d2011-04-14 17:37:14251 crypto::EnsureOpenSSLInit();
[email protected]fbef13932010-11-23 12:38:53252 ssl_socket_data_index_ = SSL_get_ex_new_index(0, 0, 0, 0, 0);
253 DCHECK_NE(ssl_socket_data_index_, -1);
254 ssl_ctx_.reset(SSL_CTX_new(SSLv23_client_method()));
[email protected]b051cdb62014-02-28 02:20:16255 SSL_CTX_set_cert_verify_callback(ssl_ctx_.get(), CertVerifyCallback, NULL);
[email protected]82c59022014-08-15 09:38:27256 SSL_CTX_set_cert_cb(ssl_ctx_.get(), ClientCertRequestCallback, NULL);
[email protected]b051cdb62014-02-28 02:20:16257 SSL_CTX_set_verify(ssl_ctx_.get(), SSL_VERIFY_PEER, NULL);
haavardmc80b0ee32015-01-30 09:16:08258 // This stops |SSL_shutdown| from generating the close_notify message, which
259 // is currently not sent on the network.
260 // TODO(haavardm): Remove setting quiet shutdown once 118366 is fixed.
261 SSL_CTX_set_quiet_shutdown(ssl_ctx_.get(), 1);
bnc2d6bd0f2015-10-28 01:52:05262 // Note that SSL_OP_DISABLE_NPN is used to disable NPN if
263 // ssl_config_.next_proto is empty.
[email protected]ea4a1c6a2010-12-09 13:33:28264 SSL_CTX_set_next_proto_select_cb(ssl_ctx_.get(), SelectNextProtoCallback,
265 NULL);
davidbendafe4e52015-04-08 22:53:52266
267 // Disable the internal session cache. Session caching is handled
svaldeze83af292016-04-26 14:33:37268 // externally (i.e. by SSLClientSessionCache).
davidbendafe4e52015-04-08 22:53:52269 SSL_CTX_set_session_cache_mode(
270 ssl_ctx_.get(), SSL_SESS_CACHE_CLIENT | SSL_SESS_CACHE_NO_INTERNAL);
davidben44aeae62015-06-24 20:47:43271 SSL_CTX_sess_set_new_cb(ssl_ctx_.get(), NewSessionCallback);
nharper736ceda2015-11-07 00:16:59272
273 if (!SSL_CTX_add_client_custom_ext(ssl_ctx_.get(), kTbExtNum,
274 &TokenBindingAddCallback,
275 &TokenBindingFreeCallback, nullptr,
276 &TokenBindingParseCallback, nullptr)) {
277 NOTREACHED();
278 }
279 }
280
281 static int TokenBindingAddCallback(SSL* ssl,
282 unsigned int extension_value,
283 const uint8_t** out,
284 size_t* out_len,
285 int* out_alert_value,
286 void* add_arg) {
287 DCHECK_EQ(extension_value, kTbExtNum);
svaldeze83af292016-04-26 14:33:37288 SSLClientSocketImpl* socket =
289 SSLClientSocketImpl::SSLContext::GetInstance()->GetClientSocketFromSSL(
290 ssl);
nharper736ceda2015-11-07 00:16:59291 return socket->TokenBindingAdd(out, out_len, out_alert_value);
292 }
293
294 static void TokenBindingFreeCallback(SSL* ssl,
295 unsigned extension_value,
296 const uint8_t* out,
297 void* add_arg) {
298 DCHECK_EQ(extension_value, kTbExtNum);
299 OPENSSL_free(const_cast<unsigned char*>(out));
300 }
301
302 static int TokenBindingParseCallback(SSL* ssl,
303 unsigned int extension_value,
304 const uint8_t* contents,
305 size_t contents_len,
306 int* out_alert_value,
307 void* parse_arg) {
308 DCHECK_EQ(extension_value, kTbExtNum);
svaldeze83af292016-04-26 14:33:37309 SSLClientSocketImpl* socket =
310 SSLClientSocketImpl::SSLContext::GetInstance()->GetClientSocketFromSSL(
311 ssl);
nharper736ceda2015-11-07 00:16:59312 return socket->TokenBindingParse(contents, contents_len, out_alert_value);
[email protected]fbef13932010-11-23 12:38:53313 }
314
[email protected]82c59022014-08-15 09:38:27315 static int ClientCertRequestCallback(SSL* ssl, void* arg) {
svaldeze83af292016-04-26 14:33:37316 SSLClientSocketImpl* socket = GetInstance()->GetClientSocketFromSSL(ssl);
[email protected]82c59022014-08-15 09:38:27317 DCHECK(socket);
318 return socket->ClientCertRequestCallback(ssl);
[email protected]718c9672010-12-02 10:04:10319 }
320
svaldeze83af292016-04-26 14:33:37321 static int CertVerifyCallback(X509_STORE_CTX* store_ctx, void* arg) {
[email protected]b051cdb62014-02-28 02:20:16322 SSL* ssl = reinterpret_cast<SSL*>(X509_STORE_CTX_get_ex_data(
323 store_ctx, SSL_get_ex_data_X509_STORE_CTX_idx()));
svaldeze83af292016-04-26 14:33:37324 SSLClientSocketImpl* socket = GetInstance()->GetClientSocketFromSSL(ssl);
[email protected]b051cdb62014-02-28 02:20:16325 CHECK(socket);
326
327 return socket->CertVerifyCallback(store_ctx);
328 }
329
[email protected]ea4a1c6a2010-12-09 13:33:28330 static int SelectNextProtoCallback(SSL* ssl,
svaldeze83af292016-04-26 14:33:37331 unsigned char** out,
332 unsigned char* outlen,
[email protected]ea4a1c6a2010-12-09 13:33:28333 const unsigned char* in,
svaldeze83af292016-04-26 14:33:37334 unsigned int inlen,
335 void* arg) {
336 SSLClientSocketImpl* socket = GetInstance()->GetClientSocketFromSSL(ssl);
[email protected]ea4a1c6a2010-12-09 13:33:28337 return socket->SelectNextProtoCallback(out, outlen, in, inlen);
338 }
339
davidben44aeae62015-06-24 20:47:43340 static int NewSessionCallback(SSL* ssl, SSL_SESSION* session) {
svaldeze83af292016-04-26 14:33:37341 SSLClientSocketImpl* socket = GetInstance()->GetClientSocketFromSSL(ssl);
davidben44aeae62015-06-24 20:47:43342 return socket->NewSessionCallback(session);
davidbendafe4e52015-04-08 22:53:52343 }
344
davidben1d48952e2015-07-01 18:48:46345 static int PrivateKeyTypeCallback(SSL* ssl) {
svaldeze83af292016-04-26 14:33:37346 SSLClientSocketImpl* socket = GetInstance()->GetClientSocketFromSSL(ssl);
davidben1d48952e2015-07-01 18:48:46347 return socket->PrivateKeyTypeCallback();
348 }
349
davidben1d48952e2015-07-01 18:48:46350 static size_t PrivateKeyMaxSignatureLenCallback(SSL* ssl) {
svaldeze83af292016-04-26 14:33:37351 SSLClientSocketImpl* socket = GetInstance()->GetClientSocketFromSSL(ssl);
davidben1d48952e2015-07-01 18:48:46352 return socket->PrivateKeyMaxSignatureLenCallback();
353 }
354
355 static ssl_private_key_result_t PrivateKeySignCallback(SSL* ssl,
356 uint8_t* out,
357 size_t* out_len,
358 size_t max_out,
359 const EVP_MD* md,
360 const uint8_t* in,
361 size_t in_len) {
svaldeze83af292016-04-26 14:33:37362 SSLClientSocketImpl* socket = GetInstance()->GetClientSocketFromSSL(ssl);
davidben1d48952e2015-07-01 18:48:46363 return socket->PrivateKeySignCallback(out, out_len, max_out, md, in,
364 in_len);
365 }
366
367 static ssl_private_key_result_t PrivateKeySignCompleteCallback(
368 SSL* ssl,
369 uint8_t* out,
370 size_t* out_len,
371 size_t max_out) {
svaldeze83af292016-04-26 14:33:37372 SSLClientSocketImpl* socket = GetInstance()->GetClientSocketFromSSL(ssl);
davidben1d48952e2015-07-01 18:48:46373 return socket->PrivateKeySignCompleteCallback(out, out_len, max_out);
374 }
375
davidben2a811e4e2015-12-01 10:49:34376#if !defined(OS_NACL)
377 static void KeyLogCallback(const SSL* ssl, const char* line) {
378 GetInstance()->ssl_key_logger_->WriteLine(line);
379 }
380#endif
381
[email protected]fbef13932010-11-23 12:38:53382 // This is the index used with SSL_get_ex_data to retrieve the owner
svaldeze83af292016-04-26 14:33:37383 // SSLClientSocketImpl object from an SSL instance.
[email protected]fbef13932010-11-23 12:38:53384 int ssl_socket_data_index_;
385
davidbenc879af02015-02-20 07:57:21386 ScopedSSL_CTX ssl_ctx_;
davidbendafe4e52015-04-08 22:53:52387
davidben2a811e4e2015-12-01 10:49:34388#if !defined(OS_NACL)
danakj655b66c2016-04-16 00:51:38389 std::unique_ptr<SSLKeyLogger> ssl_key_logger_;
davidben2a811e4e2015-12-01 10:49:34390#endif
391
davidbendafe4e52015-04-08 22:53:52392 // TODO(davidben): Use a separate cache per URLRequestContext.
393 // https://crbug.com/458365
394 //
395 // TODO(davidben): Sessions should be invalidated on fatal
396 // alerts. https://crbug.com/466352
svaldeze83af292016-04-26 14:33:37397 SSLClientSessionCache session_cache_;
[email protected]1279de12013-12-03 15:13:32398};
399
davidben1d48952e2015-07-01 18:48:46400const SSL_PRIVATE_KEY_METHOD
svaldeze83af292016-04-26 14:33:37401 SSLClientSocketImpl::SSLContext::kPrivateKeyMethod = {
402 &SSLClientSocketImpl::SSLContext::PrivateKeyTypeCallback,
403 &SSLClientSocketImpl::SSLContext::PrivateKeyMaxSignatureLenCallback,
404 &SSLClientSocketImpl::SSLContext::PrivateKeySignCallback,
405 &SSLClientSocketImpl::SSLContext::PrivateKeySignCompleteCallback,
davidben1d48952e2015-07-01 18:48:46406};
407
[email protected]7f38da8a2014-03-17 16:44:26408// PeerCertificateChain is a helper object which extracts the certificate
409// chain, as given by the server, from an OpenSSL socket and performs the needed
410// resource management. The first element of the chain is the leaf certificate
411// and the other elements are in the order given by the server.
svaldeze83af292016-04-26 14:33:37412class SSLClientSocketImpl::PeerCertificateChain {
[email protected]7f38da8a2014-03-17 16:44:26413 public:
svaldeze83af292016-04-26 14:33:37414 explicit PeerCertificateChain(STACK_OF(X509) * chain) { Reset(chain); }
[email protected]7f38da8a2014-03-17 16:44:26415 PeerCertificateChain(const PeerCertificateChain& other) { *this = other; }
416 ~PeerCertificateChain() {}
417 PeerCertificateChain& operator=(const PeerCertificateChain& other);
418
[email protected]76e85392014-03-20 17:54:14419 // Resets the PeerCertificateChain to the set of certificates in|chain|,
420 // which may be NULL, indicating to empty the store certificates.
421 // Note: If an error occurs, such as being unable to parse the certificates,
422 // this will behave as if Reset(NULL) was called.
svaldeze83af292016-04-26 14:33:37423 void Reset(STACK_OF(X509) * chain);
[email protected]76e85392014-03-20 17:54:14424
svaldez2135be52016-04-20 16:34:53425 // Note that when USE_OPENSSL_CERTS is defined, OSCertHandle is X509*
davidben30798ed82014-09-19 19:28:20426 scoped_refptr<X509Certificate> AsOSChain() const;
[email protected]7f38da8a2014-03-17 16:44:26427
428 size_t size() const {
429 if (!openssl_chain_.get())
430 return 0;
431 return sk_X509_num(openssl_chain_.get());
432 }
433
svaldeze83af292016-04-26 14:33:37434 bool empty() const { return size() == 0; }
davidben30798ed82014-09-19 19:28:20435
436 X509* Get(size_t index) const {
[email protected]7f38da8a2014-03-17 16:44:26437 DCHECK_LT(index, size());
438 return sk_X509_value(openssl_chain_.get(), index);
439 }
440
441 private:
[email protected]cd9b75b2014-07-10 04:39:38442 ScopedX509Stack openssl_chain_;
[email protected]7f38da8a2014-03-17 16:44:26443};
444
svaldeze83af292016-04-26 14:33:37445SSLClientSocketImpl::PeerCertificateChain&
446SSLClientSocketImpl::PeerCertificateChain::operator=(
[email protected]7f38da8a2014-03-17 16:44:26447 const PeerCertificateChain& other) {
448 if (this == &other)
449 return *this;
450
[email protected]24176af2014-08-14 09:31:04451 openssl_chain_.reset(X509_chain_up_ref(other.openssl_chain_.get()));
[email protected]7f38da8a2014-03-17 16:44:26452 return *this;
453}
454
svaldeze83af292016-04-26 14:33:37455void SSLClientSocketImpl::PeerCertificateChain::Reset(STACK_OF(X509) * chain) {
davidben30798ed82014-09-19 19:28:20456 openssl_chain_.reset(chain ? X509_chain_up_ref(chain) : NULL);
[email protected]7f38da8a2014-03-17 16:44:26457}
[email protected]7f38da8a2014-03-17 16:44:26458
davidben30798ed82014-09-19 19:28:20459scoped_refptr<X509Certificate>
svaldeze83af292016-04-26 14:33:37460SSLClientSocketImpl::PeerCertificateChain::AsOSChain() const {
davidben30798ed82014-09-19 19:28:20461#if defined(USE_OPENSSL_CERTS)
462 // When OSCertHandle is typedef'ed to X509, this implementation does a short
463 // cut to avoid converting back and forth between DER and the X509 struct.
464 X509Certificate::OSCertHandles intermediates;
465 for (size_t i = 1; i < sk_X509_num(openssl_chain_.get()); ++i) {
466 intermediates.push_back(sk_X509_value(openssl_chain_.get(), i));
467 }
[email protected]7f38da8a2014-03-17 16:44:26468
svaldezc4b6f122016-01-20 22:13:59469 return X509Certificate::CreateFromHandle(
470 sk_X509_value(openssl_chain_.get(), 0), intermediates);
davidben30798ed82014-09-19 19:28:20471#else
472 // DER-encode the chain and convert to a platform certificate handle.
[email protected]7f38da8a2014-03-17 16:44:26473 std::vector<base::StringPiece> der_chain;
[email protected]edfd0f42014-07-22 18:20:37474 for (size_t i = 0; i < sk_X509_num(openssl_chain_.get()); ++i) {
[email protected]7f38da8a2014-03-17 16:44:26475 X509* x = sk_X509_value(openssl_chain_.get(), i);
davidben30798ed82014-09-19 19:28:20476 base::StringPiece der;
477 if (!x509_util::GetDER(x, &der))
478 return NULL;
479 der_chain.push_back(der);
[email protected]7f38da8a2014-03-17 16:44:26480 }
481
svaldezc4b6f122016-01-20 22:13:59482 return X509Certificate::CreateFromDERCertChain(der_chain);
davidben30798ed82014-09-19 19:28:20483#endif
[email protected]7f38da8a2014-03-17 16:44:26484}
[email protected]7f38da8a2014-03-17 16:44:26485
[email protected]1279de12013-12-03 15:13:32486// static
[email protected]c3456bb2011-12-12 22:22:19487void SSLClientSocket::ClearSessionCache() {
svaldeze83af292016-04-26 14:33:37488 SSLClientSocketImpl::SSLContext* context =
489 SSLClientSocketImpl::SSLContext::GetInstance();
[email protected]c3456bb2011-12-12 22:22:19490 context->session_cache()->Flush();
491}
492
svaldeze83af292016-04-26 14:33:37493SSLClientSocketImpl::SSLClientSocketImpl(
danakj655b66c2016-04-16 00:51:38494 std::unique_ptr<ClientSocketHandle> transport_socket,
[email protected]055d7f22010-11-15 12:03:12495 const HostPortPair& host_and_port,
[email protected]822581d2010-12-16 17:27:15496 const SSLConfig& ssl_config,
[email protected]feb79bcd2011-07-21 16:55:17497 const SSLClientSocketContext& context)
[email protected]83039bb2011-12-09 18:43:55498 : transport_send_busy_(false),
[email protected]d518cd92010-09-29 12:27:44499 transport_recv_busy_(false),
davidben1d48952e2015-07-01 18:48:46500 pending_read_error_(kNoPendingResult),
davidbenb8c23212014-10-28 00:12:16501 pending_read_ssl_error_(SSL_ERROR_NONE),
[email protected]5aea79182014-07-14 20:43:41502 transport_read_error_(OK),
[email protected]3e5c6922014-02-06 02:42:16503 transport_write_error_(OK),
[email protected]7f38da8a2014-03-17 16:44:26504 server_cert_chain_(new PeerCertificateChain(NULL)),
[email protected]64b5c892014-08-08 09:39:26505 completed_connect_(false),
[email protected]0dc88b32014-03-26 20:12:28506 was_ever_used_(false),
[email protected]feb79bcd2011-07-21 16:55:17507 cert_verifier_(context.cert_verifier),
davidbeneb5f8ef32014-09-04 14:14:32508 cert_transparency_verifier_(context.cert_transparency_verifier),
[email protected]6b8a3c742014-07-25 00:25:35509 channel_id_service_(context.channel_id_service),
nharper736ceda2015-11-07 00:16:59510 tb_was_negotiated_(false),
511 tb_negotiated_param_(TB_PARAM_ECDSAP256),
nharperb7441ef2016-01-25 23:54:14512 tb_signed_ekm_map_(10),
[email protected]d518cd92010-09-29 12:27:44513 ssl_(NULL),
514 transport_bio_(NULL),
dchengc7eeda422015-12-26 03:56:48515 transport_(std::move(transport_socket)),
[email protected]055d7f22010-11-15 12:03:12516 host_and_port_(host_and_port),
[email protected]d518cd92010-09-29 12:27:44517 ssl_config_(ssl_config),
[email protected]c3456bb2011-12-12 22:22:19518 ssl_session_cache_shard_(context.ssl_session_cache_shard),
[email protected]013c17c2012-01-21 19:09:01519 next_handshake_state_(STATE_NONE),
svaldez4af14d22015-08-20 13:48:24520 disconnected_(false),
[email protected]ea4a1c6a2010-12-09 13:33:28521 npn_status_(kNextProtoUnsupported),
davidben52053b382015-04-27 19:22:29522 channel_id_sent_(false),
davidben44aeae62015-06-24 20:47:43523 session_pending_(false),
davidbendafe4e52015-04-08 22:53:52524 certificate_verified_(false),
davidbenf2eaaf92015-05-15 22:18:42525 ssl_failure_state_(SSL_FAILURE_NONE),
davidben1d48952e2015-07-01 18:48:46526 signature_result_(kNoPendingResult),
[email protected]8bd4e7a2014-08-09 14:49:17527 transport_security_state_(context.transport_security_state),
estark6f9b3d82016-01-12 21:37:05528 policy_enforcer_(context.ct_policy_enforcer),
kulkarni.acd7b4462014-08-28 07:41:34529 net_log_(transport_->socket()->NetLog()),
530 weak_factory_(this) {
davidben9bbf3292015-04-24 21:50:06531 DCHECK(cert_verifier_);
[email protected]8e458552014-08-05 00:02:15532}
[email protected]d518cd92010-09-29 12:27:44533
svaldeze83af292016-04-26 14:33:37534SSLClientSocketImpl::~SSLClientSocketImpl() {
[email protected]d518cd92010-09-29 12:27:44535 Disconnect();
536}
537
davidben2a811e4e2015-12-01 10:49:34538#if !defined(OS_NACL)
svaldeze83af292016-04-26 14:33:37539void SSLClientSocketImpl::SetSSLKeyLogFile(
davidben2a811e4e2015-12-01 10:49:34540 const base::FilePath& ssl_keylog_file,
541 const scoped_refptr<base::SequencedTaskRunner>& task_runner) {
542 SSLContext::GetInstance()->SetSSLKeyLogFile(ssl_keylog_file, task_runner);
zhongyi81f85c6d92015-10-16 19:34:14543}
davidben2a811e4e2015-12-01 10:49:34544#endif
zhongyi81f85c6d92015-10-16 19:34:14545
svaldeze83af292016-04-26 14:33:37546void SSLClientSocketImpl::GetSSLCertRequestInfo(
[email protected]b9b651f2013-11-09 04:32:22547 SSLCertRequestInfo* cert_request_info) {
[email protected]791879c2013-12-17 07:22:41548 cert_request_info->host_and_port = host_and_port_;
[email protected]b9b651f2013-11-09 04:32:22549 cert_request_info->cert_authorities = cert_authorities_;
[email protected]c0787702014-05-20 21:51:44550 cert_request_info->cert_key_types = cert_key_types_;
[email protected]b9b651f2013-11-09 04:32:22551}
552
svaldeze83af292016-04-26 14:33:37553SSLClientSocket::NextProtoStatus SSLClientSocketImpl::GetNextProto(
davidben6974bf72015-04-27 17:52:48554 std::string* proto) const {
[email protected]b9b651f2013-11-09 04:32:22555 *proto = npn_proto_;
[email protected]b9b651f2013-11-09 04:32:22556 return npn_status_;
557}
558
svaldeze83af292016-04-26 14:33:37559ChannelIDService* SSLClientSocketImpl::GetChannelIDService() const {
[email protected]6b8a3c742014-07-25 00:25:35560 return channel_id_service_;
[email protected]b9b651f2013-11-09 04:32:22561}
562
svaldeze83af292016-04-26 14:33:37563Error SSLClientSocketImpl::GetSignedEKMForTokenBinding(
nharperb7441ef2016-01-25 23:54:14564 crypto::ECPrivateKey* key,
565 std::vector<uint8_t>* out) {
566 // The same key will be used across multiple requests to sign the same value,
567 // so the signature is cached.
568 std::string raw_public_key;
569 if (!key->ExportRawPublicKey(&raw_public_key))
570 return ERR_FAILED;
571 SignedEkmMap::iterator it = tb_signed_ekm_map_.Get(raw_public_key);
572 if (it != tb_signed_ekm_map_.end()) {
573 *out = it->second;
574 return OK;
575 }
576
577 uint8_t tb_ekm_buf[32];
578 static const char kTokenBindingExporterLabel[] = "EXPORTER-Token-Binding";
579 if (!SSL_export_keying_material(ssl_, tb_ekm_buf, sizeof(tb_ekm_buf),
580 kTokenBindingExporterLabel,
581 strlen(kTokenBindingExporterLabel), nullptr,
582 0, false /* no context */)) {
583 return ERR_FAILED;
584 }
585
nharperd5cddca2016-02-27 03:37:52586 if (!SignTokenBindingEkm(
587 base::StringPiece(reinterpret_cast<char*>(tb_ekm_buf),
588 sizeof(tb_ekm_buf)),
589 key, out))
nharperb7441ef2016-01-25 23:54:14590 return ERR_FAILED;
nharperb7441ef2016-01-25 23:54:14591
592 tb_signed_ekm_map_.Put(raw_public_key, *out);
593 return OK;
594}
595
svaldeze83af292016-04-26 14:33:37596crypto::ECPrivateKey* SSLClientSocketImpl::GetChannelIDKey() const {
nharperb36644f2016-02-22 23:14:43597 return channel_id_key_.get();
598}
599
svaldeze83af292016-04-26 14:33:37600SSLFailureState SSLClientSocketImpl::GetSSLFailureState() const {
davidbenf2eaaf92015-05-15 22:18:42601 return ssl_failure_state_;
602}
603
svaldeze83af292016-04-26 14:33:37604int SSLClientSocketImpl::ExportKeyingMaterial(const base::StringPiece& label,
605 bool has_context,
606 const base::StringPiece& context,
607 unsigned char* out,
608 unsigned int outlen) {
davidben86935f72015-05-06 22:24:49609 if (!IsConnected())
610 return ERR_SOCKET_NOT_CONNECTED;
611
[email protected]b9b651f2013-11-09 04:32:22612 crypto::OpenSSLErrStackTracer err_tracer(FROM_HERE);
613
614 int rv = SSL_export_keying_material(
[email protected]c8a80e92014-05-17 16:02:08615 ssl_, out, outlen, label.data(), label.size(),
davidben866c3d4a72015-04-06 21:56:43616 reinterpret_cast<const unsigned char*>(context.data()), context.length(),
617 has_context ? 1 : 0);
[email protected]b9b651f2013-11-09 04:32:22618
619 if (rv != 1) {
620 int ssl_error = SSL_get_error(ssl_, rv);
621 LOG(ERROR) << "Failed to export keying material;"
svaldeze83af292016-04-26 14:33:37622 << " returned " << rv << ", SSL error code " << ssl_error;
[email protected]b9b651f2013-11-09 04:32:22623 return MapOpenSSLError(ssl_error, err_tracer);
624 }
625 return OK;
626}
627
svaldeze83af292016-04-26 14:33:37628int SSLClientSocketImpl::Connect(const CompletionCallback& callback) {
[email protected]8bd4e7a2014-08-09 14:49:17629 // It is an error to create an SSLClientSocket whose context has no
630 // TransportSecurityState.
631 DCHECK(transport_security_state_);
632
svaldez4af14d22015-08-20 13:48:24633 // Although StreamSocket does allow calling Connect() after Disconnect(),
634 // this has never worked for layered sockets. CHECK to detect any consumers
635 // reconnecting an SSL socket.
636 //
637 // TODO(davidben,mmenke): Remove this API feature. See
638 // https://crbug.com/499289.
639 CHECK(!disconnected_);
640
[email protected]b9b651f2013-11-09 04:32:22641 net_log_.BeginEvent(NetLog::TYPE_SSL_CONNECT);
642
643 // Set up new ssl object.
[email protected]c8a80e92014-05-17 16:02:08644 int rv = Init();
645 if (rv != OK) {
davidben281d13f02016-04-27 20:43:28646 LogConnectEndEvent(rv);
[email protected]c8a80e92014-05-17 16:02:08647 return rv;
[email protected]b9b651f2013-11-09 04:32:22648 }
649
650 // Set SSL to client mode. Handshake happens in the loop below.
651 SSL_set_connect_state(ssl_);
652
653 GotoState(STATE_HANDSHAKE);
[email protected]c8a80e92014-05-17 16:02:08654 rv = DoHandshakeLoop(OK);
[email protected]b9b651f2013-11-09 04:32:22655 if (rv == ERR_IO_PENDING) {
656 user_connect_callback_ = callback;
657 } else {
davidben281d13f02016-04-27 20:43:28658 LogConnectEndEvent(rv);
[email protected]b9b651f2013-11-09 04:32:22659 }
660
661 return rv > OK ? OK : rv;
662}
663
svaldeze83af292016-04-26 14:33:37664void SSLClientSocketImpl::Disconnect() {
davidbened3764bb2016-03-14 19:53:16665 crypto::OpenSSLErrStackTracer tracer(FROM_HERE);
666
[email protected]b9b651f2013-11-09 04:32:22667 if (ssl_) {
668 // Calling SSL_shutdown prevents the session from being marked as
669 // unresumable.
670 SSL_shutdown(ssl_);
671 SSL_free(ssl_);
672 ssl_ = NULL;
673 }
674 if (transport_bio_) {
675 BIO_free_all(transport_bio_);
676 transport_bio_ = NULL;
677 }
678
svaldez4af14d22015-08-20 13:48:24679 disconnected_ = true;
680
[email protected]b9b651f2013-11-09 04:32:22681 // Shut down anything that may call us back.
eroman7f9236a2015-05-11 21:23:43682 cert_verifier_request_.reset();
[email protected]b9b651f2013-11-09 04:32:22683 transport_->socket()->Disconnect();
684
685 // Null all callbacks, delete all buffers.
686 transport_send_busy_ = false;
687 send_buffer_ = NULL;
688 transport_recv_busy_ = false;
[email protected]b9b651f2013-11-09 04:32:22689 recv_buffer_ = NULL;
690
691 user_connect_callback_.Reset();
692 user_read_callback_.Reset();
693 user_write_callback_.Reset();
svaldeze83af292016-04-26 14:33:37694 user_read_buf_ = NULL;
695 user_read_buf_len_ = 0;
696 user_write_buf_ = NULL;
697 user_write_buf_len_ = 0;
[email protected]b9b651f2013-11-09 04:32:22698
davidben1d48952e2015-07-01 18:48:46699 pending_read_error_ = kNoPendingResult;
davidbenb8c23212014-10-28 00:12:16700 pending_read_ssl_error_ = SSL_ERROR_NONE;
701 pending_read_error_info_ = OpenSSLErrorInfo();
702
[email protected]5aea79182014-07-14 20:43:41703 transport_read_error_ = OK;
[email protected]3e5c6922014-02-06 02:42:16704 transport_write_error_ = OK;
705
[email protected]b9b651f2013-11-09 04:32:22706 server_cert_verify_result_.Reset();
[email protected]64b5c892014-08-08 09:39:26707 completed_connect_ = false;
[email protected]b9b651f2013-11-09 04:32:22708
709 cert_authorities_.clear();
[email protected]c0787702014-05-20 21:51:44710 cert_key_types_.clear();
[email protected]faff9852014-06-21 06:13:46711
davidben09c3d072014-08-25 20:33:58712 start_cert_verification_time_ = base::TimeTicks();
713
[email protected]abc44b752014-07-30 03:52:15714 npn_status_ = kNextProtoUnsupported;
715 npn_proto_.clear();
716
davidben52053b382015-04-27 19:22:29717 channel_id_sent_ = false;
nharper736ceda2015-11-07 00:16:59718 tb_was_negotiated_ = false;
davidben44aeae62015-06-24 20:47:43719 session_pending_ = false;
davidbenf2eaaf92015-05-15 22:18:42720 certificate_verified_ = false;
nharper75ade892015-06-10 19:05:35721 channel_id_request_.Cancel();
davidbenf2eaaf92015-05-15 22:18:42722 ssl_failure_state_ = SSL_FAILURE_NONE;
davidben1d48952e2015-07-01 18:48:46723
davidben1d48952e2015-07-01 18:48:46724 signature_result_ = kNoPendingResult;
725 signature_.clear();
[email protected]b9b651f2013-11-09 04:32:22726}
727
svaldeze83af292016-04-26 14:33:37728bool SSLClientSocketImpl::IsConnected() const {
[email protected]b9b651f2013-11-09 04:32:22729 // If the handshake has not yet completed.
[email protected]64b5c892014-08-08 09:39:26730 if (!completed_connect_)
[email protected]b9b651f2013-11-09 04:32:22731 return false;
732 // If an asynchronous operation is still pending.
733 if (user_read_buf_.get() || user_write_buf_.get())
734 return true;
735
736 return transport_->socket()->IsConnected();
737}
738
svaldeze83af292016-04-26 14:33:37739bool SSLClientSocketImpl::IsConnectedAndIdle() const {
[email protected]b9b651f2013-11-09 04:32:22740 // If the handshake has not yet completed.
[email protected]64b5c892014-08-08 09:39:26741 if (!completed_connect_)
[email protected]b9b651f2013-11-09 04:32:22742 return false;
743 // If an asynchronous operation is still pending.
744 if (user_read_buf_.get() || user_write_buf_.get())
745 return false;
davidbenfc9a6b82015-04-15 23:47:32746
747 // If there is data read from the network that has not yet been consumed, do
748 // not treat the connection as idle.
749 //
750 // Note that this does not check |BIO_pending|, whether there is ciphertext
751 // that has not yet been flushed to the network. |Write| returns early, so
752 // this can cause race conditions which cause a socket to not be treated
753 // reusable when it should be. See https://crbug.com/466147.
754 if (BIO_wpending(transport_bio_) > 0)
[email protected]b9b651f2013-11-09 04:32:22755 return false;
[email protected]b9b651f2013-11-09 04:32:22756
757 return transport_->socket()->IsConnectedAndIdle();
758}
759
svaldeze83af292016-04-26 14:33:37760int SSLClientSocketImpl::GetPeerAddress(IPEndPoint* addressList) const {
[email protected]b9b651f2013-11-09 04:32:22761 return transport_->socket()->GetPeerAddress(addressList);
762}
763
svaldeze83af292016-04-26 14:33:37764int SSLClientSocketImpl::GetLocalAddress(IPEndPoint* addressList) const {
[email protected]b9b651f2013-11-09 04:32:22765 return transport_->socket()->GetLocalAddress(addressList);
766}
767
svaldeze83af292016-04-26 14:33:37768const BoundNetLog& SSLClientSocketImpl::NetLog() const {
[email protected]b9b651f2013-11-09 04:32:22769 return net_log_;
770}
771
svaldeze83af292016-04-26 14:33:37772void SSLClientSocketImpl::SetSubresourceSpeculation() {
[email protected]b9b651f2013-11-09 04:32:22773 if (transport_.get() && transport_->socket()) {
774 transport_->socket()->SetSubresourceSpeculation();
775 } else {
776 NOTREACHED();
777 }
778}
779
svaldeze83af292016-04-26 14:33:37780void SSLClientSocketImpl::SetOmniboxSpeculation() {
[email protected]b9b651f2013-11-09 04:32:22781 if (transport_.get() && transport_->socket()) {
782 transport_->socket()->SetOmniboxSpeculation();
783 } else {
784 NOTREACHED();
785 }
786}
787
svaldeze83af292016-04-26 14:33:37788bool SSLClientSocketImpl::WasEverUsed() const {
[email protected]0dc88b32014-03-26 20:12:28789 return was_ever_used_;
[email protected]b9b651f2013-11-09 04:32:22790}
791
svaldeze83af292016-04-26 14:33:37792bool SSLClientSocketImpl::GetSSLInfo(SSLInfo* ssl_info) {
[email protected]b9b651f2013-11-09 04:32:22793 ssl_info->Reset();
davidben30798ed82014-09-19 19:28:20794 if (server_cert_chain_->empty())
[email protected]b9b651f2013-11-09 04:32:22795 return false;
796
797 ssl_info->cert = server_cert_verify_result_.verified_cert;
estark03d644f2015-06-13 00:11:32798 ssl_info->unverified_cert = server_cert_;
[email protected]b9b651f2013-11-09 04:32:22799 ssl_info->cert_status = server_cert_verify_result_.cert_status;
800 ssl_info->is_issued_by_known_root =
801 server_cert_verify_result_.is_issued_by_known_root;
svaldeze83af292016-04-26 14:33:37802 ssl_info->public_key_hashes = server_cert_verify_result_.public_key_hashes;
[email protected]b9b651f2013-11-09 04:32:22803 ssl_info->client_cert_sent =
804 ssl_config_.send_client_cert && ssl_config_.client_cert.get();
davidben52053b382015-04-27 19:22:29805 ssl_info->channel_id_sent = channel_id_sent_;
nharper736ceda2015-11-07 00:16:59806 ssl_info->token_binding_negotiated = tb_was_negotiated_;
807 ssl_info->token_binding_key_param = tb_negotiated_param_;
[email protected]8bd4e7a2014-08-09 14:49:17808 ssl_info->pinning_failure_log = pinning_failure_log_;
[email protected]b9b651f2013-11-09 04:32:22809
estark723b5eeb2016-02-18 21:01:12810 AddCTInfoToSSLInfo(ssl_info);
davidbeneb5f8ef32014-09-04 14:14:32811
[email protected]b9b651f2013-11-09 04:32:22812 const SSL_CIPHER* cipher = SSL_get_current_cipher(ssl_);
813 CHECK(cipher);
814 ssl_info->security_bits = SSL_CIPHER_get_bits(cipher, NULL);
sigbjorn79cf3722015-09-18 09:15:20815 ssl_info->key_exchange_info =
816 SSL_SESSION_get_key_exchange_info(SSL_get_session(ssl_));
[email protected]b9b651f2013-11-09 04:32:22817
ryanchung987b2ff2016-02-19 00:17:12818 SSLConnectionStatusSetCipherSuite(
819 static_cast<uint16_t>(SSL_CIPHER_get_id(cipher)),
820 &ssl_info->connection_status);
821 SSLConnectionStatusSetVersion(GetNetSSLVersion(ssl_),
822 &ssl_info->connection_status);
[email protected]b9b651f2013-11-09 04:32:22823
davidben09c3d072014-08-25 20:33:58824 if (!SSL_get_secure_renegotiation_support(ssl_))
[email protected]b9b651f2013-11-09 04:32:22825 ssl_info->connection_status |= SSL_CONNECTION_NO_RENEGOTIATION_EXTENSION;
[email protected]b9b651f2013-11-09 04:32:22826
827 if (ssl_config_.version_fallback)
828 ssl_info->connection_status |= SSL_CONNECTION_VERSION_FALLBACK;
829
svaldeze83af292016-04-26 14:33:37830 ssl_info->handshake_type = SSL_session_reused(ssl_)
831 ? SSLInfo::HANDSHAKE_RESUME
832 : SSLInfo::HANDSHAKE_FULL;
[email protected]b9b651f2013-11-09 04:32:22833
834 DVLOG(3) << "Encoded connection status: cipher suite = "
svaldeze83af292016-04-26 14:33:37835 << SSLConnectionStatusToCipherSuite(ssl_info->connection_status)
836 << " version = "
837 << SSLConnectionStatusToVersion(ssl_info->connection_status);
[email protected]b9b651f2013-11-09 04:32:22838 return true;
839}
840
svaldeze83af292016-04-26 14:33:37841void SSLClientSocketImpl::GetConnectionAttempts(ConnectionAttempts* out) const {
ttuttle23fdb7b2015-05-15 01:28:03842 out->clear();
843}
844
svaldeze83af292016-04-26 14:33:37845int64_t SSLClientSocketImpl::GetTotalReceivedBytes() const {
tbansalf82cc8e2015-10-14 20:05:49846 return transport_->socket()->GetTotalReceivedBytes();
847}
848
svaldeze83af292016-04-26 14:33:37849int SSLClientSocketImpl::Read(IOBuffer* buf,
850 int buf_len,
851 const CompletionCallback& callback) {
[email protected]b9b651f2013-11-09 04:32:22852 user_read_buf_ = buf;
853 user_read_buf_len_ = buf_len;
854
davidben1b133ad2014-10-23 04:23:13855 int rv = DoReadLoop();
[email protected]b9b651f2013-11-09 04:32:22856
857 if (rv == ERR_IO_PENDING) {
858 user_read_callback_ = callback;
859 } else {
[email protected]0dc88b32014-03-26 20:12:28860 if (rv > 0)
861 was_ever_used_ = true;
[email protected]b9b651f2013-11-09 04:32:22862 user_read_buf_ = NULL;
863 user_read_buf_len_ = 0;
864 }
865
866 return rv;
867}
868
svaldeze83af292016-04-26 14:33:37869int SSLClientSocketImpl::Write(IOBuffer* buf,
870 int buf_len,
871 const CompletionCallback& callback) {
[email protected]b9b651f2013-11-09 04:32:22872 user_write_buf_ = buf;
873 user_write_buf_len_ = buf_len;
874
davidben1b133ad2014-10-23 04:23:13875 int rv = DoWriteLoop();
[email protected]b9b651f2013-11-09 04:32:22876
877 if (rv == ERR_IO_PENDING) {
878 user_write_callback_ = callback;
879 } else {
[email protected]0dc88b32014-03-26 20:12:28880 if (rv > 0)
881 was_ever_used_ = true;
[email protected]b9b651f2013-11-09 04:32:22882 user_write_buf_ = NULL;
883 user_write_buf_len_ = 0;
884 }
885
886 return rv;
887}
888
svaldeze83af292016-04-26 14:33:37889int SSLClientSocketImpl::SetReceiveBufferSize(int32_t size) {
[email protected]b9b651f2013-11-09 04:32:22890 return transport_->socket()->SetReceiveBufferSize(size);
891}
892
svaldeze83af292016-04-26 14:33:37893int SSLClientSocketImpl::SetSendBufferSize(int32_t size) {
[email protected]b9b651f2013-11-09 04:32:22894 return transport_->socket()->SetSendBufferSize(size);
895}
896
svaldeze83af292016-04-26 14:33:37897int SSLClientSocketImpl::Init() {
[email protected]9e733f32010-10-04 18:19:08898 DCHECK(!ssl_);
899 DCHECK(!transport_bio_);
900
svaldez2135be52016-04-20 16:34:53901#if defined(USE_NSS_CERTS)
davidbena477a70a2015-10-06 04:38:29902 if (ssl_config_.cert_io_enabled) {
903 // TODO(davidben): Move this out of SSLClientSocket. See
904 // https://crbug.com/539520.
905 EnsureNSSHttpIOInit();
906 }
907#endif
908
[email protected]b29af7d2010-12-14 11:52:47909 SSLContext* context = SSLContext::GetInstance();
[email protected]4b559b4d2011-04-14 17:37:14910 crypto::OpenSSLErrStackTracer err_tracer(FROM_HERE);
[email protected]d518cd92010-09-29 12:27:44911
[email protected]fbef13932010-11-23 12:38:53912 ssl_ = SSL_new(context->ssl_ctx());
913 if (!ssl_ || !context->SetClientSocketForSSL(ssl_, this))
[email protected]c8a80e92014-05-17 16:02:08914 return ERR_UNEXPECTED;
[email protected]fbef13932010-11-23 12:38:53915
davidben9bc0466f2015-06-16 22:21:27916 // SNI should only contain valid DNS hostnames, not IP addresses (see RFC
917 // 6066, Section 3).
918 //
919 // TODO(rsleevi): Should this code allow hostnames that violate the LDH rule?
920 // See https://crbug.com/496472 and https://crbug.com/496468 for discussion.
martijna2e83bd2016-03-18 13:10:45921 IPAddress unused;
922 if (!unused.AssignFromIPLiteral(host_and_port_.host()) &&
davidben9bc0466f2015-06-16 22:21:27923 !SSL_set_tlsext_host_name(ssl_, host_and_port_.host().c_str())) {
[email protected]c8a80e92014-05-17 16:02:08924 return ERR_UNEXPECTED;
davidben9bc0466f2015-06-16 22:21:27925 }
[email protected]fbef13932010-11-23 12:38:53926
davidbenf4c9a6122015-10-20 02:45:29927 ScopedSSL_SESSION session =
928 context->session_cache()->Lookup(GetSessionCacheKey());
929 if (session)
930 SSL_set_session(ssl_, session.get());
[email protected]d518cd92010-09-29 12:27:44931
haavardm2d92e722014-12-19 13:45:44932 send_buffer_ = new GrowableIOBuffer();
933 send_buffer_->SetCapacity(KDefaultOpenSSLBufferSize);
934 recv_buffer_ = new GrowableIOBuffer();
935 recv_buffer_->SetCapacity(KDefaultOpenSSLBufferSize);
936
[email protected]d518cd92010-09-29 12:27:44937 BIO* ssl_bio = NULL;
haavardm2d92e722014-12-19 13:45:44938
svaldeze83af292016-04-26 14:33:37939 // SSLClientSocketImpl retains ownership of the BIO buffers.
haavardm2d92e722014-12-19 13:45:44940 if (!BIO_new_bio_pair_external_buf(
941 &ssl_bio, send_buffer_->capacity(),
942 reinterpret_cast<uint8_t*>(send_buffer_->data()), &transport_bio_,
943 recv_buffer_->capacity(),
944 reinterpret_cast<uint8_t*>(recv_buffer_->data())))
[email protected]c8a80e92014-05-17 16:02:08945 return ERR_UNEXPECTED;
[email protected]d518cd92010-09-29 12:27:44946 DCHECK(ssl_bio);
947 DCHECK(transport_bio_);
948
[email protected]5aea79182014-07-14 20:43:41949 // Install a callback on OpenSSL's end to plumb transport errors through.
svaldeze83af292016-04-26 14:33:37950 BIO_set_callback(ssl_bio, &SSLClientSocketImpl::BIOCallback);
[email protected]5aea79182014-07-14 20:43:41951 BIO_set_callback_arg(ssl_bio, reinterpret_cast<char*>(this));
952
[email protected]d518cd92010-09-29 12:27:44953 SSL_set_bio(ssl_, ssl_bio, ssl_bio);
954
davidbenb937d6c2015-05-14 04:53:42955 DCHECK_LT(SSL3_VERSION, ssl_config_.version_min);
956 DCHECK_LT(SSL3_VERSION, ssl_config_.version_max);
957 SSL_set_min_version(ssl_, ssl_config_.version_min);
958 SSL_set_max_version(ssl_, ssl_config_.version_max);
959
[email protected]9e733f32010-10-04 18:19:08960 // OpenSSL defaults some options to on, others to off. To avoid ambiguity,
961 // set everything we care about to an absolute value.
[email protected]fb10e2282010-12-01 17:08:48962 SslSetClearMask options;
[email protected]d0f00492012-08-03 22:35:13963 options.ConfigureFlag(SSL_OP_NO_COMPRESSION, true);
[email protected]9e733f32010-10-04 18:19:08964
965 // TODO(joth): Set this conditionally, see http://crbug.com/55410
[email protected]fb10e2282010-12-01 17:08:48966 options.ConfigureFlag(SSL_OP_LEGACY_SERVER_CONNECT, true);
[email protected]9e733f32010-10-04 18:19:08967
[email protected]fb10e2282010-12-01 17:08:48968 SSL_set_options(ssl_, options.set_mask);
969 SSL_clear_options(ssl_, options.clear_mask);
[email protected]9e733f32010-10-04 18:19:08970
[email protected]fb10e2282010-12-01 17:08:48971 // Same as above, this time for the SSL mode.
972 SslSetClearMask mode;
[email protected]9e733f32010-10-04 18:19:08973
[email protected]fb10e2282010-12-01 17:08:48974 mode.ConfigureFlag(SSL_MODE_RELEASE_BUFFERS, true);
ishermane5c05e12014-09-09 20:32:15975 mode.ConfigureFlag(SSL_MODE_CBC_RECORD_SPLITTING, true);
[email protected]fb10e2282010-12-01 17:08:48976
davidben818d93b2015-02-19 22:27:32977 mode.ConfigureFlag(SSL_MODE_ENABLE_FALSE_START,
[email protected]b788de02014-04-23 18:06:07978 ssl_config_.false_start_enabled);
979
davidben6b8131c2015-02-25 23:30:14980 mode.ConfigureFlag(SSL_MODE_SEND_FALLBACK_SCSV, ssl_config_.version_fallback);
981
[email protected]fb10e2282010-12-01 17:08:48982 SSL_set_mode(ssl_, mode.set_mask);
983 SSL_clear_mode(ssl_, mode.clear_mask);
[email protected]109805a2010-12-07 18:17:06984
davidbenb3c2d972016-03-11 22:36:17985 // Use BoringSSL defaults, but disable HMAC-SHA256 and HMAC-SHA384 ciphers
986 // (note that SHA256 and SHA384 only select legacy CBC ciphers). Also disable
987 // DHE_RSA_WITH_AES_256_GCM_SHA384. Historically, AES_256_GCM was not
988 // supported. As DHE is being deprecated, don't add a cipher only to remove it
989 // immediately.
990 std::string command(
davidben6a260682016-06-06 16:24:44991 "DEFAULT:!SHA256:!SHA384:!DHE-RSA-AES256-GCM-SHA384:!aPSK:!RC4");
davidben9b4a9b9c2015-10-12 18:46:51992
993 if (ssl_config_.require_ecdhe)
994 command.append(":!kRSA:!kDHE");
davidben8ecc30712014-09-03 23:19:09995
davidben68dcc582016-01-12 22:09:36996 if (!ssl_config_.deprecated_cipher_suites_enabled) {
davidben01d8e332015-11-20 17:08:58997 // Only offer DHE on the second handshake. https://crbug.com/538690
998 command.append(":!kDHE");
davidben91585692015-09-28 23:46:08999 }
davidbena4c9d062015-04-03 22:34:251000
davidben9b4a9b9c2015-10-12 18:46:511001 // Remove any disabled ciphers.
1002 for (uint16_t id : ssl_config_.disabled_cipher_suites) {
1003 const SSL_CIPHER* cipher = SSL_get_cipher_by_value(id);
1004 if (cipher) {
1005 command.append(":!");
1006 command.append(SSL_CIPHER_get_name(cipher));
1007 }
1008 }
1009
[email protected]109805a2010-12-07 18:17:061010 int rv = SSL_set_cipher_list(ssl_, command.c_str());
1011 // If this fails (rv = 0) it means there are no ciphers enabled on this SSL.
1012 // This will almost certainly result in the socket failing to complete the
1013 // handshake at which point the appropriate error is bubbled up to the client.
1014 LOG_IF(WARNING, rv != 1) << "SSL_set_cipher_list('" << command << "') "
svaldeze83af292016-04-26 14:33:371015 "returned "
1016 << rv;
[email protected]ee0f2aa82013-10-25 11:59:261017
1018 // TLS channel ids.
[email protected]6b8a3c742014-07-25 00:25:351019 if (IsChannelIDEnabled(ssl_config_, channel_id_service_)) {
[email protected]ee0f2aa82013-10-25 11:59:261020 SSL_enable_tls_channel_id(ssl_);
1021 }
1022
bnc1f295372015-10-21 23:24:221023 if (!ssl_config_.alpn_protos.empty()) {
bnc1e757502014-12-13 02:20:161024 // Get list of ciphers that are enabled.
1025 STACK_OF(SSL_CIPHER)* enabled_ciphers = SSL_get_ciphers(ssl_);
1026 DCHECK(enabled_ciphers);
Avi Drissman13fc8932015-12-20 04:40:461027 std::vector<uint16_t> enabled_ciphers_vector;
bnc1e757502014-12-13 02:20:161028 for (size_t i = 0; i < sk_SSL_CIPHER_num(enabled_ciphers); ++i) {
1029 const SSL_CIPHER* cipher = sk_SSL_CIPHER_value(enabled_ciphers, i);
Avi Drissman13fc8932015-12-20 04:40:461030 const uint16_t id = static_cast<uint16_t>(SSL_CIPHER_get_id(cipher));
bnc1e757502014-12-13 02:20:161031 enabled_ciphers_vector.push_back(id);
1032 }
1033
bnc1f295372015-10-21 23:24:221034 NextProtoVector alpn_protos = ssl_config_.alpn_protos;
bncf76254d622015-09-29 00:03:441035 if (!HasCipherAdequateForHTTP2(enabled_ciphers_vector) ||
1036 !IsTLSVersionAdequateForHTTP2(ssl_config_)) {
bnc1f295372015-10-21 23:24:221037 DisableHTTP2(&alpn_protos);
bncf76254d622015-09-29 00:03:441038 }
bnc1f295372015-10-21 23:24:221039 std::vector<uint8_t> wire_protos = SerializeNextProtos(alpn_protos);
[email protected]abc44b752014-07-30 03:52:151040 SSL_set_alpn_protos(ssl_, wire_protos.empty() ? NULL : &wire_protos[0],
1041 wire_protos.size());
1042 }
1043
bnc2d6bd0f2015-10-28 01:52:051044 if (ssl_config_.npn_protos.empty())
1045 SSL_set_options(ssl_, SSL_OP_DISABLE_NPN);
1046
davidbeneb5f8ef32014-09-04 14:14:321047 if (ssl_config_.signed_cert_timestamps_enabled) {
1048 SSL_enable_signed_cert_timestamps(ssl_);
1049 SSL_enable_ocsp_stapling(ssl_);
1050 }
1051
davidben15f57132015-04-27 18:08:361052 if (cert_verifier_->SupportsOCSPStapling())
davidbend1fb2f12014-11-08 02:51:001053 SSL_enable_ocsp_stapling(ssl_);
davidbeneb5f8ef32014-09-04 14:14:321054
[email protected]c8a80e92014-05-17 16:02:081055 return OK;
[email protected]d518cd92010-09-29 12:27:441056}
1057
svaldeze83af292016-04-26 14:33:371058void SSLClientSocketImpl::DoReadCallback(int rv) {
[email protected]b9b651f2013-11-09 04:32:221059 // Since Run may result in Read being called, clear |user_read_callback_|
1060 // up front.
[email protected]0dc88b32014-03-26 20:12:281061 if (rv > 0)
1062 was_ever_used_ = true;
[email protected]b9b651f2013-11-09 04:32:221063 user_read_buf_ = NULL;
1064 user_read_buf_len_ = 0;
1065 base::ResetAndReturn(&user_read_callback_).Run(rv);
1066}
1067
svaldeze83af292016-04-26 14:33:371068void SSLClientSocketImpl::DoWriteCallback(int rv) {
[email protected]b9b651f2013-11-09 04:32:221069 // Since Run may result in Write being called, clear |user_write_callback_|
1070 // up front.
[email protected]0dc88b32014-03-26 20:12:281071 if (rv > 0)
1072 was_ever_used_ = true;
[email protected]b9b651f2013-11-09 04:32:221073 user_write_buf_ = NULL;
1074 user_write_buf_len_ = 0;
1075 base::ResetAndReturn(&user_write_callback_).Run(rv);
1076}
1077
svaldeze83af292016-04-26 14:33:371078bool SSLClientSocketImpl::DoTransportIO() {
[email protected]b9b651f2013-11-09 04:32:221079 bool network_moved = false;
1080 int rv;
1081 // Read and write as much data as possible. The loop is necessary because
1082 // Write() may return synchronously.
1083 do {
1084 rv = BufferSend();
1085 if (rv != ERR_IO_PENDING && rv != 0)
1086 network_moved = true;
1087 } while (rv > 0);
[email protected]5aea79182014-07-14 20:43:411088 if (transport_read_error_ == OK && BufferRecv() != ERR_IO_PENDING)
[email protected]b9b651f2013-11-09 04:32:221089 network_moved = true;
1090 return network_moved;
1091}
1092
pkasting379234c2015-04-08 04:42:121093// TODO(cbentzel): Remove including "base/threading/thread_local.h" and
vadimt6b43dec22015-01-06 01:59:581094// g_first_run_completed once crbug.com/424386 is fixed.
1095base::LazyInstance<base::ThreadLocalBoolean>::Leaky g_first_run_completed =
1096 LAZY_INSTANCE_INITIALIZER;
1097
svaldeze83af292016-04-26 14:33:371098int SSLClientSocketImpl::DoHandshake() {
[email protected]b9b651f2013-11-09 04:32:221099 crypto::OpenSSLErrStackTracer err_tracer(FROM_HERE);
vadimt5a243282014-12-24 00:26:161100
1101 int rv;
1102
pkasting379234c2015-04-08 04:42:121103 // TODO(cbentzel): Leave only 1 call to SSL_do_handshake once crbug.com/424386
vadimt5a243282014-12-24 00:26:161104 // is fixed.
1105 if (ssl_config_.send_client_cert && ssl_config_.client_cert.get()) {
vadimt5a243282014-12-24 00:26:161106 rv = SSL_do_handshake(ssl_);
1107 } else {
vadimt6b43dec22015-01-06 01:59:581108 if (g_first_run_completed.Get().Get()) {
pkasting379234c2015-04-08 04:42:121109 // TODO(cbentzel): Remove ScopedTracker below once crbug.com/424386 is
vadimt6b43dec22015-01-06 01:59:581110 // fixed.
pkasting379234c2015-04-08 04:42:121111 tracked_objects::ScopedTracker tracking_profile(
1112 FROM_HERE_WITH_EXPLICIT_FUNCTION("424386 SSL_do_handshake()"));
vadimt5a243282014-12-24 00:26:161113
vadimt6b43dec22015-01-06 01:59:581114 rv = SSL_do_handshake(ssl_);
1115 } else {
1116 g_first_run_completed.Get().Set(true);
vadimt6b43dec22015-01-06 01:59:581117 rv = SSL_do_handshake(ssl_);
1118 }
vadimt5a243282014-12-24 00:26:161119 }
[email protected]b9b651f2013-11-09 04:32:221120
davidbenc4212c02015-05-12 22:30:181121 int net_error = OK;
1122 if (rv <= 0) {
[email protected]b9b651f2013-11-09 04:32:221123 int ssl_error = SSL_get_error(ssl_, rv);
[email protected]b9b651f2013-11-09 04:32:221124 if (ssl_error == SSL_ERROR_WANT_CHANNEL_ID_LOOKUP) {
[email protected]faff9852014-06-21 06:13:461125 // The server supports channel ID. Stop to look one up before returning to
1126 // the handshake.
[email protected]faff9852014-06-21 06:13:461127 GotoState(STATE_CHANNEL_ID_LOOKUP);
1128 return OK;
[email protected]b9b651f2013-11-09 04:32:221129 }
davidbenced4aa9b2015-05-12 21:22:351130 if (ssl_error == SSL_ERROR_WANT_X509_LOOKUP &&
1131 !ssl_config_.send_client_cert) {
1132 return ERR_SSL_CLIENT_AUTH_CERT_NEEDED;
1133 }
davidben1d48952e2015-07-01 18:48:461134 if (ssl_error == SSL_ERROR_WANT_PRIVATE_KEY_OPERATION) {
svaldez7872fd02015-11-19 21:10:541135 DCHECK(ssl_config_.client_private_key);
davidben1d48952e2015-07-01 18:48:461136 DCHECK_NE(kNoPendingResult, signature_result_);
1137 GotoState(STATE_HANDSHAKE);
1138 return ERR_IO_PENDING;
1139 }
[email protected]b9b651f2013-11-09 04:32:221140
davidbena4409c62014-08-27 17:05:511141 OpenSSLErrorInfo error_info;
1142 net_error = MapOpenSSLErrorWithDetails(ssl_error, err_tracer, &error_info);
[email protected]b9b651f2013-11-09 04:32:221143 if (net_error == ERR_IO_PENDING) {
davidbenc4212c02015-05-12 22:30:181144 // If not done, stay in this state
[email protected]b9b651f2013-11-09 04:32:221145 GotoState(STATE_HANDSHAKE);
davidbenc4212c02015-05-12 22:30:181146 return ERR_IO_PENDING;
1147 }
1148
1149 LOG(ERROR) << "handshake failed; returned " << rv << ", SSL error code "
1150 << ssl_error << ", net_error " << net_error;
1151 net_log_.AddEvent(
1152 NetLog::TYPE_SSL_HANDSHAKE_ERROR,
1153 CreateNetLogOpenSSLErrorCallback(net_error, ssl_error, error_info));
davidbenf2eaaf92015-05-15 22:18:421154
1155 // Classify the handshake failure. This is used to determine causes of the
1156 // TLS version fallback.
1157
1158 // |cipher| is the current outgoing cipher suite, so it is non-null iff
1159 // ChangeCipherSpec was sent.
1160 const SSL_CIPHER* cipher = SSL_get_current_cipher(ssl_);
1161 if (SSL_get_state(ssl_) == SSL3_ST_CR_SRVR_HELLO_A) {
1162 ssl_failure_state_ = SSL_FAILURE_CLIENT_HELLO;
1163 } else if (cipher && (SSL_CIPHER_get_id(cipher) ==
1164 TLS1_CK_DHE_RSA_WITH_AES_128_GCM_SHA256 ||
1165 SSL_CIPHER_get_id(cipher) ==
1166 TLS1_CK_RSA_WITH_AES_128_GCM_SHA256)) {
1167 ssl_failure_state_ = SSL_FAILURE_BUGGY_GCM;
1168 } else if (cipher && ssl_config_.send_client_cert) {
1169 ssl_failure_state_ = SSL_FAILURE_CLIENT_AUTH;
1170 } else if (ERR_GET_LIB(error_info.error_code) == ERR_LIB_SSL &&
1171 ERR_GET_REASON(error_info.error_code) ==
1172 SSL_R_OLD_SESSION_VERSION_NOT_RETURNED) {
1173 ssl_failure_state_ = SSL_FAILURE_SESSION_MISMATCH;
1174 } else if (cipher && npn_status_ != kNextProtoUnsupported) {
1175 ssl_failure_state_ = SSL_FAILURE_NEXT_PROTO;
1176 } else {
1177 ssl_failure_state_ = SSL_FAILURE_UNKNOWN;
1178 }
davidbenc4212c02015-05-12 22:30:181179 }
1180
1181 GotoState(STATE_HANDSHAKE_COMPLETE);
1182 return net_error;
1183}
1184
svaldeze83af292016-04-26 14:33:371185int SSLClientSocketImpl::DoHandshakeComplete(int result) {
davidbenc4212c02015-05-12 22:30:181186 if (result < 0)
1187 return result;
1188
1189 if (ssl_config_.version_fallback &&
1190 ssl_config_.version_max < ssl_config_.version_fallback_min) {
1191 return ERR_SSL_FALLBACK_BEYOND_MINIMUM_VERSION;
1192 }
1193
nharper736ceda2015-11-07 00:16:591194 // Check that if token binding was negotiated, then extended master secret
1195 // must also be negotiated.
1196 if (tb_was_negotiated_ && !SSL_get_extms_support(ssl_))
1197 return ERR_SSL_PROTOCOL_ERROR;
1198
davidbenc4212c02015-05-12 22:30:181199 // SSL handshake is completed. If NPN wasn't negotiated, see if ALPN was.
1200 if (npn_status_ == kNextProtoUnsupported) {
1201 const uint8_t* alpn_proto = NULL;
1202 unsigned alpn_len = 0;
1203 SSL_get0_alpn_selected(ssl_, &alpn_proto, &alpn_len);
1204 if (alpn_len > 0) {
1205 npn_proto_.assign(reinterpret_cast<const char*>(alpn_proto), alpn_len);
1206 npn_status_ = kNextProtoNegotiated;
1207 set_negotiation_extension(kExtensionALPN);
[email protected]b9b651f2013-11-09 04:32:221208 }
1209 }
davidbenc4212c02015-05-12 22:30:181210
1211 RecordNegotiationExtension();
1212 RecordChannelIDSupport(channel_id_service_, channel_id_sent_,
davidben24bb5a42015-10-15 22:13:221213 ssl_config_.channel_id_enabled);
davidbenc4212c02015-05-12 22:30:181214
1215 // Only record OCSP histograms if OCSP was requested.
1216 if (ssl_config_.signed_cert_timestamps_enabled ||
1217 cert_verifier_->SupportsOCSPStapling()) {
1218 const uint8_t* ocsp_response;
1219 size_t ocsp_response_len;
1220 SSL_get0_ocsp_response(ssl_, &ocsp_response, &ocsp_response_len);
1221
1222 set_stapled_ocsp_response_received(ocsp_response_len != 0);
1223 UMA_HISTOGRAM_BOOLEAN("Net.OCSPResponseStapled", ocsp_response_len != 0);
1224 }
1225
1226 const uint8_t* sct_list;
1227 size_t sct_list_len;
1228 SSL_get0_signed_cert_timestamp_list(ssl_, &sct_list, &sct_list_len);
1229 set_signed_cert_timestamps_received(sct_list_len != 0);
1230
1231 if (IsRenegotiationAllowed())
davidben0635886ab2015-11-04 19:24:041232 SSL_set_renegotiate_mode(ssl_, ssl_renegotiate_freely);
davidbenc4212c02015-05-12 22:30:181233
davidben4fe4f982015-11-11 22:00:121234 uint8_t server_key_exchange_hash = SSL_get_server_key_exchange_hash(ssl_);
1235 if (server_key_exchange_hash != TLSEXT_hash_none) {
1236 UMA_HISTOGRAM_SPARSE_SLOWLY("Net.SSLServerKeyExchangeHash",
1237 server_key_exchange_hash);
1238 }
1239
davidbenc4212c02015-05-12 22:30:181240 // Verify the certificate.
1241 UpdateServerCert();
1242 GotoState(STATE_VERIFY_CERT);
1243 return OK;
[email protected]b9b651f2013-11-09 04:32:221244}
1245
svaldeze83af292016-04-26 14:33:371246int SSLClientSocketImpl::DoChannelIDLookup() {
nharper49b27d992016-02-09 18:28:511247 NetLog::ParametersCallback callback = base::Bind(
1248 &NetLogChannelIDLookupCallback, base::Unretained(channel_id_service_));
1249 net_log_.BeginEvent(NetLog::TYPE_SSL_GET_CHANNEL_ID, callback);
[email protected]faff9852014-06-21 06:13:461250 GotoState(STATE_CHANNEL_ID_LOOKUP_COMPLETE);
[email protected]6b8a3c742014-07-25 00:25:351251 return channel_id_service_->GetOrCreateChannelID(
nharper2e171cf2015-06-01 20:29:231252 host_and_port_.host(), &channel_id_key_,
svaldeze83af292016-04-26 14:33:371253 base::Bind(&SSLClientSocketImpl::OnHandshakeIOComplete,
[email protected]faff9852014-06-21 06:13:461254 base::Unretained(this)),
nharper75ade892015-06-10 19:05:351255 &channel_id_request_);
[email protected]faff9852014-06-21 06:13:461256}
1257
svaldeze83af292016-04-26 14:33:371258int SSLClientSocketImpl::DoChannelIDLookupComplete(int result) {
nharper49b27d992016-02-09 18:28:511259 net_log_.EndEvent(NetLog::TYPE_SSL_GET_CHANNEL_ID,
1260 base::Bind(&NetLogChannelIDLookupCompleteCallback,
1261 channel_id_key_.get(), result));
[email protected]faff9852014-06-21 06:13:461262 if (result < 0)
1263 return result;
1264
[email protected]faff9852014-06-21 06:13:461265 // Hand the key to OpenSSL. Check for error in case OpenSSL rejects the key
1266 // type.
davidben8a208fc2016-01-22 17:08:081267 DCHECK(channel_id_key_);
[email protected]faff9852014-06-21 06:13:461268 crypto::OpenSSLErrStackTracer err_tracer(FROM_HERE);
nharper2e171cf2015-06-01 20:29:231269 int rv = SSL_set1_tls_channel_id(ssl_, channel_id_key_->key());
[email protected]faff9852014-06-21 06:13:461270 if (!rv) {
1271 LOG(ERROR) << "Failed to set Channel ID.";
1272 int err = SSL_get_error(ssl_, rv);
1273 return MapOpenSSLError(err, err_tracer);
1274 }
1275
1276 // Return to the handshake.
davidben52053b382015-04-27 19:22:291277 channel_id_sent_ = true;
[email protected]faff9852014-06-21 06:13:461278 GotoState(STATE_HANDSHAKE);
1279 return OK;
1280}
1281
svaldeze83af292016-04-26 14:33:371282int SSLClientSocketImpl::DoVerifyCert(int result) {
davidben30798ed82014-09-19 19:28:201283 DCHECK(!server_cert_chain_->empty());
davidben09c3d072014-08-25 20:33:581284 DCHECK(start_cert_verification_time_.is_null());
davidben30798ed82014-09-19 19:28:201285
[email protected]b9b651f2013-11-09 04:32:221286 GotoState(STATE_VERIFY_CERT_COMPLETE);
1287
davidbenc6435a72015-08-17 18:28:521288 // OpenSSL decoded the certificate, but the platform certificate
1289 // implementation could not. This is treated as a fatal SSL-level protocol
1290 // error rather than a certificate error. See https://crbug.com/91341.
1291 if (!server_cert_.get())
1292 return ERR_SSL_SERVER_CERT_BAD_FORMAT;
1293
davidben30798ed82014-09-19 19:28:201294 // If the certificate is bad and has been previously accepted, use
1295 // the previous status and bypass the error.
1296 base::StringPiece der_cert;
1297 if (!x509_util::GetDER(server_cert_chain_->Get(0), &der_cert)) {
1298 NOTREACHED();
1299 return ERR_CERT_INVALID;
1300 }
[email protected]b9b651f2013-11-09 04:32:221301 CertStatus cert_status;
davidben30798ed82014-09-19 19:28:201302 if (ssl_config_.IsAllowedBadCert(der_cert, &cert_status)) {
[email protected]b9b651f2013-11-09 04:32:221303 VLOG(1) << "Received an expected bad cert with status: " << cert_status;
1304 server_cert_verify_result_.Reset();
1305 server_cert_verify_result_.cert_status = cert_status;
1306 server_cert_verify_result_.verified_cert = server_cert_;
1307 return OK;
1308 }
1309
davidben15f57132015-04-27 18:08:361310 std::string ocsp_response;
1311 if (cert_verifier_->SupportsOCSPStapling()) {
1312 const uint8_t* ocsp_response_raw;
1313 size_t ocsp_response_len;
1314 SSL_get0_ocsp_response(ssl_, &ocsp_response_raw, &ocsp_response_len);
1315 ocsp_response.assign(reinterpret_cast<const char*>(ocsp_response_raw),
1316 ocsp_response_len);
1317 }
1318
davidben09c3d072014-08-25 20:33:581319 start_cert_verification_time_ = base::TimeTicks::Now();
1320
eroman7f9236a2015-05-11 21:23:431321 return cert_verifier_->Verify(
rtenneti807f9ea2015-06-24 16:26:311322 server_cert_.get(), host_and_port_.host(), ocsp_response,
1323 ssl_config_.GetCertVerifyFlags(),
[email protected]591cffcd2014-08-18 20:02:301324 // TODO(davidben): Route the CRLSet through SSLConfig so
1325 // SSLClientSocket doesn't depend on SSLConfigService.
davidben15f57132015-04-27 18:08:361326 SSLConfigService::GetCRLSet().get(), &server_cert_verify_result_,
svaldeze83af292016-04-26 14:33:371327 base::Bind(&SSLClientSocketImpl::OnHandshakeIOComplete,
[email protected]b9b651f2013-11-09 04:32:221328 base::Unretained(this)),
eroman7f9236a2015-05-11 21:23:431329 &cert_verifier_request_, net_log_);
[email protected]b9b651f2013-11-09 04:32:221330}
1331
svaldeze83af292016-04-26 14:33:371332int SSLClientSocketImpl::DoVerifyCertComplete(int result) {
eroman7f9236a2015-05-11 21:23:431333 cert_verifier_request_.reset();
[email protected]b9b651f2013-11-09 04:32:221334
davidben09c3d072014-08-25 20:33:581335 if (!start_cert_verification_time_.is_null()) {
1336 base::TimeDelta verify_time =
1337 base::TimeTicks::Now() - start_cert_verification_time_;
1338 if (result == OK) {
1339 UMA_HISTOGRAM_TIMES("Net.SSLCertVerificationTime", verify_time);
1340 } else {
1341 UMA_HISTOGRAM_TIMES("Net.SSLCertVerificationTimeError", verify_time);
1342 }
1343 }
1344
[email protected]8bd4e7a2014-08-09 14:49:171345 const CertStatus cert_status = server_cert_verify_result_.cert_status;
1346 if (transport_security_state_ &&
1347 (result == OK ||
1348 (IsCertificateError(result) && IsCertStatusMinorError(cert_status))) &&
1349 !transport_security_state_->CheckPublicKeyPins(
estark1a66df72015-07-28 15:24:001350 host_and_port_, server_cert_verify_result_.is_issued_by_known_root,
1351 server_cert_verify_result_.public_key_hashes, server_cert_.get(),
1352 server_cert_verify_result_.verified_cert.get(),
1353 TransportSecurityState::ENABLE_PIN_REPORTS, &pinning_failure_log_)) {
[email protected]8bd4e7a2014-08-09 14:49:171354 result = ERR_SSL_PINNED_KEY_NOT_IN_CERT_CHAIN;
1355 }
1356
[email protected]b9b651f2013-11-09 04:32:221357 if (result == OK) {
davidbeneb5f8ef32014-09-04 14:14:321358 // Only check Certificate Transparency if there were no other errors with
1359 // the connection.
1360 VerifyCT();
1361
davidbendafe4e52015-04-08 22:53:521362 DCHECK(!certificate_verified_);
1363 certificate_verified_ = true;
1364 MaybeCacheSession();
[email protected]b9b651f2013-11-09 04:32:221365 } else {
svaldeze83af292016-04-26 14:33:371366 DVLOG(1) << "DoVerifyCertComplete error " << ErrorToString(result) << " ("
1367 << result << ")";
[email protected]b9b651f2013-11-09 04:32:221368 }
1369
[email protected]64b5c892014-08-08 09:39:261370 completed_connect_ = true;
[email protected]b9b651f2013-11-09 04:32:221371 // Exit DoHandshakeLoop and return the result to the caller to Connect.
1372 DCHECK_EQ(STATE_NONE, next_handshake_state_);
1373 return result;
1374}
1375
svaldeze83af292016-04-26 14:33:371376void SSLClientSocketImpl::DoConnectCallback(int rv) {
[email protected]b9b651f2013-11-09 04:32:221377 if (!user_connect_callback_.is_null()) {
1378 CompletionCallback c = user_connect_callback_;
1379 user_connect_callback_.Reset();
1380 c.Run(rv > OK ? OK : rv);
1381 }
1382}
1383
svaldeze83af292016-04-26 14:33:371384void SSLClientSocketImpl::UpdateServerCert() {
[email protected]76e85392014-03-20 17:54:141385 server_cert_chain_->Reset(SSL_get_peer_cert_chain(ssl_));
[email protected]7f38da8a2014-03-17 16:44:261386 server_cert_ = server_cert_chain_->AsOSChain();
davidben30798ed82014-09-19 19:28:201387 if (server_cert_.get()) {
svaldeze83af292016-04-26 14:33:371388 net_log_.AddEvent(NetLog::TYPE_SSL_CERTIFICATES_RECEIVED,
1389 base::Bind(&NetLogX509CertificateCallback,
1390 base::Unretained(server_cert_.get())));
davidben30798ed82014-09-19 19:28:201391 }
[email protected]b9b651f2013-11-09 04:32:221392}
1393
svaldeze83af292016-04-26 14:33:371394void SSLClientSocketImpl::VerifyCT() {
davidbeneb5f8ef32014-09-04 14:14:321395 if (!cert_transparency_verifier_)
1396 return;
1397
davidben54015aae2014-12-02 22:16:231398 const uint8_t* ocsp_response_raw;
davidbeneb5f8ef32014-09-04 14:14:321399 size_t ocsp_response_len;
1400 SSL_get0_ocsp_response(ssl_, &ocsp_response_raw, &ocsp_response_len);
1401 std::string ocsp_response;
1402 if (ocsp_response_len > 0) {
1403 ocsp_response.assign(reinterpret_cast<const char*>(ocsp_response_raw),
1404 ocsp_response_len);
1405 }
1406
davidben54015aae2014-12-02 22:16:231407 const uint8_t* sct_list_raw;
davidbeneb5f8ef32014-09-04 14:14:321408 size_t sct_list_len;
1409 SSL_get0_signed_cert_timestamp_list(ssl_, &sct_list_raw, &sct_list_len);
1410 std::string sct_list;
1411 if (sct_list_len > 0)
1412 sct_list.assign(reinterpret_cast<const char*>(sct_list_raw), sct_list_len);
1413
1414 // Note that this is a completely synchronous operation: The CT Log Verifier
1415 // gets all the data it needs for SCT verification and does not do any
1416 // external communication.
eranm6571b2b2014-12-03 15:53:231417 cert_transparency_verifier_->Verify(
1418 server_cert_verify_result_.verified_cert.get(), ocsp_response, sct_list,
1419 &ct_verify_result_, net_log_);
davidbeneb5f8ef32014-09-04 14:14:321420
estark723b5eeb2016-02-18 21:01:121421 ct_verify_result_.ct_policies_applied = (policy_enforcer_ != nullptr);
1422 ct_verify_result_.ev_policy_compliance =
1423 ct::EVPolicyCompliance::EV_POLICY_DOES_NOT_APPLY;
estark0fc8d0782016-02-25 20:41:201424 if (policy_enforcer_) {
1425 if ((server_cert_verify_result_.cert_status & CERT_STATUS_IS_EV)) {
1426 scoped_refptr<ct::EVCertsWhitelist> ev_whitelist =
1427 SSLConfigService::GetEVCertsWhitelist();
1428 ct::EVPolicyCompliance ev_policy_compliance =
1429 policy_enforcer_->DoesConformToCTEVPolicy(
1430 server_cert_verify_result_.verified_cert.get(),
1431 ev_whitelist.get(), ct_verify_result_.verified_scts, net_log_);
1432 ct_verify_result_.ev_policy_compliance = ev_policy_compliance;
1433 if (ev_policy_compliance !=
1434 ct::EVPolicyCompliance::EV_POLICY_DOES_NOT_APPLY &&
1435 ev_policy_compliance !=
1436 ct::EVPolicyCompliance::EV_POLICY_COMPLIES_VIA_WHITELIST &&
1437 ev_policy_compliance !=
1438 ct::EVPolicyCompliance::EV_POLICY_COMPLIES_VIA_SCTS) {
1439 // TODO(eranm): Log via the BoundNetLog, see crbug.com/437766
1440 VLOG(1) << "EV certificate for "
1441 << server_cert_verify_result_.verified_cert->subject()
1442 .GetDisplayName()
1443 << " does not conform to CT policy, removing EV status.";
1444 server_cert_verify_result_.cert_status |=
1445 CERT_STATUS_CT_COMPLIANCE_FAILED;
1446 server_cert_verify_result_.cert_status &= ~CERT_STATUS_IS_EV;
1447 }
eranm6571b2b2014-12-03 15:53:231448 }
estark0fc8d0782016-02-25 20:41:201449 ct_verify_result_.cert_policy_compliance =
1450 policy_enforcer_->DoesConformToCertPolicy(
1451 server_cert_verify_result_.verified_cert.get(),
1452 ct_verify_result_.verified_scts, net_log_);
eranm6571b2b2014-12-03 15:53:231453 }
davidbeneb5f8ef32014-09-04 14:14:321454}
1455
svaldeze83af292016-04-26 14:33:371456void SSLClientSocketImpl::OnHandshakeIOComplete(int result) {
[email protected]b9b651f2013-11-09 04:32:221457 int rv = DoHandshakeLoop(result);
1458 if (rv != ERR_IO_PENDING) {
davidben281d13f02016-04-27 20:43:281459 LogConnectEndEvent(rv);
[email protected]b9b651f2013-11-09 04:32:221460 DoConnectCallback(rv);
1461 }
1462}
1463
svaldeze83af292016-04-26 14:33:371464void SSLClientSocketImpl::OnSendComplete(int result) {
[email protected]b9b651f2013-11-09 04:32:221465 if (next_handshake_state_ == STATE_HANDSHAKE) {
1466 // In handshake phase.
1467 OnHandshakeIOComplete(result);
1468 return;
1469 }
1470
davidben1d48952e2015-07-01 18:48:461471 // During a renegotiation, a Read call may also be blocked on a transport
1472 // write, so retry both operations.
1473 PumpReadWriteEvents();
[email protected]b9b651f2013-11-09 04:32:221474}
1475
svaldeze83af292016-04-26 14:33:371476void SSLClientSocketImpl::OnRecvComplete(int result) {
1477 TRACE_EVENT0("net", "SSLClientSocketImpl::OnRecvComplete");
[email protected]b9b651f2013-11-09 04:32:221478 if (next_handshake_state_ == STATE_HANDSHAKE) {
1479 // In handshake phase.
1480 OnHandshakeIOComplete(result);
1481 return;
1482 }
1483
1484 // Network layer received some data, check if client requested to read
1485 // decrypted data.
1486 if (!user_read_buf_.get())
1487 return;
1488
davidben1b133ad2014-10-23 04:23:131489 int rv = DoReadLoop();
[email protected]b9b651f2013-11-09 04:32:221490 if (rv != ERR_IO_PENDING)
1491 DoReadCallback(rv);
1492}
1493
svaldeze83af292016-04-26 14:33:371494int SSLClientSocketImpl::DoHandshakeLoop(int last_io_result) {
1495 TRACE_EVENT0("net", "SSLClientSocketImpl::DoHandshakeLoop");
[email protected]b9b651f2013-11-09 04:32:221496 int rv = last_io_result;
1497 do {
1498 // Default to STATE_NONE for next state.
1499 // (This is a quirk carried over from the windows
1500 // implementation. It makes reading the logs a bit harder.)
1501 // State handlers can and often do call GotoState just
1502 // to stay in the current state.
1503 State state = next_handshake_state_;
1504 GotoState(STATE_NONE);
1505 switch (state) {
1506 case STATE_HANDSHAKE:
1507 rv = DoHandshake();
1508 break;
davidbenc4212c02015-05-12 22:30:181509 case STATE_HANDSHAKE_COMPLETE:
1510 rv = DoHandshakeComplete(rv);
1511 break;
[email protected]faff9852014-06-21 06:13:461512 case STATE_CHANNEL_ID_LOOKUP:
1513 DCHECK_EQ(OK, rv);
1514 rv = DoChannelIDLookup();
svaldeze83af292016-04-26 14:33:371515 break;
[email protected]faff9852014-06-21 06:13:461516 case STATE_CHANNEL_ID_LOOKUP_COMPLETE:
1517 rv = DoChannelIDLookupComplete(rv);
1518 break;
[email protected]b9b651f2013-11-09 04:32:221519 case STATE_VERIFY_CERT:
[email protected]faff9852014-06-21 06:13:461520 DCHECK_EQ(OK, rv);
[email protected]b9b651f2013-11-09 04:32:221521 rv = DoVerifyCert(rv);
svaldeze83af292016-04-26 14:33:371522 break;
[email protected]b9b651f2013-11-09 04:32:221523 case STATE_VERIFY_CERT_COMPLETE:
1524 rv = DoVerifyCertComplete(rv);
1525 break;
1526 case STATE_NONE:
1527 default:
1528 rv = ERR_UNEXPECTED;
1529 NOTREACHED() << "unexpected state" << state;
1530 break;
1531 }
1532
1533 bool network_moved = DoTransportIO();
1534 if (network_moved && next_handshake_state_ == STATE_HANDSHAKE) {
1535 // In general we exit the loop if rv is ERR_IO_PENDING. In this
1536 // special case we keep looping even if rv is ERR_IO_PENDING because
1537 // the transport IO may allow DoHandshake to make progress.
1538 rv = OK; // This causes us to stay in the loop.
1539 }
1540 } while (rv != ERR_IO_PENDING && next_handshake_state_ != STATE_NONE);
1541 return rv;
1542}
1543
svaldeze83af292016-04-26 14:33:371544int SSLClientSocketImpl::DoReadLoop() {
[email protected]b9b651f2013-11-09 04:32:221545 bool network_moved;
1546 int rv;
1547 do {
1548 rv = DoPayloadRead();
1549 network_moved = DoTransportIO();
1550 } while (rv == ERR_IO_PENDING && network_moved);
1551
1552 return rv;
1553}
1554
svaldeze83af292016-04-26 14:33:371555int SSLClientSocketImpl::DoWriteLoop() {
[email protected]b9b651f2013-11-09 04:32:221556 bool network_moved;
1557 int rv;
1558 do {
1559 rv = DoPayloadWrite();
1560 network_moved = DoTransportIO();
1561 } while (rv == ERR_IO_PENDING && network_moved);
1562
1563 return rv;
1564}
1565
svaldeze83af292016-04-26 14:33:371566int SSLClientSocketImpl::DoPayloadRead() {
[email protected]b9b651f2013-11-09 04:32:221567 crypto::OpenSSLErrStackTracer err_tracer(FROM_HERE);
1568
davidben7e555daf2015-03-25 17:03:291569 DCHECK_LT(0, user_read_buf_len_);
1570 DCHECK(user_read_buf_.get());
1571
[email protected]b9b651f2013-11-09 04:32:221572 int rv;
davidben1d48952e2015-07-01 18:48:461573 if (pending_read_error_ != kNoPendingResult) {
[email protected]b9b651f2013-11-09 04:32:221574 rv = pending_read_error_;
davidben1d48952e2015-07-01 18:48:461575 pending_read_error_ = kNoPendingResult;
[email protected]b9b651f2013-11-09 04:32:221576 if (rv == 0) {
svaldeze83af292016-04-26 14:33:371577 net_log_.AddByteTransferEvent(NetLog::TYPE_SSL_SOCKET_BYTES_RECEIVED, rv,
1578 user_read_buf_->data());
davidbenb8c23212014-10-28 00:12:161579 } else {
1580 net_log_.AddEvent(
1581 NetLog::TYPE_SSL_READ_ERROR,
1582 CreateNetLogOpenSSLErrorCallback(rv, pending_read_ssl_error_,
1583 pending_read_error_info_));
[email protected]b9b651f2013-11-09 04:32:221584 }
davidbenb8c23212014-10-28 00:12:161585 pending_read_ssl_error_ = SSL_ERROR_NONE;
1586 pending_read_error_info_ = OpenSSLErrorInfo();
[email protected]b9b651f2013-11-09 04:32:221587 return rv;
1588 }
1589
1590 int total_bytes_read = 0;
davidben7e555daf2015-03-25 17:03:291591 int ssl_ret;
[email protected]b9b651f2013-11-09 04:32:221592 do {
davidben7e555daf2015-03-25 17:03:291593 ssl_ret = SSL_read(ssl_, user_read_buf_->data() + total_bytes_read,
1594 user_read_buf_len_ - total_bytes_read);
1595 if (ssl_ret > 0)
1596 total_bytes_read += ssl_ret;
1597 } while (total_bytes_read < user_read_buf_len_ && ssl_ret > 0);
[email protected]b9b651f2013-11-09 04:32:221598
davidben7e555daf2015-03-25 17:03:291599 // Although only the final SSL_read call may have failed, the failure needs to
1600 // processed immediately, while the information still available in OpenSSL's
1601 // error queue.
davidbenced4aa9b2015-05-12 21:22:351602 if (ssl_ret <= 0) {
davidben7e555daf2015-03-25 17:03:291603 // A zero return from SSL_read may mean any of:
1604 // - The underlying BIO_read returned 0.
1605 // - The peer sent a close_notify.
1606 // - Any arbitrary error. https://crbug.com/466303
[email protected]b9b651f2013-11-09 04:32:221607 //
davidben7e555daf2015-03-25 17:03:291608 // TransportReadComplete converts the first to an ERR_CONNECTION_CLOSED
1609 // error, so it does not occur. The second and third are distinguished by
1610 // SSL_ERROR_ZERO_RETURN.
1611 pending_read_ssl_error_ = SSL_get_error(ssl_, ssl_ret);
1612 if (pending_read_ssl_error_ == SSL_ERROR_ZERO_RETURN) {
1613 pending_read_error_ = 0;
davidbenced4aa9b2015-05-12 21:22:351614 } else if (pending_read_ssl_error_ == SSL_ERROR_WANT_X509_LOOKUP &&
1615 !ssl_config_.send_client_cert) {
1616 pending_read_error_ = ERR_SSL_CLIENT_AUTH_CERT_NEEDED;
davidben1d48952e2015-07-01 18:48:461617 } else if (pending_read_ssl_error_ ==
1618 SSL_ERROR_WANT_PRIVATE_KEY_OPERATION) {
svaldez7872fd02015-11-19 21:10:541619 DCHECK(ssl_config_.client_private_key);
davidben1d48952e2015-07-01 18:48:461620 DCHECK_NE(kNoPendingResult, signature_result_);
1621 pending_read_error_ = ERR_IO_PENDING;
davidben7e555daf2015-03-25 17:03:291622 } else {
1623 pending_read_error_ = MapOpenSSLErrorWithDetails(
1624 pending_read_ssl_error_, err_tracer, &pending_read_error_info_);
[email protected]b9b651f2013-11-09 04:32:221625 }
1626
davidben7e555daf2015-03-25 17:03:291627 // Many servers do not reliably send a close_notify alert when shutting down
1628 // a connection, and instead terminate the TCP connection. This is reported
1629 // as ERR_CONNECTION_CLOSED. Because of this, map the unclean shutdown to a
1630 // graceful EOF, instead of treating it as an error as it should be.
1631 if (pending_read_error_ == ERR_CONNECTION_CLOSED)
1632 pending_read_error_ = 0;
1633 }
davidbenbe6ce7ec2014-10-20 19:15:561634
davidben7e555daf2015-03-25 17:03:291635 if (total_bytes_read > 0) {
1636 // Return any bytes read to the caller. The error will be deferred to the
1637 // next call of DoPayloadRead.
1638 rv = total_bytes_read;
davidbenbe6ce7ec2014-10-20 19:15:561639
davidben7e555daf2015-03-25 17:03:291640 // Do not treat insufficient data as an error to return in the next call to
1641 // DoPayloadRead() - instead, let the call fall through to check SSL_read()
1642 // again. This is because DoTransportIO() may complete in between the next
1643 // call to DoPayloadRead(), and thus it is important to check SSL_read() on
1644 // subsequent invocations to see if a complete record may now be read.
1645 if (pending_read_error_ == ERR_IO_PENDING)
davidben1d48952e2015-07-01 18:48:461646 pending_read_error_ = kNoPendingResult;
davidben7e555daf2015-03-25 17:03:291647 } else {
1648 // No bytes were returned. Return the pending read error immediately.
davidben1d48952e2015-07-01 18:48:461649 DCHECK_NE(kNoPendingResult, pending_read_error_);
davidben7e555daf2015-03-25 17:03:291650 rv = pending_read_error_;
davidben1d48952e2015-07-01 18:48:461651 pending_read_error_ = kNoPendingResult;
[email protected]b9b651f2013-11-09 04:32:221652 }
1653
1654 if (rv >= 0) {
1655 net_log_.AddByteTransferEvent(NetLog::TYPE_SSL_SOCKET_BYTES_RECEIVED, rv,
1656 user_read_buf_->data());
davidbenb8c23212014-10-28 00:12:161657 } else if (rv != ERR_IO_PENDING) {
1658 net_log_.AddEvent(
1659 NetLog::TYPE_SSL_READ_ERROR,
1660 CreateNetLogOpenSSLErrorCallback(rv, pending_read_ssl_error_,
1661 pending_read_error_info_));
1662 pending_read_ssl_error_ = SSL_ERROR_NONE;
1663 pending_read_error_info_ = OpenSSLErrorInfo();
[email protected]b9b651f2013-11-09 04:32:221664 }
1665 return rv;
1666}
1667
svaldeze83af292016-04-26 14:33:371668int SSLClientSocketImpl::DoPayloadWrite() {
[email protected]b9b651f2013-11-09 04:32:221669 crypto::OpenSSLErrStackTracer err_tracer(FROM_HERE);
1670 int rv = SSL_write(ssl_, user_write_buf_->data(), user_write_buf_len_);
rsleevif020edc2015-03-16 19:31:241671
[email protected]b9b651f2013-11-09 04:32:221672 if (rv >= 0) {
1673 net_log_.AddByteTransferEvent(NetLog::TYPE_SSL_SOCKET_BYTES_SENT, rv,
1674 user_write_buf_->data());
1675 return rv;
1676 }
1677
davidbenb8c23212014-10-28 00:12:161678 int ssl_error = SSL_get_error(ssl_, rv);
davidben1d48952e2015-07-01 18:48:461679 if (ssl_error == SSL_ERROR_WANT_PRIVATE_KEY_OPERATION)
1680 return ERR_IO_PENDING;
davidbenb8c23212014-10-28 00:12:161681 OpenSSLErrorInfo error_info;
svaldeze83af292016-04-26 14:33:371682 int net_error =
1683 MapOpenSSLErrorWithDetails(ssl_error, err_tracer, &error_info);
davidbenb8c23212014-10-28 00:12:161684
1685 if (net_error != ERR_IO_PENDING) {
1686 net_log_.AddEvent(
1687 NetLog::TYPE_SSL_WRITE_ERROR,
1688 CreateNetLogOpenSSLErrorCallback(net_error, ssl_error, error_info));
1689 }
1690 return net_error;
[email protected]b9b651f2013-11-09 04:32:221691}
1692
svaldeze83af292016-04-26 14:33:371693void SSLClientSocketImpl::PumpReadWriteEvents() {
davidben1d48952e2015-07-01 18:48:461694 int rv_read = ERR_IO_PENDING;
1695 int rv_write = ERR_IO_PENDING;
1696 bool network_moved;
1697 do {
1698 if (user_read_buf_.get())
1699 rv_read = DoPayloadRead();
1700 if (user_write_buf_.get())
1701 rv_write = DoPayloadWrite();
1702 network_moved = DoTransportIO();
1703 } while (rv_read == ERR_IO_PENDING && rv_write == ERR_IO_PENDING &&
1704 (user_read_buf_.get() || user_write_buf_.get()) && network_moved);
1705
1706 // Performing the Read callback may cause |this| to be deleted. If this
1707 // happens, the Write callback should not be invoked. Guard against this by
1708 // holding a WeakPtr to |this| and ensuring it's still valid.
svaldeze83af292016-04-26 14:33:371709 base::WeakPtr<SSLClientSocketImpl> guard(weak_factory_.GetWeakPtr());
davidben1d48952e2015-07-01 18:48:461710 if (user_read_buf_.get() && rv_read != ERR_IO_PENDING)
1711 DoReadCallback(rv_read);
1712
1713 if (!guard.get())
1714 return;
1715
1716 if (user_write_buf_.get() && rv_write != ERR_IO_PENDING)
1717 DoWriteCallback(rv_write);
1718}
1719
svaldeze83af292016-04-26 14:33:371720int SSLClientSocketImpl::BufferSend(void) {
[email protected]b9b651f2013-11-09 04:32:221721 if (transport_send_busy_)
1722 return ERR_IO_PENDING;
1723
haavardm2d92e722014-12-19 13:45:441724 size_t buffer_read_offset;
1725 uint8_t* read_buf;
1726 size_t max_read;
1727 int status = BIO_zero_copy_get_read_buf(transport_bio_, &read_buf,
1728 &buffer_read_offset, &max_read);
1729 DCHECK_EQ(status, 1); // Should never fail.
1730 if (!max_read)
1731 return 0; // Nothing pending in the OpenSSL write BIO.
1732 CHECK_EQ(read_buf, reinterpret_cast<uint8_t*>(send_buffer_->StartOfBuffer()));
1733 CHECK_LT(buffer_read_offset, static_cast<size_t>(send_buffer_->capacity()));
1734 send_buffer_->set_offset(buffer_read_offset);
[email protected]b9b651f2013-11-09 04:32:221735
1736 int rv = transport_->socket()->Write(
haavardm2d92e722014-12-19 13:45:441737 send_buffer_.get(), max_read,
svaldeze83af292016-04-26 14:33:371738 base::Bind(&SSLClientSocketImpl::BufferSendComplete,
[email protected]b9b651f2013-11-09 04:32:221739 base::Unretained(this)));
1740 if (rv == ERR_IO_PENDING) {
1741 transport_send_busy_ = true;
1742 } else {
1743 TransportWriteComplete(rv);
1744 }
1745 return rv;
1746}
1747
svaldeze83af292016-04-26 14:33:371748int SSLClientSocketImpl::BufferRecv(void) {
[email protected]b9b651f2013-11-09 04:32:221749 if (transport_recv_busy_)
1750 return ERR_IO_PENDING;
1751
1752 // Determine how much was requested from |transport_bio_| that was not
1753 // actually available.
1754 size_t requested = BIO_ctrl_get_read_request(transport_bio_);
1755 if (requested == 0) {
1756 // This is not a perfect match of error codes, as no operation is
1757 // actually pending. However, returning 0 would be interpreted as
1758 // a possible sign of EOF, which is also an inappropriate match.
1759 return ERR_IO_PENDING;
1760 }
1761
1762 // Known Issue: While only reading |requested| data is the more correct
1763 // implementation, it has the downside of resulting in frequent reads:
1764 // One read for the SSL record header (~5 bytes) and one read for the SSL
1765 // record body. Rather than issuing these reads to the underlying socket
1766 // (and constantly allocating new IOBuffers), a single Read() request to
1767 // fill |transport_bio_| is issued. As long as an SSL client socket cannot
1768 // be gracefully shutdown (via SSL close alerts) and re-used for non-SSL
1769 // traffic, this over-subscribed Read()ing will not cause issues.
haavardm2d92e722014-12-19 13:45:441770
1771 size_t buffer_write_offset;
1772 uint8_t* write_buf;
1773 size_t max_write;
1774 int status = BIO_zero_copy_get_write_buf(transport_bio_, &write_buf,
1775 &buffer_write_offset, &max_write);
1776 DCHECK_EQ(status, 1); // Should never fail.
[email protected]b9b651f2013-11-09 04:32:221777 if (!max_write)
1778 return ERR_IO_PENDING;
1779
haavardm2d92e722014-12-19 13:45:441780 CHECK_EQ(write_buf,
1781 reinterpret_cast<uint8_t*>(recv_buffer_->StartOfBuffer()));
1782 CHECK_LT(buffer_write_offset, static_cast<size_t>(recv_buffer_->capacity()));
1783
1784 recv_buffer_->set_offset(buffer_write_offset);
[email protected]b9b651f2013-11-09 04:32:221785 int rv = transport_->socket()->Read(
svaldeze83af292016-04-26 14:33:371786 recv_buffer_.get(), max_write,
1787 base::Bind(&SSLClientSocketImpl::BufferRecvComplete,
[email protected]b9b651f2013-11-09 04:32:221788 base::Unretained(this)));
1789 if (rv == ERR_IO_PENDING) {
1790 transport_recv_busy_ = true;
1791 } else {
[email protected]3e5c6922014-02-06 02:42:161792 rv = TransportReadComplete(rv);
[email protected]b9b651f2013-11-09 04:32:221793 }
1794 return rv;
1795}
1796
svaldeze83af292016-04-26 14:33:371797void SSLClientSocketImpl::BufferSendComplete(int result) {
[email protected]b9b651f2013-11-09 04:32:221798 TransportWriteComplete(result);
1799 OnSendComplete(result);
1800}
1801
svaldeze83af292016-04-26 14:33:371802void SSLClientSocketImpl::BufferRecvComplete(int result) {
[email protected]3e5c6922014-02-06 02:42:161803 result = TransportReadComplete(result);
[email protected]b9b651f2013-11-09 04:32:221804 OnRecvComplete(result);
1805}
1806
svaldeze83af292016-04-26 14:33:371807void SSLClientSocketImpl::TransportWriteComplete(int result) {
[email protected]b9b651f2013-11-09 04:32:221808 DCHECK(ERR_IO_PENDING != result);
haavardm2d92e722014-12-19 13:45:441809 int bytes_written = 0;
[email protected]b9b651f2013-11-09 04:32:221810 if (result < 0) {
[email protected]5aea79182014-07-14 20:43:411811 // Record the error. Save it to be reported in a future read or write on
1812 // transport_bio_'s peer.
[email protected]3e5c6922014-02-06 02:42:161813 transport_write_error_ = result;
[email protected]b9b651f2013-11-09 04:32:221814 } else {
haavardm2d92e722014-12-19 13:45:441815 bytes_written = result;
[email protected]b9b651f2013-11-09 04:32:221816 }
haavardm2d92e722014-12-19 13:45:441817 DCHECK_GE(send_buffer_->RemainingCapacity(), bytes_written);
1818 int ret = BIO_zero_copy_get_read_buf_done(transport_bio_, bytes_written);
1819 DCHECK_EQ(1, ret);
1820 transport_send_busy_ = false;
[email protected]b9b651f2013-11-09 04:32:221821}
1822
svaldeze83af292016-04-26 14:33:371823int SSLClientSocketImpl::TransportReadComplete(int result) {
[email protected]b9b651f2013-11-09 04:32:221824 DCHECK(ERR_IO_PENDING != result);
[email protected]5aea79182014-07-14 20:43:411825 // If an EOF, canonicalize to ERR_CONNECTION_CLOSED here so MapOpenSSLError
1826 // does not report success.
1827 if (result == 0)
1828 result = ERR_CONNECTION_CLOSED;
haavardm2d92e722014-12-19 13:45:441829 int bytes_read = 0;
[email protected]5aea79182014-07-14 20:43:411830 if (result < 0) {
[email protected]b9b651f2013-11-09 04:32:221831 DVLOG(1) << "TransportReadComplete result " << result;
[email protected]5aea79182014-07-14 20:43:411832 // Received an error. Save it to be reported in a future read on
1833 // transport_bio_'s peer.
1834 transport_read_error_ = result;
[email protected]b9b651f2013-11-09 04:32:221835 } else {
haavardm2d92e722014-12-19 13:45:441836 bytes_read = result;
[email protected]b9b651f2013-11-09 04:32:221837 }
haavardm2d92e722014-12-19 13:45:441838 DCHECK_GE(recv_buffer_->RemainingCapacity(), bytes_read);
1839 int ret = BIO_zero_copy_get_write_buf_done(transport_bio_, bytes_read);
1840 DCHECK_EQ(1, ret);
[email protected]b9b651f2013-11-09 04:32:221841 transport_recv_busy_ = false;
[email protected]3e5c6922014-02-06 02:42:161842 return result;
[email protected]b9b651f2013-11-09 04:32:221843}
1844
svaldeze83af292016-04-26 14:33:371845int SSLClientSocketImpl::ClientCertRequestCallback(SSL* ssl) {
[email protected]5ac981e182010-12-06 17:56:271846 DVLOG(3) << "OpenSSL ClientCertRequestCallback called";
1847 DCHECK(ssl == ssl_);
[email protected]82c59022014-08-15 09:38:271848
davidbenaf42cbe2014-11-13 03:27:461849 net_log_.AddEvent(NetLog::TYPE_SSL_CLIENT_CERT_REQUESTED);
1850
[email protected]82c59022014-08-15 09:38:271851 // Clear any currently configured certificates.
1852 SSL_certs_clear(ssl_);
[email protected]97a854f2014-07-29 07:51:361853
1854#if defined(OS_IOS)
1855 // TODO(droger): Support client auth on iOS. See http://crbug.com/145954).
1856 LOG(WARNING) << "Client auth is not supported";
svaldeze83af292016-04-26 14:33:371857#else // !defined(OS_IOS)
[email protected]5ac981e182010-12-06 17:56:271858 if (!ssl_config_.send_client_cert) {
[email protected]515adc22013-01-09 16:01:231859 // First pass: we know that a client certificate is needed, but we do not
1860 // have one at hand.
svaldeze83af292016-04-26 14:33:371861 STACK_OF(X509_NAME)* authorities = SSL_get_client_CA_list(ssl);
[email protected]edfd0f42014-07-22 18:20:371862 for (size_t i = 0; i < sk_X509_NAME_num(authorities); i++) {
svaldeze83af292016-04-26 14:33:371863 X509_NAME* ca_name = (X509_NAME*)sk_X509_NAME_value(authorities, i);
[email protected]515adc22013-01-09 16:01:231864 unsigned char* str = NULL;
1865 int length = i2d_X509_NAME(ca_name, &str);
1866 cert_authorities_.push_back(std::string(
svaldeze83af292016-04-26 14:33:371867 reinterpret_cast<const char*>(str), static_cast<size_t>(length)));
[email protected]515adc22013-01-09 16:01:231868 OPENSSL_free(str);
1869 }
1870
[email protected]c0787702014-05-20 21:51:441871 const unsigned char* client_cert_types;
[email protected]e7e883e2014-07-25 06:03:081872 size_t num_client_cert_types =
1873 SSL_get0_certificate_types(ssl, &client_cert_types);
[email protected]c0787702014-05-20 21:51:441874 for (size_t i = 0; i < num_client_cert_types; i++) {
1875 cert_key_types_.push_back(
1876 static_cast<SSLClientCertType>(client_cert_types[i]));
1877 }
1878
davidbenced4aa9b2015-05-12 21:22:351879 // Suspends handshake. SSL_get_error will return SSL_ERROR_WANT_X509_LOOKUP.
1880 return -1;
[email protected]5ac981e182010-12-06 17:56:271881 }
1882
1883 // Second pass: a client certificate should have been selected.
[email protected]13914c92013-06-13 22:42:421884 if (ssl_config_.client_cert.get()) {
[email protected]6bad5052014-07-12 01:25:131885 ScopedX509 leaf_x509 =
1886 OSCertHandleToOpenSSL(ssl_config_.client_cert->os_cert_handle());
1887 if (!leaf_x509) {
1888 LOG(WARNING) << "Failed to import certificate";
1889 OpenSSLPutNetError(FROM_HERE, ERR_SSL_CLIENT_AUTH_CERT_BAD_FORMAT);
1890 return -1;
1891 }
1892
[email protected]82c59022014-08-15 09:38:271893 ScopedX509Stack chain = OSCertHandlesToOpenSSL(
1894 ssl_config_.client_cert->GetIntermediateCertificates());
1895 if (!chain) {
1896 LOG(WARNING) << "Failed to import intermediate certificates";
1897 OpenSSLPutNetError(FROM_HERE, ERR_SSL_CLIENT_AUTH_CERT_BAD_FORMAT);
1898 return -1;
1899 }
1900
davidben1d48952e2015-07-01 18:48:461901 if (!SSL_use_certificate(ssl_, leaf_x509.get()) ||
1902 !SSL_set1_chain(ssl_, chain.get())) {
1903 LOG(WARNING) << "Failed to set client certificate";
1904 return -1;
1905 }
1906
svaldez7872fd02015-11-19 21:10:541907 if (!ssl_config_.client_private_key) {
1908 // The caller supplied a null private key. Fail the handshake and surface
1909 // an appropriate error to the caller.
davidben1d48952e2015-07-01 18:48:461910 LOG(WARNING) << "Client cert found without private key";
1911 OpenSSLPutNetError(FROM_HERE, ERR_SSL_CLIENT_AUTH_CERT_NO_PRIVATE_KEY);
1912 return -1;
1913 }
1914
1915 SSL_set_private_key_method(ssl_, &SSLContext::kPrivateKeyMethod);
svaldezf3db006f2015-09-29 16:43:581916
1917 std::vector<SSLPrivateKey::Hash> digest_prefs =
svaldez7872fd02015-11-19 21:10:541918 ssl_config_.client_private_key->GetDigestPreferences();
svaldezf3db006f2015-09-29 16:43:581919
1920 size_t digests_len = digest_prefs.size();
1921 std::vector<int> digests;
1922 for (size_t i = 0; i < digests_len; i++) {
1923 switch (digest_prefs[i]) {
1924 case SSLPrivateKey::Hash::SHA1:
1925 digests.push_back(NID_sha1);
1926 break;
1927 case SSLPrivateKey::Hash::SHA256:
1928 digests.push_back(NID_sha256);
1929 break;
1930 case SSLPrivateKey::Hash::SHA384:
1931 digests.push_back(NID_sha384);
1932 break;
1933 case SSLPrivateKey::Hash::SHA512:
1934 digests.push_back(NID_sha512);
1935 break;
1936 case SSLPrivateKey::Hash::MD5_SHA1:
1937 // MD5-SHA1 is not used in TLS 1.2.
1938 break;
1939 }
1940 }
1941
davidben5f8b6bc2015-11-25 03:19:541942 SSL_set_private_key_digest_prefs(ssl_, digests.data(), digests.size());
davidbenaf42cbe2014-11-13 03:27:461943
1944 int cert_count = 1 + sk_X509_num(chain.get());
1945 net_log_.AddEvent(NetLog::TYPE_SSL_CLIENT_CERT_PROVIDED,
tfarina5e24b242015-10-27 13:11:281946 NetLog::IntCallback("cert_count", cert_count));
[email protected]6bad5052014-07-12 01:25:131947 return 1;
[email protected]c0787702014-05-20 21:51:441948 }
[email protected]97a854f2014-07-29 07:51:361949#endif // defined(OS_IOS)
[email protected]5ac981e182010-12-06 17:56:271950
1951 // Send no client certificate.
davidbenaf42cbe2014-11-13 03:27:461952 net_log_.AddEvent(NetLog::TYPE_SSL_CLIENT_CERT_PROVIDED,
tfarina5e24b242015-10-27 13:11:281953 NetLog::IntCallback("cert_count", 0));
[email protected]82c59022014-08-15 09:38:271954 return 1;
[email protected]5ac981e182010-12-06 17:56:271955}
1956
svaldeze83af292016-04-26 14:33:371957int SSLClientSocketImpl::CertVerifyCallback(X509_STORE_CTX* store_ctx) {
[email protected]64b5c892014-08-08 09:39:261958 if (!completed_connect_) {
[email protected]b051cdb62014-02-28 02:20:161959 // If the first handshake hasn't completed then we accept any certificates
1960 // because we verify after the handshake.
1961 return 1;
1962 }
1963
davidben30798ed82014-09-19 19:28:201964 // Disallow the server certificate to change in a renegotiation.
1965 if (server_cert_chain_->empty()) {
[email protected]76e85392014-03-20 17:54:141966 LOG(ERROR) << "Received invalid certificate chain between handshakes";
davidben30798ed82014-09-19 19:28:201967 return 0;
1968 }
1969 base::StringPiece old_der, new_der;
1970 if (store_ctx->cert == NULL ||
1971 !x509_util::GetDER(server_cert_chain_->Get(0), &old_der) ||
1972 !x509_util::GetDER(store_ctx->cert, &new_der)) {
1973 LOG(ERROR) << "Failed to encode certificates";
1974 return 0;
1975 }
1976 if (old_der != new_der) {
[email protected]76e85392014-03-20 17:54:141977 LOG(ERROR) << "Server certificate changed between handshakes";
davidben30798ed82014-09-19 19:28:201978 return 0;
1979 }
1980
1981 return 1;
[email protected]b051cdb62014-02-28 02:20:161982}
1983
[email protected]ae7c9f42011-11-21 11:41:161984// SelectNextProtoCallback is called by OpenSSL during the handshake. If the
1985// server supports NPN, selects a protocol from the list that the server
thestigc23b8ec42016-01-08 01:41:121986// provides. According to third_party/boringssl/src/ssl/ssl_lib.c, the
[email protected]ae7c9f42011-11-21 11:41:161987// callback can assume that |in| is syntactically valid.
svaldeze83af292016-04-26 14:33:371988int SSLClientSocketImpl::SelectNextProtoCallback(unsigned char** out,
1989 unsigned char* outlen,
1990 const unsigned char* in,
1991 unsigned int inlen) {
bnc1f295372015-10-21 23:24:221992 if (ssl_config_.npn_protos.empty()) {
Avi Drissman13fc8932015-12-20 04:40:461993 *out = reinterpret_cast<uint8_t*>(
[email protected]168a8412012-06-14 05:05:491994 const_cast<char*>(kDefaultSupportedNPNProtocol));
1995 *outlen = arraysize(kDefaultSupportedNPNProtocol) - 1;
1996 npn_status_ = kNextProtoUnsupported;
[email protected]ea4a1c6a2010-12-09 13:33:281997 return SSL_TLSEXT_ERR_OK;
1998 }
1999
[email protected]ae7c9f42011-11-21 11:41:162000 // Assume there's no overlap between our protocols and the server's list.
[email protected]168a8412012-06-14 05:05:492001 npn_status_ = kNextProtoNoOverlap;
[email protected]ae7c9f42011-11-21 11:41:162002
2003 // For each protocol in server preference order, see if we support it.
2004 for (unsigned int i = 0; i < inlen; i += in[i] + 1) {
bnc1f295372015-10-21 23:24:222005 for (NextProto next_proto : ssl_config_.npn_protos) {
bnc0d23cf42014-12-11 14:09:462006 const std::string proto = NextProtoToString(next_proto);
2007 if (in[i] == proto.size() &&
2008 memcmp(&in[i + 1], proto.data(), in[i]) == 0) {
[email protected]168a8412012-06-14 05:05:492009 // We found a match.
[email protected]ae7c9f42011-11-21 11:41:162010 *out = const_cast<unsigned char*>(in) + i + 1;
2011 *outlen = in[i];
[email protected]168a8412012-06-14 05:05:492012 npn_status_ = kNextProtoNegotiated;
[email protected]ae7c9f42011-11-21 11:41:162013 break;
2014 }
2015 }
[email protected]168a8412012-06-14 05:05:492016 if (npn_status_ == kNextProtoNegotiated)
[email protected]ae7c9f42011-11-21 11:41:162017 break;
2018 }
[email protected]ea4a1c6a2010-12-09 13:33:282019
bncde27dae2015-10-06 07:11:022020 // If we didn't find a protocol, we select the last one from our list.
[email protected]168a8412012-06-14 05:05:492021 if (npn_status_ == kNextProtoNoOverlap) {
bnc67da3de2015-01-15 21:02:262022 // NextProtoToString returns a pointer to a static string.
bnc1f295372015-10-21 23:24:222023 const char* proto = NextProtoToString(ssl_config_.npn_protos.back());
bnc67da3de2015-01-15 21:02:262024 *out = reinterpret_cast<unsigned char*>(const_cast<char*>(proto));
2025 *outlen = strlen(proto);
[email protected]168a8412012-06-14 05:05:492026 }
2027
[email protected]ea4a1c6a2010-12-09 13:33:282028 npn_proto_.assign(reinterpret_cast<const char*>(*out), *outlen);
[email protected]32e1dee2010-12-09 18:36:242029 DVLOG(2) << "next protocol: '" << npn_proto_ << "' status: " << npn_status_;
bnc0d28ea52014-10-13 15:15:382030 set_negotiation_extension(kExtensionNPN);
[email protected]ea4a1c6a2010-12-09 13:33:282031 return SSL_TLSEXT_ERR_OK;
2032}
2033
svaldeze83af292016-04-26 14:33:372034long SSLClientSocketImpl::MaybeReplayTransportError(BIO* bio,
2035 int cmd,
2036 const char* argp,
2037 int argi,
2038 long argl,
2039 long retvalue) {
2040 if (cmd == (BIO_CB_READ | BIO_CB_RETURN) && retvalue <= 0) {
[email protected]5aea79182014-07-14 20:43:412041 // If there is no more data in the buffer, report any pending errors that
2042 // were observed. Note that both the readbuf and the writebuf are checked
2043 // for errors, since the application may have encountered a socket error
2044 // while writing that would otherwise not be reported until the application
2045 // attempted to write again - which it may never do. See
2046 // https://crbug.com/249848.
2047 if (transport_read_error_ != OK) {
2048 OpenSSLPutNetError(FROM_HERE, transport_read_error_);
2049 return -1;
2050 }
2051 if (transport_write_error_ != OK) {
2052 OpenSSLPutNetError(FROM_HERE, transport_write_error_);
2053 return -1;
2054 }
2055 } else if (cmd == BIO_CB_WRITE) {
2056 // Because of the write buffer, this reports a failure from the previous
2057 // write payload. If the current payload fails to write, the error will be
2058 // reported in a future write or read to |bio|.
2059 if (transport_write_error_ != OK) {
2060 OpenSSLPutNetError(FROM_HERE, transport_write_error_);
2061 return -1;
2062 }
2063 }
2064 return retvalue;
2065}
2066
2067// static
svaldeze83af292016-04-26 14:33:372068long SSLClientSocketImpl::BIOCallback(BIO* bio,
2069 int cmd,
2070 const char* argp,
2071 int argi,
2072 long argl,
2073 long retvalue) {
2074 SSLClientSocketImpl* socket =
2075 reinterpret_cast<SSLClientSocketImpl*>(BIO_get_callback_arg(bio));
[email protected]5aea79182014-07-14 20:43:412076 CHECK(socket);
svaldeze83af292016-04-26 14:33:372077 return socket->MaybeReplayTransportError(bio, cmd, argp, argi, argl,
2078 retvalue);
[email protected]5aea79182014-07-14 20:43:412079}
2080
svaldeze83af292016-04-26 14:33:372081void SSLClientSocketImpl::MaybeCacheSession() {
davidben44aeae62015-06-24 20:47:432082 // Only cache the session once both a new session has been established and the
2083 // certificate has been verified. Due to False Start, these events may happen
2084 // in either order.
2085 if (!session_pending_ || !certificate_verified_)
davidbendafe4e52015-04-08 22:53:522086 return;
davidbendafe4e52015-04-08 22:53:522087
2088 SSLContext::GetInstance()->session_cache()->Insert(GetSessionCacheKey(),
2089 SSL_get_session(ssl_));
davidben44aeae62015-06-24 20:47:432090 session_pending_ = false;
davidbendafe4e52015-04-08 22:53:522091}
2092
svaldeze83af292016-04-26 14:33:372093int SSLClientSocketImpl::NewSessionCallback(SSL_SESSION* session) {
davidben44aeae62015-06-24 20:47:432094 DCHECK_EQ(session, SSL_get_session(ssl_));
davidbendafe4e52015-04-08 22:53:522095
davidben44aeae62015-06-24 20:47:432096 // Only sessions from the initial handshake get cached. Note this callback may
2097 // be signaled on abbreviated handshakes if the ticket was renewed.
2098 session_pending_ = true;
davidbendafe4e52015-04-08 22:53:522099 MaybeCacheSession();
davidben44aeae62015-06-24 20:47:432100
2101 // OpenSSL passes a reference to |session|, but the session cache does not
2102 // take this reference, so release it.
2103 SSL_SESSION_free(session);
2104 return 1;
davidbendafe4e52015-04-08 22:53:522105}
2106
svaldeze83af292016-04-26 14:33:372107void SSLClientSocketImpl::AddCTInfoToSSLInfo(SSLInfo* ssl_info) const {
estark723b5eeb2016-02-18 21:01:122108 ssl_info->UpdateCertificateTransparencyInfo(ct_verify_result_);
davidbeneb5f8ef32014-09-04 14:14:322109}
2110
svaldeze83af292016-04-26 14:33:372111std::string SSLClientSocketImpl::GetSessionCacheKey() const {
rsleevif020edc2015-03-16 19:31:242112 std::string result = host_and_port_.ToString();
2113 result.append("/");
2114 result.append(ssl_session_cache_shard_);
2115
2116 // Shard the session cache based on maximum protocol version. This causes
2117 // fallback connections to use a separate session cache.
2118 result.append("/");
2119 switch (ssl_config_.version_max) {
rsleevif020edc2015-03-16 19:31:242120 case SSL_PROTOCOL_VERSION_TLS1:
2121 result.append("tls1");
2122 break;
2123 case SSL_PROTOCOL_VERSION_TLS1_1:
2124 result.append("tls1.1");
2125 break;
2126 case SSL_PROTOCOL_VERSION_TLS1_2:
2127 result.append("tls1.2");
2128 break;
2129 default:
2130 NOTREACHED();
2131 }
2132
davidbena4c9d062015-04-03 22:34:252133 result.append("/");
davidben14b1a532015-10-30 16:01:092134 if (ssl_config_.deprecated_cipher_suites_enabled)
davidbena4c9d062015-04-03 22:34:252135 result.append("deprecated");
2136
davidbenee39de02015-10-16 19:53:182137 result.append("/");
2138 if (ssl_config_.channel_id_enabled)
2139 result.append("channelid");
2140
rsleevif020edc2015-03-16 19:31:242141 return result;
2142}
2143
svaldeze83af292016-04-26 14:33:372144bool SSLClientSocketImpl::IsRenegotiationAllowed() const {
nharper736ceda2015-11-07 00:16:592145 if (tb_was_negotiated_)
2146 return false;
2147
davidben421116c2015-05-12 19:56:512148 if (npn_status_ == kNextProtoUnsupported)
2149 return ssl_config_.renego_allowed_default;
2150
2151 NextProto next_proto = NextProtoFromString(npn_proto_);
2152 for (NextProto allowed : ssl_config_.renego_allowed_for_protos) {
2153 if (next_proto == allowed)
2154 return true;
2155 }
2156 return false;
2157}
2158
svaldeze83af292016-04-26 14:33:372159int SSLClientSocketImpl::PrivateKeyTypeCallback() {
svaldez7872fd02015-11-19 21:10:542160 switch (ssl_config_.client_private_key->GetType()) {
davidben1d48952e2015-07-01 18:48:462161 case SSLPrivateKey::Type::RSA:
2162 return EVP_PKEY_RSA;
2163 case SSLPrivateKey::Type::ECDSA:
2164 return EVP_PKEY_EC;
2165 }
2166 NOTREACHED();
2167 return EVP_PKEY_NONE;
2168}
2169
svaldeze83af292016-04-26 14:33:372170size_t SSLClientSocketImpl::PrivateKeyMaxSignatureLenCallback() {
svaldez7872fd02015-11-19 21:10:542171 return ssl_config_.client_private_key->GetMaxSignatureLengthInBytes();
davidben1d48952e2015-07-01 18:48:462172}
2173
svaldeze83af292016-04-26 14:33:372174ssl_private_key_result_t SSLClientSocketImpl::PrivateKeySignCallback(
davidben1d48952e2015-07-01 18:48:462175 uint8_t* out,
2176 size_t* out_len,
2177 size_t max_out,
2178 const EVP_MD* md,
2179 const uint8_t* in,
2180 size_t in_len) {
2181 DCHECK_EQ(kNoPendingResult, signature_result_);
2182 DCHECK(signature_.empty());
svaldez7872fd02015-11-19 21:10:542183 DCHECK(ssl_config_.client_private_key);
davidben1d48952e2015-07-01 18:48:462184
davidben1d48952e2015-07-01 18:48:462185 SSLPrivateKey::Hash hash;
2186 if (!EVP_MDToPrivateKeyHash(md, &hash)) {
2187 OpenSSLPutNetError(FROM_HERE, ERR_SSL_CLIENT_AUTH_SIGNATURE_FAILED);
2188 return ssl_private_key_failure;
2189 }
2190
davidben752bcf22015-12-21 22:55:502191 net_log_.BeginEvent(
2192 NetLog::TYPE_SSL_PRIVATE_KEY_OPERATION,
2193 base::Bind(&NetLogPrivateKeyOperationCallback,
2194 ssl_config_.client_private_key->GetType(), hash));
2195
davidben1d48952e2015-07-01 18:48:462196 signature_result_ = ERR_IO_PENDING;
svaldez7872fd02015-11-19 21:10:542197 ssl_config_.client_private_key->SignDigest(
davidben1d48952e2015-07-01 18:48:462198 hash, base::StringPiece(reinterpret_cast<const char*>(in), in_len),
svaldeze83af292016-04-26 14:33:372199 base::Bind(&SSLClientSocketImpl::OnPrivateKeySignComplete,
davidben1d48952e2015-07-01 18:48:462200 weak_factory_.GetWeakPtr()));
2201 return ssl_private_key_retry;
2202}
2203
svaldeze83af292016-04-26 14:33:372204ssl_private_key_result_t SSLClientSocketImpl::PrivateKeySignCompleteCallback(
davidben1d48952e2015-07-01 18:48:462205 uint8_t* out,
2206 size_t* out_len,
2207 size_t max_out) {
2208 DCHECK_NE(kNoPendingResult, signature_result_);
svaldez7872fd02015-11-19 21:10:542209 DCHECK(ssl_config_.client_private_key);
davidben1d48952e2015-07-01 18:48:462210
2211 if (signature_result_ == ERR_IO_PENDING)
2212 return ssl_private_key_retry;
2213 if (signature_result_ != OK) {
2214 OpenSSLPutNetError(FROM_HERE, signature_result_);
2215 return ssl_private_key_failure;
2216 }
2217 if (signature_.size() > max_out) {
2218 OpenSSLPutNetError(FROM_HERE, ERR_SSL_CLIENT_AUTH_SIGNATURE_FAILED);
2219 return ssl_private_key_failure;
2220 }
davidben5f8b6bc2015-11-25 03:19:542221 memcpy(out, signature_.data(), signature_.size());
davidben1d48952e2015-07-01 18:48:462222 *out_len = signature_.size();
2223 signature_.clear();
2224 return ssl_private_key_success;
2225}
2226
svaldeze83af292016-04-26 14:33:372227void SSLClientSocketImpl::OnPrivateKeySignComplete(
davidben1d48952e2015-07-01 18:48:462228 Error error,
2229 const std::vector<uint8_t>& signature) {
2230 DCHECK_EQ(ERR_IO_PENDING, signature_result_);
2231 DCHECK(signature_.empty());
svaldez7872fd02015-11-19 21:10:542232 DCHECK(ssl_config_.client_private_key);
davidben1d48952e2015-07-01 18:48:462233
2234 net_log_.EndEventWithNetErrorCode(NetLog::TYPE_SSL_PRIVATE_KEY_OPERATION,
2235 error);
2236
2237 signature_result_ = error;
2238 if (signature_result_ == OK)
2239 signature_ = signature;
2240
2241 if (next_handshake_state_ == STATE_HANDSHAKE) {
2242 OnHandshakeIOComplete(signature_result_);
2243 return;
2244 }
2245
2246 // During a renegotiation, either Read or Write calls may be blocked on an
2247 // asynchronous private key operation.
2248 PumpReadWriteEvents();
2249}
2250
svaldeze83af292016-04-26 14:33:372251int SSLClientSocketImpl::TokenBindingAdd(const uint8_t** out,
2252 size_t* out_len,
2253 int* out_alert_value) {
nharper736ceda2015-11-07 00:16:592254 if (ssl_config_.token_binding_params.empty()) {
2255 return 0;
2256 }
davidben7dad2a32016-03-01 23:47:472257 crypto::AutoCBB output;
nharper736ceda2015-11-07 00:16:592258 CBB parameters_list;
2259 if (!CBB_init(output.get(), 7) ||
2260 !CBB_add_u8(output.get(), kTbProtocolVersionMajor) ||
2261 !CBB_add_u8(output.get(), kTbProtocolVersionMinor) ||
2262 !CBB_add_u8_length_prefixed(output.get(), &parameters_list)) {
2263 *out_alert_value = SSL_AD_INTERNAL_ERROR;
2264 return -1;
2265 }
2266 for (size_t i = 0; i < ssl_config_.token_binding_params.size(); ++i) {
2267 if (!CBB_add_u8(&parameters_list, ssl_config_.token_binding_params[i])) {
2268 *out_alert_value = SSL_AD_INTERNAL_ERROR;
2269 return -1;
2270 }
2271 }
2272 // |*out| will be freed by TokenBindingFreeCallback.
2273 if (!CBB_finish(output.get(), const_cast<uint8_t**>(out), out_len)) {
2274 *out_alert_value = SSL_AD_INTERNAL_ERROR;
2275 return -1;
2276 }
2277
2278 return 1;
2279}
2280
svaldeze83af292016-04-26 14:33:372281int SSLClientSocketImpl::TokenBindingParse(const uint8_t* contents,
2282 size_t contents_len,
2283 int* out_alert_value) {
nharper736ceda2015-11-07 00:16:592284 if (completed_connect_) {
2285 // Token Binding may only be negotiated on the initial handshake.
2286 *out_alert_value = SSL_AD_ILLEGAL_PARAMETER;
2287 return 0;
2288 }
2289
2290 CBS extension;
2291 CBS_init(&extension, contents, contents_len);
2292
2293 CBS parameters_list;
2294 uint8_t version_major, version_minor, param;
2295 if (!CBS_get_u8(&extension, &version_major) ||
2296 !CBS_get_u8(&extension, &version_minor) ||
2297 !CBS_get_u8_length_prefixed(&extension, &parameters_list) ||
2298 !CBS_get_u8(&parameters_list, &param) || CBS_len(&parameters_list) > 0 ||
2299 CBS_len(&extension) > 0) {
2300 *out_alert_value = SSL_AD_DECODE_ERROR;
2301 return 0;
2302 }
2303 // The server-negotiated version must be less than or equal to our version.
2304 if (version_major > kTbProtocolVersionMajor ||
2305 (version_minor > kTbProtocolVersionMinor &&
2306 version_major == kTbProtocolVersionMajor)) {
2307 *out_alert_value = SSL_AD_ILLEGAL_PARAMETER;
2308 return 0;
2309 }
2310 // If the version the server negotiated is older than we support, don't fail
2311 // parsing the extension, but also don't set |negotiated_|.
2312 if (version_major < kTbMinProtocolVersionMajor ||
2313 (version_minor < kTbMinProtocolVersionMinor &&
2314 version_major == kTbMinProtocolVersionMajor)) {
2315 return 1;
2316 }
2317
2318 for (size_t i = 0; i < ssl_config_.token_binding_params.size(); ++i) {
2319 if (param == ssl_config_.token_binding_params[i]) {
2320 tb_negotiated_param_ = ssl_config_.token_binding_params[i];
2321 tb_was_negotiated_ = true;
2322 return 1;
2323 }
2324 }
2325
2326 *out_alert_value = SSL_AD_ILLEGAL_PARAMETER;
2327 return 0;
2328}
2329
davidben281d13f02016-04-27 20:43:282330void SSLClientSocketImpl::LogConnectEndEvent(int rv) {
2331 if (rv != OK) {
2332 net_log_.EndEventWithNetErrorCode(NetLog::TYPE_SSL_CONNECT, rv);
2333 return;
2334 }
2335
2336 net_log_.EndEvent(NetLog::TYPE_SSL_CONNECT,
2337 base::Bind(&NetLogSSLInfoCallback, base::Unretained(this)));
2338}
2339
[email protected]7e5dd49f2010-12-08 18:33:492340} // namespace net