blob: 66733c26b2a35dd75deb76b20b3a3b89fdc39951 [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"
svaldeze83af292016-04-26 14:33:3748#include "net/ssl/ssl_client_session_cache.h"
[email protected]536fd0b2013-03-14 17:41:5749#include "net/ssl/ssl_connection_status_flags.h"
davidbenf2eaaf92015-05-15 22:18:4250#include "net/ssl/ssl_failure_state.h"
[email protected]536fd0b2013-03-14 17:41:5751#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
67// Enable this to see logging for state machine state transitions.
68#if 0
svaldeze83af292016-04-26 14:33:3769#define GotoState(s) \
70 do { \
71 DVLOG(2) << (void*)this << " " << __FUNCTION__ << " jump to state " << s; \
72 next_handshake_state_ = s; \
73 } while (0)
[email protected]d518cd92010-09-29 12:27:4474#else
75#define GotoState(s) next_handshake_state_ = s
76#endif
77
[email protected]4b768562013-02-16 04:10:0778// This constant can be any non-negative/non-zero value (eg: it does not
79// overlap with any value of the net::Error range, including net::OK).
davidben1d489522015-07-01 18:48:4680const int kNoPendingResult = 1;
[email protected]4b768562013-02-16 04:10:0781
[email protected]168a8412012-06-14 05:05:4982// If a client doesn't have a list of protocols that it supports, but
83// the server supports NPN, choosing "http/1.1" is the best answer.
84const char kDefaultSupportedNPNProtocol[] = "http/1.1";
85
haavardm2d92e722014-12-19 13:45:4486// Default size of the internal BoringSSL buffers.
87const int KDefaultOpenSSLBufferSize = 17 * 1024;
88
nharper736ceda2015-11-07 00:16:5989// TLS extension number use for Token Binding.
nharperb5ad8a802016-02-05 19:40:0090const unsigned int kTbExtNum = 24;
nharper736ceda2015-11-07 00:16:5991
92// Token Binding ProtocolVersions supported.
93const uint8_t kTbProtocolVersionMajor = 0;
nharperb5a0f6c2016-04-04 21:50:3994const uint8_t kTbProtocolVersionMinor = 5;
nharper736ceda2015-11-07 00:16:5995const uint8_t kTbMinProtocolVersionMajor = 0;
nharper47d408a42016-01-28 23:00:3896const uint8_t kTbMinProtocolVersionMinor = 3;
nharper736ceda2015-11-07 00:16:5997
davidben1d489522015-07-01 18:48:4698bool EVP_MDToPrivateKeyHash(const EVP_MD* md, SSLPrivateKey::Hash* hash) {
99 switch (EVP_MD_type(md)) {
100 case NID_md5_sha1:
101 *hash = SSLPrivateKey::Hash::MD5_SHA1;
102 return true;
103 case NID_sha1:
104 *hash = SSLPrivateKey::Hash::SHA1;
105 return true;
106 case NID_sha256:
107 *hash = SSLPrivateKey::Hash::SHA256;
108 return true;
109 case NID_sha384:
110 *hash = SSLPrivateKey::Hash::SHA384;
111 return true;
112 case NID_sha512:
113 *hash = SSLPrivateKey::Hash::SHA512;
114 return true;
115 default:
116 return false;
117 }
118}
119
danakj655b66c2016-04-16 00:51:38120std::unique_ptr<base::Value> NetLogPrivateKeyOperationCallback(
davidben752bcf22015-12-21 22:55:50121 SSLPrivateKey::Type type,
122 SSLPrivateKey::Hash hash,
123 NetLogCaptureMode mode) {
124 std::string type_str;
125 switch (type) {
126 case SSLPrivateKey::Type::RSA:
127 type_str = "RSA";
128 break;
129 case SSLPrivateKey::Type::ECDSA:
130 type_str = "ECDSA";
131 break;
132 }
133
134 std::string hash_str;
135 switch (hash) {
136 case SSLPrivateKey::Hash::MD5_SHA1:
137 hash_str = "MD5_SHA1";
138 break;
139 case SSLPrivateKey::Hash::SHA1:
140 hash_str = "SHA1";
141 break;
142 case SSLPrivateKey::Hash::SHA256:
143 hash_str = "SHA256";
144 break;
145 case SSLPrivateKey::Hash::SHA384:
146 hash_str = "SHA384";
147 break;
148 case SSLPrivateKey::Hash::SHA512:
149 hash_str = "SHA512";
150 break;
151 }
152
danakj655b66c2016-04-16 00:51:38153 std::unique_ptr<base::DictionaryValue> value(new base::DictionaryValue);
davidben752bcf22015-12-21 22:55:50154 value->SetString("type", type_str);
155 value->SetString("hash", hash_str);
156 return std::move(value);
157}
158
danakj655b66c2016-04-16 00:51:38159std::unique_ptr<base::Value> NetLogChannelIDLookupCallback(
nharper49b27d992016-02-09 18:28:51160 ChannelIDService* channel_id_service,
161 NetLogCaptureMode capture_mode) {
162 ChannelIDStore* store = channel_id_service->GetChannelIDStore();
danakj655b66c2016-04-16 00:51:38163 std::unique_ptr<base::DictionaryValue> dict(new base::DictionaryValue());
nharper49b27d992016-02-09 18:28:51164 dict->SetBoolean("ephemeral", store->IsEphemeral());
165 dict->SetString("service", base::HexEncode(&channel_id_service,
166 sizeof(channel_id_service)));
167 dict->SetString("store", base::HexEncode(&store, sizeof(store)));
168 return std::move(dict);
169}
170
danakj655b66c2016-04-16 00:51:38171std::unique_ptr<base::Value> NetLogChannelIDLookupCompleteCallback(
nharper49b27d992016-02-09 18:28:51172 crypto::ECPrivateKey* key,
173 int result,
174 NetLogCaptureMode capture_mode) {
danakj655b66c2016-04-16 00:51:38175 std::unique_ptr<base::DictionaryValue> dict(new base::DictionaryValue());
nharper49b27d992016-02-09 18:28:51176 dict->SetInteger("net_error", result);
177 std::string raw_key;
178 if (result == OK && key && key->ExportRawPublicKey(&raw_key)) {
179 std::string key_to_log = "redacted";
180 if (capture_mode.include_cookies_and_credentials()) {
181 key_to_log = base::HexEncode(raw_key.data(), raw_key.length());
182 }
183 dict->SetString("key", key_to_log);
184 }
185 return std::move(dict);
186}
187
[email protected]821e3bb2013-11-08 01:06:01188} // namespace
189
svaldeze83af292016-04-26 14:33:37190class SSLClientSocketImpl::SSLContext {
[email protected]fbef13932010-11-23 12:38:53191 public:
olli.raula36aa8be2015-09-10 11:14:22192 static SSLContext* GetInstance() {
193 return base::Singleton<SSLContext>::get();
194 }
[email protected]fbef13932010-11-23 12:38:53195 SSL_CTX* ssl_ctx() { return ssl_ctx_.get(); }
svaldeze83af292016-04-26 14:33:37196 SSLClientSessionCache* session_cache() { return &session_cache_; }
[email protected]fbef13932010-11-23 12:38:53197
svaldeze83af292016-04-26 14:33:37198 SSLClientSocketImpl* GetClientSocketFromSSL(const SSL* ssl) {
[email protected]fbef13932010-11-23 12:38:53199 DCHECK(ssl);
svaldeze83af292016-04-26 14:33:37200 SSLClientSocketImpl* socket = static_cast<SSLClientSocketImpl*>(
[email protected]fbef13932010-11-23 12:38:53201 SSL_get_ex_data(ssl, ssl_socket_data_index_));
202 DCHECK(socket);
203 return socket;
204 }
205
svaldeze83af292016-04-26 14:33:37206 bool SetClientSocketForSSL(SSL* ssl, SSLClientSocketImpl* socket) {
[email protected]fbef13932010-11-23 12:38:53207 return SSL_set_ex_data(ssl, ssl_socket_data_index_, socket) != 0;
208 }
209
davidben2a811e4e2015-12-01 10:49:34210#if !defined(OS_NACL)
211 void SetSSLKeyLogFile(
212 const base::FilePath& path,
213 const scoped_refptr<base::SequencedTaskRunner>& task_runner) {
214 DCHECK(!ssl_key_logger_);
215 ssl_key_logger_.reset(new SSLKeyLogger(path, task_runner));
216 SSL_CTX_set_keylog_callback(ssl_ctx_.get(), KeyLogCallback);
217 }
218#endif
219
davidben1d489522015-07-01 18:48:46220 static const SSL_PRIVATE_KEY_METHOD kPrivateKeyMethod;
221
[email protected]fbef13932010-11-23 12:38:53222 private:
olli.raula36aa8be2015-09-10 11:14:22223 friend struct base::DefaultSingletonTraits<SSLContext>;
[email protected]fbef13932010-11-23 12:38:53224
svaldeze83af292016-04-26 14:33:37225 SSLContext() : session_cache_(SSLClientSessionCache::Config()) {
[email protected]4b559b4d2011-04-14 17:37:14226 crypto::EnsureOpenSSLInit();
[email protected]fbef13932010-11-23 12:38:53227 ssl_socket_data_index_ = SSL_get_ex_new_index(0, 0, 0, 0, 0);
228 DCHECK_NE(ssl_socket_data_index_, -1);
229 ssl_ctx_.reset(SSL_CTX_new(SSLv23_client_method()));
[email protected]b051cdb62014-02-28 02:20:16230 SSL_CTX_set_cert_verify_callback(ssl_ctx_.get(), CertVerifyCallback, NULL);
[email protected]82c59022014-08-15 09:38:27231 SSL_CTX_set_cert_cb(ssl_ctx_.get(), ClientCertRequestCallback, NULL);
[email protected]b051cdb62014-02-28 02:20:16232 SSL_CTX_set_verify(ssl_ctx_.get(), SSL_VERIFY_PEER, NULL);
haavardmc80b0ee32015-01-30 09:16:08233 // This stops |SSL_shutdown| from generating the close_notify message, which
234 // is currently not sent on the network.
235 // TODO(haavardm): Remove setting quiet shutdown once 118366 is fixed.
236 SSL_CTX_set_quiet_shutdown(ssl_ctx_.get(), 1);
bnc2d6bd0f2015-10-28 01:52:05237 // Note that SSL_OP_DISABLE_NPN is used to disable NPN if
238 // ssl_config_.next_proto is empty.
[email protected]ea4a1c6a2010-12-09 13:33:28239 SSL_CTX_set_next_proto_select_cb(ssl_ctx_.get(), SelectNextProtoCallback,
240 NULL);
davidbendafe4e52015-04-08 22:53:52241
242 // Disable the internal session cache. Session caching is handled
svaldeze83af292016-04-26 14:33:37243 // externally (i.e. by SSLClientSessionCache).
davidbendafe4e52015-04-08 22:53:52244 SSL_CTX_set_session_cache_mode(
245 ssl_ctx_.get(), SSL_SESS_CACHE_CLIENT | SSL_SESS_CACHE_NO_INTERNAL);
davidben44aeae62015-06-24 20:47:43246 SSL_CTX_sess_set_new_cb(ssl_ctx_.get(), NewSessionCallback);
nharper736ceda2015-11-07 00:16:59247
248 if (!SSL_CTX_add_client_custom_ext(ssl_ctx_.get(), kTbExtNum,
249 &TokenBindingAddCallback,
250 &TokenBindingFreeCallback, nullptr,
251 &TokenBindingParseCallback, nullptr)) {
252 NOTREACHED();
253 }
254 }
255
256 static int TokenBindingAddCallback(SSL* ssl,
257 unsigned int extension_value,
258 const uint8_t** out,
259 size_t* out_len,
260 int* out_alert_value,
261 void* add_arg) {
262 DCHECK_EQ(extension_value, kTbExtNum);
svaldeze83af292016-04-26 14:33:37263 SSLClientSocketImpl* socket =
264 SSLClientSocketImpl::SSLContext::GetInstance()->GetClientSocketFromSSL(
265 ssl);
nharper736ceda2015-11-07 00:16:59266 return socket->TokenBindingAdd(out, out_len, out_alert_value);
267 }
268
269 static void TokenBindingFreeCallback(SSL* ssl,
270 unsigned extension_value,
271 const uint8_t* out,
272 void* add_arg) {
273 DCHECK_EQ(extension_value, kTbExtNum);
274 OPENSSL_free(const_cast<unsigned char*>(out));
275 }
276
277 static int TokenBindingParseCallback(SSL* ssl,
278 unsigned int extension_value,
279 const uint8_t* contents,
280 size_t contents_len,
281 int* out_alert_value,
282 void* parse_arg) {
283 DCHECK_EQ(extension_value, kTbExtNum);
svaldeze83af292016-04-26 14:33:37284 SSLClientSocketImpl* socket =
285 SSLClientSocketImpl::SSLContext::GetInstance()->GetClientSocketFromSSL(
286 ssl);
nharper736ceda2015-11-07 00:16:59287 return socket->TokenBindingParse(contents, contents_len, out_alert_value);
[email protected]fbef13932010-11-23 12:38:53288 }
289
[email protected]82c59022014-08-15 09:38:27290 static int ClientCertRequestCallback(SSL* ssl, void* arg) {
svaldeze83af292016-04-26 14:33:37291 SSLClientSocketImpl* socket = GetInstance()->GetClientSocketFromSSL(ssl);
[email protected]82c59022014-08-15 09:38:27292 DCHECK(socket);
293 return socket->ClientCertRequestCallback(ssl);
[email protected]718c9672010-12-02 10:04:10294 }
295
svaldeze83af292016-04-26 14:33:37296 static int CertVerifyCallback(X509_STORE_CTX* store_ctx, void* arg) {
[email protected]b051cdb62014-02-28 02:20:16297 SSL* ssl = reinterpret_cast<SSL*>(X509_STORE_CTX_get_ex_data(
298 store_ctx, SSL_get_ex_data_X509_STORE_CTX_idx()));
svaldeze83af292016-04-26 14:33:37299 SSLClientSocketImpl* socket = GetInstance()->GetClientSocketFromSSL(ssl);
[email protected]b051cdb62014-02-28 02:20:16300 CHECK(socket);
301
302 return socket->CertVerifyCallback(store_ctx);
303 }
304
[email protected]ea4a1c6a2010-12-09 13:33:28305 static int SelectNextProtoCallback(SSL* ssl,
svaldeze83af292016-04-26 14:33:37306 unsigned char** out,
307 unsigned char* outlen,
[email protected]ea4a1c6a2010-12-09 13:33:28308 const unsigned char* in,
svaldeze83af292016-04-26 14:33:37309 unsigned int inlen,
310 void* arg) {
311 SSLClientSocketImpl* socket = GetInstance()->GetClientSocketFromSSL(ssl);
[email protected]ea4a1c6a2010-12-09 13:33:28312 return socket->SelectNextProtoCallback(out, outlen, in, inlen);
313 }
314
davidben44aeae62015-06-24 20:47:43315 static int NewSessionCallback(SSL* ssl, SSL_SESSION* session) {
svaldeze83af292016-04-26 14:33:37316 SSLClientSocketImpl* socket = GetInstance()->GetClientSocketFromSSL(ssl);
davidben44aeae62015-06-24 20:47:43317 return socket->NewSessionCallback(session);
davidbendafe4e52015-04-08 22:53:52318 }
319
davidben1d489522015-07-01 18:48:46320 static int PrivateKeyTypeCallback(SSL* ssl) {
svaldeze83af292016-04-26 14:33:37321 SSLClientSocketImpl* socket = GetInstance()->GetClientSocketFromSSL(ssl);
davidben1d489522015-07-01 18:48:46322 return socket->PrivateKeyTypeCallback();
323 }
324
davidben1d489522015-07-01 18:48:46325 static size_t PrivateKeyMaxSignatureLenCallback(SSL* ssl) {
svaldeze83af292016-04-26 14:33:37326 SSLClientSocketImpl* socket = GetInstance()->GetClientSocketFromSSL(ssl);
davidben1d489522015-07-01 18:48:46327 return socket->PrivateKeyMaxSignatureLenCallback();
328 }
329
330 static ssl_private_key_result_t PrivateKeySignCallback(SSL* ssl,
331 uint8_t* out,
332 size_t* out_len,
333 size_t max_out,
334 const EVP_MD* md,
335 const uint8_t* in,
336 size_t in_len) {
svaldeze83af292016-04-26 14:33:37337 SSLClientSocketImpl* socket = GetInstance()->GetClientSocketFromSSL(ssl);
davidben1d489522015-07-01 18:48:46338 return socket->PrivateKeySignCallback(out, out_len, max_out, md, in,
339 in_len);
340 }
341
342 static ssl_private_key_result_t PrivateKeySignCompleteCallback(
343 SSL* ssl,
344 uint8_t* out,
345 size_t* out_len,
346 size_t max_out) {
svaldeze83af292016-04-26 14:33:37347 SSLClientSocketImpl* socket = GetInstance()->GetClientSocketFromSSL(ssl);
davidben1d489522015-07-01 18:48:46348 return socket->PrivateKeySignCompleteCallback(out, out_len, max_out);
349 }
350
davidben2a811e4e2015-12-01 10:49:34351#if !defined(OS_NACL)
352 static void KeyLogCallback(const SSL* ssl, const char* line) {
353 GetInstance()->ssl_key_logger_->WriteLine(line);
354 }
355#endif
356
[email protected]fbef13932010-11-23 12:38:53357 // This is the index used with SSL_get_ex_data to retrieve the owner
svaldeze83af292016-04-26 14:33:37358 // SSLClientSocketImpl object from an SSL instance.
[email protected]fbef13932010-11-23 12:38:53359 int ssl_socket_data_index_;
360
davidbenc879af02015-02-20 07:57:21361 ScopedSSL_CTX ssl_ctx_;
davidbendafe4e52015-04-08 22:53:52362
davidben2a811e4e2015-12-01 10:49:34363#if !defined(OS_NACL)
danakj655b66c2016-04-16 00:51:38364 std::unique_ptr<SSLKeyLogger> ssl_key_logger_;
davidben2a811e4e2015-12-01 10:49:34365#endif
366
davidbendafe4e52015-04-08 22:53:52367 // TODO(davidben): Use a separate cache per URLRequestContext.
368 // https://crbug.com/458365
369 //
370 // TODO(davidben): Sessions should be invalidated on fatal
371 // alerts. https://crbug.com/466352
svaldeze83af292016-04-26 14:33:37372 SSLClientSessionCache session_cache_;
[email protected]1279de12013-12-03 15:13:32373};
374
davidben1d489522015-07-01 18:48:46375const SSL_PRIVATE_KEY_METHOD
svaldeze83af292016-04-26 14:33:37376 SSLClientSocketImpl::SSLContext::kPrivateKeyMethod = {
377 &SSLClientSocketImpl::SSLContext::PrivateKeyTypeCallback,
378 &SSLClientSocketImpl::SSLContext::PrivateKeyMaxSignatureLenCallback,
379 &SSLClientSocketImpl::SSLContext::PrivateKeySignCallback,
380 &SSLClientSocketImpl::SSLContext::PrivateKeySignCompleteCallback,
davidben1d489522015-07-01 18:48:46381};
382
[email protected]7f38da8a2014-03-17 16:44:26383// PeerCertificateChain is a helper object which extracts the certificate
384// chain, as given by the server, from an OpenSSL socket and performs the needed
385// resource management. The first element of the chain is the leaf certificate
386// and the other elements are in the order given by the server.
svaldeze83af292016-04-26 14:33:37387class SSLClientSocketImpl::PeerCertificateChain {
[email protected]7f38da8a2014-03-17 16:44:26388 public:
svaldeze83af292016-04-26 14:33:37389 explicit PeerCertificateChain(STACK_OF(X509) * chain) { Reset(chain); }
[email protected]7f38da8a2014-03-17 16:44:26390 PeerCertificateChain(const PeerCertificateChain& other) { *this = other; }
391 ~PeerCertificateChain() {}
392 PeerCertificateChain& operator=(const PeerCertificateChain& other);
393
[email protected]76e85392014-03-20 17:54:14394 // Resets the PeerCertificateChain to the set of certificates in|chain|,
395 // which may be NULL, indicating to empty the store certificates.
396 // Note: If an error occurs, such as being unable to parse the certificates,
397 // this will behave as if Reset(NULL) was called.
svaldeze83af292016-04-26 14:33:37398 void Reset(STACK_OF(X509) * chain);
[email protected]76e85392014-03-20 17:54:14399
svaldez2135be52016-04-20 16:34:53400 // Note that when USE_OPENSSL_CERTS is defined, OSCertHandle is X509*
davidben30798ed82014-09-19 19:28:20401 scoped_refptr<X509Certificate> AsOSChain() const;
[email protected]7f38da8a2014-03-17 16:44:26402
403 size_t size() const {
404 if (!openssl_chain_.get())
405 return 0;
406 return sk_X509_num(openssl_chain_.get());
407 }
408
svaldeze83af292016-04-26 14:33:37409 bool empty() const { return size() == 0; }
davidben30798ed82014-09-19 19:28:20410
411 X509* Get(size_t index) const {
[email protected]7f38da8a2014-03-17 16:44:26412 DCHECK_LT(index, size());
413 return sk_X509_value(openssl_chain_.get(), index);
414 }
415
416 private:
[email protected]cd9b75b2014-07-10 04:39:38417 ScopedX509Stack openssl_chain_;
[email protected]7f38da8a2014-03-17 16:44:26418};
419
svaldeze83af292016-04-26 14:33:37420SSLClientSocketImpl::PeerCertificateChain&
421SSLClientSocketImpl::PeerCertificateChain::operator=(
[email protected]7f38da8a2014-03-17 16:44:26422 const PeerCertificateChain& other) {
423 if (this == &other)
424 return *this;
425
[email protected]24176af2014-08-14 09:31:04426 openssl_chain_.reset(X509_chain_up_ref(other.openssl_chain_.get()));
[email protected]7f38da8a2014-03-17 16:44:26427 return *this;
428}
429
svaldeze83af292016-04-26 14:33:37430void SSLClientSocketImpl::PeerCertificateChain::Reset(STACK_OF(X509) * chain) {
davidben30798ed82014-09-19 19:28:20431 openssl_chain_.reset(chain ? X509_chain_up_ref(chain) : NULL);
[email protected]7f38da8a2014-03-17 16:44:26432}
[email protected]7f38da8a2014-03-17 16:44:26433
davidben30798ed82014-09-19 19:28:20434scoped_refptr<X509Certificate>
svaldeze83af292016-04-26 14:33:37435SSLClientSocketImpl::PeerCertificateChain::AsOSChain() const {
davidben30798ed82014-09-19 19:28:20436#if defined(USE_OPENSSL_CERTS)
437 // When OSCertHandle is typedef'ed to X509, this implementation does a short
438 // cut to avoid converting back and forth between DER and the X509 struct.
439 X509Certificate::OSCertHandles intermediates;
440 for (size_t i = 1; i < sk_X509_num(openssl_chain_.get()); ++i) {
441 intermediates.push_back(sk_X509_value(openssl_chain_.get(), i));
442 }
[email protected]7f38da8a2014-03-17 16:44:26443
svaldezc4b6f122016-01-20 22:13:59444 return X509Certificate::CreateFromHandle(
445 sk_X509_value(openssl_chain_.get(), 0), intermediates);
davidben30798ed82014-09-19 19:28:20446#else
447 // DER-encode the chain and convert to a platform certificate handle.
[email protected]7f38da8a2014-03-17 16:44:26448 std::vector<base::StringPiece> der_chain;
[email protected]edfd0f42014-07-22 18:20:37449 for (size_t i = 0; i < sk_X509_num(openssl_chain_.get()); ++i) {
[email protected]7f38da8a2014-03-17 16:44:26450 X509* x = sk_X509_value(openssl_chain_.get(), i);
davidben30798ed82014-09-19 19:28:20451 base::StringPiece der;
452 if (!x509_util::GetDER(x, &der))
453 return NULL;
454 der_chain.push_back(der);
[email protected]7f38da8a2014-03-17 16:44:26455 }
456
svaldezc4b6f122016-01-20 22:13:59457 return X509Certificate::CreateFromDERCertChain(der_chain);
davidben30798ed82014-09-19 19:28:20458#endif
[email protected]7f38da8a2014-03-17 16:44:26459}
[email protected]7f38da8a2014-03-17 16:44:26460
[email protected]1279de12013-12-03 15:13:32461// static
[email protected]c3456bb2011-12-12 22:22:19462void SSLClientSocket::ClearSessionCache() {
svaldeze83af292016-04-26 14:33:37463 SSLClientSocketImpl::SSLContext* context =
464 SSLClientSocketImpl::SSLContext::GetInstance();
[email protected]c3456bb2011-12-12 22:22:19465 context->session_cache()->Flush();
466}
467
svaldeze83af292016-04-26 14:33:37468SSLClientSocketImpl::SSLClientSocketImpl(
danakj655b66c2016-04-16 00:51:38469 std::unique_ptr<ClientSocketHandle> transport_socket,
[email protected]055d7f22010-11-15 12:03:12470 const HostPortPair& host_and_port,
[email protected]822581d2010-12-16 17:27:15471 const SSLConfig& ssl_config,
[email protected]feb79bcd2011-07-21 16:55:17472 const SSLClientSocketContext& context)
[email protected]83039bb2011-12-09 18:43:55473 : transport_send_busy_(false),
[email protected]d518cd92010-09-29 12:27:44474 transport_recv_busy_(false),
davidben1d489522015-07-01 18:48:46475 pending_read_error_(kNoPendingResult),
davidbenb8c23212014-10-28 00:12:16476 pending_read_ssl_error_(SSL_ERROR_NONE),
[email protected]5aea79182014-07-14 20:43:41477 transport_read_error_(OK),
[email protected]3e5c6922014-02-06 02:42:16478 transport_write_error_(OK),
[email protected]7f38da8a2014-03-17 16:44:26479 server_cert_chain_(new PeerCertificateChain(NULL)),
[email protected]64b5c892014-08-08 09:39:26480 completed_connect_(false),
[email protected]0dc88b32014-03-26 20:12:28481 was_ever_used_(false),
[email protected]feb79bcd2011-07-21 16:55:17482 cert_verifier_(context.cert_verifier),
davidbeneb5f8ef32014-09-04 14:14:32483 cert_transparency_verifier_(context.cert_transparency_verifier),
[email protected]6b8a3c742014-07-25 00:25:35484 channel_id_service_(context.channel_id_service),
nharper736ceda2015-11-07 00:16:59485 tb_was_negotiated_(false),
486 tb_negotiated_param_(TB_PARAM_ECDSAP256),
nharperb7441ef2016-01-25 23:54:14487 tb_signed_ekm_map_(10),
[email protected]d518cd92010-09-29 12:27:44488 ssl_(NULL),
489 transport_bio_(NULL),
dchengc7eeda422015-12-26 03:56:48490 transport_(std::move(transport_socket)),
[email protected]055d7f22010-11-15 12:03:12491 host_and_port_(host_and_port),
[email protected]d518cd92010-09-29 12:27:44492 ssl_config_(ssl_config),
[email protected]c3456bb2011-12-12 22:22:19493 ssl_session_cache_shard_(context.ssl_session_cache_shard),
[email protected]013c17c2012-01-21 19:09:01494 next_handshake_state_(STATE_NONE),
svaldez4af14d22015-08-20 13:48:24495 disconnected_(false),
[email protected]ea4a1c6a2010-12-09 13:33:28496 npn_status_(kNextProtoUnsupported),
davidben52053b382015-04-27 19:22:29497 channel_id_sent_(false),
davidben44aeae62015-06-24 20:47:43498 session_pending_(false),
davidbendafe4e52015-04-08 22:53:52499 certificate_verified_(false),
davidbenf2eaaf92015-05-15 22:18:42500 ssl_failure_state_(SSL_FAILURE_NONE),
davidben1d489522015-07-01 18:48:46501 signature_result_(kNoPendingResult),
[email protected]8bd4e7a2014-08-09 14:49:17502 transport_security_state_(context.transport_security_state),
estark6f9b3d82016-01-12 21:37:05503 policy_enforcer_(context.ct_policy_enforcer),
kulkarni.acd7b4462014-08-28 07:41:34504 net_log_(transport_->socket()->NetLog()),
505 weak_factory_(this) {
davidben9bbf3292015-04-24 21:50:06506 DCHECK(cert_verifier_);
[email protected]8e458552014-08-05 00:02:15507}
[email protected]d518cd92010-09-29 12:27:44508
svaldeze83af292016-04-26 14:33:37509SSLClientSocketImpl::~SSLClientSocketImpl() {
[email protected]d518cd92010-09-29 12:27:44510 Disconnect();
511}
512
davidben2a811e4e2015-12-01 10:49:34513#if !defined(OS_NACL)
svaldeze83af292016-04-26 14:33:37514void SSLClientSocketImpl::SetSSLKeyLogFile(
davidben2a811e4e2015-12-01 10:49:34515 const base::FilePath& ssl_keylog_file,
516 const scoped_refptr<base::SequencedTaskRunner>& task_runner) {
517 SSLContext::GetInstance()->SetSSLKeyLogFile(ssl_keylog_file, task_runner);
zhongyi81f85c6d92015-10-16 19:34:14518}
davidben2a811e4e2015-12-01 10:49:34519#endif
zhongyi81f85c6d92015-10-16 19:34:14520
svaldeze83af292016-04-26 14:33:37521void SSLClientSocketImpl::GetSSLCertRequestInfo(
[email protected]b9b651f2013-11-09 04:32:22522 SSLCertRequestInfo* cert_request_info) {
[email protected]791879c2013-12-17 07:22:41523 cert_request_info->host_and_port = host_and_port_;
[email protected]b9b651f2013-11-09 04:32:22524 cert_request_info->cert_authorities = cert_authorities_;
[email protected]c0787702014-05-20 21:51:44525 cert_request_info->cert_key_types = cert_key_types_;
[email protected]b9b651f2013-11-09 04:32:22526}
527
svaldeze83af292016-04-26 14:33:37528SSLClientSocket::NextProtoStatus SSLClientSocketImpl::GetNextProto(
davidben6974bf72015-04-27 17:52:48529 std::string* proto) const {
[email protected]b9b651f2013-11-09 04:32:22530 *proto = npn_proto_;
[email protected]b9b651f2013-11-09 04:32:22531 return npn_status_;
532}
533
svaldeze83af292016-04-26 14:33:37534ChannelIDService* SSLClientSocketImpl::GetChannelIDService() const {
[email protected]6b8a3c742014-07-25 00:25:35535 return channel_id_service_;
[email protected]b9b651f2013-11-09 04:32:22536}
537
svaldeze83af292016-04-26 14:33:37538Error SSLClientSocketImpl::GetSignedEKMForTokenBinding(
nharperb7441ef2016-01-25 23:54:14539 crypto::ECPrivateKey* key,
540 std::vector<uint8_t>* out) {
541 // The same key will be used across multiple requests to sign the same value,
542 // so the signature is cached.
543 std::string raw_public_key;
544 if (!key->ExportRawPublicKey(&raw_public_key))
545 return ERR_FAILED;
546 SignedEkmMap::iterator it = tb_signed_ekm_map_.Get(raw_public_key);
547 if (it != tb_signed_ekm_map_.end()) {
548 *out = it->second;
549 return OK;
550 }
551
552 uint8_t tb_ekm_buf[32];
553 static const char kTokenBindingExporterLabel[] = "EXPORTER-Token-Binding";
554 if (!SSL_export_keying_material(ssl_, tb_ekm_buf, sizeof(tb_ekm_buf),
555 kTokenBindingExporterLabel,
556 strlen(kTokenBindingExporterLabel), nullptr,
557 0, false /* no context */)) {
558 return ERR_FAILED;
559 }
560
nharperd5cddca2016-02-27 03:37:52561 if (!SignTokenBindingEkm(
562 base::StringPiece(reinterpret_cast<char*>(tb_ekm_buf),
563 sizeof(tb_ekm_buf)),
564 key, out))
nharperb7441ef2016-01-25 23:54:14565 return ERR_FAILED;
nharperb7441ef2016-01-25 23:54:14566
567 tb_signed_ekm_map_.Put(raw_public_key, *out);
568 return OK;
569}
570
svaldeze83af292016-04-26 14:33:37571crypto::ECPrivateKey* SSLClientSocketImpl::GetChannelIDKey() const {
nharperb36644f2016-02-22 23:14:43572 return channel_id_key_.get();
573}
574
svaldeze83af292016-04-26 14:33:37575SSLFailureState SSLClientSocketImpl::GetSSLFailureState() const {
davidbenf2eaaf92015-05-15 22:18:42576 return ssl_failure_state_;
577}
578
svaldeze83af292016-04-26 14:33:37579int SSLClientSocketImpl::ExportKeyingMaterial(const base::StringPiece& label,
580 bool has_context,
581 const base::StringPiece& context,
582 unsigned char* out,
583 unsigned int outlen) {
davidben86935f72015-05-06 22:24:49584 if (!IsConnected())
585 return ERR_SOCKET_NOT_CONNECTED;
586
[email protected]b9b651f2013-11-09 04:32:22587 crypto::OpenSSLErrStackTracer err_tracer(FROM_HERE);
588
589 int rv = SSL_export_keying_material(
[email protected]c8a80e92014-05-17 16:02:08590 ssl_, out, outlen, label.data(), label.size(),
davidben866c3d4a72015-04-06 21:56:43591 reinterpret_cast<const unsigned char*>(context.data()), context.length(),
592 has_context ? 1 : 0);
[email protected]b9b651f2013-11-09 04:32:22593
594 if (rv != 1) {
595 int ssl_error = SSL_get_error(ssl_, rv);
596 LOG(ERROR) << "Failed to export keying material;"
svaldeze83af292016-04-26 14:33:37597 << " returned " << rv << ", SSL error code " << ssl_error;
[email protected]b9b651f2013-11-09 04:32:22598 return MapOpenSSLError(ssl_error, err_tracer);
599 }
600 return OK;
601}
602
svaldeze83af292016-04-26 14:33:37603int SSLClientSocketImpl::Connect(const CompletionCallback& callback) {
[email protected]8bd4e7a2014-08-09 14:49:17604 // It is an error to create an SSLClientSocket whose context has no
605 // TransportSecurityState.
606 DCHECK(transport_security_state_);
607
svaldez4af14d22015-08-20 13:48:24608 // Although StreamSocket does allow calling Connect() after Disconnect(),
609 // this has never worked for layered sockets. CHECK to detect any consumers
610 // reconnecting an SSL socket.
611 //
612 // TODO(davidben,mmenke): Remove this API feature. See
613 // https://crbug.com/499289.
614 CHECK(!disconnected_);
615
[email protected]b9b651f2013-11-09 04:32:22616 net_log_.BeginEvent(NetLog::TYPE_SSL_CONNECT);
617
618 // Set up new ssl object.
[email protected]c8a80e92014-05-17 16:02:08619 int rv = Init();
620 if (rv != OK) {
621 net_log_.EndEventWithNetErrorCode(NetLog::TYPE_SSL_CONNECT, rv);
622 return rv;
[email protected]b9b651f2013-11-09 04:32:22623 }
624
625 // Set SSL to client mode. Handshake happens in the loop below.
626 SSL_set_connect_state(ssl_);
627
628 GotoState(STATE_HANDSHAKE);
[email protected]c8a80e92014-05-17 16:02:08629 rv = DoHandshakeLoop(OK);
[email protected]b9b651f2013-11-09 04:32:22630 if (rv == ERR_IO_PENDING) {
631 user_connect_callback_ = callback;
632 } else {
633 net_log_.EndEventWithNetErrorCode(NetLog::TYPE_SSL_CONNECT, rv);
634 }
635
636 return rv > OK ? OK : rv;
637}
638
svaldeze83af292016-04-26 14:33:37639void SSLClientSocketImpl::Disconnect() {
davidbened3764bb2016-03-14 19:53:16640 crypto::OpenSSLErrStackTracer tracer(FROM_HERE);
641
[email protected]b9b651f2013-11-09 04:32:22642 if (ssl_) {
643 // Calling SSL_shutdown prevents the session from being marked as
644 // unresumable.
645 SSL_shutdown(ssl_);
646 SSL_free(ssl_);
647 ssl_ = NULL;
648 }
649 if (transport_bio_) {
650 BIO_free_all(transport_bio_);
651 transport_bio_ = NULL;
652 }
653
svaldez4af14d22015-08-20 13:48:24654 disconnected_ = true;
655
[email protected]b9b651f2013-11-09 04:32:22656 // Shut down anything that may call us back.
eroman7f9236a2015-05-11 21:23:43657 cert_verifier_request_.reset();
[email protected]b9b651f2013-11-09 04:32:22658 transport_->socket()->Disconnect();
659
660 // Null all callbacks, delete all buffers.
661 transport_send_busy_ = false;
662 send_buffer_ = NULL;
663 transport_recv_busy_ = false;
[email protected]b9b651f2013-11-09 04:32:22664 recv_buffer_ = NULL;
665
666 user_connect_callback_.Reset();
667 user_read_callback_.Reset();
668 user_write_callback_.Reset();
svaldeze83af292016-04-26 14:33:37669 user_read_buf_ = NULL;
670 user_read_buf_len_ = 0;
671 user_write_buf_ = NULL;
672 user_write_buf_len_ = 0;
[email protected]b9b651f2013-11-09 04:32:22673
davidben1d489522015-07-01 18:48:46674 pending_read_error_ = kNoPendingResult;
davidbenb8c23212014-10-28 00:12:16675 pending_read_ssl_error_ = SSL_ERROR_NONE;
676 pending_read_error_info_ = OpenSSLErrorInfo();
677
[email protected]5aea79182014-07-14 20:43:41678 transport_read_error_ = OK;
[email protected]3e5c6922014-02-06 02:42:16679 transport_write_error_ = OK;
680
[email protected]b9b651f2013-11-09 04:32:22681 server_cert_verify_result_.Reset();
[email protected]64b5c892014-08-08 09:39:26682 completed_connect_ = false;
[email protected]b9b651f2013-11-09 04:32:22683
684 cert_authorities_.clear();
[email protected]c0787702014-05-20 21:51:44685 cert_key_types_.clear();
[email protected]faff9852014-06-21 06:13:46686
davidben09c3d072014-08-25 20:33:58687 start_cert_verification_time_ = base::TimeTicks();
688
[email protected]abc44b752014-07-30 03:52:15689 npn_status_ = kNextProtoUnsupported;
690 npn_proto_.clear();
691
davidben52053b382015-04-27 19:22:29692 channel_id_sent_ = false;
nharper736ceda2015-11-07 00:16:59693 tb_was_negotiated_ = false;
davidben44aeae62015-06-24 20:47:43694 session_pending_ = false;
davidbenf2eaaf92015-05-15 22:18:42695 certificate_verified_ = false;
nharper75ade892015-06-10 19:05:35696 channel_id_request_.Cancel();
davidbenf2eaaf92015-05-15 22:18:42697 ssl_failure_state_ = SSL_FAILURE_NONE;
davidben1d489522015-07-01 18:48:46698
davidben1d489522015-07-01 18:48:46699 signature_result_ = kNoPendingResult;
700 signature_.clear();
[email protected]b9b651f2013-11-09 04:32:22701}
702
svaldeze83af292016-04-26 14:33:37703bool SSLClientSocketImpl::IsConnected() const {
[email protected]b9b651f2013-11-09 04:32:22704 // If the handshake has not yet completed.
[email protected]64b5c892014-08-08 09:39:26705 if (!completed_connect_)
[email protected]b9b651f2013-11-09 04:32:22706 return false;
707 // If an asynchronous operation is still pending.
708 if (user_read_buf_.get() || user_write_buf_.get())
709 return true;
710
711 return transport_->socket()->IsConnected();
712}
713
svaldeze83af292016-04-26 14:33:37714bool SSLClientSocketImpl::IsConnectedAndIdle() const {
[email protected]b9b651f2013-11-09 04:32:22715 // If the handshake has not yet completed.
[email protected]64b5c892014-08-08 09:39:26716 if (!completed_connect_)
[email protected]b9b651f2013-11-09 04:32:22717 return false;
718 // If an asynchronous operation is still pending.
719 if (user_read_buf_.get() || user_write_buf_.get())
720 return false;
davidbenfc9a6b82015-04-15 23:47:32721
722 // If there is data read from the network that has not yet been consumed, do
723 // not treat the connection as idle.
724 //
725 // Note that this does not check |BIO_pending|, whether there is ciphertext
726 // that has not yet been flushed to the network. |Write| returns early, so
727 // this can cause race conditions which cause a socket to not be treated
728 // reusable when it should be. See https://crbug.com/466147.
729 if (BIO_wpending(transport_bio_) > 0)
[email protected]b9b651f2013-11-09 04:32:22730 return false;
[email protected]b9b651f2013-11-09 04:32:22731
732 return transport_->socket()->IsConnectedAndIdle();
733}
734
svaldeze83af292016-04-26 14:33:37735int SSLClientSocketImpl::GetPeerAddress(IPEndPoint* addressList) const {
[email protected]b9b651f2013-11-09 04:32:22736 return transport_->socket()->GetPeerAddress(addressList);
737}
738
svaldeze83af292016-04-26 14:33:37739int SSLClientSocketImpl::GetLocalAddress(IPEndPoint* addressList) const {
[email protected]b9b651f2013-11-09 04:32:22740 return transport_->socket()->GetLocalAddress(addressList);
741}
742
svaldeze83af292016-04-26 14:33:37743const BoundNetLog& SSLClientSocketImpl::NetLog() const {
[email protected]b9b651f2013-11-09 04:32:22744 return net_log_;
745}
746
svaldeze83af292016-04-26 14:33:37747void SSLClientSocketImpl::SetSubresourceSpeculation() {
[email protected]b9b651f2013-11-09 04:32:22748 if (transport_.get() && transport_->socket()) {
749 transport_->socket()->SetSubresourceSpeculation();
750 } else {
751 NOTREACHED();
752 }
753}
754
svaldeze83af292016-04-26 14:33:37755void SSLClientSocketImpl::SetOmniboxSpeculation() {
[email protected]b9b651f2013-11-09 04:32:22756 if (transport_.get() && transport_->socket()) {
757 transport_->socket()->SetOmniboxSpeculation();
758 } else {
759 NOTREACHED();
760 }
761}
762
svaldeze83af292016-04-26 14:33:37763bool SSLClientSocketImpl::WasEverUsed() const {
[email protected]0dc88b32014-03-26 20:12:28764 return was_ever_used_;
[email protected]b9b651f2013-11-09 04:32:22765}
766
svaldeze83af292016-04-26 14:33:37767bool SSLClientSocketImpl::GetSSLInfo(SSLInfo* ssl_info) {
[email protected]b9b651f2013-11-09 04:32:22768 ssl_info->Reset();
davidben30798ed82014-09-19 19:28:20769 if (server_cert_chain_->empty())
[email protected]b9b651f2013-11-09 04:32:22770 return false;
771
772 ssl_info->cert = server_cert_verify_result_.verified_cert;
estark03d644f2015-06-13 00:11:32773 ssl_info->unverified_cert = server_cert_;
[email protected]b9b651f2013-11-09 04:32:22774 ssl_info->cert_status = server_cert_verify_result_.cert_status;
775 ssl_info->is_issued_by_known_root =
776 server_cert_verify_result_.is_issued_by_known_root;
svaldeze83af292016-04-26 14:33:37777 ssl_info->public_key_hashes = server_cert_verify_result_.public_key_hashes;
[email protected]b9b651f2013-11-09 04:32:22778 ssl_info->client_cert_sent =
779 ssl_config_.send_client_cert && ssl_config_.client_cert.get();
davidben52053b382015-04-27 19:22:29780 ssl_info->channel_id_sent = channel_id_sent_;
nharper736ceda2015-11-07 00:16:59781 ssl_info->token_binding_negotiated = tb_was_negotiated_;
782 ssl_info->token_binding_key_param = tb_negotiated_param_;
[email protected]8bd4e7a2014-08-09 14:49:17783 ssl_info->pinning_failure_log = pinning_failure_log_;
[email protected]b9b651f2013-11-09 04:32:22784
estark723b5eeb2016-02-18 21:01:12785 AddCTInfoToSSLInfo(ssl_info);
davidbeneb5f8ef32014-09-04 14:14:32786
[email protected]b9b651f2013-11-09 04:32:22787 const SSL_CIPHER* cipher = SSL_get_current_cipher(ssl_);
788 CHECK(cipher);
789 ssl_info->security_bits = SSL_CIPHER_get_bits(cipher, NULL);
sigbjorn79cf3722015-09-18 09:15:20790 ssl_info->key_exchange_info =
791 SSL_SESSION_get_key_exchange_info(SSL_get_session(ssl_));
[email protected]b9b651f2013-11-09 04:32:22792
ryanchung987b2ff2016-02-19 00:17:12793 SSLConnectionStatusSetCipherSuite(
794 static_cast<uint16_t>(SSL_CIPHER_get_id(cipher)),
795 &ssl_info->connection_status);
796 SSLConnectionStatusSetVersion(GetNetSSLVersion(ssl_),
797 &ssl_info->connection_status);
[email protected]b9b651f2013-11-09 04:32:22798
davidben09c3d072014-08-25 20:33:58799 if (!SSL_get_secure_renegotiation_support(ssl_))
[email protected]b9b651f2013-11-09 04:32:22800 ssl_info->connection_status |= SSL_CONNECTION_NO_RENEGOTIATION_EXTENSION;
[email protected]b9b651f2013-11-09 04:32:22801
802 if (ssl_config_.version_fallback)
803 ssl_info->connection_status |= SSL_CONNECTION_VERSION_FALLBACK;
804
svaldeze83af292016-04-26 14:33:37805 ssl_info->handshake_type = SSL_session_reused(ssl_)
806 ? SSLInfo::HANDSHAKE_RESUME
807 : SSLInfo::HANDSHAKE_FULL;
[email protected]b9b651f2013-11-09 04:32:22808
809 DVLOG(3) << "Encoded connection status: cipher suite = "
svaldeze83af292016-04-26 14:33:37810 << SSLConnectionStatusToCipherSuite(ssl_info->connection_status)
811 << " version = "
812 << SSLConnectionStatusToVersion(ssl_info->connection_status);
[email protected]b9b651f2013-11-09 04:32:22813 return true;
814}
815
svaldeze83af292016-04-26 14:33:37816void SSLClientSocketImpl::GetConnectionAttempts(ConnectionAttempts* out) const {
ttuttle23fdb7b2015-05-15 01:28:03817 out->clear();
818}
819
svaldeze83af292016-04-26 14:33:37820int64_t SSLClientSocketImpl::GetTotalReceivedBytes() const {
tbansalf82cc8e2015-10-14 20:05:49821 return transport_->socket()->GetTotalReceivedBytes();
822}
823
svaldeze83af292016-04-26 14:33:37824int SSLClientSocketImpl::Read(IOBuffer* buf,
825 int buf_len,
826 const CompletionCallback& callback) {
[email protected]b9b651f2013-11-09 04:32:22827 user_read_buf_ = buf;
828 user_read_buf_len_ = buf_len;
829
davidben1b133ad2014-10-23 04:23:13830 int rv = DoReadLoop();
[email protected]b9b651f2013-11-09 04:32:22831
832 if (rv == ERR_IO_PENDING) {
833 user_read_callback_ = callback;
834 } else {
[email protected]0dc88b32014-03-26 20:12:28835 if (rv > 0)
836 was_ever_used_ = true;
[email protected]b9b651f2013-11-09 04:32:22837 user_read_buf_ = NULL;
838 user_read_buf_len_ = 0;
839 }
840
841 return rv;
842}
843
svaldeze83af292016-04-26 14:33:37844int SSLClientSocketImpl::Write(IOBuffer* buf,
845 int buf_len,
846 const CompletionCallback& callback) {
[email protected]b9b651f2013-11-09 04:32:22847 user_write_buf_ = buf;
848 user_write_buf_len_ = buf_len;
849
davidben1b133ad2014-10-23 04:23:13850 int rv = DoWriteLoop();
[email protected]b9b651f2013-11-09 04:32:22851
852 if (rv == ERR_IO_PENDING) {
853 user_write_callback_ = callback;
854 } else {
[email protected]0dc88b32014-03-26 20:12:28855 if (rv > 0)
856 was_ever_used_ = true;
[email protected]b9b651f2013-11-09 04:32:22857 user_write_buf_ = NULL;
858 user_write_buf_len_ = 0;
859 }
860
861 return rv;
862}
863
svaldeze83af292016-04-26 14:33:37864int SSLClientSocketImpl::SetReceiveBufferSize(int32_t size) {
[email protected]b9b651f2013-11-09 04:32:22865 return transport_->socket()->SetReceiveBufferSize(size);
866}
867
svaldeze83af292016-04-26 14:33:37868int SSLClientSocketImpl::SetSendBufferSize(int32_t size) {
[email protected]b9b651f2013-11-09 04:32:22869 return transport_->socket()->SetSendBufferSize(size);
870}
871
svaldeze83af292016-04-26 14:33:37872int SSLClientSocketImpl::Init() {
[email protected]9e733f32010-10-04 18:19:08873 DCHECK(!ssl_);
874 DCHECK(!transport_bio_);
875
svaldez2135be52016-04-20 16:34:53876#if defined(USE_NSS_CERTS)
davidbena477a70a2015-10-06 04:38:29877 if (ssl_config_.cert_io_enabled) {
878 // TODO(davidben): Move this out of SSLClientSocket. See
879 // https://crbug.com/539520.
880 EnsureNSSHttpIOInit();
881 }
882#endif
883
[email protected]b29af7d2010-12-14 11:52:47884 SSLContext* context = SSLContext::GetInstance();
[email protected]4b559b4d2011-04-14 17:37:14885 crypto::OpenSSLErrStackTracer err_tracer(FROM_HERE);
[email protected]d518cd92010-09-29 12:27:44886
[email protected]fbef13932010-11-23 12:38:53887 ssl_ = SSL_new(context->ssl_ctx());
888 if (!ssl_ || !context->SetClientSocketForSSL(ssl_, this))
[email protected]c8a80e92014-05-17 16:02:08889 return ERR_UNEXPECTED;
[email protected]fbef13932010-11-23 12:38:53890
davidben9bc0466f2015-06-16 22:21:27891 // SNI should only contain valid DNS hostnames, not IP addresses (see RFC
892 // 6066, Section 3).
893 //
894 // TODO(rsleevi): Should this code allow hostnames that violate the LDH rule?
895 // See https://crbug.com/496472 and https://crbug.com/496468 for discussion.
martijna2e83bd2016-03-18 13:10:45896 IPAddress unused;
897 if (!unused.AssignFromIPLiteral(host_and_port_.host()) &&
davidben9bc0466f2015-06-16 22:21:27898 !SSL_set_tlsext_host_name(ssl_, host_and_port_.host().c_str())) {
[email protected]c8a80e92014-05-17 16:02:08899 return ERR_UNEXPECTED;
davidben9bc0466f2015-06-16 22:21:27900 }
[email protected]fbef13932010-11-23 12:38:53901
davidbenf4c9a6122015-10-20 02:45:29902 ScopedSSL_SESSION session =
903 context->session_cache()->Lookup(GetSessionCacheKey());
904 if (session)
905 SSL_set_session(ssl_, session.get());
[email protected]d518cd92010-09-29 12:27:44906
haavardm2d92e722014-12-19 13:45:44907 send_buffer_ = new GrowableIOBuffer();
908 send_buffer_->SetCapacity(KDefaultOpenSSLBufferSize);
909 recv_buffer_ = new GrowableIOBuffer();
910 recv_buffer_->SetCapacity(KDefaultOpenSSLBufferSize);
911
[email protected]d518cd92010-09-29 12:27:44912 BIO* ssl_bio = NULL;
haavardm2d92e722014-12-19 13:45:44913
svaldeze83af292016-04-26 14:33:37914 // SSLClientSocketImpl retains ownership of the BIO buffers.
haavardm2d92e722014-12-19 13:45:44915 if (!BIO_new_bio_pair_external_buf(
916 &ssl_bio, send_buffer_->capacity(),
917 reinterpret_cast<uint8_t*>(send_buffer_->data()), &transport_bio_,
918 recv_buffer_->capacity(),
919 reinterpret_cast<uint8_t*>(recv_buffer_->data())))
[email protected]c8a80e92014-05-17 16:02:08920 return ERR_UNEXPECTED;
[email protected]d518cd92010-09-29 12:27:44921 DCHECK(ssl_bio);
922 DCHECK(transport_bio_);
923
[email protected]5aea79182014-07-14 20:43:41924 // Install a callback on OpenSSL's end to plumb transport errors through.
svaldeze83af292016-04-26 14:33:37925 BIO_set_callback(ssl_bio, &SSLClientSocketImpl::BIOCallback);
[email protected]5aea79182014-07-14 20:43:41926 BIO_set_callback_arg(ssl_bio, reinterpret_cast<char*>(this));
927
[email protected]d518cd92010-09-29 12:27:44928 SSL_set_bio(ssl_, ssl_bio, ssl_bio);
929
davidbenb937d6c2015-05-14 04:53:42930 DCHECK_LT(SSL3_VERSION, ssl_config_.version_min);
931 DCHECK_LT(SSL3_VERSION, ssl_config_.version_max);
932 SSL_set_min_version(ssl_, ssl_config_.version_min);
933 SSL_set_max_version(ssl_, ssl_config_.version_max);
934
[email protected]9e733f32010-10-04 18:19:08935 // OpenSSL defaults some options to on, others to off. To avoid ambiguity,
936 // set everything we care about to an absolute value.
[email protected]fb10e2282010-12-01 17:08:48937 SslSetClearMask options;
[email protected]d0f00492012-08-03 22:35:13938 options.ConfigureFlag(SSL_OP_NO_COMPRESSION, true);
[email protected]9e733f32010-10-04 18:19:08939
940 // TODO(joth): Set this conditionally, see http://crbug.com/55410
[email protected]fb10e2282010-12-01 17:08:48941 options.ConfigureFlag(SSL_OP_LEGACY_SERVER_CONNECT, true);
[email protected]9e733f32010-10-04 18:19:08942
[email protected]fb10e2282010-12-01 17:08:48943 SSL_set_options(ssl_, options.set_mask);
944 SSL_clear_options(ssl_, options.clear_mask);
[email protected]9e733f32010-10-04 18:19:08945
[email protected]fb10e2282010-12-01 17:08:48946 // Same as above, this time for the SSL mode.
947 SslSetClearMask mode;
[email protected]9e733f32010-10-04 18:19:08948
[email protected]fb10e2282010-12-01 17:08:48949 mode.ConfigureFlag(SSL_MODE_RELEASE_BUFFERS, true);
ishermane5c05e12014-09-09 20:32:15950 mode.ConfigureFlag(SSL_MODE_CBC_RECORD_SPLITTING, true);
[email protected]fb10e2282010-12-01 17:08:48951
davidben818d93b2015-02-19 22:27:32952 mode.ConfigureFlag(SSL_MODE_ENABLE_FALSE_START,
[email protected]b788de02014-04-23 18:06:07953 ssl_config_.false_start_enabled);
954
davidben6b8131c2015-02-25 23:30:14955 mode.ConfigureFlag(SSL_MODE_SEND_FALLBACK_SCSV, ssl_config_.version_fallback);
956
[email protected]fb10e2282010-12-01 17:08:48957 SSL_set_mode(ssl_, mode.set_mask);
958 SSL_clear_mode(ssl_, mode.clear_mask);
[email protected]109805a2010-12-07 18:17:06959
davidbenb3c2d972016-03-11 22:36:17960 // Use BoringSSL defaults, but disable HMAC-SHA256 and HMAC-SHA384 ciphers
961 // (note that SHA256 and SHA384 only select legacy CBC ciphers). Also disable
962 // DHE_RSA_WITH_AES_256_GCM_SHA384. Historically, AES_256_GCM was not
963 // supported. As DHE is being deprecated, don't add a cipher only to remove it
964 // immediately.
965 std::string command(
966 "DEFAULT:!SHA256:!SHA384:!DHE-RSA-AES256-GCM-SHA384:!aPSK");
davidben9b4a9b9c2015-10-12 18:46:51967
968 if (ssl_config_.require_ecdhe)
969 command.append(":!kRSA:!kDHE");
davidben8ecc3072014-09-03 23:19:09970
davidben45e87482015-12-11 00:09:38971 if (!(ssl_config_.rc4_enabled &&
972 ssl_config_.deprecated_cipher_suites_enabled)) {
davidbena4c9d062015-04-03 22:34:25973 command.append(":!RC4");
davidben45e87482015-12-11 00:09:38974 }
davidben14b1a532015-10-30 16:01:09975
davidben68dcc582016-01-12 22:09:36976 if (!ssl_config_.deprecated_cipher_suites_enabled) {
davidben01d8e332015-11-20 17:08:58977 // Only offer DHE on the second handshake. https://crbug.com/538690
978 command.append(":!kDHE");
davidben91585692015-09-28 23:46:08979 }
davidbena4c9d062015-04-03 22:34:25980
davidben9b4a9b9c2015-10-12 18:46:51981 // Remove any disabled ciphers.
982 for (uint16_t id : ssl_config_.disabled_cipher_suites) {
983 const SSL_CIPHER* cipher = SSL_get_cipher_by_value(id);
984 if (cipher) {
985 command.append(":!");
986 command.append(SSL_CIPHER_get_name(cipher));
987 }
988 }
989
[email protected]109805a2010-12-07 18:17:06990 int rv = SSL_set_cipher_list(ssl_, command.c_str());
991 // If this fails (rv = 0) it means there are no ciphers enabled on this SSL.
992 // This will almost certainly result in the socket failing to complete the
993 // handshake at which point the appropriate error is bubbled up to the client.
994 LOG_IF(WARNING, rv != 1) << "SSL_set_cipher_list('" << command << "') "
svaldeze83af292016-04-26 14:33:37995 "returned "
996 << rv;
[email protected]ee0f2aa82013-10-25 11:59:26997
998 // TLS channel ids.
[email protected]6b8a3c742014-07-25 00:25:35999 if (IsChannelIDEnabled(ssl_config_, channel_id_service_)) {
[email protected]ee0f2aa82013-10-25 11:59:261000 SSL_enable_tls_channel_id(ssl_);
1001 }
1002
bnc1f295372015-10-21 23:24:221003 if (!ssl_config_.alpn_protos.empty()) {
bnc1e757502014-12-13 02:20:161004 // Get list of ciphers that are enabled.
1005 STACK_OF(SSL_CIPHER)* enabled_ciphers = SSL_get_ciphers(ssl_);
1006 DCHECK(enabled_ciphers);
Avi Drissman13fc8932015-12-20 04:40:461007 std::vector<uint16_t> enabled_ciphers_vector;
bnc1e757502014-12-13 02:20:161008 for (size_t i = 0; i < sk_SSL_CIPHER_num(enabled_ciphers); ++i) {
1009 const SSL_CIPHER* cipher = sk_SSL_CIPHER_value(enabled_ciphers, i);
Avi Drissman13fc8932015-12-20 04:40:461010 const uint16_t id = static_cast<uint16_t>(SSL_CIPHER_get_id(cipher));
bnc1e757502014-12-13 02:20:161011 enabled_ciphers_vector.push_back(id);
1012 }
1013
bnc1f295372015-10-21 23:24:221014 NextProtoVector alpn_protos = ssl_config_.alpn_protos;
bncf76254d622015-09-29 00:03:441015 if (!HasCipherAdequateForHTTP2(enabled_ciphers_vector) ||
1016 !IsTLSVersionAdequateForHTTP2(ssl_config_)) {
bnc1f295372015-10-21 23:24:221017 DisableHTTP2(&alpn_protos);
bncf76254d622015-09-29 00:03:441018 }
bnc1f295372015-10-21 23:24:221019 std::vector<uint8_t> wire_protos = SerializeNextProtos(alpn_protos);
[email protected]abc44b752014-07-30 03:52:151020 SSL_set_alpn_protos(ssl_, wire_protos.empty() ? NULL : &wire_protos[0],
1021 wire_protos.size());
1022 }
1023
bnc2d6bd0f2015-10-28 01:52:051024 if (ssl_config_.npn_protos.empty())
1025 SSL_set_options(ssl_, SSL_OP_DISABLE_NPN);
1026
davidbeneb5f8ef32014-09-04 14:14:321027 if (ssl_config_.signed_cert_timestamps_enabled) {
1028 SSL_enable_signed_cert_timestamps(ssl_);
1029 SSL_enable_ocsp_stapling(ssl_);
1030 }
1031
davidben15f57132015-04-27 18:08:361032 if (cert_verifier_->SupportsOCSPStapling())
davidbend1fb2f12014-11-08 02:51:001033 SSL_enable_ocsp_stapling(ssl_);
davidbeneb5f8ef32014-09-04 14:14:321034
[email protected]c8a80e92014-05-17 16:02:081035 return OK;
[email protected]d518cd92010-09-29 12:27:441036}
1037
svaldeze83af292016-04-26 14:33:371038void SSLClientSocketImpl::DoReadCallback(int rv) {
[email protected]b9b651f2013-11-09 04:32:221039 // Since Run may result in Read being called, clear |user_read_callback_|
1040 // up front.
[email protected]0dc88b32014-03-26 20:12:281041 if (rv > 0)
1042 was_ever_used_ = true;
[email protected]b9b651f2013-11-09 04:32:221043 user_read_buf_ = NULL;
1044 user_read_buf_len_ = 0;
1045 base::ResetAndReturn(&user_read_callback_).Run(rv);
1046}
1047
svaldeze83af292016-04-26 14:33:371048void SSLClientSocketImpl::DoWriteCallback(int rv) {
[email protected]b9b651f2013-11-09 04:32:221049 // Since Run may result in Write being called, clear |user_write_callback_|
1050 // up front.
[email protected]0dc88b32014-03-26 20:12:281051 if (rv > 0)
1052 was_ever_used_ = true;
[email protected]b9b651f2013-11-09 04:32:221053 user_write_buf_ = NULL;
1054 user_write_buf_len_ = 0;
1055 base::ResetAndReturn(&user_write_callback_).Run(rv);
1056}
1057
svaldeze83af292016-04-26 14:33:371058bool SSLClientSocketImpl::DoTransportIO() {
[email protected]b9b651f2013-11-09 04:32:221059 bool network_moved = false;
1060 int rv;
1061 // Read and write as much data as possible. The loop is necessary because
1062 // Write() may return synchronously.
1063 do {
1064 rv = BufferSend();
1065 if (rv != ERR_IO_PENDING && rv != 0)
1066 network_moved = true;
1067 } while (rv > 0);
[email protected]5aea79182014-07-14 20:43:411068 if (transport_read_error_ == OK && BufferRecv() != ERR_IO_PENDING)
[email protected]b9b651f2013-11-09 04:32:221069 network_moved = true;
1070 return network_moved;
1071}
1072
pkasting379234c2015-04-08 04:42:121073// TODO(cbentzel): Remove including "base/threading/thread_local.h" and
vadimt6b43dec22015-01-06 01:59:581074// g_first_run_completed once crbug.com/424386 is fixed.
1075base::LazyInstance<base::ThreadLocalBoolean>::Leaky g_first_run_completed =
1076 LAZY_INSTANCE_INITIALIZER;
1077
svaldeze83af292016-04-26 14:33:371078int SSLClientSocketImpl::DoHandshake() {
[email protected]b9b651f2013-11-09 04:32:221079 crypto::OpenSSLErrStackTracer err_tracer(FROM_HERE);
vadimt5a243282014-12-24 00:26:161080
1081 int rv;
1082
pkasting379234c2015-04-08 04:42:121083 // TODO(cbentzel): Leave only 1 call to SSL_do_handshake once crbug.com/424386
vadimt5a243282014-12-24 00:26:161084 // is fixed.
1085 if (ssl_config_.send_client_cert && ssl_config_.client_cert.get()) {
vadimt5a243282014-12-24 00:26:161086 rv = SSL_do_handshake(ssl_);
1087 } else {
vadimt6b43dec22015-01-06 01:59:581088 if (g_first_run_completed.Get().Get()) {
pkasting379234c2015-04-08 04:42:121089 // TODO(cbentzel): Remove ScopedTracker below once crbug.com/424386 is
vadimt6b43dec22015-01-06 01:59:581090 // fixed.
pkasting379234c2015-04-08 04:42:121091 tracked_objects::ScopedTracker tracking_profile(
1092 FROM_HERE_WITH_EXPLICIT_FUNCTION("424386 SSL_do_handshake()"));
vadimt5a243282014-12-24 00:26:161093
vadimt6b43dec22015-01-06 01:59:581094 rv = SSL_do_handshake(ssl_);
1095 } else {
1096 g_first_run_completed.Get().Set(true);
vadimt6b43dec22015-01-06 01:59:581097 rv = SSL_do_handshake(ssl_);
1098 }
vadimt5a243282014-12-24 00:26:161099 }
[email protected]b9b651f2013-11-09 04:32:221100
davidbenc4212c02015-05-12 22:30:181101 int net_error = OK;
1102 if (rv <= 0) {
[email protected]b9b651f2013-11-09 04:32:221103 int ssl_error = SSL_get_error(ssl_, rv);
[email protected]b9b651f2013-11-09 04:32:221104 if (ssl_error == SSL_ERROR_WANT_CHANNEL_ID_LOOKUP) {
[email protected]faff9852014-06-21 06:13:461105 // The server supports channel ID. Stop to look one up before returning to
1106 // the handshake.
[email protected]faff9852014-06-21 06:13:461107 GotoState(STATE_CHANNEL_ID_LOOKUP);
1108 return OK;
[email protected]b9b651f2013-11-09 04:32:221109 }
davidbenced4aa9b2015-05-12 21:22:351110 if (ssl_error == SSL_ERROR_WANT_X509_LOOKUP &&
1111 !ssl_config_.send_client_cert) {
1112 return ERR_SSL_CLIENT_AUTH_CERT_NEEDED;
1113 }
davidben1d489522015-07-01 18:48:461114 if (ssl_error == SSL_ERROR_WANT_PRIVATE_KEY_OPERATION) {
svaldez7872fd02015-11-19 21:10:541115 DCHECK(ssl_config_.client_private_key);
davidben1d489522015-07-01 18:48:461116 DCHECK_NE(kNoPendingResult, signature_result_);
1117 GotoState(STATE_HANDSHAKE);
1118 return ERR_IO_PENDING;
1119 }
[email protected]b9b651f2013-11-09 04:32:221120
davidbena4409c62014-08-27 17:05:511121 OpenSSLErrorInfo error_info;
1122 net_error = MapOpenSSLErrorWithDetails(ssl_error, err_tracer, &error_info);
[email protected]b9b651f2013-11-09 04:32:221123 if (net_error == ERR_IO_PENDING) {
davidbenc4212c02015-05-12 22:30:181124 // If not done, stay in this state
[email protected]b9b651f2013-11-09 04:32:221125 GotoState(STATE_HANDSHAKE);
davidbenc4212c02015-05-12 22:30:181126 return ERR_IO_PENDING;
1127 }
1128
1129 LOG(ERROR) << "handshake failed; returned " << rv << ", SSL error code "
1130 << ssl_error << ", net_error " << net_error;
1131 net_log_.AddEvent(
1132 NetLog::TYPE_SSL_HANDSHAKE_ERROR,
1133 CreateNetLogOpenSSLErrorCallback(net_error, ssl_error, error_info));
davidbenf2eaaf92015-05-15 22:18:421134
1135 // Classify the handshake failure. This is used to determine causes of the
1136 // TLS version fallback.
1137
1138 // |cipher| is the current outgoing cipher suite, so it is non-null iff
1139 // ChangeCipherSpec was sent.
1140 const SSL_CIPHER* cipher = SSL_get_current_cipher(ssl_);
1141 if (SSL_get_state(ssl_) == SSL3_ST_CR_SRVR_HELLO_A) {
1142 ssl_failure_state_ = SSL_FAILURE_CLIENT_HELLO;
1143 } else if (cipher && (SSL_CIPHER_get_id(cipher) ==
1144 TLS1_CK_DHE_RSA_WITH_AES_128_GCM_SHA256 ||
1145 SSL_CIPHER_get_id(cipher) ==
1146 TLS1_CK_RSA_WITH_AES_128_GCM_SHA256)) {
1147 ssl_failure_state_ = SSL_FAILURE_BUGGY_GCM;
1148 } else if (cipher && ssl_config_.send_client_cert) {
1149 ssl_failure_state_ = SSL_FAILURE_CLIENT_AUTH;
1150 } else if (ERR_GET_LIB(error_info.error_code) == ERR_LIB_SSL &&
1151 ERR_GET_REASON(error_info.error_code) ==
1152 SSL_R_OLD_SESSION_VERSION_NOT_RETURNED) {
1153 ssl_failure_state_ = SSL_FAILURE_SESSION_MISMATCH;
1154 } else if (cipher && npn_status_ != kNextProtoUnsupported) {
1155 ssl_failure_state_ = SSL_FAILURE_NEXT_PROTO;
1156 } else {
1157 ssl_failure_state_ = SSL_FAILURE_UNKNOWN;
1158 }
davidbenc4212c02015-05-12 22:30:181159 }
1160
1161 GotoState(STATE_HANDSHAKE_COMPLETE);
1162 return net_error;
1163}
1164
svaldeze83af292016-04-26 14:33:371165int SSLClientSocketImpl::DoHandshakeComplete(int result) {
davidbenc4212c02015-05-12 22:30:181166 if (result < 0)
1167 return result;
1168
1169 if (ssl_config_.version_fallback &&
1170 ssl_config_.version_max < ssl_config_.version_fallback_min) {
1171 return ERR_SSL_FALLBACK_BEYOND_MINIMUM_VERSION;
1172 }
1173
nharper736ceda2015-11-07 00:16:591174 // Check that if token binding was negotiated, then extended master secret
1175 // must also be negotiated.
1176 if (tb_was_negotiated_ && !SSL_get_extms_support(ssl_))
1177 return ERR_SSL_PROTOCOL_ERROR;
1178
davidbenc4212c02015-05-12 22:30:181179 // SSL handshake is completed. If NPN wasn't negotiated, see if ALPN was.
1180 if (npn_status_ == kNextProtoUnsupported) {
1181 const uint8_t* alpn_proto = NULL;
1182 unsigned alpn_len = 0;
1183 SSL_get0_alpn_selected(ssl_, &alpn_proto, &alpn_len);
1184 if (alpn_len > 0) {
1185 npn_proto_.assign(reinterpret_cast<const char*>(alpn_proto), alpn_len);
1186 npn_status_ = kNextProtoNegotiated;
1187 set_negotiation_extension(kExtensionALPN);
[email protected]b9b651f2013-11-09 04:32:221188 }
1189 }
davidbenc4212c02015-05-12 22:30:181190
1191 RecordNegotiationExtension();
1192 RecordChannelIDSupport(channel_id_service_, channel_id_sent_,
davidben24bb5a42015-10-15 22:13:221193 ssl_config_.channel_id_enabled);
davidbenc4212c02015-05-12 22:30:181194
1195 // Only record OCSP histograms if OCSP was requested.
1196 if (ssl_config_.signed_cert_timestamps_enabled ||
1197 cert_verifier_->SupportsOCSPStapling()) {
1198 const uint8_t* ocsp_response;
1199 size_t ocsp_response_len;
1200 SSL_get0_ocsp_response(ssl_, &ocsp_response, &ocsp_response_len);
1201
1202 set_stapled_ocsp_response_received(ocsp_response_len != 0);
1203 UMA_HISTOGRAM_BOOLEAN("Net.OCSPResponseStapled", ocsp_response_len != 0);
1204 }
1205
1206 const uint8_t* sct_list;
1207 size_t sct_list_len;
1208 SSL_get0_signed_cert_timestamp_list(ssl_, &sct_list, &sct_list_len);
1209 set_signed_cert_timestamps_received(sct_list_len != 0);
1210
1211 if (IsRenegotiationAllowed())
davidben0635886ab2015-11-04 19:24:041212 SSL_set_renegotiate_mode(ssl_, ssl_renegotiate_freely);
davidbenc4212c02015-05-12 22:30:181213
davidben4fe4f982015-11-11 22:00:121214 uint8_t server_key_exchange_hash = SSL_get_server_key_exchange_hash(ssl_);
1215 if (server_key_exchange_hash != TLSEXT_hash_none) {
1216 UMA_HISTOGRAM_SPARSE_SLOWLY("Net.SSLServerKeyExchangeHash",
1217 server_key_exchange_hash);
1218 }
1219
davidbenc4212c02015-05-12 22:30:181220 // Verify the certificate.
1221 UpdateServerCert();
1222 GotoState(STATE_VERIFY_CERT);
1223 return OK;
[email protected]b9b651f2013-11-09 04:32:221224}
1225
svaldeze83af292016-04-26 14:33:371226int SSLClientSocketImpl::DoChannelIDLookup() {
nharper49b27d992016-02-09 18:28:511227 NetLog::ParametersCallback callback = base::Bind(
1228 &NetLogChannelIDLookupCallback, base::Unretained(channel_id_service_));
1229 net_log_.BeginEvent(NetLog::TYPE_SSL_GET_CHANNEL_ID, callback);
[email protected]faff9852014-06-21 06:13:461230 GotoState(STATE_CHANNEL_ID_LOOKUP_COMPLETE);
[email protected]6b8a3c742014-07-25 00:25:351231 return channel_id_service_->GetOrCreateChannelID(
nharper2e171cf2015-06-01 20:29:231232 host_and_port_.host(), &channel_id_key_,
svaldeze83af292016-04-26 14:33:371233 base::Bind(&SSLClientSocketImpl::OnHandshakeIOComplete,
[email protected]faff9852014-06-21 06:13:461234 base::Unretained(this)),
nharper75ade892015-06-10 19:05:351235 &channel_id_request_);
[email protected]faff9852014-06-21 06:13:461236}
1237
svaldeze83af292016-04-26 14:33:371238int SSLClientSocketImpl::DoChannelIDLookupComplete(int result) {
nharper49b27d992016-02-09 18:28:511239 net_log_.EndEvent(NetLog::TYPE_SSL_GET_CHANNEL_ID,
1240 base::Bind(&NetLogChannelIDLookupCompleteCallback,
1241 channel_id_key_.get(), result));
[email protected]faff9852014-06-21 06:13:461242 if (result < 0)
1243 return result;
1244
[email protected]faff9852014-06-21 06:13:461245 // Hand the key to OpenSSL. Check for error in case OpenSSL rejects the key
1246 // type.
davidben8a208fc2016-01-22 17:08:081247 DCHECK(channel_id_key_);
[email protected]faff9852014-06-21 06:13:461248 crypto::OpenSSLErrStackTracer err_tracer(FROM_HERE);
nharper2e171cf2015-06-01 20:29:231249 int rv = SSL_set1_tls_channel_id(ssl_, channel_id_key_->key());
[email protected]faff9852014-06-21 06:13:461250 if (!rv) {
1251 LOG(ERROR) << "Failed to set Channel ID.";
1252 int err = SSL_get_error(ssl_, rv);
1253 return MapOpenSSLError(err, err_tracer);
1254 }
1255
1256 // Return to the handshake.
davidben52053b382015-04-27 19:22:291257 channel_id_sent_ = true;
[email protected]faff9852014-06-21 06:13:461258 GotoState(STATE_HANDSHAKE);
1259 return OK;
1260}
1261
svaldeze83af292016-04-26 14:33:371262int SSLClientSocketImpl::DoVerifyCert(int result) {
davidben30798ed82014-09-19 19:28:201263 DCHECK(!server_cert_chain_->empty());
davidben09c3d072014-08-25 20:33:581264 DCHECK(start_cert_verification_time_.is_null());
davidben30798ed82014-09-19 19:28:201265
[email protected]b9b651f2013-11-09 04:32:221266 GotoState(STATE_VERIFY_CERT_COMPLETE);
1267
davidbenc6435a72015-08-17 18:28:521268 // OpenSSL decoded the certificate, but the platform certificate
1269 // implementation could not. This is treated as a fatal SSL-level protocol
1270 // error rather than a certificate error. See https://crbug.com/91341.
1271 if (!server_cert_.get())
1272 return ERR_SSL_SERVER_CERT_BAD_FORMAT;
1273
davidben30798ed82014-09-19 19:28:201274 // If the certificate is bad and has been previously accepted, use
1275 // the previous status and bypass the error.
1276 base::StringPiece der_cert;
1277 if (!x509_util::GetDER(server_cert_chain_->Get(0), &der_cert)) {
1278 NOTREACHED();
1279 return ERR_CERT_INVALID;
1280 }
[email protected]b9b651f2013-11-09 04:32:221281 CertStatus cert_status;
davidben30798ed82014-09-19 19:28:201282 if (ssl_config_.IsAllowedBadCert(der_cert, &cert_status)) {
[email protected]b9b651f2013-11-09 04:32:221283 VLOG(1) << "Received an expected bad cert with status: " << cert_status;
1284 server_cert_verify_result_.Reset();
1285 server_cert_verify_result_.cert_status = cert_status;
1286 server_cert_verify_result_.verified_cert = server_cert_;
1287 return OK;
1288 }
1289
davidben15f57132015-04-27 18:08:361290 std::string ocsp_response;
1291 if (cert_verifier_->SupportsOCSPStapling()) {
1292 const uint8_t* ocsp_response_raw;
1293 size_t ocsp_response_len;
1294 SSL_get0_ocsp_response(ssl_, &ocsp_response_raw, &ocsp_response_len);
1295 ocsp_response.assign(reinterpret_cast<const char*>(ocsp_response_raw),
1296 ocsp_response_len);
1297 }
1298
davidben09c3d072014-08-25 20:33:581299 start_cert_verification_time_ = base::TimeTicks::Now();
1300
eroman7f9236a2015-05-11 21:23:431301 return cert_verifier_->Verify(
rtenneti807f9ea2015-06-24 16:26:311302 server_cert_.get(), host_and_port_.host(), ocsp_response,
1303 ssl_config_.GetCertVerifyFlags(),
[email protected]591cffcd2014-08-18 20:02:301304 // TODO(davidben): Route the CRLSet through SSLConfig so
1305 // SSLClientSocket doesn't depend on SSLConfigService.
davidben15f57132015-04-27 18:08:361306 SSLConfigService::GetCRLSet().get(), &server_cert_verify_result_,
svaldeze83af292016-04-26 14:33:371307 base::Bind(&SSLClientSocketImpl::OnHandshakeIOComplete,
[email protected]b9b651f2013-11-09 04:32:221308 base::Unretained(this)),
eroman7f9236a2015-05-11 21:23:431309 &cert_verifier_request_, net_log_);
[email protected]b9b651f2013-11-09 04:32:221310}
1311
svaldeze83af292016-04-26 14:33:371312int SSLClientSocketImpl::DoVerifyCertComplete(int result) {
eroman7f9236a2015-05-11 21:23:431313 cert_verifier_request_.reset();
[email protected]b9b651f2013-11-09 04:32:221314
davidben09c3d072014-08-25 20:33:581315 if (!start_cert_verification_time_.is_null()) {
1316 base::TimeDelta verify_time =
1317 base::TimeTicks::Now() - start_cert_verification_time_;
1318 if (result == OK) {
1319 UMA_HISTOGRAM_TIMES("Net.SSLCertVerificationTime", verify_time);
1320 } else {
1321 UMA_HISTOGRAM_TIMES("Net.SSLCertVerificationTimeError", verify_time);
1322 }
1323 }
1324
[email protected]8bd4e7a2014-08-09 14:49:171325 const CertStatus cert_status = server_cert_verify_result_.cert_status;
1326 if (transport_security_state_ &&
1327 (result == OK ||
1328 (IsCertificateError(result) && IsCertStatusMinorError(cert_status))) &&
1329 !transport_security_state_->CheckPublicKeyPins(
estark1a66df72015-07-28 15:24:001330 host_and_port_, server_cert_verify_result_.is_issued_by_known_root,
1331 server_cert_verify_result_.public_key_hashes, server_cert_.get(),
1332 server_cert_verify_result_.verified_cert.get(),
1333 TransportSecurityState::ENABLE_PIN_REPORTS, &pinning_failure_log_)) {
[email protected]8bd4e7a2014-08-09 14:49:171334 result = ERR_SSL_PINNED_KEY_NOT_IN_CERT_CHAIN;
1335 }
1336
[email protected]b9b651f2013-11-09 04:32:221337 if (result == OK) {
davidbeneb5f8ef32014-09-04 14:14:321338 // Only check Certificate Transparency if there were no other errors with
1339 // the connection.
1340 VerifyCT();
1341
davidbendafe4e52015-04-08 22:53:521342 DCHECK(!certificate_verified_);
1343 certificate_verified_ = true;
1344 MaybeCacheSession();
[email protected]b9b651f2013-11-09 04:32:221345 } else {
svaldeze83af292016-04-26 14:33:371346 DVLOG(1) << "DoVerifyCertComplete error " << ErrorToString(result) << " ("
1347 << result << ")";
[email protected]b9b651f2013-11-09 04:32:221348 }
1349
[email protected]64b5c892014-08-08 09:39:261350 completed_connect_ = true;
[email protected]b9b651f2013-11-09 04:32:221351 // Exit DoHandshakeLoop and return the result to the caller to Connect.
1352 DCHECK_EQ(STATE_NONE, next_handshake_state_);
1353 return result;
1354}
1355
svaldeze83af292016-04-26 14:33:371356void SSLClientSocketImpl::DoConnectCallback(int rv) {
[email protected]b9b651f2013-11-09 04:32:221357 if (!user_connect_callback_.is_null()) {
1358 CompletionCallback c = user_connect_callback_;
1359 user_connect_callback_.Reset();
1360 c.Run(rv > OK ? OK : rv);
1361 }
1362}
1363
svaldeze83af292016-04-26 14:33:371364void SSLClientSocketImpl::UpdateServerCert() {
[email protected]76e85392014-03-20 17:54:141365 server_cert_chain_->Reset(SSL_get_peer_cert_chain(ssl_));
[email protected]7f38da8a2014-03-17 16:44:261366 server_cert_ = server_cert_chain_->AsOSChain();
davidben30798ed82014-09-19 19:28:201367 if (server_cert_.get()) {
svaldeze83af292016-04-26 14:33:371368 net_log_.AddEvent(NetLog::TYPE_SSL_CERTIFICATES_RECEIVED,
1369 base::Bind(&NetLogX509CertificateCallback,
1370 base::Unretained(server_cert_.get())));
davidben30798ed82014-09-19 19:28:201371 }
[email protected]b9b651f2013-11-09 04:32:221372}
1373
svaldeze83af292016-04-26 14:33:371374void SSLClientSocketImpl::VerifyCT() {
davidbeneb5f8ef32014-09-04 14:14:321375 if (!cert_transparency_verifier_)
1376 return;
1377
davidben54015aa2014-12-02 22:16:231378 const uint8_t* ocsp_response_raw;
davidbeneb5f8ef32014-09-04 14:14:321379 size_t ocsp_response_len;
1380 SSL_get0_ocsp_response(ssl_, &ocsp_response_raw, &ocsp_response_len);
1381 std::string ocsp_response;
1382 if (ocsp_response_len > 0) {
1383 ocsp_response.assign(reinterpret_cast<const char*>(ocsp_response_raw),
1384 ocsp_response_len);
1385 }
1386
davidben54015aa2014-12-02 22:16:231387 const uint8_t* sct_list_raw;
davidbeneb5f8ef32014-09-04 14:14:321388 size_t sct_list_len;
1389 SSL_get0_signed_cert_timestamp_list(ssl_, &sct_list_raw, &sct_list_len);
1390 std::string sct_list;
1391 if (sct_list_len > 0)
1392 sct_list.assign(reinterpret_cast<const char*>(sct_list_raw), sct_list_len);
1393
1394 // Note that this is a completely synchronous operation: The CT Log Verifier
1395 // gets all the data it needs for SCT verification and does not do any
1396 // external communication.
eranm6571b2b2014-12-03 15:53:231397 cert_transparency_verifier_->Verify(
1398 server_cert_verify_result_.verified_cert.get(), ocsp_response, sct_list,
1399 &ct_verify_result_, net_log_);
davidbeneb5f8ef32014-09-04 14:14:321400
estark723b5eeb2016-02-18 21:01:121401 ct_verify_result_.ct_policies_applied = (policy_enforcer_ != nullptr);
1402 ct_verify_result_.ev_policy_compliance =
1403 ct::EVPolicyCompliance::EV_POLICY_DOES_NOT_APPLY;
estark0fc8d0782016-02-25 20:41:201404 if (policy_enforcer_) {
1405 if ((server_cert_verify_result_.cert_status & CERT_STATUS_IS_EV)) {
1406 scoped_refptr<ct::EVCertsWhitelist> ev_whitelist =
1407 SSLConfigService::GetEVCertsWhitelist();
1408 ct::EVPolicyCompliance ev_policy_compliance =
1409 policy_enforcer_->DoesConformToCTEVPolicy(
1410 server_cert_verify_result_.verified_cert.get(),
1411 ev_whitelist.get(), ct_verify_result_.verified_scts, net_log_);
1412 ct_verify_result_.ev_policy_compliance = ev_policy_compliance;
1413 if (ev_policy_compliance !=
1414 ct::EVPolicyCompliance::EV_POLICY_DOES_NOT_APPLY &&
1415 ev_policy_compliance !=
1416 ct::EVPolicyCompliance::EV_POLICY_COMPLIES_VIA_WHITELIST &&
1417 ev_policy_compliance !=
1418 ct::EVPolicyCompliance::EV_POLICY_COMPLIES_VIA_SCTS) {
1419 // TODO(eranm): Log via the BoundNetLog, see crbug.com/437766
1420 VLOG(1) << "EV certificate for "
1421 << server_cert_verify_result_.verified_cert->subject()
1422 .GetDisplayName()
1423 << " does not conform to CT policy, removing EV status.";
1424 server_cert_verify_result_.cert_status |=
1425 CERT_STATUS_CT_COMPLIANCE_FAILED;
1426 server_cert_verify_result_.cert_status &= ~CERT_STATUS_IS_EV;
1427 }
eranm6571b2b2014-12-03 15:53:231428 }
estark0fc8d0782016-02-25 20:41:201429 ct_verify_result_.cert_policy_compliance =
1430 policy_enforcer_->DoesConformToCertPolicy(
1431 server_cert_verify_result_.verified_cert.get(),
1432 ct_verify_result_.verified_scts, net_log_);
eranm6571b2b2014-12-03 15:53:231433 }
davidbeneb5f8ef32014-09-04 14:14:321434}
1435
svaldeze83af292016-04-26 14:33:371436void SSLClientSocketImpl::OnHandshakeIOComplete(int result) {
[email protected]b9b651f2013-11-09 04:32:221437 int rv = DoHandshakeLoop(result);
1438 if (rv != ERR_IO_PENDING) {
1439 net_log_.EndEventWithNetErrorCode(NetLog::TYPE_SSL_CONNECT, rv);
1440 DoConnectCallback(rv);
1441 }
1442}
1443
svaldeze83af292016-04-26 14:33:371444void SSLClientSocketImpl::OnSendComplete(int result) {
[email protected]b9b651f2013-11-09 04:32:221445 if (next_handshake_state_ == STATE_HANDSHAKE) {
1446 // In handshake phase.
1447 OnHandshakeIOComplete(result);
1448 return;
1449 }
1450
davidben1d489522015-07-01 18:48:461451 // During a renegotiation, a Read call may also be blocked on a transport
1452 // write, so retry both operations.
1453 PumpReadWriteEvents();
[email protected]b9b651f2013-11-09 04:32:221454}
1455
svaldeze83af292016-04-26 14:33:371456void SSLClientSocketImpl::OnRecvComplete(int result) {
1457 TRACE_EVENT0("net", "SSLClientSocketImpl::OnRecvComplete");
[email protected]b9b651f2013-11-09 04:32:221458 if (next_handshake_state_ == STATE_HANDSHAKE) {
1459 // In handshake phase.
1460 OnHandshakeIOComplete(result);
1461 return;
1462 }
1463
1464 // Network layer received some data, check if client requested to read
1465 // decrypted data.
1466 if (!user_read_buf_.get())
1467 return;
1468
davidben1b133ad2014-10-23 04:23:131469 int rv = DoReadLoop();
[email protected]b9b651f2013-11-09 04:32:221470 if (rv != ERR_IO_PENDING)
1471 DoReadCallback(rv);
1472}
1473
svaldeze83af292016-04-26 14:33:371474int SSLClientSocketImpl::DoHandshakeLoop(int last_io_result) {
1475 TRACE_EVENT0("net", "SSLClientSocketImpl::DoHandshakeLoop");
[email protected]b9b651f2013-11-09 04:32:221476 int rv = last_io_result;
1477 do {
1478 // Default to STATE_NONE for next state.
1479 // (This is a quirk carried over from the windows
1480 // implementation. It makes reading the logs a bit harder.)
1481 // State handlers can and often do call GotoState just
1482 // to stay in the current state.
1483 State state = next_handshake_state_;
1484 GotoState(STATE_NONE);
1485 switch (state) {
1486 case STATE_HANDSHAKE:
1487 rv = DoHandshake();
1488 break;
davidbenc4212c02015-05-12 22:30:181489 case STATE_HANDSHAKE_COMPLETE:
1490 rv = DoHandshakeComplete(rv);
1491 break;
[email protected]faff9852014-06-21 06:13:461492 case STATE_CHANNEL_ID_LOOKUP:
1493 DCHECK_EQ(OK, rv);
1494 rv = DoChannelIDLookup();
svaldeze83af292016-04-26 14:33:371495 break;
[email protected]faff9852014-06-21 06:13:461496 case STATE_CHANNEL_ID_LOOKUP_COMPLETE:
1497 rv = DoChannelIDLookupComplete(rv);
1498 break;
[email protected]b9b651f2013-11-09 04:32:221499 case STATE_VERIFY_CERT:
[email protected]faff9852014-06-21 06:13:461500 DCHECK_EQ(OK, rv);
[email protected]b9b651f2013-11-09 04:32:221501 rv = DoVerifyCert(rv);
svaldeze83af292016-04-26 14:33:371502 break;
[email protected]b9b651f2013-11-09 04:32:221503 case STATE_VERIFY_CERT_COMPLETE:
1504 rv = DoVerifyCertComplete(rv);
1505 break;
1506 case STATE_NONE:
1507 default:
1508 rv = ERR_UNEXPECTED;
1509 NOTREACHED() << "unexpected state" << state;
1510 break;
1511 }
1512
1513 bool network_moved = DoTransportIO();
1514 if (network_moved && next_handshake_state_ == STATE_HANDSHAKE) {
1515 // In general we exit the loop if rv is ERR_IO_PENDING. In this
1516 // special case we keep looping even if rv is ERR_IO_PENDING because
1517 // the transport IO may allow DoHandshake to make progress.
1518 rv = OK; // This causes us to stay in the loop.
1519 }
1520 } while (rv != ERR_IO_PENDING && next_handshake_state_ != STATE_NONE);
1521 return rv;
1522}
1523
svaldeze83af292016-04-26 14:33:371524int SSLClientSocketImpl::DoReadLoop() {
[email protected]b9b651f2013-11-09 04:32:221525 bool network_moved;
1526 int rv;
1527 do {
1528 rv = DoPayloadRead();
1529 network_moved = DoTransportIO();
1530 } while (rv == ERR_IO_PENDING && network_moved);
1531
1532 return rv;
1533}
1534
svaldeze83af292016-04-26 14:33:371535int SSLClientSocketImpl::DoWriteLoop() {
[email protected]b9b651f2013-11-09 04:32:221536 bool network_moved;
1537 int rv;
1538 do {
1539 rv = DoPayloadWrite();
1540 network_moved = DoTransportIO();
1541 } while (rv == ERR_IO_PENDING && network_moved);
1542
1543 return rv;
1544}
1545
svaldeze83af292016-04-26 14:33:371546int SSLClientSocketImpl::DoPayloadRead() {
[email protected]b9b651f2013-11-09 04:32:221547 crypto::OpenSSLErrStackTracer err_tracer(FROM_HERE);
1548
davidben7e555daf2015-03-25 17:03:291549 DCHECK_LT(0, user_read_buf_len_);
1550 DCHECK(user_read_buf_.get());
1551
[email protected]b9b651f2013-11-09 04:32:221552 int rv;
davidben1d489522015-07-01 18:48:461553 if (pending_read_error_ != kNoPendingResult) {
[email protected]b9b651f2013-11-09 04:32:221554 rv = pending_read_error_;
davidben1d489522015-07-01 18:48:461555 pending_read_error_ = kNoPendingResult;
[email protected]b9b651f2013-11-09 04:32:221556 if (rv == 0) {
svaldeze83af292016-04-26 14:33:371557 net_log_.AddByteTransferEvent(NetLog::TYPE_SSL_SOCKET_BYTES_RECEIVED, rv,
1558 user_read_buf_->data());
davidbenb8c23212014-10-28 00:12:161559 } else {
1560 net_log_.AddEvent(
1561 NetLog::TYPE_SSL_READ_ERROR,
1562 CreateNetLogOpenSSLErrorCallback(rv, pending_read_ssl_error_,
1563 pending_read_error_info_));
[email protected]b9b651f2013-11-09 04:32:221564 }
davidbenb8c23212014-10-28 00:12:161565 pending_read_ssl_error_ = SSL_ERROR_NONE;
1566 pending_read_error_info_ = OpenSSLErrorInfo();
[email protected]b9b651f2013-11-09 04:32:221567 return rv;
1568 }
1569
1570 int total_bytes_read = 0;
davidben7e555daf2015-03-25 17:03:291571 int ssl_ret;
[email protected]b9b651f2013-11-09 04:32:221572 do {
davidben7e555daf2015-03-25 17:03:291573 ssl_ret = SSL_read(ssl_, user_read_buf_->data() + total_bytes_read,
1574 user_read_buf_len_ - total_bytes_read);
1575 if (ssl_ret > 0)
1576 total_bytes_read += ssl_ret;
1577 } while (total_bytes_read < user_read_buf_len_ && ssl_ret > 0);
[email protected]b9b651f2013-11-09 04:32:221578
davidben7e555daf2015-03-25 17:03:291579 // Although only the final SSL_read call may have failed, the failure needs to
1580 // processed immediately, while the information still available in OpenSSL's
1581 // error queue.
davidbenced4aa9b2015-05-12 21:22:351582 if (ssl_ret <= 0) {
davidben7e555daf2015-03-25 17:03:291583 // A zero return from SSL_read may mean any of:
1584 // - The underlying BIO_read returned 0.
1585 // - The peer sent a close_notify.
1586 // - Any arbitrary error. https://crbug.com/466303
[email protected]b9b651f2013-11-09 04:32:221587 //
davidben7e555daf2015-03-25 17:03:291588 // TransportReadComplete converts the first to an ERR_CONNECTION_CLOSED
1589 // error, so it does not occur. The second and third are distinguished by
1590 // SSL_ERROR_ZERO_RETURN.
1591 pending_read_ssl_error_ = SSL_get_error(ssl_, ssl_ret);
1592 if (pending_read_ssl_error_ == SSL_ERROR_ZERO_RETURN) {
1593 pending_read_error_ = 0;
davidbenced4aa9b2015-05-12 21:22:351594 } else if (pending_read_ssl_error_ == SSL_ERROR_WANT_X509_LOOKUP &&
1595 !ssl_config_.send_client_cert) {
1596 pending_read_error_ = ERR_SSL_CLIENT_AUTH_CERT_NEEDED;
davidben1d489522015-07-01 18:48:461597 } else if (pending_read_ssl_error_ ==
1598 SSL_ERROR_WANT_PRIVATE_KEY_OPERATION) {
svaldez7872fd02015-11-19 21:10:541599 DCHECK(ssl_config_.client_private_key);
davidben1d489522015-07-01 18:48:461600 DCHECK_NE(kNoPendingResult, signature_result_);
1601 pending_read_error_ = ERR_IO_PENDING;
davidben7e555daf2015-03-25 17:03:291602 } else {
1603 pending_read_error_ = MapOpenSSLErrorWithDetails(
1604 pending_read_ssl_error_, err_tracer, &pending_read_error_info_);
[email protected]b9b651f2013-11-09 04:32:221605 }
1606
davidben7e555daf2015-03-25 17:03:291607 // Many servers do not reliably send a close_notify alert when shutting down
1608 // a connection, and instead terminate the TCP connection. This is reported
1609 // as ERR_CONNECTION_CLOSED. Because of this, map the unclean shutdown to a
1610 // graceful EOF, instead of treating it as an error as it should be.
1611 if (pending_read_error_ == ERR_CONNECTION_CLOSED)
1612 pending_read_error_ = 0;
1613 }
davidbenbe6ce7ec2014-10-20 19:15:561614
davidben7e555daf2015-03-25 17:03:291615 if (total_bytes_read > 0) {
1616 // Return any bytes read to the caller. The error will be deferred to the
1617 // next call of DoPayloadRead.
1618 rv = total_bytes_read;
davidbenbe6ce7ec2014-10-20 19:15:561619
davidben7e555daf2015-03-25 17:03:291620 // Do not treat insufficient data as an error to return in the next call to
1621 // DoPayloadRead() - instead, let the call fall through to check SSL_read()
1622 // again. This is because DoTransportIO() may complete in between the next
1623 // call to DoPayloadRead(), and thus it is important to check SSL_read() on
1624 // subsequent invocations to see if a complete record may now be read.
1625 if (pending_read_error_ == ERR_IO_PENDING)
davidben1d489522015-07-01 18:48:461626 pending_read_error_ = kNoPendingResult;
davidben7e555daf2015-03-25 17:03:291627 } else {
1628 // No bytes were returned. Return the pending read error immediately.
davidben1d489522015-07-01 18:48:461629 DCHECK_NE(kNoPendingResult, pending_read_error_);
davidben7e555daf2015-03-25 17:03:291630 rv = pending_read_error_;
davidben1d489522015-07-01 18:48:461631 pending_read_error_ = kNoPendingResult;
[email protected]b9b651f2013-11-09 04:32:221632 }
1633
1634 if (rv >= 0) {
1635 net_log_.AddByteTransferEvent(NetLog::TYPE_SSL_SOCKET_BYTES_RECEIVED, rv,
1636 user_read_buf_->data());
davidbenb8c23212014-10-28 00:12:161637 } else if (rv != ERR_IO_PENDING) {
1638 net_log_.AddEvent(
1639 NetLog::TYPE_SSL_READ_ERROR,
1640 CreateNetLogOpenSSLErrorCallback(rv, pending_read_ssl_error_,
1641 pending_read_error_info_));
1642 pending_read_ssl_error_ = SSL_ERROR_NONE;
1643 pending_read_error_info_ = OpenSSLErrorInfo();
[email protected]b9b651f2013-11-09 04:32:221644 }
1645 return rv;
1646}
1647
svaldeze83af292016-04-26 14:33:371648int SSLClientSocketImpl::DoPayloadWrite() {
[email protected]b9b651f2013-11-09 04:32:221649 crypto::OpenSSLErrStackTracer err_tracer(FROM_HERE);
1650 int rv = SSL_write(ssl_, user_write_buf_->data(), user_write_buf_len_);
rsleevif020edc2015-03-16 19:31:241651
[email protected]b9b651f2013-11-09 04:32:221652 if (rv >= 0) {
1653 net_log_.AddByteTransferEvent(NetLog::TYPE_SSL_SOCKET_BYTES_SENT, rv,
1654 user_write_buf_->data());
1655 return rv;
1656 }
1657
davidbenb8c23212014-10-28 00:12:161658 int ssl_error = SSL_get_error(ssl_, rv);
davidben1d489522015-07-01 18:48:461659 if (ssl_error == SSL_ERROR_WANT_PRIVATE_KEY_OPERATION)
1660 return ERR_IO_PENDING;
davidbenb8c23212014-10-28 00:12:161661 OpenSSLErrorInfo error_info;
svaldeze83af292016-04-26 14:33:371662 int net_error =
1663 MapOpenSSLErrorWithDetails(ssl_error, err_tracer, &error_info);
davidbenb8c23212014-10-28 00:12:161664
1665 if (net_error != ERR_IO_PENDING) {
1666 net_log_.AddEvent(
1667 NetLog::TYPE_SSL_WRITE_ERROR,
1668 CreateNetLogOpenSSLErrorCallback(net_error, ssl_error, error_info));
1669 }
1670 return net_error;
[email protected]b9b651f2013-11-09 04:32:221671}
1672
svaldeze83af292016-04-26 14:33:371673void SSLClientSocketImpl::PumpReadWriteEvents() {
davidben1d489522015-07-01 18:48:461674 int rv_read = ERR_IO_PENDING;
1675 int rv_write = ERR_IO_PENDING;
1676 bool network_moved;
1677 do {
1678 if (user_read_buf_.get())
1679 rv_read = DoPayloadRead();
1680 if (user_write_buf_.get())
1681 rv_write = DoPayloadWrite();
1682 network_moved = DoTransportIO();
1683 } while (rv_read == ERR_IO_PENDING && rv_write == ERR_IO_PENDING &&
1684 (user_read_buf_.get() || user_write_buf_.get()) && network_moved);
1685
1686 // Performing the Read callback may cause |this| to be deleted. If this
1687 // happens, the Write callback should not be invoked. Guard against this by
1688 // holding a WeakPtr to |this| and ensuring it's still valid.
svaldeze83af292016-04-26 14:33:371689 base::WeakPtr<SSLClientSocketImpl> guard(weak_factory_.GetWeakPtr());
davidben1d489522015-07-01 18:48:461690 if (user_read_buf_.get() && rv_read != ERR_IO_PENDING)
1691 DoReadCallback(rv_read);
1692
1693 if (!guard.get())
1694 return;
1695
1696 if (user_write_buf_.get() && rv_write != ERR_IO_PENDING)
1697 DoWriteCallback(rv_write);
1698}
1699
svaldeze83af292016-04-26 14:33:371700int SSLClientSocketImpl::BufferSend(void) {
[email protected]b9b651f2013-11-09 04:32:221701 if (transport_send_busy_)
1702 return ERR_IO_PENDING;
1703
haavardm2d92e722014-12-19 13:45:441704 size_t buffer_read_offset;
1705 uint8_t* read_buf;
1706 size_t max_read;
1707 int status = BIO_zero_copy_get_read_buf(transport_bio_, &read_buf,
1708 &buffer_read_offset, &max_read);
1709 DCHECK_EQ(status, 1); // Should never fail.
1710 if (!max_read)
1711 return 0; // Nothing pending in the OpenSSL write BIO.
1712 CHECK_EQ(read_buf, reinterpret_cast<uint8_t*>(send_buffer_->StartOfBuffer()));
1713 CHECK_LT(buffer_read_offset, static_cast<size_t>(send_buffer_->capacity()));
1714 send_buffer_->set_offset(buffer_read_offset);
[email protected]b9b651f2013-11-09 04:32:221715
1716 int rv = transport_->socket()->Write(
haavardm2d92e722014-12-19 13:45:441717 send_buffer_.get(), max_read,
svaldeze83af292016-04-26 14:33:371718 base::Bind(&SSLClientSocketImpl::BufferSendComplete,
[email protected]b9b651f2013-11-09 04:32:221719 base::Unretained(this)));
1720 if (rv == ERR_IO_PENDING) {
1721 transport_send_busy_ = true;
1722 } else {
1723 TransportWriteComplete(rv);
1724 }
1725 return rv;
1726}
1727
svaldeze83af292016-04-26 14:33:371728int SSLClientSocketImpl::BufferRecv(void) {
[email protected]b9b651f2013-11-09 04:32:221729 if (transport_recv_busy_)
1730 return ERR_IO_PENDING;
1731
1732 // Determine how much was requested from |transport_bio_| that was not
1733 // actually available.
1734 size_t requested = BIO_ctrl_get_read_request(transport_bio_);
1735 if (requested == 0) {
1736 // This is not a perfect match of error codes, as no operation is
1737 // actually pending. However, returning 0 would be interpreted as
1738 // a possible sign of EOF, which is also an inappropriate match.
1739 return ERR_IO_PENDING;
1740 }
1741
1742 // Known Issue: While only reading |requested| data is the more correct
1743 // implementation, it has the downside of resulting in frequent reads:
1744 // One read for the SSL record header (~5 bytes) and one read for the SSL
1745 // record body. Rather than issuing these reads to the underlying socket
1746 // (and constantly allocating new IOBuffers), a single Read() request to
1747 // fill |transport_bio_| is issued. As long as an SSL client socket cannot
1748 // be gracefully shutdown (via SSL close alerts) and re-used for non-SSL
1749 // traffic, this over-subscribed Read()ing will not cause issues.
haavardm2d92e722014-12-19 13:45:441750
1751 size_t buffer_write_offset;
1752 uint8_t* write_buf;
1753 size_t max_write;
1754 int status = BIO_zero_copy_get_write_buf(transport_bio_, &write_buf,
1755 &buffer_write_offset, &max_write);
1756 DCHECK_EQ(status, 1); // Should never fail.
[email protected]b9b651f2013-11-09 04:32:221757 if (!max_write)
1758 return ERR_IO_PENDING;
1759
haavardm2d92e722014-12-19 13:45:441760 CHECK_EQ(write_buf,
1761 reinterpret_cast<uint8_t*>(recv_buffer_->StartOfBuffer()));
1762 CHECK_LT(buffer_write_offset, static_cast<size_t>(recv_buffer_->capacity()));
1763
1764 recv_buffer_->set_offset(buffer_write_offset);
[email protected]b9b651f2013-11-09 04:32:221765 int rv = transport_->socket()->Read(
svaldeze83af292016-04-26 14:33:371766 recv_buffer_.get(), max_write,
1767 base::Bind(&SSLClientSocketImpl::BufferRecvComplete,
[email protected]b9b651f2013-11-09 04:32:221768 base::Unretained(this)));
1769 if (rv == ERR_IO_PENDING) {
1770 transport_recv_busy_ = true;
1771 } else {
[email protected]3e5c6922014-02-06 02:42:161772 rv = TransportReadComplete(rv);
[email protected]b9b651f2013-11-09 04:32:221773 }
1774 return rv;
1775}
1776
svaldeze83af292016-04-26 14:33:371777void SSLClientSocketImpl::BufferSendComplete(int result) {
[email protected]b9b651f2013-11-09 04:32:221778 TransportWriteComplete(result);
1779 OnSendComplete(result);
1780}
1781
svaldeze83af292016-04-26 14:33:371782void SSLClientSocketImpl::BufferRecvComplete(int result) {
[email protected]3e5c6922014-02-06 02:42:161783 result = TransportReadComplete(result);
[email protected]b9b651f2013-11-09 04:32:221784 OnRecvComplete(result);
1785}
1786
svaldeze83af292016-04-26 14:33:371787void SSLClientSocketImpl::TransportWriteComplete(int result) {
[email protected]b9b651f2013-11-09 04:32:221788 DCHECK(ERR_IO_PENDING != result);
haavardm2d92e722014-12-19 13:45:441789 int bytes_written = 0;
[email protected]b9b651f2013-11-09 04:32:221790 if (result < 0) {
[email protected]5aea79182014-07-14 20:43:411791 // Record the error. Save it to be reported in a future read or write on
1792 // transport_bio_'s peer.
[email protected]3e5c6922014-02-06 02:42:161793 transport_write_error_ = result;
[email protected]b9b651f2013-11-09 04:32:221794 } else {
haavardm2d92e722014-12-19 13:45:441795 bytes_written = result;
[email protected]b9b651f2013-11-09 04:32:221796 }
haavardm2d92e722014-12-19 13:45:441797 DCHECK_GE(send_buffer_->RemainingCapacity(), bytes_written);
1798 int ret = BIO_zero_copy_get_read_buf_done(transport_bio_, bytes_written);
1799 DCHECK_EQ(1, ret);
1800 transport_send_busy_ = false;
[email protected]b9b651f2013-11-09 04:32:221801}
1802
svaldeze83af292016-04-26 14:33:371803int SSLClientSocketImpl::TransportReadComplete(int result) {
[email protected]b9b651f2013-11-09 04:32:221804 DCHECK(ERR_IO_PENDING != result);
[email protected]5aea79182014-07-14 20:43:411805 // If an EOF, canonicalize to ERR_CONNECTION_CLOSED here so MapOpenSSLError
1806 // does not report success.
1807 if (result == 0)
1808 result = ERR_CONNECTION_CLOSED;
haavardm2d92e722014-12-19 13:45:441809 int bytes_read = 0;
[email protected]5aea79182014-07-14 20:43:411810 if (result < 0) {
[email protected]b9b651f2013-11-09 04:32:221811 DVLOG(1) << "TransportReadComplete result " << result;
[email protected]5aea79182014-07-14 20:43:411812 // Received an error. Save it to be reported in a future read on
1813 // transport_bio_'s peer.
1814 transport_read_error_ = result;
[email protected]b9b651f2013-11-09 04:32:221815 } else {
haavardm2d92e722014-12-19 13:45:441816 bytes_read = result;
[email protected]b9b651f2013-11-09 04:32:221817 }
haavardm2d92e722014-12-19 13:45:441818 DCHECK_GE(recv_buffer_->RemainingCapacity(), bytes_read);
1819 int ret = BIO_zero_copy_get_write_buf_done(transport_bio_, bytes_read);
1820 DCHECK_EQ(1, ret);
[email protected]b9b651f2013-11-09 04:32:221821 transport_recv_busy_ = false;
[email protected]3e5c6922014-02-06 02:42:161822 return result;
[email protected]b9b651f2013-11-09 04:32:221823}
1824
svaldeze83af292016-04-26 14:33:371825int SSLClientSocketImpl::ClientCertRequestCallback(SSL* ssl) {
[email protected]5ac981e182010-12-06 17:56:271826 DVLOG(3) << "OpenSSL ClientCertRequestCallback called";
1827 DCHECK(ssl == ssl_);
[email protected]82c59022014-08-15 09:38:271828
davidbenaf42cbe2014-11-13 03:27:461829 net_log_.AddEvent(NetLog::TYPE_SSL_CLIENT_CERT_REQUESTED);
1830
[email protected]82c59022014-08-15 09:38:271831 // Clear any currently configured certificates.
1832 SSL_certs_clear(ssl_);
[email protected]97a854f2014-07-29 07:51:361833
1834#if defined(OS_IOS)
1835 // TODO(droger): Support client auth on iOS. See http://crbug.com/145954).
1836 LOG(WARNING) << "Client auth is not supported";
svaldeze83af292016-04-26 14:33:371837#else // !defined(OS_IOS)
[email protected]5ac981e182010-12-06 17:56:271838 if (!ssl_config_.send_client_cert) {
[email protected]515adc22013-01-09 16:01:231839 // First pass: we know that a client certificate is needed, but we do not
1840 // have one at hand.
svaldeze83af292016-04-26 14:33:371841 STACK_OF(X509_NAME)* authorities = SSL_get_client_CA_list(ssl);
[email protected]edfd0f42014-07-22 18:20:371842 for (size_t i = 0; i < sk_X509_NAME_num(authorities); i++) {
svaldeze83af292016-04-26 14:33:371843 X509_NAME* ca_name = (X509_NAME*)sk_X509_NAME_value(authorities, i);
[email protected]515adc22013-01-09 16:01:231844 unsigned char* str = NULL;
1845 int length = i2d_X509_NAME(ca_name, &str);
1846 cert_authorities_.push_back(std::string(
svaldeze83af292016-04-26 14:33:371847 reinterpret_cast<const char*>(str), static_cast<size_t>(length)));
[email protected]515adc22013-01-09 16:01:231848 OPENSSL_free(str);
1849 }
1850
[email protected]c0787702014-05-20 21:51:441851 const unsigned char* client_cert_types;
[email protected]e7e883e2014-07-25 06:03:081852 size_t num_client_cert_types =
1853 SSL_get0_certificate_types(ssl, &client_cert_types);
[email protected]c0787702014-05-20 21:51:441854 for (size_t i = 0; i < num_client_cert_types; i++) {
1855 cert_key_types_.push_back(
1856 static_cast<SSLClientCertType>(client_cert_types[i]));
1857 }
1858
davidbenced4aa9b2015-05-12 21:22:351859 // Suspends handshake. SSL_get_error will return SSL_ERROR_WANT_X509_LOOKUP.
1860 return -1;
[email protected]5ac981e182010-12-06 17:56:271861 }
1862
1863 // Second pass: a client certificate should have been selected.
[email protected]13914c92013-06-13 22:42:421864 if (ssl_config_.client_cert.get()) {
[email protected]6bad5052014-07-12 01:25:131865 ScopedX509 leaf_x509 =
1866 OSCertHandleToOpenSSL(ssl_config_.client_cert->os_cert_handle());
1867 if (!leaf_x509) {
1868 LOG(WARNING) << "Failed to import certificate";
1869 OpenSSLPutNetError(FROM_HERE, ERR_SSL_CLIENT_AUTH_CERT_BAD_FORMAT);
1870 return -1;
1871 }
1872
[email protected]82c59022014-08-15 09:38:271873 ScopedX509Stack chain = OSCertHandlesToOpenSSL(
1874 ssl_config_.client_cert->GetIntermediateCertificates());
1875 if (!chain) {
1876 LOG(WARNING) << "Failed to import intermediate certificates";
1877 OpenSSLPutNetError(FROM_HERE, ERR_SSL_CLIENT_AUTH_CERT_BAD_FORMAT);
1878 return -1;
1879 }
1880
davidben1d489522015-07-01 18:48:461881 if (!SSL_use_certificate(ssl_, leaf_x509.get()) ||
1882 !SSL_set1_chain(ssl_, chain.get())) {
1883 LOG(WARNING) << "Failed to set client certificate";
1884 return -1;
1885 }
1886
svaldez7872fd02015-11-19 21:10:541887 if (!ssl_config_.client_private_key) {
1888 // The caller supplied a null private key. Fail the handshake and surface
1889 // an appropriate error to the caller.
davidben1d489522015-07-01 18:48:461890 LOG(WARNING) << "Client cert found without private key";
1891 OpenSSLPutNetError(FROM_HERE, ERR_SSL_CLIENT_AUTH_CERT_NO_PRIVATE_KEY);
1892 return -1;
1893 }
1894
1895 SSL_set_private_key_method(ssl_, &SSLContext::kPrivateKeyMethod);
svaldezf3db006f2015-09-29 16:43:581896
1897 std::vector<SSLPrivateKey::Hash> digest_prefs =
svaldez7872fd02015-11-19 21:10:541898 ssl_config_.client_private_key->GetDigestPreferences();
svaldezf3db006f2015-09-29 16:43:581899
1900 size_t digests_len = digest_prefs.size();
1901 std::vector<int> digests;
1902 for (size_t i = 0; i < digests_len; i++) {
1903 switch (digest_prefs[i]) {
1904 case SSLPrivateKey::Hash::SHA1:
1905 digests.push_back(NID_sha1);
1906 break;
1907 case SSLPrivateKey::Hash::SHA256:
1908 digests.push_back(NID_sha256);
1909 break;
1910 case SSLPrivateKey::Hash::SHA384:
1911 digests.push_back(NID_sha384);
1912 break;
1913 case SSLPrivateKey::Hash::SHA512:
1914 digests.push_back(NID_sha512);
1915 break;
1916 case SSLPrivateKey::Hash::MD5_SHA1:
1917 // MD5-SHA1 is not used in TLS 1.2.
1918 break;
1919 }
1920 }
1921
davidben5f8b6bc2015-11-25 03:19:541922 SSL_set_private_key_digest_prefs(ssl_, digests.data(), digests.size());
davidbenaf42cbe2014-11-13 03:27:461923
1924 int cert_count = 1 + sk_X509_num(chain.get());
1925 net_log_.AddEvent(NetLog::TYPE_SSL_CLIENT_CERT_PROVIDED,
tfarina5e24b242015-10-27 13:11:281926 NetLog::IntCallback("cert_count", cert_count));
[email protected]6bad5052014-07-12 01:25:131927 return 1;
[email protected]c0787702014-05-20 21:51:441928 }
[email protected]97a854f2014-07-29 07:51:361929#endif // defined(OS_IOS)
[email protected]5ac981e182010-12-06 17:56:271930
1931 // Send no client certificate.
davidbenaf42cbe2014-11-13 03:27:461932 net_log_.AddEvent(NetLog::TYPE_SSL_CLIENT_CERT_PROVIDED,
tfarina5e24b242015-10-27 13:11:281933 NetLog::IntCallback("cert_count", 0));
[email protected]82c59022014-08-15 09:38:271934 return 1;
[email protected]5ac981e182010-12-06 17:56:271935}
1936
svaldeze83af292016-04-26 14:33:371937int SSLClientSocketImpl::CertVerifyCallback(X509_STORE_CTX* store_ctx) {
[email protected]64b5c892014-08-08 09:39:261938 if (!completed_connect_) {
[email protected]b051cdb62014-02-28 02:20:161939 // If the first handshake hasn't completed then we accept any certificates
1940 // because we verify after the handshake.
1941 return 1;
1942 }
1943
davidben30798ed82014-09-19 19:28:201944 // Disallow the server certificate to change in a renegotiation.
1945 if (server_cert_chain_->empty()) {
[email protected]76e85392014-03-20 17:54:141946 LOG(ERROR) << "Received invalid certificate chain between handshakes";
davidben30798ed82014-09-19 19:28:201947 return 0;
1948 }
1949 base::StringPiece old_der, new_der;
1950 if (store_ctx->cert == NULL ||
1951 !x509_util::GetDER(server_cert_chain_->Get(0), &old_der) ||
1952 !x509_util::GetDER(store_ctx->cert, &new_der)) {
1953 LOG(ERROR) << "Failed to encode certificates";
1954 return 0;
1955 }
1956 if (old_der != new_der) {
[email protected]76e85392014-03-20 17:54:141957 LOG(ERROR) << "Server certificate changed between handshakes";
davidben30798ed82014-09-19 19:28:201958 return 0;
1959 }
1960
1961 return 1;
[email protected]b051cdb62014-02-28 02:20:161962}
1963
[email protected]ae7c9f42011-11-21 11:41:161964// SelectNextProtoCallback is called by OpenSSL during the handshake. If the
1965// server supports NPN, selects a protocol from the list that the server
thestigc23b8ec42016-01-08 01:41:121966// provides. According to third_party/boringssl/src/ssl/ssl_lib.c, the
[email protected]ae7c9f42011-11-21 11:41:161967// callback can assume that |in| is syntactically valid.
svaldeze83af292016-04-26 14:33:371968int SSLClientSocketImpl::SelectNextProtoCallback(unsigned char** out,
1969 unsigned char* outlen,
1970 const unsigned char* in,
1971 unsigned int inlen) {
bnc1f295372015-10-21 23:24:221972 if (ssl_config_.npn_protos.empty()) {
Avi Drissman13fc8932015-12-20 04:40:461973 *out = reinterpret_cast<uint8_t*>(
[email protected]168a8412012-06-14 05:05:491974 const_cast<char*>(kDefaultSupportedNPNProtocol));
1975 *outlen = arraysize(kDefaultSupportedNPNProtocol) - 1;
1976 npn_status_ = kNextProtoUnsupported;
[email protected]ea4a1c6a2010-12-09 13:33:281977 return SSL_TLSEXT_ERR_OK;
1978 }
1979
[email protected]ae7c9f42011-11-21 11:41:161980 // Assume there's no overlap between our protocols and the server's list.
[email protected]168a8412012-06-14 05:05:491981 npn_status_ = kNextProtoNoOverlap;
[email protected]ae7c9f42011-11-21 11:41:161982
1983 // For each protocol in server preference order, see if we support it.
1984 for (unsigned int i = 0; i < inlen; i += in[i] + 1) {
bnc1f295372015-10-21 23:24:221985 for (NextProto next_proto : ssl_config_.npn_protos) {
bnc0d23cf42014-12-11 14:09:461986 const std::string proto = NextProtoToString(next_proto);
1987 if (in[i] == proto.size() &&
1988 memcmp(&in[i + 1], proto.data(), in[i]) == 0) {
[email protected]168a8412012-06-14 05:05:491989 // We found a match.
[email protected]ae7c9f42011-11-21 11:41:161990 *out = const_cast<unsigned char*>(in) + i + 1;
1991 *outlen = in[i];
[email protected]168a8412012-06-14 05:05:491992 npn_status_ = kNextProtoNegotiated;
[email protected]ae7c9f42011-11-21 11:41:161993 break;
1994 }
1995 }
[email protected]168a8412012-06-14 05:05:491996 if (npn_status_ == kNextProtoNegotiated)
[email protected]ae7c9f42011-11-21 11:41:161997 break;
1998 }
[email protected]ea4a1c6a2010-12-09 13:33:281999
bncde27dae2015-10-06 07:11:022000 // If we didn't find a protocol, we select the last one from our list.
[email protected]168a8412012-06-14 05:05:492001 if (npn_status_ == kNextProtoNoOverlap) {
bnc67da3de2015-01-15 21:02:262002 // NextProtoToString returns a pointer to a static string.
bnc1f295372015-10-21 23:24:222003 const char* proto = NextProtoToString(ssl_config_.npn_protos.back());
bnc67da3de2015-01-15 21:02:262004 *out = reinterpret_cast<unsigned char*>(const_cast<char*>(proto));
2005 *outlen = strlen(proto);
[email protected]168a8412012-06-14 05:05:492006 }
2007
[email protected]ea4a1c6a2010-12-09 13:33:282008 npn_proto_.assign(reinterpret_cast<const char*>(*out), *outlen);
[email protected]32e1dee2010-12-09 18:36:242009 DVLOG(2) << "next protocol: '" << npn_proto_ << "' status: " << npn_status_;
bnc0d28ea52014-10-13 15:15:382010 set_negotiation_extension(kExtensionNPN);
[email protected]ea4a1c6a2010-12-09 13:33:282011 return SSL_TLSEXT_ERR_OK;
2012}
2013
svaldeze83af292016-04-26 14:33:372014long SSLClientSocketImpl::MaybeReplayTransportError(BIO* bio,
2015 int cmd,
2016 const char* argp,
2017 int argi,
2018 long argl,
2019 long retvalue) {
2020 if (cmd == (BIO_CB_READ | BIO_CB_RETURN) && retvalue <= 0) {
[email protected]5aea79182014-07-14 20:43:412021 // If there is no more data in the buffer, report any pending errors that
2022 // were observed. Note that both the readbuf and the writebuf are checked
2023 // for errors, since the application may have encountered a socket error
2024 // while writing that would otherwise not be reported until the application
2025 // attempted to write again - which it may never do. See
2026 // https://crbug.com/249848.
2027 if (transport_read_error_ != OK) {
2028 OpenSSLPutNetError(FROM_HERE, transport_read_error_);
2029 return -1;
2030 }
2031 if (transport_write_error_ != OK) {
2032 OpenSSLPutNetError(FROM_HERE, transport_write_error_);
2033 return -1;
2034 }
2035 } else if (cmd == BIO_CB_WRITE) {
2036 // Because of the write buffer, this reports a failure from the previous
2037 // write payload. If the current payload fails to write, the error will be
2038 // reported in a future write or read to |bio|.
2039 if (transport_write_error_ != OK) {
2040 OpenSSLPutNetError(FROM_HERE, transport_write_error_);
2041 return -1;
2042 }
2043 }
2044 return retvalue;
2045}
2046
2047// static
svaldeze83af292016-04-26 14:33:372048long SSLClientSocketImpl::BIOCallback(BIO* bio,
2049 int cmd,
2050 const char* argp,
2051 int argi,
2052 long argl,
2053 long retvalue) {
2054 SSLClientSocketImpl* socket =
2055 reinterpret_cast<SSLClientSocketImpl*>(BIO_get_callback_arg(bio));
[email protected]5aea79182014-07-14 20:43:412056 CHECK(socket);
svaldeze83af292016-04-26 14:33:372057 return socket->MaybeReplayTransportError(bio, cmd, argp, argi, argl,
2058 retvalue);
[email protected]5aea79182014-07-14 20:43:412059}
2060
svaldeze83af292016-04-26 14:33:372061void SSLClientSocketImpl::MaybeCacheSession() {
davidben44aeae62015-06-24 20:47:432062 // Only cache the session once both a new session has been established and the
2063 // certificate has been verified. Due to False Start, these events may happen
2064 // in either order.
2065 if (!session_pending_ || !certificate_verified_)
davidbendafe4e52015-04-08 22:53:522066 return;
davidbendafe4e52015-04-08 22:53:522067
2068 SSLContext::GetInstance()->session_cache()->Insert(GetSessionCacheKey(),
2069 SSL_get_session(ssl_));
davidben44aeae62015-06-24 20:47:432070 session_pending_ = false;
davidbendafe4e52015-04-08 22:53:522071}
2072
svaldeze83af292016-04-26 14:33:372073int SSLClientSocketImpl::NewSessionCallback(SSL_SESSION* session) {
davidben44aeae62015-06-24 20:47:432074 DCHECK_EQ(session, SSL_get_session(ssl_));
davidbendafe4e52015-04-08 22:53:522075
davidben44aeae62015-06-24 20:47:432076 // Only sessions from the initial handshake get cached. Note this callback may
2077 // be signaled on abbreviated handshakes if the ticket was renewed.
2078 session_pending_ = true;
davidbendafe4e52015-04-08 22:53:522079 MaybeCacheSession();
davidben44aeae62015-06-24 20:47:432080
2081 // OpenSSL passes a reference to |session|, but the session cache does not
2082 // take this reference, so release it.
2083 SSL_SESSION_free(session);
2084 return 1;
davidbendafe4e52015-04-08 22:53:522085}
2086
svaldeze83af292016-04-26 14:33:372087void SSLClientSocketImpl::AddCTInfoToSSLInfo(SSLInfo* ssl_info) const {
estark723b5eeb2016-02-18 21:01:122088 ssl_info->UpdateCertificateTransparencyInfo(ct_verify_result_);
davidbeneb5f8ef32014-09-04 14:14:322089}
2090
svaldeze83af292016-04-26 14:33:372091std::string SSLClientSocketImpl::GetSessionCacheKey() const {
rsleevif020edc2015-03-16 19:31:242092 std::string result = host_and_port_.ToString();
2093 result.append("/");
2094 result.append(ssl_session_cache_shard_);
2095
2096 // Shard the session cache based on maximum protocol version. This causes
2097 // fallback connections to use a separate session cache.
2098 result.append("/");
2099 switch (ssl_config_.version_max) {
rsleevif020edc2015-03-16 19:31:242100 case SSL_PROTOCOL_VERSION_TLS1:
2101 result.append("tls1");
2102 break;
2103 case SSL_PROTOCOL_VERSION_TLS1_1:
2104 result.append("tls1.1");
2105 break;
2106 case SSL_PROTOCOL_VERSION_TLS1_2:
2107 result.append("tls1.2");
2108 break;
2109 default:
2110 NOTREACHED();
2111 }
2112
davidbena4c9d062015-04-03 22:34:252113 result.append("/");
davidben14b1a532015-10-30 16:01:092114 if (ssl_config_.deprecated_cipher_suites_enabled)
davidbena4c9d062015-04-03 22:34:252115 result.append("deprecated");
2116
davidbenee39de02015-10-16 19:53:182117 result.append("/");
2118 if (ssl_config_.channel_id_enabled)
2119 result.append("channelid");
2120
rsleevif020edc2015-03-16 19:31:242121 return result;
2122}
2123
svaldeze83af292016-04-26 14:33:372124bool SSLClientSocketImpl::IsRenegotiationAllowed() const {
nharper736ceda2015-11-07 00:16:592125 if (tb_was_negotiated_)
2126 return false;
2127
davidben421116c2015-05-12 19:56:512128 if (npn_status_ == kNextProtoUnsupported)
2129 return ssl_config_.renego_allowed_default;
2130
2131 NextProto next_proto = NextProtoFromString(npn_proto_);
2132 for (NextProto allowed : ssl_config_.renego_allowed_for_protos) {
2133 if (next_proto == allowed)
2134 return true;
2135 }
2136 return false;
2137}
2138
svaldeze83af292016-04-26 14:33:372139int SSLClientSocketImpl::PrivateKeyTypeCallback() {
svaldez7872fd02015-11-19 21:10:542140 switch (ssl_config_.client_private_key->GetType()) {
davidben1d489522015-07-01 18:48:462141 case SSLPrivateKey::Type::RSA:
2142 return EVP_PKEY_RSA;
2143 case SSLPrivateKey::Type::ECDSA:
2144 return EVP_PKEY_EC;
2145 }
2146 NOTREACHED();
2147 return EVP_PKEY_NONE;
2148}
2149
svaldeze83af292016-04-26 14:33:372150size_t SSLClientSocketImpl::PrivateKeyMaxSignatureLenCallback() {
svaldez7872fd02015-11-19 21:10:542151 return ssl_config_.client_private_key->GetMaxSignatureLengthInBytes();
davidben1d489522015-07-01 18:48:462152}
2153
svaldeze83af292016-04-26 14:33:372154ssl_private_key_result_t SSLClientSocketImpl::PrivateKeySignCallback(
davidben1d489522015-07-01 18:48:462155 uint8_t* out,
2156 size_t* out_len,
2157 size_t max_out,
2158 const EVP_MD* md,
2159 const uint8_t* in,
2160 size_t in_len) {
2161 DCHECK_EQ(kNoPendingResult, signature_result_);
2162 DCHECK(signature_.empty());
svaldez7872fd02015-11-19 21:10:542163 DCHECK(ssl_config_.client_private_key);
davidben1d489522015-07-01 18:48:462164
davidben1d489522015-07-01 18:48:462165 SSLPrivateKey::Hash hash;
2166 if (!EVP_MDToPrivateKeyHash(md, &hash)) {
2167 OpenSSLPutNetError(FROM_HERE, ERR_SSL_CLIENT_AUTH_SIGNATURE_FAILED);
2168 return ssl_private_key_failure;
2169 }
2170
davidben752bcf22015-12-21 22:55:502171 net_log_.BeginEvent(
2172 NetLog::TYPE_SSL_PRIVATE_KEY_OPERATION,
2173 base::Bind(&NetLogPrivateKeyOperationCallback,
2174 ssl_config_.client_private_key->GetType(), hash));
2175
davidben1d489522015-07-01 18:48:462176 signature_result_ = ERR_IO_PENDING;
svaldez7872fd02015-11-19 21:10:542177 ssl_config_.client_private_key->SignDigest(
davidben1d489522015-07-01 18:48:462178 hash, base::StringPiece(reinterpret_cast<const char*>(in), in_len),
svaldeze83af292016-04-26 14:33:372179 base::Bind(&SSLClientSocketImpl::OnPrivateKeySignComplete,
davidben1d489522015-07-01 18:48:462180 weak_factory_.GetWeakPtr()));
2181 return ssl_private_key_retry;
2182}
2183
svaldeze83af292016-04-26 14:33:372184ssl_private_key_result_t SSLClientSocketImpl::PrivateKeySignCompleteCallback(
davidben1d489522015-07-01 18:48:462185 uint8_t* out,
2186 size_t* out_len,
2187 size_t max_out) {
2188 DCHECK_NE(kNoPendingResult, signature_result_);
svaldez7872fd02015-11-19 21:10:542189 DCHECK(ssl_config_.client_private_key);
davidben1d489522015-07-01 18:48:462190
2191 if (signature_result_ == ERR_IO_PENDING)
2192 return ssl_private_key_retry;
2193 if (signature_result_ != OK) {
2194 OpenSSLPutNetError(FROM_HERE, signature_result_);
2195 return ssl_private_key_failure;
2196 }
2197 if (signature_.size() > max_out) {
2198 OpenSSLPutNetError(FROM_HERE, ERR_SSL_CLIENT_AUTH_SIGNATURE_FAILED);
2199 return ssl_private_key_failure;
2200 }
davidben5f8b6bc2015-11-25 03:19:542201 memcpy(out, signature_.data(), signature_.size());
davidben1d489522015-07-01 18:48:462202 *out_len = signature_.size();
2203 signature_.clear();
2204 return ssl_private_key_success;
2205}
2206
svaldeze83af292016-04-26 14:33:372207void SSLClientSocketImpl::OnPrivateKeySignComplete(
davidben1d489522015-07-01 18:48:462208 Error error,
2209 const std::vector<uint8_t>& signature) {
2210 DCHECK_EQ(ERR_IO_PENDING, signature_result_);
2211 DCHECK(signature_.empty());
svaldez7872fd02015-11-19 21:10:542212 DCHECK(ssl_config_.client_private_key);
davidben1d489522015-07-01 18:48:462213
2214 net_log_.EndEventWithNetErrorCode(NetLog::TYPE_SSL_PRIVATE_KEY_OPERATION,
2215 error);
2216
2217 signature_result_ = error;
2218 if (signature_result_ == OK)
2219 signature_ = signature;
2220
2221 if (next_handshake_state_ == STATE_HANDSHAKE) {
2222 OnHandshakeIOComplete(signature_result_);
2223 return;
2224 }
2225
2226 // During a renegotiation, either Read or Write calls may be blocked on an
2227 // asynchronous private key operation.
2228 PumpReadWriteEvents();
2229}
2230
svaldeze83af292016-04-26 14:33:372231int SSLClientSocketImpl::TokenBindingAdd(const uint8_t** out,
2232 size_t* out_len,
2233 int* out_alert_value) {
nharper736ceda2015-11-07 00:16:592234 if (ssl_config_.token_binding_params.empty()) {
2235 return 0;
2236 }
davidben7dad2a32016-03-01 23:47:472237 crypto::AutoCBB output;
nharper736ceda2015-11-07 00:16:592238 CBB parameters_list;
2239 if (!CBB_init(output.get(), 7) ||
2240 !CBB_add_u8(output.get(), kTbProtocolVersionMajor) ||
2241 !CBB_add_u8(output.get(), kTbProtocolVersionMinor) ||
2242 !CBB_add_u8_length_prefixed(output.get(), &parameters_list)) {
2243 *out_alert_value = SSL_AD_INTERNAL_ERROR;
2244 return -1;
2245 }
2246 for (size_t i = 0; i < ssl_config_.token_binding_params.size(); ++i) {
2247 if (!CBB_add_u8(&parameters_list, ssl_config_.token_binding_params[i])) {
2248 *out_alert_value = SSL_AD_INTERNAL_ERROR;
2249 return -1;
2250 }
2251 }
2252 // |*out| will be freed by TokenBindingFreeCallback.
2253 if (!CBB_finish(output.get(), const_cast<uint8_t**>(out), out_len)) {
2254 *out_alert_value = SSL_AD_INTERNAL_ERROR;
2255 return -1;
2256 }
2257
2258 return 1;
2259}
2260
svaldeze83af292016-04-26 14:33:372261int SSLClientSocketImpl::TokenBindingParse(const uint8_t* contents,
2262 size_t contents_len,
2263 int* out_alert_value) {
nharper736ceda2015-11-07 00:16:592264 if (completed_connect_) {
2265 // Token Binding may only be negotiated on the initial handshake.
2266 *out_alert_value = SSL_AD_ILLEGAL_PARAMETER;
2267 return 0;
2268 }
2269
2270 CBS extension;
2271 CBS_init(&extension, contents, contents_len);
2272
2273 CBS parameters_list;
2274 uint8_t version_major, version_minor, param;
2275 if (!CBS_get_u8(&extension, &version_major) ||
2276 !CBS_get_u8(&extension, &version_minor) ||
2277 !CBS_get_u8_length_prefixed(&extension, &parameters_list) ||
2278 !CBS_get_u8(&parameters_list, &param) || CBS_len(&parameters_list) > 0 ||
2279 CBS_len(&extension) > 0) {
2280 *out_alert_value = SSL_AD_DECODE_ERROR;
2281 return 0;
2282 }
2283 // The server-negotiated version must be less than or equal to our version.
2284 if (version_major > kTbProtocolVersionMajor ||
2285 (version_minor > kTbProtocolVersionMinor &&
2286 version_major == kTbProtocolVersionMajor)) {
2287 *out_alert_value = SSL_AD_ILLEGAL_PARAMETER;
2288 return 0;
2289 }
2290 // If the version the server negotiated is older than we support, don't fail
2291 // parsing the extension, but also don't set |negotiated_|.
2292 if (version_major < kTbMinProtocolVersionMajor ||
2293 (version_minor < kTbMinProtocolVersionMinor &&
2294 version_major == kTbMinProtocolVersionMajor)) {
2295 return 1;
2296 }
2297
2298 for (size_t i = 0; i < ssl_config_.token_binding_params.size(); ++i) {
2299 if (param == ssl_config_.token_binding_params[i]) {
2300 tb_negotiated_param_ = ssl_config_.token_binding_params[i];
2301 tb_was_negotiated_ = true;
2302 return 1;
2303 }
2304 }
2305
2306 *out_alert_value = SSL_AD_ILLEGAL_PARAMETER;
2307 return 0;
2308}
2309
[email protected]7e5dd49f2010-12-08 18:33:492310} // namespace net