blob: d20d81e2d12b8c4c8c29d4da2234a88d23f5d29c [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>
bnc67da3de2015-01-15 21:02:268#include <string.h>
[email protected]d518cd92010-09-29 12:27:449
davidben752bcf22015-12-21 22:55:5010#include <utility>
11
[email protected]0f7804ec2011-10-07 20:04:1812#include "base/bind.h"
[email protected]f2da6ac2013-02-04 08:22:5313#include "base/callback_helpers.h"
davidbend406cdb2016-11-17 08:31:0514#include "base/feature_list.h"
davidben1d489522015-07-01 18:48:4615#include "base/lazy_instance.h"
Avi Drissman13fc8932015-12-20 04:40:4616#include "base/macros.h"
[email protected]3b63f8f42011-03-28 01:54:1517#include "base/memory/singleton.h"
mmenke1beda3d2016-07-22 03:33:4518#include "base/metrics/field_trial.h"
asvitkinec3c93722015-06-17 14:48:3719#include "base/metrics/histogram_macros.h"
davidben4fe4f982015-11-11 22:00:1220#include "base/metrics/sparse_histogram.h"
vadimtb2a77c762014-11-21 19:49:2221#include "base/profiler/scoped_tracker.h"
nharper49b27d992016-02-09 18:28:5122#include "base/strings/string_number_conversions.h"
davidben018aad62014-09-12 02:25:1923#include "base/strings/string_piece.h"
[email protected]20305ec2011-01-21 04:55:5224#include "base/synchronization/lock.h"
vadimt6b43dec22015-01-06 01:59:5825#include "base/threading/thread_local.h"
ssid6d6b40102016-04-05 18:59:5626#include "base/trace_event/trace_event.h"
estade5e5529d2015-05-21 20:59:1127#include "base/values.h"
[email protected]ee0f2aa82013-10-25 11:59:2628#include "crypto/ec_private_key.h"
[email protected]4b559b4d2011-04-14 17:37:1429#include "crypto/openssl_util.h"
martijna2e83bd2016-03-18 13:10:4530#include "net/base/ip_address.h"
[email protected]d518cd92010-09-29 12:27:4431#include "net/base/net_errors.h"
[email protected]6e7845ae2013-03-29 21:48:1132#include "net/cert/cert_verifier.h"
eranmefbd3132014-10-28 16:35:1633#include "net/cert/ct_ev_whitelist.h"
estark6f9b3d82016-01-12 21:37:0534#include "net/cert/ct_policy_enforcer.h"
estark723b5eeb2016-02-18 21:01:1235#include "net/cert/ct_policy_status.h"
davidbeneb5f8ef32014-09-04 14:14:3236#include "net/cert/ct_verifier.h"
[email protected]6e7845ae2013-03-29 21:48:1137#include "net/cert/x509_certificate_net_log_param.h"
davidben30798ed82014-09-19 19:28:2038#include "net/cert/x509_util_openssl.h"
[email protected]8bd4e7a2014-08-09 14:49:1739#include "net/http/transport_security_state.h"
mikecironef22f9812016-10-04 03:40:1940#include "net/log/net_log.h"
mikecirone8b85c432016-09-08 19:11:0041#include "net/log/net_log_event_type.h"
mikecironef22f9812016-10-04 03:40:1942#include "net/log/net_log_parameters_callback.h"
[email protected]536fd0b2013-03-14 17:41:5743#include "net/ssl/ssl_cert_request_info.h"
davidben281d13f02016-04-27 20:43:2844#include "net/ssl/ssl_cipher_suite_names.h"
svaldeze83af292016-04-26 14:33:3745#include "net/ssl/ssl_client_session_cache.h"
[email protected]536fd0b2013-03-14 17:41:5746#include "net/ssl/ssl_connection_status_flags.h"
47#include "net/ssl/ssl_info.h"
davidben1d489522015-07-01 18:48:4648#include "net/ssl/ssl_private_key.h"
nharperd5cddca2016-02-27 03:37:5249#include "net/ssl/token_binding.h"
tfarinae8cb8aa2016-10-21 02:44:0150#include "third_party/boringssl/src/include/openssl/bio.h"
51#include "third_party/boringssl/src/include/openssl/bytestring.h"
52#include "third_party/boringssl/src/include/openssl/err.h"
53#include "third_party/boringssl/src/include/openssl/evp.h"
54#include "third_party/boringssl/src/include/openssl/mem.h"
55#include "third_party/boringssl/src/include/openssl/ssl.h"
[email protected]d518cd92010-09-29 12:27:4456
davidben2a811e4e2015-12-01 10:49:3457#if !defined(OS_NACL)
58#include "net/ssl/ssl_key_logger.h"
59#endif
60
svaldez2135be52016-04-20 16:34:5361#if defined(USE_NSS_CERTS)
davidbena477a70a2015-10-06 04:38:2962#include "net/cert_net/nss_ocsp.h"
63#endif
64
[email protected]d518cd92010-09-29 12:27:4465namespace net {
66
67namespace {
68
[email protected]4b768562013-02-16 04:10:0769// This constant can be any non-negative/non-zero value (eg: it does not
70// overlap with any value of the net::Error range, including net::OK).
davidben1d489522015-07-01 18:48:4671const int kNoPendingResult = 1;
[email protected]4b768562013-02-16 04:10:0772
haavardm2d92e722014-12-19 13:45:4473// Default size of the internal BoringSSL buffers.
mmenke1beda3d2016-07-22 03:33:4574const int kDefaultOpenSSLBufferSize = 17 * 1024;
haavardm2d92e722014-12-19 13:45:4475
nharper736ceda2015-11-07 00:16:5976// TLS extension number use for Token Binding.
nharperb5ad8a802016-02-05 19:40:0077const unsigned int kTbExtNum = 24;
nharper736ceda2015-11-07 00:16:5978
79// Token Binding ProtocolVersions supported.
80const uint8_t kTbProtocolVersionMajor = 0;
nharper78e6d2b2016-09-21 05:42:3581const uint8_t kTbProtocolVersionMinor = 10;
nharper736ceda2015-11-07 00:16:5982const uint8_t kTbMinProtocolVersionMajor = 0;
nharper78e6d2b2016-09-21 05:42:3583const uint8_t kTbMinProtocolVersionMinor = 10;
nharper736ceda2015-11-07 00:16:5984
davidben1d489522015-07-01 18:48:4685bool EVP_MDToPrivateKeyHash(const EVP_MD* md, SSLPrivateKey::Hash* hash) {
86 switch (EVP_MD_type(md)) {
87 case NID_md5_sha1:
88 *hash = SSLPrivateKey::Hash::MD5_SHA1;
89 return true;
90 case NID_sha1:
91 *hash = SSLPrivateKey::Hash::SHA1;
92 return true;
93 case NID_sha256:
94 *hash = SSLPrivateKey::Hash::SHA256;
95 return true;
96 case NID_sha384:
97 *hash = SSLPrivateKey::Hash::SHA384;
98 return true;
99 case NID_sha512:
100 *hash = SSLPrivateKey::Hash::SHA512;
101 return true;
102 default:
103 return false;
104 }
105}
106
danakj655b66c2016-04-16 00:51:38107std::unique_ptr<base::Value> NetLogPrivateKeyOperationCallback(
davidben752bcf22015-12-21 22:55:50108 SSLPrivateKey::Type type,
109 SSLPrivateKey::Hash hash,
110 NetLogCaptureMode mode) {
111 std::string type_str;
112 switch (type) {
113 case SSLPrivateKey::Type::RSA:
114 type_str = "RSA";
115 break;
davidben1c09a432016-10-13 19:17:34116 case SSLPrivateKey::Type::ECDSA_P256:
117 type_str = "ECDSA_P256";
118 break;
119 case SSLPrivateKey::Type::ECDSA_P384:
120 type_str = "ECDSA_P384";
121 break;
122 case SSLPrivateKey::Type::ECDSA_P521:
123 type_str = "ECDSA_P521";
davidben752bcf22015-12-21 22:55:50124 break;
125 }
126
127 std::string hash_str;
128 switch (hash) {
129 case SSLPrivateKey::Hash::MD5_SHA1:
130 hash_str = "MD5_SHA1";
131 break;
132 case SSLPrivateKey::Hash::SHA1:
133 hash_str = "SHA1";
134 break;
135 case SSLPrivateKey::Hash::SHA256:
136 hash_str = "SHA256";
137 break;
138 case SSLPrivateKey::Hash::SHA384:
139 hash_str = "SHA384";
140 break;
141 case SSLPrivateKey::Hash::SHA512:
142 hash_str = "SHA512";
143 break;
144 }
145
danakj655b66c2016-04-16 00:51:38146 std::unique_ptr<base::DictionaryValue> value(new base::DictionaryValue);
davidben752bcf22015-12-21 22:55:50147 value->SetString("type", type_str);
148 value->SetString("hash", hash_str);
149 return std::move(value);
150}
151
danakj655b66c2016-04-16 00:51:38152std::unique_ptr<base::Value> NetLogChannelIDLookupCallback(
nharper49b27d992016-02-09 18:28:51153 ChannelIDService* channel_id_service,
154 NetLogCaptureMode capture_mode) {
155 ChannelIDStore* store = channel_id_service->GetChannelIDStore();
danakj655b66c2016-04-16 00:51:38156 std::unique_ptr<base::DictionaryValue> dict(new base::DictionaryValue());
nharper49b27d992016-02-09 18:28:51157 dict->SetBoolean("ephemeral", store->IsEphemeral());
158 dict->SetString("service", base::HexEncode(&channel_id_service,
159 sizeof(channel_id_service)));
160 dict->SetString("store", base::HexEncode(&store, sizeof(store)));
161 return std::move(dict);
162}
163
danakj655b66c2016-04-16 00:51:38164std::unique_ptr<base::Value> NetLogChannelIDLookupCompleteCallback(
nharper49b27d992016-02-09 18:28:51165 crypto::ECPrivateKey* key,
166 int result,
167 NetLogCaptureMode capture_mode) {
danakj655b66c2016-04-16 00:51:38168 std::unique_ptr<base::DictionaryValue> dict(new base::DictionaryValue());
nharper49b27d992016-02-09 18:28:51169 dict->SetInteger("net_error", result);
170 std::string raw_key;
171 if (result == OK && key && key->ExportRawPublicKey(&raw_key)) {
172 std::string key_to_log = "redacted";
173 if (capture_mode.include_cookies_and_credentials()) {
174 key_to_log = base::HexEncode(raw_key.data(), raw_key.length());
175 }
176 dict->SetString("key", key_to_log);
177 }
178 return std::move(dict);
179}
180
davidben281d13f02016-04-27 20:43:28181std::unique_ptr<base::Value> NetLogSSLInfoCallback(
182 SSLClientSocketImpl* socket,
183 NetLogCaptureMode capture_mode) {
184 SSLInfo ssl_info;
185 if (!socket->GetSSLInfo(&ssl_info))
186 return nullptr;
187
188 std::unique_ptr<base::DictionaryValue> dict(new base::DictionaryValue());
189 const char* version_str;
190 SSLVersionToString(&version_str,
191 SSLConnectionStatusToVersion(ssl_info.connection_status));
192 dict->SetString("version", version_str);
193 dict->SetBoolean("is_resumed",
194 ssl_info.handshake_type == SSLInfo::HANDSHAKE_RESUME);
195 dict->SetInteger("cipher_suite", SSLConnectionStatusToCipherSuite(
196 ssl_info.connection_status));
197
bnc3472afd2016-11-17 15:27:21198 dict->SetString("next_proto",
199 NextProtoToString(socket->GetNegotiatedProtocol()));
davidben281d13f02016-04-27 20:43:28200
201 return std::move(dict);
202}
203
davidben3418e81f2016-10-19 00:09:45204int GetBufferSize(const char* field_trial) {
205 // Get buffer sizes from field trials, if possible. If values not present,
206 // use default. Also make sure values are in reasonable range.
207 int buffer_size = kDefaultOpenSSLBufferSize;
208#if !defined(OS_NACL)
209 int override_buffer_size;
210 if (base::StringToInt(base::FieldTrialList::FindFullName(field_trial),
211 &override_buffer_size)) {
212 buffer_size = override_buffer_size;
213 buffer_size = std::max(buffer_size, 1000);
214 buffer_size = std::min(buffer_size, 2 * kDefaultOpenSSLBufferSize);
215 }
216#endif // !defined(OS_NACL)
217 return buffer_size;
218}
219
davidbend406cdb2016-11-17 08:31:05220#if defined(OS_NACL)
221bool AreLegacyECDSACiphersEnabled() {
222 return false;
223}
224#else
225// TODO(davidben): Remove this after the ECDSA CBC removal sticks.
226// https:/crbug.com/666191.
227const base::Feature kLegacyECDSACiphersFeature{
228 "SSLLegacyECDSACiphers", base::FEATURE_DISABLED_BY_DEFAULT};
229
230bool AreLegacyECDSACiphersEnabled() {
231 return base::FeatureList::IsEnabled(kLegacyECDSACiphersFeature);
232}
233#endif
234
[email protected]821e3bb2013-11-08 01:06:01235} // namespace
236
svaldeze83af292016-04-26 14:33:37237class SSLClientSocketImpl::SSLContext {
[email protected]fbef13932010-11-23 12:38:53238 public:
olli.raula36aa8be2015-09-10 11:14:22239 static SSLContext* GetInstance() {
240 return base::Singleton<SSLContext>::get();
241 }
[email protected]fbef13932010-11-23 12:38:53242 SSL_CTX* ssl_ctx() { return ssl_ctx_.get(); }
svaldeze83af292016-04-26 14:33:37243 SSLClientSessionCache* session_cache() { return &session_cache_; }
[email protected]fbef13932010-11-23 12:38:53244
svaldeze83af292016-04-26 14:33:37245 SSLClientSocketImpl* GetClientSocketFromSSL(const SSL* ssl) {
[email protected]fbef13932010-11-23 12:38:53246 DCHECK(ssl);
svaldeze83af292016-04-26 14:33:37247 SSLClientSocketImpl* socket = static_cast<SSLClientSocketImpl*>(
[email protected]fbef13932010-11-23 12:38:53248 SSL_get_ex_data(ssl, ssl_socket_data_index_));
249 DCHECK(socket);
250 return socket;
251 }
252
svaldeze83af292016-04-26 14:33:37253 bool SetClientSocketForSSL(SSL* ssl, SSLClientSocketImpl* socket) {
[email protected]fbef13932010-11-23 12:38:53254 return SSL_set_ex_data(ssl, ssl_socket_data_index_, socket) != 0;
255 }
256
davidben2a811e4e2015-12-01 10:49:34257#if !defined(OS_NACL)
258 void SetSSLKeyLogFile(
259 const base::FilePath& path,
260 const scoped_refptr<base::SequencedTaskRunner>& task_runner) {
261 DCHECK(!ssl_key_logger_);
262 ssl_key_logger_.reset(new SSLKeyLogger(path, task_runner));
263 SSL_CTX_set_keylog_callback(ssl_ctx_.get(), KeyLogCallback);
264 }
265#endif
266
davidben1d489522015-07-01 18:48:46267 static const SSL_PRIVATE_KEY_METHOD kPrivateKeyMethod;
268
[email protected]fbef13932010-11-23 12:38:53269 private:
olli.raula36aa8be2015-09-10 11:14:22270 friend struct base::DefaultSingletonTraits<SSLContext>;
[email protected]fbef13932010-11-23 12:38:53271
svaldeze83af292016-04-26 14:33:37272 SSLContext() : session_cache_(SSLClientSessionCache::Config()) {
[email protected]4b559b4d2011-04-14 17:37:14273 crypto::EnsureOpenSSLInit();
[email protected]fbef13932010-11-23 12:38:53274 ssl_socket_data_index_ = SSL_get_ex_new_index(0, 0, 0, 0, 0);
275 DCHECK_NE(ssl_socket_data_index_, -1);
276 ssl_ctx_.reset(SSL_CTX_new(SSLv23_client_method()));
[email protected]b051cdb62014-02-28 02:20:16277 SSL_CTX_set_cert_verify_callback(ssl_ctx_.get(), CertVerifyCallback, NULL);
[email protected]82c59022014-08-15 09:38:27278 SSL_CTX_set_cert_cb(ssl_ctx_.get(), ClientCertRequestCallback, NULL);
[email protected]b051cdb62014-02-28 02:20:16279 SSL_CTX_set_verify(ssl_ctx_.get(), SSL_VERIFY_PEER, NULL);
davidbendafe4e52015-04-08 22:53:52280
281 // Disable the internal session cache. Session caching is handled
svaldeze83af292016-04-26 14:33:37282 // externally (i.e. by SSLClientSessionCache).
davidbendafe4e52015-04-08 22:53:52283 SSL_CTX_set_session_cache_mode(
284 ssl_ctx_.get(), SSL_SESS_CACHE_CLIENT | SSL_SESS_CACHE_NO_INTERNAL);
davidben44aeae62015-06-24 20:47:43285 SSL_CTX_sess_set_new_cb(ssl_ctx_.get(), NewSessionCallback);
davidben99ce6302016-11-09 17:30:28286 SSL_CTX_set_timeout(ssl_ctx_.get(), 1 * 60 * 60 /* one hour */);
nharper736ceda2015-11-07 00:16:59287
davidbenfacfac7b2016-09-27 22:39:53288 SSL_CTX_set_grease_enabled(ssl_ctx_.get(), 1);
289
nharper736ceda2015-11-07 00:16:59290 if (!SSL_CTX_add_client_custom_ext(ssl_ctx_.get(), kTbExtNum,
291 &TokenBindingAddCallback,
292 &TokenBindingFreeCallback, nullptr,
293 &TokenBindingParseCallback, nullptr)) {
294 NOTREACHED();
295 }
296 }
297
298 static int TokenBindingAddCallback(SSL* ssl,
299 unsigned int extension_value,
300 const uint8_t** out,
301 size_t* out_len,
302 int* out_alert_value,
303 void* add_arg) {
304 DCHECK_EQ(extension_value, kTbExtNum);
svaldeze83af292016-04-26 14:33:37305 SSLClientSocketImpl* socket =
306 SSLClientSocketImpl::SSLContext::GetInstance()->GetClientSocketFromSSL(
307 ssl);
nharper736ceda2015-11-07 00:16:59308 return socket->TokenBindingAdd(out, out_len, out_alert_value);
309 }
310
311 static void TokenBindingFreeCallback(SSL* ssl,
312 unsigned extension_value,
313 const uint8_t* out,
314 void* add_arg) {
315 DCHECK_EQ(extension_value, kTbExtNum);
316 OPENSSL_free(const_cast<unsigned char*>(out));
317 }
318
319 static int TokenBindingParseCallback(SSL* ssl,
320 unsigned int extension_value,
321 const uint8_t* contents,
322 size_t contents_len,
323 int* out_alert_value,
324 void* parse_arg) {
325 DCHECK_EQ(extension_value, kTbExtNum);
svaldeze83af292016-04-26 14:33:37326 SSLClientSocketImpl* socket =
327 SSLClientSocketImpl::SSLContext::GetInstance()->GetClientSocketFromSSL(
328 ssl);
nharper736ceda2015-11-07 00:16:59329 return socket->TokenBindingParse(contents, contents_len, out_alert_value);
[email protected]fbef13932010-11-23 12:38:53330 }
331
[email protected]82c59022014-08-15 09:38:27332 static int ClientCertRequestCallback(SSL* ssl, void* arg) {
svaldeze83af292016-04-26 14:33:37333 SSLClientSocketImpl* socket = GetInstance()->GetClientSocketFromSSL(ssl);
[email protected]82c59022014-08-15 09:38:27334 DCHECK(socket);
335 return socket->ClientCertRequestCallback(ssl);
[email protected]718c9672010-12-02 10:04:10336 }
337
svaldeze83af292016-04-26 14:33:37338 static int CertVerifyCallback(X509_STORE_CTX* store_ctx, void* arg) {
[email protected]b051cdb62014-02-28 02:20:16339 SSL* ssl = reinterpret_cast<SSL*>(X509_STORE_CTX_get_ex_data(
340 store_ctx, SSL_get_ex_data_X509_STORE_CTX_idx()));
svaldeze83af292016-04-26 14:33:37341 SSLClientSocketImpl* socket = GetInstance()->GetClientSocketFromSSL(ssl);
[email protected]b051cdb62014-02-28 02:20:16342 CHECK(socket);
343
344 return socket->CertVerifyCallback(store_ctx);
345 }
346
davidben44aeae62015-06-24 20:47:43347 static int NewSessionCallback(SSL* ssl, SSL_SESSION* session) {
svaldeze83af292016-04-26 14:33:37348 SSLClientSocketImpl* socket = GetInstance()->GetClientSocketFromSSL(ssl);
davidben44aeae62015-06-24 20:47:43349 return socket->NewSessionCallback(session);
davidbendafe4e52015-04-08 22:53:52350 }
351
davidben1d489522015-07-01 18:48:46352 static int PrivateKeyTypeCallback(SSL* ssl) {
svaldeze83af292016-04-26 14:33:37353 SSLClientSocketImpl* socket = GetInstance()->GetClientSocketFromSSL(ssl);
davidben1d489522015-07-01 18:48:46354 return socket->PrivateKeyTypeCallback();
355 }
356
davidben1d489522015-07-01 18:48:46357 static size_t PrivateKeyMaxSignatureLenCallback(SSL* ssl) {
svaldeze83af292016-04-26 14:33:37358 SSLClientSocketImpl* socket = GetInstance()->GetClientSocketFromSSL(ssl);
davidben1d489522015-07-01 18:48:46359 return socket->PrivateKeyMaxSignatureLenCallback();
360 }
361
davidben0bca07fd2016-07-18 15:12:03362 static ssl_private_key_result_t PrivateKeySignDigestCallback(
davidben1d489522015-07-01 18:48:46363 SSL* ssl,
364 uint8_t* out,
365 size_t* out_len,
davidben0bca07fd2016-07-18 15:12:03366 size_t max_out,
367 const EVP_MD* md,
368 const uint8_t* in,
369 size_t in_len) {
svaldeze83af292016-04-26 14:33:37370 SSLClientSocketImpl* socket = GetInstance()->GetClientSocketFromSSL(ssl);
davidben0bca07fd2016-07-18 15:12:03371 return socket->PrivateKeySignDigestCallback(out, out_len, max_out, md, in,
372 in_len);
373 }
374
375 static ssl_private_key_result_t PrivateKeyCompleteCallback(SSL* ssl,
376 uint8_t* out,
377 size_t* out_len,
378 size_t max_out) {
379 SSLClientSocketImpl* socket = GetInstance()->GetClientSocketFromSSL(ssl);
380 return socket->PrivateKeyCompleteCallback(out, out_len, max_out);
davidben1d489522015-07-01 18:48:46381 }
382
davidben2a811e4e2015-12-01 10:49:34383#if !defined(OS_NACL)
384 static void KeyLogCallback(const SSL* ssl, const char* line) {
385 GetInstance()->ssl_key_logger_->WriteLine(line);
386 }
387#endif
388
[email protected]fbef13932010-11-23 12:38:53389 // This is the index used with SSL_get_ex_data to retrieve the owner
svaldeze83af292016-04-26 14:33:37390 // SSLClientSocketImpl object from an SSL instance.
[email protected]fbef13932010-11-23 12:38:53391 int ssl_socket_data_index_;
392
davidbend80c12c2016-10-11 00:13:49393 bssl::UniquePtr<SSL_CTX> ssl_ctx_;
davidbendafe4e52015-04-08 22:53:52394
davidben2a811e4e2015-12-01 10:49:34395#if !defined(OS_NACL)
danakj655b66c2016-04-16 00:51:38396 std::unique_ptr<SSLKeyLogger> ssl_key_logger_;
davidben2a811e4e2015-12-01 10:49:34397#endif
398
davidbendafe4e52015-04-08 22:53:52399 // TODO(davidben): Use a separate cache per URLRequestContext.
400 // https://crbug.com/458365
401 //
402 // TODO(davidben): Sessions should be invalidated on fatal
403 // alerts. https://crbug.com/466352
svaldeze83af292016-04-26 14:33:37404 SSLClientSessionCache session_cache_;
[email protected]1279de12013-12-03 15:13:32405};
406
davidben0bca07fd2016-07-18 15:12:03407// TODO(davidben): Switch from sign_digest to sign.
davidben1d489522015-07-01 18:48:46408const SSL_PRIVATE_KEY_METHOD
svaldeze83af292016-04-26 14:33:37409 SSLClientSocketImpl::SSLContext::kPrivateKeyMethod = {
410 &SSLClientSocketImpl::SSLContext::PrivateKeyTypeCallback,
411 &SSLClientSocketImpl::SSLContext::PrivateKeyMaxSignatureLenCallback,
davidben0bca07fd2016-07-18 15:12:03412 nullptr /* sign */,
413 &SSLClientSocketImpl::SSLContext::PrivateKeySignDigestCallback,
414 nullptr /* decrypt */,
415 &SSLClientSocketImpl::SSLContext::PrivateKeyCompleteCallback,
davidben1d489522015-07-01 18:48:46416};
417
[email protected]7f38da8a2014-03-17 16:44:26418// PeerCertificateChain is a helper object which extracts the certificate
419// chain, as given by the server, from an OpenSSL socket and performs the needed
420// resource management. The first element of the chain is the leaf certificate
421// and the other elements are in the order given by the server.
svaldeze83af292016-04-26 14:33:37422class SSLClientSocketImpl::PeerCertificateChain {
[email protected]7f38da8a2014-03-17 16:44:26423 public:
svaldeze83af292016-04-26 14:33:37424 explicit PeerCertificateChain(STACK_OF(X509) * chain) { Reset(chain); }
[email protected]7f38da8a2014-03-17 16:44:26425 PeerCertificateChain(const PeerCertificateChain& other) { *this = other; }
426 ~PeerCertificateChain() {}
427 PeerCertificateChain& operator=(const PeerCertificateChain& other);
428
[email protected]76e85392014-03-20 17:54:14429 // Resets the PeerCertificateChain to the set of certificates in|chain|,
430 // which may be NULL, indicating to empty the store certificates.
431 // Note: If an error occurs, such as being unable to parse the certificates,
432 // this will behave as if Reset(NULL) was called.
svaldeze83af292016-04-26 14:33:37433 void Reset(STACK_OF(X509) * chain);
[email protected]76e85392014-03-20 17:54:14434
svaldez2135be52016-04-20 16:34:53435 // Note that when USE_OPENSSL_CERTS is defined, OSCertHandle is X509*
davidben30798ed82014-09-19 19:28:20436 scoped_refptr<X509Certificate> AsOSChain() const;
[email protected]7f38da8a2014-03-17 16:44:26437
438 size_t size() const {
439 if (!openssl_chain_.get())
440 return 0;
441 return sk_X509_num(openssl_chain_.get());
442 }
443
svaldeze83af292016-04-26 14:33:37444 bool empty() const { return size() == 0; }
davidben30798ed82014-09-19 19:28:20445
446 X509* Get(size_t index) const {
[email protected]7f38da8a2014-03-17 16:44:26447 DCHECK_LT(index, size());
448 return sk_X509_value(openssl_chain_.get(), index);
449 }
450
451 private:
davidbend80c12c2016-10-11 00:13:49452 bssl::UniquePtr<STACK_OF(X509)> openssl_chain_;
[email protected]7f38da8a2014-03-17 16:44:26453};
454
svaldeze83af292016-04-26 14:33:37455SSLClientSocketImpl::PeerCertificateChain&
456SSLClientSocketImpl::PeerCertificateChain::operator=(
[email protected]7f38da8a2014-03-17 16:44:26457 const PeerCertificateChain& other) {
458 if (this == &other)
459 return *this;
460
[email protected]24176af2014-08-14 09:31:04461 openssl_chain_.reset(X509_chain_up_ref(other.openssl_chain_.get()));
[email protected]7f38da8a2014-03-17 16:44:26462 return *this;
463}
464
svaldeze83af292016-04-26 14:33:37465void SSLClientSocketImpl::PeerCertificateChain::Reset(STACK_OF(X509) * chain) {
davidben30798ed82014-09-19 19:28:20466 openssl_chain_.reset(chain ? X509_chain_up_ref(chain) : NULL);
[email protected]7f38da8a2014-03-17 16:44:26467}
[email protected]7f38da8a2014-03-17 16:44:26468
davidben30798ed82014-09-19 19:28:20469scoped_refptr<X509Certificate>
svaldeze83af292016-04-26 14:33:37470SSLClientSocketImpl::PeerCertificateChain::AsOSChain() const {
davidben30798ed82014-09-19 19:28:20471 // DER-encode the chain and convert to a platform certificate handle.
rsleevi74e99742016-09-13 20:35:25472 std::vector<std::string> chain;
473 chain.reserve(sk_X509_num(openssl_chain_.get()));
[email protected]edfd0f42014-07-22 18:20:37474 for (size_t i = 0; i < sk_X509_num(openssl_chain_.get()); ++i) {
[email protected]7f38da8a2014-03-17 16:44:26475 X509* x = sk_X509_value(openssl_chain_.get(), i);
rsleevi74e99742016-09-13 20:35:25476 // Note: This intentionally avoids using x509_util::GetDER(), which may
477 // cache the encoded DER on |x|, as |x| is shared with the underlying
478 // socket (SSL*) this chain belongs to. As the DER will only be used
479 // once in //net, within this code, this avoids needlessly caching
480 // additional data. See https://crbug.com/642082
481 int len = i2d_X509(x, nullptr);
482 if (len < 0)
483 return nullptr;
484 std::string cert;
485 uint8_t* ptr = reinterpret_cast<uint8_t*>(base::WriteInto(&cert, len + 1));
486 len = i2d_X509(x, &ptr);
487 if (len < 0) {
488 NOTREACHED();
489 return nullptr;
490 }
491 chain.push_back(std::move(cert));
[email protected]7f38da8a2014-03-17 16:44:26492 }
rsleevi74e99742016-09-13 20:35:25493 std::vector<base::StringPiece> stringpiece_chain;
494 for (const auto& cert : chain)
495 stringpiece_chain.push_back(cert);
[email protected]7f38da8a2014-03-17 16:44:26496
rsleevi74e99742016-09-13 20:35:25497 return X509Certificate::CreateFromDERCertChain(stringpiece_chain);
[email protected]7f38da8a2014-03-17 16:44:26498}
[email protected]7f38da8a2014-03-17 16:44:26499
[email protected]1279de12013-12-03 15:13:32500// static
[email protected]c3456bb2011-12-12 22:22:19501void SSLClientSocket::ClearSessionCache() {
svaldeze83af292016-04-26 14:33:37502 SSLClientSocketImpl::SSLContext* context =
503 SSLClientSocketImpl::SSLContext::GetInstance();
[email protected]c3456bb2011-12-12 22:22:19504 context->session_cache()->Flush();
505}
506
svaldeze83af292016-04-26 14:33:37507SSLClientSocketImpl::SSLClientSocketImpl(
danakj655b66c2016-04-16 00:51:38508 std::unique_ptr<ClientSocketHandle> transport_socket,
[email protected]055d7f22010-11-15 12:03:12509 const HostPortPair& host_and_port,
[email protected]822581d2010-12-16 17:27:15510 const SSLConfig& ssl_config,
[email protected]feb79bcd2011-07-21 16:55:17511 const SSLClientSocketContext& context)
davidben3418e81f2016-10-19 00:09:45512 : pending_read_error_(kNoPendingResult),
davidbenb8c23212014-10-28 00:12:16513 pending_read_ssl_error_(SSL_ERROR_NONE),
[email protected]7f38da8a2014-03-17 16:44:26514 server_cert_chain_(new PeerCertificateChain(NULL)),
[email protected]64b5c892014-08-08 09:39:26515 completed_connect_(false),
[email protected]0dc88b32014-03-26 20:12:28516 was_ever_used_(false),
[email protected]feb79bcd2011-07-21 16:55:17517 cert_verifier_(context.cert_verifier),
davidbeneb5f8ef32014-09-04 14:14:32518 cert_transparency_verifier_(context.cert_transparency_verifier),
[email protected]6b8a3c742014-07-25 00:25:35519 channel_id_service_(context.channel_id_service),
nharper736ceda2015-11-07 00:16:59520 tb_was_negotiated_(false),
521 tb_negotiated_param_(TB_PARAM_ECDSAP256),
nharper78e6d2b2016-09-21 05:42:35522 tb_signature_map_(10),
dchengc7eeda422015-12-26 03:56:48523 transport_(std::move(transport_socket)),
[email protected]055d7f22010-11-15 12:03:12524 host_and_port_(host_and_port),
[email protected]d518cd92010-09-29 12:27:44525 ssl_config_(ssl_config),
[email protected]c3456bb2011-12-12 22:22:19526 ssl_session_cache_shard_(context.ssl_session_cache_shard),
[email protected]013c17c2012-01-21 19:09:01527 next_handshake_state_(STATE_NONE),
svaldez4af14d22015-08-20 13:48:24528 disconnected_(false),
bnc3cf2a592016-08-11 14:48:36529 negotiated_protocol_(kProtoUnknown),
davidben52053b382015-04-27 19:22:29530 channel_id_sent_(false),
davidbendafe4e52015-04-08 22:53:52531 certificate_verified_(false),
davidbenfe132d92016-09-27 18:07:21532 certificate_requested_(false),
davidben1d489522015-07-01 18:48:46533 signature_result_(kNoPendingResult),
[email protected]8bd4e7a2014-08-09 14:49:17534 transport_security_state_(context.transport_security_state),
estark6f9b3d82016-01-12 21:37:05535 policy_enforcer_(context.ct_policy_enforcer),
dadriandf302c42016-06-10 18:48:59536 pkp_bypassed_(false),
kulkarni.acd7b4462014-08-28 07:41:34537 net_log_(transport_->socket()->NetLog()),
538 weak_factory_(this) {
rsleevibe81cd62016-06-24 01:38:59539 CHECK(cert_verifier_);
540 CHECK(transport_security_state_);
541 CHECK(cert_transparency_verifier_);
542 CHECK(policy_enforcer_);
[email protected]8e458552014-08-05 00:02:15543}
[email protected]d518cd92010-09-29 12:27:44544
svaldeze83af292016-04-26 14:33:37545SSLClientSocketImpl::~SSLClientSocketImpl() {
[email protected]d518cd92010-09-29 12:27:44546 Disconnect();
547}
548
davidben2a811e4e2015-12-01 10:49:34549#if !defined(OS_NACL)
svaldeze83af292016-04-26 14:33:37550void SSLClientSocketImpl::SetSSLKeyLogFile(
davidben2a811e4e2015-12-01 10:49:34551 const base::FilePath& ssl_keylog_file,
552 const scoped_refptr<base::SequencedTaskRunner>& task_runner) {
553 SSLContext::GetInstance()->SetSSLKeyLogFile(ssl_keylog_file, task_runner);
zhongyi81f85c6d92015-10-16 19:34:14554}
davidben2a811e4e2015-12-01 10:49:34555#endif
zhongyi81f85c6d92015-10-16 19:34:14556
svaldeze83af292016-04-26 14:33:37557void SSLClientSocketImpl::GetSSLCertRequestInfo(
[email protected]b9b651f2013-11-09 04:32:22558 SSLCertRequestInfo* cert_request_info) {
[email protected]791879c2013-12-17 07:22:41559 cert_request_info->host_and_port = host_and_port_;
[email protected]b9b651f2013-11-09 04:32:22560 cert_request_info->cert_authorities = cert_authorities_;
[email protected]c0787702014-05-20 21:51:44561 cert_request_info->cert_key_types = cert_key_types_;
[email protected]b9b651f2013-11-09 04:32:22562}
563
svaldeze83af292016-04-26 14:33:37564ChannelIDService* SSLClientSocketImpl::GetChannelIDService() const {
[email protected]6b8a3c742014-07-25 00:25:35565 return channel_id_service_;
[email protected]b9b651f2013-11-09 04:32:22566}
567
nharper78e6d2b2016-09-21 05:42:35568Error SSLClientSocketImpl::GetTokenBindingSignature(crypto::ECPrivateKey* key,
569 TokenBindingType tb_type,
570 std::vector<uint8_t>* out) {
nharperb7441ef2016-01-25 23:54:14571 // The same key will be used across multiple requests to sign the same value,
572 // so the signature is cached.
573 std::string raw_public_key;
574 if (!key->ExportRawPublicKey(&raw_public_key))
575 return ERR_FAILED;
nharper78e6d2b2016-09-21 05:42:35576 auto it = tb_signature_map_.Get(std::make_pair(tb_type, raw_public_key));
577 if (it != tb_signature_map_.end()) {
nharperb7441ef2016-01-25 23:54:14578 *out = it->second;
579 return OK;
580 }
581
582 uint8_t tb_ekm_buf[32];
583 static const char kTokenBindingExporterLabel[] = "EXPORTER-Token-Binding";
davidbend80c12c2016-10-11 00:13:49584 if (!SSL_export_keying_material(ssl_.get(), tb_ekm_buf, sizeof(tb_ekm_buf),
nharperb7441ef2016-01-25 23:54:14585 kTokenBindingExporterLabel,
586 strlen(kTokenBindingExporterLabel), nullptr,
587 0, false /* no context */)) {
588 return ERR_FAILED;
589 }
590
nharper78e6d2b2016-09-21 05:42:35591 if (!CreateTokenBindingSignature(
nharperd5cddca2016-02-27 03:37:52592 base::StringPiece(reinterpret_cast<char*>(tb_ekm_buf),
593 sizeof(tb_ekm_buf)),
nharper78e6d2b2016-09-21 05:42:35594 tb_type, key, out))
nharperb7441ef2016-01-25 23:54:14595 return ERR_FAILED;
nharperb7441ef2016-01-25 23:54:14596
nharper78e6d2b2016-09-21 05:42:35597 tb_signature_map_.Put(std::make_pair(tb_type, raw_public_key), *out);
nharperb7441ef2016-01-25 23:54:14598 return OK;
599}
600
svaldeze83af292016-04-26 14:33:37601crypto::ECPrivateKey* SSLClientSocketImpl::GetChannelIDKey() const {
nharperb36644f2016-02-22 23:14:43602 return channel_id_key_.get();
603}
604
svaldeze83af292016-04-26 14:33:37605int SSLClientSocketImpl::ExportKeyingMaterial(const base::StringPiece& label,
606 bool has_context,
607 const base::StringPiece& context,
608 unsigned char* out,
609 unsigned int outlen) {
davidben86935f72015-05-06 22:24:49610 if (!IsConnected())
611 return ERR_SOCKET_NOT_CONNECTED;
612
[email protected]b9b651f2013-11-09 04:32:22613 crypto::OpenSSLErrStackTracer err_tracer(FROM_HERE);
614
davidbenf225b262016-09-15 22:09:22615 if (!SSL_export_keying_material(
davidbend80c12c2016-10-11 00:13:49616 ssl_.get(), out, outlen, label.data(), label.size(),
davidbenf225b262016-09-15 22:09:22617 reinterpret_cast<const unsigned char*>(context.data()),
618 context.length(), has_context ? 1 : 0)) {
619 LOG(ERROR) << "Failed to export keying material.";
620 return ERR_FAILED;
[email protected]b9b651f2013-11-09 04:32:22621 }
davidbenf225b262016-09-15 22:09:22622
[email protected]b9b651f2013-11-09 04:32:22623 return OK;
624}
625
svaldeze83af292016-04-26 14:33:37626int SSLClientSocketImpl::Connect(const CompletionCallback& callback) {
svaldez4af14d22015-08-20 13:48:24627 // Although StreamSocket does allow calling Connect() after Disconnect(),
628 // this has never worked for layered sockets. CHECK to detect any consumers
629 // reconnecting an SSL socket.
630 //
631 // TODO(davidben,mmenke): Remove this API feature. See
632 // https://crbug.com/499289.
633 CHECK(!disconnected_);
634
mikecirone8b85c432016-09-08 19:11:00635 net_log_.BeginEvent(NetLogEventType::SSL_CONNECT);
[email protected]b9b651f2013-11-09 04:32:22636
637 // Set up new ssl object.
[email protected]c8a80e92014-05-17 16:02:08638 int rv = Init();
639 if (rv != OK) {
davidben281d13f02016-04-27 20:43:28640 LogConnectEndEvent(rv);
[email protected]c8a80e92014-05-17 16:02:08641 return rv;
[email protected]b9b651f2013-11-09 04:32:22642 }
643
644 // Set SSL to client mode. Handshake happens in the loop below.
davidbend80c12c2016-10-11 00:13:49645 SSL_set_connect_state(ssl_.get());
[email protected]b9b651f2013-11-09 04:32:22646
rsleeviadbd4982016-06-13 22:10:27647 next_handshake_state_ = STATE_HANDSHAKE;
[email protected]c8a80e92014-05-17 16:02:08648 rv = DoHandshakeLoop(OK);
[email protected]b9b651f2013-11-09 04:32:22649 if (rv == ERR_IO_PENDING) {
650 user_connect_callback_ = callback;
651 } else {
davidben281d13f02016-04-27 20:43:28652 LogConnectEndEvent(rv);
[email protected]b9b651f2013-11-09 04:32:22653 }
654
655 return rv > OK ? OK : rv;
656}
657
svaldeze83af292016-04-26 14:33:37658void SSLClientSocketImpl::Disconnect() {
svaldez4af14d22015-08-20 13:48:24659 disconnected_ = true;
660
[email protected]b9b651f2013-11-09 04:32:22661 // Shut down anything that may call us back.
eroman7f9236a2015-05-11 21:23:43662 cert_verifier_request_.reset();
davidben67e83912016-10-12 18:36:32663 channel_id_request_.Cancel();
664 weak_factory_.InvalidateWeakPtrs();
davidben3418e81f2016-10-19 00:09:45665 transport_adapter_.reset();
[email protected]b9b651f2013-11-09 04:32:22666
davidben67e83912016-10-12 18:36:32667 // Release user callbacks.
[email protected]b9b651f2013-11-09 04:32:22668 user_connect_callback_.Reset();
669 user_read_callback_.Reset();
670 user_write_callback_.Reset();
svaldeze83af292016-04-26 14:33:37671 user_read_buf_ = NULL;
672 user_read_buf_len_ = 0;
673 user_write_buf_ = NULL;
674 user_write_buf_len_ = 0;
[email protected]b9b651f2013-11-09 04:32:22675
davidben67e83912016-10-12 18:36:32676 transport_->socket()->Disconnect();
[email protected]b9b651f2013-11-09 04:32:22677}
678
svaldeze83af292016-04-26 14:33:37679bool SSLClientSocketImpl::IsConnected() const {
davidben67e83912016-10-12 18:36:32680 // If the handshake has not yet completed or the socket has been explicitly
681 // disconnected.
682 if (!completed_connect_ || disconnected_)
[email protected]b9b651f2013-11-09 04:32:22683 return false;
684 // If an asynchronous operation is still pending.
685 if (user_read_buf_.get() || user_write_buf_.get())
686 return true;
687
688 return transport_->socket()->IsConnected();
689}
690
svaldeze83af292016-04-26 14:33:37691bool SSLClientSocketImpl::IsConnectedAndIdle() const {
davidben67e83912016-10-12 18:36:32692 // If the handshake has not yet completed or the socket has been explicitly
693 // disconnected.
694 if (!completed_connect_ || disconnected_)
[email protected]b9b651f2013-11-09 04:32:22695 return false;
696 // If an asynchronous operation is still pending.
697 if (user_read_buf_.get() || user_write_buf_.get())
698 return false;
davidbenfc9a6b82015-04-15 23:47:32699
700 // If there is data read from the network that has not yet been consumed, do
701 // not treat the connection as idle.
702 //
davidben3418e81f2016-10-19 00:09:45703 // Note that this does not check whether there is ciphertext that has not yet
704 // been flushed to the network. |Write| returns early, so this can cause race
705 // conditions which cause a socket to not be treated reusable when it should
706 // be. See https://crbug.com/466147.
707 if (transport_adapter_->HasPendingReadData())
[email protected]b9b651f2013-11-09 04:32:22708 return false;
[email protected]b9b651f2013-11-09 04:32:22709
710 return transport_->socket()->IsConnectedAndIdle();
711}
712
svaldeze83af292016-04-26 14:33:37713int SSLClientSocketImpl::GetPeerAddress(IPEndPoint* addressList) const {
[email protected]b9b651f2013-11-09 04:32:22714 return transport_->socket()->GetPeerAddress(addressList);
715}
716
svaldeze83af292016-04-26 14:33:37717int SSLClientSocketImpl::GetLocalAddress(IPEndPoint* addressList) const {
[email protected]b9b651f2013-11-09 04:32:22718 return transport_->socket()->GetLocalAddress(addressList);
719}
720
tfarina42834112016-09-22 13:38:20721const NetLogWithSource& SSLClientSocketImpl::NetLog() const {
[email protected]b9b651f2013-11-09 04:32:22722 return net_log_;
723}
724
svaldeze83af292016-04-26 14:33:37725void SSLClientSocketImpl::SetSubresourceSpeculation() {
[email protected]b9b651f2013-11-09 04:32:22726 if (transport_.get() && transport_->socket()) {
727 transport_->socket()->SetSubresourceSpeculation();
728 } else {
729 NOTREACHED();
730 }
731}
732
svaldeze83af292016-04-26 14:33:37733void SSLClientSocketImpl::SetOmniboxSpeculation() {
[email protected]b9b651f2013-11-09 04:32:22734 if (transport_.get() && transport_->socket()) {
735 transport_->socket()->SetOmniboxSpeculation();
736 } else {
737 NOTREACHED();
738 }
739}
740
svaldeze83af292016-04-26 14:33:37741bool SSLClientSocketImpl::WasEverUsed() const {
[email protected]0dc88b32014-03-26 20:12:28742 return was_ever_used_;
[email protected]b9b651f2013-11-09 04:32:22743}
744
bnc3cf2a592016-08-11 14:48:36745bool SSLClientSocketImpl::WasNpnNegotiated() const {
746 return negotiated_protocol_ != kProtoUnknown;
747}
748
749NextProto SSLClientSocketImpl::GetNegotiatedProtocol() const {
750 return negotiated_protocol_;
751}
752
svaldeze83af292016-04-26 14:33:37753bool SSLClientSocketImpl::GetSSLInfo(SSLInfo* ssl_info) {
[email protected]b9b651f2013-11-09 04:32:22754 ssl_info->Reset();
davidben30798ed82014-09-19 19:28:20755 if (server_cert_chain_->empty())
[email protected]b9b651f2013-11-09 04:32:22756 return false;
757
758 ssl_info->cert = server_cert_verify_result_.verified_cert;
estark03d644f2015-06-13 00:11:32759 ssl_info->unverified_cert = server_cert_;
[email protected]b9b651f2013-11-09 04:32:22760 ssl_info->cert_status = server_cert_verify_result_.cert_status;
761 ssl_info->is_issued_by_known_root =
762 server_cert_verify_result_.is_issued_by_known_root;
dadriandf302c42016-06-10 18:48:59763 ssl_info->pkp_bypassed = pkp_bypassed_;
svaldeze83af292016-04-26 14:33:37764 ssl_info->public_key_hashes = server_cert_verify_result_.public_key_hashes;
[email protected]b9b651f2013-11-09 04:32:22765 ssl_info->client_cert_sent =
766 ssl_config_.send_client_cert && ssl_config_.client_cert.get();
davidben52053b382015-04-27 19:22:29767 ssl_info->channel_id_sent = channel_id_sent_;
nharper736ceda2015-11-07 00:16:59768 ssl_info->token_binding_negotiated = tb_was_negotiated_;
769 ssl_info->token_binding_key_param = tb_negotiated_param_;
[email protected]8bd4e7a2014-08-09 14:49:17770 ssl_info->pinning_failure_log = pinning_failure_log_;
dadrian612337a2016-07-20 22:36:58771 ssl_info->ocsp_result = server_cert_verify_result_.ocsp_result;
[email protected]b9b651f2013-11-09 04:32:22772
estark723b5eeb2016-02-18 21:01:12773 AddCTInfoToSSLInfo(ssl_info);
davidbeneb5f8ef32014-09-04 14:14:32774
davidbend80c12c2016-10-11 00:13:49775 const SSL_CIPHER* cipher = SSL_get_current_cipher(ssl_.get());
[email protected]b9b651f2013-11-09 04:32:22776 CHECK(cipher);
777 ssl_info->security_bits = SSL_CIPHER_get_bits(cipher, NULL);
davidben3b00e402016-09-20 14:31:06778 // Historically, the "group" was known as "curve".
davidbend80c12c2016-10-11 00:13:49779 ssl_info->key_exchange_group = SSL_get_curve_id(ssl_.get());
[email protected]b9b651f2013-11-09 04:32:22780
ryanchung987b2ff2016-02-19 00:17:12781 SSLConnectionStatusSetCipherSuite(
782 static_cast<uint16_t>(SSL_CIPHER_get_id(cipher)),
783 &ssl_info->connection_status);
davidbend80c12c2016-10-11 00:13:49784 SSLConnectionStatusSetVersion(GetNetSSLVersion(ssl_.get()),
ryanchung987b2ff2016-02-19 00:17:12785 &ssl_info->connection_status);
[email protected]b9b651f2013-11-09 04:32:22786
davidbend80c12c2016-10-11 00:13:49787 if (!SSL_get_secure_renegotiation_support(ssl_.get()))
[email protected]b9b651f2013-11-09 04:32:22788 ssl_info->connection_status |= SSL_CONNECTION_NO_RENEGOTIATION_EXTENSION;
[email protected]b9b651f2013-11-09 04:32:22789
davidbend80c12c2016-10-11 00:13:49790 ssl_info->handshake_type = SSL_session_reused(ssl_.get())
svaldeze83af292016-04-26 14:33:37791 ? SSLInfo::HANDSHAKE_RESUME
792 : SSLInfo::HANDSHAKE_FULL;
[email protected]b9b651f2013-11-09 04:32:22793
[email protected]b9b651f2013-11-09 04:32:22794 return true;
795}
796
svaldeze83af292016-04-26 14:33:37797void SSLClientSocketImpl::GetConnectionAttempts(ConnectionAttempts* out) const {
ttuttle23fdb7b2015-05-15 01:28:03798 out->clear();
799}
800
svaldeze83af292016-04-26 14:33:37801int64_t SSLClientSocketImpl::GetTotalReceivedBytes() const {
tbansalf82cc8e2015-10-14 20:05:49802 return transport_->socket()->GetTotalReceivedBytes();
803}
804
svaldeze83af292016-04-26 14:33:37805int SSLClientSocketImpl::Read(IOBuffer* buf,
806 int buf_len,
807 const CompletionCallback& callback) {
[email protected]b9b651f2013-11-09 04:32:22808 user_read_buf_ = buf;
809 user_read_buf_len_ = buf_len;
810
davidben3418e81f2016-10-19 00:09:45811 int rv = DoPayloadRead();
[email protected]b9b651f2013-11-09 04:32:22812
813 if (rv == ERR_IO_PENDING) {
814 user_read_callback_ = callback;
815 } else {
[email protected]0dc88b32014-03-26 20:12:28816 if (rv > 0)
817 was_ever_used_ = true;
[email protected]b9b651f2013-11-09 04:32:22818 user_read_buf_ = NULL;
819 user_read_buf_len_ = 0;
820 }
821
822 return rv;
823}
824
svaldeze83af292016-04-26 14:33:37825int SSLClientSocketImpl::Write(IOBuffer* buf,
826 int buf_len,
827 const CompletionCallback& callback) {
[email protected]b9b651f2013-11-09 04:32:22828 user_write_buf_ = buf;
829 user_write_buf_len_ = buf_len;
830
davidben3418e81f2016-10-19 00:09:45831 int rv = DoPayloadWrite();
[email protected]b9b651f2013-11-09 04:32:22832
833 if (rv == ERR_IO_PENDING) {
834 user_write_callback_ = callback;
835 } else {
[email protected]0dc88b32014-03-26 20:12:28836 if (rv > 0)
837 was_ever_used_ = true;
[email protected]b9b651f2013-11-09 04:32:22838 user_write_buf_ = NULL;
839 user_write_buf_len_ = 0;
840 }
841
842 return rv;
843}
844
svaldeze83af292016-04-26 14:33:37845int SSLClientSocketImpl::SetReceiveBufferSize(int32_t size) {
[email protected]b9b651f2013-11-09 04:32:22846 return transport_->socket()->SetReceiveBufferSize(size);
847}
848
svaldeze83af292016-04-26 14:33:37849int SSLClientSocketImpl::SetSendBufferSize(int32_t size) {
[email protected]b9b651f2013-11-09 04:32:22850 return transport_->socket()->SetSendBufferSize(size);
851}
852
davidben3418e81f2016-10-19 00:09:45853void SSLClientSocketImpl::OnReadReady() {
854 // During a renegotiation, either Read or Write calls may be blocked on a
855 // transport read.
856 RetryAllOperations();
857}
858
859void SSLClientSocketImpl::OnWriteReady() {
860 // During a renegotiation, either Read or Write calls may be blocked on a
861 // transport read.
862 RetryAllOperations();
863}
864
svaldeze83af292016-04-26 14:33:37865int SSLClientSocketImpl::Init() {
[email protected]9e733f32010-10-04 18:19:08866 DCHECK(!ssl_);
[email protected]9e733f32010-10-04 18:19:08867
svaldez2135be52016-04-20 16:34:53868#if defined(USE_NSS_CERTS)
davidbena477a70a2015-10-06 04:38:29869 if (ssl_config_.cert_io_enabled) {
870 // TODO(davidben): Move this out of SSLClientSocket. See
871 // https://crbug.com/539520.
872 EnsureNSSHttpIOInit();
873 }
874#endif
875
[email protected]b29af7d2010-12-14 11:52:47876 SSLContext* context = SSLContext::GetInstance();
[email protected]4b559b4d2011-04-14 17:37:14877 crypto::OpenSSLErrStackTracer err_tracer(FROM_HERE);
[email protected]d518cd92010-09-29 12:27:44878
davidbend80c12c2016-10-11 00:13:49879 ssl_.reset(SSL_new(context->ssl_ctx()));
880 if (!ssl_ || !context->SetClientSocketForSSL(ssl_.get(), this))
[email protected]c8a80e92014-05-17 16:02:08881 return ERR_UNEXPECTED;
[email protected]fbef13932010-11-23 12:38:53882
davidben9bc0466f2015-06-16 22:21:27883 // SNI should only contain valid DNS hostnames, not IP addresses (see RFC
884 // 6066, Section 3).
885 //
886 // TODO(rsleevi): Should this code allow hostnames that violate the LDH rule?
887 // See https://crbug.com/496472 and https://crbug.com/496468 for discussion.
martijna2e83bd2016-03-18 13:10:45888 IPAddress unused;
889 if (!unused.AssignFromIPLiteral(host_and_port_.host()) &&
davidbend80c12c2016-10-11 00:13:49890 !SSL_set_tlsext_host_name(ssl_.get(), host_and_port_.host().c_str())) {
[email protected]c8a80e92014-05-17 16:02:08891 return ERR_UNEXPECTED;
davidben9bc0466f2015-06-16 22:21:27892 }
[email protected]fbef13932010-11-23 12:38:53893
davidbend80c12c2016-10-11 00:13:49894 bssl::UniquePtr<SSL_SESSION> session =
davidbenf4c9a6122015-10-20 02:45:29895 context->session_cache()->Lookup(GetSessionCacheKey());
896 if (session)
davidbend80c12c2016-10-11 00:13:49897 SSL_set_session(ssl_.get(), session.get());
[email protected]d518cd92010-09-29 12:27:44898
davidben3418e81f2016-10-19 00:09:45899 transport_adapter_.reset(new SocketBIOAdapter(
900 transport_->socket(), GetBufferSize("SSLBufferSizeRecv"),
901 GetBufferSize("SSLBufferSizeSend"), this));
902 BIO* transport_bio = transport_adapter_->bio();
mmenke1beda3d2016-07-22 03:33:45903
davidben3418e81f2016-10-19 00:09:45904 BIO_up_ref(transport_bio); // SSL_set0_rbio takes ownership.
905 SSL_set0_rbio(ssl_.get(), transport_bio);
haavardm2d92e722014-12-19 13:45:44906
davidben3418e81f2016-10-19 00:09:45907 BIO_up_ref(transport_bio); // SSL_set0_wbio takes ownership.
908 SSL_set0_wbio(ssl_.get(), transport_bio);
[email protected]d518cd92010-09-29 12:27:44909
davidbenb937d6c2015-05-14 04:53:42910 DCHECK_LT(SSL3_VERSION, ssl_config_.version_min);
911 DCHECK_LT(SSL3_VERSION, ssl_config_.version_max);
davidbend80c12c2016-10-11 00:13:49912 if (!SSL_set_min_proto_version(ssl_.get(), ssl_config_.version_min) ||
913 !SSL_set_max_proto_version(ssl_.get(), ssl_config_.version_max)) {
davidben952bdf22016-09-21 23:42:16914 return ERR_UNEXPECTED;
915 }
davidbenb937d6c2015-05-14 04:53:42916
[email protected]9e733f32010-10-04 18:19:08917 // OpenSSL defaults some options to on, others to off. To avoid ambiguity,
918 // set everything we care about to an absolute value.
[email protected]fb10e2282010-12-01 17:08:48919 SslSetClearMask options;
[email protected]d0f00492012-08-03 22:35:13920 options.ConfigureFlag(SSL_OP_NO_COMPRESSION, true);
[email protected]9e733f32010-10-04 18:19:08921
922 // TODO(joth): Set this conditionally, see http://crbug.com/55410
[email protected]fb10e2282010-12-01 17:08:48923 options.ConfigureFlag(SSL_OP_LEGACY_SERVER_CONNECT, true);
[email protected]9e733f32010-10-04 18:19:08924
davidbend80c12c2016-10-11 00:13:49925 SSL_set_options(ssl_.get(), options.set_mask);
926 SSL_clear_options(ssl_.get(), options.clear_mask);
[email protected]9e733f32010-10-04 18:19:08927
[email protected]fb10e2282010-12-01 17:08:48928 // Same as above, this time for the SSL mode.
929 SslSetClearMask mode;
[email protected]9e733f32010-10-04 18:19:08930
[email protected]fb10e2282010-12-01 17:08:48931 mode.ConfigureFlag(SSL_MODE_RELEASE_BUFFERS, true);
ishermane5c05e12014-09-09 20:32:15932 mode.ConfigureFlag(SSL_MODE_CBC_RECORD_SPLITTING, true);
[email protected]fb10e2282010-12-01 17:08:48933
davidben818d93b2015-02-19 22:27:32934 mode.ConfigureFlag(SSL_MODE_ENABLE_FALSE_START,
[email protected]b788de02014-04-23 18:06:07935 ssl_config_.false_start_enabled);
936
davidbend80c12c2016-10-11 00:13:49937 SSL_set_mode(ssl_.get(), mode.set_mask);
938 SSL_clear_mode(ssl_.get(), mode.clear_mask);
[email protected]109805a2010-12-07 18:17:06939
petewilec5f5df222016-06-29 17:21:34940 std::string command;
mabe0d8c582016-08-12 02:06:40941 if (SSLClientSocket::IsPostQuantumExperimentEnabled()) {
petewilec5f5df222016-06-29 17:21:34942 // These are experimental, non-standard ciphersuites. They are part of an
943 // experiment in post-quantum cryptography. They're not intended to
944 // represent a de-facto standard, and will be removed from BoringSSL in
945 // ~2018.
946 if (EVP_has_aes_hardware()) {
947 command.append(
948 "CECPQ1-RSA-AES256-GCM-SHA384:"
949 "CECPQ1-ECDSA-AES256-GCM-SHA384:");
950 }
951 command.append(
952 "CECPQ1-RSA-CHACHA20-POLY1305-SHA256:"
953 "CECPQ1-ECDSA-CHACHA20-POLY1305-SHA256:");
954 if (!EVP_has_aes_hardware()) {
955 command.append(
956 "CECPQ1-RSA-AES256-GCM-SHA384:"
957 "CECPQ1-ECDSA-AES256-GCM-SHA384:");
958 }
959 }
davidben4177ecb2016-10-22 01:47:18960
961 // Use BoringSSL defaults, but disable HMAC-SHA256 and HMAC-SHA384 ciphers
davidbend406cdb2016-11-17 08:31:05962 // (note that SHA256 and SHA384 only select legacy CBC ciphers). Also disable
davidben4177ecb2016-10-22 01:47:18963 // DHE_RSA_WITH_AES_256_GCM_SHA384. Historically, AES_256_GCM was not
davidbend406cdb2016-11-17 08:31:05964 // supported. As DHE is being deprecated, don't add a cipher only to remove
965 // it immediately.
davidben4177ecb2016-10-22 01:47:18966 //
967 // TODO(davidben): Remove the DHE_RSA_WITH_AES_256_GCM_SHA384 exclusion when
968 // the DHEEnabled administrative policy expires.
davidbend406cdb2016-11-17 08:31:05969 command.append("ALL:!SHA256:!SHA384:!DHE-RSA-AES256-GCM-SHA384:!aPSK:!RC4");
davidben9b4a9b9c2015-10-12 18:46:51970
971 if (ssl_config_.require_ecdhe)
972 command.append(":!kRSA:!kDHE");
davidben8ecc3072014-09-03 23:19:09973
davidben68dcc582016-01-12 22:09:36974 if (!ssl_config_.deprecated_cipher_suites_enabled) {
davidben01d8e332015-11-20 17:08:58975 // Only offer DHE on the second handshake. https://crbug.com/538690
976 command.append(":!kDHE");
davidben91585692015-09-28 23:46:08977 }
davidbena4c9d062015-04-03 22:34:25978
davidbend406cdb2016-11-17 08:31:05979 // Additionally disable HMAC-SHA1 ciphers in ECDSA. These are the remaining
980 // CBC-mode ECDSA ciphers.
981 if (!AreLegacyECDSACiphersEnabled())
982 command.append("!ECDSA+SHA1");
983
davidben9b4a9b9c2015-10-12 18:46:51984 // Remove any disabled ciphers.
985 for (uint16_t id : ssl_config_.disabled_cipher_suites) {
986 const SSL_CIPHER* cipher = SSL_get_cipher_by_value(id);
987 if (cipher) {
988 command.append(":!");
989 command.append(SSL_CIPHER_get_name(cipher));
990 }
991 }
992
davidbend80c12c2016-10-11 00:13:49993 int rv = SSL_set_cipher_list(ssl_.get(), command.c_str());
[email protected]109805a2010-12-07 18:17:06994 // If this fails (rv = 0) it means there are no ciphers enabled on this SSL.
995 // This will almost certainly result in the socket failing to complete the
996 // handshake at which point the appropriate error is bubbled up to the client.
997 LOG_IF(WARNING, rv != 1) << "SSL_set_cipher_list('" << command << "') "
svaldeze83af292016-04-26 14:33:37998 "returned "
999 << rv;
[email protected]ee0f2aa82013-10-25 11:59:261000
1001 // TLS channel ids.
bnc3cf2a592016-08-11 14:48:361002 if (IsChannelIDEnabled()) {
davidbend80c12c2016-10-11 00:13:491003 SSL_enable_tls_channel_id(ssl_.get());
[email protected]ee0f2aa82013-10-25 11:59:261004 }
1005
bnc1f295372015-10-21 23:24:221006 if (!ssl_config_.alpn_protos.empty()) {
bnc988e68d2016-06-27 14:03:211007 std::vector<uint8_t> wire_protos =
1008 SerializeNextProtos(ssl_config_.alpn_protos);
davidbend80c12c2016-10-11 00:13:491009 SSL_set_alpn_protos(ssl_.get(),
1010 wire_protos.empty() ? NULL : &wire_protos[0],
[email protected]abc44b752014-07-30 03:52:151011 wire_protos.size());
1012 }
1013
davidbeneb5f8ef32014-09-04 14:14:321014 if (ssl_config_.signed_cert_timestamps_enabled) {
davidbend80c12c2016-10-11 00:13:491015 SSL_enable_signed_cert_timestamps(ssl_.get());
1016 SSL_enable_ocsp_stapling(ssl_.get());
davidbeneb5f8ef32014-09-04 14:14:321017 }
1018
davidben15f57132015-04-27 18:08:361019 if (cert_verifier_->SupportsOCSPStapling())
davidbend80c12c2016-10-11 00:13:491020 SSL_enable_ocsp_stapling(ssl_.get());
davidbeneb5f8ef32014-09-04 14:14:321021
[email protected]c8a80e92014-05-17 16:02:081022 return OK;
[email protected]d518cd92010-09-29 12:27:441023}
1024
svaldeze83af292016-04-26 14:33:371025void SSLClientSocketImpl::DoReadCallback(int rv) {
[email protected]b9b651f2013-11-09 04:32:221026 // Since Run may result in Read being called, clear |user_read_callback_|
1027 // up front.
[email protected]0dc88b32014-03-26 20:12:281028 if (rv > 0)
1029 was_ever_used_ = true;
[email protected]b9b651f2013-11-09 04:32:221030 user_read_buf_ = NULL;
1031 user_read_buf_len_ = 0;
1032 base::ResetAndReturn(&user_read_callback_).Run(rv);
1033}
1034
svaldeze83af292016-04-26 14:33:371035void SSLClientSocketImpl::DoWriteCallback(int rv) {
[email protected]b9b651f2013-11-09 04:32:221036 // Since Run may result in Write being called, clear |user_write_callback_|
1037 // up front.
[email protected]0dc88b32014-03-26 20:12:281038 if (rv > 0)
1039 was_ever_used_ = true;
[email protected]b9b651f2013-11-09 04:32:221040 user_write_buf_ = NULL;
1041 user_write_buf_len_ = 0;
1042 base::ResetAndReturn(&user_write_callback_).Run(rv);
1043}
1044
pkasting379234c2015-04-08 04:42:121045// TODO(cbentzel): Remove including "base/threading/thread_local.h" and
vadimt6b43dec22015-01-06 01:59:581046// g_first_run_completed once crbug.com/424386 is fixed.
1047base::LazyInstance<base::ThreadLocalBoolean>::Leaky g_first_run_completed =
1048 LAZY_INSTANCE_INITIALIZER;
1049
svaldeze83af292016-04-26 14:33:371050int SSLClientSocketImpl::DoHandshake() {
[email protected]b9b651f2013-11-09 04:32:221051 crypto::OpenSSLErrStackTracer err_tracer(FROM_HERE);
vadimt5a243282014-12-24 00:26:161052
1053 int rv;
1054
pkasting379234c2015-04-08 04:42:121055 // TODO(cbentzel): Leave only 1 call to SSL_do_handshake once crbug.com/424386
vadimt5a243282014-12-24 00:26:161056 // is fixed.
1057 if (ssl_config_.send_client_cert && ssl_config_.client_cert.get()) {
davidbend80c12c2016-10-11 00:13:491058 rv = SSL_do_handshake(ssl_.get());
vadimt5a243282014-12-24 00:26:161059 } else {
vadimt6b43dec22015-01-06 01:59:581060 if (g_first_run_completed.Get().Get()) {
pkasting379234c2015-04-08 04:42:121061 // TODO(cbentzel): Remove ScopedTracker below once crbug.com/424386 is
vadimt6b43dec22015-01-06 01:59:581062 // fixed.
pkasting379234c2015-04-08 04:42:121063 tracked_objects::ScopedTracker tracking_profile(
1064 FROM_HERE_WITH_EXPLICIT_FUNCTION("424386 SSL_do_handshake()"));
vadimt5a243282014-12-24 00:26:161065
davidbend80c12c2016-10-11 00:13:491066 rv = SSL_do_handshake(ssl_.get());
vadimt6b43dec22015-01-06 01:59:581067 } else {
1068 g_first_run_completed.Get().Set(true);
davidbend80c12c2016-10-11 00:13:491069 rv = SSL_do_handshake(ssl_.get());
vadimt6b43dec22015-01-06 01:59:581070 }
vadimt5a243282014-12-24 00:26:161071 }
[email protected]b9b651f2013-11-09 04:32:221072
davidbenc4212c02015-05-12 22:30:181073 int net_error = OK;
1074 if (rv <= 0) {
davidbend80c12c2016-10-11 00:13:491075 int ssl_error = SSL_get_error(ssl_.get(), rv);
[email protected]b9b651f2013-11-09 04:32:221076 if (ssl_error == SSL_ERROR_WANT_CHANNEL_ID_LOOKUP) {
[email protected]faff9852014-06-21 06:13:461077 // The server supports channel ID. Stop to look one up before returning to
1078 // the handshake.
rsleeviadbd4982016-06-13 22:10:271079 next_handshake_state_ = STATE_CHANNEL_ID_LOOKUP;
[email protected]faff9852014-06-21 06:13:461080 return OK;
[email protected]b9b651f2013-11-09 04:32:221081 }
davidbenced4aa9b2015-05-12 21:22:351082 if (ssl_error == SSL_ERROR_WANT_X509_LOOKUP &&
1083 !ssl_config_.send_client_cert) {
1084 return ERR_SSL_CLIENT_AUTH_CERT_NEEDED;
1085 }
davidben1d489522015-07-01 18:48:461086 if (ssl_error == SSL_ERROR_WANT_PRIVATE_KEY_OPERATION) {
svaldez7872fd02015-11-19 21:10:541087 DCHECK(ssl_config_.client_private_key);
davidben1d489522015-07-01 18:48:461088 DCHECK_NE(kNoPendingResult, signature_result_);
rsleeviadbd4982016-06-13 22:10:271089 next_handshake_state_ = STATE_HANDSHAKE;
davidben1d489522015-07-01 18:48:461090 return ERR_IO_PENDING;
1091 }
[email protected]b9b651f2013-11-09 04:32:221092
davidbena4409c62014-08-27 17:05:511093 OpenSSLErrorInfo error_info;
davidbenfe132d92016-09-27 18:07:211094 net_error = MapLastOpenSSLError(ssl_error, err_tracer, &error_info);
[email protected]b9b651f2013-11-09 04:32:221095 if (net_error == ERR_IO_PENDING) {
davidbenc4212c02015-05-12 22:30:181096 // If not done, stay in this state
rsleeviadbd4982016-06-13 22:10:271097 next_handshake_state_ = STATE_HANDSHAKE;
davidbenc4212c02015-05-12 22:30:181098 return ERR_IO_PENDING;
1099 }
1100
1101 LOG(ERROR) << "handshake failed; returned " << rv << ", SSL error code "
1102 << ssl_error << ", net_error " << net_error;
1103 net_log_.AddEvent(
mikecirone8b85c432016-09-08 19:11:001104 NetLogEventType::SSL_HANDSHAKE_ERROR,
davidbenc4212c02015-05-12 22:30:181105 CreateNetLogOpenSSLErrorCallback(net_error, ssl_error, error_info));
1106 }
1107
rsleeviadbd4982016-06-13 22:10:271108 next_handshake_state_ = STATE_HANDSHAKE_COMPLETE;
davidbenc4212c02015-05-12 22:30:181109 return net_error;
1110}
1111
svaldeze83af292016-04-26 14:33:371112int SSLClientSocketImpl::DoHandshakeComplete(int result) {
davidbenc4212c02015-05-12 22:30:181113 if (result < 0)
1114 return result;
1115
davidbenb4c25b62016-06-24 02:39:271116 // DHE is offered on the deprecated cipher fallback and then rejected
1117 // afterwards. This is to aid in diagnosing connection failures because a
1118 // server requires DHE ciphers.
1119 //
1120 // TODO(davidben): A few releases after DHE's removal, remove this logic.
1121 if (!ssl_config_.dhe_enabled &&
davidbend80c12c2016-10-11 00:13:491122 SSL_CIPHER_is_DHE(SSL_get_current_cipher(ssl_.get()))) {
davidbenb4c25b62016-06-24 02:39:271123 return ERR_SSL_OBSOLETE_CIPHER;
1124 }
1125
nharper736ceda2015-11-07 00:16:591126 // Check that if token binding was negotiated, then extended master secret
nharper78e6d2b2016-09-21 05:42:351127 // and renegotiation indication must also be negotiated.
1128 if (tb_was_negotiated_ &&
davidbend80c12c2016-10-11 00:13:491129 !(SSL_get_extms_support(ssl_.get()) &&
1130 SSL_get_secure_renegotiation_support(ssl_.get()))) {
nharper736ceda2015-11-07 00:16:591131 return ERR_SSL_PROTOCOL_ERROR;
nharper78e6d2b2016-09-21 05:42:351132 }
nharper736ceda2015-11-07 00:16:591133
bncce6ea242016-09-15 20:22:321134 const uint8_t* alpn_proto = NULL;
1135 unsigned alpn_len = 0;
davidbend80c12c2016-10-11 00:13:491136 SSL_get0_alpn_selected(ssl_.get(), &alpn_proto, &alpn_len);
bncce6ea242016-09-15 20:22:321137 if (alpn_len > 0) {
1138 base::StringPiece proto(reinterpret_cast<const char*>(alpn_proto),
1139 alpn_len);
1140 negotiated_protocol_ = NextProtoFromString(proto);
[email protected]b9b651f2013-11-09 04:32:221141 }
davidbenc4212c02015-05-12 22:30:181142
bncbd442c22016-09-14 20:49:161143 RecordNegotiatedProtocol();
bnc3cf2a592016-08-11 14:48:361144 RecordChannelIDSupport();
davidbenc4212c02015-05-12 22:30:181145
dadriand476e652016-07-26 21:33:241146 const uint8_t* ocsp_response_raw;
1147 size_t ocsp_response_len;
davidbend80c12c2016-10-11 00:13:491148 SSL_get0_ocsp_response(ssl_.get(), &ocsp_response_raw, &ocsp_response_len);
dadriand476e652016-07-26 21:33:241149 std::string ocsp_response;
1150 if (ocsp_response_len > 0) {
1151 ocsp_response_.assign(reinterpret_cast<const char*>(ocsp_response_raw),
1152 ocsp_response_len);
davidbenc4212c02015-05-12 22:30:181153 }
dadriand476e652016-07-26 21:33:241154 set_stapled_ocsp_response_received(ocsp_response_len != 0);
1155 UMA_HISTOGRAM_BOOLEAN("Net.OCSPResponseStapled", ocsp_response_len != 0);
davidbenc4212c02015-05-12 22:30:181156
1157 const uint8_t* sct_list;
1158 size_t sct_list_len;
davidbend80c12c2016-10-11 00:13:491159 SSL_get0_signed_cert_timestamp_list(ssl_.get(), &sct_list, &sct_list_len);
davidbenc4212c02015-05-12 22:30:181160 set_signed_cert_timestamps_received(sct_list_len != 0);
1161
1162 if (IsRenegotiationAllowed())
davidbend80c12c2016-10-11 00:13:491163 SSL_set_renegotiate_mode(ssl_.get(), ssl_renegotiate_freely);
davidbenc4212c02015-05-12 22:30:181164
davidbend80c12c2016-10-11 00:13:491165 uint16_t signature_algorithm = SSL_get_peer_signature_algorithm(ssl_.get());
davidben0653c8d2016-07-08 02:16:171166 if (signature_algorithm != 0) {
1167 UMA_HISTOGRAM_SPARSE_SLOWLY("Net.SSLSignatureAlgorithm",
1168 signature_algorithm);
davidben4fe4f982015-11-11 22:00:121169 }
1170
davidbenc4212c02015-05-12 22:30:181171 // Verify the certificate.
1172 UpdateServerCert();
rsleeviadbd4982016-06-13 22:10:271173 next_handshake_state_ = STATE_VERIFY_CERT;
davidbenc4212c02015-05-12 22:30:181174 return OK;
[email protected]b9b651f2013-11-09 04:32:221175}
1176
svaldeze83af292016-04-26 14:33:371177int SSLClientSocketImpl::DoChannelIDLookup() {
mikecironef22f9812016-10-04 03:40:191178 NetLogParametersCallback callback = base::Bind(
nharper49b27d992016-02-09 18:28:511179 &NetLogChannelIDLookupCallback, base::Unretained(channel_id_service_));
mikecirone8b85c432016-09-08 19:11:001180 net_log_.BeginEvent(NetLogEventType::SSL_GET_CHANNEL_ID, callback);
rsleeviadbd4982016-06-13 22:10:271181 next_handshake_state_ = STATE_CHANNEL_ID_LOOKUP_COMPLETE;
[email protected]6b8a3c742014-07-25 00:25:351182 return channel_id_service_->GetOrCreateChannelID(
nharper2e171cf2015-06-01 20:29:231183 host_and_port_.host(), &channel_id_key_,
svaldeze83af292016-04-26 14:33:371184 base::Bind(&SSLClientSocketImpl::OnHandshakeIOComplete,
[email protected]faff9852014-06-21 06:13:461185 base::Unretained(this)),
nharper75ade892015-06-10 19:05:351186 &channel_id_request_);
[email protected]faff9852014-06-21 06:13:461187}
1188
svaldeze83af292016-04-26 14:33:371189int SSLClientSocketImpl::DoChannelIDLookupComplete(int result) {
mikecirone8b85c432016-09-08 19:11:001190 net_log_.EndEvent(NetLogEventType::SSL_GET_CHANNEL_ID,
nharper49b27d992016-02-09 18:28:511191 base::Bind(&NetLogChannelIDLookupCompleteCallback,
1192 channel_id_key_.get(), result));
[email protected]faff9852014-06-21 06:13:461193 if (result < 0)
1194 return result;
1195
[email protected]faff9852014-06-21 06:13:461196 // Hand the key to OpenSSL. Check for error in case OpenSSL rejects the key
1197 // type.
davidben8a208fc2016-01-22 17:08:081198 DCHECK(channel_id_key_);
[email protected]faff9852014-06-21 06:13:461199 crypto::OpenSSLErrStackTracer err_tracer(FROM_HERE);
davidbend80c12c2016-10-11 00:13:491200 if (!SSL_set1_tls_channel_id(ssl_.get(), channel_id_key_->key())) {
[email protected]faff9852014-06-21 06:13:461201 LOG(ERROR) << "Failed to set Channel ID.";
davidbenf225b262016-09-15 22:09:221202 return ERR_FAILED;
[email protected]faff9852014-06-21 06:13:461203 }
1204
1205 // Return to the handshake.
davidben52053b382015-04-27 19:22:291206 channel_id_sent_ = true;
rsleeviadbd4982016-06-13 22:10:271207 next_handshake_state_ = STATE_HANDSHAKE;
[email protected]faff9852014-06-21 06:13:461208 return OK;
1209}
1210
svaldeze83af292016-04-26 14:33:371211int SSLClientSocketImpl::DoVerifyCert(int result) {
davidben30798ed82014-09-19 19:28:201212 DCHECK(!server_cert_chain_->empty());
davidben09c3d072014-08-25 20:33:581213 DCHECK(start_cert_verification_time_.is_null());
davidben30798ed82014-09-19 19:28:201214
rsleeviadbd4982016-06-13 22:10:271215 next_handshake_state_ = STATE_VERIFY_CERT_COMPLETE;
[email protected]b9b651f2013-11-09 04:32:221216
davidbenc6435a72015-08-17 18:28:521217 // OpenSSL decoded the certificate, but the platform certificate
1218 // implementation could not. This is treated as a fatal SSL-level protocol
1219 // error rather than a certificate error. See https://crbug.com/91341.
rsleevi74e99742016-09-13 20:35:251220 if (!server_cert_)
davidbenc6435a72015-08-17 18:28:521221 return ERR_SSL_SERVER_CERT_BAD_FORMAT;
1222
davidben30798ed82014-09-19 19:28:201223 // If the certificate is bad and has been previously accepted, use
1224 // the previous status and bypass the error.
[email protected]b9b651f2013-11-09 04:32:221225 CertStatus cert_status;
rsleevi74e99742016-09-13 20:35:251226 if (ssl_config_.IsAllowedBadCert(server_cert_.get(), &cert_status)) {
[email protected]b9b651f2013-11-09 04:32:221227 server_cert_verify_result_.Reset();
1228 server_cert_verify_result_.cert_status = cert_status;
1229 server_cert_verify_result_.verified_cert = server_cert_;
1230 return OK;
1231 }
1232
davidben09c3d072014-08-25 20:33:581233 start_cert_verification_time_ = base::TimeTicks::Now();
1234
eroman7f9236a2015-05-11 21:23:431235 return cert_verifier_->Verify(
rsleevi06bd78552016-06-08 22:34:461236 CertVerifier::RequestParams(server_cert_, host_and_port_.host(),
1237 ssl_config_.GetCertVerifyFlags(),
dadriand476e652016-07-26 21:33:241238 ocsp_response_, CertificateList()),
[email protected]591cffcd2014-08-18 20:02:301239 // TODO(davidben): Route the CRLSet through SSLConfig so
1240 // SSLClientSocket doesn't depend on SSLConfigService.
davidben15f57132015-04-27 18:08:361241 SSLConfigService::GetCRLSet().get(), &server_cert_verify_result_,
svaldeze83af292016-04-26 14:33:371242 base::Bind(&SSLClientSocketImpl::OnHandshakeIOComplete,
[email protected]b9b651f2013-11-09 04:32:221243 base::Unretained(this)),
eroman7f9236a2015-05-11 21:23:431244 &cert_verifier_request_, net_log_);
[email protected]b9b651f2013-11-09 04:32:221245}
1246
svaldeze83af292016-04-26 14:33:371247int SSLClientSocketImpl::DoVerifyCertComplete(int result) {
eroman7f9236a2015-05-11 21:23:431248 cert_verifier_request_.reset();
[email protected]b9b651f2013-11-09 04:32:221249
davidben09c3d072014-08-25 20:33:581250 if (!start_cert_verification_time_.is_null()) {
1251 base::TimeDelta verify_time =
1252 base::TimeTicks::Now() - start_cert_verification_time_;
1253 if (result == OK) {
1254 UMA_HISTOGRAM_TIMES("Net.SSLCertVerificationTime", verify_time);
1255 } else {
1256 UMA_HISTOGRAM_TIMES("Net.SSLCertVerificationTimeError", verify_time);
1257 }
1258 }
1259
rsleevi4a6ca8c2016-06-24 03:05:221260 // If the connection was good, check HPKP and CT status simultaneously,
1261 // but prefer to treat the HPKP error as more serious, if there was one.
[email protected]8bd4e7a2014-08-09 14:49:171262 const CertStatus cert_status = server_cert_verify_result_.cert_status;
rsleevi4a6ca8c2016-06-24 03:05:221263 if ((result == OK ||
dadrian8f8946652016-06-21 23:48:311264 (IsCertificateError(result) && IsCertStatusMinorError(cert_status)))) {
rsleevi4a6ca8c2016-06-24 03:05:221265 int ct_result = VerifyCT();
dadrian8f8946652016-06-21 23:48:311266 TransportSecurityState::PKPStatus pin_validity =
1267 transport_security_state_->CheckPublicKeyPins(
1268 host_and_port_, server_cert_verify_result_.is_issued_by_known_root,
1269 server_cert_verify_result_.public_key_hashes, server_cert_.get(),
1270 server_cert_verify_result_.verified_cert.get(),
1271 TransportSecurityState::ENABLE_PIN_REPORTS, &pinning_failure_log_);
1272 switch (pin_validity) {
1273 case TransportSecurityState::PKPStatus::VIOLATED:
1274 server_cert_verify_result_.cert_status |=
1275 CERT_STATUS_PINNED_KEY_MISSING;
1276 result = ERR_SSL_PINNED_KEY_NOT_IN_CERT_CHAIN;
1277 break;
1278 case TransportSecurityState::PKPStatus::BYPASSED:
1279 pkp_bypassed_ = true;
1280 // Fall through.
1281 case TransportSecurityState::PKPStatus::OK:
1282 // Do nothing.
1283 break;
rsleevi9545d342016-06-21 03:17:371284 }
rsleevi4a6ca8c2016-06-24 03:05:221285 if (result != ERR_SSL_PINNED_KEY_NOT_IN_CERT_CHAIN && ct_result != OK)
1286 result = ct_result;
[email protected]8bd4e7a2014-08-09 14:49:171287 }
1288
[email protected]b9b651f2013-11-09 04:32:221289 if (result == OK) {
davidbendafe4e52015-04-08 22:53:521290 DCHECK(!certificate_verified_);
1291 certificate_verified_ = true;
1292 MaybeCacheSession();
dadriand476e652016-07-26 21:33:241293 SSLInfo ssl_info;
1294 bool ok = GetSSLInfo(&ssl_info);
1295 DCHECK(ok);
1296 transport_security_state_->CheckExpectStaple(host_and_port_, ssl_info,
1297 ocsp_response_);
[email protected]b9b651f2013-11-09 04:32:221298 }
1299
[email protected]64b5c892014-08-08 09:39:261300 completed_connect_ = true;
[email protected]b9b651f2013-11-09 04:32:221301 // Exit DoHandshakeLoop and return the result to the caller to Connect.
1302 DCHECK_EQ(STATE_NONE, next_handshake_state_);
1303 return result;
1304}
1305
svaldeze83af292016-04-26 14:33:371306void SSLClientSocketImpl::DoConnectCallback(int rv) {
[email protected]b9b651f2013-11-09 04:32:221307 if (!user_connect_callback_.is_null()) {
1308 CompletionCallback c = user_connect_callback_;
1309 user_connect_callback_.Reset();
1310 c.Run(rv > OK ? OK : rv);
1311 }
1312}
1313
svaldeze83af292016-04-26 14:33:371314void SSLClientSocketImpl::UpdateServerCert() {
davidbend80c12c2016-10-11 00:13:491315 server_cert_chain_->Reset(SSL_get_peer_cert_chain(ssl_.get()));
[email protected]7f38da8a2014-03-17 16:44:261316 server_cert_ = server_cert_chain_->AsOSChain();
davidben30798ed82014-09-19 19:28:201317 if (server_cert_.get()) {
mikecirone8b85c432016-09-08 19:11:001318 net_log_.AddEvent(NetLogEventType::SSL_CERTIFICATES_RECEIVED,
svaldeze83af292016-04-26 14:33:371319 base::Bind(&NetLogX509CertificateCallback,
1320 base::Unretained(server_cert_.get())));
davidben30798ed82014-09-19 19:28:201321 }
[email protected]b9b651f2013-11-09 04:32:221322}
1323
svaldeze83af292016-04-26 14:33:371324void SSLClientSocketImpl::OnHandshakeIOComplete(int result) {
[email protected]b9b651f2013-11-09 04:32:221325 int rv = DoHandshakeLoop(result);
1326 if (rv != ERR_IO_PENDING) {
davidben281d13f02016-04-27 20:43:281327 LogConnectEndEvent(rv);
[email protected]b9b651f2013-11-09 04:32:221328 DoConnectCallback(rv);
1329 }
1330}
1331
svaldeze83af292016-04-26 14:33:371332int SSLClientSocketImpl::DoHandshakeLoop(int last_io_result) {
1333 TRACE_EVENT0("net", "SSLClientSocketImpl::DoHandshakeLoop");
[email protected]b9b651f2013-11-09 04:32:221334 int rv = last_io_result;
1335 do {
1336 // Default to STATE_NONE for next state.
1337 // (This is a quirk carried over from the windows
1338 // implementation. It makes reading the logs a bit harder.)
1339 // State handlers can and often do call GotoState just
1340 // to stay in the current state.
1341 State state = next_handshake_state_;
rsleeviadbd4982016-06-13 22:10:271342 next_handshake_state_ = STATE_NONE;
[email protected]b9b651f2013-11-09 04:32:221343 switch (state) {
1344 case STATE_HANDSHAKE:
1345 rv = DoHandshake();
1346 break;
davidbenc4212c02015-05-12 22:30:181347 case STATE_HANDSHAKE_COMPLETE:
1348 rv = DoHandshakeComplete(rv);
1349 break;
[email protected]faff9852014-06-21 06:13:461350 case STATE_CHANNEL_ID_LOOKUP:
1351 DCHECK_EQ(OK, rv);
1352 rv = DoChannelIDLookup();
svaldeze83af292016-04-26 14:33:371353 break;
[email protected]faff9852014-06-21 06:13:461354 case STATE_CHANNEL_ID_LOOKUP_COMPLETE:
1355 rv = DoChannelIDLookupComplete(rv);
1356 break;
[email protected]b9b651f2013-11-09 04:32:221357 case STATE_VERIFY_CERT:
[email protected]faff9852014-06-21 06:13:461358 DCHECK_EQ(OK, rv);
[email protected]b9b651f2013-11-09 04:32:221359 rv = DoVerifyCert(rv);
svaldeze83af292016-04-26 14:33:371360 break;
[email protected]b9b651f2013-11-09 04:32:221361 case STATE_VERIFY_CERT_COMPLETE:
1362 rv = DoVerifyCertComplete(rv);
1363 break;
1364 case STATE_NONE:
1365 default:
1366 rv = ERR_UNEXPECTED;
1367 NOTREACHED() << "unexpected state" << state;
1368 break;
1369 }
[email protected]b9b651f2013-11-09 04:32:221370 } while (rv != ERR_IO_PENDING && next_handshake_state_ != STATE_NONE);
1371 return rv;
1372}
1373
svaldeze83af292016-04-26 14:33:371374int SSLClientSocketImpl::DoPayloadRead() {
[email protected]b9b651f2013-11-09 04:32:221375 crypto::OpenSSLErrStackTracer err_tracer(FROM_HERE);
1376
davidben7e555daf2015-03-25 17:03:291377 DCHECK_LT(0, user_read_buf_len_);
1378 DCHECK(user_read_buf_.get());
1379
[email protected]b9b651f2013-11-09 04:32:221380 int rv;
davidben1d489522015-07-01 18:48:461381 if (pending_read_error_ != kNoPendingResult) {
[email protected]b9b651f2013-11-09 04:32:221382 rv = pending_read_error_;
davidben1d489522015-07-01 18:48:461383 pending_read_error_ = kNoPendingResult;
[email protected]b9b651f2013-11-09 04:32:221384 if (rv == 0) {
mikecirone8b85c432016-09-08 19:11:001385 net_log_.AddByteTransferEvent(NetLogEventType::SSL_SOCKET_BYTES_RECEIVED,
1386 rv, user_read_buf_->data());
davidbenb8c23212014-10-28 00:12:161387 } else {
1388 net_log_.AddEvent(
mikecirone8b85c432016-09-08 19:11:001389 NetLogEventType::SSL_READ_ERROR,
davidbenb8c23212014-10-28 00:12:161390 CreateNetLogOpenSSLErrorCallback(rv, pending_read_ssl_error_,
1391 pending_read_error_info_));
[email protected]b9b651f2013-11-09 04:32:221392 }
davidbenb8c23212014-10-28 00:12:161393 pending_read_ssl_error_ = SSL_ERROR_NONE;
1394 pending_read_error_info_ = OpenSSLErrorInfo();
[email protected]b9b651f2013-11-09 04:32:221395 return rv;
1396 }
1397
1398 int total_bytes_read = 0;
davidben7e555daf2015-03-25 17:03:291399 int ssl_ret;
[email protected]b9b651f2013-11-09 04:32:221400 do {
davidbend80c12c2016-10-11 00:13:491401 ssl_ret = SSL_read(ssl_.get(), user_read_buf_->data() + total_bytes_read,
davidben7e555daf2015-03-25 17:03:291402 user_read_buf_len_ - total_bytes_read);
1403 if (ssl_ret > 0)
1404 total_bytes_read += ssl_ret;
1405 } while (total_bytes_read < user_read_buf_len_ && ssl_ret > 0);
[email protected]b9b651f2013-11-09 04:32:221406
davidben7e555daf2015-03-25 17:03:291407 // Although only the final SSL_read call may have failed, the failure needs to
1408 // processed immediately, while the information still available in OpenSSL's
1409 // error queue.
davidbenced4aa9b2015-05-12 21:22:351410 if (ssl_ret <= 0) {
davidben7e555daf2015-03-25 17:03:291411 // A zero return from SSL_read may mean any of:
1412 // - The underlying BIO_read returned 0.
1413 // - The peer sent a close_notify.
1414 // - Any arbitrary error. https://crbug.com/466303
[email protected]b9b651f2013-11-09 04:32:221415 //
davidben7e555daf2015-03-25 17:03:291416 // TransportReadComplete converts the first to an ERR_CONNECTION_CLOSED
1417 // error, so it does not occur. The second and third are distinguished by
1418 // SSL_ERROR_ZERO_RETURN.
davidbend80c12c2016-10-11 00:13:491419 pending_read_ssl_error_ = SSL_get_error(ssl_.get(), ssl_ret);
davidben7e555daf2015-03-25 17:03:291420 if (pending_read_ssl_error_ == SSL_ERROR_ZERO_RETURN) {
1421 pending_read_error_ = 0;
davidbenced4aa9b2015-05-12 21:22:351422 } else if (pending_read_ssl_error_ == SSL_ERROR_WANT_X509_LOOKUP &&
1423 !ssl_config_.send_client_cert) {
1424 pending_read_error_ = ERR_SSL_CLIENT_AUTH_CERT_NEEDED;
davidben1d489522015-07-01 18:48:461425 } else if (pending_read_ssl_error_ ==
1426 SSL_ERROR_WANT_PRIVATE_KEY_OPERATION) {
svaldez7872fd02015-11-19 21:10:541427 DCHECK(ssl_config_.client_private_key);
davidben1d489522015-07-01 18:48:461428 DCHECK_NE(kNoPendingResult, signature_result_);
1429 pending_read_error_ = ERR_IO_PENDING;
davidben7e555daf2015-03-25 17:03:291430 } else {
davidbenfe132d92016-09-27 18:07:211431 pending_read_error_ = MapLastOpenSSLError(
davidben7e555daf2015-03-25 17:03:291432 pending_read_ssl_error_, err_tracer, &pending_read_error_info_);
[email protected]b9b651f2013-11-09 04:32:221433 }
1434
davidben7e555daf2015-03-25 17:03:291435 // Many servers do not reliably send a close_notify alert when shutting down
1436 // a connection, and instead terminate the TCP connection. This is reported
1437 // as ERR_CONNECTION_CLOSED. Because of this, map the unclean shutdown to a
1438 // graceful EOF, instead of treating it as an error as it should be.
1439 if (pending_read_error_ == ERR_CONNECTION_CLOSED)
1440 pending_read_error_ = 0;
1441 }
davidbenbe6ce7ec2014-10-20 19:15:561442
davidben7e555daf2015-03-25 17:03:291443 if (total_bytes_read > 0) {
1444 // Return any bytes read to the caller. The error will be deferred to the
1445 // next call of DoPayloadRead.
1446 rv = total_bytes_read;
davidbenbe6ce7ec2014-10-20 19:15:561447
davidben7e555daf2015-03-25 17:03:291448 // Do not treat insufficient data as an error to return in the next call to
1449 // DoPayloadRead() - instead, let the call fall through to check SSL_read()
davidben3418e81f2016-10-19 00:09:451450 // again. The transport may have data available by then.
davidben7e555daf2015-03-25 17:03:291451 if (pending_read_error_ == ERR_IO_PENDING)
davidben1d489522015-07-01 18:48:461452 pending_read_error_ = kNoPendingResult;
davidben7e555daf2015-03-25 17:03:291453 } else {
1454 // No bytes were returned. Return the pending read error immediately.
davidben1d489522015-07-01 18:48:461455 DCHECK_NE(kNoPendingResult, pending_read_error_);
davidben7e555daf2015-03-25 17:03:291456 rv = pending_read_error_;
davidben1d489522015-07-01 18:48:461457 pending_read_error_ = kNoPendingResult;
[email protected]b9b651f2013-11-09 04:32:221458 }
1459
1460 if (rv >= 0) {
mikecirone8b85c432016-09-08 19:11:001461 net_log_.AddByteTransferEvent(NetLogEventType::SSL_SOCKET_BYTES_RECEIVED,
1462 rv, user_read_buf_->data());
davidbenb8c23212014-10-28 00:12:161463 } else if (rv != ERR_IO_PENDING) {
1464 net_log_.AddEvent(
mikecirone8b85c432016-09-08 19:11:001465 NetLogEventType::SSL_READ_ERROR,
davidbenb8c23212014-10-28 00:12:161466 CreateNetLogOpenSSLErrorCallback(rv, pending_read_ssl_error_,
1467 pending_read_error_info_));
1468 pending_read_ssl_error_ = SSL_ERROR_NONE;
1469 pending_read_error_info_ = OpenSSLErrorInfo();
[email protected]b9b651f2013-11-09 04:32:221470 }
1471 return rv;
1472}
1473
svaldeze83af292016-04-26 14:33:371474int SSLClientSocketImpl::DoPayloadWrite() {
[email protected]b9b651f2013-11-09 04:32:221475 crypto::OpenSSLErrStackTracer err_tracer(FROM_HERE);
davidbend80c12c2016-10-11 00:13:491476 int rv = SSL_write(ssl_.get(), user_write_buf_->data(), user_write_buf_len_);
rsleevif020edc2015-03-16 19:31:241477
[email protected]b9b651f2013-11-09 04:32:221478 if (rv >= 0) {
mikecirone8b85c432016-09-08 19:11:001479 net_log_.AddByteTransferEvent(NetLogEventType::SSL_SOCKET_BYTES_SENT, rv,
[email protected]b9b651f2013-11-09 04:32:221480 user_write_buf_->data());
1481 return rv;
1482 }
1483
davidbend80c12c2016-10-11 00:13:491484 int ssl_error = SSL_get_error(ssl_.get(), rv);
davidben1d489522015-07-01 18:48:461485 if (ssl_error == SSL_ERROR_WANT_PRIVATE_KEY_OPERATION)
1486 return ERR_IO_PENDING;
davidbenb8c23212014-10-28 00:12:161487 OpenSSLErrorInfo error_info;
davidbenfe132d92016-09-27 18:07:211488 int net_error = MapLastOpenSSLError(ssl_error, err_tracer, &error_info);
davidbenb8c23212014-10-28 00:12:161489
1490 if (net_error != ERR_IO_PENDING) {
1491 net_log_.AddEvent(
mikecirone8b85c432016-09-08 19:11:001492 NetLogEventType::SSL_WRITE_ERROR,
davidbenb8c23212014-10-28 00:12:161493 CreateNetLogOpenSSLErrorCallback(net_error, ssl_error, error_info));
1494 }
1495 return net_error;
[email protected]b9b651f2013-11-09 04:32:221496}
1497
davidben3418e81f2016-10-19 00:09:451498void SSLClientSocketImpl::RetryAllOperations() {
1499 // SSL_do_handshake, SSL_read, and SSL_write may all be retried when blocked,
1500 // so retry all operations for simplicity. (Otherwise, SSL_get_error for each
1501 // operation may be remembered to retry only the blocked ones.)
1502
1503 if (next_handshake_state_ == STATE_HANDSHAKE) {
1504 // In handshake phase. The parameter to OnHandshakeIOComplete is unused.
1505 OnHandshakeIOComplete(OK);
1506 return;
1507 }
1508
davidben1d489522015-07-01 18:48:461509 int rv_read = ERR_IO_PENDING;
1510 int rv_write = ERR_IO_PENDING;
davidben3418e81f2016-10-19 00:09:451511 if (user_read_buf_)
1512 rv_read = DoPayloadRead();
1513 if (user_write_buf_)
1514 rv_write = DoPayloadWrite();
davidben1d489522015-07-01 18:48:461515
1516 // Performing the Read callback may cause |this| to be deleted. If this
1517 // happens, the Write callback should not be invoked. Guard against this by
1518 // holding a WeakPtr to |this| and ensuring it's still valid.
svaldeze83af292016-04-26 14:33:371519 base::WeakPtr<SSLClientSocketImpl> guard(weak_factory_.GetWeakPtr());
davidben3418e81f2016-10-19 00:09:451520 if (rv_read != ERR_IO_PENDING)
davidben1d489522015-07-01 18:48:461521 DoReadCallback(rv_read);
1522
1523 if (!guard.get())
1524 return;
1525
davidben3418e81f2016-10-19 00:09:451526 if (rv_write != ERR_IO_PENDING)
davidben1d489522015-07-01 18:48:461527 DoWriteCallback(rv_write);
1528}
1529
rsleevi4a6ca8c2016-06-24 03:05:221530int SSLClientSocketImpl::VerifyCT() {
rsleevi4a6ca8c2016-06-24 03:05:221531 const uint8_t* sct_list_raw;
1532 size_t sct_list_len;
davidbend80c12c2016-10-11 00:13:491533 SSL_get0_signed_cert_timestamp_list(ssl_.get(), &sct_list_raw, &sct_list_len);
rsleevi4a6ca8c2016-06-24 03:05:221534 std::string sct_list;
1535 if (sct_list_len > 0)
1536 sct_list.assign(reinterpret_cast<const char*>(sct_list_raw), sct_list_len);
1537
1538 // Note that this is a completely synchronous operation: The CT Log Verifier
1539 // gets all the data it needs for SCT verification and does not do any
1540 // external communication.
1541 cert_transparency_verifier_->Verify(
dadriand476e652016-07-26 21:33:241542 server_cert_verify_result_.verified_cert.get(), ocsp_response_, sct_list,
eranmdcec9632016-10-10 14:16:101543 &ct_verify_result_.scts, net_log_);
rsleevi4a6ca8c2016-06-24 03:05:221544
1545 ct_verify_result_.ct_policies_applied = true;
1546 ct_verify_result_.ev_policy_compliance =
1547 ct::EVPolicyCompliance::EV_POLICY_DOES_NOT_APPLY;
eranm4bed0b572016-08-14 21:00:351548
1549 SCTList verified_scts =
1550 ct::SCTsMatchingStatus(ct_verify_result_.scts, ct::SCT_STATUS_OK);
1551
rsleevi4a6ca8c2016-06-24 03:05:221552 if (server_cert_verify_result_.cert_status & CERT_STATUS_IS_EV) {
1553 scoped_refptr<ct::EVCertsWhitelist> ev_whitelist =
1554 SSLConfigService::GetEVCertsWhitelist();
1555 ct::EVPolicyCompliance ev_policy_compliance =
1556 policy_enforcer_->DoesConformToCTEVPolicy(
1557 server_cert_verify_result_.verified_cert.get(), ev_whitelist.get(),
eranm4bed0b572016-08-14 21:00:351558 verified_scts, net_log_);
rsleevi4a6ca8c2016-06-24 03:05:221559 ct_verify_result_.ev_policy_compliance = ev_policy_compliance;
1560 if (ev_policy_compliance !=
1561 ct::EVPolicyCompliance::EV_POLICY_DOES_NOT_APPLY &&
1562 ev_policy_compliance !=
1563 ct::EVPolicyCompliance::EV_POLICY_COMPLIES_VIA_WHITELIST &&
1564 ev_policy_compliance !=
1565 ct::EVPolicyCompliance::EV_POLICY_COMPLIES_VIA_SCTS) {
1566 server_cert_verify_result_.cert_status |=
1567 CERT_STATUS_CT_COMPLIANCE_FAILED;
1568 server_cert_verify_result_.cert_status &= ~CERT_STATUS_IS_EV;
1569 }
1570 }
1571 ct_verify_result_.cert_policy_compliance =
1572 policy_enforcer_->DoesConformToCertPolicy(
eranm4bed0b572016-08-14 21:00:351573 server_cert_verify_result_.verified_cert.get(), verified_scts,
1574 net_log_);
rsleevi4a6ca8c2016-06-24 03:05:221575
1576 if (ct_verify_result_.cert_policy_compliance !=
1577 ct::CertPolicyCompliance::CERT_POLICY_COMPLIES_VIA_SCTS &&
rsleeviec8e4312016-11-12 00:32:281578 ct_verify_result_.cert_policy_compliance !=
1579 ct::CertPolicyCompliance::CERT_POLICY_BUILD_NOT_TIMELY &&
rsleevi4a6ca8c2016-06-24 03:05:221580 transport_security_state_->ShouldRequireCT(
1581 host_and_port_.host(), server_cert_verify_result_.verified_cert.get(),
1582 server_cert_verify_result_.public_key_hashes)) {
1583 server_cert_verify_result_.cert_status |=
1584 CERT_STATUS_CERTIFICATE_TRANSPARENCY_REQUIRED;
1585 return ERR_CERTIFICATE_TRANSPARENCY_REQUIRED;
1586 }
1587
1588 return OK;
1589}
1590
svaldeze83af292016-04-26 14:33:371591int SSLClientSocketImpl::ClientCertRequestCallback(SSL* ssl) {
davidbend80c12c2016-10-11 00:13:491592 DCHECK(ssl == ssl_.get());
[email protected]82c59022014-08-15 09:38:271593
mikecirone8b85c432016-09-08 19:11:001594 net_log_.AddEvent(NetLogEventType::SSL_CLIENT_CERT_REQUESTED);
davidbenfe132d92016-09-27 18:07:211595 certificate_requested_ = true;
davidbenaf42cbe2014-11-13 03:27:461596
[email protected]82c59022014-08-15 09:38:271597 // Clear any currently configured certificates.
davidbend80c12c2016-10-11 00:13:491598 SSL_certs_clear(ssl_.get());
[email protected]97a854f2014-07-29 07:51:361599
1600#if defined(OS_IOS)
1601 // TODO(droger): Support client auth on iOS. See http://crbug.com/145954).
1602 LOG(WARNING) << "Client auth is not supported";
svaldeze83af292016-04-26 14:33:371603#else // !defined(OS_IOS)
[email protected]5ac981e182010-12-06 17:56:271604 if (!ssl_config_.send_client_cert) {
[email protected]515adc22013-01-09 16:01:231605 // First pass: we know that a client certificate is needed, but we do not
1606 // have one at hand.
svaldeze83af292016-04-26 14:33:371607 STACK_OF(X509_NAME)* authorities = SSL_get_client_CA_list(ssl);
[email protected]edfd0f42014-07-22 18:20:371608 for (size_t i = 0; i < sk_X509_NAME_num(authorities); i++) {
svaldeze83af292016-04-26 14:33:371609 X509_NAME* ca_name = (X509_NAME*)sk_X509_NAME_value(authorities, i);
[email protected]515adc22013-01-09 16:01:231610 unsigned char* str = NULL;
1611 int length = i2d_X509_NAME(ca_name, &str);
1612 cert_authorities_.push_back(std::string(
svaldeze83af292016-04-26 14:33:371613 reinterpret_cast<const char*>(str), static_cast<size_t>(length)));
[email protected]515adc22013-01-09 16:01:231614 OPENSSL_free(str);
1615 }
1616
[email protected]c0787702014-05-20 21:51:441617 const unsigned char* client_cert_types;
[email protected]e7e883e2014-07-25 06:03:081618 size_t num_client_cert_types =
1619 SSL_get0_certificate_types(ssl, &client_cert_types);
[email protected]c0787702014-05-20 21:51:441620 for (size_t i = 0; i < num_client_cert_types; i++) {
1621 cert_key_types_.push_back(
1622 static_cast<SSLClientCertType>(client_cert_types[i]));
1623 }
1624
davidbenced4aa9b2015-05-12 21:22:351625 // Suspends handshake. SSL_get_error will return SSL_ERROR_WANT_X509_LOOKUP.
1626 return -1;
[email protected]5ac981e182010-12-06 17:56:271627 }
1628
1629 // Second pass: a client certificate should have been selected.
[email protected]13914c92013-06-13 22:42:421630 if (ssl_config_.client_cert.get()) {
davidbend80c12c2016-10-11 00:13:491631 bssl::UniquePtr<X509> leaf_x509 =
[email protected]6bad5052014-07-12 01:25:131632 OSCertHandleToOpenSSL(ssl_config_.client_cert->os_cert_handle());
1633 if (!leaf_x509) {
1634 LOG(WARNING) << "Failed to import certificate";
1635 OpenSSLPutNetError(FROM_HERE, ERR_SSL_CLIENT_AUTH_CERT_BAD_FORMAT);
1636 return -1;
1637 }
1638
davidbend80c12c2016-10-11 00:13:491639 bssl::UniquePtr<STACK_OF(X509)> chain = OSCertHandlesToOpenSSL(
[email protected]82c59022014-08-15 09:38:271640 ssl_config_.client_cert->GetIntermediateCertificates());
1641 if (!chain) {
1642 LOG(WARNING) << "Failed to import intermediate certificates";
1643 OpenSSLPutNetError(FROM_HERE, ERR_SSL_CLIENT_AUTH_CERT_BAD_FORMAT);
1644 return -1;
1645 }
1646
davidbend80c12c2016-10-11 00:13:491647 if (!SSL_use_certificate(ssl_.get(), leaf_x509.get()) ||
1648 !SSL_set1_chain(ssl_.get(), chain.get())) {
davidben1d489522015-07-01 18:48:461649 LOG(WARNING) << "Failed to set client certificate";
1650 return -1;
1651 }
1652
svaldez7872fd02015-11-19 21:10:541653 if (!ssl_config_.client_private_key) {
1654 // The caller supplied a null private key. Fail the handshake and surface
1655 // an appropriate error to the caller.
davidben1d489522015-07-01 18:48:461656 LOG(WARNING) << "Client cert found without private key";
1657 OpenSSLPutNetError(FROM_HERE, ERR_SSL_CLIENT_AUTH_CERT_NO_PRIVATE_KEY);
1658 return -1;
1659 }
1660
davidbend80c12c2016-10-11 00:13:491661 SSL_set_private_key_method(ssl_.get(), &SSLContext::kPrivateKeyMethod);
svaldezf3db006f2015-09-29 16:43:581662
1663 std::vector<SSLPrivateKey::Hash> digest_prefs =
svaldez7872fd02015-11-19 21:10:541664 ssl_config_.client_private_key->GetDigestPreferences();
svaldezf3db006f2015-09-29 16:43:581665
1666 size_t digests_len = digest_prefs.size();
1667 std::vector<int> digests;
1668 for (size_t i = 0; i < digests_len; i++) {
1669 switch (digest_prefs[i]) {
1670 case SSLPrivateKey::Hash::SHA1:
1671 digests.push_back(NID_sha1);
1672 break;
1673 case SSLPrivateKey::Hash::SHA256:
1674 digests.push_back(NID_sha256);
1675 break;
1676 case SSLPrivateKey::Hash::SHA384:
1677 digests.push_back(NID_sha384);
1678 break;
1679 case SSLPrivateKey::Hash::SHA512:
1680 digests.push_back(NID_sha512);
1681 break;
1682 case SSLPrivateKey::Hash::MD5_SHA1:
1683 // MD5-SHA1 is not used in TLS 1.2.
1684 break;
1685 }
1686 }
1687
davidbend80c12c2016-10-11 00:13:491688 SSL_set_private_key_digest_prefs(ssl_.get(), digests.data(),
1689 digests.size());
davidbenaf42cbe2014-11-13 03:27:461690
1691 int cert_count = 1 + sk_X509_num(chain.get());
mikecirone8b85c432016-09-08 19:11:001692 net_log_.AddEvent(NetLogEventType::SSL_CLIENT_CERT_PROVIDED,
tfarina5e24b242015-10-27 13:11:281693 NetLog::IntCallback("cert_count", cert_count));
[email protected]6bad5052014-07-12 01:25:131694 return 1;
[email protected]c0787702014-05-20 21:51:441695 }
[email protected]97a854f2014-07-29 07:51:361696#endif // defined(OS_IOS)
[email protected]5ac981e182010-12-06 17:56:271697
1698 // Send no client certificate.
mikecirone8b85c432016-09-08 19:11:001699 net_log_.AddEvent(NetLogEventType::SSL_CLIENT_CERT_PROVIDED,
tfarina5e24b242015-10-27 13:11:281700 NetLog::IntCallback("cert_count", 0));
[email protected]82c59022014-08-15 09:38:271701 return 1;
[email protected]5ac981e182010-12-06 17:56:271702}
1703
svaldeze83af292016-04-26 14:33:371704int SSLClientSocketImpl::CertVerifyCallback(X509_STORE_CTX* store_ctx) {
[email protected]64b5c892014-08-08 09:39:261705 if (!completed_connect_) {
[email protected]b051cdb62014-02-28 02:20:161706 // If the first handshake hasn't completed then we accept any certificates
1707 // because we verify after the handshake.
1708 return 1;
1709 }
1710
davidben30798ed82014-09-19 19:28:201711 // Disallow the server certificate to change in a renegotiation.
1712 if (server_cert_chain_->empty()) {
[email protected]76e85392014-03-20 17:54:141713 LOG(ERROR) << "Received invalid certificate chain between handshakes";
davidben30798ed82014-09-19 19:28:201714 return 0;
1715 }
1716 base::StringPiece old_der, new_der;
1717 if (store_ctx->cert == NULL ||
1718 !x509_util::GetDER(server_cert_chain_->Get(0), &old_der) ||
1719 !x509_util::GetDER(store_ctx->cert, &new_der)) {
1720 LOG(ERROR) << "Failed to encode certificates";
1721 return 0;
1722 }
1723 if (old_der != new_der) {
[email protected]76e85392014-03-20 17:54:141724 LOG(ERROR) << "Server certificate changed between handshakes";
davidben30798ed82014-09-19 19:28:201725 return 0;
1726 }
1727
1728 return 1;
[email protected]b051cdb62014-02-28 02:20:161729}
1730
svaldeze83af292016-04-26 14:33:371731void SSLClientSocketImpl::MaybeCacheSession() {
davidben44aeae62015-06-24 20:47:431732 // Only cache the session once both a new session has been established and the
1733 // certificate has been verified. Due to False Start, these events may happen
1734 // in either order.
davidbenc269cc4b2016-07-27 14:55:031735 if (!pending_session_ || !certificate_verified_)
davidbendafe4e52015-04-08 22:53:521736 return;
davidbendafe4e52015-04-08 22:53:521737
1738 SSLContext::GetInstance()->session_cache()->Insert(GetSessionCacheKey(),
davidbenc269cc4b2016-07-27 14:55:031739 pending_session_.get());
1740 pending_session_ = nullptr;
davidbendafe4e52015-04-08 22:53:521741}
1742
svaldeze83af292016-04-26 14:33:371743int SSLClientSocketImpl::NewSessionCallback(SSL_SESSION* session) {
davidbenc269cc4b2016-07-27 14:55:031744 // OpenSSL passes a reference to |session|.
1745 pending_session_.reset(session);
davidbendafe4e52015-04-08 22:53:521746 MaybeCacheSession();
davidben44aeae62015-06-24 20:47:431747 return 1;
davidbendafe4e52015-04-08 22:53:521748}
1749
svaldeze83af292016-04-26 14:33:371750void SSLClientSocketImpl::AddCTInfoToSSLInfo(SSLInfo* ssl_info) const {
estark723b5eeb2016-02-18 21:01:121751 ssl_info->UpdateCertificateTransparencyInfo(ct_verify_result_);
davidbeneb5f8ef32014-09-04 14:14:321752}
1753
svaldeze83af292016-04-26 14:33:371754std::string SSLClientSocketImpl::GetSessionCacheKey() const {
rsleevif020edc2015-03-16 19:31:241755 std::string result = host_and_port_.ToString();
1756 result.append("/");
1757 result.append(ssl_session_cache_shard_);
1758
davidbena4c9d062015-04-03 22:34:251759 result.append("/");
davidben14b1a532015-10-30 16:01:091760 if (ssl_config_.deprecated_cipher_suites_enabled)
davidbena4c9d062015-04-03 22:34:251761 result.append("deprecated");
1762
davidbenee39de02015-10-16 19:53:181763 result.append("/");
1764 if (ssl_config_.channel_id_enabled)
1765 result.append("channelid");
1766
rsleevif020edc2015-03-16 19:31:241767 return result;
1768}
1769
svaldeze83af292016-04-26 14:33:371770bool SSLClientSocketImpl::IsRenegotiationAllowed() const {
nharper736ceda2015-11-07 00:16:591771 if (tb_was_negotiated_)
1772 return false;
1773
bncce6ea242016-09-15 20:22:321774 if (negotiated_protocol_ == kProtoUnknown)
davidben421116c2015-05-12 19:56:511775 return ssl_config_.renego_allowed_default;
1776
davidben421116c2015-05-12 19:56:511777 for (NextProto allowed : ssl_config_.renego_allowed_for_protos) {
bnc3cf2a592016-08-11 14:48:361778 if (negotiated_protocol_ == allowed)
davidben421116c2015-05-12 19:56:511779 return true;
1780 }
1781 return false;
1782}
1783
svaldeze83af292016-04-26 14:33:371784int SSLClientSocketImpl::PrivateKeyTypeCallback() {
svaldez7872fd02015-11-19 21:10:541785 switch (ssl_config_.client_private_key->GetType()) {
davidben1d489522015-07-01 18:48:461786 case SSLPrivateKey::Type::RSA:
davidben1c09a432016-10-13 19:17:341787 return NID_rsaEncryption;
1788 case SSLPrivateKey::Type::ECDSA_P256:
1789 return NID_X9_62_prime256v1;
1790 case SSLPrivateKey::Type::ECDSA_P384:
1791 return NID_secp384r1;
1792 case SSLPrivateKey::Type::ECDSA_P521:
1793 return NID_secp521r1;
davidben1d489522015-07-01 18:48:461794 }
1795 NOTREACHED();
davidben1c09a432016-10-13 19:17:341796 return NID_undef;
davidben1d489522015-07-01 18:48:461797}
1798
svaldeze83af292016-04-26 14:33:371799size_t SSLClientSocketImpl::PrivateKeyMaxSignatureLenCallback() {
svaldez7872fd02015-11-19 21:10:541800 return ssl_config_.client_private_key->GetMaxSignatureLengthInBytes();
davidben1d489522015-07-01 18:48:461801}
1802
davidben0bca07fd2016-07-18 15:12:031803ssl_private_key_result_t SSLClientSocketImpl::PrivateKeySignDigestCallback(
davidben1d489522015-07-01 18:48:461804 uint8_t* out,
1805 size_t* out_len,
1806 size_t max_out,
1807 const EVP_MD* md,
1808 const uint8_t* in,
1809 size_t in_len) {
1810 DCHECK_EQ(kNoPendingResult, signature_result_);
1811 DCHECK(signature_.empty());
svaldez7872fd02015-11-19 21:10:541812 DCHECK(ssl_config_.client_private_key);
davidben1d489522015-07-01 18:48:461813
davidben1d489522015-07-01 18:48:461814 SSLPrivateKey::Hash hash;
1815 if (!EVP_MDToPrivateKeyHash(md, &hash)) {
1816 OpenSSLPutNetError(FROM_HERE, ERR_SSL_CLIENT_AUTH_SIGNATURE_FAILED);
1817 return ssl_private_key_failure;
1818 }
1819
davidben752bcf22015-12-21 22:55:501820 net_log_.BeginEvent(
mikecirone8b85c432016-09-08 19:11:001821 NetLogEventType::SSL_PRIVATE_KEY_OP,
davidben752bcf22015-12-21 22:55:501822 base::Bind(&NetLogPrivateKeyOperationCallback,
1823 ssl_config_.client_private_key->GetType(), hash));
1824
davidben1d489522015-07-01 18:48:461825 signature_result_ = ERR_IO_PENDING;
svaldez7872fd02015-11-19 21:10:541826 ssl_config_.client_private_key->SignDigest(
davidben1d489522015-07-01 18:48:461827 hash, base::StringPiece(reinterpret_cast<const char*>(in), in_len),
davidben0bca07fd2016-07-18 15:12:031828 base::Bind(&SSLClientSocketImpl::OnPrivateKeyComplete,
davidben1d489522015-07-01 18:48:461829 weak_factory_.GetWeakPtr()));
1830 return ssl_private_key_retry;
1831}
1832
davidben0bca07fd2016-07-18 15:12:031833ssl_private_key_result_t SSLClientSocketImpl::PrivateKeyCompleteCallback(
davidben1d489522015-07-01 18:48:461834 uint8_t* out,
1835 size_t* out_len,
1836 size_t max_out) {
1837 DCHECK_NE(kNoPendingResult, signature_result_);
svaldez7872fd02015-11-19 21:10:541838 DCHECK(ssl_config_.client_private_key);
davidben1d489522015-07-01 18:48:461839
1840 if (signature_result_ == ERR_IO_PENDING)
1841 return ssl_private_key_retry;
1842 if (signature_result_ != OK) {
1843 OpenSSLPutNetError(FROM_HERE, signature_result_);
1844 return ssl_private_key_failure;
1845 }
1846 if (signature_.size() > max_out) {
1847 OpenSSLPutNetError(FROM_HERE, ERR_SSL_CLIENT_AUTH_SIGNATURE_FAILED);
1848 return ssl_private_key_failure;
1849 }
davidben5f8b6bc2015-11-25 03:19:541850 memcpy(out, signature_.data(), signature_.size());
davidben1d489522015-07-01 18:48:461851 *out_len = signature_.size();
1852 signature_.clear();
1853 return ssl_private_key_success;
1854}
1855
davidben0bca07fd2016-07-18 15:12:031856void SSLClientSocketImpl::OnPrivateKeyComplete(
davidben1d489522015-07-01 18:48:461857 Error error,
1858 const std::vector<uint8_t>& signature) {
1859 DCHECK_EQ(ERR_IO_PENDING, signature_result_);
1860 DCHECK(signature_.empty());
svaldez7872fd02015-11-19 21:10:541861 DCHECK(ssl_config_.client_private_key);
davidben1d489522015-07-01 18:48:461862
mikecirone8b85c432016-09-08 19:11:001863 net_log_.EndEventWithNetErrorCode(NetLogEventType::SSL_PRIVATE_KEY_OP, error);
davidben1d489522015-07-01 18:48:461864
1865 signature_result_ = error;
1866 if (signature_result_ == OK)
1867 signature_ = signature;
1868
davidben1d489522015-07-01 18:48:461869 // During a renegotiation, either Read or Write calls may be blocked on an
1870 // asynchronous private key operation.
davidben3418e81f2016-10-19 00:09:451871 RetryAllOperations();
davidben1d489522015-07-01 18:48:461872}
1873
svaldeze83af292016-04-26 14:33:371874int SSLClientSocketImpl::TokenBindingAdd(const uint8_t** out,
1875 size_t* out_len,
1876 int* out_alert_value) {
nharper736ceda2015-11-07 00:16:591877 if (ssl_config_.token_binding_params.empty()) {
1878 return 0;
1879 }
davidbend80c12c2016-10-11 00:13:491880 bssl::ScopedCBB output;
nharper736ceda2015-11-07 00:16:591881 CBB parameters_list;
1882 if (!CBB_init(output.get(), 7) ||
1883 !CBB_add_u8(output.get(), kTbProtocolVersionMajor) ||
1884 !CBB_add_u8(output.get(), kTbProtocolVersionMinor) ||
1885 !CBB_add_u8_length_prefixed(output.get(), &parameters_list)) {
1886 *out_alert_value = SSL_AD_INTERNAL_ERROR;
1887 return -1;
1888 }
1889 for (size_t i = 0; i < ssl_config_.token_binding_params.size(); ++i) {
1890 if (!CBB_add_u8(&parameters_list, ssl_config_.token_binding_params[i])) {
1891 *out_alert_value = SSL_AD_INTERNAL_ERROR;
1892 return -1;
1893 }
1894 }
1895 // |*out| will be freed by TokenBindingFreeCallback.
1896 if (!CBB_finish(output.get(), const_cast<uint8_t**>(out), out_len)) {
1897 *out_alert_value = SSL_AD_INTERNAL_ERROR;
1898 return -1;
1899 }
1900
1901 return 1;
1902}
1903
svaldeze83af292016-04-26 14:33:371904int SSLClientSocketImpl::TokenBindingParse(const uint8_t* contents,
1905 size_t contents_len,
1906 int* out_alert_value) {
nharper736ceda2015-11-07 00:16:591907 if (completed_connect_) {
1908 // Token Binding may only be negotiated on the initial handshake.
1909 *out_alert_value = SSL_AD_ILLEGAL_PARAMETER;
1910 return 0;
1911 }
1912
1913 CBS extension;
1914 CBS_init(&extension, contents, contents_len);
1915
1916 CBS parameters_list;
1917 uint8_t version_major, version_minor, param;
1918 if (!CBS_get_u8(&extension, &version_major) ||
1919 !CBS_get_u8(&extension, &version_minor) ||
1920 !CBS_get_u8_length_prefixed(&extension, &parameters_list) ||
1921 !CBS_get_u8(&parameters_list, &param) || CBS_len(&parameters_list) > 0 ||
1922 CBS_len(&extension) > 0) {
1923 *out_alert_value = SSL_AD_DECODE_ERROR;
1924 return 0;
1925 }
1926 // The server-negotiated version must be less than or equal to our version.
1927 if (version_major > kTbProtocolVersionMajor ||
1928 (version_minor > kTbProtocolVersionMinor &&
1929 version_major == kTbProtocolVersionMajor)) {
1930 *out_alert_value = SSL_AD_ILLEGAL_PARAMETER;
1931 return 0;
1932 }
1933 // If the version the server negotiated is older than we support, don't fail
1934 // parsing the extension, but also don't set |negotiated_|.
1935 if (version_major < kTbMinProtocolVersionMajor ||
1936 (version_minor < kTbMinProtocolVersionMinor &&
1937 version_major == kTbMinProtocolVersionMajor)) {
1938 return 1;
1939 }
1940
1941 for (size_t i = 0; i < ssl_config_.token_binding_params.size(); ++i) {
1942 if (param == ssl_config_.token_binding_params[i]) {
1943 tb_negotiated_param_ = ssl_config_.token_binding_params[i];
1944 tb_was_negotiated_ = true;
1945 return 1;
1946 }
1947 }
1948
1949 *out_alert_value = SSL_AD_ILLEGAL_PARAMETER;
1950 return 0;
1951}
1952
davidben281d13f02016-04-27 20:43:281953void SSLClientSocketImpl::LogConnectEndEvent(int rv) {
1954 if (rv != OK) {
mikecirone8b85c432016-09-08 19:11:001955 net_log_.EndEventWithNetErrorCode(NetLogEventType::SSL_CONNECT, rv);
davidben281d13f02016-04-27 20:43:281956 return;
1957 }
1958
mikecirone8b85c432016-09-08 19:11:001959 net_log_.EndEvent(NetLogEventType::SSL_CONNECT,
davidben281d13f02016-04-27 20:43:281960 base::Bind(&NetLogSSLInfoCallback, base::Unretained(this)));
1961}
1962
bncbd442c22016-09-14 20:49:161963void SSLClientSocketImpl::RecordNegotiatedProtocol() const {
1964 UMA_HISTOGRAM_ENUMERATION("Net.SSLNegotiatedAlpnProtocol",
1965 negotiated_protocol_, kProtoLast + 1);
bnc3cf2a592016-08-11 14:48:361966}
1967
1968void SSLClientSocketImpl::RecordChannelIDSupport() const {
1969 // Since this enum is used for a histogram, do not change or re-use values.
1970 enum {
1971 DISABLED = 0,
1972 CLIENT_ONLY = 1,
1973 CLIENT_AND_SERVER = 2,
1974 // CLIENT_NO_ECC is unused now.
1975 // CLIENT_BAD_SYSTEM_TIME is unused now.
1976 CLIENT_BAD_SYSTEM_TIME = 4,
1977 CLIENT_NO_CHANNEL_ID_SERVICE = 5,
1978 CHANNEL_ID_USAGE_MAX
1979 } supported = DISABLED;
1980 if (channel_id_sent_) {
1981 supported = CLIENT_AND_SERVER;
1982 } else if (ssl_config_.channel_id_enabled) {
1983 if (!channel_id_service_)
1984 supported = CLIENT_NO_CHANNEL_ID_SERVICE;
1985 else
1986 supported = CLIENT_ONLY;
1987 }
1988 UMA_HISTOGRAM_ENUMERATION("DomainBoundCerts.Support", supported,
1989 CHANNEL_ID_USAGE_MAX);
1990}
1991
1992bool SSLClientSocketImpl::IsChannelIDEnabled() const {
1993 return ssl_config_.channel_id_enabled && channel_id_service_;
1994}
1995
davidbenfe132d92016-09-27 18:07:211996int SSLClientSocketImpl::MapLastOpenSSLError(
1997 int ssl_error,
1998 const crypto::OpenSSLErrStackTracer& tracer,
1999 OpenSSLErrorInfo* info) {
2000 int net_error = MapOpenSSLErrorWithDetails(ssl_error, tracer, info);
2001
2002 if (ssl_error == SSL_ERROR_SSL &&
2003 ERR_GET_LIB(info->error_code) == ERR_LIB_SSL) {
2004 // TLS does not provide an alert for missing client certificates, so most
2005 // servers send a generic handshake_failure alert. Detect this case by
2006 // checking if we have received a CertificateRequest but sent no
2007 // certificate. See https://crbug.com/646567.
2008 if (ERR_GET_REASON(info->error_code) ==
2009 SSL_R_SSLV3_ALERT_HANDSHAKE_FAILURE &&
2010 certificate_requested_ && ssl_config_.send_client_cert &&
2011 !ssl_config_.client_cert) {
2012 net_error = ERR_BAD_SSL_CLIENT_AUTH_CERT;
2013 }
2014
2015 // Per spec, access_denied is only for client-certificate-based access
2016 // control, but some buggy firewalls use it when blocking a page. To avoid a
2017 // confusing error, map it to a generic protocol error if no
2018 // CertificateRequest was sent. See https://crbug.com/630883.
2019 if (ERR_GET_REASON(info->error_code) == SSL_R_TLSV1_ALERT_ACCESS_DENIED &&
2020 !certificate_requested_) {
2021 net_error = ERR_SSL_PROTOCOL_ERROR;
2022 }
2023 }
2024
2025 return net_error;
2026}
2027
[email protected]7e5dd49f2010-12-08 18:33:492028} // namespace net