blob: de52c6013b5c961a3209c595109ee878956d5f4e [file] [log] [blame]
[email protected]013c17c2012-01-21 19:09:011// Copyright (c) 2012 The Chromium Authors. All rights reserved.
[email protected]d518cd92010-09-29 12:27:442// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
svaldeze83af292016-04-26 14:33:375#include "net/socket/ssl_client_socket_impl.h"
[email protected]d518cd92010-09-29 12:27:446
[email protected]edfd0f42014-07-22 18:20:377#include <errno.h>
davidben018aad62014-09-12 02:25:198#include <openssl/bio.h>
nharper736ceda2015-11-07 00:16:599#include <openssl/bytestring.h>
[email protected]d518cd92010-09-29 12:27:4410#include <openssl/err.h>
nharper736ceda2015-11-07 00:16:5911#include <openssl/evp.h>
davidben121e9c962015-05-01 00:40:4912#include <openssl/mem.h>
[email protected]536fd0b2013-03-14 17:41:5713#include <openssl/ssl.h>
bnc67da3de2015-01-15 21:02:2614#include <string.h>
[email protected]d518cd92010-09-29 12:27:4415
davidben752bcf22015-12-21 22:55:5016#include <utility>
17
[email protected]0f7804ec2011-10-07 20:04:1818#include "base/bind.h"
[email protected]f2da6ac2013-02-04 08:22:5319#include "base/callback_helpers.h"
davidben1d489522015-07-01 18:48:4620#include "base/lazy_instance.h"
Avi Drissman13fc8932015-12-20 04:40:4621#include "base/macros.h"
[email protected]3b63f8f42011-03-28 01:54:1522#include "base/memory/singleton.h"
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"
51#include "net/ssl/ssl_info.h"
davidben1d489522015-07-01 18:48:4652#include "net/ssl/ssl_private_key.h"
nharperd5cddca2016-02-27 03:37:5253#include "net/ssl/token_binding.h"
[email protected]d518cd92010-09-29 12:27:4454
davidben2a811e4e2015-12-01 10:49:3455#if !defined(OS_NACL)
56#include "net/ssl/ssl_key_logger.h"
57#endif
58
svaldez2135be52016-04-20 16:34:5359#if defined(USE_NSS_CERTS)
davidbena477a70a2015-10-06 04:38:2960#include "net/cert_net/nss_ocsp.h"
61#endif
62
[email protected]d518cd92010-09-29 12:27:4463namespace net {
64
65namespace {
66
[email protected]4b768562013-02-16 04:10:0767// This constant can be any non-negative/non-zero value (eg: it does not
68// overlap with any value of the net::Error range, including net::OK).
davidben1d489522015-07-01 18:48:4669const int kNoPendingResult = 1;
[email protected]4b768562013-02-16 04:10:0770
[email protected]168a8412012-06-14 05:05:4971// If a client doesn't have a list of protocols that it supports, but
72// the server supports NPN, choosing "http/1.1" is the best answer.
73const char kDefaultSupportedNPNProtocol[] = "http/1.1";
74
haavardm2d92e722014-12-19 13:45:4475// Default size of the internal BoringSSL buffers.
76const int KDefaultOpenSSLBufferSize = 17 * 1024;
77
nharper736ceda2015-11-07 00:16:5978// TLS extension number use for Token Binding.
nharperb5ad8a802016-02-05 19:40:0079const unsigned int kTbExtNum = 24;
nharper736ceda2015-11-07 00:16:5980
81// Token Binding ProtocolVersions supported.
82const uint8_t kTbProtocolVersionMajor = 0;
nharperb5a0f6c2016-04-04 21:50:3983const uint8_t kTbProtocolVersionMinor = 5;
nharper736ceda2015-11-07 00:16:5984const uint8_t kTbMinProtocolVersionMajor = 0;
nharper47d408a42016-01-28 23:00:3885const uint8_t kTbMinProtocolVersionMinor = 3;
nharper736ceda2015-11-07 00:16:5986
davidben1d489522015-07-01 18:48:4687bool EVP_MDToPrivateKeyHash(const EVP_MD* md, SSLPrivateKey::Hash* hash) {
88 switch (EVP_MD_type(md)) {
89 case NID_md5_sha1:
90 *hash = SSLPrivateKey::Hash::MD5_SHA1;
91 return true;
92 case NID_sha1:
93 *hash = SSLPrivateKey::Hash::SHA1;
94 return true;
95 case NID_sha256:
96 *hash = SSLPrivateKey::Hash::SHA256;
97 return true;
98 case NID_sha384:
99 *hash = SSLPrivateKey::Hash::SHA384;
100 return true;
101 case NID_sha512:
102 *hash = SSLPrivateKey::Hash::SHA512;
103 return true;
104 default:
105 return false;
106 }
107}
108
danakj655b66c2016-04-16 00:51:38109std::unique_ptr<base::Value> NetLogPrivateKeyOperationCallback(
davidben752bcf22015-12-21 22:55:50110 SSLPrivateKey::Type type,
111 SSLPrivateKey::Hash hash,
112 NetLogCaptureMode mode) {
113 std::string type_str;
114 switch (type) {
115 case SSLPrivateKey::Type::RSA:
116 type_str = "RSA";
117 break;
118 case SSLPrivateKey::Type::ECDSA:
119 type_str = "ECDSA";
120 break;
121 }
122
123 std::string hash_str;
124 switch (hash) {
125 case SSLPrivateKey::Hash::MD5_SHA1:
126 hash_str = "MD5_SHA1";
127 break;
128 case SSLPrivateKey::Hash::SHA1:
129 hash_str = "SHA1";
130 break;
131 case SSLPrivateKey::Hash::SHA256:
132 hash_str = "SHA256";
133 break;
134 case SSLPrivateKey::Hash::SHA384:
135 hash_str = "SHA384";
136 break;
137 case SSLPrivateKey::Hash::SHA512:
138 hash_str = "SHA512";
139 break;
140 }
141
danakj655b66c2016-04-16 00:51:38142 std::unique_ptr<base::DictionaryValue> value(new base::DictionaryValue);
davidben752bcf22015-12-21 22:55:50143 value->SetString("type", type_str);
144 value->SetString("hash", hash_str);
145 return std::move(value);
146}
147
danakj655b66c2016-04-16 00:51:38148std::unique_ptr<base::Value> NetLogChannelIDLookupCallback(
nharper49b27d992016-02-09 18:28:51149 ChannelIDService* channel_id_service,
150 NetLogCaptureMode capture_mode) {
151 ChannelIDStore* store = channel_id_service->GetChannelIDStore();
danakj655b66c2016-04-16 00:51:38152 std::unique_ptr<base::DictionaryValue> dict(new base::DictionaryValue());
nharper49b27d992016-02-09 18:28:51153 dict->SetBoolean("ephemeral", store->IsEphemeral());
154 dict->SetString("service", base::HexEncode(&channel_id_service,
155 sizeof(channel_id_service)));
156 dict->SetString("store", base::HexEncode(&store, sizeof(store)));
157 return std::move(dict);
158}
159
danakj655b66c2016-04-16 00:51:38160std::unique_ptr<base::Value> NetLogChannelIDLookupCompleteCallback(
nharper49b27d992016-02-09 18:28:51161 crypto::ECPrivateKey* key,
162 int result,
163 NetLogCaptureMode capture_mode) {
danakj655b66c2016-04-16 00:51:38164 std::unique_ptr<base::DictionaryValue> dict(new base::DictionaryValue());
nharper49b27d992016-02-09 18:28:51165 dict->SetInteger("net_error", result);
166 std::string raw_key;
167 if (result == OK && key && key->ExportRawPublicKey(&raw_key)) {
168 std::string key_to_log = "redacted";
169 if (capture_mode.include_cookies_and_credentials()) {
170 key_to_log = base::HexEncode(raw_key.data(), raw_key.length());
171 }
172 dict->SetString("key", key_to_log);
173 }
174 return std::move(dict);
175}
176
davidben281d13f02016-04-27 20:43:28177std::unique_ptr<base::Value> NetLogSSLInfoCallback(
178 SSLClientSocketImpl* socket,
179 NetLogCaptureMode capture_mode) {
180 SSLInfo ssl_info;
181 if (!socket->GetSSLInfo(&ssl_info))
182 return nullptr;
183
184 std::unique_ptr<base::DictionaryValue> dict(new base::DictionaryValue());
185 const char* version_str;
186 SSLVersionToString(&version_str,
187 SSLConnectionStatusToVersion(ssl_info.connection_status));
188 dict->SetString("version", version_str);
189 dict->SetBoolean("is_resumed",
190 ssl_info.handshake_type == SSLInfo::HANDSHAKE_RESUME);
191 dict->SetInteger("cipher_suite", SSLConnectionStatusToCipherSuite(
192 ssl_info.connection_status));
193
194 std::string next_proto;
195 socket->GetNextProto(&next_proto);
196 dict->SetString("next_proto", next_proto);
197
198 return std::move(dict);
199}
200
[email protected]821e3bb2013-11-08 01:06:01201} // namespace
202
svaldeze83af292016-04-26 14:33:37203class SSLClientSocketImpl::SSLContext {
[email protected]fbef13932010-11-23 12:38:53204 public:
olli.raula36aa8be2015-09-10 11:14:22205 static SSLContext* GetInstance() {
206 return base::Singleton<SSLContext>::get();
207 }
[email protected]fbef13932010-11-23 12:38:53208 SSL_CTX* ssl_ctx() { return ssl_ctx_.get(); }
svaldeze83af292016-04-26 14:33:37209 SSLClientSessionCache* session_cache() { return &session_cache_; }
[email protected]fbef13932010-11-23 12:38:53210
svaldeze83af292016-04-26 14:33:37211 SSLClientSocketImpl* GetClientSocketFromSSL(const SSL* ssl) {
[email protected]fbef13932010-11-23 12:38:53212 DCHECK(ssl);
svaldeze83af292016-04-26 14:33:37213 SSLClientSocketImpl* socket = static_cast<SSLClientSocketImpl*>(
[email protected]fbef13932010-11-23 12:38:53214 SSL_get_ex_data(ssl, ssl_socket_data_index_));
215 DCHECK(socket);
216 return socket;
217 }
218
svaldeze83af292016-04-26 14:33:37219 bool SetClientSocketForSSL(SSL* ssl, SSLClientSocketImpl* socket) {
[email protected]fbef13932010-11-23 12:38:53220 return SSL_set_ex_data(ssl, ssl_socket_data_index_, socket) != 0;
221 }
222
davidben2a811e4e2015-12-01 10:49:34223#if !defined(OS_NACL)
224 void SetSSLKeyLogFile(
225 const base::FilePath& path,
226 const scoped_refptr<base::SequencedTaskRunner>& task_runner) {
227 DCHECK(!ssl_key_logger_);
228 ssl_key_logger_.reset(new SSLKeyLogger(path, task_runner));
229 SSL_CTX_set_keylog_callback(ssl_ctx_.get(), KeyLogCallback);
230 }
231#endif
232
davidben1d489522015-07-01 18:48:46233 static const SSL_PRIVATE_KEY_METHOD kPrivateKeyMethod;
234
[email protected]fbef13932010-11-23 12:38:53235 private:
olli.raula36aa8be2015-09-10 11:14:22236 friend struct base::DefaultSingletonTraits<SSLContext>;
[email protected]fbef13932010-11-23 12:38:53237
svaldeze83af292016-04-26 14:33:37238 SSLContext() : session_cache_(SSLClientSessionCache::Config()) {
[email protected]4b559b4d2011-04-14 17:37:14239 crypto::EnsureOpenSSLInit();
[email protected]fbef13932010-11-23 12:38:53240 ssl_socket_data_index_ = SSL_get_ex_new_index(0, 0, 0, 0, 0);
241 DCHECK_NE(ssl_socket_data_index_, -1);
242 ssl_ctx_.reset(SSL_CTX_new(SSLv23_client_method()));
[email protected]b051cdb62014-02-28 02:20:16243 SSL_CTX_set_cert_verify_callback(ssl_ctx_.get(), CertVerifyCallback, NULL);
[email protected]82c59022014-08-15 09:38:27244 SSL_CTX_set_cert_cb(ssl_ctx_.get(), ClientCertRequestCallback, NULL);
[email protected]b051cdb62014-02-28 02:20:16245 SSL_CTX_set_verify(ssl_ctx_.get(), SSL_VERIFY_PEER, NULL);
haavardmc80b0ee32015-01-30 09:16:08246 // This stops |SSL_shutdown| from generating the close_notify message, which
247 // is currently not sent on the network.
248 // TODO(haavardm): Remove setting quiet shutdown once 118366 is fixed.
249 SSL_CTX_set_quiet_shutdown(ssl_ctx_.get(), 1);
bnc2d6bd0f2015-10-28 01:52:05250 // Note that SSL_OP_DISABLE_NPN is used to disable NPN if
251 // ssl_config_.next_proto is empty.
[email protected]ea4a1c6a2010-12-09 13:33:28252 SSL_CTX_set_next_proto_select_cb(ssl_ctx_.get(), SelectNextProtoCallback,
253 NULL);
davidbendafe4e52015-04-08 22:53:52254
255 // Disable the internal session cache. Session caching is handled
svaldeze83af292016-04-26 14:33:37256 // externally (i.e. by SSLClientSessionCache).
davidbendafe4e52015-04-08 22:53:52257 SSL_CTX_set_session_cache_mode(
258 ssl_ctx_.get(), SSL_SESS_CACHE_CLIENT | SSL_SESS_CACHE_NO_INTERNAL);
davidben44aeae62015-06-24 20:47:43259 SSL_CTX_sess_set_new_cb(ssl_ctx_.get(), NewSessionCallback);
nharper736ceda2015-11-07 00:16:59260
261 if (!SSL_CTX_add_client_custom_ext(ssl_ctx_.get(), kTbExtNum,
262 &TokenBindingAddCallback,
263 &TokenBindingFreeCallback, nullptr,
264 &TokenBindingParseCallback, nullptr)) {
265 NOTREACHED();
266 }
267 }
268
269 static int TokenBindingAddCallback(SSL* ssl,
270 unsigned int extension_value,
271 const uint8_t** out,
272 size_t* out_len,
273 int* out_alert_value,
274 void* add_arg) {
275 DCHECK_EQ(extension_value, kTbExtNum);
svaldeze83af292016-04-26 14:33:37276 SSLClientSocketImpl* socket =
277 SSLClientSocketImpl::SSLContext::GetInstance()->GetClientSocketFromSSL(
278 ssl);
nharper736ceda2015-11-07 00:16:59279 return socket->TokenBindingAdd(out, out_len, out_alert_value);
280 }
281
282 static void TokenBindingFreeCallback(SSL* ssl,
283 unsigned extension_value,
284 const uint8_t* out,
285 void* add_arg) {
286 DCHECK_EQ(extension_value, kTbExtNum);
287 OPENSSL_free(const_cast<unsigned char*>(out));
288 }
289
290 static int TokenBindingParseCallback(SSL* ssl,
291 unsigned int extension_value,
292 const uint8_t* contents,
293 size_t contents_len,
294 int* out_alert_value,
295 void* parse_arg) {
296 DCHECK_EQ(extension_value, kTbExtNum);
svaldeze83af292016-04-26 14:33:37297 SSLClientSocketImpl* socket =
298 SSLClientSocketImpl::SSLContext::GetInstance()->GetClientSocketFromSSL(
299 ssl);
nharper736ceda2015-11-07 00:16:59300 return socket->TokenBindingParse(contents, contents_len, out_alert_value);
[email protected]fbef13932010-11-23 12:38:53301 }
302
[email protected]82c59022014-08-15 09:38:27303 static int ClientCertRequestCallback(SSL* ssl, void* arg) {
svaldeze83af292016-04-26 14:33:37304 SSLClientSocketImpl* socket = GetInstance()->GetClientSocketFromSSL(ssl);
[email protected]82c59022014-08-15 09:38:27305 DCHECK(socket);
306 return socket->ClientCertRequestCallback(ssl);
[email protected]718c9672010-12-02 10:04:10307 }
308
svaldeze83af292016-04-26 14:33:37309 static int CertVerifyCallback(X509_STORE_CTX* store_ctx, void* arg) {
[email protected]b051cdb62014-02-28 02:20:16310 SSL* ssl = reinterpret_cast<SSL*>(X509_STORE_CTX_get_ex_data(
311 store_ctx, SSL_get_ex_data_X509_STORE_CTX_idx()));
svaldeze83af292016-04-26 14:33:37312 SSLClientSocketImpl* socket = GetInstance()->GetClientSocketFromSSL(ssl);
[email protected]b051cdb62014-02-28 02:20:16313 CHECK(socket);
314
315 return socket->CertVerifyCallback(store_ctx);
316 }
317
[email protected]ea4a1c6a2010-12-09 13:33:28318 static int SelectNextProtoCallback(SSL* ssl,
svaldeze83af292016-04-26 14:33:37319 unsigned char** out,
320 unsigned char* outlen,
[email protected]ea4a1c6a2010-12-09 13:33:28321 const unsigned char* in,
svaldeze83af292016-04-26 14:33:37322 unsigned int inlen,
323 void* arg) {
324 SSLClientSocketImpl* socket = GetInstance()->GetClientSocketFromSSL(ssl);
[email protected]ea4a1c6a2010-12-09 13:33:28325 return socket->SelectNextProtoCallback(out, outlen, in, inlen);
326 }
327
davidben44aeae62015-06-24 20:47:43328 static int NewSessionCallback(SSL* ssl, SSL_SESSION* session) {
svaldeze83af292016-04-26 14:33:37329 SSLClientSocketImpl* socket = GetInstance()->GetClientSocketFromSSL(ssl);
davidben44aeae62015-06-24 20:47:43330 return socket->NewSessionCallback(session);
davidbendafe4e52015-04-08 22:53:52331 }
332
davidben1d489522015-07-01 18:48:46333 static int PrivateKeyTypeCallback(SSL* ssl) {
svaldeze83af292016-04-26 14:33:37334 SSLClientSocketImpl* socket = GetInstance()->GetClientSocketFromSSL(ssl);
davidben1d489522015-07-01 18:48:46335 return socket->PrivateKeyTypeCallback();
336 }
337
davidben1d489522015-07-01 18:48:46338 static size_t PrivateKeyMaxSignatureLenCallback(SSL* ssl) {
svaldeze83af292016-04-26 14:33:37339 SSLClientSocketImpl* socket = GetInstance()->GetClientSocketFromSSL(ssl);
davidben1d489522015-07-01 18:48:46340 return socket->PrivateKeyMaxSignatureLenCallback();
341 }
342
343 static ssl_private_key_result_t PrivateKeySignCallback(SSL* ssl,
344 uint8_t* out,
345 size_t* out_len,
346 size_t max_out,
347 const EVP_MD* md,
348 const uint8_t* in,
349 size_t in_len) {
svaldeze83af292016-04-26 14:33:37350 SSLClientSocketImpl* socket = GetInstance()->GetClientSocketFromSSL(ssl);
davidben1d489522015-07-01 18:48:46351 return socket->PrivateKeySignCallback(out, out_len, max_out, md, in,
352 in_len);
353 }
354
355 static ssl_private_key_result_t PrivateKeySignCompleteCallback(
356 SSL* ssl,
357 uint8_t* out,
358 size_t* out_len,
359 size_t max_out) {
svaldeze83af292016-04-26 14:33:37360 SSLClientSocketImpl* socket = GetInstance()->GetClientSocketFromSSL(ssl);
davidben1d489522015-07-01 18:48:46361 return socket->PrivateKeySignCompleteCallback(out, out_len, max_out);
362 }
363
davidben2a811e4e2015-12-01 10:49:34364#if !defined(OS_NACL)
365 static void KeyLogCallback(const SSL* ssl, const char* line) {
366 GetInstance()->ssl_key_logger_->WriteLine(line);
367 }
368#endif
369
[email protected]fbef13932010-11-23 12:38:53370 // This is the index used with SSL_get_ex_data to retrieve the owner
svaldeze83af292016-04-26 14:33:37371 // SSLClientSocketImpl object from an SSL instance.
[email protected]fbef13932010-11-23 12:38:53372 int ssl_socket_data_index_;
373
davidbenc879af02015-02-20 07:57:21374 ScopedSSL_CTX ssl_ctx_;
davidbendafe4e52015-04-08 22:53:52375
davidben2a811e4e2015-12-01 10:49:34376#if !defined(OS_NACL)
danakj655b66c2016-04-16 00:51:38377 std::unique_ptr<SSLKeyLogger> ssl_key_logger_;
davidben2a811e4e2015-12-01 10:49:34378#endif
379
davidbendafe4e52015-04-08 22:53:52380 // TODO(davidben): Use a separate cache per URLRequestContext.
381 // https://crbug.com/458365
382 //
383 // TODO(davidben): Sessions should be invalidated on fatal
384 // alerts. https://crbug.com/466352
svaldeze83af292016-04-26 14:33:37385 SSLClientSessionCache session_cache_;
[email protected]1279de12013-12-03 15:13:32386};
387
davidben1d489522015-07-01 18:48:46388const SSL_PRIVATE_KEY_METHOD
svaldeze83af292016-04-26 14:33:37389 SSLClientSocketImpl::SSLContext::kPrivateKeyMethod = {
390 &SSLClientSocketImpl::SSLContext::PrivateKeyTypeCallback,
391 &SSLClientSocketImpl::SSLContext::PrivateKeyMaxSignatureLenCallback,
392 &SSLClientSocketImpl::SSLContext::PrivateKeySignCallback,
393 &SSLClientSocketImpl::SSLContext::PrivateKeySignCompleteCallback,
davidben1d489522015-07-01 18:48:46394};
395
[email protected]7f38da8a2014-03-17 16:44:26396// PeerCertificateChain is a helper object which extracts the certificate
397// chain, as given by the server, from an OpenSSL socket and performs the needed
398// resource management. The first element of the chain is the leaf certificate
399// and the other elements are in the order given by the server.
svaldeze83af292016-04-26 14:33:37400class SSLClientSocketImpl::PeerCertificateChain {
[email protected]7f38da8a2014-03-17 16:44:26401 public:
svaldeze83af292016-04-26 14:33:37402 explicit PeerCertificateChain(STACK_OF(X509) * chain) { Reset(chain); }
[email protected]7f38da8a2014-03-17 16:44:26403 PeerCertificateChain(const PeerCertificateChain& other) { *this = other; }
404 ~PeerCertificateChain() {}
405 PeerCertificateChain& operator=(const PeerCertificateChain& other);
406
[email protected]76e85392014-03-20 17:54:14407 // Resets the PeerCertificateChain to the set of certificates in|chain|,
408 // which may be NULL, indicating to empty the store certificates.
409 // Note: If an error occurs, such as being unable to parse the certificates,
410 // this will behave as if Reset(NULL) was called.
svaldeze83af292016-04-26 14:33:37411 void Reset(STACK_OF(X509) * chain);
[email protected]76e85392014-03-20 17:54:14412
svaldez2135be52016-04-20 16:34:53413 // Note that when USE_OPENSSL_CERTS is defined, OSCertHandle is X509*
davidben30798ed82014-09-19 19:28:20414 scoped_refptr<X509Certificate> AsOSChain() const;
[email protected]7f38da8a2014-03-17 16:44:26415
416 size_t size() const {
417 if (!openssl_chain_.get())
418 return 0;
419 return sk_X509_num(openssl_chain_.get());
420 }
421
svaldeze83af292016-04-26 14:33:37422 bool empty() const { return size() == 0; }
davidben30798ed82014-09-19 19:28:20423
424 X509* Get(size_t index) const {
[email protected]7f38da8a2014-03-17 16:44:26425 DCHECK_LT(index, size());
426 return sk_X509_value(openssl_chain_.get(), index);
427 }
428
429 private:
[email protected]cd9b75b2014-07-10 04:39:38430 ScopedX509Stack openssl_chain_;
[email protected]7f38da8a2014-03-17 16:44:26431};
432
svaldeze83af292016-04-26 14:33:37433SSLClientSocketImpl::PeerCertificateChain&
434SSLClientSocketImpl::PeerCertificateChain::operator=(
[email protected]7f38da8a2014-03-17 16:44:26435 const PeerCertificateChain& other) {
436 if (this == &other)
437 return *this;
438
[email protected]24176af2014-08-14 09:31:04439 openssl_chain_.reset(X509_chain_up_ref(other.openssl_chain_.get()));
[email protected]7f38da8a2014-03-17 16:44:26440 return *this;
441}
442
svaldeze83af292016-04-26 14:33:37443void SSLClientSocketImpl::PeerCertificateChain::Reset(STACK_OF(X509) * chain) {
davidben30798ed82014-09-19 19:28:20444 openssl_chain_.reset(chain ? X509_chain_up_ref(chain) : NULL);
[email protected]7f38da8a2014-03-17 16:44:26445}
[email protected]7f38da8a2014-03-17 16:44:26446
davidben30798ed82014-09-19 19:28:20447scoped_refptr<X509Certificate>
svaldeze83af292016-04-26 14:33:37448SSLClientSocketImpl::PeerCertificateChain::AsOSChain() const {
davidben30798ed82014-09-19 19:28:20449#if defined(USE_OPENSSL_CERTS)
450 // When OSCertHandle is typedef'ed to X509, this implementation does a short
451 // cut to avoid converting back and forth between DER and the X509 struct.
452 X509Certificate::OSCertHandles intermediates;
453 for (size_t i = 1; i < sk_X509_num(openssl_chain_.get()); ++i) {
454 intermediates.push_back(sk_X509_value(openssl_chain_.get(), i));
455 }
[email protected]7f38da8a2014-03-17 16:44:26456
svaldezc4b6f122016-01-20 22:13:59457 return X509Certificate::CreateFromHandle(
458 sk_X509_value(openssl_chain_.get(), 0), intermediates);
davidben30798ed82014-09-19 19:28:20459#else
460 // DER-encode the chain and convert to a platform certificate handle.
[email protected]7f38da8a2014-03-17 16:44:26461 std::vector<base::StringPiece> der_chain;
[email protected]edfd0f42014-07-22 18:20:37462 for (size_t i = 0; i < sk_X509_num(openssl_chain_.get()); ++i) {
[email protected]7f38da8a2014-03-17 16:44:26463 X509* x = sk_X509_value(openssl_chain_.get(), i);
davidben30798ed82014-09-19 19:28:20464 base::StringPiece der;
465 if (!x509_util::GetDER(x, &der))
466 return NULL;
467 der_chain.push_back(der);
[email protected]7f38da8a2014-03-17 16:44:26468 }
469
svaldezc4b6f122016-01-20 22:13:59470 return X509Certificate::CreateFromDERCertChain(der_chain);
davidben30798ed82014-09-19 19:28:20471#endif
[email protected]7f38da8a2014-03-17 16:44:26472}
[email protected]7f38da8a2014-03-17 16:44:26473
[email protected]1279de12013-12-03 15:13:32474// static
[email protected]c3456bb2011-12-12 22:22:19475void SSLClientSocket::ClearSessionCache() {
svaldeze83af292016-04-26 14:33:37476 SSLClientSocketImpl::SSLContext* context =
477 SSLClientSocketImpl::SSLContext::GetInstance();
[email protected]c3456bb2011-12-12 22:22:19478 context->session_cache()->Flush();
479}
480
svaldeze83af292016-04-26 14:33:37481SSLClientSocketImpl::SSLClientSocketImpl(
danakj655b66c2016-04-16 00:51:38482 std::unique_ptr<ClientSocketHandle> transport_socket,
[email protected]055d7f22010-11-15 12:03:12483 const HostPortPair& host_and_port,
[email protected]822581d2010-12-16 17:27:15484 const SSLConfig& ssl_config,
[email protected]feb79bcd2011-07-21 16:55:17485 const SSLClientSocketContext& context)
[email protected]83039bb2011-12-09 18:43:55486 : transport_send_busy_(false),
[email protected]d518cd92010-09-29 12:27:44487 transport_recv_busy_(false),
davidben1d489522015-07-01 18:48:46488 pending_read_error_(kNoPendingResult),
davidbenb8c23212014-10-28 00:12:16489 pending_read_ssl_error_(SSL_ERROR_NONE),
[email protected]5aea79182014-07-14 20:43:41490 transport_read_error_(OK),
[email protected]3e5c6922014-02-06 02:42:16491 transport_write_error_(OK),
[email protected]7f38da8a2014-03-17 16:44:26492 server_cert_chain_(new PeerCertificateChain(NULL)),
[email protected]64b5c892014-08-08 09:39:26493 completed_connect_(false),
[email protected]0dc88b32014-03-26 20:12:28494 was_ever_used_(false),
[email protected]feb79bcd2011-07-21 16:55:17495 cert_verifier_(context.cert_verifier),
davidbeneb5f8ef32014-09-04 14:14:32496 cert_transparency_verifier_(context.cert_transparency_verifier),
[email protected]6b8a3c742014-07-25 00:25:35497 channel_id_service_(context.channel_id_service),
nharper736ceda2015-11-07 00:16:59498 tb_was_negotiated_(false),
499 tb_negotiated_param_(TB_PARAM_ECDSAP256),
nharperb7441ef2016-01-25 23:54:14500 tb_signed_ekm_map_(10),
[email protected]d518cd92010-09-29 12:27:44501 ssl_(NULL),
502 transport_bio_(NULL),
dchengc7eeda422015-12-26 03:56:48503 transport_(std::move(transport_socket)),
[email protected]055d7f22010-11-15 12:03:12504 host_and_port_(host_and_port),
[email protected]d518cd92010-09-29 12:27:44505 ssl_config_(ssl_config),
[email protected]c3456bb2011-12-12 22:22:19506 ssl_session_cache_shard_(context.ssl_session_cache_shard),
[email protected]013c17c2012-01-21 19:09:01507 next_handshake_state_(STATE_NONE),
svaldez4af14d22015-08-20 13:48:24508 disconnected_(false),
[email protected]ea4a1c6a2010-12-09 13:33:28509 npn_status_(kNextProtoUnsupported),
davidben52053b382015-04-27 19:22:29510 channel_id_sent_(false),
davidben44aeae62015-06-24 20:47:43511 session_pending_(false),
davidbendafe4e52015-04-08 22:53:52512 certificate_verified_(false),
davidben1d489522015-07-01 18:48:46513 signature_result_(kNoPendingResult),
[email protected]8bd4e7a2014-08-09 14:49:17514 transport_security_state_(context.transport_security_state),
estark6f9b3d82016-01-12 21:37:05515 policy_enforcer_(context.ct_policy_enforcer),
dadriandf302c42016-06-10 18:48:59516 pkp_bypassed_(false),
kulkarni.acd7b4462014-08-28 07:41:34517 net_log_(transport_->socket()->NetLog()),
518 weak_factory_(this) {
rsleevibe81cd62016-06-24 01:38:59519 CHECK(cert_verifier_);
520 CHECK(transport_security_state_);
521 CHECK(cert_transparency_verifier_);
522 CHECK(policy_enforcer_);
[email protected]8e458552014-08-05 00:02:15523}
[email protected]d518cd92010-09-29 12:27:44524
svaldeze83af292016-04-26 14:33:37525SSLClientSocketImpl::~SSLClientSocketImpl() {
[email protected]d518cd92010-09-29 12:27:44526 Disconnect();
527}
528
davidben2a811e4e2015-12-01 10:49:34529#if !defined(OS_NACL)
svaldeze83af292016-04-26 14:33:37530void SSLClientSocketImpl::SetSSLKeyLogFile(
davidben2a811e4e2015-12-01 10:49:34531 const base::FilePath& ssl_keylog_file,
532 const scoped_refptr<base::SequencedTaskRunner>& task_runner) {
533 SSLContext::GetInstance()->SetSSLKeyLogFile(ssl_keylog_file, task_runner);
zhongyi81f85c6d92015-10-16 19:34:14534}
davidben2a811e4e2015-12-01 10:49:34535#endif
zhongyi81f85c6d92015-10-16 19:34:14536
svaldeze83af292016-04-26 14:33:37537void SSLClientSocketImpl::GetSSLCertRequestInfo(
[email protected]b9b651f2013-11-09 04:32:22538 SSLCertRequestInfo* cert_request_info) {
[email protected]791879c2013-12-17 07:22:41539 cert_request_info->host_and_port = host_and_port_;
[email protected]b9b651f2013-11-09 04:32:22540 cert_request_info->cert_authorities = cert_authorities_;
[email protected]c0787702014-05-20 21:51:44541 cert_request_info->cert_key_types = cert_key_types_;
[email protected]b9b651f2013-11-09 04:32:22542}
543
svaldeze83af292016-04-26 14:33:37544SSLClientSocket::NextProtoStatus SSLClientSocketImpl::GetNextProto(
davidben6974bf72015-04-27 17:52:48545 std::string* proto) const {
[email protected]b9b651f2013-11-09 04:32:22546 *proto = npn_proto_;
[email protected]b9b651f2013-11-09 04:32:22547 return npn_status_;
548}
549
svaldeze83af292016-04-26 14:33:37550ChannelIDService* SSLClientSocketImpl::GetChannelIDService() const {
[email protected]6b8a3c742014-07-25 00:25:35551 return channel_id_service_;
[email protected]b9b651f2013-11-09 04:32:22552}
553
svaldeze83af292016-04-26 14:33:37554Error SSLClientSocketImpl::GetSignedEKMForTokenBinding(
nharperb7441ef2016-01-25 23:54:14555 crypto::ECPrivateKey* key,
556 std::vector<uint8_t>* out) {
557 // The same key will be used across multiple requests to sign the same value,
558 // so the signature is cached.
559 std::string raw_public_key;
560 if (!key->ExportRawPublicKey(&raw_public_key))
561 return ERR_FAILED;
562 SignedEkmMap::iterator it = tb_signed_ekm_map_.Get(raw_public_key);
563 if (it != tb_signed_ekm_map_.end()) {
564 *out = it->second;
565 return OK;
566 }
567
568 uint8_t tb_ekm_buf[32];
569 static const char kTokenBindingExporterLabel[] = "EXPORTER-Token-Binding";
570 if (!SSL_export_keying_material(ssl_, tb_ekm_buf, sizeof(tb_ekm_buf),
571 kTokenBindingExporterLabel,
572 strlen(kTokenBindingExporterLabel), nullptr,
573 0, false /* no context */)) {
574 return ERR_FAILED;
575 }
576
nharperd5cddca2016-02-27 03:37:52577 if (!SignTokenBindingEkm(
578 base::StringPiece(reinterpret_cast<char*>(tb_ekm_buf),
579 sizeof(tb_ekm_buf)),
580 key, out))
nharperb7441ef2016-01-25 23:54:14581 return ERR_FAILED;
nharperb7441ef2016-01-25 23:54:14582
583 tb_signed_ekm_map_.Put(raw_public_key, *out);
584 return OK;
585}
586
svaldeze83af292016-04-26 14:33:37587crypto::ECPrivateKey* SSLClientSocketImpl::GetChannelIDKey() const {
nharperb36644f2016-02-22 23:14:43588 return channel_id_key_.get();
589}
590
svaldeze83af292016-04-26 14:33:37591int SSLClientSocketImpl::ExportKeyingMaterial(const base::StringPiece& label,
592 bool has_context,
593 const base::StringPiece& context,
594 unsigned char* out,
595 unsigned int outlen) {
davidben86935f72015-05-06 22:24:49596 if (!IsConnected())
597 return ERR_SOCKET_NOT_CONNECTED;
598
[email protected]b9b651f2013-11-09 04:32:22599 crypto::OpenSSLErrStackTracer err_tracer(FROM_HERE);
600
601 int rv = SSL_export_keying_material(
[email protected]c8a80e92014-05-17 16:02:08602 ssl_, out, outlen, label.data(), label.size(),
davidben866c3d4a72015-04-06 21:56:43603 reinterpret_cast<const unsigned char*>(context.data()), context.length(),
604 has_context ? 1 : 0);
[email protected]b9b651f2013-11-09 04:32:22605
606 if (rv != 1) {
607 int ssl_error = SSL_get_error(ssl_, rv);
608 LOG(ERROR) << "Failed to export keying material;"
svaldeze83af292016-04-26 14:33:37609 << " returned " << rv << ", SSL error code " << ssl_error;
[email protected]b9b651f2013-11-09 04:32:22610 return MapOpenSSLError(ssl_error, err_tracer);
611 }
612 return OK;
613}
614
svaldeze83af292016-04-26 14:33:37615int SSLClientSocketImpl::Connect(const CompletionCallback& callback) {
svaldez4af14d22015-08-20 13:48:24616 // Although StreamSocket does allow calling Connect() after Disconnect(),
617 // this has never worked for layered sockets. CHECK to detect any consumers
618 // reconnecting an SSL socket.
619 //
620 // TODO(davidben,mmenke): Remove this API feature. See
621 // https://crbug.com/499289.
622 CHECK(!disconnected_);
623
[email protected]b9b651f2013-11-09 04:32:22624 net_log_.BeginEvent(NetLog::TYPE_SSL_CONNECT);
625
626 // Set up new ssl object.
[email protected]c8a80e92014-05-17 16:02:08627 int rv = Init();
628 if (rv != OK) {
davidben281d13f02016-04-27 20:43:28629 LogConnectEndEvent(rv);
[email protected]c8a80e92014-05-17 16:02:08630 return rv;
[email protected]b9b651f2013-11-09 04:32:22631 }
632
633 // Set SSL to client mode. Handshake happens in the loop below.
634 SSL_set_connect_state(ssl_);
635
rsleeviadbd4982016-06-13 22:10:27636 next_handshake_state_ = STATE_HANDSHAKE;
[email protected]c8a80e92014-05-17 16:02:08637 rv = DoHandshakeLoop(OK);
[email protected]b9b651f2013-11-09 04:32:22638 if (rv == ERR_IO_PENDING) {
639 user_connect_callback_ = callback;
640 } else {
davidben281d13f02016-04-27 20:43:28641 LogConnectEndEvent(rv);
[email protected]b9b651f2013-11-09 04:32:22642 }
643
644 return rv > OK ? OK : rv;
645}
646
svaldeze83af292016-04-26 14:33:37647void SSLClientSocketImpl::Disconnect() {
davidbened3764bb2016-03-14 19:53:16648 crypto::OpenSSLErrStackTracer tracer(FROM_HERE);
649
[email protected]b9b651f2013-11-09 04:32:22650 if (ssl_) {
651 // Calling SSL_shutdown prevents the session from being marked as
652 // unresumable.
653 SSL_shutdown(ssl_);
654 SSL_free(ssl_);
655 ssl_ = NULL;
656 }
657 if (transport_bio_) {
658 BIO_free_all(transport_bio_);
659 transport_bio_ = NULL;
660 }
661
svaldez4af14d22015-08-20 13:48:24662 disconnected_ = true;
663
[email protected]b9b651f2013-11-09 04:32:22664 // Shut down anything that may call us back.
eroman7f9236a2015-05-11 21:23:43665 cert_verifier_request_.reset();
[email protected]b9b651f2013-11-09 04:32:22666 transport_->socket()->Disconnect();
667
668 // Null all callbacks, delete all buffers.
669 transport_send_busy_ = false;
670 send_buffer_ = NULL;
671 transport_recv_busy_ = false;
[email protected]b9b651f2013-11-09 04:32:22672 recv_buffer_ = NULL;
673
674 user_connect_callback_.Reset();
675 user_read_callback_.Reset();
676 user_write_callback_.Reset();
svaldeze83af292016-04-26 14:33:37677 user_read_buf_ = NULL;
678 user_read_buf_len_ = 0;
679 user_write_buf_ = NULL;
680 user_write_buf_len_ = 0;
[email protected]b9b651f2013-11-09 04:32:22681
davidben1d489522015-07-01 18:48:46682 pending_read_error_ = kNoPendingResult;
davidbenb8c23212014-10-28 00:12:16683 pending_read_ssl_error_ = SSL_ERROR_NONE;
684 pending_read_error_info_ = OpenSSLErrorInfo();
685
[email protected]5aea79182014-07-14 20:43:41686 transport_read_error_ = OK;
[email protected]3e5c6922014-02-06 02:42:16687 transport_write_error_ = OK;
688
[email protected]b9b651f2013-11-09 04:32:22689 server_cert_verify_result_.Reset();
[email protected]64b5c892014-08-08 09:39:26690 completed_connect_ = false;
[email protected]b9b651f2013-11-09 04:32:22691
692 cert_authorities_.clear();
[email protected]c0787702014-05-20 21:51:44693 cert_key_types_.clear();
[email protected]faff9852014-06-21 06:13:46694
davidben09c3d072014-08-25 20:33:58695 start_cert_verification_time_ = base::TimeTicks();
696
[email protected]abc44b752014-07-30 03:52:15697 npn_status_ = kNextProtoUnsupported;
698 npn_proto_.clear();
699
davidben52053b382015-04-27 19:22:29700 channel_id_sent_ = false;
nharper736ceda2015-11-07 00:16:59701 tb_was_negotiated_ = false;
davidben44aeae62015-06-24 20:47:43702 session_pending_ = false;
davidbenf2eaaf92015-05-15 22:18:42703 certificate_verified_ = false;
nharper75ade892015-06-10 19:05:35704 channel_id_request_.Cancel();
davidben1d489522015-07-01 18:48:46705
davidben1d489522015-07-01 18:48:46706 signature_result_ = kNoPendingResult;
707 signature_.clear();
[email protected]b9b651f2013-11-09 04:32:22708}
709
svaldeze83af292016-04-26 14:33:37710bool SSLClientSocketImpl::IsConnected() const {
[email protected]b9b651f2013-11-09 04:32:22711 // If the handshake has not yet completed.
[email protected]64b5c892014-08-08 09:39:26712 if (!completed_connect_)
[email protected]b9b651f2013-11-09 04:32:22713 return false;
714 // If an asynchronous operation is still pending.
715 if (user_read_buf_.get() || user_write_buf_.get())
716 return true;
717
718 return transport_->socket()->IsConnected();
719}
720
svaldeze83af292016-04-26 14:33:37721bool SSLClientSocketImpl::IsConnectedAndIdle() const {
[email protected]b9b651f2013-11-09 04:32:22722 // If the handshake has not yet completed.
[email protected]64b5c892014-08-08 09:39:26723 if (!completed_connect_)
[email protected]b9b651f2013-11-09 04:32:22724 return false;
725 // If an asynchronous operation is still pending.
726 if (user_read_buf_.get() || user_write_buf_.get())
727 return false;
davidbenfc9a6b82015-04-15 23:47:32728
729 // If there is data read from the network that has not yet been consumed, do
730 // not treat the connection as idle.
731 //
732 // Note that this does not check |BIO_pending|, whether there is ciphertext
733 // that has not yet been flushed to the network. |Write| returns early, so
734 // this can cause race conditions which cause a socket to not be treated
735 // reusable when it should be. See https://crbug.com/466147.
736 if (BIO_wpending(transport_bio_) > 0)
[email protected]b9b651f2013-11-09 04:32:22737 return false;
[email protected]b9b651f2013-11-09 04:32:22738
739 return transport_->socket()->IsConnectedAndIdle();
740}
741
svaldeze83af292016-04-26 14:33:37742int SSLClientSocketImpl::GetPeerAddress(IPEndPoint* addressList) const {
[email protected]b9b651f2013-11-09 04:32:22743 return transport_->socket()->GetPeerAddress(addressList);
744}
745
svaldeze83af292016-04-26 14:33:37746int SSLClientSocketImpl::GetLocalAddress(IPEndPoint* addressList) const {
[email protected]b9b651f2013-11-09 04:32:22747 return transport_->socket()->GetLocalAddress(addressList);
748}
749
svaldeze83af292016-04-26 14:33:37750const BoundNetLog& SSLClientSocketImpl::NetLog() const {
[email protected]b9b651f2013-11-09 04:32:22751 return net_log_;
752}
753
svaldeze83af292016-04-26 14:33:37754void SSLClientSocketImpl::SetSubresourceSpeculation() {
[email protected]b9b651f2013-11-09 04:32:22755 if (transport_.get() && transport_->socket()) {
756 transport_->socket()->SetSubresourceSpeculation();
757 } else {
758 NOTREACHED();
759 }
760}
761
svaldeze83af292016-04-26 14:33:37762void SSLClientSocketImpl::SetOmniboxSpeculation() {
[email protected]b9b651f2013-11-09 04:32:22763 if (transport_.get() && transport_->socket()) {
764 transport_->socket()->SetOmniboxSpeculation();
765 } else {
766 NOTREACHED();
767 }
768}
769
svaldeze83af292016-04-26 14:33:37770bool SSLClientSocketImpl::WasEverUsed() const {
[email protected]0dc88b32014-03-26 20:12:28771 return was_ever_used_;
[email protected]b9b651f2013-11-09 04:32:22772}
773
svaldeze83af292016-04-26 14:33:37774bool SSLClientSocketImpl::GetSSLInfo(SSLInfo* ssl_info) {
[email protected]b9b651f2013-11-09 04:32:22775 ssl_info->Reset();
davidben30798ed82014-09-19 19:28:20776 if (server_cert_chain_->empty())
[email protected]b9b651f2013-11-09 04:32:22777 return false;
778
779 ssl_info->cert = server_cert_verify_result_.verified_cert;
estark03d644f2015-06-13 00:11:32780 ssl_info->unverified_cert = server_cert_;
[email protected]b9b651f2013-11-09 04:32:22781 ssl_info->cert_status = server_cert_verify_result_.cert_status;
782 ssl_info->is_issued_by_known_root =
783 server_cert_verify_result_.is_issued_by_known_root;
dadriandf302c42016-06-10 18:48:59784 ssl_info->pkp_bypassed = pkp_bypassed_;
svaldeze83af292016-04-26 14:33:37785 ssl_info->public_key_hashes = server_cert_verify_result_.public_key_hashes;
[email protected]b9b651f2013-11-09 04:32:22786 ssl_info->client_cert_sent =
787 ssl_config_.send_client_cert && ssl_config_.client_cert.get();
davidben52053b382015-04-27 19:22:29788 ssl_info->channel_id_sent = channel_id_sent_;
nharper736ceda2015-11-07 00:16:59789 ssl_info->token_binding_negotiated = tb_was_negotiated_;
790 ssl_info->token_binding_key_param = tb_negotiated_param_;
[email protected]8bd4e7a2014-08-09 14:49:17791 ssl_info->pinning_failure_log = pinning_failure_log_;
[email protected]b9b651f2013-11-09 04:32:22792
estark723b5eeb2016-02-18 21:01:12793 AddCTInfoToSSLInfo(ssl_info);
davidbeneb5f8ef32014-09-04 14:14:32794
[email protected]b9b651f2013-11-09 04:32:22795 const SSL_CIPHER* cipher = SSL_get_current_cipher(ssl_);
796 CHECK(cipher);
797 ssl_info->security_bits = SSL_CIPHER_get_bits(cipher, NULL);
sigbjorn79cf3722015-09-18 09:15:20798 ssl_info->key_exchange_info =
799 SSL_SESSION_get_key_exchange_info(SSL_get_session(ssl_));
[email protected]b9b651f2013-11-09 04:32:22800
ryanchung987b2ff2016-02-19 00:17:12801 SSLConnectionStatusSetCipherSuite(
802 static_cast<uint16_t>(SSL_CIPHER_get_id(cipher)),
803 &ssl_info->connection_status);
804 SSLConnectionStatusSetVersion(GetNetSSLVersion(ssl_),
805 &ssl_info->connection_status);
[email protected]b9b651f2013-11-09 04:32:22806
davidben09c3d072014-08-25 20:33:58807 if (!SSL_get_secure_renegotiation_support(ssl_))
[email protected]b9b651f2013-11-09 04:32:22808 ssl_info->connection_status |= SSL_CONNECTION_NO_RENEGOTIATION_EXTENSION;
[email protected]b9b651f2013-11-09 04:32:22809
810 if (ssl_config_.version_fallback)
811 ssl_info->connection_status |= SSL_CONNECTION_VERSION_FALLBACK;
812
svaldeze83af292016-04-26 14:33:37813 ssl_info->handshake_type = SSL_session_reused(ssl_)
814 ? SSLInfo::HANDSHAKE_RESUME
815 : SSLInfo::HANDSHAKE_FULL;
[email protected]b9b651f2013-11-09 04:32:22816
[email protected]b9b651f2013-11-09 04:32:22817 return true;
818}
819
svaldeze83af292016-04-26 14:33:37820void SSLClientSocketImpl::GetConnectionAttempts(ConnectionAttempts* out) const {
ttuttle23fdb7b2015-05-15 01:28:03821 out->clear();
822}
823
svaldeze83af292016-04-26 14:33:37824int64_t SSLClientSocketImpl::GetTotalReceivedBytes() const {
tbansalf82cc8e2015-10-14 20:05:49825 return transport_->socket()->GetTotalReceivedBytes();
826}
827
svaldeze83af292016-04-26 14:33:37828int SSLClientSocketImpl::Read(IOBuffer* buf,
829 int buf_len,
830 const CompletionCallback& callback) {
[email protected]b9b651f2013-11-09 04:32:22831 user_read_buf_ = buf;
832 user_read_buf_len_ = buf_len;
833
davidben1b133ad2014-10-23 04:23:13834 int rv = DoReadLoop();
[email protected]b9b651f2013-11-09 04:32:22835
836 if (rv == ERR_IO_PENDING) {
837 user_read_callback_ = callback;
838 } else {
[email protected]0dc88b32014-03-26 20:12:28839 if (rv > 0)
840 was_ever_used_ = true;
[email protected]b9b651f2013-11-09 04:32:22841 user_read_buf_ = NULL;
842 user_read_buf_len_ = 0;
843 }
844
845 return rv;
846}
847
svaldeze83af292016-04-26 14:33:37848int SSLClientSocketImpl::Write(IOBuffer* buf,
849 int buf_len,
850 const CompletionCallback& callback) {
[email protected]b9b651f2013-11-09 04:32:22851 user_write_buf_ = buf;
852 user_write_buf_len_ = buf_len;
853
davidben1b133ad2014-10-23 04:23:13854 int rv = DoWriteLoop();
[email protected]b9b651f2013-11-09 04:32:22855
856 if (rv == ERR_IO_PENDING) {
857 user_write_callback_ = callback;
858 } else {
[email protected]0dc88b32014-03-26 20:12:28859 if (rv > 0)
860 was_ever_used_ = true;
[email protected]b9b651f2013-11-09 04:32:22861 user_write_buf_ = NULL;
862 user_write_buf_len_ = 0;
863 }
864
865 return rv;
866}
867
svaldeze83af292016-04-26 14:33:37868int SSLClientSocketImpl::SetReceiveBufferSize(int32_t size) {
[email protected]b9b651f2013-11-09 04:32:22869 return transport_->socket()->SetReceiveBufferSize(size);
870}
871
svaldeze83af292016-04-26 14:33:37872int SSLClientSocketImpl::SetSendBufferSize(int32_t size) {
[email protected]b9b651f2013-11-09 04:32:22873 return transport_->socket()->SetSendBufferSize(size);
874}
875
svaldeze83af292016-04-26 14:33:37876int SSLClientSocketImpl::Init() {
[email protected]9e733f32010-10-04 18:19:08877 DCHECK(!ssl_);
878 DCHECK(!transport_bio_);
879
svaldez2135be52016-04-20 16:34:53880#if defined(USE_NSS_CERTS)
davidbena477a70a2015-10-06 04:38:29881 if (ssl_config_.cert_io_enabled) {
882 // TODO(davidben): Move this out of SSLClientSocket. See
883 // https://crbug.com/539520.
884 EnsureNSSHttpIOInit();
885 }
886#endif
887
[email protected]b29af7d2010-12-14 11:52:47888 SSLContext* context = SSLContext::GetInstance();
[email protected]4b559b4d2011-04-14 17:37:14889 crypto::OpenSSLErrStackTracer err_tracer(FROM_HERE);
[email protected]d518cd92010-09-29 12:27:44890
[email protected]fbef13932010-11-23 12:38:53891 ssl_ = SSL_new(context->ssl_ctx());
892 if (!ssl_ || !context->SetClientSocketForSSL(ssl_, this))
[email protected]c8a80e92014-05-17 16:02:08893 return ERR_UNEXPECTED;
[email protected]fbef13932010-11-23 12:38:53894
davidben9bc0466f2015-06-16 22:21:27895 // SNI should only contain valid DNS hostnames, not IP addresses (see RFC
896 // 6066, Section 3).
897 //
898 // TODO(rsleevi): Should this code allow hostnames that violate the LDH rule?
899 // See https://crbug.com/496472 and https://crbug.com/496468 for discussion.
martijna2e83bd2016-03-18 13:10:45900 IPAddress unused;
901 if (!unused.AssignFromIPLiteral(host_and_port_.host()) &&
davidben9bc0466f2015-06-16 22:21:27902 !SSL_set_tlsext_host_name(ssl_, host_and_port_.host().c_str())) {
[email protected]c8a80e92014-05-17 16:02:08903 return ERR_UNEXPECTED;
davidben9bc0466f2015-06-16 22:21:27904 }
[email protected]fbef13932010-11-23 12:38:53905
davidbenf4c9a6122015-10-20 02:45:29906 ScopedSSL_SESSION session =
907 context->session_cache()->Lookup(GetSessionCacheKey());
908 if (session)
909 SSL_set_session(ssl_, session.get());
[email protected]d518cd92010-09-29 12:27:44910
haavardm2d92e722014-12-19 13:45:44911 send_buffer_ = new GrowableIOBuffer();
912 send_buffer_->SetCapacity(KDefaultOpenSSLBufferSize);
913 recv_buffer_ = new GrowableIOBuffer();
914 recv_buffer_->SetCapacity(KDefaultOpenSSLBufferSize);
915
[email protected]d518cd92010-09-29 12:27:44916 BIO* ssl_bio = NULL;
haavardm2d92e722014-12-19 13:45:44917
svaldeze83af292016-04-26 14:33:37918 // SSLClientSocketImpl retains ownership of the BIO buffers.
haavardm2d92e722014-12-19 13:45:44919 if (!BIO_new_bio_pair_external_buf(
920 &ssl_bio, send_buffer_->capacity(),
921 reinterpret_cast<uint8_t*>(send_buffer_->data()), &transport_bio_,
922 recv_buffer_->capacity(),
923 reinterpret_cast<uint8_t*>(recv_buffer_->data())))
[email protected]c8a80e92014-05-17 16:02:08924 return ERR_UNEXPECTED;
[email protected]d518cd92010-09-29 12:27:44925 DCHECK(ssl_bio);
926 DCHECK(transport_bio_);
927
[email protected]5aea79182014-07-14 20:43:41928 // Install a callback on OpenSSL's end to plumb transport errors through.
svaldeze83af292016-04-26 14:33:37929 BIO_set_callback(ssl_bio, &SSLClientSocketImpl::BIOCallback);
[email protected]5aea79182014-07-14 20:43:41930 BIO_set_callback_arg(ssl_bio, reinterpret_cast<char*>(this));
931
[email protected]d518cd92010-09-29 12:27:44932 SSL_set_bio(ssl_, ssl_bio, ssl_bio);
933
davidbenb937d6c2015-05-14 04:53:42934 DCHECK_LT(SSL3_VERSION, ssl_config_.version_min);
935 DCHECK_LT(SSL3_VERSION, ssl_config_.version_max);
936 SSL_set_min_version(ssl_, ssl_config_.version_min);
937 SSL_set_max_version(ssl_, ssl_config_.version_max);
938
[email protected]9e733f32010-10-04 18:19:08939 // OpenSSL defaults some options to on, others to off. To avoid ambiguity,
940 // set everything we care about to an absolute value.
[email protected]fb10e2282010-12-01 17:08:48941 SslSetClearMask options;
[email protected]d0f00492012-08-03 22:35:13942 options.ConfigureFlag(SSL_OP_NO_COMPRESSION, true);
[email protected]9e733f32010-10-04 18:19:08943
944 // TODO(joth): Set this conditionally, see http://crbug.com/55410
[email protected]fb10e2282010-12-01 17:08:48945 options.ConfigureFlag(SSL_OP_LEGACY_SERVER_CONNECT, true);
[email protected]9e733f32010-10-04 18:19:08946
[email protected]fb10e2282010-12-01 17:08:48947 SSL_set_options(ssl_, options.set_mask);
948 SSL_clear_options(ssl_, options.clear_mask);
[email protected]9e733f32010-10-04 18:19:08949
[email protected]fb10e2282010-12-01 17:08:48950 // Same as above, this time for the SSL mode.
951 SslSetClearMask mode;
[email protected]9e733f32010-10-04 18:19:08952
[email protected]fb10e2282010-12-01 17:08:48953 mode.ConfigureFlag(SSL_MODE_RELEASE_BUFFERS, true);
ishermane5c05e12014-09-09 20:32:15954 mode.ConfigureFlag(SSL_MODE_CBC_RECORD_SPLITTING, true);
[email protected]fb10e2282010-12-01 17:08:48955
davidben818d93b2015-02-19 22:27:32956 mode.ConfigureFlag(SSL_MODE_ENABLE_FALSE_START,
[email protected]b788de02014-04-23 18:06:07957 ssl_config_.false_start_enabled);
958
davidben6b8131c2015-02-25 23:30:14959 mode.ConfigureFlag(SSL_MODE_SEND_FALLBACK_SCSV, ssl_config_.version_fallback);
960
[email protected]fb10e2282010-12-01 17:08:48961 SSL_set_mode(ssl_, mode.set_mask);
962 SSL_clear_mode(ssl_, mode.clear_mask);
[email protected]109805a2010-12-07 18:17:06963
davidbenb3c2d972016-03-11 22:36:17964 // Use BoringSSL defaults, but disable HMAC-SHA256 and HMAC-SHA384 ciphers
965 // (note that SHA256 and SHA384 only select legacy CBC ciphers). Also disable
966 // DHE_RSA_WITH_AES_256_GCM_SHA384. Historically, AES_256_GCM was not
967 // supported. As DHE is being deprecated, don't add a cipher only to remove it
968 // immediately.
969 std::string command(
davidben6a260682016-06-06 16:24:44970 "DEFAULT:!SHA256:!SHA384:!DHE-RSA-AES256-GCM-SHA384:!aPSK:!RC4");
davidben9b4a9b9c2015-10-12 18:46:51971
972 if (ssl_config_.require_ecdhe)
973 command.append(":!kRSA:!kDHE");
davidben8ecc3072014-09-03 23:19:09974
davidben68dcc582016-01-12 22:09:36975 if (!ssl_config_.deprecated_cipher_suites_enabled) {
davidben01d8e332015-11-20 17:08:58976 // Only offer DHE on the second handshake. https://crbug.com/538690
977 command.append(":!kDHE");
davidben91585692015-09-28 23:46:08978 }
davidbena4c9d062015-04-03 22:34:25979
davidben9b4a9b9c2015-10-12 18:46:51980 // Remove any disabled ciphers.
981 for (uint16_t id : ssl_config_.disabled_cipher_suites) {
982 const SSL_CIPHER* cipher = SSL_get_cipher_by_value(id);
983 if (cipher) {
984 command.append(":!");
985 command.append(SSL_CIPHER_get_name(cipher));
986 }
987 }
988
[email protected]109805a2010-12-07 18:17:06989 int rv = SSL_set_cipher_list(ssl_, command.c_str());
990 // If this fails (rv = 0) it means there are no ciphers enabled on this SSL.
991 // This will almost certainly result in the socket failing to complete the
992 // handshake at which point the appropriate error is bubbled up to the client.
993 LOG_IF(WARNING, rv != 1) << "SSL_set_cipher_list('" << command << "') "
svaldeze83af292016-04-26 14:33:37994 "returned "
995 << rv;
[email protected]ee0f2aa82013-10-25 11:59:26996
997 // TLS channel ids.
[email protected]6b8a3c742014-07-25 00:25:35998 if (IsChannelIDEnabled(ssl_config_, channel_id_service_)) {
[email protected]ee0f2aa82013-10-25 11:59:26999 SSL_enable_tls_channel_id(ssl_);
1000 }
1001
bnc1f295372015-10-21 23:24:221002 if (!ssl_config_.alpn_protos.empty()) {
bnc988e68d2016-06-27 14:03:211003 std::vector<uint8_t> wire_protos =
1004 SerializeNextProtos(ssl_config_.alpn_protos);
[email protected]abc44b752014-07-30 03:52:151005 SSL_set_alpn_protos(ssl_, wire_protos.empty() ? NULL : &wire_protos[0],
1006 wire_protos.size());
1007 }
1008
bnc2d6bd0f2015-10-28 01:52:051009 if (ssl_config_.npn_protos.empty())
1010 SSL_set_options(ssl_, SSL_OP_DISABLE_NPN);
1011
davidbeneb5f8ef32014-09-04 14:14:321012 if (ssl_config_.signed_cert_timestamps_enabled) {
1013 SSL_enable_signed_cert_timestamps(ssl_);
1014 SSL_enable_ocsp_stapling(ssl_);
1015 }
1016
davidben15f57132015-04-27 18:08:361017 if (cert_verifier_->SupportsOCSPStapling())
davidbend1fb2f12014-11-08 02:51:001018 SSL_enable_ocsp_stapling(ssl_);
davidbeneb5f8ef32014-09-04 14:14:321019
[email protected]c8a80e92014-05-17 16:02:081020 return OK;
[email protected]d518cd92010-09-29 12:27:441021}
1022
svaldeze83af292016-04-26 14:33:371023void SSLClientSocketImpl::DoReadCallback(int rv) {
[email protected]b9b651f2013-11-09 04:32:221024 // Since Run may result in Read being called, clear |user_read_callback_|
1025 // up front.
[email protected]0dc88b32014-03-26 20:12:281026 if (rv > 0)
1027 was_ever_used_ = true;
[email protected]b9b651f2013-11-09 04:32:221028 user_read_buf_ = NULL;
1029 user_read_buf_len_ = 0;
1030 base::ResetAndReturn(&user_read_callback_).Run(rv);
1031}
1032
svaldeze83af292016-04-26 14:33:371033void SSLClientSocketImpl::DoWriteCallback(int rv) {
[email protected]b9b651f2013-11-09 04:32:221034 // Since Run may result in Write being called, clear |user_write_callback_|
1035 // up front.
[email protected]0dc88b32014-03-26 20:12:281036 if (rv > 0)
1037 was_ever_used_ = true;
[email protected]b9b651f2013-11-09 04:32:221038 user_write_buf_ = NULL;
1039 user_write_buf_len_ = 0;
1040 base::ResetAndReturn(&user_write_callback_).Run(rv);
1041}
1042
svaldeze83af292016-04-26 14:33:371043bool SSLClientSocketImpl::DoTransportIO() {
[email protected]b9b651f2013-11-09 04:32:221044 bool network_moved = false;
1045 int rv;
1046 // Read and write as much data as possible. The loop is necessary because
1047 // Write() may return synchronously.
1048 do {
1049 rv = BufferSend();
1050 if (rv != ERR_IO_PENDING && rv != 0)
1051 network_moved = true;
1052 } while (rv > 0);
[email protected]5aea79182014-07-14 20:43:411053 if (transport_read_error_ == OK && BufferRecv() != ERR_IO_PENDING)
[email protected]b9b651f2013-11-09 04:32:221054 network_moved = true;
1055 return network_moved;
1056}
1057
pkasting379234c2015-04-08 04:42:121058// TODO(cbentzel): Remove including "base/threading/thread_local.h" and
vadimt6b43dec22015-01-06 01:59:581059// g_first_run_completed once crbug.com/424386 is fixed.
1060base::LazyInstance<base::ThreadLocalBoolean>::Leaky g_first_run_completed =
1061 LAZY_INSTANCE_INITIALIZER;
1062
svaldeze83af292016-04-26 14:33:371063int SSLClientSocketImpl::DoHandshake() {
[email protected]b9b651f2013-11-09 04:32:221064 crypto::OpenSSLErrStackTracer err_tracer(FROM_HERE);
vadimt5a243282014-12-24 00:26:161065
1066 int rv;
1067
pkasting379234c2015-04-08 04:42:121068 // TODO(cbentzel): Leave only 1 call to SSL_do_handshake once crbug.com/424386
vadimt5a243282014-12-24 00:26:161069 // is fixed.
1070 if (ssl_config_.send_client_cert && ssl_config_.client_cert.get()) {
vadimt5a243282014-12-24 00:26:161071 rv = SSL_do_handshake(ssl_);
1072 } else {
vadimt6b43dec22015-01-06 01:59:581073 if (g_first_run_completed.Get().Get()) {
pkasting379234c2015-04-08 04:42:121074 // TODO(cbentzel): Remove ScopedTracker below once crbug.com/424386 is
vadimt6b43dec22015-01-06 01:59:581075 // fixed.
pkasting379234c2015-04-08 04:42:121076 tracked_objects::ScopedTracker tracking_profile(
1077 FROM_HERE_WITH_EXPLICIT_FUNCTION("424386 SSL_do_handshake()"));
vadimt5a243282014-12-24 00:26:161078
vadimt6b43dec22015-01-06 01:59:581079 rv = SSL_do_handshake(ssl_);
1080 } else {
1081 g_first_run_completed.Get().Set(true);
vadimt6b43dec22015-01-06 01:59:581082 rv = SSL_do_handshake(ssl_);
1083 }
vadimt5a243282014-12-24 00:26:161084 }
[email protected]b9b651f2013-11-09 04:32:221085
davidbenc4212c02015-05-12 22:30:181086 int net_error = OK;
1087 if (rv <= 0) {
[email protected]b9b651f2013-11-09 04:32:221088 int ssl_error = SSL_get_error(ssl_, rv);
[email protected]b9b651f2013-11-09 04:32:221089 if (ssl_error == SSL_ERROR_WANT_CHANNEL_ID_LOOKUP) {
[email protected]faff9852014-06-21 06:13:461090 // The server supports channel ID. Stop to look one up before returning to
1091 // the handshake.
rsleeviadbd4982016-06-13 22:10:271092 next_handshake_state_ = STATE_CHANNEL_ID_LOOKUP;
[email protected]faff9852014-06-21 06:13:461093 return OK;
[email protected]b9b651f2013-11-09 04:32:221094 }
davidbenced4aa9b2015-05-12 21:22:351095 if (ssl_error == SSL_ERROR_WANT_X509_LOOKUP &&
1096 !ssl_config_.send_client_cert) {
1097 return ERR_SSL_CLIENT_AUTH_CERT_NEEDED;
1098 }
davidben1d489522015-07-01 18:48:461099 if (ssl_error == SSL_ERROR_WANT_PRIVATE_KEY_OPERATION) {
svaldez7872fd02015-11-19 21:10:541100 DCHECK(ssl_config_.client_private_key);
davidben1d489522015-07-01 18:48:461101 DCHECK_NE(kNoPendingResult, signature_result_);
rsleeviadbd4982016-06-13 22:10:271102 next_handshake_state_ = STATE_HANDSHAKE;
davidben1d489522015-07-01 18:48:461103 return ERR_IO_PENDING;
1104 }
[email protected]b9b651f2013-11-09 04:32:221105
davidbena4409c62014-08-27 17:05:511106 OpenSSLErrorInfo error_info;
1107 net_error = MapOpenSSLErrorWithDetails(ssl_error, err_tracer, &error_info);
[email protected]b9b651f2013-11-09 04:32:221108 if (net_error == ERR_IO_PENDING) {
davidbenc4212c02015-05-12 22:30:181109 // If not done, stay in this state
rsleeviadbd4982016-06-13 22:10:271110 next_handshake_state_ = STATE_HANDSHAKE;
davidbenc4212c02015-05-12 22:30:181111 return ERR_IO_PENDING;
1112 }
1113
1114 LOG(ERROR) << "handshake failed; returned " << rv << ", SSL error code "
1115 << ssl_error << ", net_error " << net_error;
1116 net_log_.AddEvent(
1117 NetLog::TYPE_SSL_HANDSHAKE_ERROR,
1118 CreateNetLogOpenSSLErrorCallback(net_error, ssl_error, error_info));
1119 }
1120
rsleeviadbd4982016-06-13 22:10:271121 next_handshake_state_ = STATE_HANDSHAKE_COMPLETE;
davidbenc4212c02015-05-12 22:30:181122 return net_error;
1123}
1124
svaldeze83af292016-04-26 14:33:371125int SSLClientSocketImpl::DoHandshakeComplete(int result) {
davidbenc4212c02015-05-12 22:30:181126 if (result < 0)
1127 return result;
1128
1129 if (ssl_config_.version_fallback &&
1130 ssl_config_.version_max < ssl_config_.version_fallback_min) {
1131 return ERR_SSL_FALLBACK_BEYOND_MINIMUM_VERSION;
1132 }
1133
davidbenb4c25b62016-06-24 02:39:271134 // DHE is offered on the deprecated cipher fallback and then rejected
1135 // afterwards. This is to aid in diagnosing connection failures because a
1136 // server requires DHE ciphers.
1137 //
1138 // TODO(davidben): A few releases after DHE's removal, remove this logic.
1139 if (!ssl_config_.dhe_enabled &&
1140 SSL_CIPHER_is_DHE(SSL_get_current_cipher(ssl_))) {
1141 return ERR_SSL_OBSOLETE_CIPHER;
1142 }
1143
nharper736ceda2015-11-07 00:16:591144 // Check that if token binding was negotiated, then extended master secret
1145 // must also be negotiated.
1146 if (tb_was_negotiated_ && !SSL_get_extms_support(ssl_))
1147 return ERR_SSL_PROTOCOL_ERROR;
1148
davidbenc4212c02015-05-12 22:30:181149 // SSL handshake is completed. If NPN wasn't negotiated, see if ALPN was.
1150 if (npn_status_ == kNextProtoUnsupported) {
1151 const uint8_t* alpn_proto = NULL;
1152 unsigned alpn_len = 0;
1153 SSL_get0_alpn_selected(ssl_, &alpn_proto, &alpn_len);
1154 if (alpn_len > 0) {
1155 npn_proto_.assign(reinterpret_cast<const char*>(alpn_proto), alpn_len);
1156 npn_status_ = kNextProtoNegotiated;
1157 set_negotiation_extension(kExtensionALPN);
[email protected]b9b651f2013-11-09 04:32:221158 }
1159 }
davidbenc4212c02015-05-12 22:30:181160
1161 RecordNegotiationExtension();
1162 RecordChannelIDSupport(channel_id_service_, channel_id_sent_,
davidben24bb5a42015-10-15 22:13:221163 ssl_config_.channel_id_enabled);
davidbenc4212c02015-05-12 22:30:181164
1165 // Only record OCSP histograms if OCSP was requested.
1166 if (ssl_config_.signed_cert_timestamps_enabled ||
1167 cert_verifier_->SupportsOCSPStapling()) {
1168 const uint8_t* ocsp_response;
1169 size_t ocsp_response_len;
1170 SSL_get0_ocsp_response(ssl_, &ocsp_response, &ocsp_response_len);
1171
1172 set_stapled_ocsp_response_received(ocsp_response_len != 0);
1173 UMA_HISTOGRAM_BOOLEAN("Net.OCSPResponseStapled", ocsp_response_len != 0);
1174 }
1175
1176 const uint8_t* sct_list;
1177 size_t sct_list_len;
1178 SSL_get0_signed_cert_timestamp_list(ssl_, &sct_list, &sct_list_len);
1179 set_signed_cert_timestamps_received(sct_list_len != 0);
1180
1181 if (IsRenegotiationAllowed())
davidben0635886ab2015-11-04 19:24:041182 SSL_set_renegotiate_mode(ssl_, ssl_renegotiate_freely);
davidbenc4212c02015-05-12 22:30:181183
davidben4fe4f982015-11-11 22:00:121184 uint8_t server_key_exchange_hash = SSL_get_server_key_exchange_hash(ssl_);
1185 if (server_key_exchange_hash != TLSEXT_hash_none) {
1186 UMA_HISTOGRAM_SPARSE_SLOWLY("Net.SSLServerKeyExchangeHash",
1187 server_key_exchange_hash);
1188 }
1189
davidbenc4212c02015-05-12 22:30:181190 // Verify the certificate.
1191 UpdateServerCert();
rsleeviadbd4982016-06-13 22:10:271192 next_handshake_state_ = STATE_VERIFY_CERT;
davidbenc4212c02015-05-12 22:30:181193 return OK;
[email protected]b9b651f2013-11-09 04:32:221194}
1195
svaldeze83af292016-04-26 14:33:371196int SSLClientSocketImpl::DoChannelIDLookup() {
nharper49b27d992016-02-09 18:28:511197 NetLog::ParametersCallback callback = base::Bind(
1198 &NetLogChannelIDLookupCallback, base::Unretained(channel_id_service_));
1199 net_log_.BeginEvent(NetLog::TYPE_SSL_GET_CHANNEL_ID, callback);
rsleeviadbd4982016-06-13 22:10:271200 next_handshake_state_ = STATE_CHANNEL_ID_LOOKUP_COMPLETE;
[email protected]6b8a3c742014-07-25 00:25:351201 return channel_id_service_->GetOrCreateChannelID(
nharper2e171cf2015-06-01 20:29:231202 host_and_port_.host(), &channel_id_key_,
svaldeze83af292016-04-26 14:33:371203 base::Bind(&SSLClientSocketImpl::OnHandshakeIOComplete,
[email protected]faff9852014-06-21 06:13:461204 base::Unretained(this)),
nharper75ade892015-06-10 19:05:351205 &channel_id_request_);
[email protected]faff9852014-06-21 06:13:461206}
1207
svaldeze83af292016-04-26 14:33:371208int SSLClientSocketImpl::DoChannelIDLookupComplete(int result) {
nharper49b27d992016-02-09 18:28:511209 net_log_.EndEvent(NetLog::TYPE_SSL_GET_CHANNEL_ID,
1210 base::Bind(&NetLogChannelIDLookupCompleteCallback,
1211 channel_id_key_.get(), result));
[email protected]faff9852014-06-21 06:13:461212 if (result < 0)
1213 return result;
1214
[email protected]faff9852014-06-21 06:13:461215 // Hand the key to OpenSSL. Check for error in case OpenSSL rejects the key
1216 // type.
davidben8a208fc2016-01-22 17:08:081217 DCHECK(channel_id_key_);
[email protected]faff9852014-06-21 06:13:461218 crypto::OpenSSLErrStackTracer err_tracer(FROM_HERE);
nharper2e171cf2015-06-01 20:29:231219 int rv = SSL_set1_tls_channel_id(ssl_, channel_id_key_->key());
[email protected]faff9852014-06-21 06:13:461220 if (!rv) {
1221 LOG(ERROR) << "Failed to set Channel ID.";
1222 int err = SSL_get_error(ssl_, rv);
1223 return MapOpenSSLError(err, err_tracer);
1224 }
1225
1226 // Return to the handshake.
davidben52053b382015-04-27 19:22:291227 channel_id_sent_ = true;
rsleeviadbd4982016-06-13 22:10:271228 next_handshake_state_ = STATE_HANDSHAKE;
[email protected]faff9852014-06-21 06:13:461229 return OK;
1230}
1231
svaldeze83af292016-04-26 14:33:371232int SSLClientSocketImpl::DoVerifyCert(int result) {
davidben30798ed82014-09-19 19:28:201233 DCHECK(!server_cert_chain_->empty());
davidben09c3d072014-08-25 20:33:581234 DCHECK(start_cert_verification_time_.is_null());
davidben30798ed82014-09-19 19:28:201235
rsleeviadbd4982016-06-13 22:10:271236 next_handshake_state_ = STATE_VERIFY_CERT_COMPLETE;
[email protected]b9b651f2013-11-09 04:32:221237
davidbenc6435a72015-08-17 18:28:521238 // OpenSSL decoded the certificate, but the platform certificate
1239 // implementation could not. This is treated as a fatal SSL-level protocol
1240 // error rather than a certificate error. See https://crbug.com/91341.
1241 if (!server_cert_.get())
1242 return ERR_SSL_SERVER_CERT_BAD_FORMAT;
1243
davidben30798ed82014-09-19 19:28:201244 // If the certificate is bad and has been previously accepted, use
1245 // the previous status and bypass the error.
1246 base::StringPiece der_cert;
1247 if (!x509_util::GetDER(server_cert_chain_->Get(0), &der_cert)) {
1248 NOTREACHED();
1249 return ERR_CERT_INVALID;
1250 }
[email protected]b9b651f2013-11-09 04:32:221251 CertStatus cert_status;
davidben30798ed82014-09-19 19:28:201252 if (ssl_config_.IsAllowedBadCert(der_cert, &cert_status)) {
[email protected]b9b651f2013-11-09 04:32:221253 server_cert_verify_result_.Reset();
1254 server_cert_verify_result_.cert_status = cert_status;
1255 server_cert_verify_result_.verified_cert = server_cert_;
1256 return OK;
1257 }
1258
davidben15f57132015-04-27 18:08:361259 std::string ocsp_response;
1260 if (cert_verifier_->SupportsOCSPStapling()) {
1261 const uint8_t* ocsp_response_raw;
1262 size_t ocsp_response_len;
1263 SSL_get0_ocsp_response(ssl_, &ocsp_response_raw, &ocsp_response_len);
1264 ocsp_response.assign(reinterpret_cast<const char*>(ocsp_response_raw),
1265 ocsp_response_len);
1266 }
1267
davidben09c3d072014-08-25 20:33:581268 start_cert_verification_time_ = base::TimeTicks::Now();
1269
eroman7f9236a2015-05-11 21:23:431270 return cert_verifier_->Verify(
rsleevi06bd78552016-06-08 22:34:461271 CertVerifier::RequestParams(server_cert_, host_and_port_.host(),
1272 ssl_config_.GetCertVerifyFlags(),
1273 ocsp_response, CertificateList()),
[email protected]591cffcd2014-08-18 20:02:301274 // TODO(davidben): Route the CRLSet through SSLConfig so
1275 // SSLClientSocket doesn't depend on SSLConfigService.
davidben15f57132015-04-27 18:08:361276 SSLConfigService::GetCRLSet().get(), &server_cert_verify_result_,
svaldeze83af292016-04-26 14:33:371277 base::Bind(&SSLClientSocketImpl::OnHandshakeIOComplete,
[email protected]b9b651f2013-11-09 04:32:221278 base::Unretained(this)),
eroman7f9236a2015-05-11 21:23:431279 &cert_verifier_request_, net_log_);
[email protected]b9b651f2013-11-09 04:32:221280}
1281
svaldeze83af292016-04-26 14:33:371282int SSLClientSocketImpl::DoVerifyCertComplete(int result) {
eroman7f9236a2015-05-11 21:23:431283 cert_verifier_request_.reset();
[email protected]b9b651f2013-11-09 04:32:221284
davidben09c3d072014-08-25 20:33:581285 if (!start_cert_verification_time_.is_null()) {
1286 base::TimeDelta verify_time =
1287 base::TimeTicks::Now() - start_cert_verification_time_;
1288 if (result == OK) {
1289 UMA_HISTOGRAM_TIMES("Net.SSLCertVerificationTime", verify_time);
1290 } else {
1291 UMA_HISTOGRAM_TIMES("Net.SSLCertVerificationTimeError", verify_time);
1292 }
1293 }
1294
rsleevi4a6ca8c2016-06-24 03:05:221295 // If the connection was good, check HPKP and CT status simultaneously,
1296 // but prefer to treat the HPKP error as more serious, if there was one.
[email protected]8bd4e7a2014-08-09 14:49:171297 const CertStatus cert_status = server_cert_verify_result_.cert_status;
rsleevi4a6ca8c2016-06-24 03:05:221298 if ((result == OK ||
dadrian8f8946652016-06-21 23:48:311299 (IsCertificateError(result) && IsCertStatusMinorError(cert_status)))) {
rsleevi4a6ca8c2016-06-24 03:05:221300 int ct_result = VerifyCT();
dadrian8f8946652016-06-21 23:48:311301 TransportSecurityState::PKPStatus pin_validity =
1302 transport_security_state_->CheckPublicKeyPins(
1303 host_and_port_, server_cert_verify_result_.is_issued_by_known_root,
1304 server_cert_verify_result_.public_key_hashes, server_cert_.get(),
1305 server_cert_verify_result_.verified_cert.get(),
1306 TransportSecurityState::ENABLE_PIN_REPORTS, &pinning_failure_log_);
1307 switch (pin_validity) {
1308 case TransportSecurityState::PKPStatus::VIOLATED:
1309 server_cert_verify_result_.cert_status |=
1310 CERT_STATUS_PINNED_KEY_MISSING;
1311 result = ERR_SSL_PINNED_KEY_NOT_IN_CERT_CHAIN;
1312 break;
1313 case TransportSecurityState::PKPStatus::BYPASSED:
1314 pkp_bypassed_ = true;
1315 // Fall through.
1316 case TransportSecurityState::PKPStatus::OK:
1317 // Do nothing.
1318 break;
rsleevi9545d342016-06-21 03:17:371319 }
rsleevi4a6ca8c2016-06-24 03:05:221320 if (result != ERR_SSL_PINNED_KEY_NOT_IN_CERT_CHAIN && ct_result != OK)
1321 result = ct_result;
[email protected]8bd4e7a2014-08-09 14:49:171322 }
1323
[email protected]b9b651f2013-11-09 04:32:221324 if (result == OK) {
davidbendafe4e52015-04-08 22:53:521325 DCHECK(!certificate_verified_);
1326 certificate_verified_ = true;
1327 MaybeCacheSession();
[email protected]b9b651f2013-11-09 04:32:221328 }
1329
[email protected]64b5c892014-08-08 09:39:261330 completed_connect_ = true;
[email protected]b9b651f2013-11-09 04:32:221331 // Exit DoHandshakeLoop and return the result to the caller to Connect.
1332 DCHECK_EQ(STATE_NONE, next_handshake_state_);
1333 return result;
1334}
1335
svaldeze83af292016-04-26 14:33:371336void SSLClientSocketImpl::DoConnectCallback(int rv) {
[email protected]b9b651f2013-11-09 04:32:221337 if (!user_connect_callback_.is_null()) {
1338 CompletionCallback c = user_connect_callback_;
1339 user_connect_callback_.Reset();
1340 c.Run(rv > OK ? OK : rv);
1341 }
1342}
1343
svaldeze83af292016-04-26 14:33:371344void SSLClientSocketImpl::UpdateServerCert() {
[email protected]76e85392014-03-20 17:54:141345 server_cert_chain_->Reset(SSL_get_peer_cert_chain(ssl_));
[email protected]7f38da8a2014-03-17 16:44:261346 server_cert_ = server_cert_chain_->AsOSChain();
davidben30798ed82014-09-19 19:28:201347 if (server_cert_.get()) {
svaldeze83af292016-04-26 14:33:371348 net_log_.AddEvent(NetLog::TYPE_SSL_CERTIFICATES_RECEIVED,
1349 base::Bind(&NetLogX509CertificateCallback,
1350 base::Unretained(server_cert_.get())));
davidben30798ed82014-09-19 19:28:201351 }
[email protected]b9b651f2013-11-09 04:32:221352}
1353
svaldeze83af292016-04-26 14:33:371354void SSLClientSocketImpl::OnHandshakeIOComplete(int result) {
[email protected]b9b651f2013-11-09 04:32:221355 int rv = DoHandshakeLoop(result);
1356 if (rv != ERR_IO_PENDING) {
davidben281d13f02016-04-27 20:43:281357 LogConnectEndEvent(rv);
[email protected]b9b651f2013-11-09 04:32:221358 DoConnectCallback(rv);
1359 }
1360}
1361
svaldeze83af292016-04-26 14:33:371362void SSLClientSocketImpl::OnSendComplete(int result) {
[email protected]b9b651f2013-11-09 04:32:221363 if (next_handshake_state_ == STATE_HANDSHAKE) {
1364 // In handshake phase.
1365 OnHandshakeIOComplete(result);
1366 return;
1367 }
1368
davidben1d489522015-07-01 18:48:461369 // During a renegotiation, a Read call may also be blocked on a transport
1370 // write, so retry both operations.
1371 PumpReadWriteEvents();
[email protected]b9b651f2013-11-09 04:32:221372}
1373
svaldeze83af292016-04-26 14:33:371374void SSLClientSocketImpl::OnRecvComplete(int result) {
1375 TRACE_EVENT0("net", "SSLClientSocketImpl::OnRecvComplete");
[email protected]b9b651f2013-11-09 04:32:221376 if (next_handshake_state_ == STATE_HANDSHAKE) {
1377 // In handshake phase.
1378 OnHandshakeIOComplete(result);
1379 return;
1380 }
1381
1382 // Network layer received some data, check if client requested to read
1383 // decrypted data.
1384 if (!user_read_buf_.get())
1385 return;
1386
davidben1b133ad2014-10-23 04:23:131387 int rv = DoReadLoop();
[email protected]b9b651f2013-11-09 04:32:221388 if (rv != ERR_IO_PENDING)
1389 DoReadCallback(rv);
1390}
1391
svaldeze83af292016-04-26 14:33:371392int SSLClientSocketImpl::DoHandshakeLoop(int last_io_result) {
1393 TRACE_EVENT0("net", "SSLClientSocketImpl::DoHandshakeLoop");
[email protected]b9b651f2013-11-09 04:32:221394 int rv = last_io_result;
1395 do {
1396 // Default to STATE_NONE for next state.
1397 // (This is a quirk carried over from the windows
1398 // implementation. It makes reading the logs a bit harder.)
1399 // State handlers can and often do call GotoState just
1400 // to stay in the current state.
1401 State state = next_handshake_state_;
rsleeviadbd4982016-06-13 22:10:271402 next_handshake_state_ = STATE_NONE;
[email protected]b9b651f2013-11-09 04:32:221403 switch (state) {
1404 case STATE_HANDSHAKE:
1405 rv = DoHandshake();
1406 break;
davidbenc4212c02015-05-12 22:30:181407 case STATE_HANDSHAKE_COMPLETE:
1408 rv = DoHandshakeComplete(rv);
1409 break;
[email protected]faff9852014-06-21 06:13:461410 case STATE_CHANNEL_ID_LOOKUP:
1411 DCHECK_EQ(OK, rv);
1412 rv = DoChannelIDLookup();
svaldeze83af292016-04-26 14:33:371413 break;
[email protected]faff9852014-06-21 06:13:461414 case STATE_CHANNEL_ID_LOOKUP_COMPLETE:
1415 rv = DoChannelIDLookupComplete(rv);
1416 break;
[email protected]b9b651f2013-11-09 04:32:221417 case STATE_VERIFY_CERT:
[email protected]faff9852014-06-21 06:13:461418 DCHECK_EQ(OK, rv);
[email protected]b9b651f2013-11-09 04:32:221419 rv = DoVerifyCert(rv);
svaldeze83af292016-04-26 14:33:371420 break;
[email protected]b9b651f2013-11-09 04:32:221421 case STATE_VERIFY_CERT_COMPLETE:
1422 rv = DoVerifyCertComplete(rv);
1423 break;
1424 case STATE_NONE:
1425 default:
1426 rv = ERR_UNEXPECTED;
1427 NOTREACHED() << "unexpected state" << state;
1428 break;
1429 }
1430
1431 bool network_moved = DoTransportIO();
1432 if (network_moved && next_handshake_state_ == STATE_HANDSHAKE) {
1433 // In general we exit the loop if rv is ERR_IO_PENDING. In this
1434 // special case we keep looping even if rv is ERR_IO_PENDING because
1435 // the transport IO may allow DoHandshake to make progress.
1436 rv = OK; // This causes us to stay in the loop.
1437 }
1438 } while (rv != ERR_IO_PENDING && next_handshake_state_ != STATE_NONE);
1439 return rv;
1440}
1441
svaldeze83af292016-04-26 14:33:371442int SSLClientSocketImpl::DoReadLoop() {
[email protected]b9b651f2013-11-09 04:32:221443 bool network_moved;
1444 int rv;
1445 do {
1446 rv = DoPayloadRead();
1447 network_moved = DoTransportIO();
1448 } while (rv == ERR_IO_PENDING && network_moved);
1449
1450 return rv;
1451}
1452
svaldeze83af292016-04-26 14:33:371453int SSLClientSocketImpl::DoWriteLoop() {
[email protected]b9b651f2013-11-09 04:32:221454 bool network_moved;
1455 int rv;
1456 do {
1457 rv = DoPayloadWrite();
1458 network_moved = DoTransportIO();
1459 } while (rv == ERR_IO_PENDING && network_moved);
1460
1461 return rv;
1462}
1463
svaldeze83af292016-04-26 14:33:371464int SSLClientSocketImpl::DoPayloadRead() {
[email protected]b9b651f2013-11-09 04:32:221465 crypto::OpenSSLErrStackTracer err_tracer(FROM_HERE);
1466
davidben7e555daf2015-03-25 17:03:291467 DCHECK_LT(0, user_read_buf_len_);
1468 DCHECK(user_read_buf_.get());
1469
[email protected]b9b651f2013-11-09 04:32:221470 int rv;
davidben1d489522015-07-01 18:48:461471 if (pending_read_error_ != kNoPendingResult) {
[email protected]b9b651f2013-11-09 04:32:221472 rv = pending_read_error_;
davidben1d489522015-07-01 18:48:461473 pending_read_error_ = kNoPendingResult;
[email protected]b9b651f2013-11-09 04:32:221474 if (rv == 0) {
svaldeze83af292016-04-26 14:33:371475 net_log_.AddByteTransferEvent(NetLog::TYPE_SSL_SOCKET_BYTES_RECEIVED, rv,
1476 user_read_buf_->data());
davidbenb8c23212014-10-28 00:12:161477 } else {
1478 net_log_.AddEvent(
1479 NetLog::TYPE_SSL_READ_ERROR,
1480 CreateNetLogOpenSSLErrorCallback(rv, pending_read_ssl_error_,
1481 pending_read_error_info_));
[email protected]b9b651f2013-11-09 04:32:221482 }
davidbenb8c23212014-10-28 00:12:161483 pending_read_ssl_error_ = SSL_ERROR_NONE;
1484 pending_read_error_info_ = OpenSSLErrorInfo();
[email protected]b9b651f2013-11-09 04:32:221485 return rv;
1486 }
1487
1488 int total_bytes_read = 0;
davidben7e555daf2015-03-25 17:03:291489 int ssl_ret;
[email protected]b9b651f2013-11-09 04:32:221490 do {
davidben7e555daf2015-03-25 17:03:291491 ssl_ret = SSL_read(ssl_, user_read_buf_->data() + total_bytes_read,
1492 user_read_buf_len_ - total_bytes_read);
1493 if (ssl_ret > 0)
1494 total_bytes_read += ssl_ret;
1495 } while (total_bytes_read < user_read_buf_len_ && ssl_ret > 0);
[email protected]b9b651f2013-11-09 04:32:221496
davidben7e555daf2015-03-25 17:03:291497 // Although only the final SSL_read call may have failed, the failure needs to
1498 // processed immediately, while the information still available in OpenSSL's
1499 // error queue.
davidbenced4aa9b2015-05-12 21:22:351500 if (ssl_ret <= 0) {
davidben7e555daf2015-03-25 17:03:291501 // A zero return from SSL_read may mean any of:
1502 // - The underlying BIO_read returned 0.
1503 // - The peer sent a close_notify.
1504 // - Any arbitrary error. https://crbug.com/466303
[email protected]b9b651f2013-11-09 04:32:221505 //
davidben7e555daf2015-03-25 17:03:291506 // TransportReadComplete converts the first to an ERR_CONNECTION_CLOSED
1507 // error, so it does not occur. The second and third are distinguished by
1508 // SSL_ERROR_ZERO_RETURN.
1509 pending_read_ssl_error_ = SSL_get_error(ssl_, ssl_ret);
1510 if (pending_read_ssl_error_ == SSL_ERROR_ZERO_RETURN) {
1511 pending_read_error_ = 0;
davidbenced4aa9b2015-05-12 21:22:351512 } else if (pending_read_ssl_error_ == SSL_ERROR_WANT_X509_LOOKUP &&
1513 !ssl_config_.send_client_cert) {
1514 pending_read_error_ = ERR_SSL_CLIENT_AUTH_CERT_NEEDED;
davidben1d489522015-07-01 18:48:461515 } else if (pending_read_ssl_error_ ==
1516 SSL_ERROR_WANT_PRIVATE_KEY_OPERATION) {
svaldez7872fd02015-11-19 21:10:541517 DCHECK(ssl_config_.client_private_key);
davidben1d489522015-07-01 18:48:461518 DCHECK_NE(kNoPendingResult, signature_result_);
1519 pending_read_error_ = ERR_IO_PENDING;
davidben7e555daf2015-03-25 17:03:291520 } else {
1521 pending_read_error_ = MapOpenSSLErrorWithDetails(
1522 pending_read_ssl_error_, err_tracer, &pending_read_error_info_);
[email protected]b9b651f2013-11-09 04:32:221523 }
1524
davidben7e555daf2015-03-25 17:03:291525 // Many servers do not reliably send a close_notify alert when shutting down
1526 // a connection, and instead terminate the TCP connection. This is reported
1527 // as ERR_CONNECTION_CLOSED. Because of this, map the unclean shutdown to a
1528 // graceful EOF, instead of treating it as an error as it should be.
1529 if (pending_read_error_ == ERR_CONNECTION_CLOSED)
1530 pending_read_error_ = 0;
1531 }
davidbenbe6ce7ec2014-10-20 19:15:561532
davidben7e555daf2015-03-25 17:03:291533 if (total_bytes_read > 0) {
1534 // Return any bytes read to the caller. The error will be deferred to the
1535 // next call of DoPayloadRead.
1536 rv = total_bytes_read;
davidbenbe6ce7ec2014-10-20 19:15:561537
davidben7e555daf2015-03-25 17:03:291538 // Do not treat insufficient data as an error to return in the next call to
1539 // DoPayloadRead() - instead, let the call fall through to check SSL_read()
1540 // again. This is because DoTransportIO() may complete in between the next
1541 // call to DoPayloadRead(), and thus it is important to check SSL_read() on
1542 // subsequent invocations to see if a complete record may now be read.
1543 if (pending_read_error_ == ERR_IO_PENDING)
davidben1d489522015-07-01 18:48:461544 pending_read_error_ = kNoPendingResult;
davidben7e555daf2015-03-25 17:03:291545 } else {
1546 // No bytes were returned. Return the pending read error immediately.
davidben1d489522015-07-01 18:48:461547 DCHECK_NE(kNoPendingResult, pending_read_error_);
davidben7e555daf2015-03-25 17:03:291548 rv = pending_read_error_;
davidben1d489522015-07-01 18:48:461549 pending_read_error_ = kNoPendingResult;
[email protected]b9b651f2013-11-09 04:32:221550 }
1551
1552 if (rv >= 0) {
1553 net_log_.AddByteTransferEvent(NetLog::TYPE_SSL_SOCKET_BYTES_RECEIVED, rv,
1554 user_read_buf_->data());
davidbenb8c23212014-10-28 00:12:161555 } else if (rv != ERR_IO_PENDING) {
1556 net_log_.AddEvent(
1557 NetLog::TYPE_SSL_READ_ERROR,
1558 CreateNetLogOpenSSLErrorCallback(rv, pending_read_ssl_error_,
1559 pending_read_error_info_));
1560 pending_read_ssl_error_ = SSL_ERROR_NONE;
1561 pending_read_error_info_ = OpenSSLErrorInfo();
[email protected]b9b651f2013-11-09 04:32:221562 }
1563 return rv;
1564}
1565
svaldeze83af292016-04-26 14:33:371566int SSLClientSocketImpl::DoPayloadWrite() {
[email protected]b9b651f2013-11-09 04:32:221567 crypto::OpenSSLErrStackTracer err_tracer(FROM_HERE);
1568 int rv = SSL_write(ssl_, user_write_buf_->data(), user_write_buf_len_);
rsleevif020edc2015-03-16 19:31:241569
[email protected]b9b651f2013-11-09 04:32:221570 if (rv >= 0) {
1571 net_log_.AddByteTransferEvent(NetLog::TYPE_SSL_SOCKET_BYTES_SENT, rv,
1572 user_write_buf_->data());
1573 return rv;
1574 }
1575
davidbenb8c23212014-10-28 00:12:161576 int ssl_error = SSL_get_error(ssl_, rv);
davidben1d489522015-07-01 18:48:461577 if (ssl_error == SSL_ERROR_WANT_PRIVATE_KEY_OPERATION)
1578 return ERR_IO_PENDING;
davidbenb8c23212014-10-28 00:12:161579 OpenSSLErrorInfo error_info;
svaldeze83af292016-04-26 14:33:371580 int net_error =
1581 MapOpenSSLErrorWithDetails(ssl_error, err_tracer, &error_info);
davidbenb8c23212014-10-28 00:12:161582
1583 if (net_error != ERR_IO_PENDING) {
1584 net_log_.AddEvent(
1585 NetLog::TYPE_SSL_WRITE_ERROR,
1586 CreateNetLogOpenSSLErrorCallback(net_error, ssl_error, error_info));
1587 }
1588 return net_error;
[email protected]b9b651f2013-11-09 04:32:221589}
1590
svaldeze83af292016-04-26 14:33:371591void SSLClientSocketImpl::PumpReadWriteEvents() {
davidben1d489522015-07-01 18:48:461592 int rv_read = ERR_IO_PENDING;
1593 int rv_write = ERR_IO_PENDING;
1594 bool network_moved;
1595 do {
1596 if (user_read_buf_.get())
1597 rv_read = DoPayloadRead();
1598 if (user_write_buf_.get())
1599 rv_write = DoPayloadWrite();
1600 network_moved = DoTransportIO();
1601 } while (rv_read == ERR_IO_PENDING && rv_write == ERR_IO_PENDING &&
1602 (user_read_buf_.get() || user_write_buf_.get()) && network_moved);
1603
1604 // Performing the Read callback may cause |this| to be deleted. If this
1605 // happens, the Write callback should not be invoked. Guard against this by
1606 // holding a WeakPtr to |this| and ensuring it's still valid.
svaldeze83af292016-04-26 14:33:371607 base::WeakPtr<SSLClientSocketImpl> guard(weak_factory_.GetWeakPtr());
davidben1d489522015-07-01 18:48:461608 if (user_read_buf_.get() && rv_read != ERR_IO_PENDING)
1609 DoReadCallback(rv_read);
1610
1611 if (!guard.get())
1612 return;
1613
1614 if (user_write_buf_.get() && rv_write != ERR_IO_PENDING)
1615 DoWriteCallback(rv_write);
1616}
1617
svaldeze83af292016-04-26 14:33:371618int SSLClientSocketImpl::BufferSend(void) {
[email protected]b9b651f2013-11-09 04:32:221619 if (transport_send_busy_)
1620 return ERR_IO_PENDING;
1621
haavardm2d92e722014-12-19 13:45:441622 size_t buffer_read_offset;
1623 uint8_t* read_buf;
1624 size_t max_read;
1625 int status = BIO_zero_copy_get_read_buf(transport_bio_, &read_buf,
1626 &buffer_read_offset, &max_read);
1627 DCHECK_EQ(status, 1); // Should never fail.
1628 if (!max_read)
1629 return 0; // Nothing pending in the OpenSSL write BIO.
1630 CHECK_EQ(read_buf, reinterpret_cast<uint8_t*>(send_buffer_->StartOfBuffer()));
1631 CHECK_LT(buffer_read_offset, static_cast<size_t>(send_buffer_->capacity()));
1632 send_buffer_->set_offset(buffer_read_offset);
[email protected]b9b651f2013-11-09 04:32:221633
1634 int rv = transport_->socket()->Write(
haavardm2d92e722014-12-19 13:45:441635 send_buffer_.get(), max_read,
svaldeze83af292016-04-26 14:33:371636 base::Bind(&SSLClientSocketImpl::BufferSendComplete,
[email protected]b9b651f2013-11-09 04:32:221637 base::Unretained(this)));
1638 if (rv == ERR_IO_PENDING) {
1639 transport_send_busy_ = true;
1640 } else {
1641 TransportWriteComplete(rv);
1642 }
1643 return rv;
1644}
1645
svaldeze83af292016-04-26 14:33:371646int SSLClientSocketImpl::BufferRecv(void) {
[email protected]b9b651f2013-11-09 04:32:221647 if (transport_recv_busy_)
1648 return ERR_IO_PENDING;
1649
1650 // Determine how much was requested from |transport_bio_| that was not
1651 // actually available.
1652 size_t requested = BIO_ctrl_get_read_request(transport_bio_);
1653 if (requested == 0) {
1654 // This is not a perfect match of error codes, as no operation is
1655 // actually pending. However, returning 0 would be interpreted as
1656 // a possible sign of EOF, which is also an inappropriate match.
1657 return ERR_IO_PENDING;
1658 }
1659
1660 // Known Issue: While only reading |requested| data is the more correct
1661 // implementation, it has the downside of resulting in frequent reads:
1662 // One read for the SSL record header (~5 bytes) and one read for the SSL
1663 // record body. Rather than issuing these reads to the underlying socket
1664 // (and constantly allocating new IOBuffers), a single Read() request to
1665 // fill |transport_bio_| is issued. As long as an SSL client socket cannot
1666 // be gracefully shutdown (via SSL close alerts) and re-used for non-SSL
1667 // traffic, this over-subscribed Read()ing will not cause issues.
haavardm2d92e722014-12-19 13:45:441668
1669 size_t buffer_write_offset;
1670 uint8_t* write_buf;
1671 size_t max_write;
1672 int status = BIO_zero_copy_get_write_buf(transport_bio_, &write_buf,
1673 &buffer_write_offset, &max_write);
1674 DCHECK_EQ(status, 1); // Should never fail.
[email protected]b9b651f2013-11-09 04:32:221675 if (!max_write)
1676 return ERR_IO_PENDING;
1677
haavardm2d92e722014-12-19 13:45:441678 CHECK_EQ(write_buf,
1679 reinterpret_cast<uint8_t*>(recv_buffer_->StartOfBuffer()));
1680 CHECK_LT(buffer_write_offset, static_cast<size_t>(recv_buffer_->capacity()));
1681
1682 recv_buffer_->set_offset(buffer_write_offset);
[email protected]b9b651f2013-11-09 04:32:221683 int rv = transport_->socket()->Read(
svaldeze83af292016-04-26 14:33:371684 recv_buffer_.get(), max_write,
1685 base::Bind(&SSLClientSocketImpl::BufferRecvComplete,
[email protected]b9b651f2013-11-09 04:32:221686 base::Unretained(this)));
1687 if (rv == ERR_IO_PENDING) {
1688 transport_recv_busy_ = true;
1689 } else {
[email protected]3e5c6922014-02-06 02:42:161690 rv = TransportReadComplete(rv);
[email protected]b9b651f2013-11-09 04:32:221691 }
1692 return rv;
1693}
1694
svaldeze83af292016-04-26 14:33:371695void SSLClientSocketImpl::BufferSendComplete(int result) {
[email protected]b9b651f2013-11-09 04:32:221696 TransportWriteComplete(result);
1697 OnSendComplete(result);
1698}
1699
svaldeze83af292016-04-26 14:33:371700void SSLClientSocketImpl::BufferRecvComplete(int result) {
[email protected]3e5c6922014-02-06 02:42:161701 result = TransportReadComplete(result);
[email protected]b9b651f2013-11-09 04:32:221702 OnRecvComplete(result);
1703}
1704
svaldeze83af292016-04-26 14:33:371705void SSLClientSocketImpl::TransportWriteComplete(int result) {
[email protected]b9b651f2013-11-09 04:32:221706 DCHECK(ERR_IO_PENDING != result);
haavardm2d92e722014-12-19 13:45:441707 int bytes_written = 0;
[email protected]b9b651f2013-11-09 04:32:221708 if (result < 0) {
[email protected]5aea79182014-07-14 20:43:411709 // Record the error. Save it to be reported in a future read or write on
1710 // transport_bio_'s peer.
[email protected]3e5c6922014-02-06 02:42:161711 transport_write_error_ = result;
[email protected]b9b651f2013-11-09 04:32:221712 } else {
haavardm2d92e722014-12-19 13:45:441713 bytes_written = result;
[email protected]b9b651f2013-11-09 04:32:221714 }
haavardm2d92e722014-12-19 13:45:441715 DCHECK_GE(send_buffer_->RemainingCapacity(), bytes_written);
1716 int ret = BIO_zero_copy_get_read_buf_done(transport_bio_, bytes_written);
1717 DCHECK_EQ(1, ret);
1718 transport_send_busy_ = false;
[email protected]b9b651f2013-11-09 04:32:221719}
1720
svaldeze83af292016-04-26 14:33:371721int SSLClientSocketImpl::TransportReadComplete(int result) {
[email protected]b9b651f2013-11-09 04:32:221722 DCHECK(ERR_IO_PENDING != result);
[email protected]5aea79182014-07-14 20:43:411723 // If an EOF, canonicalize to ERR_CONNECTION_CLOSED here so MapOpenSSLError
1724 // does not report success.
1725 if (result == 0)
1726 result = ERR_CONNECTION_CLOSED;
haavardm2d92e722014-12-19 13:45:441727 int bytes_read = 0;
[email protected]5aea79182014-07-14 20:43:411728 if (result < 0) {
[email protected]5aea79182014-07-14 20:43:411729 // Received an error. Save it to be reported in a future read on
1730 // transport_bio_'s peer.
1731 transport_read_error_ = result;
[email protected]b9b651f2013-11-09 04:32:221732 } else {
haavardm2d92e722014-12-19 13:45:441733 bytes_read = result;
[email protected]b9b651f2013-11-09 04:32:221734 }
haavardm2d92e722014-12-19 13:45:441735 DCHECK_GE(recv_buffer_->RemainingCapacity(), bytes_read);
1736 int ret = BIO_zero_copy_get_write_buf_done(transport_bio_, bytes_read);
1737 DCHECK_EQ(1, ret);
[email protected]b9b651f2013-11-09 04:32:221738 transport_recv_busy_ = false;
[email protected]3e5c6922014-02-06 02:42:161739 return result;
[email protected]b9b651f2013-11-09 04:32:221740}
1741
rsleevi4a6ca8c2016-06-24 03:05:221742int SSLClientSocketImpl::VerifyCT() {
1743 const uint8_t* ocsp_response_raw;
1744 size_t ocsp_response_len;
1745 SSL_get0_ocsp_response(ssl_, &ocsp_response_raw, &ocsp_response_len);
1746 std::string ocsp_response;
1747 if (ocsp_response_len > 0) {
1748 ocsp_response.assign(reinterpret_cast<const char*>(ocsp_response_raw),
1749 ocsp_response_len);
1750 }
1751
1752 const uint8_t* sct_list_raw;
1753 size_t sct_list_len;
1754 SSL_get0_signed_cert_timestamp_list(ssl_, &sct_list_raw, &sct_list_len);
1755 std::string sct_list;
1756 if (sct_list_len > 0)
1757 sct_list.assign(reinterpret_cast<const char*>(sct_list_raw), sct_list_len);
1758
1759 // Note that this is a completely synchronous operation: The CT Log Verifier
1760 // gets all the data it needs for SCT verification and does not do any
1761 // external communication.
1762 cert_transparency_verifier_->Verify(
1763 server_cert_verify_result_.verified_cert.get(), ocsp_response, sct_list,
1764 &ct_verify_result_, net_log_);
1765
1766 ct_verify_result_.ct_policies_applied = true;
1767 ct_verify_result_.ev_policy_compliance =
1768 ct::EVPolicyCompliance::EV_POLICY_DOES_NOT_APPLY;
1769 if (server_cert_verify_result_.cert_status & CERT_STATUS_IS_EV) {
1770 scoped_refptr<ct::EVCertsWhitelist> ev_whitelist =
1771 SSLConfigService::GetEVCertsWhitelist();
1772 ct::EVPolicyCompliance ev_policy_compliance =
1773 policy_enforcer_->DoesConformToCTEVPolicy(
1774 server_cert_verify_result_.verified_cert.get(), ev_whitelist.get(),
1775 ct_verify_result_.verified_scts, net_log_);
1776 ct_verify_result_.ev_policy_compliance = ev_policy_compliance;
1777 if (ev_policy_compliance !=
1778 ct::EVPolicyCompliance::EV_POLICY_DOES_NOT_APPLY &&
1779 ev_policy_compliance !=
1780 ct::EVPolicyCompliance::EV_POLICY_COMPLIES_VIA_WHITELIST &&
1781 ev_policy_compliance !=
1782 ct::EVPolicyCompliance::EV_POLICY_COMPLIES_VIA_SCTS) {
1783 server_cert_verify_result_.cert_status |=
1784 CERT_STATUS_CT_COMPLIANCE_FAILED;
1785 server_cert_verify_result_.cert_status &= ~CERT_STATUS_IS_EV;
1786 }
1787 }
1788 ct_verify_result_.cert_policy_compliance =
1789 policy_enforcer_->DoesConformToCertPolicy(
1790 server_cert_verify_result_.verified_cert.get(),
1791 ct_verify_result_.verified_scts, net_log_);
1792
1793 if (ct_verify_result_.cert_policy_compliance !=
1794 ct::CertPolicyCompliance::CERT_POLICY_COMPLIES_VIA_SCTS &&
1795 transport_security_state_->ShouldRequireCT(
1796 host_and_port_.host(), server_cert_verify_result_.verified_cert.get(),
1797 server_cert_verify_result_.public_key_hashes)) {
1798 server_cert_verify_result_.cert_status |=
1799 CERT_STATUS_CERTIFICATE_TRANSPARENCY_REQUIRED;
1800 return ERR_CERTIFICATE_TRANSPARENCY_REQUIRED;
1801 }
1802
1803 return OK;
1804}
1805
svaldeze83af292016-04-26 14:33:371806int SSLClientSocketImpl::ClientCertRequestCallback(SSL* ssl) {
[email protected]5ac981e182010-12-06 17:56:271807 DCHECK(ssl == ssl_);
[email protected]82c59022014-08-15 09:38:271808
davidbenaf42cbe2014-11-13 03:27:461809 net_log_.AddEvent(NetLog::TYPE_SSL_CLIENT_CERT_REQUESTED);
1810
[email protected]82c59022014-08-15 09:38:271811 // Clear any currently configured certificates.
1812 SSL_certs_clear(ssl_);
[email protected]97a854f2014-07-29 07:51:361813
1814#if defined(OS_IOS)
1815 // TODO(droger): Support client auth on iOS. See http://crbug.com/145954).
1816 LOG(WARNING) << "Client auth is not supported";
svaldeze83af292016-04-26 14:33:371817#else // !defined(OS_IOS)
[email protected]5ac981e182010-12-06 17:56:271818 if (!ssl_config_.send_client_cert) {
[email protected]515adc22013-01-09 16:01:231819 // First pass: we know that a client certificate is needed, but we do not
1820 // have one at hand.
svaldeze83af292016-04-26 14:33:371821 STACK_OF(X509_NAME)* authorities = SSL_get_client_CA_list(ssl);
[email protected]edfd0f42014-07-22 18:20:371822 for (size_t i = 0; i < sk_X509_NAME_num(authorities); i++) {
svaldeze83af292016-04-26 14:33:371823 X509_NAME* ca_name = (X509_NAME*)sk_X509_NAME_value(authorities, i);
[email protected]515adc22013-01-09 16:01:231824 unsigned char* str = NULL;
1825 int length = i2d_X509_NAME(ca_name, &str);
1826 cert_authorities_.push_back(std::string(
svaldeze83af292016-04-26 14:33:371827 reinterpret_cast<const char*>(str), static_cast<size_t>(length)));
[email protected]515adc22013-01-09 16:01:231828 OPENSSL_free(str);
1829 }
1830
[email protected]c0787702014-05-20 21:51:441831 const unsigned char* client_cert_types;
[email protected]e7e883e2014-07-25 06:03:081832 size_t num_client_cert_types =
1833 SSL_get0_certificate_types(ssl, &client_cert_types);
[email protected]c0787702014-05-20 21:51:441834 for (size_t i = 0; i < num_client_cert_types; i++) {
1835 cert_key_types_.push_back(
1836 static_cast<SSLClientCertType>(client_cert_types[i]));
1837 }
1838
davidbenced4aa9b2015-05-12 21:22:351839 // Suspends handshake. SSL_get_error will return SSL_ERROR_WANT_X509_LOOKUP.
1840 return -1;
[email protected]5ac981e182010-12-06 17:56:271841 }
1842
1843 // Second pass: a client certificate should have been selected.
[email protected]13914c92013-06-13 22:42:421844 if (ssl_config_.client_cert.get()) {
[email protected]6bad5052014-07-12 01:25:131845 ScopedX509 leaf_x509 =
1846 OSCertHandleToOpenSSL(ssl_config_.client_cert->os_cert_handle());
1847 if (!leaf_x509) {
1848 LOG(WARNING) << "Failed to import certificate";
1849 OpenSSLPutNetError(FROM_HERE, ERR_SSL_CLIENT_AUTH_CERT_BAD_FORMAT);
1850 return -1;
1851 }
1852
[email protected]82c59022014-08-15 09:38:271853 ScopedX509Stack chain = OSCertHandlesToOpenSSL(
1854 ssl_config_.client_cert->GetIntermediateCertificates());
1855 if (!chain) {
1856 LOG(WARNING) << "Failed to import intermediate certificates";
1857 OpenSSLPutNetError(FROM_HERE, ERR_SSL_CLIENT_AUTH_CERT_BAD_FORMAT);
1858 return -1;
1859 }
1860
davidben1d489522015-07-01 18:48:461861 if (!SSL_use_certificate(ssl_, leaf_x509.get()) ||
1862 !SSL_set1_chain(ssl_, chain.get())) {
1863 LOG(WARNING) << "Failed to set client certificate";
1864 return -1;
1865 }
1866
svaldez7872fd02015-11-19 21:10:541867 if (!ssl_config_.client_private_key) {
1868 // The caller supplied a null private key. Fail the handshake and surface
1869 // an appropriate error to the caller.
davidben1d489522015-07-01 18:48:461870 LOG(WARNING) << "Client cert found without private key";
1871 OpenSSLPutNetError(FROM_HERE, ERR_SSL_CLIENT_AUTH_CERT_NO_PRIVATE_KEY);
1872 return -1;
1873 }
1874
1875 SSL_set_private_key_method(ssl_, &SSLContext::kPrivateKeyMethod);
svaldezf3db006f2015-09-29 16:43:581876
1877 std::vector<SSLPrivateKey::Hash> digest_prefs =
svaldez7872fd02015-11-19 21:10:541878 ssl_config_.client_private_key->GetDigestPreferences();
svaldezf3db006f2015-09-29 16:43:581879
1880 size_t digests_len = digest_prefs.size();
1881 std::vector<int> digests;
1882 for (size_t i = 0; i < digests_len; i++) {
1883 switch (digest_prefs[i]) {
1884 case SSLPrivateKey::Hash::SHA1:
1885 digests.push_back(NID_sha1);
1886 break;
1887 case SSLPrivateKey::Hash::SHA256:
1888 digests.push_back(NID_sha256);
1889 break;
1890 case SSLPrivateKey::Hash::SHA384:
1891 digests.push_back(NID_sha384);
1892 break;
1893 case SSLPrivateKey::Hash::SHA512:
1894 digests.push_back(NID_sha512);
1895 break;
1896 case SSLPrivateKey::Hash::MD5_SHA1:
1897 // MD5-SHA1 is not used in TLS 1.2.
1898 break;
1899 }
1900 }
1901
davidben5f8b6bc2015-11-25 03:19:541902 SSL_set_private_key_digest_prefs(ssl_, digests.data(), digests.size());
davidbenaf42cbe2014-11-13 03:27:461903
1904 int cert_count = 1 + sk_X509_num(chain.get());
1905 net_log_.AddEvent(NetLog::TYPE_SSL_CLIENT_CERT_PROVIDED,
tfarina5e24b242015-10-27 13:11:281906 NetLog::IntCallback("cert_count", cert_count));
[email protected]6bad5052014-07-12 01:25:131907 return 1;
[email protected]c0787702014-05-20 21:51:441908 }
[email protected]97a854f2014-07-29 07:51:361909#endif // defined(OS_IOS)
[email protected]5ac981e182010-12-06 17:56:271910
1911 // Send no client certificate.
davidbenaf42cbe2014-11-13 03:27:461912 net_log_.AddEvent(NetLog::TYPE_SSL_CLIENT_CERT_PROVIDED,
tfarina5e24b242015-10-27 13:11:281913 NetLog::IntCallback("cert_count", 0));
[email protected]82c59022014-08-15 09:38:271914 return 1;
[email protected]5ac981e182010-12-06 17:56:271915}
1916
svaldeze83af292016-04-26 14:33:371917int SSLClientSocketImpl::CertVerifyCallback(X509_STORE_CTX* store_ctx) {
[email protected]64b5c892014-08-08 09:39:261918 if (!completed_connect_) {
[email protected]b051cdb62014-02-28 02:20:161919 // If the first handshake hasn't completed then we accept any certificates
1920 // because we verify after the handshake.
1921 return 1;
1922 }
1923
davidben30798ed82014-09-19 19:28:201924 // Disallow the server certificate to change in a renegotiation.
1925 if (server_cert_chain_->empty()) {
[email protected]76e85392014-03-20 17:54:141926 LOG(ERROR) << "Received invalid certificate chain between handshakes";
davidben30798ed82014-09-19 19:28:201927 return 0;
1928 }
1929 base::StringPiece old_der, new_der;
1930 if (store_ctx->cert == NULL ||
1931 !x509_util::GetDER(server_cert_chain_->Get(0), &old_der) ||
1932 !x509_util::GetDER(store_ctx->cert, &new_der)) {
1933 LOG(ERROR) << "Failed to encode certificates";
1934 return 0;
1935 }
1936 if (old_der != new_der) {
[email protected]76e85392014-03-20 17:54:141937 LOG(ERROR) << "Server certificate changed between handshakes";
davidben30798ed82014-09-19 19:28:201938 return 0;
1939 }
1940
1941 return 1;
[email protected]b051cdb62014-02-28 02:20:161942}
1943
[email protected]ae7c9f42011-11-21 11:41:161944// SelectNextProtoCallback is called by OpenSSL during the handshake. If the
1945// server supports NPN, selects a protocol from the list that the server
thestigc23b8ec42016-01-08 01:41:121946// provides. According to third_party/boringssl/src/ssl/ssl_lib.c, the
[email protected]ae7c9f42011-11-21 11:41:161947// callback can assume that |in| is syntactically valid.
svaldeze83af292016-04-26 14:33:371948int SSLClientSocketImpl::SelectNextProtoCallback(unsigned char** out,
1949 unsigned char* outlen,
1950 const unsigned char* in,
1951 unsigned int inlen) {
bnc1f295372015-10-21 23:24:221952 if (ssl_config_.npn_protos.empty()) {
Avi Drissman13fc8932015-12-20 04:40:461953 *out = reinterpret_cast<uint8_t*>(
[email protected]168a8412012-06-14 05:05:491954 const_cast<char*>(kDefaultSupportedNPNProtocol));
1955 *outlen = arraysize(kDefaultSupportedNPNProtocol) - 1;
1956 npn_status_ = kNextProtoUnsupported;
[email protected]ea4a1c6a2010-12-09 13:33:281957 return SSL_TLSEXT_ERR_OK;
1958 }
1959
[email protected]ae7c9f42011-11-21 11:41:161960 // Assume there's no overlap between our protocols and the server's list.
[email protected]168a8412012-06-14 05:05:491961 npn_status_ = kNextProtoNoOverlap;
[email protected]ae7c9f42011-11-21 11:41:161962
1963 // For each protocol in server preference order, see if we support it.
1964 for (unsigned int i = 0; i < inlen; i += in[i] + 1) {
bnc1f295372015-10-21 23:24:221965 for (NextProto next_proto : ssl_config_.npn_protos) {
bnc0d23cf42014-12-11 14:09:461966 const std::string proto = NextProtoToString(next_proto);
1967 if (in[i] == proto.size() &&
1968 memcmp(&in[i + 1], proto.data(), in[i]) == 0) {
[email protected]168a8412012-06-14 05:05:491969 // We found a match.
[email protected]ae7c9f42011-11-21 11:41:161970 *out = const_cast<unsigned char*>(in) + i + 1;
1971 *outlen = in[i];
[email protected]168a8412012-06-14 05:05:491972 npn_status_ = kNextProtoNegotiated;
[email protected]ae7c9f42011-11-21 11:41:161973 break;
1974 }
1975 }
[email protected]168a8412012-06-14 05:05:491976 if (npn_status_ == kNextProtoNegotiated)
[email protected]ae7c9f42011-11-21 11:41:161977 break;
1978 }
[email protected]ea4a1c6a2010-12-09 13:33:281979
bncde27dae2015-10-06 07:11:021980 // If we didn't find a protocol, we select the last one from our list.
[email protected]168a8412012-06-14 05:05:491981 if (npn_status_ == kNextProtoNoOverlap) {
bnc67da3de2015-01-15 21:02:261982 // NextProtoToString returns a pointer to a static string.
bnc1f295372015-10-21 23:24:221983 const char* proto = NextProtoToString(ssl_config_.npn_protos.back());
bnc67da3de2015-01-15 21:02:261984 *out = reinterpret_cast<unsigned char*>(const_cast<char*>(proto));
1985 *outlen = strlen(proto);
[email protected]168a8412012-06-14 05:05:491986 }
1987
[email protected]ea4a1c6a2010-12-09 13:33:281988 npn_proto_.assign(reinterpret_cast<const char*>(*out), *outlen);
bnc0d28ea52014-10-13 15:15:381989 set_negotiation_extension(kExtensionNPN);
[email protected]ea4a1c6a2010-12-09 13:33:281990 return SSL_TLSEXT_ERR_OK;
1991}
1992
svaldeze83af292016-04-26 14:33:371993long SSLClientSocketImpl::MaybeReplayTransportError(BIO* bio,
1994 int cmd,
1995 const char* argp,
1996 int argi,
1997 long argl,
1998 long retvalue) {
1999 if (cmd == (BIO_CB_READ | BIO_CB_RETURN) && retvalue <= 0) {
[email protected]5aea79182014-07-14 20:43:412000 // If there is no more data in the buffer, report any pending errors that
2001 // were observed. Note that both the readbuf and the writebuf are checked
2002 // for errors, since the application may have encountered a socket error
2003 // while writing that would otherwise not be reported until the application
2004 // attempted to write again - which it may never do. See
2005 // https://crbug.com/249848.
2006 if (transport_read_error_ != OK) {
2007 OpenSSLPutNetError(FROM_HERE, transport_read_error_);
2008 return -1;
2009 }
2010 if (transport_write_error_ != OK) {
2011 OpenSSLPutNetError(FROM_HERE, transport_write_error_);
2012 return -1;
2013 }
2014 } else if (cmd == BIO_CB_WRITE) {
2015 // Because of the write buffer, this reports a failure from the previous
2016 // write payload. If the current payload fails to write, the error will be
2017 // reported in a future write or read to |bio|.
2018 if (transport_write_error_ != OK) {
2019 OpenSSLPutNetError(FROM_HERE, transport_write_error_);
2020 return -1;
2021 }
2022 }
2023 return retvalue;
2024}
2025
2026// static
svaldeze83af292016-04-26 14:33:372027long SSLClientSocketImpl::BIOCallback(BIO* bio,
2028 int cmd,
2029 const char* argp,
2030 int argi,
2031 long argl,
2032 long retvalue) {
2033 SSLClientSocketImpl* socket =
2034 reinterpret_cast<SSLClientSocketImpl*>(BIO_get_callback_arg(bio));
[email protected]5aea79182014-07-14 20:43:412035 CHECK(socket);
svaldeze83af292016-04-26 14:33:372036 return socket->MaybeReplayTransportError(bio, cmd, argp, argi, argl,
2037 retvalue);
[email protected]5aea79182014-07-14 20:43:412038}
2039
svaldeze83af292016-04-26 14:33:372040void SSLClientSocketImpl::MaybeCacheSession() {
davidben44aeae62015-06-24 20:47:432041 // Only cache the session once both a new session has been established and the
2042 // certificate has been verified. Due to False Start, these events may happen
2043 // in either order.
2044 if (!session_pending_ || !certificate_verified_)
davidbendafe4e52015-04-08 22:53:522045 return;
davidbendafe4e52015-04-08 22:53:522046
2047 SSLContext::GetInstance()->session_cache()->Insert(GetSessionCacheKey(),
2048 SSL_get_session(ssl_));
davidben44aeae62015-06-24 20:47:432049 session_pending_ = false;
davidbendafe4e52015-04-08 22:53:522050}
2051
svaldeze83af292016-04-26 14:33:372052int SSLClientSocketImpl::NewSessionCallback(SSL_SESSION* session) {
davidben44aeae62015-06-24 20:47:432053 DCHECK_EQ(session, SSL_get_session(ssl_));
davidbendafe4e52015-04-08 22:53:522054
davidben44aeae62015-06-24 20:47:432055 // Only sessions from the initial handshake get cached. Note this callback may
2056 // be signaled on abbreviated handshakes if the ticket was renewed.
2057 session_pending_ = true;
davidbendafe4e52015-04-08 22:53:522058 MaybeCacheSession();
davidben44aeae62015-06-24 20:47:432059
2060 // OpenSSL passes a reference to |session|, but the session cache does not
2061 // take this reference, so release it.
2062 SSL_SESSION_free(session);
2063 return 1;
davidbendafe4e52015-04-08 22:53:522064}
2065
svaldeze83af292016-04-26 14:33:372066void SSLClientSocketImpl::AddCTInfoToSSLInfo(SSLInfo* ssl_info) const {
estark723b5eeb2016-02-18 21:01:122067 ssl_info->UpdateCertificateTransparencyInfo(ct_verify_result_);
davidbeneb5f8ef32014-09-04 14:14:322068}
2069
svaldeze83af292016-04-26 14:33:372070std::string SSLClientSocketImpl::GetSessionCacheKey() const {
rsleevif020edc2015-03-16 19:31:242071 std::string result = host_and_port_.ToString();
2072 result.append("/");
2073 result.append(ssl_session_cache_shard_);
2074
2075 // Shard the session cache based on maximum protocol version. This causes
2076 // fallback connections to use a separate session cache.
2077 result.append("/");
2078 switch (ssl_config_.version_max) {
rsleevif020edc2015-03-16 19:31:242079 case SSL_PROTOCOL_VERSION_TLS1:
2080 result.append("tls1");
2081 break;
2082 case SSL_PROTOCOL_VERSION_TLS1_1:
2083 result.append("tls1.1");
2084 break;
2085 case SSL_PROTOCOL_VERSION_TLS1_2:
2086 result.append("tls1.2");
2087 break;
2088 default:
2089 NOTREACHED();
2090 }
2091
davidbena4c9d062015-04-03 22:34:252092 result.append("/");
davidben14b1a532015-10-30 16:01:092093 if (ssl_config_.deprecated_cipher_suites_enabled)
davidbena4c9d062015-04-03 22:34:252094 result.append("deprecated");
2095
davidbenee39de02015-10-16 19:53:182096 result.append("/");
2097 if (ssl_config_.channel_id_enabled)
2098 result.append("channelid");
2099
rsleevif020edc2015-03-16 19:31:242100 return result;
2101}
2102
svaldeze83af292016-04-26 14:33:372103bool SSLClientSocketImpl::IsRenegotiationAllowed() const {
nharper736ceda2015-11-07 00:16:592104 if (tb_was_negotiated_)
2105 return false;
2106
davidben421116c2015-05-12 19:56:512107 if (npn_status_ == kNextProtoUnsupported)
2108 return ssl_config_.renego_allowed_default;
2109
2110 NextProto next_proto = NextProtoFromString(npn_proto_);
2111 for (NextProto allowed : ssl_config_.renego_allowed_for_protos) {
2112 if (next_proto == allowed)
2113 return true;
2114 }
2115 return false;
2116}
2117
svaldeze83af292016-04-26 14:33:372118int SSLClientSocketImpl::PrivateKeyTypeCallback() {
svaldez7872fd02015-11-19 21:10:542119 switch (ssl_config_.client_private_key->GetType()) {
davidben1d489522015-07-01 18:48:462120 case SSLPrivateKey::Type::RSA:
2121 return EVP_PKEY_RSA;
2122 case SSLPrivateKey::Type::ECDSA:
2123 return EVP_PKEY_EC;
2124 }
2125 NOTREACHED();
2126 return EVP_PKEY_NONE;
2127}
2128
svaldeze83af292016-04-26 14:33:372129size_t SSLClientSocketImpl::PrivateKeyMaxSignatureLenCallback() {
svaldez7872fd02015-11-19 21:10:542130 return ssl_config_.client_private_key->GetMaxSignatureLengthInBytes();
davidben1d489522015-07-01 18:48:462131}
2132
svaldeze83af292016-04-26 14:33:372133ssl_private_key_result_t SSLClientSocketImpl::PrivateKeySignCallback(
davidben1d489522015-07-01 18:48:462134 uint8_t* out,
2135 size_t* out_len,
2136 size_t max_out,
2137 const EVP_MD* md,
2138 const uint8_t* in,
2139 size_t in_len) {
2140 DCHECK_EQ(kNoPendingResult, signature_result_);
2141 DCHECK(signature_.empty());
svaldez7872fd02015-11-19 21:10:542142 DCHECK(ssl_config_.client_private_key);
davidben1d489522015-07-01 18:48:462143
davidben1d489522015-07-01 18:48:462144 SSLPrivateKey::Hash hash;
2145 if (!EVP_MDToPrivateKeyHash(md, &hash)) {
2146 OpenSSLPutNetError(FROM_HERE, ERR_SSL_CLIENT_AUTH_SIGNATURE_FAILED);
2147 return ssl_private_key_failure;
2148 }
2149
davidben752bcf22015-12-21 22:55:502150 net_log_.BeginEvent(
2151 NetLog::TYPE_SSL_PRIVATE_KEY_OPERATION,
2152 base::Bind(&NetLogPrivateKeyOperationCallback,
2153 ssl_config_.client_private_key->GetType(), hash));
2154
davidben1d489522015-07-01 18:48:462155 signature_result_ = ERR_IO_PENDING;
svaldez7872fd02015-11-19 21:10:542156 ssl_config_.client_private_key->SignDigest(
davidben1d489522015-07-01 18:48:462157 hash, base::StringPiece(reinterpret_cast<const char*>(in), in_len),
svaldeze83af292016-04-26 14:33:372158 base::Bind(&SSLClientSocketImpl::OnPrivateKeySignComplete,
davidben1d489522015-07-01 18:48:462159 weak_factory_.GetWeakPtr()));
2160 return ssl_private_key_retry;
2161}
2162
svaldeze83af292016-04-26 14:33:372163ssl_private_key_result_t SSLClientSocketImpl::PrivateKeySignCompleteCallback(
davidben1d489522015-07-01 18:48:462164 uint8_t* out,
2165 size_t* out_len,
2166 size_t max_out) {
2167 DCHECK_NE(kNoPendingResult, signature_result_);
svaldez7872fd02015-11-19 21:10:542168 DCHECK(ssl_config_.client_private_key);
davidben1d489522015-07-01 18:48:462169
2170 if (signature_result_ == ERR_IO_PENDING)
2171 return ssl_private_key_retry;
2172 if (signature_result_ != OK) {
2173 OpenSSLPutNetError(FROM_HERE, signature_result_);
2174 return ssl_private_key_failure;
2175 }
2176 if (signature_.size() > max_out) {
2177 OpenSSLPutNetError(FROM_HERE, ERR_SSL_CLIENT_AUTH_SIGNATURE_FAILED);
2178 return ssl_private_key_failure;
2179 }
davidben5f8b6bc2015-11-25 03:19:542180 memcpy(out, signature_.data(), signature_.size());
davidben1d489522015-07-01 18:48:462181 *out_len = signature_.size();
2182 signature_.clear();
2183 return ssl_private_key_success;
2184}
2185
svaldeze83af292016-04-26 14:33:372186void SSLClientSocketImpl::OnPrivateKeySignComplete(
davidben1d489522015-07-01 18:48:462187 Error error,
2188 const std::vector<uint8_t>& signature) {
2189 DCHECK_EQ(ERR_IO_PENDING, signature_result_);
2190 DCHECK(signature_.empty());
svaldez7872fd02015-11-19 21:10:542191 DCHECK(ssl_config_.client_private_key);
davidben1d489522015-07-01 18:48:462192
2193 net_log_.EndEventWithNetErrorCode(NetLog::TYPE_SSL_PRIVATE_KEY_OPERATION,
2194 error);
2195
2196 signature_result_ = error;
2197 if (signature_result_ == OK)
2198 signature_ = signature;
2199
2200 if (next_handshake_state_ == STATE_HANDSHAKE) {
2201 OnHandshakeIOComplete(signature_result_);
2202 return;
2203 }
2204
2205 // During a renegotiation, either Read or Write calls may be blocked on an
2206 // asynchronous private key operation.
2207 PumpReadWriteEvents();
2208}
2209
svaldeze83af292016-04-26 14:33:372210int SSLClientSocketImpl::TokenBindingAdd(const uint8_t** out,
2211 size_t* out_len,
2212 int* out_alert_value) {
nharper736ceda2015-11-07 00:16:592213 if (ssl_config_.token_binding_params.empty()) {
2214 return 0;
2215 }
davidben7dad2a32016-03-01 23:47:472216 crypto::AutoCBB output;
nharper736ceda2015-11-07 00:16:592217 CBB parameters_list;
2218 if (!CBB_init(output.get(), 7) ||
2219 !CBB_add_u8(output.get(), kTbProtocolVersionMajor) ||
2220 !CBB_add_u8(output.get(), kTbProtocolVersionMinor) ||
2221 !CBB_add_u8_length_prefixed(output.get(), &parameters_list)) {
2222 *out_alert_value = SSL_AD_INTERNAL_ERROR;
2223 return -1;
2224 }
2225 for (size_t i = 0; i < ssl_config_.token_binding_params.size(); ++i) {
2226 if (!CBB_add_u8(&parameters_list, ssl_config_.token_binding_params[i])) {
2227 *out_alert_value = SSL_AD_INTERNAL_ERROR;
2228 return -1;
2229 }
2230 }
2231 // |*out| will be freed by TokenBindingFreeCallback.
2232 if (!CBB_finish(output.get(), const_cast<uint8_t**>(out), out_len)) {
2233 *out_alert_value = SSL_AD_INTERNAL_ERROR;
2234 return -1;
2235 }
2236
2237 return 1;
2238}
2239
svaldeze83af292016-04-26 14:33:372240int SSLClientSocketImpl::TokenBindingParse(const uint8_t* contents,
2241 size_t contents_len,
2242 int* out_alert_value) {
nharper736ceda2015-11-07 00:16:592243 if (completed_connect_) {
2244 // Token Binding may only be negotiated on the initial handshake.
2245 *out_alert_value = SSL_AD_ILLEGAL_PARAMETER;
2246 return 0;
2247 }
2248
2249 CBS extension;
2250 CBS_init(&extension, contents, contents_len);
2251
2252 CBS parameters_list;
2253 uint8_t version_major, version_minor, param;
2254 if (!CBS_get_u8(&extension, &version_major) ||
2255 !CBS_get_u8(&extension, &version_minor) ||
2256 !CBS_get_u8_length_prefixed(&extension, &parameters_list) ||
2257 !CBS_get_u8(&parameters_list, &param) || CBS_len(&parameters_list) > 0 ||
2258 CBS_len(&extension) > 0) {
2259 *out_alert_value = SSL_AD_DECODE_ERROR;
2260 return 0;
2261 }
2262 // The server-negotiated version must be less than or equal to our version.
2263 if (version_major > kTbProtocolVersionMajor ||
2264 (version_minor > kTbProtocolVersionMinor &&
2265 version_major == kTbProtocolVersionMajor)) {
2266 *out_alert_value = SSL_AD_ILLEGAL_PARAMETER;
2267 return 0;
2268 }
2269 // If the version the server negotiated is older than we support, don't fail
2270 // parsing the extension, but also don't set |negotiated_|.
2271 if (version_major < kTbMinProtocolVersionMajor ||
2272 (version_minor < kTbMinProtocolVersionMinor &&
2273 version_major == kTbMinProtocolVersionMajor)) {
2274 return 1;
2275 }
2276
2277 for (size_t i = 0; i < ssl_config_.token_binding_params.size(); ++i) {
2278 if (param == ssl_config_.token_binding_params[i]) {
2279 tb_negotiated_param_ = ssl_config_.token_binding_params[i];
2280 tb_was_negotiated_ = true;
2281 return 1;
2282 }
2283 }
2284
2285 *out_alert_value = SSL_AD_ILLEGAL_PARAMETER;
2286 return 0;
2287}
2288
davidben281d13f02016-04-27 20:43:282289void SSLClientSocketImpl::LogConnectEndEvent(int rv) {
2290 if (rv != OK) {
2291 net_log_.EndEventWithNetErrorCode(NetLog::TYPE_SSL_CONNECT, rv);
2292 return;
2293 }
2294
2295 net_log_.EndEvent(NetLog::TYPE_SSL_CONNECT,
2296 base::Bind(&NetLogSSLInfoCallback, base::Unretained(this)));
2297}
2298
[email protected]7e5dd49f2010-12-08 18:33:492299} // namespace net