blob: 92861d4f8342b2dd9c812cd2610aa5629abb3730 [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"
xunjieli0b7f5b62016-12-06 20:43:4832#include "net/base/trace_constants.h"
[email protected]6e7845ae2013-03-29 21:48:1133#include "net/cert/cert_verifier.h"
eranmefbd3132014-10-28 16:35:1634#include "net/cert/ct_ev_whitelist.h"
estark6f9b3d82016-01-12 21:37:0535#include "net/cert/ct_policy_enforcer.h"
estark723b5eeb2016-02-18 21:01:1236#include "net/cert/ct_policy_status.h"
davidbeneb5f8ef32014-09-04 14:14:3237#include "net/cert/ct_verifier.h"
[email protected]6e7845ae2013-03-29 21:48:1138#include "net/cert/x509_certificate_net_log_param.h"
davidben30798ed82014-09-19 19:28:2039#include "net/cert/x509_util_openssl.h"
[email protected]8bd4e7a2014-08-09 14:49:1740#include "net/http/transport_security_state.h"
mikecironef22f9812016-10-04 03:40:1941#include "net/log/net_log.h"
mikecirone8b85c432016-09-08 19:11:0042#include "net/log/net_log_event_type.h"
mikecironef22f9812016-10-04 03:40:1943#include "net/log/net_log_parameters_callback.h"
[email protected]536fd0b2013-03-14 17:41:5744#include "net/ssl/ssl_cert_request_info.h"
davidben281d13f02016-04-27 20:43:2845#include "net/ssl/ssl_cipher_suite_names.h"
svaldeze83af292016-04-26 14:33:3746#include "net/ssl/ssl_client_session_cache.h"
[email protected]536fd0b2013-03-14 17:41:5747#include "net/ssl/ssl_connection_status_flags.h"
48#include "net/ssl/ssl_info.h"
davidben1d489522015-07-01 18:48:4649#include "net/ssl/ssl_private_key.h"
nharperd5cddca2016-02-27 03:37:5250#include "net/ssl/token_binding.h"
tfarinae8cb8aa2016-10-21 02:44:0151#include "third_party/boringssl/src/include/openssl/bio.h"
52#include "third_party/boringssl/src/include/openssl/bytestring.h"
53#include "third_party/boringssl/src/include/openssl/err.h"
54#include "third_party/boringssl/src/include/openssl/evp.h"
55#include "third_party/boringssl/src/include/openssl/mem.h"
56#include "third_party/boringssl/src/include/openssl/ssl.h"
[email protected]d518cd92010-09-29 12:27:4457
davidben2a811e4e2015-12-01 10:49:3458#if !defined(OS_NACL)
59#include "net/ssl/ssl_key_logger.h"
60#endif
61
svaldez2135be52016-04-20 16:34:5362#if defined(USE_NSS_CERTS)
davidbena477a70a2015-10-06 04:38:2963#include "net/cert_net/nss_ocsp.h"
64#endif
65
[email protected]d518cd92010-09-29 12:27:4466namespace net {
67
68namespace {
69
[email protected]4b768562013-02-16 04:10:0770// This constant can be any non-negative/non-zero value (eg: it does not
71// overlap with any value of the net::Error range, including net::OK).
davidben1d489522015-07-01 18:48:4672const int kNoPendingResult = 1;
[email protected]4b768562013-02-16 04:10:0773
haavardm2d92e722014-12-19 13:45:4474// Default size of the internal BoringSSL buffers.
mmenke1beda3d2016-07-22 03:33:4575const int kDefaultOpenSSLBufferSize = 17 * 1024;
haavardm2d92e722014-12-19 13:45:4476
nharper736ceda2015-11-07 00:16:5977// TLS extension number use for Token Binding.
nharperb5ad8a802016-02-05 19:40:0078const unsigned int kTbExtNum = 24;
nharper736ceda2015-11-07 00:16:5979
80// Token Binding ProtocolVersions supported.
81const uint8_t kTbProtocolVersionMajor = 0;
nharper78e6d2b2016-09-21 05:42:3582const uint8_t kTbProtocolVersionMinor = 10;
nharper736ceda2015-11-07 00:16:5983const uint8_t kTbMinProtocolVersionMajor = 0;
nharper78e6d2b2016-09-21 05:42:3584const uint8_t kTbMinProtocolVersionMinor = 10;
nharper736ceda2015-11-07 00:16:5985
davidben1d489522015-07-01 18:48:4686bool EVP_MDToPrivateKeyHash(const EVP_MD* md, SSLPrivateKey::Hash* hash) {
87 switch (EVP_MD_type(md)) {
88 case NID_md5_sha1:
89 *hash = SSLPrivateKey::Hash::MD5_SHA1;
90 return true;
91 case NID_sha1:
92 *hash = SSLPrivateKey::Hash::SHA1;
93 return true;
94 case NID_sha256:
95 *hash = SSLPrivateKey::Hash::SHA256;
96 return true;
97 case NID_sha384:
98 *hash = SSLPrivateKey::Hash::SHA384;
99 return true;
100 case NID_sha512:
101 *hash = SSLPrivateKey::Hash::SHA512;
102 return true;
103 default:
104 return false;
105 }
106}
107
danakj655b66c2016-04-16 00:51:38108std::unique_ptr<base::Value> NetLogPrivateKeyOperationCallback(
davidben752bcf22015-12-21 22:55:50109 SSLPrivateKey::Type type,
110 SSLPrivateKey::Hash hash,
111 NetLogCaptureMode mode) {
112 std::string type_str;
113 switch (type) {
114 case SSLPrivateKey::Type::RSA:
115 type_str = "RSA";
116 break;
davidben1c09a432016-10-13 19:17:34117 case SSLPrivateKey::Type::ECDSA_P256:
118 type_str = "ECDSA_P256";
119 break;
120 case SSLPrivateKey::Type::ECDSA_P384:
121 type_str = "ECDSA_P384";
122 break;
123 case SSLPrivateKey::Type::ECDSA_P521:
124 type_str = "ECDSA_P521";
davidben752bcf22015-12-21 22:55:50125 break;
126 }
127
128 std::string hash_str;
129 switch (hash) {
130 case SSLPrivateKey::Hash::MD5_SHA1:
131 hash_str = "MD5_SHA1";
132 break;
133 case SSLPrivateKey::Hash::SHA1:
134 hash_str = "SHA1";
135 break;
136 case SSLPrivateKey::Hash::SHA256:
137 hash_str = "SHA256";
138 break;
139 case SSLPrivateKey::Hash::SHA384:
140 hash_str = "SHA384";
141 break;
142 case SSLPrivateKey::Hash::SHA512:
143 hash_str = "SHA512";
144 break;
145 }
146
danakj655b66c2016-04-16 00:51:38147 std::unique_ptr<base::DictionaryValue> value(new base::DictionaryValue);
davidben752bcf22015-12-21 22:55:50148 value->SetString("type", type_str);
149 value->SetString("hash", hash_str);
150 return std::move(value);
151}
152
danakj655b66c2016-04-16 00:51:38153std::unique_ptr<base::Value> NetLogChannelIDLookupCallback(
nharper49b27d992016-02-09 18:28:51154 ChannelIDService* channel_id_service,
155 NetLogCaptureMode capture_mode) {
156 ChannelIDStore* store = channel_id_service->GetChannelIDStore();
danakj655b66c2016-04-16 00:51:38157 std::unique_ptr<base::DictionaryValue> dict(new base::DictionaryValue());
nharper49b27d992016-02-09 18:28:51158 dict->SetBoolean("ephemeral", store->IsEphemeral());
159 dict->SetString("service", base::HexEncode(&channel_id_service,
160 sizeof(channel_id_service)));
161 dict->SetString("store", base::HexEncode(&store, sizeof(store)));
162 return std::move(dict);
163}
164
danakj655b66c2016-04-16 00:51:38165std::unique_ptr<base::Value> NetLogChannelIDLookupCompleteCallback(
nharper49b27d992016-02-09 18:28:51166 crypto::ECPrivateKey* key,
167 int result,
168 NetLogCaptureMode capture_mode) {
danakj655b66c2016-04-16 00:51:38169 std::unique_ptr<base::DictionaryValue> dict(new base::DictionaryValue());
nharper49b27d992016-02-09 18:28:51170 dict->SetInteger("net_error", result);
171 std::string raw_key;
172 if (result == OK && key && key->ExportRawPublicKey(&raw_key)) {
173 std::string key_to_log = "redacted";
174 if (capture_mode.include_cookies_and_credentials()) {
175 key_to_log = base::HexEncode(raw_key.data(), raw_key.length());
176 }
177 dict->SetString("key", key_to_log);
178 }
179 return std::move(dict);
180}
181
davidben281d13f02016-04-27 20:43:28182std::unique_ptr<base::Value> NetLogSSLInfoCallback(
183 SSLClientSocketImpl* socket,
184 NetLogCaptureMode capture_mode) {
185 SSLInfo ssl_info;
186 if (!socket->GetSSLInfo(&ssl_info))
187 return nullptr;
188
189 std::unique_ptr<base::DictionaryValue> dict(new base::DictionaryValue());
190 const char* version_str;
191 SSLVersionToString(&version_str,
192 SSLConnectionStatusToVersion(ssl_info.connection_status));
193 dict->SetString("version", version_str);
194 dict->SetBoolean("is_resumed",
195 ssl_info.handshake_type == SSLInfo::HANDSHAKE_RESUME);
196 dict->SetInteger("cipher_suite", SSLConnectionStatusToCipherSuite(
197 ssl_info.connection_status));
198
bnc3472afd2016-11-17 15:27:21199 dict->SetString("next_proto",
200 NextProtoToString(socket->GetNegotiatedProtocol()));
davidben281d13f02016-04-27 20:43:28201
202 return std::move(dict);
203}
204
davidben3418e81f2016-10-19 00:09:45205int GetBufferSize(const char* field_trial) {
206 // Get buffer sizes from field trials, if possible. If values not present,
207 // use default. Also make sure values are in reasonable range.
208 int buffer_size = kDefaultOpenSSLBufferSize;
209#if !defined(OS_NACL)
210 int override_buffer_size;
211 if (base::StringToInt(base::FieldTrialList::FindFullName(field_trial),
212 &override_buffer_size)) {
213 buffer_size = override_buffer_size;
214 buffer_size = std::max(buffer_size, 1000);
215 buffer_size = std::min(buffer_size, 2 * kDefaultOpenSSLBufferSize);
216 }
217#endif // !defined(OS_NACL)
218 return buffer_size;
219}
220
davidbend406cdb2016-11-17 08:31:05221#if defined(OS_NACL)
222bool AreLegacyECDSACiphersEnabled() {
223 return false;
224}
225#else
226// TODO(davidben): Remove this after the ECDSA CBC removal sticks.
227// https:/crbug.com/666191.
228const base::Feature kLegacyECDSACiphersFeature{
229 "SSLLegacyECDSACiphers", base::FEATURE_DISABLED_BY_DEFAULT};
230
231bool AreLegacyECDSACiphersEnabled() {
232 return base::FeatureList::IsEnabled(kLegacyECDSACiphersFeature);
233}
234#endif
235
[email protected]821e3bb2013-11-08 01:06:01236} // namespace
237
svaldeze83af292016-04-26 14:33:37238class SSLClientSocketImpl::SSLContext {
[email protected]fbef13932010-11-23 12:38:53239 public:
olli.raula36aa8be2015-09-10 11:14:22240 static SSLContext* GetInstance() {
241 return base::Singleton<SSLContext>::get();
242 }
[email protected]fbef13932010-11-23 12:38:53243 SSL_CTX* ssl_ctx() { return ssl_ctx_.get(); }
svaldeze83af292016-04-26 14:33:37244 SSLClientSessionCache* session_cache() { return &session_cache_; }
[email protected]fbef13932010-11-23 12:38:53245
svaldeze83af292016-04-26 14:33:37246 SSLClientSocketImpl* GetClientSocketFromSSL(const SSL* ssl) {
[email protected]fbef13932010-11-23 12:38:53247 DCHECK(ssl);
svaldeze83af292016-04-26 14:33:37248 SSLClientSocketImpl* socket = static_cast<SSLClientSocketImpl*>(
[email protected]fbef13932010-11-23 12:38:53249 SSL_get_ex_data(ssl, ssl_socket_data_index_));
250 DCHECK(socket);
251 return socket;
252 }
253
svaldeze83af292016-04-26 14:33:37254 bool SetClientSocketForSSL(SSL* ssl, SSLClientSocketImpl* socket) {
[email protected]fbef13932010-11-23 12:38:53255 return SSL_set_ex_data(ssl, ssl_socket_data_index_, socket) != 0;
256 }
257
davidben2a811e4e2015-12-01 10:49:34258#if !defined(OS_NACL)
259 void SetSSLKeyLogFile(
260 const base::FilePath& path,
261 const scoped_refptr<base::SequencedTaskRunner>& task_runner) {
262 DCHECK(!ssl_key_logger_);
263 ssl_key_logger_.reset(new SSLKeyLogger(path, task_runner));
264 SSL_CTX_set_keylog_callback(ssl_ctx_.get(), KeyLogCallback);
265 }
266#endif
267
davidben1d489522015-07-01 18:48:46268 static const SSL_PRIVATE_KEY_METHOD kPrivateKeyMethod;
269
[email protected]fbef13932010-11-23 12:38:53270 private:
olli.raula36aa8be2015-09-10 11:14:22271 friend struct base::DefaultSingletonTraits<SSLContext>;
[email protected]fbef13932010-11-23 12:38:53272
svaldeze83af292016-04-26 14:33:37273 SSLContext() : session_cache_(SSLClientSessionCache::Config()) {
[email protected]4b559b4d2011-04-14 17:37:14274 crypto::EnsureOpenSSLInit();
[email protected]fbef13932010-11-23 12:38:53275 ssl_socket_data_index_ = SSL_get_ex_new_index(0, 0, 0, 0, 0);
276 DCHECK_NE(ssl_socket_data_index_, -1);
277 ssl_ctx_.reset(SSL_CTX_new(SSLv23_client_method()));
[email protected]b051cdb62014-02-28 02:20:16278 SSL_CTX_set_cert_verify_callback(ssl_ctx_.get(), CertVerifyCallback, NULL);
[email protected]82c59022014-08-15 09:38:27279 SSL_CTX_set_cert_cb(ssl_ctx_.get(), ClientCertRequestCallback, NULL);
[email protected]b051cdb62014-02-28 02:20:16280 SSL_CTX_set_verify(ssl_ctx_.get(), SSL_VERIFY_PEER, NULL);
davidbendafe4e52015-04-08 22:53:52281
282 // Disable the internal session cache. Session caching is handled
svaldeze83af292016-04-26 14:33:37283 // externally (i.e. by SSLClientSessionCache).
davidbendafe4e52015-04-08 22:53:52284 SSL_CTX_set_session_cache_mode(
285 ssl_ctx_.get(), SSL_SESS_CACHE_CLIENT | SSL_SESS_CACHE_NO_INTERNAL);
davidben44aeae62015-06-24 20:47:43286 SSL_CTX_sess_set_new_cb(ssl_ctx_.get(), NewSessionCallback);
davidben99ce6302016-11-09 17:30:28287 SSL_CTX_set_timeout(ssl_ctx_.get(), 1 * 60 * 60 /* one hour */);
nharper736ceda2015-11-07 00:16:59288
davidbenfacfac7b2016-09-27 22:39:53289 SSL_CTX_set_grease_enabled(ssl_ctx_.get(), 1);
290
nharper736ceda2015-11-07 00:16:59291 if (!SSL_CTX_add_client_custom_ext(ssl_ctx_.get(), kTbExtNum,
292 &TokenBindingAddCallback,
293 &TokenBindingFreeCallback, nullptr,
294 &TokenBindingParseCallback, nullptr)) {
295 NOTREACHED();
296 }
297 }
298
299 static int TokenBindingAddCallback(SSL* ssl,
300 unsigned int extension_value,
301 const uint8_t** out,
302 size_t* out_len,
303 int* out_alert_value,
304 void* add_arg) {
305 DCHECK_EQ(extension_value, kTbExtNum);
svaldeze83af292016-04-26 14:33:37306 SSLClientSocketImpl* socket =
307 SSLClientSocketImpl::SSLContext::GetInstance()->GetClientSocketFromSSL(
308 ssl);
nharper736ceda2015-11-07 00:16:59309 return socket->TokenBindingAdd(out, out_len, out_alert_value);
310 }
311
312 static void TokenBindingFreeCallback(SSL* ssl,
313 unsigned extension_value,
314 const uint8_t* out,
315 void* add_arg) {
316 DCHECK_EQ(extension_value, kTbExtNum);
317 OPENSSL_free(const_cast<unsigned char*>(out));
318 }
319
320 static int TokenBindingParseCallback(SSL* ssl,
321 unsigned int extension_value,
322 const uint8_t* contents,
323 size_t contents_len,
324 int* out_alert_value,
325 void* parse_arg) {
326 DCHECK_EQ(extension_value, kTbExtNum);
svaldeze83af292016-04-26 14:33:37327 SSLClientSocketImpl* socket =
328 SSLClientSocketImpl::SSLContext::GetInstance()->GetClientSocketFromSSL(
329 ssl);
nharper736ceda2015-11-07 00:16:59330 return socket->TokenBindingParse(contents, contents_len, out_alert_value);
[email protected]fbef13932010-11-23 12:38:53331 }
332
[email protected]82c59022014-08-15 09:38:27333 static int ClientCertRequestCallback(SSL* ssl, void* arg) {
svaldeze83af292016-04-26 14:33:37334 SSLClientSocketImpl* socket = GetInstance()->GetClientSocketFromSSL(ssl);
[email protected]82c59022014-08-15 09:38:27335 DCHECK(socket);
336 return socket->ClientCertRequestCallback(ssl);
[email protected]718c9672010-12-02 10:04:10337 }
338
svaldeze83af292016-04-26 14:33:37339 static int CertVerifyCallback(X509_STORE_CTX* store_ctx, void* arg) {
[email protected]b051cdb62014-02-28 02:20:16340 SSL* ssl = reinterpret_cast<SSL*>(X509_STORE_CTX_get_ex_data(
341 store_ctx, SSL_get_ex_data_X509_STORE_CTX_idx()));
svaldeze83af292016-04-26 14:33:37342 SSLClientSocketImpl* socket = GetInstance()->GetClientSocketFromSSL(ssl);
[email protected]b051cdb62014-02-28 02:20:16343 CHECK(socket);
344
345 return socket->CertVerifyCallback(store_ctx);
346 }
347
davidben44aeae62015-06-24 20:47:43348 static int NewSessionCallback(SSL* ssl, SSL_SESSION* session) {
svaldeze83af292016-04-26 14:33:37349 SSLClientSocketImpl* socket = GetInstance()->GetClientSocketFromSSL(ssl);
davidben44aeae62015-06-24 20:47:43350 return socket->NewSessionCallback(session);
davidbendafe4e52015-04-08 22:53:52351 }
352
davidben1d489522015-07-01 18:48:46353 static int PrivateKeyTypeCallback(SSL* ssl) {
svaldeze83af292016-04-26 14:33:37354 SSLClientSocketImpl* socket = GetInstance()->GetClientSocketFromSSL(ssl);
davidben1d489522015-07-01 18:48:46355 return socket->PrivateKeyTypeCallback();
356 }
357
davidben1d489522015-07-01 18:48:46358 static size_t PrivateKeyMaxSignatureLenCallback(SSL* ssl) {
svaldeze83af292016-04-26 14:33:37359 SSLClientSocketImpl* socket = GetInstance()->GetClientSocketFromSSL(ssl);
davidben1d489522015-07-01 18:48:46360 return socket->PrivateKeyMaxSignatureLenCallback();
361 }
362
davidben0bca07fd2016-07-18 15:12:03363 static ssl_private_key_result_t PrivateKeySignDigestCallback(
davidben1d489522015-07-01 18:48:46364 SSL* ssl,
365 uint8_t* out,
366 size_t* out_len,
davidben0bca07fd2016-07-18 15:12:03367 size_t max_out,
368 const EVP_MD* md,
369 const uint8_t* in,
370 size_t in_len) {
svaldeze83af292016-04-26 14:33:37371 SSLClientSocketImpl* socket = GetInstance()->GetClientSocketFromSSL(ssl);
davidben0bca07fd2016-07-18 15:12:03372 return socket->PrivateKeySignDigestCallback(out, out_len, max_out, md, in,
373 in_len);
374 }
375
376 static ssl_private_key_result_t PrivateKeyCompleteCallback(SSL* ssl,
377 uint8_t* out,
378 size_t* out_len,
379 size_t max_out) {
380 SSLClientSocketImpl* socket = GetInstance()->GetClientSocketFromSSL(ssl);
381 return socket->PrivateKeyCompleteCallback(out, out_len, max_out);
davidben1d489522015-07-01 18:48:46382 }
383
davidben2a811e4e2015-12-01 10:49:34384#if !defined(OS_NACL)
385 static void KeyLogCallback(const SSL* ssl, const char* line) {
386 GetInstance()->ssl_key_logger_->WriteLine(line);
387 }
388#endif
389
[email protected]fbef13932010-11-23 12:38:53390 // This is the index used with SSL_get_ex_data to retrieve the owner
svaldeze83af292016-04-26 14:33:37391 // SSLClientSocketImpl object from an SSL instance.
[email protected]fbef13932010-11-23 12:38:53392 int ssl_socket_data_index_;
393
davidbend80c12c2016-10-11 00:13:49394 bssl::UniquePtr<SSL_CTX> ssl_ctx_;
davidbendafe4e52015-04-08 22:53:52395
davidben2a811e4e2015-12-01 10:49:34396#if !defined(OS_NACL)
danakj655b66c2016-04-16 00:51:38397 std::unique_ptr<SSLKeyLogger> ssl_key_logger_;
davidben2a811e4e2015-12-01 10:49:34398#endif
399
davidbendafe4e52015-04-08 22:53:52400 // TODO(davidben): Use a separate cache per URLRequestContext.
401 // https://crbug.com/458365
402 //
403 // TODO(davidben): Sessions should be invalidated on fatal
404 // alerts. https://crbug.com/466352
svaldeze83af292016-04-26 14:33:37405 SSLClientSessionCache session_cache_;
[email protected]1279de12013-12-03 15:13:32406};
407
davidben0bca07fd2016-07-18 15:12:03408// TODO(davidben): Switch from sign_digest to sign.
davidben1d489522015-07-01 18:48:46409const SSL_PRIVATE_KEY_METHOD
svaldeze83af292016-04-26 14:33:37410 SSLClientSocketImpl::SSLContext::kPrivateKeyMethod = {
411 &SSLClientSocketImpl::SSLContext::PrivateKeyTypeCallback,
412 &SSLClientSocketImpl::SSLContext::PrivateKeyMaxSignatureLenCallback,
davidben0bca07fd2016-07-18 15:12:03413 nullptr /* sign */,
414 &SSLClientSocketImpl::SSLContext::PrivateKeySignDigestCallback,
415 nullptr /* decrypt */,
416 &SSLClientSocketImpl::SSLContext::PrivateKeyCompleteCallback,
davidben1d489522015-07-01 18:48:46417};
418
[email protected]7f38da8a2014-03-17 16:44:26419// PeerCertificateChain is a helper object which extracts the certificate
420// chain, as given by the server, from an OpenSSL socket and performs the needed
421// resource management. The first element of the chain is the leaf certificate
422// and the other elements are in the order given by the server.
svaldeze83af292016-04-26 14:33:37423class SSLClientSocketImpl::PeerCertificateChain {
[email protected]7f38da8a2014-03-17 16:44:26424 public:
svaldeze83af292016-04-26 14:33:37425 explicit PeerCertificateChain(STACK_OF(X509) * chain) { Reset(chain); }
[email protected]7f38da8a2014-03-17 16:44:26426 PeerCertificateChain(const PeerCertificateChain& other) { *this = other; }
427 ~PeerCertificateChain() {}
428 PeerCertificateChain& operator=(const PeerCertificateChain& other);
429
[email protected]76e85392014-03-20 17:54:14430 // Resets the PeerCertificateChain to the set of certificates in|chain|,
431 // which may be NULL, indicating to empty the store certificates.
432 // Note: If an error occurs, such as being unable to parse the certificates,
433 // this will behave as if Reset(NULL) was called.
svaldeze83af292016-04-26 14:33:37434 void Reset(STACK_OF(X509) * chain);
[email protected]76e85392014-03-20 17:54:14435
svaldez2135be52016-04-20 16:34:53436 // Note that when USE_OPENSSL_CERTS is defined, OSCertHandle is X509*
davidben30798ed82014-09-19 19:28:20437 scoped_refptr<X509Certificate> AsOSChain() const;
[email protected]7f38da8a2014-03-17 16:44:26438
439 size_t size() const {
440 if (!openssl_chain_.get())
441 return 0;
442 return sk_X509_num(openssl_chain_.get());
443 }
444
svaldeze83af292016-04-26 14:33:37445 bool empty() const { return size() == 0; }
davidben30798ed82014-09-19 19:28:20446
447 X509* Get(size_t index) const {
[email protected]7f38da8a2014-03-17 16:44:26448 DCHECK_LT(index, size());
449 return sk_X509_value(openssl_chain_.get(), index);
450 }
451
452 private:
davidbend80c12c2016-10-11 00:13:49453 bssl::UniquePtr<STACK_OF(X509)> openssl_chain_;
[email protected]7f38da8a2014-03-17 16:44:26454};
455
svaldeze83af292016-04-26 14:33:37456SSLClientSocketImpl::PeerCertificateChain&
457SSLClientSocketImpl::PeerCertificateChain::operator=(
[email protected]7f38da8a2014-03-17 16:44:26458 const PeerCertificateChain& other) {
459 if (this == &other)
460 return *this;
461
[email protected]24176af2014-08-14 09:31:04462 openssl_chain_.reset(X509_chain_up_ref(other.openssl_chain_.get()));
[email protected]7f38da8a2014-03-17 16:44:26463 return *this;
464}
465
svaldeze83af292016-04-26 14:33:37466void SSLClientSocketImpl::PeerCertificateChain::Reset(STACK_OF(X509) * chain) {
davidben30798ed82014-09-19 19:28:20467 openssl_chain_.reset(chain ? X509_chain_up_ref(chain) : NULL);
[email protected]7f38da8a2014-03-17 16:44:26468}
[email protected]7f38da8a2014-03-17 16:44:26469
davidben30798ed82014-09-19 19:28:20470scoped_refptr<X509Certificate>
svaldeze83af292016-04-26 14:33:37471SSLClientSocketImpl::PeerCertificateChain::AsOSChain() const {
davidben30798ed82014-09-19 19:28:20472 // DER-encode the chain and convert to a platform certificate handle.
rsleevi74e99742016-09-13 20:35:25473 std::vector<std::string> chain;
474 chain.reserve(sk_X509_num(openssl_chain_.get()));
[email protected]edfd0f42014-07-22 18:20:37475 for (size_t i = 0; i < sk_X509_num(openssl_chain_.get()); ++i) {
[email protected]7f38da8a2014-03-17 16:44:26476 X509* x = sk_X509_value(openssl_chain_.get(), i);
rsleevi74e99742016-09-13 20:35:25477 // Note: This intentionally avoids using x509_util::GetDER(), which may
478 // cache the encoded DER on |x|, as |x| is shared with the underlying
479 // socket (SSL*) this chain belongs to. As the DER will only be used
480 // once in //net, within this code, this avoids needlessly caching
481 // additional data. See https://crbug.com/642082
482 int len = i2d_X509(x, nullptr);
483 if (len < 0)
484 return nullptr;
485 std::string cert;
486 uint8_t* ptr = reinterpret_cast<uint8_t*>(base::WriteInto(&cert, len + 1));
487 len = i2d_X509(x, &ptr);
488 if (len < 0) {
489 NOTREACHED();
490 return nullptr;
491 }
492 chain.push_back(std::move(cert));
[email protected]7f38da8a2014-03-17 16:44:26493 }
rsleevi74e99742016-09-13 20:35:25494 std::vector<base::StringPiece> stringpiece_chain;
495 for (const auto& cert : chain)
496 stringpiece_chain.push_back(cert);
[email protected]7f38da8a2014-03-17 16:44:26497
rsleevi74e99742016-09-13 20:35:25498 return X509Certificate::CreateFromDERCertChain(stringpiece_chain);
[email protected]7f38da8a2014-03-17 16:44:26499}
[email protected]7f38da8a2014-03-17 16:44:26500
[email protected]1279de12013-12-03 15:13:32501// static
[email protected]c3456bb2011-12-12 22:22:19502void SSLClientSocket::ClearSessionCache() {
svaldeze83af292016-04-26 14:33:37503 SSLClientSocketImpl::SSLContext* context =
504 SSLClientSocketImpl::SSLContext::GetInstance();
[email protected]c3456bb2011-12-12 22:22:19505 context->session_cache()->Flush();
506}
507
svaldeze83af292016-04-26 14:33:37508SSLClientSocketImpl::SSLClientSocketImpl(
danakj655b66c2016-04-16 00:51:38509 std::unique_ptr<ClientSocketHandle> transport_socket,
[email protected]055d7f22010-11-15 12:03:12510 const HostPortPair& host_and_port,
[email protected]822581d2010-12-16 17:27:15511 const SSLConfig& ssl_config,
[email protected]feb79bcd2011-07-21 16:55:17512 const SSLClientSocketContext& context)
davidben3418e81f2016-10-19 00:09:45513 : pending_read_error_(kNoPendingResult),
davidbenb8c23212014-10-28 00:12:16514 pending_read_ssl_error_(SSL_ERROR_NONE),
[email protected]7f38da8a2014-03-17 16:44:26515 server_cert_chain_(new PeerCertificateChain(NULL)),
[email protected]64b5c892014-08-08 09:39:26516 completed_connect_(false),
[email protected]0dc88b32014-03-26 20:12:28517 was_ever_used_(false),
[email protected]feb79bcd2011-07-21 16:55:17518 cert_verifier_(context.cert_verifier),
davidbeneb5f8ef32014-09-04 14:14:32519 cert_transparency_verifier_(context.cert_transparency_verifier),
[email protected]6b8a3c742014-07-25 00:25:35520 channel_id_service_(context.channel_id_service),
nharper736ceda2015-11-07 00:16:59521 tb_was_negotiated_(false),
522 tb_negotiated_param_(TB_PARAM_ECDSAP256),
nharper78e6d2b2016-09-21 05:42:35523 tb_signature_map_(10),
dchengc7eeda422015-12-26 03:56:48524 transport_(std::move(transport_socket)),
[email protected]055d7f22010-11-15 12:03:12525 host_and_port_(host_and_port),
[email protected]d518cd92010-09-29 12:27:44526 ssl_config_(ssl_config),
[email protected]c3456bb2011-12-12 22:22:19527 ssl_session_cache_shard_(context.ssl_session_cache_shard),
[email protected]013c17c2012-01-21 19:09:01528 next_handshake_state_(STATE_NONE),
svaldez4af14d22015-08-20 13:48:24529 disconnected_(false),
bnc3cf2a592016-08-11 14:48:36530 negotiated_protocol_(kProtoUnknown),
davidben52053b382015-04-27 19:22:29531 channel_id_sent_(false),
davidbendafe4e52015-04-08 22:53:52532 certificate_verified_(false),
davidbenfe132d92016-09-27 18:07:21533 certificate_requested_(false),
davidben1d489522015-07-01 18:48:46534 signature_result_(kNoPendingResult),
[email protected]8bd4e7a2014-08-09 14:49:17535 transport_security_state_(context.transport_security_state),
estark6f9b3d82016-01-12 21:37:05536 policy_enforcer_(context.ct_policy_enforcer),
dadriandf302c42016-06-10 18:48:59537 pkp_bypassed_(false),
kulkarni.acd7b4462014-08-28 07:41:34538 net_log_(transport_->socket()->NetLog()),
539 weak_factory_(this) {
rsleevibe81cd62016-06-24 01:38:59540 CHECK(cert_verifier_);
541 CHECK(transport_security_state_);
542 CHECK(cert_transparency_verifier_);
543 CHECK(policy_enforcer_);
[email protected]8e458552014-08-05 00:02:15544}
[email protected]d518cd92010-09-29 12:27:44545
svaldeze83af292016-04-26 14:33:37546SSLClientSocketImpl::~SSLClientSocketImpl() {
[email protected]d518cd92010-09-29 12:27:44547 Disconnect();
548}
549
davidben2a811e4e2015-12-01 10:49:34550#if !defined(OS_NACL)
svaldeze83af292016-04-26 14:33:37551void SSLClientSocketImpl::SetSSLKeyLogFile(
davidben2a811e4e2015-12-01 10:49:34552 const base::FilePath& ssl_keylog_file,
553 const scoped_refptr<base::SequencedTaskRunner>& task_runner) {
554 SSLContext::GetInstance()->SetSSLKeyLogFile(ssl_keylog_file, task_runner);
zhongyi81f85c6d92015-10-16 19:34:14555}
davidben2a811e4e2015-12-01 10:49:34556#endif
zhongyi81f85c6d92015-10-16 19:34:14557
svaldeze83af292016-04-26 14:33:37558void SSLClientSocketImpl::GetSSLCertRequestInfo(
[email protected]b9b651f2013-11-09 04:32:22559 SSLCertRequestInfo* cert_request_info) {
[email protected]791879c2013-12-17 07:22:41560 cert_request_info->host_and_port = host_and_port_;
[email protected]b9b651f2013-11-09 04:32:22561 cert_request_info->cert_authorities = cert_authorities_;
[email protected]c0787702014-05-20 21:51:44562 cert_request_info->cert_key_types = cert_key_types_;
[email protected]b9b651f2013-11-09 04:32:22563}
564
svaldeze83af292016-04-26 14:33:37565ChannelIDService* SSLClientSocketImpl::GetChannelIDService() const {
[email protected]6b8a3c742014-07-25 00:25:35566 return channel_id_service_;
[email protected]b9b651f2013-11-09 04:32:22567}
568
nharper78e6d2b2016-09-21 05:42:35569Error SSLClientSocketImpl::GetTokenBindingSignature(crypto::ECPrivateKey* key,
570 TokenBindingType tb_type,
571 std::vector<uint8_t>* out) {
nharperb7441ef2016-01-25 23:54:14572 // The same key will be used across multiple requests to sign the same value,
573 // so the signature is cached.
574 std::string raw_public_key;
575 if (!key->ExportRawPublicKey(&raw_public_key))
576 return ERR_FAILED;
nharper78e6d2b2016-09-21 05:42:35577 auto it = tb_signature_map_.Get(std::make_pair(tb_type, raw_public_key));
578 if (it != tb_signature_map_.end()) {
nharperb7441ef2016-01-25 23:54:14579 *out = it->second;
580 return OK;
581 }
582
583 uint8_t tb_ekm_buf[32];
584 static const char kTokenBindingExporterLabel[] = "EXPORTER-Token-Binding";
davidbend80c12c2016-10-11 00:13:49585 if (!SSL_export_keying_material(ssl_.get(), tb_ekm_buf, sizeof(tb_ekm_buf),
nharperb7441ef2016-01-25 23:54:14586 kTokenBindingExporterLabel,
587 strlen(kTokenBindingExporterLabel), nullptr,
588 0, false /* no context */)) {
589 return ERR_FAILED;
590 }
591
nharper78e6d2b2016-09-21 05:42:35592 if (!CreateTokenBindingSignature(
nharperd5cddca2016-02-27 03:37:52593 base::StringPiece(reinterpret_cast<char*>(tb_ekm_buf),
594 sizeof(tb_ekm_buf)),
nharper78e6d2b2016-09-21 05:42:35595 tb_type, key, out))
nharperb7441ef2016-01-25 23:54:14596 return ERR_FAILED;
nharperb7441ef2016-01-25 23:54:14597
nharper78e6d2b2016-09-21 05:42:35598 tb_signature_map_.Put(std::make_pair(tb_type, raw_public_key), *out);
nharperb7441ef2016-01-25 23:54:14599 return OK;
600}
601
svaldeze83af292016-04-26 14:33:37602crypto::ECPrivateKey* SSLClientSocketImpl::GetChannelIDKey() const {
nharperb36644f2016-02-22 23:14:43603 return channel_id_key_.get();
604}
605
svaldeze83af292016-04-26 14:33:37606int SSLClientSocketImpl::ExportKeyingMaterial(const base::StringPiece& label,
607 bool has_context,
608 const base::StringPiece& context,
609 unsigned char* out,
610 unsigned int outlen) {
davidben86935f72015-05-06 22:24:49611 if (!IsConnected())
612 return ERR_SOCKET_NOT_CONNECTED;
613
[email protected]b9b651f2013-11-09 04:32:22614 crypto::OpenSSLErrStackTracer err_tracer(FROM_HERE);
615
davidbenf225b262016-09-15 22:09:22616 if (!SSL_export_keying_material(
davidbend80c12c2016-10-11 00:13:49617 ssl_.get(), out, outlen, label.data(), label.size(),
davidbenf225b262016-09-15 22:09:22618 reinterpret_cast<const unsigned char*>(context.data()),
619 context.length(), has_context ? 1 : 0)) {
620 LOG(ERROR) << "Failed to export keying material.";
621 return ERR_FAILED;
[email protected]b9b651f2013-11-09 04:32:22622 }
davidbenf225b262016-09-15 22:09:22623
[email protected]b9b651f2013-11-09 04:32:22624 return OK;
625}
626
svaldeze83af292016-04-26 14:33:37627int SSLClientSocketImpl::Connect(const CompletionCallback& callback) {
svaldez4af14d22015-08-20 13:48:24628 // Although StreamSocket does allow calling Connect() after Disconnect(),
629 // this has never worked for layered sockets. CHECK to detect any consumers
630 // reconnecting an SSL socket.
631 //
632 // TODO(davidben,mmenke): Remove this API feature. See
633 // https://crbug.com/499289.
634 CHECK(!disconnected_);
635
mikecirone8b85c432016-09-08 19:11:00636 net_log_.BeginEvent(NetLogEventType::SSL_CONNECT);
[email protected]b9b651f2013-11-09 04:32:22637
638 // Set up new ssl object.
[email protected]c8a80e92014-05-17 16:02:08639 int rv = Init();
640 if (rv != OK) {
davidben281d13f02016-04-27 20:43:28641 LogConnectEndEvent(rv);
[email protected]c8a80e92014-05-17 16:02:08642 return rv;
[email protected]b9b651f2013-11-09 04:32:22643 }
644
645 // Set SSL to client mode. Handshake happens in the loop below.
davidbend80c12c2016-10-11 00:13:49646 SSL_set_connect_state(ssl_.get());
[email protected]b9b651f2013-11-09 04:32:22647
rsleeviadbd4982016-06-13 22:10:27648 next_handshake_state_ = STATE_HANDSHAKE;
[email protected]c8a80e92014-05-17 16:02:08649 rv = DoHandshakeLoop(OK);
[email protected]b9b651f2013-11-09 04:32:22650 if (rv == ERR_IO_PENDING) {
651 user_connect_callback_ = callback;
652 } else {
davidben281d13f02016-04-27 20:43:28653 LogConnectEndEvent(rv);
[email protected]b9b651f2013-11-09 04:32:22654 }
655
656 return rv > OK ? OK : rv;
657}
658
svaldeze83af292016-04-26 14:33:37659void SSLClientSocketImpl::Disconnect() {
svaldez4af14d22015-08-20 13:48:24660 disconnected_ = true;
661
[email protected]b9b651f2013-11-09 04:32:22662 // Shut down anything that may call us back.
eroman7f9236a2015-05-11 21:23:43663 cert_verifier_request_.reset();
davidben67e83912016-10-12 18:36:32664 channel_id_request_.Cancel();
665 weak_factory_.InvalidateWeakPtrs();
davidben3418e81f2016-10-19 00:09:45666 transport_adapter_.reset();
[email protected]b9b651f2013-11-09 04:32:22667
davidben67e83912016-10-12 18:36:32668 // Release user callbacks.
[email protected]b9b651f2013-11-09 04:32:22669 user_connect_callback_.Reset();
670 user_read_callback_.Reset();
671 user_write_callback_.Reset();
svaldeze83af292016-04-26 14:33:37672 user_read_buf_ = NULL;
673 user_read_buf_len_ = 0;
674 user_write_buf_ = NULL;
675 user_write_buf_len_ = 0;
[email protected]b9b651f2013-11-09 04:32:22676
davidben67e83912016-10-12 18:36:32677 transport_->socket()->Disconnect();
[email protected]b9b651f2013-11-09 04:32:22678}
679
svaldeze83af292016-04-26 14:33:37680bool SSLClientSocketImpl::IsConnected() const {
davidben67e83912016-10-12 18:36:32681 // If the handshake has not yet completed or the socket has been explicitly
682 // disconnected.
683 if (!completed_connect_ || disconnected_)
[email protected]b9b651f2013-11-09 04:32:22684 return false;
685 // If an asynchronous operation is still pending.
686 if (user_read_buf_.get() || user_write_buf_.get())
687 return true;
688
689 return transport_->socket()->IsConnected();
690}
691
svaldeze83af292016-04-26 14:33:37692bool SSLClientSocketImpl::IsConnectedAndIdle() const {
davidben67e83912016-10-12 18:36:32693 // If the handshake has not yet completed or the socket has been explicitly
694 // disconnected.
695 if (!completed_connect_ || disconnected_)
[email protected]b9b651f2013-11-09 04:32:22696 return false;
697 // If an asynchronous operation is still pending.
698 if (user_read_buf_.get() || user_write_buf_.get())
699 return false;
davidbenfc9a6b82015-04-15 23:47:32700
701 // If there is data read from the network that has not yet been consumed, do
702 // not treat the connection as idle.
703 //
davidben3418e81f2016-10-19 00:09:45704 // Note that this does not check whether there is ciphertext that has not yet
705 // been flushed to the network. |Write| returns early, so this can cause race
706 // conditions which cause a socket to not be treated reusable when it should
707 // be. See https://crbug.com/466147.
708 if (transport_adapter_->HasPendingReadData())
[email protected]b9b651f2013-11-09 04:32:22709 return false;
[email protected]b9b651f2013-11-09 04:32:22710
711 return transport_->socket()->IsConnectedAndIdle();
712}
713
svaldeze83af292016-04-26 14:33:37714int SSLClientSocketImpl::GetPeerAddress(IPEndPoint* addressList) const {
[email protected]b9b651f2013-11-09 04:32:22715 return transport_->socket()->GetPeerAddress(addressList);
716}
717
svaldeze83af292016-04-26 14:33:37718int SSLClientSocketImpl::GetLocalAddress(IPEndPoint* addressList) const {
[email protected]b9b651f2013-11-09 04:32:22719 return transport_->socket()->GetLocalAddress(addressList);
720}
721
tfarina42834112016-09-22 13:38:20722const NetLogWithSource& SSLClientSocketImpl::NetLog() const {
[email protected]b9b651f2013-11-09 04:32:22723 return net_log_;
724}
725
svaldeze83af292016-04-26 14:33:37726void SSLClientSocketImpl::SetSubresourceSpeculation() {
[email protected]b9b651f2013-11-09 04:32:22727 if (transport_.get() && transport_->socket()) {
728 transport_->socket()->SetSubresourceSpeculation();
729 } else {
730 NOTREACHED();
731 }
732}
733
svaldeze83af292016-04-26 14:33:37734void SSLClientSocketImpl::SetOmniboxSpeculation() {
[email protected]b9b651f2013-11-09 04:32:22735 if (transport_.get() && transport_->socket()) {
736 transport_->socket()->SetOmniboxSpeculation();
737 } else {
738 NOTREACHED();
739 }
740}
741
svaldeze83af292016-04-26 14:33:37742bool SSLClientSocketImpl::WasEverUsed() const {
[email protected]0dc88b32014-03-26 20:12:28743 return was_ever_used_;
[email protected]b9b651f2013-11-09 04:32:22744}
745
bnc3cf2a592016-08-11 14:48:36746bool SSLClientSocketImpl::WasNpnNegotiated() const {
747 return negotiated_protocol_ != kProtoUnknown;
748}
749
750NextProto SSLClientSocketImpl::GetNegotiatedProtocol() const {
751 return negotiated_protocol_;
752}
753
svaldeze83af292016-04-26 14:33:37754bool SSLClientSocketImpl::GetSSLInfo(SSLInfo* ssl_info) {
[email protected]b9b651f2013-11-09 04:32:22755 ssl_info->Reset();
davidben30798ed82014-09-19 19:28:20756 if (server_cert_chain_->empty())
[email protected]b9b651f2013-11-09 04:32:22757 return false;
758
759 ssl_info->cert = server_cert_verify_result_.verified_cert;
estark03d644f2015-06-13 00:11:32760 ssl_info->unverified_cert = server_cert_;
[email protected]b9b651f2013-11-09 04:32:22761 ssl_info->cert_status = server_cert_verify_result_.cert_status;
762 ssl_info->is_issued_by_known_root =
763 server_cert_verify_result_.is_issued_by_known_root;
dadriandf302c42016-06-10 18:48:59764 ssl_info->pkp_bypassed = pkp_bypassed_;
svaldeze83af292016-04-26 14:33:37765 ssl_info->public_key_hashes = server_cert_verify_result_.public_key_hashes;
[email protected]b9b651f2013-11-09 04:32:22766 ssl_info->client_cert_sent =
767 ssl_config_.send_client_cert && ssl_config_.client_cert.get();
davidben52053b382015-04-27 19:22:29768 ssl_info->channel_id_sent = channel_id_sent_;
nharper736ceda2015-11-07 00:16:59769 ssl_info->token_binding_negotiated = tb_was_negotiated_;
770 ssl_info->token_binding_key_param = tb_negotiated_param_;
[email protected]8bd4e7a2014-08-09 14:49:17771 ssl_info->pinning_failure_log = pinning_failure_log_;
dadrian612337a2016-07-20 22:36:58772 ssl_info->ocsp_result = server_cert_verify_result_.ocsp_result;
[email protected]b9b651f2013-11-09 04:32:22773
estark723b5eeb2016-02-18 21:01:12774 AddCTInfoToSSLInfo(ssl_info);
davidbeneb5f8ef32014-09-04 14:14:32775
davidbend80c12c2016-10-11 00:13:49776 const SSL_CIPHER* cipher = SSL_get_current_cipher(ssl_.get());
[email protected]b9b651f2013-11-09 04:32:22777 CHECK(cipher);
778 ssl_info->security_bits = SSL_CIPHER_get_bits(cipher, NULL);
davidben3b00e402016-09-20 14:31:06779 // Historically, the "group" was known as "curve".
davidbend80c12c2016-10-11 00:13:49780 ssl_info->key_exchange_group = SSL_get_curve_id(ssl_.get());
[email protected]b9b651f2013-11-09 04:32:22781
ryanchung987b2ff2016-02-19 00:17:12782 SSLConnectionStatusSetCipherSuite(
783 static_cast<uint16_t>(SSL_CIPHER_get_id(cipher)),
784 &ssl_info->connection_status);
davidbend80c12c2016-10-11 00:13:49785 SSLConnectionStatusSetVersion(GetNetSSLVersion(ssl_.get()),
ryanchung987b2ff2016-02-19 00:17:12786 &ssl_info->connection_status);
[email protected]b9b651f2013-11-09 04:32:22787
davidbend80c12c2016-10-11 00:13:49788 if (!SSL_get_secure_renegotiation_support(ssl_.get()))
[email protected]b9b651f2013-11-09 04:32:22789 ssl_info->connection_status |= SSL_CONNECTION_NO_RENEGOTIATION_EXTENSION;
[email protected]b9b651f2013-11-09 04:32:22790
davidbend80c12c2016-10-11 00:13:49791 ssl_info->handshake_type = SSL_session_reused(ssl_.get())
svaldeze83af292016-04-26 14:33:37792 ? SSLInfo::HANDSHAKE_RESUME
793 : SSLInfo::HANDSHAKE_FULL;
[email protected]b9b651f2013-11-09 04:32:22794
[email protected]b9b651f2013-11-09 04:32:22795 return true;
796}
797
svaldeze83af292016-04-26 14:33:37798void SSLClientSocketImpl::GetConnectionAttempts(ConnectionAttempts* out) const {
ttuttle23fdb7b2015-05-15 01:28:03799 out->clear();
800}
801
svaldeze83af292016-04-26 14:33:37802int64_t SSLClientSocketImpl::GetTotalReceivedBytes() const {
tbansalf82cc8e2015-10-14 20:05:49803 return transport_->socket()->GetTotalReceivedBytes();
804}
805
svaldeze83af292016-04-26 14:33:37806int SSLClientSocketImpl::Read(IOBuffer* buf,
807 int buf_len,
808 const CompletionCallback& callback) {
[email protected]b9b651f2013-11-09 04:32:22809 user_read_buf_ = buf;
810 user_read_buf_len_ = buf_len;
811
davidben3418e81f2016-10-19 00:09:45812 int rv = DoPayloadRead();
[email protected]b9b651f2013-11-09 04:32:22813
814 if (rv == ERR_IO_PENDING) {
815 user_read_callback_ = callback;
816 } else {
[email protected]0dc88b32014-03-26 20:12:28817 if (rv > 0)
818 was_ever_used_ = true;
[email protected]b9b651f2013-11-09 04:32:22819 user_read_buf_ = NULL;
820 user_read_buf_len_ = 0;
821 }
822
823 return rv;
824}
825
svaldeze83af292016-04-26 14:33:37826int SSLClientSocketImpl::Write(IOBuffer* buf,
827 int buf_len,
828 const CompletionCallback& callback) {
[email protected]b9b651f2013-11-09 04:32:22829 user_write_buf_ = buf;
830 user_write_buf_len_ = buf_len;
831
davidben3418e81f2016-10-19 00:09:45832 int rv = DoPayloadWrite();
[email protected]b9b651f2013-11-09 04:32:22833
834 if (rv == ERR_IO_PENDING) {
835 user_write_callback_ = callback;
836 } else {
[email protected]0dc88b32014-03-26 20:12:28837 if (rv > 0)
838 was_ever_used_ = true;
[email protected]b9b651f2013-11-09 04:32:22839 user_write_buf_ = NULL;
840 user_write_buf_len_ = 0;
841 }
842
843 return rv;
844}
845
svaldeze83af292016-04-26 14:33:37846int SSLClientSocketImpl::SetReceiveBufferSize(int32_t size) {
[email protected]b9b651f2013-11-09 04:32:22847 return transport_->socket()->SetReceiveBufferSize(size);
848}
849
svaldeze83af292016-04-26 14:33:37850int SSLClientSocketImpl::SetSendBufferSize(int32_t size) {
[email protected]b9b651f2013-11-09 04:32:22851 return transport_->socket()->SetSendBufferSize(size);
852}
853
davidben3418e81f2016-10-19 00:09:45854void SSLClientSocketImpl::OnReadReady() {
855 // During a renegotiation, either Read or Write calls may be blocked on a
856 // transport read.
857 RetryAllOperations();
858}
859
860void SSLClientSocketImpl::OnWriteReady() {
861 // During a renegotiation, either Read or Write calls may be blocked on a
862 // transport read.
863 RetryAllOperations();
864}
865
svaldeze83af292016-04-26 14:33:37866int SSLClientSocketImpl::Init() {
[email protected]9e733f32010-10-04 18:19:08867 DCHECK(!ssl_);
[email protected]9e733f32010-10-04 18:19:08868
svaldez2135be52016-04-20 16:34:53869#if defined(USE_NSS_CERTS)
davidbena477a70a2015-10-06 04:38:29870 if (ssl_config_.cert_io_enabled) {
871 // TODO(davidben): Move this out of SSLClientSocket. See
872 // https://crbug.com/539520.
873 EnsureNSSHttpIOInit();
874 }
875#endif
876
[email protected]b29af7d2010-12-14 11:52:47877 SSLContext* context = SSLContext::GetInstance();
[email protected]4b559b4d2011-04-14 17:37:14878 crypto::OpenSSLErrStackTracer err_tracer(FROM_HERE);
[email protected]d518cd92010-09-29 12:27:44879
davidbend80c12c2016-10-11 00:13:49880 ssl_.reset(SSL_new(context->ssl_ctx()));
881 if (!ssl_ || !context->SetClientSocketForSSL(ssl_.get(), this))
[email protected]c8a80e92014-05-17 16:02:08882 return ERR_UNEXPECTED;
[email protected]fbef13932010-11-23 12:38:53883
davidben9bc0466f2015-06-16 22:21:27884 // SNI should only contain valid DNS hostnames, not IP addresses (see RFC
885 // 6066, Section 3).
886 //
887 // TODO(rsleevi): Should this code allow hostnames that violate the LDH rule?
888 // See https://crbug.com/496472 and https://crbug.com/496468 for discussion.
martijna2e83bd2016-03-18 13:10:45889 IPAddress unused;
890 if (!unused.AssignFromIPLiteral(host_and_port_.host()) &&
davidbend80c12c2016-10-11 00:13:49891 !SSL_set_tlsext_host_name(ssl_.get(), host_and_port_.host().c_str())) {
[email protected]c8a80e92014-05-17 16:02:08892 return ERR_UNEXPECTED;
davidben9bc0466f2015-06-16 22:21:27893 }
[email protected]fbef13932010-11-23 12:38:53894
davidbend80c12c2016-10-11 00:13:49895 bssl::UniquePtr<SSL_SESSION> session =
davidbenf4c9a6122015-10-20 02:45:29896 context->session_cache()->Lookup(GetSessionCacheKey());
897 if (session)
davidbend80c12c2016-10-11 00:13:49898 SSL_set_session(ssl_.get(), session.get());
[email protected]d518cd92010-09-29 12:27:44899
davidben3418e81f2016-10-19 00:09:45900 transport_adapter_.reset(new SocketBIOAdapter(
901 transport_->socket(), GetBufferSize("SSLBufferSizeRecv"),
902 GetBufferSize("SSLBufferSizeSend"), this));
903 BIO* transport_bio = transport_adapter_->bio();
mmenke1beda3d2016-07-22 03:33:45904
davidben3418e81f2016-10-19 00:09:45905 BIO_up_ref(transport_bio); // SSL_set0_rbio takes ownership.
906 SSL_set0_rbio(ssl_.get(), transport_bio);
haavardm2d92e722014-12-19 13:45:44907
davidben3418e81f2016-10-19 00:09:45908 BIO_up_ref(transport_bio); // SSL_set0_wbio takes ownership.
909 SSL_set0_wbio(ssl_.get(), transport_bio);
[email protected]d518cd92010-09-29 12:27:44910
davidbenb937d6c2015-05-14 04:53:42911 DCHECK_LT(SSL3_VERSION, ssl_config_.version_min);
912 DCHECK_LT(SSL3_VERSION, ssl_config_.version_max);
davidbend80c12c2016-10-11 00:13:49913 if (!SSL_set_min_proto_version(ssl_.get(), ssl_config_.version_min) ||
914 !SSL_set_max_proto_version(ssl_.get(), ssl_config_.version_max)) {
davidben952bdf22016-09-21 23:42:16915 return ERR_UNEXPECTED;
916 }
davidbenb937d6c2015-05-14 04:53:42917
[email protected]9e733f32010-10-04 18:19:08918 // OpenSSL defaults some options to on, others to off. To avoid ambiguity,
919 // set everything we care about to an absolute value.
[email protected]fb10e2282010-12-01 17:08:48920 SslSetClearMask options;
[email protected]d0f00492012-08-03 22:35:13921 options.ConfigureFlag(SSL_OP_NO_COMPRESSION, true);
[email protected]9e733f32010-10-04 18:19:08922
923 // TODO(joth): Set this conditionally, see http://crbug.com/55410
[email protected]fb10e2282010-12-01 17:08:48924 options.ConfigureFlag(SSL_OP_LEGACY_SERVER_CONNECT, true);
[email protected]9e733f32010-10-04 18:19:08925
davidbend80c12c2016-10-11 00:13:49926 SSL_set_options(ssl_.get(), options.set_mask);
927 SSL_clear_options(ssl_.get(), options.clear_mask);
[email protected]9e733f32010-10-04 18:19:08928
[email protected]fb10e2282010-12-01 17:08:48929 // Same as above, this time for the SSL mode.
930 SslSetClearMask mode;
[email protected]9e733f32010-10-04 18:19:08931
[email protected]fb10e2282010-12-01 17:08:48932 mode.ConfigureFlag(SSL_MODE_RELEASE_BUFFERS, true);
ishermane5c05e12014-09-09 20:32:15933 mode.ConfigureFlag(SSL_MODE_CBC_RECORD_SPLITTING, true);
[email protected]fb10e2282010-12-01 17:08:48934
davidben818d93b2015-02-19 22:27:32935 mode.ConfigureFlag(SSL_MODE_ENABLE_FALSE_START,
[email protected]b788de02014-04-23 18:06:07936 ssl_config_.false_start_enabled);
937
davidbend80c12c2016-10-11 00:13:49938 SSL_set_mode(ssl_.get(), mode.set_mask);
939 SSL_clear_mode(ssl_.get(), mode.clear_mask);
[email protected]109805a2010-12-07 18:17:06940
petewilec5f5df222016-06-29 17:21:34941 std::string command;
mabe0d8c582016-08-12 02:06:40942 if (SSLClientSocket::IsPostQuantumExperimentEnabled()) {
petewilec5f5df222016-06-29 17:21:34943 // These are experimental, non-standard ciphersuites. They are part of an
944 // experiment in post-quantum cryptography. They're not intended to
945 // represent a de-facto standard, and will be removed from BoringSSL in
946 // ~2018.
947 if (EVP_has_aes_hardware()) {
948 command.append(
949 "CECPQ1-RSA-AES256-GCM-SHA384:"
950 "CECPQ1-ECDSA-AES256-GCM-SHA384:");
951 }
952 command.append(
953 "CECPQ1-RSA-CHACHA20-POLY1305-SHA256:"
954 "CECPQ1-ECDSA-CHACHA20-POLY1305-SHA256:");
955 if (!EVP_has_aes_hardware()) {
956 command.append(
957 "CECPQ1-RSA-AES256-GCM-SHA384:"
958 "CECPQ1-ECDSA-AES256-GCM-SHA384:");
959 }
960 }
davidben4177ecb2016-10-22 01:47:18961
962 // Use BoringSSL defaults, but disable HMAC-SHA256 and HMAC-SHA384 ciphers
davidbend406cdb2016-11-17 08:31:05963 // (note that SHA256 and SHA384 only select legacy CBC ciphers). Also disable
davidben4177ecb2016-10-22 01:47:18964 // DHE_RSA_WITH_AES_256_GCM_SHA384. Historically, AES_256_GCM was not
davidbend406cdb2016-11-17 08:31:05965 // supported. As DHE is being deprecated, don't add a cipher only to remove
966 // it immediately.
davidben4177ecb2016-10-22 01:47:18967 //
968 // TODO(davidben): Remove the DHE_RSA_WITH_AES_256_GCM_SHA384 exclusion when
969 // the DHEEnabled administrative policy expires.
davidbend406cdb2016-11-17 08:31:05970 command.append("ALL:!SHA256:!SHA384:!DHE-RSA-AES256-GCM-SHA384:!aPSK:!RC4");
davidben9b4a9b9c2015-10-12 18:46:51971
972 if (ssl_config_.require_ecdhe)
973 command.append(":!kRSA:!kDHE");
davidben8ecc3072014-09-03 23:19:09974
davidben68dcc582016-01-12 22:09:36975 if (!ssl_config_.deprecated_cipher_suites_enabled) {
davidben01d8e332015-11-20 17:08:58976 // Only offer DHE on the second handshake. https://crbug.com/538690
977 command.append(":!kDHE");
davidben91585692015-09-28 23:46:08978 }
davidbena4c9d062015-04-03 22:34:25979
davidbend406cdb2016-11-17 08:31:05980 // Additionally disable HMAC-SHA1 ciphers in ECDSA. These are the remaining
981 // CBC-mode ECDSA ciphers.
982 if (!AreLegacyECDSACiphersEnabled())
983 command.append("!ECDSA+SHA1");
984
davidben9b4a9b9c2015-10-12 18:46:51985 // Remove any disabled ciphers.
986 for (uint16_t id : ssl_config_.disabled_cipher_suites) {
987 const SSL_CIPHER* cipher = SSL_get_cipher_by_value(id);
988 if (cipher) {
989 command.append(":!");
990 command.append(SSL_CIPHER_get_name(cipher));
991 }
992 }
993
davidbend80c12c2016-10-11 00:13:49994 int rv = SSL_set_cipher_list(ssl_.get(), command.c_str());
[email protected]109805a2010-12-07 18:17:06995 // If this fails (rv = 0) it means there are no ciphers enabled on this SSL.
996 // This will almost certainly result in the socket failing to complete the
997 // handshake at which point the appropriate error is bubbled up to the client.
998 LOG_IF(WARNING, rv != 1) << "SSL_set_cipher_list('" << command << "') "
svaldeze83af292016-04-26 14:33:37999 "returned "
1000 << rv;
[email protected]ee0f2aa82013-10-25 11:59:261001
1002 // TLS channel ids.
bnc3cf2a592016-08-11 14:48:361003 if (IsChannelIDEnabled()) {
davidbend80c12c2016-10-11 00:13:491004 SSL_enable_tls_channel_id(ssl_.get());
[email protected]ee0f2aa82013-10-25 11:59:261005 }
1006
bnc1f295372015-10-21 23:24:221007 if (!ssl_config_.alpn_protos.empty()) {
bnc988e68d2016-06-27 14:03:211008 std::vector<uint8_t> wire_protos =
1009 SerializeNextProtos(ssl_config_.alpn_protos);
davidbend80c12c2016-10-11 00:13:491010 SSL_set_alpn_protos(ssl_.get(),
1011 wire_protos.empty() ? NULL : &wire_protos[0],
[email protected]abc44b752014-07-30 03:52:151012 wire_protos.size());
1013 }
1014
davidbeneb5f8ef32014-09-04 14:14:321015 if (ssl_config_.signed_cert_timestamps_enabled) {
davidbend80c12c2016-10-11 00:13:491016 SSL_enable_signed_cert_timestamps(ssl_.get());
1017 SSL_enable_ocsp_stapling(ssl_.get());
davidbeneb5f8ef32014-09-04 14:14:321018 }
1019
davidben15f57132015-04-27 18:08:361020 if (cert_verifier_->SupportsOCSPStapling())
davidbend80c12c2016-10-11 00:13:491021 SSL_enable_ocsp_stapling(ssl_.get());
davidbeneb5f8ef32014-09-04 14:14:321022
[email protected]c8a80e92014-05-17 16:02:081023 return OK;
[email protected]d518cd92010-09-29 12:27:441024}
1025
svaldeze83af292016-04-26 14:33:371026void SSLClientSocketImpl::DoReadCallback(int rv) {
[email protected]b9b651f2013-11-09 04:32:221027 // Since Run may result in Read being called, clear |user_read_callback_|
1028 // up front.
[email protected]0dc88b32014-03-26 20:12:281029 if (rv > 0)
1030 was_ever_used_ = true;
[email protected]b9b651f2013-11-09 04:32:221031 user_read_buf_ = NULL;
1032 user_read_buf_len_ = 0;
1033 base::ResetAndReturn(&user_read_callback_).Run(rv);
1034}
1035
svaldeze83af292016-04-26 14:33:371036void SSLClientSocketImpl::DoWriteCallback(int rv) {
[email protected]b9b651f2013-11-09 04:32:221037 // Since Run may result in Write being called, clear |user_write_callback_|
1038 // up front.
[email protected]0dc88b32014-03-26 20:12:281039 if (rv > 0)
1040 was_ever_used_ = true;
[email protected]b9b651f2013-11-09 04:32:221041 user_write_buf_ = NULL;
1042 user_write_buf_len_ = 0;
1043 base::ResetAndReturn(&user_write_callback_).Run(rv);
1044}
1045
pkasting379234c2015-04-08 04:42:121046// TODO(cbentzel): Remove including "base/threading/thread_local.h" and
vadimt6b43dec22015-01-06 01:59:581047// g_first_run_completed once crbug.com/424386 is fixed.
1048base::LazyInstance<base::ThreadLocalBoolean>::Leaky g_first_run_completed =
1049 LAZY_INSTANCE_INITIALIZER;
1050
svaldeze83af292016-04-26 14:33:371051int SSLClientSocketImpl::DoHandshake() {
[email protected]b9b651f2013-11-09 04:32:221052 crypto::OpenSSLErrStackTracer err_tracer(FROM_HERE);
vadimt5a243282014-12-24 00:26:161053
1054 int rv;
1055
pkasting379234c2015-04-08 04:42:121056 // TODO(cbentzel): Leave only 1 call to SSL_do_handshake once crbug.com/424386
vadimt5a243282014-12-24 00:26:161057 // is fixed.
1058 if (ssl_config_.send_client_cert && ssl_config_.client_cert.get()) {
davidbend80c12c2016-10-11 00:13:491059 rv = SSL_do_handshake(ssl_.get());
vadimt5a243282014-12-24 00:26:161060 } else {
vadimt6b43dec22015-01-06 01:59:581061 if (g_first_run_completed.Get().Get()) {
pkasting379234c2015-04-08 04:42:121062 // TODO(cbentzel): Remove ScopedTracker below once crbug.com/424386 is
vadimt6b43dec22015-01-06 01:59:581063 // fixed.
pkasting379234c2015-04-08 04:42:121064 tracked_objects::ScopedTracker tracking_profile(
1065 FROM_HERE_WITH_EXPLICIT_FUNCTION("424386 SSL_do_handshake()"));
vadimt5a243282014-12-24 00:26:161066
davidbend80c12c2016-10-11 00:13:491067 rv = SSL_do_handshake(ssl_.get());
vadimt6b43dec22015-01-06 01:59:581068 } else {
1069 g_first_run_completed.Get().Set(true);
davidbend80c12c2016-10-11 00:13:491070 rv = SSL_do_handshake(ssl_.get());
vadimt6b43dec22015-01-06 01:59:581071 }
vadimt5a243282014-12-24 00:26:161072 }
[email protected]b9b651f2013-11-09 04:32:221073
davidbenc4212c02015-05-12 22:30:181074 int net_error = OK;
1075 if (rv <= 0) {
davidbend80c12c2016-10-11 00:13:491076 int ssl_error = SSL_get_error(ssl_.get(), rv);
[email protected]b9b651f2013-11-09 04:32:221077 if (ssl_error == SSL_ERROR_WANT_CHANNEL_ID_LOOKUP) {
[email protected]faff9852014-06-21 06:13:461078 // The server supports channel ID. Stop to look one up before returning to
1079 // the handshake.
rsleeviadbd4982016-06-13 22:10:271080 next_handshake_state_ = STATE_CHANNEL_ID_LOOKUP;
[email protected]faff9852014-06-21 06:13:461081 return OK;
[email protected]b9b651f2013-11-09 04:32:221082 }
davidbenced4aa9b2015-05-12 21:22:351083 if (ssl_error == SSL_ERROR_WANT_X509_LOOKUP &&
1084 !ssl_config_.send_client_cert) {
1085 return ERR_SSL_CLIENT_AUTH_CERT_NEEDED;
1086 }
davidben1d489522015-07-01 18:48:461087 if (ssl_error == SSL_ERROR_WANT_PRIVATE_KEY_OPERATION) {
svaldez7872fd02015-11-19 21:10:541088 DCHECK(ssl_config_.client_private_key);
davidben1d489522015-07-01 18:48:461089 DCHECK_NE(kNoPendingResult, signature_result_);
rsleeviadbd4982016-06-13 22:10:271090 next_handshake_state_ = STATE_HANDSHAKE;
davidben1d489522015-07-01 18:48:461091 return ERR_IO_PENDING;
1092 }
[email protected]b9b651f2013-11-09 04:32:221093
davidbena4409c62014-08-27 17:05:511094 OpenSSLErrorInfo error_info;
davidbenfe132d92016-09-27 18:07:211095 net_error = MapLastOpenSSLError(ssl_error, err_tracer, &error_info);
[email protected]b9b651f2013-11-09 04:32:221096 if (net_error == ERR_IO_PENDING) {
davidbenc4212c02015-05-12 22:30:181097 // If not done, stay in this state
rsleeviadbd4982016-06-13 22:10:271098 next_handshake_state_ = STATE_HANDSHAKE;
davidbenc4212c02015-05-12 22:30:181099 return ERR_IO_PENDING;
1100 }
1101
1102 LOG(ERROR) << "handshake failed; returned " << rv << ", SSL error code "
1103 << ssl_error << ", net_error " << net_error;
1104 net_log_.AddEvent(
mikecirone8b85c432016-09-08 19:11:001105 NetLogEventType::SSL_HANDSHAKE_ERROR,
davidbenc4212c02015-05-12 22:30:181106 CreateNetLogOpenSSLErrorCallback(net_error, ssl_error, error_info));
1107 }
1108
rsleeviadbd4982016-06-13 22:10:271109 next_handshake_state_ = STATE_HANDSHAKE_COMPLETE;
davidbenc4212c02015-05-12 22:30:181110 return net_error;
1111}
1112
svaldeze83af292016-04-26 14:33:371113int SSLClientSocketImpl::DoHandshakeComplete(int result) {
davidbenc4212c02015-05-12 22:30:181114 if (result < 0)
1115 return result;
1116
davidbenb4c25b62016-06-24 02:39:271117 // DHE is offered on the deprecated cipher fallback and then rejected
1118 // afterwards. This is to aid in diagnosing connection failures because a
1119 // server requires DHE ciphers.
1120 //
1121 // TODO(davidben): A few releases after DHE's removal, remove this logic.
1122 if (!ssl_config_.dhe_enabled &&
davidbend80c12c2016-10-11 00:13:491123 SSL_CIPHER_is_DHE(SSL_get_current_cipher(ssl_.get()))) {
davidbenb4c25b62016-06-24 02:39:271124 return ERR_SSL_OBSOLETE_CIPHER;
1125 }
1126
nharper736ceda2015-11-07 00:16:591127 // Check that if token binding was negotiated, then extended master secret
nharper78e6d2b2016-09-21 05:42:351128 // and renegotiation indication must also be negotiated.
1129 if (tb_was_negotiated_ &&
davidbend80c12c2016-10-11 00:13:491130 !(SSL_get_extms_support(ssl_.get()) &&
1131 SSL_get_secure_renegotiation_support(ssl_.get()))) {
nharper736ceda2015-11-07 00:16:591132 return ERR_SSL_PROTOCOL_ERROR;
nharper78e6d2b2016-09-21 05:42:351133 }
nharper736ceda2015-11-07 00:16:591134
bncce6ea242016-09-15 20:22:321135 const uint8_t* alpn_proto = NULL;
1136 unsigned alpn_len = 0;
davidbend80c12c2016-10-11 00:13:491137 SSL_get0_alpn_selected(ssl_.get(), &alpn_proto, &alpn_len);
bncce6ea242016-09-15 20:22:321138 if (alpn_len > 0) {
1139 base::StringPiece proto(reinterpret_cast<const char*>(alpn_proto),
1140 alpn_len);
1141 negotiated_protocol_ = NextProtoFromString(proto);
[email protected]b9b651f2013-11-09 04:32:221142 }
davidbenc4212c02015-05-12 22:30:181143
bncbd442c22016-09-14 20:49:161144 RecordNegotiatedProtocol();
bnc3cf2a592016-08-11 14:48:361145 RecordChannelIDSupport();
davidbenc4212c02015-05-12 22:30:181146
dadriand476e652016-07-26 21:33:241147 const uint8_t* ocsp_response_raw;
1148 size_t ocsp_response_len;
davidbend80c12c2016-10-11 00:13:491149 SSL_get0_ocsp_response(ssl_.get(), &ocsp_response_raw, &ocsp_response_len);
dadriand476e652016-07-26 21:33:241150 std::string ocsp_response;
1151 if (ocsp_response_len > 0) {
1152 ocsp_response_.assign(reinterpret_cast<const char*>(ocsp_response_raw),
1153 ocsp_response_len);
davidbenc4212c02015-05-12 22:30:181154 }
dadriand476e652016-07-26 21:33:241155 set_stapled_ocsp_response_received(ocsp_response_len != 0);
1156 UMA_HISTOGRAM_BOOLEAN("Net.OCSPResponseStapled", ocsp_response_len != 0);
davidbenc4212c02015-05-12 22:30:181157
1158 const uint8_t* sct_list;
1159 size_t sct_list_len;
davidbend80c12c2016-10-11 00:13:491160 SSL_get0_signed_cert_timestamp_list(ssl_.get(), &sct_list, &sct_list_len);
davidbenc4212c02015-05-12 22:30:181161 set_signed_cert_timestamps_received(sct_list_len != 0);
1162
1163 if (IsRenegotiationAllowed())
davidbend80c12c2016-10-11 00:13:491164 SSL_set_renegotiate_mode(ssl_.get(), ssl_renegotiate_freely);
davidbenc4212c02015-05-12 22:30:181165
davidbend80c12c2016-10-11 00:13:491166 uint16_t signature_algorithm = SSL_get_peer_signature_algorithm(ssl_.get());
davidben0653c8d2016-07-08 02:16:171167 if (signature_algorithm != 0) {
1168 UMA_HISTOGRAM_SPARSE_SLOWLY("Net.SSLSignatureAlgorithm",
1169 signature_algorithm);
davidben4fe4f982015-11-11 22:00:121170 }
1171
davidbenc4212c02015-05-12 22:30:181172 // Verify the certificate.
1173 UpdateServerCert();
rsleeviadbd4982016-06-13 22:10:271174 next_handshake_state_ = STATE_VERIFY_CERT;
davidbenc4212c02015-05-12 22:30:181175 return OK;
[email protected]b9b651f2013-11-09 04:32:221176}
1177
svaldeze83af292016-04-26 14:33:371178int SSLClientSocketImpl::DoChannelIDLookup() {
mikecironef22f9812016-10-04 03:40:191179 NetLogParametersCallback callback = base::Bind(
nharper49b27d992016-02-09 18:28:511180 &NetLogChannelIDLookupCallback, base::Unretained(channel_id_service_));
mikecirone8b85c432016-09-08 19:11:001181 net_log_.BeginEvent(NetLogEventType::SSL_GET_CHANNEL_ID, callback);
rsleeviadbd4982016-06-13 22:10:271182 next_handshake_state_ = STATE_CHANNEL_ID_LOOKUP_COMPLETE;
[email protected]6b8a3c742014-07-25 00:25:351183 return channel_id_service_->GetOrCreateChannelID(
nharper2e171cf2015-06-01 20:29:231184 host_and_port_.host(), &channel_id_key_,
svaldeze83af292016-04-26 14:33:371185 base::Bind(&SSLClientSocketImpl::OnHandshakeIOComplete,
[email protected]faff9852014-06-21 06:13:461186 base::Unretained(this)),
nharper75ade892015-06-10 19:05:351187 &channel_id_request_);
[email protected]faff9852014-06-21 06:13:461188}
1189
svaldeze83af292016-04-26 14:33:371190int SSLClientSocketImpl::DoChannelIDLookupComplete(int result) {
mikecirone8b85c432016-09-08 19:11:001191 net_log_.EndEvent(NetLogEventType::SSL_GET_CHANNEL_ID,
nharper49b27d992016-02-09 18:28:511192 base::Bind(&NetLogChannelIDLookupCompleteCallback,
1193 channel_id_key_.get(), result));
[email protected]faff9852014-06-21 06:13:461194 if (result < 0)
1195 return result;
1196
[email protected]faff9852014-06-21 06:13:461197 // Hand the key to OpenSSL. Check for error in case OpenSSL rejects the key
1198 // type.
davidben8a208fc2016-01-22 17:08:081199 DCHECK(channel_id_key_);
[email protected]faff9852014-06-21 06:13:461200 crypto::OpenSSLErrStackTracer err_tracer(FROM_HERE);
davidbend80c12c2016-10-11 00:13:491201 if (!SSL_set1_tls_channel_id(ssl_.get(), channel_id_key_->key())) {
[email protected]faff9852014-06-21 06:13:461202 LOG(ERROR) << "Failed to set Channel ID.";
davidbenf225b262016-09-15 22:09:221203 return ERR_FAILED;
[email protected]faff9852014-06-21 06:13:461204 }
1205
1206 // Return to the handshake.
davidben52053b382015-04-27 19:22:291207 channel_id_sent_ = true;
rsleeviadbd4982016-06-13 22:10:271208 next_handshake_state_ = STATE_HANDSHAKE;
[email protected]faff9852014-06-21 06:13:461209 return OK;
1210}
1211
svaldeze83af292016-04-26 14:33:371212int SSLClientSocketImpl::DoVerifyCert(int result) {
davidben30798ed82014-09-19 19:28:201213 DCHECK(!server_cert_chain_->empty());
davidben09c3d072014-08-25 20:33:581214 DCHECK(start_cert_verification_time_.is_null());
davidben30798ed82014-09-19 19:28:201215
rsleeviadbd4982016-06-13 22:10:271216 next_handshake_state_ = STATE_VERIFY_CERT_COMPLETE;
[email protected]b9b651f2013-11-09 04:32:221217
davidbenc6435a72015-08-17 18:28:521218 // OpenSSL decoded the certificate, but the platform certificate
1219 // implementation could not. This is treated as a fatal SSL-level protocol
1220 // error rather than a certificate error. See https://crbug.com/91341.
rsleevi74e99742016-09-13 20:35:251221 if (!server_cert_)
davidbenc6435a72015-08-17 18:28:521222 return ERR_SSL_SERVER_CERT_BAD_FORMAT;
1223
davidben30798ed82014-09-19 19:28:201224 // If the certificate is bad and has been previously accepted, use
1225 // the previous status and bypass the error.
[email protected]b9b651f2013-11-09 04:32:221226 CertStatus cert_status;
rsleevi74e99742016-09-13 20:35:251227 if (ssl_config_.IsAllowedBadCert(server_cert_.get(), &cert_status)) {
[email protected]b9b651f2013-11-09 04:32:221228 server_cert_verify_result_.Reset();
1229 server_cert_verify_result_.cert_status = cert_status;
1230 server_cert_verify_result_.verified_cert = server_cert_;
1231 return OK;
1232 }
1233
davidben09c3d072014-08-25 20:33:581234 start_cert_verification_time_ = base::TimeTicks::Now();
1235
eroman7f9236a2015-05-11 21:23:431236 return cert_verifier_->Verify(
rsleevi06bd78552016-06-08 22:34:461237 CertVerifier::RequestParams(server_cert_, host_and_port_.host(),
1238 ssl_config_.GetCertVerifyFlags(),
dadriand476e652016-07-26 21:33:241239 ocsp_response_, CertificateList()),
[email protected]591cffcd2014-08-18 20:02:301240 // TODO(davidben): Route the CRLSet through SSLConfig so
1241 // SSLClientSocket doesn't depend on SSLConfigService.
davidben15f57132015-04-27 18:08:361242 SSLConfigService::GetCRLSet().get(), &server_cert_verify_result_,
svaldeze83af292016-04-26 14:33:371243 base::Bind(&SSLClientSocketImpl::OnHandshakeIOComplete,
[email protected]b9b651f2013-11-09 04:32:221244 base::Unretained(this)),
eroman7f9236a2015-05-11 21:23:431245 &cert_verifier_request_, net_log_);
[email protected]b9b651f2013-11-09 04:32:221246}
1247
svaldeze83af292016-04-26 14:33:371248int SSLClientSocketImpl::DoVerifyCertComplete(int result) {
eroman7f9236a2015-05-11 21:23:431249 cert_verifier_request_.reset();
[email protected]b9b651f2013-11-09 04:32:221250
davidben09c3d072014-08-25 20:33:581251 if (!start_cert_verification_time_.is_null()) {
1252 base::TimeDelta verify_time =
1253 base::TimeTicks::Now() - start_cert_verification_time_;
1254 if (result == OK) {
1255 UMA_HISTOGRAM_TIMES("Net.SSLCertVerificationTime", verify_time);
1256 } else {
1257 UMA_HISTOGRAM_TIMES("Net.SSLCertVerificationTimeError", verify_time);
1258 }
1259 }
1260
rsleevi4a6ca8c2016-06-24 03:05:221261 // If the connection was good, check HPKP and CT status simultaneously,
1262 // but prefer to treat the HPKP error as more serious, if there was one.
[email protected]8bd4e7a2014-08-09 14:49:171263 const CertStatus cert_status = server_cert_verify_result_.cert_status;
rsleevi4a6ca8c2016-06-24 03:05:221264 if ((result == OK ||
dadrian8f8946652016-06-21 23:48:311265 (IsCertificateError(result) && IsCertStatusMinorError(cert_status)))) {
rsleevi4a6ca8c2016-06-24 03:05:221266 int ct_result = VerifyCT();
dadrian8f8946652016-06-21 23:48:311267 TransportSecurityState::PKPStatus pin_validity =
1268 transport_security_state_->CheckPublicKeyPins(
1269 host_and_port_, server_cert_verify_result_.is_issued_by_known_root,
1270 server_cert_verify_result_.public_key_hashes, server_cert_.get(),
1271 server_cert_verify_result_.verified_cert.get(),
1272 TransportSecurityState::ENABLE_PIN_REPORTS, &pinning_failure_log_);
1273 switch (pin_validity) {
1274 case TransportSecurityState::PKPStatus::VIOLATED:
1275 server_cert_verify_result_.cert_status |=
1276 CERT_STATUS_PINNED_KEY_MISSING;
1277 result = ERR_SSL_PINNED_KEY_NOT_IN_CERT_CHAIN;
1278 break;
1279 case TransportSecurityState::PKPStatus::BYPASSED:
1280 pkp_bypassed_ = true;
1281 // Fall through.
1282 case TransportSecurityState::PKPStatus::OK:
1283 // Do nothing.
1284 break;
rsleevi9545d342016-06-21 03:17:371285 }
rsleevi4a6ca8c2016-06-24 03:05:221286 if (result != ERR_SSL_PINNED_KEY_NOT_IN_CERT_CHAIN && ct_result != OK)
1287 result = ct_result;
[email protected]8bd4e7a2014-08-09 14:49:171288 }
1289
[email protected]b9b651f2013-11-09 04:32:221290 if (result == OK) {
davidbendafe4e52015-04-08 22:53:521291 DCHECK(!certificate_verified_);
1292 certificate_verified_ = true;
1293 MaybeCacheSession();
dadriand476e652016-07-26 21:33:241294 SSLInfo ssl_info;
1295 bool ok = GetSSLInfo(&ssl_info);
1296 DCHECK(ok);
1297 transport_security_state_->CheckExpectStaple(host_and_port_, ssl_info,
1298 ocsp_response_);
[email protected]b9b651f2013-11-09 04:32:221299 }
1300
[email protected]64b5c892014-08-08 09:39:261301 completed_connect_ = true;
[email protected]b9b651f2013-11-09 04:32:221302 // Exit DoHandshakeLoop and return the result to the caller to Connect.
1303 DCHECK_EQ(STATE_NONE, next_handshake_state_);
1304 return result;
1305}
1306
svaldeze83af292016-04-26 14:33:371307void SSLClientSocketImpl::DoConnectCallback(int rv) {
[email protected]b9b651f2013-11-09 04:32:221308 if (!user_connect_callback_.is_null()) {
1309 CompletionCallback c = user_connect_callback_;
1310 user_connect_callback_.Reset();
1311 c.Run(rv > OK ? OK : rv);
1312 }
1313}
1314
svaldeze83af292016-04-26 14:33:371315void SSLClientSocketImpl::UpdateServerCert() {
davidbend80c12c2016-10-11 00:13:491316 server_cert_chain_->Reset(SSL_get_peer_cert_chain(ssl_.get()));
[email protected]7f38da8a2014-03-17 16:44:261317 server_cert_ = server_cert_chain_->AsOSChain();
davidben30798ed82014-09-19 19:28:201318 if (server_cert_.get()) {
mikecirone8b85c432016-09-08 19:11:001319 net_log_.AddEvent(NetLogEventType::SSL_CERTIFICATES_RECEIVED,
svaldeze83af292016-04-26 14:33:371320 base::Bind(&NetLogX509CertificateCallback,
1321 base::Unretained(server_cert_.get())));
davidben30798ed82014-09-19 19:28:201322 }
[email protected]b9b651f2013-11-09 04:32:221323}
1324
svaldeze83af292016-04-26 14:33:371325void SSLClientSocketImpl::OnHandshakeIOComplete(int result) {
[email protected]b9b651f2013-11-09 04:32:221326 int rv = DoHandshakeLoop(result);
1327 if (rv != ERR_IO_PENDING) {
davidben281d13f02016-04-27 20:43:281328 LogConnectEndEvent(rv);
[email protected]b9b651f2013-11-09 04:32:221329 DoConnectCallback(rv);
1330 }
1331}
1332
svaldeze83af292016-04-26 14:33:371333int SSLClientSocketImpl::DoHandshakeLoop(int last_io_result) {
xunjieli0b7f5b62016-12-06 20:43:481334 TRACE_EVENT0(kNetTracingCategory, "SSLClientSocketImpl::DoHandshakeLoop");
[email protected]b9b651f2013-11-09 04:32:221335 int rv = last_io_result;
1336 do {
1337 // Default to STATE_NONE for next state.
1338 // (This is a quirk carried over from the windows
1339 // implementation. It makes reading the logs a bit harder.)
1340 // State handlers can and often do call GotoState just
1341 // to stay in the current state.
1342 State state = next_handshake_state_;
rsleeviadbd4982016-06-13 22:10:271343 next_handshake_state_ = STATE_NONE;
[email protected]b9b651f2013-11-09 04:32:221344 switch (state) {
1345 case STATE_HANDSHAKE:
1346 rv = DoHandshake();
1347 break;
davidbenc4212c02015-05-12 22:30:181348 case STATE_HANDSHAKE_COMPLETE:
1349 rv = DoHandshakeComplete(rv);
1350 break;
[email protected]faff9852014-06-21 06:13:461351 case STATE_CHANNEL_ID_LOOKUP:
1352 DCHECK_EQ(OK, rv);
1353 rv = DoChannelIDLookup();
svaldeze83af292016-04-26 14:33:371354 break;
[email protected]faff9852014-06-21 06:13:461355 case STATE_CHANNEL_ID_LOOKUP_COMPLETE:
1356 rv = DoChannelIDLookupComplete(rv);
1357 break;
[email protected]b9b651f2013-11-09 04:32:221358 case STATE_VERIFY_CERT:
[email protected]faff9852014-06-21 06:13:461359 DCHECK_EQ(OK, rv);
[email protected]b9b651f2013-11-09 04:32:221360 rv = DoVerifyCert(rv);
svaldeze83af292016-04-26 14:33:371361 break;
[email protected]b9b651f2013-11-09 04:32:221362 case STATE_VERIFY_CERT_COMPLETE:
1363 rv = DoVerifyCertComplete(rv);
1364 break;
1365 case STATE_NONE:
1366 default:
1367 rv = ERR_UNEXPECTED;
1368 NOTREACHED() << "unexpected state" << state;
1369 break;
1370 }
[email protected]b9b651f2013-11-09 04:32:221371 } while (rv != ERR_IO_PENDING && next_handshake_state_ != STATE_NONE);
1372 return rv;
1373}
1374
svaldeze83af292016-04-26 14:33:371375int SSLClientSocketImpl::DoPayloadRead() {
[email protected]b9b651f2013-11-09 04:32:221376 crypto::OpenSSLErrStackTracer err_tracer(FROM_HERE);
1377
davidben7e555daf2015-03-25 17:03:291378 DCHECK_LT(0, user_read_buf_len_);
1379 DCHECK(user_read_buf_.get());
1380
[email protected]b9b651f2013-11-09 04:32:221381 int rv;
davidben1d489522015-07-01 18:48:461382 if (pending_read_error_ != kNoPendingResult) {
[email protected]b9b651f2013-11-09 04:32:221383 rv = pending_read_error_;
davidben1d489522015-07-01 18:48:461384 pending_read_error_ = kNoPendingResult;
[email protected]b9b651f2013-11-09 04:32:221385 if (rv == 0) {
mikecirone8b85c432016-09-08 19:11:001386 net_log_.AddByteTransferEvent(NetLogEventType::SSL_SOCKET_BYTES_RECEIVED,
1387 rv, user_read_buf_->data());
davidbenb8c23212014-10-28 00:12:161388 } else {
1389 net_log_.AddEvent(
mikecirone8b85c432016-09-08 19:11:001390 NetLogEventType::SSL_READ_ERROR,
davidbenb8c23212014-10-28 00:12:161391 CreateNetLogOpenSSLErrorCallback(rv, pending_read_ssl_error_,
1392 pending_read_error_info_));
[email protected]b9b651f2013-11-09 04:32:221393 }
davidbenb8c23212014-10-28 00:12:161394 pending_read_ssl_error_ = SSL_ERROR_NONE;
1395 pending_read_error_info_ = OpenSSLErrorInfo();
[email protected]b9b651f2013-11-09 04:32:221396 return rv;
1397 }
1398
1399 int total_bytes_read = 0;
davidben7e555daf2015-03-25 17:03:291400 int ssl_ret;
[email protected]b9b651f2013-11-09 04:32:221401 do {
davidbend80c12c2016-10-11 00:13:491402 ssl_ret = SSL_read(ssl_.get(), user_read_buf_->data() + total_bytes_read,
davidben7e555daf2015-03-25 17:03:291403 user_read_buf_len_ - total_bytes_read);
1404 if (ssl_ret > 0)
1405 total_bytes_read += ssl_ret;
1406 } while (total_bytes_read < user_read_buf_len_ && ssl_ret > 0);
[email protected]b9b651f2013-11-09 04:32:221407
davidben7e555daf2015-03-25 17:03:291408 // Although only the final SSL_read call may have failed, the failure needs to
1409 // processed immediately, while the information still available in OpenSSL's
1410 // error queue.
davidbenced4aa9b2015-05-12 21:22:351411 if (ssl_ret <= 0) {
davidben7e555daf2015-03-25 17:03:291412 // A zero return from SSL_read may mean any of:
1413 // - The underlying BIO_read returned 0.
1414 // - The peer sent a close_notify.
1415 // - Any arbitrary error. https://crbug.com/466303
[email protected]b9b651f2013-11-09 04:32:221416 //
davidben7e555daf2015-03-25 17:03:291417 // TransportReadComplete converts the first to an ERR_CONNECTION_CLOSED
1418 // error, so it does not occur. The second and third are distinguished by
1419 // SSL_ERROR_ZERO_RETURN.
davidbend80c12c2016-10-11 00:13:491420 pending_read_ssl_error_ = SSL_get_error(ssl_.get(), ssl_ret);
davidben7e555daf2015-03-25 17:03:291421 if (pending_read_ssl_error_ == SSL_ERROR_ZERO_RETURN) {
1422 pending_read_error_ = 0;
davidbenced4aa9b2015-05-12 21:22:351423 } else if (pending_read_ssl_error_ == SSL_ERROR_WANT_X509_LOOKUP &&
1424 !ssl_config_.send_client_cert) {
1425 pending_read_error_ = ERR_SSL_CLIENT_AUTH_CERT_NEEDED;
davidben1d489522015-07-01 18:48:461426 } else if (pending_read_ssl_error_ ==
1427 SSL_ERROR_WANT_PRIVATE_KEY_OPERATION) {
svaldez7872fd02015-11-19 21:10:541428 DCHECK(ssl_config_.client_private_key);
davidben1d489522015-07-01 18:48:461429 DCHECK_NE(kNoPendingResult, signature_result_);
1430 pending_read_error_ = ERR_IO_PENDING;
davidben7e555daf2015-03-25 17:03:291431 } else {
davidbenfe132d92016-09-27 18:07:211432 pending_read_error_ = MapLastOpenSSLError(
davidben7e555daf2015-03-25 17:03:291433 pending_read_ssl_error_, err_tracer, &pending_read_error_info_);
[email protected]b9b651f2013-11-09 04:32:221434 }
1435
davidben7e555daf2015-03-25 17:03:291436 // Many servers do not reliably send a close_notify alert when shutting down
1437 // a connection, and instead terminate the TCP connection. This is reported
1438 // as ERR_CONNECTION_CLOSED. Because of this, map the unclean shutdown to a
1439 // graceful EOF, instead of treating it as an error as it should be.
1440 if (pending_read_error_ == ERR_CONNECTION_CLOSED)
1441 pending_read_error_ = 0;
1442 }
davidbenbe6ce7ec2014-10-20 19:15:561443
davidben7e555daf2015-03-25 17:03:291444 if (total_bytes_read > 0) {
1445 // Return any bytes read to the caller. The error will be deferred to the
1446 // next call of DoPayloadRead.
1447 rv = total_bytes_read;
davidbenbe6ce7ec2014-10-20 19:15:561448
davidben7e555daf2015-03-25 17:03:291449 // Do not treat insufficient data as an error to return in the next call to
1450 // DoPayloadRead() - instead, let the call fall through to check SSL_read()
davidben3418e81f2016-10-19 00:09:451451 // again. The transport may have data available by then.
davidben7e555daf2015-03-25 17:03:291452 if (pending_read_error_ == ERR_IO_PENDING)
davidben1d489522015-07-01 18:48:461453 pending_read_error_ = kNoPendingResult;
davidben7e555daf2015-03-25 17:03:291454 } else {
1455 // No bytes were returned. Return the pending read error immediately.
davidben1d489522015-07-01 18:48:461456 DCHECK_NE(kNoPendingResult, pending_read_error_);
davidben7e555daf2015-03-25 17:03:291457 rv = pending_read_error_;
davidben1d489522015-07-01 18:48:461458 pending_read_error_ = kNoPendingResult;
[email protected]b9b651f2013-11-09 04:32:221459 }
1460
1461 if (rv >= 0) {
mikecirone8b85c432016-09-08 19:11:001462 net_log_.AddByteTransferEvent(NetLogEventType::SSL_SOCKET_BYTES_RECEIVED,
1463 rv, user_read_buf_->data());
davidbenb8c23212014-10-28 00:12:161464 } else if (rv != ERR_IO_PENDING) {
1465 net_log_.AddEvent(
mikecirone8b85c432016-09-08 19:11:001466 NetLogEventType::SSL_READ_ERROR,
davidbenb8c23212014-10-28 00:12:161467 CreateNetLogOpenSSLErrorCallback(rv, pending_read_ssl_error_,
1468 pending_read_error_info_));
1469 pending_read_ssl_error_ = SSL_ERROR_NONE;
1470 pending_read_error_info_ = OpenSSLErrorInfo();
[email protected]b9b651f2013-11-09 04:32:221471 }
1472 return rv;
1473}
1474
svaldeze83af292016-04-26 14:33:371475int SSLClientSocketImpl::DoPayloadWrite() {
[email protected]b9b651f2013-11-09 04:32:221476 crypto::OpenSSLErrStackTracer err_tracer(FROM_HERE);
davidbend80c12c2016-10-11 00:13:491477 int rv = SSL_write(ssl_.get(), user_write_buf_->data(), user_write_buf_len_);
rsleevif020edc2015-03-16 19:31:241478
[email protected]b9b651f2013-11-09 04:32:221479 if (rv >= 0) {
mikecirone8b85c432016-09-08 19:11:001480 net_log_.AddByteTransferEvent(NetLogEventType::SSL_SOCKET_BYTES_SENT, rv,
[email protected]b9b651f2013-11-09 04:32:221481 user_write_buf_->data());
1482 return rv;
1483 }
1484
davidbend80c12c2016-10-11 00:13:491485 int ssl_error = SSL_get_error(ssl_.get(), rv);
davidben1d489522015-07-01 18:48:461486 if (ssl_error == SSL_ERROR_WANT_PRIVATE_KEY_OPERATION)
1487 return ERR_IO_PENDING;
davidbenb8c23212014-10-28 00:12:161488 OpenSSLErrorInfo error_info;
davidbenfe132d92016-09-27 18:07:211489 int net_error = MapLastOpenSSLError(ssl_error, err_tracer, &error_info);
davidbenb8c23212014-10-28 00:12:161490
1491 if (net_error != ERR_IO_PENDING) {
1492 net_log_.AddEvent(
mikecirone8b85c432016-09-08 19:11:001493 NetLogEventType::SSL_WRITE_ERROR,
davidbenb8c23212014-10-28 00:12:161494 CreateNetLogOpenSSLErrorCallback(net_error, ssl_error, error_info));
1495 }
1496 return net_error;
[email protected]b9b651f2013-11-09 04:32:221497}
1498
davidben3418e81f2016-10-19 00:09:451499void SSLClientSocketImpl::RetryAllOperations() {
1500 // SSL_do_handshake, SSL_read, and SSL_write may all be retried when blocked,
1501 // so retry all operations for simplicity. (Otherwise, SSL_get_error for each
1502 // operation may be remembered to retry only the blocked ones.)
1503
1504 if (next_handshake_state_ == STATE_HANDSHAKE) {
1505 // In handshake phase. The parameter to OnHandshakeIOComplete is unused.
1506 OnHandshakeIOComplete(OK);
1507 return;
1508 }
1509
davidben1d489522015-07-01 18:48:461510 int rv_read = ERR_IO_PENDING;
1511 int rv_write = ERR_IO_PENDING;
davidben3418e81f2016-10-19 00:09:451512 if (user_read_buf_)
1513 rv_read = DoPayloadRead();
1514 if (user_write_buf_)
1515 rv_write = DoPayloadWrite();
davidben1d489522015-07-01 18:48:461516
1517 // Performing the Read callback may cause |this| to be deleted. If this
1518 // happens, the Write callback should not be invoked. Guard against this by
1519 // holding a WeakPtr to |this| and ensuring it's still valid.
svaldeze83af292016-04-26 14:33:371520 base::WeakPtr<SSLClientSocketImpl> guard(weak_factory_.GetWeakPtr());
davidben3418e81f2016-10-19 00:09:451521 if (rv_read != ERR_IO_PENDING)
davidben1d489522015-07-01 18:48:461522 DoReadCallback(rv_read);
1523
1524 if (!guard.get())
1525 return;
1526
davidben3418e81f2016-10-19 00:09:451527 if (rv_write != ERR_IO_PENDING)
davidben1d489522015-07-01 18:48:461528 DoWriteCallback(rv_write);
1529}
1530
rsleevi4a6ca8c2016-06-24 03:05:221531int SSLClientSocketImpl::VerifyCT() {
rsleevi4a6ca8c2016-06-24 03:05:221532 const uint8_t* sct_list_raw;
1533 size_t sct_list_len;
davidbend80c12c2016-10-11 00:13:491534 SSL_get0_signed_cert_timestamp_list(ssl_.get(), &sct_list_raw, &sct_list_len);
rsleevi4a6ca8c2016-06-24 03:05:221535 std::string sct_list;
1536 if (sct_list_len > 0)
1537 sct_list.assign(reinterpret_cast<const char*>(sct_list_raw), sct_list_len);
1538
1539 // Note that this is a completely synchronous operation: The CT Log Verifier
1540 // gets all the data it needs for SCT verification and does not do any
1541 // external communication.
1542 cert_transparency_verifier_->Verify(
dadriand476e652016-07-26 21:33:241543 server_cert_verify_result_.verified_cert.get(), ocsp_response_, sct_list,
eranmdcec9632016-10-10 14:16:101544 &ct_verify_result_.scts, net_log_);
rsleevi4a6ca8c2016-06-24 03:05:221545
1546 ct_verify_result_.ct_policies_applied = true;
1547 ct_verify_result_.ev_policy_compliance =
1548 ct::EVPolicyCompliance::EV_POLICY_DOES_NOT_APPLY;
eranm4bed0b572016-08-14 21:00:351549
1550 SCTList verified_scts =
1551 ct::SCTsMatchingStatus(ct_verify_result_.scts, ct::SCT_STATUS_OK);
1552
rsleevi4a6ca8c2016-06-24 03:05:221553 if (server_cert_verify_result_.cert_status & CERT_STATUS_IS_EV) {
1554 scoped_refptr<ct::EVCertsWhitelist> ev_whitelist =
1555 SSLConfigService::GetEVCertsWhitelist();
1556 ct::EVPolicyCompliance ev_policy_compliance =
1557 policy_enforcer_->DoesConformToCTEVPolicy(
1558 server_cert_verify_result_.verified_cert.get(), ev_whitelist.get(),
eranm4bed0b572016-08-14 21:00:351559 verified_scts, net_log_);
rsleevi4a6ca8c2016-06-24 03:05:221560 ct_verify_result_.ev_policy_compliance = ev_policy_compliance;
1561 if (ev_policy_compliance !=
1562 ct::EVPolicyCompliance::EV_POLICY_DOES_NOT_APPLY &&
1563 ev_policy_compliance !=
1564 ct::EVPolicyCompliance::EV_POLICY_COMPLIES_VIA_WHITELIST &&
1565 ev_policy_compliance !=
1566 ct::EVPolicyCompliance::EV_POLICY_COMPLIES_VIA_SCTS) {
1567 server_cert_verify_result_.cert_status |=
1568 CERT_STATUS_CT_COMPLIANCE_FAILED;
1569 server_cert_verify_result_.cert_status &= ~CERT_STATUS_IS_EV;
1570 }
1571 }
1572 ct_verify_result_.cert_policy_compliance =
1573 policy_enforcer_->DoesConformToCertPolicy(
eranm4bed0b572016-08-14 21:00:351574 server_cert_verify_result_.verified_cert.get(), verified_scts,
1575 net_log_);
rsleevi4a6ca8c2016-06-24 03:05:221576
1577 if (ct_verify_result_.cert_policy_compliance !=
1578 ct::CertPolicyCompliance::CERT_POLICY_COMPLIES_VIA_SCTS &&
rsleeviec8e4312016-11-12 00:32:281579 ct_verify_result_.cert_policy_compliance !=
1580 ct::CertPolicyCompliance::CERT_POLICY_BUILD_NOT_TIMELY &&
rsleevi4a6ca8c2016-06-24 03:05:221581 transport_security_state_->ShouldRequireCT(
1582 host_and_port_.host(), server_cert_verify_result_.verified_cert.get(),
1583 server_cert_verify_result_.public_key_hashes)) {
1584 server_cert_verify_result_.cert_status |=
1585 CERT_STATUS_CERTIFICATE_TRANSPARENCY_REQUIRED;
1586 return ERR_CERTIFICATE_TRANSPARENCY_REQUIRED;
1587 }
1588
1589 return OK;
1590}
1591
svaldeze83af292016-04-26 14:33:371592int SSLClientSocketImpl::ClientCertRequestCallback(SSL* ssl) {
davidbend80c12c2016-10-11 00:13:491593 DCHECK(ssl == ssl_.get());
[email protected]82c59022014-08-15 09:38:271594
mikecirone8b85c432016-09-08 19:11:001595 net_log_.AddEvent(NetLogEventType::SSL_CLIENT_CERT_REQUESTED);
davidbenfe132d92016-09-27 18:07:211596 certificate_requested_ = true;
davidbenaf42cbe2014-11-13 03:27:461597
[email protected]82c59022014-08-15 09:38:271598 // Clear any currently configured certificates.
davidbend80c12c2016-10-11 00:13:491599 SSL_certs_clear(ssl_.get());
[email protected]97a854f2014-07-29 07:51:361600
1601#if defined(OS_IOS)
1602 // TODO(droger): Support client auth on iOS. See http://crbug.com/145954).
1603 LOG(WARNING) << "Client auth is not supported";
svaldeze83af292016-04-26 14:33:371604#else // !defined(OS_IOS)
[email protected]5ac981e182010-12-06 17:56:271605 if (!ssl_config_.send_client_cert) {
[email protected]515adc22013-01-09 16:01:231606 // First pass: we know that a client certificate is needed, but we do not
1607 // have one at hand.
svaldeze83af292016-04-26 14:33:371608 STACK_OF(X509_NAME)* authorities = SSL_get_client_CA_list(ssl);
[email protected]edfd0f42014-07-22 18:20:371609 for (size_t i = 0; i < sk_X509_NAME_num(authorities); i++) {
svaldeze83af292016-04-26 14:33:371610 X509_NAME* ca_name = (X509_NAME*)sk_X509_NAME_value(authorities, i);
[email protected]515adc22013-01-09 16:01:231611 unsigned char* str = NULL;
1612 int length = i2d_X509_NAME(ca_name, &str);
1613 cert_authorities_.push_back(std::string(
svaldeze83af292016-04-26 14:33:371614 reinterpret_cast<const char*>(str), static_cast<size_t>(length)));
[email protected]515adc22013-01-09 16:01:231615 OPENSSL_free(str);
1616 }
1617
[email protected]c0787702014-05-20 21:51:441618 const unsigned char* client_cert_types;
[email protected]e7e883e2014-07-25 06:03:081619 size_t num_client_cert_types =
1620 SSL_get0_certificate_types(ssl, &client_cert_types);
[email protected]c0787702014-05-20 21:51:441621 for (size_t i = 0; i < num_client_cert_types; i++) {
1622 cert_key_types_.push_back(
1623 static_cast<SSLClientCertType>(client_cert_types[i]));
1624 }
1625
davidbenced4aa9b2015-05-12 21:22:351626 // Suspends handshake. SSL_get_error will return SSL_ERROR_WANT_X509_LOOKUP.
1627 return -1;
[email protected]5ac981e182010-12-06 17:56:271628 }
1629
1630 // Second pass: a client certificate should have been selected.
[email protected]13914c92013-06-13 22:42:421631 if (ssl_config_.client_cert.get()) {
davidbend80c12c2016-10-11 00:13:491632 bssl::UniquePtr<X509> leaf_x509 =
[email protected]6bad5052014-07-12 01:25:131633 OSCertHandleToOpenSSL(ssl_config_.client_cert->os_cert_handle());
1634 if (!leaf_x509) {
1635 LOG(WARNING) << "Failed to import certificate";
1636 OpenSSLPutNetError(FROM_HERE, ERR_SSL_CLIENT_AUTH_CERT_BAD_FORMAT);
1637 return -1;
1638 }
1639
davidbend80c12c2016-10-11 00:13:491640 bssl::UniquePtr<STACK_OF(X509)> chain = OSCertHandlesToOpenSSL(
[email protected]82c59022014-08-15 09:38:271641 ssl_config_.client_cert->GetIntermediateCertificates());
1642 if (!chain) {
1643 LOG(WARNING) << "Failed to import intermediate certificates";
1644 OpenSSLPutNetError(FROM_HERE, ERR_SSL_CLIENT_AUTH_CERT_BAD_FORMAT);
1645 return -1;
1646 }
1647
davidbend80c12c2016-10-11 00:13:491648 if (!SSL_use_certificate(ssl_.get(), leaf_x509.get()) ||
1649 !SSL_set1_chain(ssl_.get(), chain.get())) {
davidben1d489522015-07-01 18:48:461650 LOG(WARNING) << "Failed to set client certificate";
1651 return -1;
1652 }
1653
svaldez7872fd02015-11-19 21:10:541654 if (!ssl_config_.client_private_key) {
1655 // The caller supplied a null private key. Fail the handshake and surface
1656 // an appropriate error to the caller.
davidben1d489522015-07-01 18:48:461657 LOG(WARNING) << "Client cert found without private key";
1658 OpenSSLPutNetError(FROM_HERE, ERR_SSL_CLIENT_AUTH_CERT_NO_PRIVATE_KEY);
1659 return -1;
1660 }
1661
davidbend80c12c2016-10-11 00:13:491662 SSL_set_private_key_method(ssl_.get(), &SSLContext::kPrivateKeyMethod);
svaldezf3db006f2015-09-29 16:43:581663
1664 std::vector<SSLPrivateKey::Hash> digest_prefs =
svaldez7872fd02015-11-19 21:10:541665 ssl_config_.client_private_key->GetDigestPreferences();
svaldezf3db006f2015-09-29 16:43:581666
1667 size_t digests_len = digest_prefs.size();
1668 std::vector<int> digests;
1669 for (size_t i = 0; i < digests_len; i++) {
1670 switch (digest_prefs[i]) {
1671 case SSLPrivateKey::Hash::SHA1:
1672 digests.push_back(NID_sha1);
1673 break;
1674 case SSLPrivateKey::Hash::SHA256:
1675 digests.push_back(NID_sha256);
1676 break;
1677 case SSLPrivateKey::Hash::SHA384:
1678 digests.push_back(NID_sha384);
1679 break;
1680 case SSLPrivateKey::Hash::SHA512:
1681 digests.push_back(NID_sha512);
1682 break;
1683 case SSLPrivateKey::Hash::MD5_SHA1:
1684 // MD5-SHA1 is not used in TLS 1.2.
1685 break;
1686 }
1687 }
1688
davidbend80c12c2016-10-11 00:13:491689 SSL_set_private_key_digest_prefs(ssl_.get(), digests.data(),
1690 digests.size());
davidbenaf42cbe2014-11-13 03:27:461691
1692 int cert_count = 1 + sk_X509_num(chain.get());
mikecirone8b85c432016-09-08 19:11:001693 net_log_.AddEvent(NetLogEventType::SSL_CLIENT_CERT_PROVIDED,
tfarina5e24b242015-10-27 13:11:281694 NetLog::IntCallback("cert_count", cert_count));
[email protected]6bad5052014-07-12 01:25:131695 return 1;
[email protected]c0787702014-05-20 21:51:441696 }
[email protected]97a854f2014-07-29 07:51:361697#endif // defined(OS_IOS)
[email protected]5ac981e182010-12-06 17:56:271698
1699 // Send no client certificate.
mikecirone8b85c432016-09-08 19:11:001700 net_log_.AddEvent(NetLogEventType::SSL_CLIENT_CERT_PROVIDED,
tfarina5e24b242015-10-27 13:11:281701 NetLog::IntCallback("cert_count", 0));
[email protected]82c59022014-08-15 09:38:271702 return 1;
[email protected]5ac981e182010-12-06 17:56:271703}
1704
svaldeze83af292016-04-26 14:33:371705int SSLClientSocketImpl::CertVerifyCallback(X509_STORE_CTX* store_ctx) {
[email protected]64b5c892014-08-08 09:39:261706 if (!completed_connect_) {
[email protected]b051cdb62014-02-28 02:20:161707 // If the first handshake hasn't completed then we accept any certificates
1708 // because we verify after the handshake.
1709 return 1;
1710 }
1711
davidben30798ed82014-09-19 19:28:201712 // Disallow the server certificate to change in a renegotiation.
1713 if (server_cert_chain_->empty()) {
[email protected]76e85392014-03-20 17:54:141714 LOG(ERROR) << "Received invalid certificate chain between handshakes";
davidben30798ed82014-09-19 19:28:201715 return 0;
1716 }
1717 base::StringPiece old_der, new_der;
1718 if (store_ctx->cert == NULL ||
1719 !x509_util::GetDER(server_cert_chain_->Get(0), &old_der) ||
1720 !x509_util::GetDER(store_ctx->cert, &new_der)) {
1721 LOG(ERROR) << "Failed to encode certificates";
1722 return 0;
1723 }
1724 if (old_der != new_der) {
[email protected]76e85392014-03-20 17:54:141725 LOG(ERROR) << "Server certificate changed between handshakes";
davidben30798ed82014-09-19 19:28:201726 return 0;
1727 }
1728
1729 return 1;
[email protected]b051cdb62014-02-28 02:20:161730}
1731
svaldeze83af292016-04-26 14:33:371732void SSLClientSocketImpl::MaybeCacheSession() {
davidben44aeae62015-06-24 20:47:431733 // Only cache the session once both a new session has been established and the
1734 // certificate has been verified. Due to False Start, these events may happen
1735 // in either order.
davidbenc269cc4b2016-07-27 14:55:031736 if (!pending_session_ || !certificate_verified_)
davidbendafe4e52015-04-08 22:53:521737 return;
davidbendafe4e52015-04-08 22:53:521738
1739 SSLContext::GetInstance()->session_cache()->Insert(GetSessionCacheKey(),
davidbenc269cc4b2016-07-27 14:55:031740 pending_session_.get());
1741 pending_session_ = nullptr;
davidbendafe4e52015-04-08 22:53:521742}
1743
svaldeze83af292016-04-26 14:33:371744int SSLClientSocketImpl::NewSessionCallback(SSL_SESSION* session) {
davidbenc269cc4b2016-07-27 14:55:031745 // OpenSSL passes a reference to |session|.
1746 pending_session_.reset(session);
davidbendafe4e52015-04-08 22:53:521747 MaybeCacheSession();
davidben44aeae62015-06-24 20:47:431748 return 1;
davidbendafe4e52015-04-08 22:53:521749}
1750
svaldeze83af292016-04-26 14:33:371751void SSLClientSocketImpl::AddCTInfoToSSLInfo(SSLInfo* ssl_info) const {
estark723b5eeb2016-02-18 21:01:121752 ssl_info->UpdateCertificateTransparencyInfo(ct_verify_result_);
davidbeneb5f8ef32014-09-04 14:14:321753}
1754
svaldeze83af292016-04-26 14:33:371755std::string SSLClientSocketImpl::GetSessionCacheKey() const {
rsleevif020edc2015-03-16 19:31:241756 std::string result = host_and_port_.ToString();
1757 result.append("/");
1758 result.append(ssl_session_cache_shard_);
1759
davidbena4c9d062015-04-03 22:34:251760 result.append("/");
davidben14b1a532015-10-30 16:01:091761 if (ssl_config_.deprecated_cipher_suites_enabled)
davidbena4c9d062015-04-03 22:34:251762 result.append("deprecated");
1763
davidbenee39de02015-10-16 19:53:181764 result.append("/");
1765 if (ssl_config_.channel_id_enabled)
1766 result.append("channelid");
1767
rsleevif020edc2015-03-16 19:31:241768 return result;
1769}
1770
svaldeze83af292016-04-26 14:33:371771bool SSLClientSocketImpl::IsRenegotiationAllowed() const {
nharper736ceda2015-11-07 00:16:591772 if (tb_was_negotiated_)
1773 return false;
1774
bncce6ea242016-09-15 20:22:321775 if (negotiated_protocol_ == kProtoUnknown)
davidben421116c2015-05-12 19:56:511776 return ssl_config_.renego_allowed_default;
1777
davidben421116c2015-05-12 19:56:511778 for (NextProto allowed : ssl_config_.renego_allowed_for_protos) {
bnc3cf2a592016-08-11 14:48:361779 if (negotiated_protocol_ == allowed)
davidben421116c2015-05-12 19:56:511780 return true;
1781 }
1782 return false;
1783}
1784
svaldeze83af292016-04-26 14:33:371785int SSLClientSocketImpl::PrivateKeyTypeCallback() {
svaldez7872fd02015-11-19 21:10:541786 switch (ssl_config_.client_private_key->GetType()) {
davidben1d489522015-07-01 18:48:461787 case SSLPrivateKey::Type::RSA:
davidben1c09a432016-10-13 19:17:341788 return NID_rsaEncryption;
1789 case SSLPrivateKey::Type::ECDSA_P256:
1790 return NID_X9_62_prime256v1;
1791 case SSLPrivateKey::Type::ECDSA_P384:
1792 return NID_secp384r1;
1793 case SSLPrivateKey::Type::ECDSA_P521:
1794 return NID_secp521r1;
davidben1d489522015-07-01 18:48:461795 }
1796 NOTREACHED();
davidben1c09a432016-10-13 19:17:341797 return NID_undef;
davidben1d489522015-07-01 18:48:461798}
1799
svaldeze83af292016-04-26 14:33:371800size_t SSLClientSocketImpl::PrivateKeyMaxSignatureLenCallback() {
svaldez7872fd02015-11-19 21:10:541801 return ssl_config_.client_private_key->GetMaxSignatureLengthInBytes();
davidben1d489522015-07-01 18:48:461802}
1803
davidben0bca07fd2016-07-18 15:12:031804ssl_private_key_result_t SSLClientSocketImpl::PrivateKeySignDigestCallback(
davidben1d489522015-07-01 18:48:461805 uint8_t* out,
1806 size_t* out_len,
1807 size_t max_out,
1808 const EVP_MD* md,
1809 const uint8_t* in,
1810 size_t in_len) {
1811 DCHECK_EQ(kNoPendingResult, signature_result_);
1812 DCHECK(signature_.empty());
svaldez7872fd02015-11-19 21:10:541813 DCHECK(ssl_config_.client_private_key);
davidben1d489522015-07-01 18:48:461814
davidben1d489522015-07-01 18:48:461815 SSLPrivateKey::Hash hash;
1816 if (!EVP_MDToPrivateKeyHash(md, &hash)) {
1817 OpenSSLPutNetError(FROM_HERE, ERR_SSL_CLIENT_AUTH_SIGNATURE_FAILED);
1818 return ssl_private_key_failure;
1819 }
1820
davidben752bcf22015-12-21 22:55:501821 net_log_.BeginEvent(
mikecirone8b85c432016-09-08 19:11:001822 NetLogEventType::SSL_PRIVATE_KEY_OP,
davidben752bcf22015-12-21 22:55:501823 base::Bind(&NetLogPrivateKeyOperationCallback,
1824 ssl_config_.client_private_key->GetType(), hash));
1825
davidben1d489522015-07-01 18:48:461826 signature_result_ = ERR_IO_PENDING;
svaldez7872fd02015-11-19 21:10:541827 ssl_config_.client_private_key->SignDigest(
davidben1d489522015-07-01 18:48:461828 hash, base::StringPiece(reinterpret_cast<const char*>(in), in_len),
davidben0bca07fd2016-07-18 15:12:031829 base::Bind(&SSLClientSocketImpl::OnPrivateKeyComplete,
davidben1d489522015-07-01 18:48:461830 weak_factory_.GetWeakPtr()));
1831 return ssl_private_key_retry;
1832}
1833
davidben0bca07fd2016-07-18 15:12:031834ssl_private_key_result_t SSLClientSocketImpl::PrivateKeyCompleteCallback(
davidben1d489522015-07-01 18:48:461835 uint8_t* out,
1836 size_t* out_len,
1837 size_t max_out) {
1838 DCHECK_NE(kNoPendingResult, signature_result_);
svaldez7872fd02015-11-19 21:10:541839 DCHECK(ssl_config_.client_private_key);
davidben1d489522015-07-01 18:48:461840
1841 if (signature_result_ == ERR_IO_PENDING)
1842 return ssl_private_key_retry;
1843 if (signature_result_ != OK) {
1844 OpenSSLPutNetError(FROM_HERE, signature_result_);
1845 return ssl_private_key_failure;
1846 }
1847 if (signature_.size() > max_out) {
1848 OpenSSLPutNetError(FROM_HERE, ERR_SSL_CLIENT_AUTH_SIGNATURE_FAILED);
1849 return ssl_private_key_failure;
1850 }
davidben5f8b6bc2015-11-25 03:19:541851 memcpy(out, signature_.data(), signature_.size());
davidben1d489522015-07-01 18:48:461852 *out_len = signature_.size();
1853 signature_.clear();
1854 return ssl_private_key_success;
1855}
1856
davidben0bca07fd2016-07-18 15:12:031857void SSLClientSocketImpl::OnPrivateKeyComplete(
davidben1d489522015-07-01 18:48:461858 Error error,
1859 const std::vector<uint8_t>& signature) {
1860 DCHECK_EQ(ERR_IO_PENDING, signature_result_);
1861 DCHECK(signature_.empty());
svaldez7872fd02015-11-19 21:10:541862 DCHECK(ssl_config_.client_private_key);
davidben1d489522015-07-01 18:48:461863
mikecirone8b85c432016-09-08 19:11:001864 net_log_.EndEventWithNetErrorCode(NetLogEventType::SSL_PRIVATE_KEY_OP, error);
davidben1d489522015-07-01 18:48:461865
1866 signature_result_ = error;
1867 if (signature_result_ == OK)
1868 signature_ = signature;
1869
davidben1d489522015-07-01 18:48:461870 // During a renegotiation, either Read or Write calls may be blocked on an
1871 // asynchronous private key operation.
davidben3418e81f2016-10-19 00:09:451872 RetryAllOperations();
davidben1d489522015-07-01 18:48:461873}
1874
svaldeze83af292016-04-26 14:33:371875int SSLClientSocketImpl::TokenBindingAdd(const uint8_t** out,
1876 size_t* out_len,
1877 int* out_alert_value) {
nharper736ceda2015-11-07 00:16:591878 if (ssl_config_.token_binding_params.empty()) {
1879 return 0;
1880 }
davidbend80c12c2016-10-11 00:13:491881 bssl::ScopedCBB output;
nharper736ceda2015-11-07 00:16:591882 CBB parameters_list;
1883 if (!CBB_init(output.get(), 7) ||
1884 !CBB_add_u8(output.get(), kTbProtocolVersionMajor) ||
1885 !CBB_add_u8(output.get(), kTbProtocolVersionMinor) ||
1886 !CBB_add_u8_length_prefixed(output.get(), &parameters_list)) {
1887 *out_alert_value = SSL_AD_INTERNAL_ERROR;
1888 return -1;
1889 }
1890 for (size_t i = 0; i < ssl_config_.token_binding_params.size(); ++i) {
1891 if (!CBB_add_u8(&parameters_list, ssl_config_.token_binding_params[i])) {
1892 *out_alert_value = SSL_AD_INTERNAL_ERROR;
1893 return -1;
1894 }
1895 }
1896 // |*out| will be freed by TokenBindingFreeCallback.
1897 if (!CBB_finish(output.get(), const_cast<uint8_t**>(out), out_len)) {
1898 *out_alert_value = SSL_AD_INTERNAL_ERROR;
1899 return -1;
1900 }
1901
1902 return 1;
1903}
1904
svaldeze83af292016-04-26 14:33:371905int SSLClientSocketImpl::TokenBindingParse(const uint8_t* contents,
1906 size_t contents_len,
1907 int* out_alert_value) {
nharper736ceda2015-11-07 00:16:591908 if (completed_connect_) {
1909 // Token Binding may only be negotiated on the initial handshake.
1910 *out_alert_value = SSL_AD_ILLEGAL_PARAMETER;
1911 return 0;
1912 }
1913
1914 CBS extension;
1915 CBS_init(&extension, contents, contents_len);
1916
1917 CBS parameters_list;
1918 uint8_t version_major, version_minor, param;
1919 if (!CBS_get_u8(&extension, &version_major) ||
1920 !CBS_get_u8(&extension, &version_minor) ||
1921 !CBS_get_u8_length_prefixed(&extension, &parameters_list) ||
1922 !CBS_get_u8(&parameters_list, &param) || CBS_len(&parameters_list) > 0 ||
1923 CBS_len(&extension) > 0) {
1924 *out_alert_value = SSL_AD_DECODE_ERROR;
1925 return 0;
1926 }
1927 // The server-negotiated version must be less than or equal to our version.
1928 if (version_major > kTbProtocolVersionMajor ||
1929 (version_minor > kTbProtocolVersionMinor &&
1930 version_major == kTbProtocolVersionMajor)) {
1931 *out_alert_value = SSL_AD_ILLEGAL_PARAMETER;
1932 return 0;
1933 }
1934 // If the version the server negotiated is older than we support, don't fail
1935 // parsing the extension, but also don't set |negotiated_|.
1936 if (version_major < kTbMinProtocolVersionMajor ||
1937 (version_minor < kTbMinProtocolVersionMinor &&
1938 version_major == kTbMinProtocolVersionMajor)) {
1939 return 1;
1940 }
1941
1942 for (size_t i = 0; i < ssl_config_.token_binding_params.size(); ++i) {
1943 if (param == ssl_config_.token_binding_params[i]) {
1944 tb_negotiated_param_ = ssl_config_.token_binding_params[i];
1945 tb_was_negotiated_ = true;
1946 return 1;
1947 }
1948 }
1949
1950 *out_alert_value = SSL_AD_ILLEGAL_PARAMETER;
1951 return 0;
1952}
1953
davidben281d13f02016-04-27 20:43:281954void SSLClientSocketImpl::LogConnectEndEvent(int rv) {
1955 if (rv != OK) {
mikecirone8b85c432016-09-08 19:11:001956 net_log_.EndEventWithNetErrorCode(NetLogEventType::SSL_CONNECT, rv);
davidben281d13f02016-04-27 20:43:281957 return;
1958 }
1959
mikecirone8b85c432016-09-08 19:11:001960 net_log_.EndEvent(NetLogEventType::SSL_CONNECT,
davidben281d13f02016-04-27 20:43:281961 base::Bind(&NetLogSSLInfoCallback, base::Unretained(this)));
1962}
1963
bncbd442c22016-09-14 20:49:161964void SSLClientSocketImpl::RecordNegotiatedProtocol() const {
1965 UMA_HISTOGRAM_ENUMERATION("Net.SSLNegotiatedAlpnProtocol",
1966 negotiated_protocol_, kProtoLast + 1);
bnc3cf2a592016-08-11 14:48:361967}
1968
1969void SSLClientSocketImpl::RecordChannelIDSupport() const {
1970 // Since this enum is used for a histogram, do not change or re-use values.
1971 enum {
1972 DISABLED = 0,
1973 CLIENT_ONLY = 1,
1974 CLIENT_AND_SERVER = 2,
1975 // CLIENT_NO_ECC is unused now.
1976 // CLIENT_BAD_SYSTEM_TIME is unused now.
1977 CLIENT_BAD_SYSTEM_TIME = 4,
1978 CLIENT_NO_CHANNEL_ID_SERVICE = 5,
1979 CHANNEL_ID_USAGE_MAX
1980 } supported = DISABLED;
1981 if (channel_id_sent_) {
1982 supported = CLIENT_AND_SERVER;
1983 } else if (ssl_config_.channel_id_enabled) {
1984 if (!channel_id_service_)
1985 supported = CLIENT_NO_CHANNEL_ID_SERVICE;
1986 else
1987 supported = CLIENT_ONLY;
1988 }
1989 UMA_HISTOGRAM_ENUMERATION("DomainBoundCerts.Support", supported,
1990 CHANNEL_ID_USAGE_MAX);
1991}
1992
1993bool SSLClientSocketImpl::IsChannelIDEnabled() const {
1994 return ssl_config_.channel_id_enabled && channel_id_service_;
1995}
1996
davidbenfe132d92016-09-27 18:07:211997int SSLClientSocketImpl::MapLastOpenSSLError(
1998 int ssl_error,
1999 const crypto::OpenSSLErrStackTracer& tracer,
2000 OpenSSLErrorInfo* info) {
2001 int net_error = MapOpenSSLErrorWithDetails(ssl_error, tracer, info);
2002
2003 if (ssl_error == SSL_ERROR_SSL &&
2004 ERR_GET_LIB(info->error_code) == ERR_LIB_SSL) {
2005 // TLS does not provide an alert for missing client certificates, so most
2006 // servers send a generic handshake_failure alert. Detect this case by
2007 // checking if we have received a CertificateRequest but sent no
2008 // certificate. See https://crbug.com/646567.
2009 if (ERR_GET_REASON(info->error_code) ==
2010 SSL_R_SSLV3_ALERT_HANDSHAKE_FAILURE &&
2011 certificate_requested_ && ssl_config_.send_client_cert &&
2012 !ssl_config_.client_cert) {
2013 net_error = ERR_BAD_SSL_CLIENT_AUTH_CERT;
2014 }
2015
2016 // Per spec, access_denied is only for client-certificate-based access
2017 // control, but some buggy firewalls use it when blocking a page. To avoid a
2018 // confusing error, map it to a generic protocol error if no
2019 // CertificateRequest was sent. See https://crbug.com/630883.
2020 if (ERR_GET_REASON(info->error_code) == SSL_R_TLSV1_ALERT_ACCESS_DENIED &&
2021 !certificate_requested_) {
2022 net_error = ERR_SSL_PROTOCOL_ERROR;
2023 }
2024 }
2025
2026 return net_error;
2027}
2028
[email protected]7e5dd49f2010-12-08 18:33:492029} // namespace net