blob: 44570a1446852ae03f7cd9d864b2465fb58a65b7 [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
mabb51c5142016-12-07 09:32:4010#include <algorithm>
davidben752bcf22015-12-21 22:55:5011#include <utility>
12
[email protected]0f7804ec2011-10-07 20:04:1813#include "base/bind.h"
[email protected]f2da6ac2013-02-04 08:22:5314#include "base/callback_helpers.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"
nharper49b27d992016-02-09 18:28:5121#include "base/strings/string_number_conversions.h"
davidben018aad62014-09-12 02:25:1922#include "base/strings/string_piece.h"
xunjieli9f8c5fb52016-12-07 22:59:3323#include "base/strings/stringprintf.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"
xunjieli9f8c5fb52016-12-07 22:59:3326#include "base/trace_event/process_memory_dump.h"
ssid6d6b40102016-04-05 18:59:5627#include "base/trace_event/trace_event.h"
estade5e5529d2015-05-21 20:59:1128#include "base/values.h"
[email protected]ee0f2aa82013-10-25 11:59:2629#include "crypto/ec_private_key.h"
[email protected]4b559b4d2011-04-14 17:37:1430#include "crypto/openssl_util.h"
martijna2e83bd2016-03-18 13:10:4531#include "net/base/ip_address.h"
[email protected]d518cd92010-09-29 12:27:4432#include "net/base/net_errors.h"
xunjieli0b7f5b62016-12-06 20:43:4833#include "net/base/trace_constants.h"
[email protected]6e7845ae2013-03-29 21:48:1134#include "net/cert/cert_verifier.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"
mattm316af822017-02-23 04:05:5639#include "net/cert/x509_util.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;
nharper96d085c2017-02-22 20:10:2182const uint8_t kTbProtocolVersionMinor = 13;
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::Hash hash,
110 NetLogCaptureMode mode) {
davidben752bcf22015-12-21 22:55:50111 std::string hash_str;
112 switch (hash) {
113 case SSLPrivateKey::Hash::MD5_SHA1:
114 hash_str = "MD5_SHA1";
115 break;
116 case SSLPrivateKey::Hash::SHA1:
117 hash_str = "SHA1";
118 break;
119 case SSLPrivateKey::Hash::SHA256:
120 hash_str = "SHA256";
121 break;
122 case SSLPrivateKey::Hash::SHA384:
123 hash_str = "SHA384";
124 break;
125 case SSLPrivateKey::Hash::SHA512:
126 hash_str = "SHA512";
127 break;
128 }
129
danakj655b66c2016-04-16 00:51:38130 std::unique_ptr<base::DictionaryValue> value(new base::DictionaryValue);
davidben752bcf22015-12-21 22:55:50131 value->SetString("hash", hash_str);
132 return std::move(value);
133}
134
danakj655b66c2016-04-16 00:51:38135std::unique_ptr<base::Value> NetLogChannelIDLookupCallback(
nharper49b27d992016-02-09 18:28:51136 ChannelIDService* channel_id_service,
137 NetLogCaptureMode capture_mode) {
138 ChannelIDStore* store = channel_id_service->GetChannelIDStore();
danakj655b66c2016-04-16 00:51:38139 std::unique_ptr<base::DictionaryValue> dict(new base::DictionaryValue());
nharper49b27d992016-02-09 18:28:51140 dict->SetBoolean("ephemeral", store->IsEphemeral());
141 dict->SetString("service", base::HexEncode(&channel_id_service,
142 sizeof(channel_id_service)));
143 dict->SetString("store", base::HexEncode(&store, sizeof(store)));
144 return std::move(dict);
145}
146
danakj655b66c2016-04-16 00:51:38147std::unique_ptr<base::Value> NetLogChannelIDLookupCompleteCallback(
nharper49b27d992016-02-09 18:28:51148 crypto::ECPrivateKey* key,
149 int result,
150 NetLogCaptureMode capture_mode) {
danakj655b66c2016-04-16 00:51:38151 std::unique_ptr<base::DictionaryValue> dict(new base::DictionaryValue());
nharper49b27d992016-02-09 18:28:51152 dict->SetInteger("net_error", result);
153 std::string raw_key;
154 if (result == OK && key && key->ExportRawPublicKey(&raw_key)) {
nharper837b2af2016-12-21 21:48:36155 std::string key_to_log = base::HexEncode(raw_key.data(), raw_key.length());
nharper49b27d992016-02-09 18:28:51156 dict->SetString("key", key_to_log);
157 }
158 return std::move(dict);
159}
160
davidben281d13f02016-04-27 20:43:28161std::unique_ptr<base::Value> NetLogSSLInfoCallback(
162 SSLClientSocketImpl* socket,
163 NetLogCaptureMode capture_mode) {
164 SSLInfo ssl_info;
165 if (!socket->GetSSLInfo(&ssl_info))
166 return nullptr;
167
168 std::unique_ptr<base::DictionaryValue> dict(new base::DictionaryValue());
169 const char* version_str;
170 SSLVersionToString(&version_str,
171 SSLConnectionStatusToVersion(ssl_info.connection_status));
172 dict->SetString("version", version_str);
173 dict->SetBoolean("is_resumed",
174 ssl_info.handshake_type == SSLInfo::HANDSHAKE_RESUME);
175 dict->SetInteger("cipher_suite", SSLConnectionStatusToCipherSuite(
176 ssl_info.connection_status));
177
bnc3472afd2016-11-17 15:27:21178 dict->SetString("next_proto",
179 NextProtoToString(socket->GetNegotiatedProtocol()));
davidben281d13f02016-04-27 20:43:28180
181 return std::move(dict);
182}
183
davidben3418e81f2016-10-19 00:09:45184int GetBufferSize(const char* field_trial) {
185 // Get buffer sizes from field trials, if possible. If values not present,
186 // use default. Also make sure values are in reasonable range.
187 int buffer_size = kDefaultOpenSSLBufferSize;
188#if !defined(OS_NACL)
189 int override_buffer_size;
190 if (base::StringToInt(base::FieldTrialList::FindFullName(field_trial),
191 &override_buffer_size)) {
192 buffer_size = override_buffer_size;
193 buffer_size = std::max(buffer_size, 1000);
194 buffer_size = std::min(buffer_size, 2 * kDefaultOpenSSLBufferSize);
195 }
196#endif // !defined(OS_NACL)
197 return buffer_size;
198}
199
davidbencef9e212017-04-19 15:00:10200std::unique_ptr<base::Value> NetLogSSLAlertCallback(
201 const void* bytes,
202 size_t len,
203 NetLogCaptureMode capture_mode) {
204 std::unique_ptr<base::DictionaryValue> dict(new base::DictionaryValue());
205 dict->SetString("hex_encoded_bytes", base::HexEncode(bytes, len));
206 return std::move(dict);
207}
208
209std::unique_ptr<base::Value> NetLogSSLMessageCallback(
210 bool is_write,
211 const void* bytes,
212 size_t len,
213 NetLogCaptureMode capture_mode) {
214 std::unique_ptr<base::DictionaryValue> dict(new base::DictionaryValue());
215 if (len == 0) {
216 NOTREACHED();
217 return std::move(dict);
218 }
219
220 // The handshake message type is the first byte. Include it so elided messages
221 // still report their type.
222 uint8_t type = reinterpret_cast<const uint8_t*>(bytes)[0];
223 dict->SetInteger("type", type);
224
225 // Elide client certificate messages unless logging socket bytes. The client
226 // certificate does not contain information needed to impersonate the user
227 // (that's the private key which isn't sent over the wire), but it may contain
228 // information on the user's identity.
229 if (!is_write || type != SSL3_MT_CERTIFICATE ||
230 capture_mode.include_socket_bytes()) {
231 dict->SetString("hex_encoded_bytes", base::HexEncode(bytes, len));
232 }
233
234 return std::move(dict);
235}
236
[email protected]821e3bb2013-11-08 01:06:01237} // namespace
238
svaldeze83af292016-04-26 14:33:37239class SSLClientSocketImpl::SSLContext {
[email protected]fbef13932010-11-23 12:38:53240 public:
olli.raula36aa8be2015-09-10 11:14:22241 static SSLContext* GetInstance() {
fdoray33e7c3c52017-01-19 18:37:23242 return base::Singleton<SSLContext,
243 base::LeakySingletonTraits<SSLContext>>::get();
olli.raula36aa8be2015-09-10 11:14:22244 }
[email protected]fbef13932010-11-23 12:38:53245 SSL_CTX* ssl_ctx() { return ssl_ctx_.get(); }
svaldeze83af292016-04-26 14:33:37246 SSLClientSessionCache* session_cache() { return &session_cache_; }
[email protected]fbef13932010-11-23 12:38:53247
svaldeze83af292016-04-26 14:33:37248 SSLClientSocketImpl* GetClientSocketFromSSL(const SSL* ssl) {
[email protected]fbef13932010-11-23 12:38:53249 DCHECK(ssl);
svaldeze83af292016-04-26 14:33:37250 SSLClientSocketImpl* socket = static_cast<SSLClientSocketImpl*>(
[email protected]fbef13932010-11-23 12:38:53251 SSL_get_ex_data(ssl, ssl_socket_data_index_));
252 DCHECK(socket);
253 return socket;
254 }
255
svaldeze83af292016-04-26 14:33:37256 bool SetClientSocketForSSL(SSL* ssl, SSLClientSocketImpl* socket) {
[email protected]fbef13932010-11-23 12:38:53257 return SSL_set_ex_data(ssl, ssl_socket_data_index_, socket) != 0;
258 }
259
davidben2a811e4e2015-12-01 10:49:34260#if !defined(OS_NACL)
David Benjamindc2f4b02017-07-27 23:59:02261 void SetSSLKeyLogFile(const base::FilePath& path) {
davidben2a811e4e2015-12-01 10:49:34262 DCHECK(!ssl_key_logger_);
David Benjamindc2f4b02017-07-27 23:59:02263 ssl_key_logger_.reset(new SSLKeyLogger(path));
davidben2a811e4e2015-12-01 10:49:34264 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);
davidbena35b40c32017-03-09 17:33:45277 ssl_ctx_.reset(SSL_CTX_new(TLS_with_buffers_method()));
[email protected]82c59022014-08-15 09:38:27278 SSL_CTX_set_cert_cb(ssl_ctx_.get(), ClientCertRequestCallback, NULL);
davidbena35b40c32017-03-09 17:33:45279
280 // The server certificate is verified after the handshake in DoVerifyCert.
Steven Valdez3eaa9962017-07-18 21:51:05281 SSL_CTX_set_custom_verify(ssl_ctx_.get(), SSL_VERIFY_PEER,
282 CertVerifyCallback);
davidbendafe4e52015-04-08 22:53:52283
284 // Disable the internal session cache. Session caching is handled
svaldeze83af292016-04-26 14:33:37285 // externally (i.e. by SSLClientSessionCache).
davidbendafe4e52015-04-08 22:53:52286 SSL_CTX_set_session_cache_mode(
287 ssl_ctx_.get(), SSL_SESS_CACHE_CLIENT | SSL_SESS_CACHE_NO_INTERNAL);
davidben44aeae62015-06-24 20:47:43288 SSL_CTX_sess_set_new_cb(ssl_ctx_.get(), NewSessionCallback);
davidben99ce6302016-11-09 17:30:28289 SSL_CTX_set_timeout(ssl_ctx_.get(), 1 * 60 * 60 /* one hour */);
nharper736ceda2015-11-07 00:16:59290
davidbenfacfac7b2016-09-27 22:39:53291 SSL_CTX_set_grease_enabled(ssl_ctx_.get(), 1);
292
davidbenbf0fcf12017-02-10 21:00:34293 // Deduplicate all certificates minted from the SSL_CTX in memory.
294 SSL_CTX_set0_buffer_pool(ssl_ctx_.get(), x509_util::GetBufferPool());
295
davidbencef9e212017-04-19 15:00:10296 SSL_CTX_set_msg_callback(ssl_ctx_.get(), MessageCallback);
297
nharper736ceda2015-11-07 00:16:59298 if (!SSL_CTX_add_client_custom_ext(ssl_ctx_.get(), kTbExtNum,
299 &TokenBindingAddCallback,
300 &TokenBindingFreeCallback, nullptr,
301 &TokenBindingParseCallback, nullptr)) {
302 NOTREACHED();
303 }
304 }
305
306 static int TokenBindingAddCallback(SSL* ssl,
307 unsigned int extension_value,
308 const uint8_t** out,
309 size_t* out_len,
310 int* out_alert_value,
311 void* add_arg) {
312 DCHECK_EQ(extension_value, kTbExtNum);
svaldeze83af292016-04-26 14:33:37313 SSLClientSocketImpl* socket =
314 SSLClientSocketImpl::SSLContext::GetInstance()->GetClientSocketFromSSL(
315 ssl);
nharper736ceda2015-11-07 00:16:59316 return socket->TokenBindingAdd(out, out_len, out_alert_value);
317 }
318
319 static void TokenBindingFreeCallback(SSL* ssl,
320 unsigned extension_value,
321 const uint8_t* out,
322 void* add_arg) {
323 DCHECK_EQ(extension_value, kTbExtNum);
324 OPENSSL_free(const_cast<unsigned char*>(out));
325 }
326
327 static int TokenBindingParseCallback(SSL* ssl,
328 unsigned int extension_value,
329 const uint8_t* contents,
330 size_t contents_len,
331 int* out_alert_value,
332 void* parse_arg) {
333 DCHECK_EQ(extension_value, kTbExtNum);
svaldeze83af292016-04-26 14:33:37334 SSLClientSocketImpl* socket =
335 SSLClientSocketImpl::SSLContext::GetInstance()->GetClientSocketFromSSL(
336 ssl);
nharper736ceda2015-11-07 00:16:59337 return socket->TokenBindingParse(contents, contents_len, out_alert_value);
[email protected]fbef13932010-11-23 12:38:53338 }
339
[email protected]82c59022014-08-15 09:38:27340 static int ClientCertRequestCallback(SSL* ssl, void* arg) {
svaldeze83af292016-04-26 14:33:37341 SSLClientSocketImpl* socket = GetInstance()->GetClientSocketFromSSL(ssl);
[email protected]82c59022014-08-15 09:38:27342 DCHECK(socket);
343 return socket->ClientCertRequestCallback(ssl);
[email protected]718c9672010-12-02 10:04:10344 }
345
Steven Valdez3eaa9962017-07-18 21:51:05346 static ssl_verify_result_t CertVerifyCallback(SSL* ssl, uint8_t* out_alert) {
347 // The certificate is verified after the handshake in DoVerifyCert.
348 return ssl_verify_ok;
349 }
350
davidben44aeae62015-06-24 20:47:43351 static int NewSessionCallback(SSL* ssl, SSL_SESSION* session) {
svaldeze83af292016-04-26 14:33:37352 SSLClientSocketImpl* socket = GetInstance()->GetClientSocketFromSSL(ssl);
davidben44aeae62015-06-24 20:47:43353 return socket->NewSessionCallback(session);
davidbendafe4e52015-04-08 22:53:52354 }
355
davidben0bca07fd2016-07-18 15:12:03356 static ssl_private_key_result_t PrivateKeySignDigestCallback(
davidben1d489522015-07-01 18:48:46357 SSL* ssl,
358 uint8_t* out,
359 size_t* out_len,
davidben0bca07fd2016-07-18 15:12:03360 size_t max_out,
361 const EVP_MD* md,
362 const uint8_t* in,
363 size_t in_len) {
svaldeze83af292016-04-26 14:33:37364 SSLClientSocketImpl* socket = GetInstance()->GetClientSocketFromSSL(ssl);
davidben0bca07fd2016-07-18 15:12:03365 return socket->PrivateKeySignDigestCallback(out, out_len, max_out, md, in,
366 in_len);
367 }
368
369 static ssl_private_key_result_t PrivateKeyCompleteCallback(SSL* ssl,
370 uint8_t* out,
371 size_t* out_len,
372 size_t max_out) {
373 SSLClientSocketImpl* socket = GetInstance()->GetClientSocketFromSSL(ssl);
374 return socket->PrivateKeyCompleteCallback(out, out_len, max_out);
davidben1d489522015-07-01 18:48:46375 }
376
davidben2a811e4e2015-12-01 10:49:34377#if !defined(OS_NACL)
378 static void KeyLogCallback(const SSL* ssl, const char* line) {
379 GetInstance()->ssl_key_logger_->WriteLine(line);
380 }
381#endif
382
davidbencef9e212017-04-19 15:00:10383 static void MessageCallback(int is_write,
384 int version,
385 int content_type,
386 const void* buf,
387 size_t len,
388 SSL* ssl,
389 void* arg) {
390 SSLClientSocketImpl* socket = GetInstance()->GetClientSocketFromSSL(ssl);
391 return socket->MessageCallback(is_write, content_type, buf, len);
392 }
393
[email protected]fbef13932010-11-23 12:38:53394 // This is the index used with SSL_get_ex_data to retrieve the owner
svaldeze83af292016-04-26 14:33:37395 // SSLClientSocketImpl object from an SSL instance.
[email protected]fbef13932010-11-23 12:38:53396 int ssl_socket_data_index_;
397
davidbend80c12c2016-10-11 00:13:49398 bssl::UniquePtr<SSL_CTX> ssl_ctx_;
davidbendafe4e52015-04-08 22:53:52399
davidben2a811e4e2015-12-01 10:49:34400#if !defined(OS_NACL)
danakj655b66c2016-04-16 00:51:38401 std::unique_ptr<SSLKeyLogger> ssl_key_logger_;
davidben2a811e4e2015-12-01 10:49:34402#endif
403
davidbendafe4e52015-04-08 22:53:52404 // TODO(davidben): Use a separate cache per URLRequestContext.
405 // https://crbug.com/458365
406 //
407 // TODO(davidben): Sessions should be invalidated on fatal
408 // alerts. https://crbug.com/466352
svaldeze83af292016-04-26 14:33:37409 SSLClientSessionCache session_cache_;
[email protected]1279de12013-12-03 15:13:32410};
411
davidben0bca07fd2016-07-18 15:12:03412// TODO(davidben): Switch from sign_digest to sign.
davidben1d489522015-07-01 18:48:46413const SSL_PRIVATE_KEY_METHOD
svaldeze83af292016-04-26 14:33:37414 SSLClientSocketImpl::SSLContext::kPrivateKeyMethod = {
davidbene422380772017-04-19 22:20:01415 nullptr /* type (unused) */,
416 nullptr /* max_signature_len (unused) */,
davidben0bca07fd2016-07-18 15:12:03417 nullptr /* sign */,
418 &SSLClientSocketImpl::SSLContext::PrivateKeySignDigestCallback,
419 nullptr /* decrypt */,
420 &SSLClientSocketImpl::SSLContext::PrivateKeyCompleteCallback,
davidben1d489522015-07-01 18:48:46421};
422
[email protected]1279de12013-12-03 15:13:32423// static
[email protected]c3456bb2011-12-12 22:22:19424void SSLClientSocket::ClearSessionCache() {
svaldeze83af292016-04-26 14:33:37425 SSLClientSocketImpl::SSLContext* context =
426 SSLClientSocketImpl::SSLContext::GetInstance();
[email protected]c3456bb2011-12-12 22:22:19427 context->session_cache()->Flush();
428}
429
svaldeze83af292016-04-26 14:33:37430SSLClientSocketImpl::SSLClientSocketImpl(
danakj655b66c2016-04-16 00:51:38431 std::unique_ptr<ClientSocketHandle> transport_socket,
[email protected]055d7f22010-11-15 12:03:12432 const HostPortPair& host_and_port,
[email protected]822581d2010-12-16 17:27:15433 const SSLConfig& ssl_config,
[email protected]feb79bcd2011-07-21 16:55:17434 const SSLClientSocketContext& context)
davidben3418e81f2016-10-19 00:09:45435 : pending_read_error_(kNoPendingResult),
davidbenb8c23212014-10-28 00:12:16436 pending_read_ssl_error_(SSL_ERROR_NONE),
[email protected]64b5c892014-08-08 09:39:26437 completed_connect_(false),
[email protected]0dc88b32014-03-26 20:12:28438 was_ever_used_(false),
[email protected]feb79bcd2011-07-21 16:55:17439 cert_verifier_(context.cert_verifier),
davidbeneb5f8ef32014-09-04 14:14:32440 cert_transparency_verifier_(context.cert_transparency_verifier),
[email protected]6b8a3c742014-07-25 00:25:35441 channel_id_service_(context.channel_id_service),
nharper736ceda2015-11-07 00:16:59442 tb_was_negotiated_(false),
443 tb_negotiated_param_(TB_PARAM_ECDSAP256),
nharper78e6d2b2016-09-21 05:42:35444 tb_signature_map_(10),
dchengc7eeda422015-12-26 03:56:48445 transport_(std::move(transport_socket)),
[email protected]055d7f22010-11-15 12:03:12446 host_and_port_(host_and_port),
[email protected]d518cd92010-09-29 12:27:44447 ssl_config_(ssl_config),
[email protected]c3456bb2011-12-12 22:22:19448 ssl_session_cache_shard_(context.ssl_session_cache_shard),
[email protected]013c17c2012-01-21 19:09:01449 next_handshake_state_(STATE_NONE),
svaldez4af14d22015-08-20 13:48:24450 disconnected_(false),
bnc3cf2a592016-08-11 14:48:36451 negotiated_protocol_(kProtoUnknown),
davidben52053b382015-04-27 19:22:29452 channel_id_sent_(false),
davidbendafe4e52015-04-08 22:53:52453 certificate_verified_(false),
davidbenfe132d92016-09-27 18:07:21454 certificate_requested_(false),
davidben1d489522015-07-01 18:48:46455 signature_result_(kNoPendingResult),
[email protected]8bd4e7a2014-08-09 14:49:17456 transport_security_state_(context.transport_security_state),
estark6f9b3d82016-01-12 21:37:05457 policy_enforcer_(context.ct_policy_enforcer),
dadriandf302c42016-06-10 18:48:59458 pkp_bypassed_(false),
David Benjamine34d74242017-06-29 20:35:16459 connect_error_details_(SSLErrorDetails::kOther),
kulkarni.acd7b4462014-08-28 07:41:34460 net_log_(transport_->socket()->NetLog()),
461 weak_factory_(this) {
rsleevibe81cd62016-06-24 01:38:59462 CHECK(cert_verifier_);
463 CHECK(transport_security_state_);
464 CHECK(cert_transparency_verifier_);
465 CHECK(policy_enforcer_);
[email protected]8e458552014-08-05 00:02:15466}
[email protected]d518cd92010-09-29 12:27:44467
svaldeze83af292016-04-26 14:33:37468SSLClientSocketImpl::~SSLClientSocketImpl() {
[email protected]d518cd92010-09-29 12:27:44469 Disconnect();
470}
471
davidben2a811e4e2015-12-01 10:49:34472#if !defined(OS_NACL)
svaldeze83af292016-04-26 14:33:37473void SSLClientSocketImpl::SetSSLKeyLogFile(
David Benjamindc2f4b02017-07-27 23:59:02474 const base::FilePath& ssl_keylog_file) {
475 SSLContext::GetInstance()->SetSSLKeyLogFile(ssl_keylog_file);
zhongyi81f85c6d92015-10-16 19:34:14476}
davidben2a811e4e2015-12-01 10:49:34477#endif
zhongyi81f85c6d92015-10-16 19:34:14478
svaldeze83af292016-04-26 14:33:37479void SSLClientSocketImpl::GetSSLCertRequestInfo(
[email protected]b9b651f2013-11-09 04:32:22480 SSLCertRequestInfo* cert_request_info) {
davidbenb11fd212017-01-12 17:08:03481 if (!ssl_) {
482 NOTREACHED();
483 return;
484 }
485
[email protected]791879c2013-12-17 07:22:41486 cert_request_info->host_and_port = host_and_port_;
davidbenb11fd212017-01-12 17:08:03487
488 cert_request_info->cert_authorities.clear();
davidbena35b40c32017-03-09 17:33:45489 const STACK_OF(CRYPTO_BUFFER)* authorities =
490 SSL_get0_server_requested_CAs(ssl_.get());
491 for (size_t i = 0; i < sk_CRYPTO_BUFFER_num(authorities); i++) {
492 const CRYPTO_BUFFER* ca_name = sk_CRYPTO_BUFFER_value(authorities, i);
493 cert_request_info->cert_authorities.push_back(
494 std::string(reinterpret_cast<const char*>(CRYPTO_BUFFER_data(ca_name)),
495 CRYPTO_BUFFER_len(ca_name)));
davidbenb11fd212017-01-12 17:08:03496 }
497
498 cert_request_info->cert_key_types.clear();
499 const uint8_t* client_cert_types;
500 size_t num_client_cert_types =
501 SSL_get0_certificate_types(ssl_.get(), &client_cert_types);
502 for (size_t i = 0; i < num_client_cert_types; i++) {
503 cert_request_info->cert_key_types.push_back(
504 static_cast<SSLClientCertType>(client_cert_types[i]));
505 }
[email protected]b9b651f2013-11-09 04:32:22506}
507
svaldeze83af292016-04-26 14:33:37508ChannelIDService* SSLClientSocketImpl::GetChannelIDService() const {
[email protected]6b8a3c742014-07-25 00:25:35509 return channel_id_service_;
[email protected]b9b651f2013-11-09 04:32:22510}
511
nharper78e6d2b2016-09-21 05:42:35512Error SSLClientSocketImpl::GetTokenBindingSignature(crypto::ECPrivateKey* key,
513 TokenBindingType tb_type,
514 std::vector<uint8_t>* out) {
nharperb7441ef2016-01-25 23:54:14515 // The same key will be used across multiple requests to sign the same value,
516 // so the signature is cached.
517 std::string raw_public_key;
518 if (!key->ExportRawPublicKey(&raw_public_key))
519 return ERR_FAILED;
nharper78e6d2b2016-09-21 05:42:35520 auto it = tb_signature_map_.Get(std::make_pair(tb_type, raw_public_key));
521 if (it != tb_signature_map_.end()) {
nharperb7441ef2016-01-25 23:54:14522 *out = it->second;
523 return OK;
524 }
525
526 uint8_t tb_ekm_buf[32];
527 static const char kTokenBindingExporterLabel[] = "EXPORTER-Token-Binding";
davidbend80c12c2016-10-11 00:13:49528 if (!SSL_export_keying_material(ssl_.get(), tb_ekm_buf, sizeof(tb_ekm_buf),
nharperb7441ef2016-01-25 23:54:14529 kTokenBindingExporterLabel,
530 strlen(kTokenBindingExporterLabel), nullptr,
531 0, false /* no context */)) {
532 return ERR_FAILED;
533 }
534
nharper78e6d2b2016-09-21 05:42:35535 if (!CreateTokenBindingSignature(
nharperd5cddca2016-02-27 03:37:52536 base::StringPiece(reinterpret_cast<char*>(tb_ekm_buf),
537 sizeof(tb_ekm_buf)),
nharper78e6d2b2016-09-21 05:42:35538 tb_type, key, out))
nharperb7441ef2016-01-25 23:54:14539 return ERR_FAILED;
nharperb7441ef2016-01-25 23:54:14540
nharper78e6d2b2016-09-21 05:42:35541 tb_signature_map_.Put(std::make_pair(tb_type, raw_public_key), *out);
nharperb7441ef2016-01-25 23:54:14542 return OK;
543}
544
svaldeze83af292016-04-26 14:33:37545crypto::ECPrivateKey* SSLClientSocketImpl::GetChannelIDKey() const {
nharperb36644f2016-02-22 23:14:43546 return channel_id_key_.get();
547}
548
David Benjamine34d74242017-06-29 20:35:16549SSLErrorDetails SSLClientSocketImpl::GetConnectErrorDetails() const {
550 return connect_error_details_;
551}
552
svaldeze83af292016-04-26 14:33:37553int SSLClientSocketImpl::ExportKeyingMaterial(const base::StringPiece& label,
554 bool has_context,
555 const base::StringPiece& context,
556 unsigned char* out,
557 unsigned int outlen) {
davidben86935f72015-05-06 22:24:49558 if (!IsConnected())
559 return ERR_SOCKET_NOT_CONNECTED;
560
[email protected]b9b651f2013-11-09 04:32:22561 crypto::OpenSSLErrStackTracer err_tracer(FROM_HERE);
562
davidbenf225b262016-09-15 22:09:22563 if (!SSL_export_keying_material(
davidbend80c12c2016-10-11 00:13:49564 ssl_.get(), out, outlen, label.data(), label.size(),
davidbenf225b262016-09-15 22:09:22565 reinterpret_cast<const unsigned char*>(context.data()),
566 context.length(), has_context ? 1 : 0)) {
567 LOG(ERROR) << "Failed to export keying material.";
568 return ERR_FAILED;
[email protected]b9b651f2013-11-09 04:32:22569 }
davidbenf225b262016-09-15 22:09:22570
[email protected]b9b651f2013-11-09 04:32:22571 return OK;
572}
573
svaldeze83af292016-04-26 14:33:37574int SSLClientSocketImpl::Connect(const CompletionCallback& callback) {
svaldez4af14d22015-08-20 13:48:24575 // Although StreamSocket does allow calling Connect() after Disconnect(),
576 // this has never worked for layered sockets. CHECK to detect any consumers
577 // reconnecting an SSL socket.
578 //
579 // TODO(davidben,mmenke): Remove this API feature. See
580 // https://crbug.com/499289.
581 CHECK(!disconnected_);
582
mikecirone8b85c432016-09-08 19:11:00583 net_log_.BeginEvent(NetLogEventType::SSL_CONNECT);
[email protected]b9b651f2013-11-09 04:32:22584
585 // Set up new ssl object.
[email protected]c8a80e92014-05-17 16:02:08586 int rv = Init();
587 if (rv != OK) {
davidben281d13f02016-04-27 20:43:28588 LogConnectEndEvent(rv);
[email protected]c8a80e92014-05-17 16:02:08589 return rv;
[email protected]b9b651f2013-11-09 04:32:22590 }
591
592 // Set SSL to client mode. Handshake happens in the loop below.
davidbend80c12c2016-10-11 00:13:49593 SSL_set_connect_state(ssl_.get());
[email protected]b9b651f2013-11-09 04:32:22594
rsleeviadbd4982016-06-13 22:10:27595 next_handshake_state_ = STATE_HANDSHAKE;
[email protected]c8a80e92014-05-17 16:02:08596 rv = DoHandshakeLoop(OK);
[email protected]b9b651f2013-11-09 04:32:22597 if (rv == ERR_IO_PENDING) {
598 user_connect_callback_ = callback;
599 } else {
davidben281d13f02016-04-27 20:43:28600 LogConnectEndEvent(rv);
[email protected]b9b651f2013-11-09 04:32:22601 }
602
603 return rv > OK ? OK : rv;
604}
605
svaldeze83af292016-04-26 14:33:37606void SSLClientSocketImpl::Disconnect() {
svaldez4af14d22015-08-20 13:48:24607 disconnected_ = true;
608
[email protected]b9b651f2013-11-09 04:32:22609 // Shut down anything that may call us back.
eroman7f9236a2015-05-11 21:23:43610 cert_verifier_request_.reset();
davidben67e83912016-10-12 18:36:32611 channel_id_request_.Cancel();
612 weak_factory_.InvalidateWeakPtrs();
davidben3418e81f2016-10-19 00:09:45613 transport_adapter_.reset();
[email protected]b9b651f2013-11-09 04:32:22614
davidben67e83912016-10-12 18:36:32615 // Release user callbacks.
[email protected]b9b651f2013-11-09 04:32:22616 user_connect_callback_.Reset();
617 user_read_callback_.Reset();
618 user_write_callback_.Reset();
svaldeze83af292016-04-26 14:33:37619 user_read_buf_ = NULL;
620 user_read_buf_len_ = 0;
621 user_write_buf_ = NULL;
622 user_write_buf_len_ = 0;
[email protected]b9b651f2013-11-09 04:32:22623
davidben67e83912016-10-12 18:36:32624 transport_->socket()->Disconnect();
[email protected]b9b651f2013-11-09 04:32:22625}
626
svaldeze83af292016-04-26 14:33:37627bool SSLClientSocketImpl::IsConnected() const {
davidben67e83912016-10-12 18:36:32628 // If the handshake has not yet completed or the socket has been explicitly
629 // disconnected.
630 if (!completed_connect_ || disconnected_)
[email protected]b9b651f2013-11-09 04:32:22631 return false;
632 // If an asynchronous operation is still pending.
633 if (user_read_buf_.get() || user_write_buf_.get())
634 return true;
635
636 return transport_->socket()->IsConnected();
637}
638
svaldeze83af292016-04-26 14:33:37639bool SSLClientSocketImpl::IsConnectedAndIdle() const {
davidben67e83912016-10-12 18:36:32640 // If the handshake has not yet completed or the socket has been explicitly
641 // disconnected.
642 if (!completed_connect_ || disconnected_)
[email protected]b9b651f2013-11-09 04:32:22643 return false;
644 // If an asynchronous operation is still pending.
645 if (user_read_buf_.get() || user_write_buf_.get())
646 return false;
davidbenfc9a6b82015-04-15 23:47:32647
648 // If there is data read from the network that has not yet been consumed, do
649 // not treat the connection as idle.
650 //
davidben3418e81f2016-10-19 00:09:45651 // Note that this does not check whether there is ciphertext that has not yet
652 // been flushed to the network. |Write| returns early, so this can cause race
653 // conditions which cause a socket to not be treated reusable when it should
654 // be. See https://crbug.com/466147.
655 if (transport_adapter_->HasPendingReadData())
[email protected]b9b651f2013-11-09 04:32:22656 return false;
[email protected]b9b651f2013-11-09 04:32:22657
658 return transport_->socket()->IsConnectedAndIdle();
659}
660
svaldeze83af292016-04-26 14:33:37661int SSLClientSocketImpl::GetPeerAddress(IPEndPoint* addressList) const {
[email protected]b9b651f2013-11-09 04:32:22662 return transport_->socket()->GetPeerAddress(addressList);
663}
664
svaldeze83af292016-04-26 14:33:37665int SSLClientSocketImpl::GetLocalAddress(IPEndPoint* addressList) const {
[email protected]b9b651f2013-11-09 04:32:22666 return transport_->socket()->GetLocalAddress(addressList);
667}
668
tfarina42834112016-09-22 13:38:20669const NetLogWithSource& SSLClientSocketImpl::NetLog() const {
[email protected]b9b651f2013-11-09 04:32:22670 return net_log_;
671}
672
svaldeze83af292016-04-26 14:33:37673void SSLClientSocketImpl::SetSubresourceSpeculation() {
[email protected]b9b651f2013-11-09 04:32:22674 if (transport_.get() && transport_->socket()) {
675 transport_->socket()->SetSubresourceSpeculation();
676 } else {
677 NOTREACHED();
678 }
679}
680
svaldeze83af292016-04-26 14:33:37681void SSLClientSocketImpl::SetOmniboxSpeculation() {
[email protected]b9b651f2013-11-09 04:32:22682 if (transport_.get() && transport_->socket()) {
683 transport_->socket()->SetOmniboxSpeculation();
684 } else {
685 NOTREACHED();
686 }
687}
688
svaldeze83af292016-04-26 14:33:37689bool SSLClientSocketImpl::WasEverUsed() const {
[email protected]0dc88b32014-03-26 20:12:28690 return was_ever_used_;
[email protected]b9b651f2013-11-09 04:32:22691}
692
tfarina2846404c2016-12-25 14:31:37693bool SSLClientSocketImpl::WasAlpnNegotiated() const {
bnc3cf2a592016-08-11 14:48:36694 return negotiated_protocol_ != kProtoUnknown;
695}
696
697NextProto SSLClientSocketImpl::GetNegotiatedProtocol() const {
698 return negotiated_protocol_;
699}
700
svaldeze83af292016-04-26 14:33:37701bool SSLClientSocketImpl::GetSSLInfo(SSLInfo* ssl_info) {
[email protected]b9b651f2013-11-09 04:32:22702 ssl_info->Reset();
davidbenc7e06c92017-03-07 18:54:11703 if (!server_cert_)
[email protected]b9b651f2013-11-09 04:32:22704 return false;
705
706 ssl_info->cert = server_cert_verify_result_.verified_cert;
estark03d644f2015-06-13 00:11:32707 ssl_info->unverified_cert = server_cert_;
[email protected]b9b651f2013-11-09 04:32:22708 ssl_info->cert_status = server_cert_verify_result_.cert_status;
709 ssl_info->is_issued_by_known_root =
710 server_cert_verify_result_.is_issued_by_known_root;
dadriandf302c42016-06-10 18:48:59711 ssl_info->pkp_bypassed = pkp_bypassed_;
svaldeze83af292016-04-26 14:33:37712 ssl_info->public_key_hashes = server_cert_verify_result_.public_key_hashes;
[email protected]b9b651f2013-11-09 04:32:22713 ssl_info->client_cert_sent =
714 ssl_config_.send_client_cert && ssl_config_.client_cert.get();
davidben52053b382015-04-27 19:22:29715 ssl_info->channel_id_sent = channel_id_sent_;
nharper736ceda2015-11-07 00:16:59716 ssl_info->token_binding_negotiated = tb_was_negotiated_;
717 ssl_info->token_binding_key_param = tb_negotiated_param_;
[email protected]8bd4e7a2014-08-09 14:49:17718 ssl_info->pinning_failure_log = pinning_failure_log_;
dadrian612337a2016-07-20 22:36:58719 ssl_info->ocsp_result = server_cert_verify_result_.ocsp_result;
[email protected]b9b651f2013-11-09 04:32:22720
estark723b5eeb2016-02-18 21:01:12721 AddCTInfoToSSLInfo(ssl_info);
davidbeneb5f8ef32014-09-04 14:14:32722
davidbend80c12c2016-10-11 00:13:49723 const SSL_CIPHER* cipher = SSL_get_current_cipher(ssl_.get());
[email protected]b9b651f2013-11-09 04:32:22724 CHECK(cipher);
725 ssl_info->security_bits = SSL_CIPHER_get_bits(cipher, NULL);
davidben3b00e402016-09-20 14:31:06726 // Historically, the "group" was known as "curve".
davidbend80c12c2016-10-11 00:13:49727 ssl_info->key_exchange_group = SSL_get_curve_id(ssl_.get());
[email protected]b9b651f2013-11-09 04:32:22728
ryanchung987b2ff2016-02-19 00:17:12729 SSLConnectionStatusSetCipherSuite(
730 static_cast<uint16_t>(SSL_CIPHER_get_id(cipher)),
731 &ssl_info->connection_status);
davidbend80c12c2016-10-11 00:13:49732 SSLConnectionStatusSetVersion(GetNetSSLVersion(ssl_.get()),
ryanchung987b2ff2016-02-19 00:17:12733 &ssl_info->connection_status);
[email protected]b9b651f2013-11-09 04:32:22734
davidbend80c12c2016-10-11 00:13:49735 ssl_info->handshake_type = SSL_session_reused(ssl_.get())
svaldeze83af292016-04-26 14:33:37736 ? SSLInfo::HANDSHAKE_RESUME
737 : SSLInfo::HANDSHAKE_FULL;
[email protected]b9b651f2013-11-09 04:32:22738
[email protected]b9b651f2013-11-09 04:32:22739 return true;
740}
741
svaldeze83af292016-04-26 14:33:37742void SSLClientSocketImpl::GetConnectionAttempts(ConnectionAttempts* out) const {
ttuttle23fdb7b2015-05-15 01:28:03743 out->clear();
744}
745
svaldeze83af292016-04-26 14:33:37746int64_t SSLClientSocketImpl::GetTotalReceivedBytes() const {
tbansalf82cc8e2015-10-14 20:05:49747 return transport_->socket()->GetTotalReceivedBytes();
748}
749
xunjieli998d2472017-01-12 01:12:28750void SSLClientSocketImpl::DumpMemoryStats(SocketMemoryStats* stats) const {
751 if (transport_adapter_)
752 stats->buffer_size = transport_adapter_->GetAllocationSize();
davidbena35b40c32017-03-09 17:33:45753 const STACK_OF(CRYPTO_BUFFER)* server_cert_chain =
754 SSL_get0_peer_certificates(ssl_.get());
davidbenc7e06c92017-03-07 18:54:11755 if (server_cert_chain) {
davidbena35b40c32017-03-09 17:33:45756 for (size_t i = 0; i < sk_CRYPTO_BUFFER_num(server_cert_chain); ++i) {
757 const CRYPTO_BUFFER* cert = sk_CRYPTO_BUFFER_value(server_cert_chain, i);
758 stats->cert_size += CRYPTO_BUFFER_len(cert);
xunjieli9f8c5fb52016-12-07 22:59:33759 }
davidbena35b40c32017-03-09 17:33:45760 stats->cert_count = sk_CRYPTO_BUFFER_num(server_cert_chain);
xunjieli9f8c5fb52016-12-07 22:59:33761 }
xunjieliffe62df62017-02-23 18:22:41762 stats->total_size = stats->buffer_size + stats->cert_size;
xunjieli9f8c5fb52016-12-07 22:59:33763}
764
765// static
766void SSLClientSocketImpl::DumpSSLClientSessionMemoryStats(
767 base::trace_event::ProcessMemoryDump* pmd) {
768 SSLContext::GetInstance()->session_cache()->DumpMemoryStats(pmd);
769}
770
svaldeze83af292016-04-26 14:33:37771int SSLClientSocketImpl::Read(IOBuffer* buf,
772 int buf_len,
773 const CompletionCallback& callback) {
xunjieli321a96f32017-03-07 19:42:17774 int rv = ReadIfReady(buf, buf_len, callback);
775 if (rv == ERR_IO_PENDING) {
776 user_read_buf_ = buf;
777 user_read_buf_len_ = buf_len;
778 }
779 return rv;
780}
[email protected]b9b651f2013-11-09 04:32:22781
xunjieli321a96f32017-03-07 19:42:17782int SSLClientSocketImpl::ReadIfReady(IOBuffer* buf,
783 int buf_len,
784 const CompletionCallback& callback) {
785 int rv = DoPayloadRead(buf, buf_len);
[email protected]b9b651f2013-11-09 04:32:22786
787 if (rv == ERR_IO_PENDING) {
788 user_read_callback_ = callback;
789 } else {
[email protected]0dc88b32014-03-26 20:12:28790 if (rv > 0)
791 was_ever_used_ = true;
[email protected]b9b651f2013-11-09 04:32:22792 }
[email protected]b9b651f2013-11-09 04:32:22793 return rv;
794}
795
svaldeze83af292016-04-26 14:33:37796int SSLClientSocketImpl::Write(IOBuffer* buf,
797 int buf_len,
798 const CompletionCallback& callback) {
[email protected]b9b651f2013-11-09 04:32:22799 user_write_buf_ = buf;
800 user_write_buf_len_ = buf_len;
801
davidben3418e81f2016-10-19 00:09:45802 int rv = DoPayloadWrite();
[email protected]b9b651f2013-11-09 04:32:22803
804 if (rv == ERR_IO_PENDING) {
805 user_write_callback_ = callback;
806 } else {
[email protected]0dc88b32014-03-26 20:12:28807 if (rv > 0)
808 was_ever_used_ = true;
[email protected]b9b651f2013-11-09 04:32:22809 user_write_buf_ = NULL;
810 user_write_buf_len_ = 0;
811 }
812
813 return rv;
814}
815
svaldeze83af292016-04-26 14:33:37816int SSLClientSocketImpl::SetReceiveBufferSize(int32_t size) {
[email protected]b9b651f2013-11-09 04:32:22817 return transport_->socket()->SetReceiveBufferSize(size);
818}
819
svaldeze83af292016-04-26 14:33:37820int SSLClientSocketImpl::SetSendBufferSize(int32_t size) {
[email protected]b9b651f2013-11-09 04:32:22821 return transport_->socket()->SetSendBufferSize(size);
822}
823
davidben3418e81f2016-10-19 00:09:45824void SSLClientSocketImpl::OnReadReady() {
825 // During a renegotiation, either Read or Write calls may be blocked on a
826 // transport read.
827 RetryAllOperations();
828}
829
830void SSLClientSocketImpl::OnWriteReady() {
831 // During a renegotiation, either Read or Write calls may be blocked on a
832 // transport read.
833 RetryAllOperations();
834}
835
svaldeze83af292016-04-26 14:33:37836int SSLClientSocketImpl::Init() {
[email protected]9e733f32010-10-04 18:19:08837 DCHECK(!ssl_);
[email protected]9e733f32010-10-04 18:19:08838
svaldez2135be52016-04-20 16:34:53839#if defined(USE_NSS_CERTS)
davidbena477a70a2015-10-06 04:38:29840 if (ssl_config_.cert_io_enabled) {
841 // TODO(davidben): Move this out of SSLClientSocket. See
842 // https://crbug.com/539520.
843 EnsureNSSHttpIOInit();
844 }
845#endif
846
[email protected]b29af7d2010-12-14 11:52:47847 SSLContext* context = SSLContext::GetInstance();
[email protected]4b559b4d2011-04-14 17:37:14848 crypto::OpenSSLErrStackTracer err_tracer(FROM_HERE);
[email protected]d518cd92010-09-29 12:27:44849
davidbend80c12c2016-10-11 00:13:49850 ssl_.reset(SSL_new(context->ssl_ctx()));
851 if (!ssl_ || !context->SetClientSocketForSSL(ssl_.get(), this))
[email protected]c8a80e92014-05-17 16:02:08852 return ERR_UNEXPECTED;
[email protected]fbef13932010-11-23 12:38:53853
davidben9bc0466f2015-06-16 22:21:27854 // SNI should only contain valid DNS hostnames, not IP addresses (see RFC
855 // 6066, Section 3).
856 //
857 // TODO(rsleevi): Should this code allow hostnames that violate the LDH rule?
858 // See https://crbug.com/496472 and https://crbug.com/496468 for discussion.
martijna2e83bd2016-03-18 13:10:45859 IPAddress unused;
860 if (!unused.AssignFromIPLiteral(host_and_port_.host()) &&
davidbend80c12c2016-10-11 00:13:49861 !SSL_set_tlsext_host_name(ssl_.get(), host_and_port_.host().c_str())) {
[email protected]c8a80e92014-05-17 16:02:08862 return ERR_UNEXPECTED;
davidben9bc0466f2015-06-16 22:21:27863 }
[email protected]fbef13932010-11-23 12:38:53864
David Benjaminb3840f42017-08-03 15:50:16865 if (!ssl_session_cache_shard_.empty()) {
Steven Valdeze6112f42017-10-05 22:20:12866 bssl::UniquePtr<SSL_SESSION> session =
867 context->session_cache()->Lookup(GetSessionCacheKey());
David Benjaminb3840f42017-08-03 15:50:16868 if (session)
869 SSL_set_session(ssl_.get(), session.get());
870 }
[email protected]d518cd92010-09-29 12:27:44871
davidben3418e81f2016-10-19 00:09:45872 transport_adapter_.reset(new SocketBIOAdapter(
873 transport_->socket(), GetBufferSize("SSLBufferSizeRecv"),
874 GetBufferSize("SSLBufferSizeSend"), this));
875 BIO* transport_bio = transport_adapter_->bio();
mmenke1beda3d2016-07-22 03:33:45876
davidben3418e81f2016-10-19 00:09:45877 BIO_up_ref(transport_bio); // SSL_set0_rbio takes ownership.
878 SSL_set0_rbio(ssl_.get(), transport_bio);
haavardm2d92e722014-12-19 13:45:44879
davidben3418e81f2016-10-19 00:09:45880 BIO_up_ref(transport_bio); // SSL_set0_wbio takes ownership.
881 SSL_set0_wbio(ssl_.get(), transport_bio);
[email protected]d518cd92010-09-29 12:27:44882
davidbenb937d6c2015-05-14 04:53:42883 DCHECK_LT(SSL3_VERSION, ssl_config_.version_min);
884 DCHECK_LT(SSL3_VERSION, ssl_config_.version_max);
davidbend80c12c2016-10-11 00:13:49885 if (!SSL_set_min_proto_version(ssl_.get(), ssl_config_.version_min) ||
886 !SSL_set_max_proto_version(ssl_.get(), ssl_config_.version_max)) {
davidben952bdf22016-09-21 23:42:16887 return ERR_UNEXPECTED;
888 }
davidbenb937d6c2015-05-14 04:53:42889
Steven Valdez4584b2482017-07-14 01:11:57890 switch (ssl_config_.tls13_variant) {
891 case kTLS13VariantDraft:
892 SSL_set_tls13_variant(ssl_.get(), tls13_default);
893 break;
894 case kTLS13VariantExperiment:
895 SSL_set_tls13_variant(ssl_.get(), tls13_experiment);
896 break;
Steven Valdezf00f8782017-09-13 18:05:28897 case kTLS13VariantExperiment2:
898 SSL_set_tls13_variant(ssl_.get(), tls13_experiment2);
899 break;
900 case kTLS13VariantExperiment3:
901 SSL_set_tls13_variant(ssl_.get(), tls13_experiment3);
902 break;
Steven Valdez4584b2482017-07-14 01:11:57903 }
904
[email protected]9e733f32010-10-04 18:19:08905 // OpenSSL defaults some options to on, others to off. To avoid ambiguity,
906 // set everything we care about to an absolute value.
[email protected]fb10e2282010-12-01 17:08:48907 SslSetClearMask options;
[email protected]d0f00492012-08-03 22:35:13908 options.ConfigureFlag(SSL_OP_NO_COMPRESSION, true);
[email protected]9e733f32010-10-04 18:19:08909
910 // TODO(joth): Set this conditionally, see http://crbug.com/55410
[email protected]fb10e2282010-12-01 17:08:48911 options.ConfigureFlag(SSL_OP_LEGACY_SERVER_CONNECT, true);
[email protected]9e733f32010-10-04 18:19:08912
davidbend80c12c2016-10-11 00:13:49913 SSL_set_options(ssl_.get(), options.set_mask);
914 SSL_clear_options(ssl_.get(), options.clear_mask);
[email protected]9e733f32010-10-04 18:19:08915
[email protected]fb10e2282010-12-01 17:08:48916 // Same as above, this time for the SSL mode.
917 SslSetClearMask mode;
[email protected]9e733f32010-10-04 18:19:08918
[email protected]fb10e2282010-12-01 17:08:48919 mode.ConfigureFlag(SSL_MODE_RELEASE_BUFFERS, true);
ishermane5c05e12014-09-09 20:32:15920 mode.ConfigureFlag(SSL_MODE_CBC_RECORD_SPLITTING, true);
[email protected]fb10e2282010-12-01 17:08:48921
davidben818d93b2015-02-19 22:27:32922 mode.ConfigureFlag(SSL_MODE_ENABLE_FALSE_START,
[email protected]b788de02014-04-23 18:06:07923 ssl_config_.false_start_enabled);
924
davidbend80c12c2016-10-11 00:13:49925 SSL_set_mode(ssl_.get(), mode.set_mask);
926 SSL_clear_mode(ssl_.get(), mode.clear_mask);
[email protected]109805a2010-12-07 18:17:06927
davidben4177ecb2016-10-22 01:47:18928 // Use BoringSSL defaults, but disable HMAC-SHA256 and HMAC-SHA384 ciphers
kjellander1ae83a02017-01-26 07:35:09929 // (note that SHA256 and SHA384 only select legacy CBC ciphers).
davidben0b6de432017-03-23 22:11:05930 // Additionally disable HMAC-SHA1 ciphers in ECDSA. These are the remaining
931 // CBC-mode ECDSA ciphers.
davidben1863716b2017-05-03 20:06:20932 std::string command("ALL:!SHA256:!SHA384:!aPSK:!ECDSA+SHA1");
davidben9b4a9b9c2015-10-12 18:46:51933
934 if (ssl_config_.require_ecdhe)
davidben1863716b2017-05-03 20:06:20935 command.append(":!kRSA");
davidben8ecc3072014-09-03 23:19:09936
davidben9b4a9b9c2015-10-12 18:46:51937 // Remove any disabled ciphers.
938 for (uint16_t id : ssl_config_.disabled_cipher_suites) {
939 const SSL_CIPHER* cipher = SSL_get_cipher_by_value(id);
940 if (cipher) {
941 command.append(":!");
942 command.append(SSL_CIPHER_get_name(cipher));
943 }
944 }
945
davidben1863716b2017-05-03 20:06:20946 if (!SSL_set_strict_cipher_list(ssl_.get(), command.c_str())) {
947 LOG(ERROR) << "SSL_set_cipher_list('" << command << "') failed";
948 return ERR_UNEXPECTED;
949 }
[email protected]ee0f2aa82013-10-25 11:59:26950
951 // TLS channel ids.
bnc3cf2a592016-08-11 14:48:36952 if (IsChannelIDEnabled()) {
davidbend80c12c2016-10-11 00:13:49953 SSL_enable_tls_channel_id(ssl_.get());
[email protected]ee0f2aa82013-10-25 11:59:26954 }
955
bnc1f295372015-10-21 23:24:22956 if (!ssl_config_.alpn_protos.empty()) {
bnc988e68d2016-06-27 14:03:21957 std::vector<uint8_t> wire_protos =
958 SerializeNextProtos(ssl_config_.alpn_protos);
davidbend80c12c2016-10-11 00:13:49959 SSL_set_alpn_protos(ssl_.get(),
960 wire_protos.empty() ? NULL : &wire_protos[0],
[email protected]abc44b752014-07-30 03:52:15961 wire_protos.size());
962 }
963
davidbeneb5f8ef32014-09-04 14:14:32964 if (ssl_config_.signed_cert_timestamps_enabled) {
davidbend80c12c2016-10-11 00:13:49965 SSL_enable_signed_cert_timestamps(ssl_.get());
966 SSL_enable_ocsp_stapling(ssl_.get());
davidbeneb5f8ef32014-09-04 14:14:32967 }
968
davidben15f57132015-04-27 18:08:36969 if (cert_verifier_->SupportsOCSPStapling())
davidbend80c12c2016-10-11 00:13:49970 SSL_enable_ocsp_stapling(ssl_.get());
davidbeneb5f8ef32014-09-04 14:14:32971
davidben971a681a2017-02-16 18:57:46972 // Configure BoringSSL to allow renegotiations. Once the initial handshake
973 // completes, if renegotiations are not allowed, the default reject value will
974 // be restored. This is done in this order to permit a BoringSSL
975 // optimization. See https://crbug.com/boringssl/123.
976 SSL_set_renegotiate_mode(ssl_.get(), ssl_renegotiate_freely);
977
[email protected]c8a80e92014-05-17 16:02:08978 return OK;
[email protected]d518cd92010-09-29 12:27:44979}
980
svaldeze83af292016-04-26 14:33:37981void SSLClientSocketImpl::DoReadCallback(int rv) {
[email protected]b9b651f2013-11-09 04:32:22982 // Since Run may result in Read being called, clear |user_read_callback_|
983 // up front.
[email protected]0dc88b32014-03-26 20:12:28984 if (rv > 0)
985 was_ever_used_ = true;
xunjieli321a96f32017-03-07 19:42:17986 user_read_buf_ = nullptr;
[email protected]b9b651f2013-11-09 04:32:22987 user_read_buf_len_ = 0;
988 base::ResetAndReturn(&user_read_callback_).Run(rv);
989}
990
svaldeze83af292016-04-26 14:33:37991void SSLClientSocketImpl::DoWriteCallback(int rv) {
[email protected]b9b651f2013-11-09 04:32:22992 // Since Run may result in Write being called, clear |user_write_callback_|
993 // up front.
[email protected]0dc88b32014-03-26 20:12:28994 if (rv > 0)
995 was_ever_used_ = true;
[email protected]b9b651f2013-11-09 04:32:22996 user_write_buf_ = NULL;
997 user_write_buf_len_ = 0;
998 base::ResetAndReturn(&user_write_callback_).Run(rv);
999}
1000
pkasting379234c2015-04-08 04:42:121001// TODO(cbentzel): Remove including "base/threading/thread_local.h" and
vadimt6b43dec22015-01-06 01:59:581002// g_first_run_completed once crbug.com/424386 is fixed.
1003base::LazyInstance<base::ThreadLocalBoolean>::Leaky g_first_run_completed =
1004 LAZY_INSTANCE_INITIALIZER;
1005
svaldeze83af292016-04-26 14:33:371006int SSLClientSocketImpl::DoHandshake() {
[email protected]b9b651f2013-11-09 04:32:221007 crypto::OpenSSLErrStackTracer err_tracer(FROM_HERE);
vadimt5a243282014-12-24 00:26:161008
1009 int rv;
1010
pkasting379234c2015-04-08 04:42:121011 // TODO(cbentzel): Leave only 1 call to SSL_do_handshake once crbug.com/424386
vadimt5a243282014-12-24 00:26:161012 // is fixed.
1013 if (ssl_config_.send_client_cert && ssl_config_.client_cert.get()) {
davidbend80c12c2016-10-11 00:13:491014 rv = SSL_do_handshake(ssl_.get());
vadimt5a243282014-12-24 00:26:161015 } else {
vadimt6b43dec22015-01-06 01:59:581016 if (g_first_run_completed.Get().Get()) {
davidbend80c12c2016-10-11 00:13:491017 rv = SSL_do_handshake(ssl_.get());
vadimt6b43dec22015-01-06 01:59:581018 } else {
1019 g_first_run_completed.Get().Set(true);
davidbend80c12c2016-10-11 00:13:491020 rv = SSL_do_handshake(ssl_.get());
vadimt6b43dec22015-01-06 01:59:581021 }
vadimt5a243282014-12-24 00:26:161022 }
[email protected]b9b651f2013-11-09 04:32:221023
davidbenc4212c02015-05-12 22:30:181024 int net_error = OK;
1025 if (rv <= 0) {
davidbend80c12c2016-10-11 00:13:491026 int ssl_error = SSL_get_error(ssl_.get(), rv);
[email protected]b9b651f2013-11-09 04:32:221027 if (ssl_error == SSL_ERROR_WANT_CHANNEL_ID_LOOKUP) {
[email protected]faff9852014-06-21 06:13:461028 // The server supports channel ID. Stop to look one up before returning to
1029 // the handshake.
rsleeviadbd4982016-06-13 22:10:271030 next_handshake_state_ = STATE_CHANNEL_ID_LOOKUP;
[email protected]faff9852014-06-21 06:13:461031 return OK;
[email protected]b9b651f2013-11-09 04:32:221032 }
davidbenced4aa9b2015-05-12 21:22:351033 if (ssl_error == SSL_ERROR_WANT_X509_LOOKUP &&
1034 !ssl_config_.send_client_cert) {
1035 return ERR_SSL_CLIENT_AUTH_CERT_NEEDED;
1036 }
davidben1d489522015-07-01 18:48:461037 if (ssl_error == SSL_ERROR_WANT_PRIVATE_KEY_OPERATION) {
svaldez7872fd02015-11-19 21:10:541038 DCHECK(ssl_config_.client_private_key);
davidben1d489522015-07-01 18:48:461039 DCHECK_NE(kNoPendingResult, signature_result_);
rsleeviadbd4982016-06-13 22:10:271040 next_handshake_state_ = STATE_HANDSHAKE;
davidben1d489522015-07-01 18:48:461041 return ERR_IO_PENDING;
1042 }
[email protected]b9b651f2013-11-09 04:32:221043
davidbena4409c62014-08-27 17:05:511044 OpenSSLErrorInfo error_info;
davidbenfe132d92016-09-27 18:07:211045 net_error = MapLastOpenSSLError(ssl_error, err_tracer, &error_info);
[email protected]b9b651f2013-11-09 04:32:221046 if (net_error == ERR_IO_PENDING) {
davidbenc4212c02015-05-12 22:30:181047 // If not done, stay in this state
rsleeviadbd4982016-06-13 22:10:271048 next_handshake_state_ = STATE_HANDSHAKE;
davidbenc4212c02015-05-12 22:30:181049 return ERR_IO_PENDING;
1050 }
1051
David Benjamine34d74242017-06-29 20:35:161052 switch (net_error) {
1053 case ERR_CONNECTION_CLOSED:
1054 connect_error_details_ = SSLErrorDetails::kConnectionClosed;
1055 break;
1056 case ERR_CONNECTION_RESET:
1057 connect_error_details_ = SSLErrorDetails::kConnectionReset;
1058 break;
1059 case ERR_SSL_PROTOCOL_ERROR: {
1060 int lib = ERR_GET_LIB(error_info.error_code);
1061 int reason = ERR_GET_REASON(error_info.error_code);
1062 if (lib == ERR_LIB_SSL && reason == SSL_R_TLSV1_ALERT_ACCESS_DENIED) {
1063 connect_error_details_ = SSLErrorDetails::kAccessDeniedAlert;
1064 } else if (lib == ERR_LIB_SSL &&
1065 reason == SSL_R_APPLICATION_DATA_INSTEAD_OF_HANDSHAKE) {
1066 connect_error_details_ =
1067 SSLErrorDetails::kApplicationDataInsteadOfHandshake;
1068 } else {
1069 connect_error_details_ = SSLErrorDetails::kProtocolError;
1070 }
1071 break;
1072 }
1073 case ERR_SSL_BAD_RECORD_MAC_ALERT:
1074 connect_error_details_ = SSLErrorDetails::kBadRecordMACAlert;
1075 break;
1076 case ERR_SSL_VERSION_OR_CIPHER_MISMATCH:
1077 connect_error_details_ = SSLErrorDetails::kVersionOrCipherMismatch;
1078 break;
1079 default:
1080 connect_error_details_ = SSLErrorDetails::kOther;
1081 break;
1082 }
1083
davidbenc4212c02015-05-12 22:30:181084 LOG(ERROR) << "handshake failed; returned " << rv << ", SSL error code "
1085 << ssl_error << ", net_error " << net_error;
1086 net_log_.AddEvent(
mikecirone8b85c432016-09-08 19:11:001087 NetLogEventType::SSL_HANDSHAKE_ERROR,
davidbenc4212c02015-05-12 22:30:181088 CreateNetLogOpenSSLErrorCallback(net_error, ssl_error, error_info));
1089 }
1090
rsleeviadbd4982016-06-13 22:10:271091 next_handshake_state_ = STATE_HANDSHAKE_COMPLETE;
davidbenc4212c02015-05-12 22:30:181092 return net_error;
1093}
1094
svaldeze83af292016-04-26 14:33:371095int SSLClientSocketImpl::DoHandshakeComplete(int result) {
davidbenc4212c02015-05-12 22:30:181096 if (result < 0)
1097 return result;
1098
davidben095ebb52017-04-12 22:23:341099 if (ssl_config_.version_interference_probe) {
1100 DCHECK_LT(ssl_config_.version_max, TLS1_3_VERSION);
1101 return ERR_SSL_VERSION_INTERFERENCE;
1102 }
1103
David Benjaminb3840f42017-08-03 15:50:161104 if (!ssl_session_cache_shard_.empty()) {
1105 SSLContext::GetInstance()->session_cache()->ResetLookupCount(
1106 GetSessionCacheKey());
1107 }
1108
nharper736ceda2015-11-07 00:16:591109 // Check that if token binding was negotiated, then extended master secret
nharper78e6d2b2016-09-21 05:42:351110 // and renegotiation indication must also be negotiated.
1111 if (tb_was_negotiated_ &&
davidbend80c12c2016-10-11 00:13:491112 !(SSL_get_extms_support(ssl_.get()) &&
1113 SSL_get_secure_renegotiation_support(ssl_.get()))) {
nharper736ceda2015-11-07 00:16:591114 return ERR_SSL_PROTOCOL_ERROR;
nharper78e6d2b2016-09-21 05:42:351115 }
nharper736ceda2015-11-07 00:16:591116
bncce6ea242016-09-15 20:22:321117 const uint8_t* alpn_proto = NULL;
1118 unsigned alpn_len = 0;
davidbend80c12c2016-10-11 00:13:491119 SSL_get0_alpn_selected(ssl_.get(), &alpn_proto, &alpn_len);
bncce6ea242016-09-15 20:22:321120 if (alpn_len > 0) {
1121 base::StringPiece proto(reinterpret_cast<const char*>(alpn_proto),
1122 alpn_len);
1123 negotiated_protocol_ = NextProtoFromString(proto);
[email protected]b9b651f2013-11-09 04:32:221124 }
davidbenc4212c02015-05-12 22:30:181125
bncbd442c22016-09-14 20:49:161126 RecordNegotiatedProtocol();
bnc3cf2a592016-08-11 14:48:361127 RecordChannelIDSupport();
davidbenc4212c02015-05-12 22:30:181128
dadriand476e652016-07-26 21:33:241129 const uint8_t* ocsp_response_raw;
1130 size_t ocsp_response_len;
davidbend80c12c2016-10-11 00:13:491131 SSL_get0_ocsp_response(ssl_.get(), &ocsp_response_raw, &ocsp_response_len);
dadriand476e652016-07-26 21:33:241132 set_stapled_ocsp_response_received(ocsp_response_len != 0);
1133 UMA_HISTOGRAM_BOOLEAN("Net.OCSPResponseStapled", ocsp_response_len != 0);
davidbenc4212c02015-05-12 22:30:181134
1135 const uint8_t* sct_list;
1136 size_t sct_list_len;
davidbend80c12c2016-10-11 00:13:491137 SSL_get0_signed_cert_timestamp_list(ssl_.get(), &sct_list, &sct_list_len);
davidbenc4212c02015-05-12 22:30:181138 set_signed_cert_timestamps_received(sct_list_len != 0);
1139
davidben971a681a2017-02-16 18:57:461140 if (!IsRenegotiationAllowed())
1141 SSL_set_renegotiate_mode(ssl_.get(), ssl_renegotiate_never);
davidbenc4212c02015-05-12 22:30:181142
davidbend80c12c2016-10-11 00:13:491143 uint16_t signature_algorithm = SSL_get_peer_signature_algorithm(ssl_.get());
davidben0653c8d2016-07-08 02:16:171144 if (signature_algorithm != 0) {
1145 UMA_HISTOGRAM_SPARSE_SLOWLY("Net.SSLSignatureAlgorithm",
1146 signature_algorithm);
davidben4fe4f982015-11-11 22:00:121147 }
1148
davidbenc4212c02015-05-12 22:30:181149 // Verify the certificate.
rsleeviadbd4982016-06-13 22:10:271150 next_handshake_state_ = STATE_VERIFY_CERT;
davidbenc4212c02015-05-12 22:30:181151 return OK;
[email protected]b9b651f2013-11-09 04:32:221152}
1153
svaldeze83af292016-04-26 14:33:371154int SSLClientSocketImpl::DoChannelIDLookup() {
mikecironef22f9812016-10-04 03:40:191155 NetLogParametersCallback callback = base::Bind(
nharper49b27d992016-02-09 18:28:511156 &NetLogChannelIDLookupCallback, base::Unretained(channel_id_service_));
mikecirone8b85c432016-09-08 19:11:001157 net_log_.BeginEvent(NetLogEventType::SSL_GET_CHANNEL_ID, callback);
rsleeviadbd4982016-06-13 22:10:271158 next_handshake_state_ = STATE_CHANNEL_ID_LOOKUP_COMPLETE;
[email protected]6b8a3c742014-07-25 00:25:351159 return channel_id_service_->GetOrCreateChannelID(
nharper2e171cf2015-06-01 20:29:231160 host_and_port_.host(), &channel_id_key_,
svaldeze83af292016-04-26 14:33:371161 base::Bind(&SSLClientSocketImpl::OnHandshakeIOComplete,
[email protected]faff9852014-06-21 06:13:461162 base::Unretained(this)),
nharper75ade892015-06-10 19:05:351163 &channel_id_request_);
[email protected]faff9852014-06-21 06:13:461164}
1165
svaldeze83af292016-04-26 14:33:371166int SSLClientSocketImpl::DoChannelIDLookupComplete(int result) {
mikecirone8b85c432016-09-08 19:11:001167 net_log_.EndEvent(NetLogEventType::SSL_GET_CHANNEL_ID,
nharper49b27d992016-02-09 18:28:511168 base::Bind(&NetLogChannelIDLookupCompleteCallback,
1169 channel_id_key_.get(), result));
[email protected]faff9852014-06-21 06:13:461170 if (result < 0)
1171 return result;
1172
[email protected]faff9852014-06-21 06:13:461173 // Hand the key to OpenSSL. Check for error in case OpenSSL rejects the key
1174 // type.
davidben8a208fc2016-01-22 17:08:081175 DCHECK(channel_id_key_);
[email protected]faff9852014-06-21 06:13:461176 crypto::OpenSSLErrStackTracer err_tracer(FROM_HERE);
davidbend80c12c2016-10-11 00:13:491177 if (!SSL_set1_tls_channel_id(ssl_.get(), channel_id_key_->key())) {
[email protected]faff9852014-06-21 06:13:461178 LOG(ERROR) << "Failed to set Channel ID.";
davidbenf225b262016-09-15 22:09:221179 return ERR_FAILED;
[email protected]faff9852014-06-21 06:13:461180 }
1181
1182 // Return to the handshake.
davidben52053b382015-04-27 19:22:291183 channel_id_sent_ = true;
rsleeviadbd4982016-06-13 22:10:271184 next_handshake_state_ = STATE_HANDSHAKE;
[email protected]faff9852014-06-21 06:13:461185 return OK;
1186}
1187
svaldeze83af292016-04-26 14:33:371188int SSLClientSocketImpl::DoVerifyCert(int result) {
davidben09c3d072014-08-25 20:33:581189 DCHECK(start_cert_verification_time_.is_null());
davidben30798ed82014-09-19 19:28:201190
David Benjaminb8ab3852017-08-04 00:17:321191 server_cert_ = x509_util::CreateX509CertificateFromBuffers(
1192 SSL_get0_peer_certificates(ssl_.get()));
[email protected]b9b651f2013-11-09 04:32:221193
Matt Muellerba33e862017-09-28 20:15:521194 // OpenSSL decoded the certificate, but the X509Certificate implementation
1195 // could not. This is treated as a fatal SSL-level protocol error rather than
1196 // a certificate error. See https://crbug.com/91341.
rsleevi74e99742016-09-13 20:35:251197 if (!server_cert_)
davidbenc6435a72015-08-17 18:28:521198 return ERR_SSL_SERVER_CERT_BAD_FORMAT;
1199
davidbenc7e06c92017-03-07 18:54:111200 net_log_.AddEvent(NetLogEventType::SSL_CERTIFICATES_RECEIVED,
1201 base::Bind(&NetLogX509CertificateCallback,
1202 base::Unretained(server_cert_.get())));
1203
1204 next_handshake_state_ = STATE_VERIFY_CERT_COMPLETE;
1205
davidben30798ed82014-09-19 19:28:201206 // If the certificate is bad and has been previously accepted, use
1207 // the previous status and bypass the error.
[email protected]b9b651f2013-11-09 04:32:221208 CertStatus cert_status;
rsleevi74e99742016-09-13 20:35:251209 if (ssl_config_.IsAllowedBadCert(server_cert_.get(), &cert_status)) {
[email protected]b9b651f2013-11-09 04:32:221210 server_cert_verify_result_.Reset();
1211 server_cert_verify_result_.cert_status = cert_status;
1212 server_cert_verify_result_.verified_cert = server_cert_;
1213 return OK;
1214 }
1215
davidben09c3d072014-08-25 20:33:581216 start_cert_verification_time_ = base::TimeTicks::Now();
1217
rsleevi22cae1672016-12-28 01:53:361218 const uint8_t* ocsp_response_raw;
1219 size_t ocsp_response_len;
1220 SSL_get0_ocsp_response(ssl_.get(), &ocsp_response_raw, &ocsp_response_len);
1221 base::StringPiece ocsp_response(
1222 reinterpret_cast<const char*>(ocsp_response_raw), ocsp_response_len);
1223
eroman7f9236a2015-05-11 21:23:431224 return cert_verifier_->Verify(
rsleevi06bd78552016-06-08 22:34:461225 CertVerifier::RequestParams(server_cert_, host_and_port_.host(),
1226 ssl_config_.GetCertVerifyFlags(),
rsleevi22cae1672016-12-28 01:53:361227 ocsp_response.as_string(), CertificateList()),
[email protected]591cffcd2014-08-18 20:02:301228 // TODO(davidben): Route the CRLSet through SSLConfig so
1229 // SSLClientSocket doesn't depend on SSLConfigService.
davidben15f57132015-04-27 18:08:361230 SSLConfigService::GetCRLSet().get(), &server_cert_verify_result_,
svaldeze83af292016-04-26 14:33:371231 base::Bind(&SSLClientSocketImpl::OnHandshakeIOComplete,
[email protected]b9b651f2013-11-09 04:32:221232 base::Unretained(this)),
eroman7f9236a2015-05-11 21:23:431233 &cert_verifier_request_, net_log_);
[email protected]b9b651f2013-11-09 04:32:221234}
1235
svaldeze83af292016-04-26 14:33:371236int SSLClientSocketImpl::DoVerifyCertComplete(int result) {
eroman7f9236a2015-05-11 21:23:431237 cert_verifier_request_.reset();
[email protected]b9b651f2013-11-09 04:32:221238
davidben09c3d072014-08-25 20:33:581239 if (!start_cert_verification_time_.is_null()) {
1240 base::TimeDelta verify_time =
1241 base::TimeTicks::Now() - start_cert_verification_time_;
1242 if (result == OK) {
1243 UMA_HISTOGRAM_TIMES("Net.SSLCertVerificationTime", verify_time);
1244 } else {
1245 UMA_HISTOGRAM_TIMES("Net.SSLCertVerificationTimeError", verify_time);
1246 }
1247 }
1248
rsleevi4a6ca8c2016-06-24 03:05:221249 // If the connection was good, check HPKP and CT status simultaneously,
1250 // but prefer to treat the HPKP error as more serious, if there was one.
[email protected]8bd4e7a2014-08-09 14:49:171251 const CertStatus cert_status = server_cert_verify_result_.cert_status;
rsleevi4a6ca8c2016-06-24 03:05:221252 if ((result == OK ||
dadrian8f8946652016-06-21 23:48:311253 (IsCertificateError(result) && IsCertStatusMinorError(cert_status)))) {
rsleevi4a6ca8c2016-06-24 03:05:221254 int ct_result = VerifyCT();
dadrian8f8946652016-06-21 23:48:311255 TransportSecurityState::PKPStatus pin_validity =
1256 transport_security_state_->CheckPublicKeyPins(
1257 host_and_port_, server_cert_verify_result_.is_issued_by_known_root,
1258 server_cert_verify_result_.public_key_hashes, server_cert_.get(),
1259 server_cert_verify_result_.verified_cert.get(),
1260 TransportSecurityState::ENABLE_PIN_REPORTS, &pinning_failure_log_);
1261 switch (pin_validity) {
1262 case TransportSecurityState::PKPStatus::VIOLATED:
1263 server_cert_verify_result_.cert_status |=
1264 CERT_STATUS_PINNED_KEY_MISSING;
1265 result = ERR_SSL_PINNED_KEY_NOT_IN_CERT_CHAIN;
1266 break;
1267 case TransportSecurityState::PKPStatus::BYPASSED:
1268 pkp_bypassed_ = true;
1269 // Fall through.
1270 case TransportSecurityState::PKPStatus::OK:
1271 // Do nothing.
1272 break;
rsleevi9545d342016-06-21 03:17:371273 }
rsleevi4a6ca8c2016-06-24 03:05:221274 if (result != ERR_SSL_PINNED_KEY_NOT_IN_CERT_CHAIN && ct_result != OK)
1275 result = ct_result;
[email protected]8bd4e7a2014-08-09 14:49:171276 }
1277
[email protected]b9b651f2013-11-09 04:32:221278 if (result == OK) {
davidbendafe4e52015-04-08 22:53:521279 DCHECK(!certificate_verified_);
1280 certificate_verified_ = true;
1281 MaybeCacheSession();
dadriand476e652016-07-26 21:33:241282 SSLInfo ssl_info;
1283 bool ok = GetSSLInfo(&ssl_info);
1284 DCHECK(ok);
rsleevi22cae1672016-12-28 01:53:361285
1286 const uint8_t* ocsp_response_raw;
1287 size_t ocsp_response_len;
1288 SSL_get0_ocsp_response(ssl_.get(), &ocsp_response_raw, &ocsp_response_len);
1289 base::StringPiece ocsp_response(
1290 reinterpret_cast<const char*>(ocsp_response_raw), ocsp_response_len);
1291
dadriand476e652016-07-26 21:33:241292 transport_security_state_->CheckExpectStaple(host_and_port_, ssl_info,
rsleevi22cae1672016-12-28 01:53:361293 ocsp_response);
[email protected]b9b651f2013-11-09 04:32:221294 }
1295
[email protected]64b5c892014-08-08 09:39:261296 completed_connect_ = true;
[email protected]b9b651f2013-11-09 04:32:221297 // Exit DoHandshakeLoop and return the result to the caller to Connect.
1298 DCHECK_EQ(STATE_NONE, next_handshake_state_);
1299 return result;
1300}
1301
svaldeze83af292016-04-26 14:33:371302void SSLClientSocketImpl::DoConnectCallback(int rv) {
[email protected]b9b651f2013-11-09 04:32:221303 if (!user_connect_callback_.is_null()) {
1304 CompletionCallback c = user_connect_callback_;
1305 user_connect_callback_.Reset();
1306 c.Run(rv > OK ? OK : rv);
1307 }
1308}
1309
svaldeze83af292016-04-26 14:33:371310void SSLClientSocketImpl::OnHandshakeIOComplete(int result) {
[email protected]b9b651f2013-11-09 04:32:221311 int rv = DoHandshakeLoop(result);
1312 if (rv != ERR_IO_PENDING) {
davidben281d13f02016-04-27 20:43:281313 LogConnectEndEvent(rv);
[email protected]b9b651f2013-11-09 04:32:221314 DoConnectCallback(rv);
1315 }
1316}
1317
svaldeze83af292016-04-26 14:33:371318int SSLClientSocketImpl::DoHandshakeLoop(int last_io_result) {
xunjieli0b7f5b62016-12-06 20:43:481319 TRACE_EVENT0(kNetTracingCategory, "SSLClientSocketImpl::DoHandshakeLoop");
[email protected]b9b651f2013-11-09 04:32:221320 int rv = last_io_result;
1321 do {
1322 // Default to STATE_NONE for next state.
1323 // (This is a quirk carried over from the windows
1324 // implementation. It makes reading the logs a bit harder.)
1325 // State handlers can and often do call GotoState just
1326 // to stay in the current state.
1327 State state = next_handshake_state_;
rsleeviadbd4982016-06-13 22:10:271328 next_handshake_state_ = STATE_NONE;
[email protected]b9b651f2013-11-09 04:32:221329 switch (state) {
1330 case STATE_HANDSHAKE:
1331 rv = DoHandshake();
1332 break;
davidbenc4212c02015-05-12 22:30:181333 case STATE_HANDSHAKE_COMPLETE:
1334 rv = DoHandshakeComplete(rv);
1335 break;
[email protected]faff9852014-06-21 06:13:461336 case STATE_CHANNEL_ID_LOOKUP:
1337 DCHECK_EQ(OK, rv);
1338 rv = DoChannelIDLookup();
svaldeze83af292016-04-26 14:33:371339 break;
[email protected]faff9852014-06-21 06:13:461340 case STATE_CHANNEL_ID_LOOKUP_COMPLETE:
1341 rv = DoChannelIDLookupComplete(rv);
1342 break;
[email protected]b9b651f2013-11-09 04:32:221343 case STATE_VERIFY_CERT:
[email protected]faff9852014-06-21 06:13:461344 DCHECK_EQ(OK, rv);
[email protected]b9b651f2013-11-09 04:32:221345 rv = DoVerifyCert(rv);
svaldeze83af292016-04-26 14:33:371346 break;
[email protected]b9b651f2013-11-09 04:32:221347 case STATE_VERIFY_CERT_COMPLETE:
1348 rv = DoVerifyCertComplete(rv);
1349 break;
1350 case STATE_NONE:
1351 default:
1352 rv = ERR_UNEXPECTED;
1353 NOTREACHED() << "unexpected state" << state;
1354 break;
1355 }
[email protected]b9b651f2013-11-09 04:32:221356 } while (rv != ERR_IO_PENDING && next_handshake_state_ != STATE_NONE);
1357 return rv;
1358}
1359
xunjieli321a96f32017-03-07 19:42:171360int SSLClientSocketImpl::DoPayloadRead(IOBuffer* buf, int buf_len) {
[email protected]b9b651f2013-11-09 04:32:221361 crypto::OpenSSLErrStackTracer err_tracer(FROM_HERE);
1362
xunjieli321a96f32017-03-07 19:42:171363 DCHECK_LT(0, buf_len);
1364 DCHECK(buf);
davidben7e555daf2015-03-25 17:03:291365
[email protected]b9b651f2013-11-09 04:32:221366 int rv;
davidben1d489522015-07-01 18:48:461367 if (pending_read_error_ != kNoPendingResult) {
[email protected]b9b651f2013-11-09 04:32:221368 rv = pending_read_error_;
davidben1d489522015-07-01 18:48:461369 pending_read_error_ = kNoPendingResult;
[email protected]b9b651f2013-11-09 04:32:221370 if (rv == 0) {
mikecirone8b85c432016-09-08 19:11:001371 net_log_.AddByteTransferEvent(NetLogEventType::SSL_SOCKET_BYTES_RECEIVED,
xunjieli321a96f32017-03-07 19:42:171372 rv, buf->data());
davidbenb8c23212014-10-28 00:12:161373 } else {
1374 net_log_.AddEvent(
mikecirone8b85c432016-09-08 19:11:001375 NetLogEventType::SSL_READ_ERROR,
davidbenb8c23212014-10-28 00:12:161376 CreateNetLogOpenSSLErrorCallback(rv, pending_read_ssl_error_,
1377 pending_read_error_info_));
[email protected]b9b651f2013-11-09 04:32:221378 }
davidbenb8c23212014-10-28 00:12:161379 pending_read_ssl_error_ = SSL_ERROR_NONE;
1380 pending_read_error_info_ = OpenSSLErrorInfo();
[email protected]b9b651f2013-11-09 04:32:221381 return rv;
1382 }
1383
1384 int total_bytes_read = 0;
davidben7e555daf2015-03-25 17:03:291385 int ssl_ret;
[email protected]b9b651f2013-11-09 04:32:221386 do {
xunjieli321a96f32017-03-07 19:42:171387 ssl_ret = SSL_read(ssl_.get(), buf->data() + total_bytes_read,
1388 buf_len - total_bytes_read);
davidben7e555daf2015-03-25 17:03:291389 if (ssl_ret > 0)
1390 total_bytes_read += ssl_ret;
davidben8ea6b172017-03-07 23:53:501391 // Continue processing records as long as there is more data available
1392 // synchronously.
1393 } while (total_bytes_read < buf_len && ssl_ret > 0 &&
1394 transport_adapter_->HasPendingReadData());
[email protected]b9b651f2013-11-09 04:32:221395
davidben7e555daf2015-03-25 17:03:291396 // Although only the final SSL_read call may have failed, the failure needs to
1397 // processed immediately, while the information still available in OpenSSL's
1398 // error queue.
davidbenced4aa9b2015-05-12 21:22:351399 if (ssl_ret <= 0) {
davidben7e555daf2015-03-25 17:03:291400 // A zero return from SSL_read may mean any of:
1401 // - The underlying BIO_read returned 0.
1402 // - The peer sent a close_notify.
1403 // - Any arbitrary error. https://crbug.com/466303
[email protected]b9b651f2013-11-09 04:32:221404 //
davidben7e555daf2015-03-25 17:03:291405 // TransportReadComplete converts the first to an ERR_CONNECTION_CLOSED
1406 // error, so it does not occur. The second and third are distinguished by
1407 // SSL_ERROR_ZERO_RETURN.
davidbend80c12c2016-10-11 00:13:491408 pending_read_ssl_error_ = SSL_get_error(ssl_.get(), ssl_ret);
davidben7e555daf2015-03-25 17:03:291409 if (pending_read_ssl_error_ == SSL_ERROR_ZERO_RETURN) {
1410 pending_read_error_ = 0;
davidbenced4aa9b2015-05-12 21:22:351411 } else if (pending_read_ssl_error_ == SSL_ERROR_WANT_X509_LOOKUP &&
1412 !ssl_config_.send_client_cert) {
1413 pending_read_error_ = ERR_SSL_CLIENT_AUTH_CERT_NEEDED;
davidben1d489522015-07-01 18:48:461414 } else if (pending_read_ssl_error_ ==
1415 SSL_ERROR_WANT_PRIVATE_KEY_OPERATION) {
svaldez7872fd02015-11-19 21:10:541416 DCHECK(ssl_config_.client_private_key);
davidben1d489522015-07-01 18:48:461417 DCHECK_NE(kNoPendingResult, signature_result_);
1418 pending_read_error_ = ERR_IO_PENDING;
davidben7e555daf2015-03-25 17:03:291419 } else {
davidbenfe132d92016-09-27 18:07:211420 pending_read_error_ = MapLastOpenSSLError(
davidben7e555daf2015-03-25 17:03:291421 pending_read_ssl_error_, err_tracer, &pending_read_error_info_);
[email protected]b9b651f2013-11-09 04:32:221422 }
1423
davidben7e555daf2015-03-25 17:03:291424 // Many servers do not reliably send a close_notify alert when shutting down
1425 // a connection, and instead terminate the TCP connection. This is reported
1426 // as ERR_CONNECTION_CLOSED. Because of this, map the unclean shutdown to a
1427 // graceful EOF, instead of treating it as an error as it should be.
1428 if (pending_read_error_ == ERR_CONNECTION_CLOSED)
1429 pending_read_error_ = 0;
1430 }
davidbenbe6ce7ec2014-10-20 19:15:561431
davidben7e555daf2015-03-25 17:03:291432 if (total_bytes_read > 0) {
1433 // Return any bytes read to the caller. The error will be deferred to the
1434 // next call of DoPayloadRead.
1435 rv = total_bytes_read;
davidbenbe6ce7ec2014-10-20 19:15:561436
davidben7e555daf2015-03-25 17:03:291437 // Do not treat insufficient data as an error to return in the next call to
1438 // DoPayloadRead() - instead, let the call fall through to check SSL_read()
davidben3418e81f2016-10-19 00:09:451439 // again. The transport may have data available by then.
davidben7e555daf2015-03-25 17:03:291440 if (pending_read_error_ == ERR_IO_PENDING)
davidben1d489522015-07-01 18:48:461441 pending_read_error_ = kNoPendingResult;
davidben7e555daf2015-03-25 17:03:291442 } else {
1443 // No bytes were returned. Return the pending read error immediately.
davidben1d489522015-07-01 18:48:461444 DCHECK_NE(kNoPendingResult, pending_read_error_);
davidben7e555daf2015-03-25 17:03:291445 rv = pending_read_error_;
davidben1d489522015-07-01 18:48:461446 pending_read_error_ = kNoPendingResult;
[email protected]b9b651f2013-11-09 04:32:221447 }
1448
1449 if (rv >= 0) {
mikecirone8b85c432016-09-08 19:11:001450 net_log_.AddByteTransferEvent(NetLogEventType::SSL_SOCKET_BYTES_RECEIVED,
xunjieli321a96f32017-03-07 19:42:171451 rv, buf->data());
davidbenb8c23212014-10-28 00:12:161452 } else if (rv != ERR_IO_PENDING) {
1453 net_log_.AddEvent(
mikecirone8b85c432016-09-08 19:11:001454 NetLogEventType::SSL_READ_ERROR,
davidbenb8c23212014-10-28 00:12:161455 CreateNetLogOpenSSLErrorCallback(rv, pending_read_ssl_error_,
1456 pending_read_error_info_));
1457 pending_read_ssl_error_ = SSL_ERROR_NONE;
1458 pending_read_error_info_ = OpenSSLErrorInfo();
[email protected]b9b651f2013-11-09 04:32:221459 }
1460 return rv;
1461}
1462
svaldeze83af292016-04-26 14:33:371463int SSLClientSocketImpl::DoPayloadWrite() {
[email protected]b9b651f2013-11-09 04:32:221464 crypto::OpenSSLErrStackTracer err_tracer(FROM_HERE);
davidbend80c12c2016-10-11 00:13:491465 int rv = SSL_write(ssl_.get(), user_write_buf_->data(), user_write_buf_len_);
rsleevif020edc2015-03-16 19:31:241466
[email protected]b9b651f2013-11-09 04:32:221467 if (rv >= 0) {
mikecirone8b85c432016-09-08 19:11:001468 net_log_.AddByteTransferEvent(NetLogEventType::SSL_SOCKET_BYTES_SENT, rv,
[email protected]b9b651f2013-11-09 04:32:221469 user_write_buf_->data());
1470 return rv;
1471 }
1472
davidbend80c12c2016-10-11 00:13:491473 int ssl_error = SSL_get_error(ssl_.get(), rv);
davidben1d489522015-07-01 18:48:461474 if (ssl_error == SSL_ERROR_WANT_PRIVATE_KEY_OPERATION)
1475 return ERR_IO_PENDING;
davidbenb8c23212014-10-28 00:12:161476 OpenSSLErrorInfo error_info;
davidbenfe132d92016-09-27 18:07:211477 int net_error = MapLastOpenSSLError(ssl_error, err_tracer, &error_info);
davidbenb8c23212014-10-28 00:12:161478
1479 if (net_error != ERR_IO_PENDING) {
1480 net_log_.AddEvent(
mikecirone8b85c432016-09-08 19:11:001481 NetLogEventType::SSL_WRITE_ERROR,
davidbenb8c23212014-10-28 00:12:161482 CreateNetLogOpenSSLErrorCallback(net_error, ssl_error, error_info));
1483 }
1484 return net_error;
[email protected]b9b651f2013-11-09 04:32:221485}
1486
davidben3418e81f2016-10-19 00:09:451487void SSLClientSocketImpl::RetryAllOperations() {
1488 // SSL_do_handshake, SSL_read, and SSL_write may all be retried when blocked,
1489 // so retry all operations for simplicity. (Otherwise, SSL_get_error for each
1490 // operation may be remembered to retry only the blocked ones.)
1491
1492 if (next_handshake_state_ == STATE_HANDSHAKE) {
1493 // In handshake phase. The parameter to OnHandshakeIOComplete is unused.
1494 OnHandshakeIOComplete(OK);
1495 return;
1496 }
1497
davidben1d489522015-07-01 18:48:461498 int rv_read = ERR_IO_PENDING;
1499 int rv_write = ERR_IO_PENDING;
xunjieli321a96f32017-03-07 19:42:171500 if (user_read_buf_) {
1501 rv_read = DoPayloadRead(user_read_buf_.get(), user_read_buf_len_);
1502 } else if (!user_read_callback_.is_null()) {
1503 // ReadIfReady() is called by the user. Skip DoPayloadRead() and just let
1504 // the user know that read can be retried.
1505 rv_read = OK;
1506 }
1507
davidben3418e81f2016-10-19 00:09:451508 if (user_write_buf_)
1509 rv_write = DoPayloadWrite();
davidben1d489522015-07-01 18:48:461510
1511 // Performing the Read callback may cause |this| to be deleted. If this
1512 // happens, the Write callback should not be invoked. Guard against this by
1513 // holding a WeakPtr to |this| and ensuring it's still valid.
svaldeze83af292016-04-26 14:33:371514 base::WeakPtr<SSLClientSocketImpl> guard(weak_factory_.GetWeakPtr());
davidben3418e81f2016-10-19 00:09:451515 if (rv_read != ERR_IO_PENDING)
davidben1d489522015-07-01 18:48:461516 DoReadCallback(rv_read);
1517
1518 if (!guard.get())
1519 return;
1520
davidben3418e81f2016-10-19 00:09:451521 if (rv_write != ERR_IO_PENDING)
davidben1d489522015-07-01 18:48:461522 DoWriteCallback(rv_write);
1523}
1524
rsleevi4a6ca8c2016-06-24 03:05:221525int SSLClientSocketImpl::VerifyCT() {
rsleevi4a6ca8c2016-06-24 03:05:221526 const uint8_t* sct_list_raw;
1527 size_t sct_list_len;
davidbend80c12c2016-10-11 00:13:491528 SSL_get0_signed_cert_timestamp_list(ssl_.get(), &sct_list_raw, &sct_list_len);
rsleevi22cae1672016-12-28 01:53:361529 base::StringPiece sct_list(reinterpret_cast<const char*>(sct_list_raw),
1530 sct_list_len);
1531
1532 const uint8_t* ocsp_response_raw;
1533 size_t ocsp_response_len;
1534 SSL_get0_ocsp_response(ssl_.get(), &ocsp_response_raw, &ocsp_response_len);
1535 base::StringPiece ocsp_response(
1536 reinterpret_cast<const char*>(ocsp_response_raw), ocsp_response_len);
rsleevi4a6ca8c2016-06-24 03:05:221537
1538 // Note that this is a completely synchronous operation: The CT Log Verifier
1539 // gets all the data it needs for SCT verification and does not do any
1540 // external communication.
1541 cert_transparency_verifier_->Verify(
rsleevi22cae1672016-12-28 01:53:361542 server_cert_verify_result_.verified_cert.get(), ocsp_response, sct_list,
eranmdcec9632016-10-10 14:16:101543 &ct_verify_result_.scts, net_log_);
rsleevi4a6ca8c2016-06-24 03:05:221544
1545 ct_verify_result_.ct_policies_applied = true;
eranm4bed0b572016-08-14 21:00:351546
1547 SCTList verified_scts =
1548 ct::SCTsMatchingStatus(ct_verify_result_.scts, ct::SCT_STATUS_OK);
1549
rsleevi4a6ca8c2016-06-24 03:05:221550 ct_verify_result_.cert_policy_compliance =
1551 policy_enforcer_->DoesConformToCertPolicy(
eranm4bed0b572016-08-14 21:00:351552 server_cert_verify_result_.verified_cert.get(), verified_scts,
1553 net_log_);
rsleevicd7390e2017-06-14 10:18:261554 if ((server_cert_verify_result_.cert_status & CERT_STATUS_IS_EV) &&
1555 (ct_verify_result_.cert_policy_compliance !=
1556 ct::CertPolicyCompliance::CERT_POLICY_COMPLIES_VIA_SCTS)) {
1557 server_cert_verify_result_.cert_status |= CERT_STATUS_CT_COMPLIANCE_FAILED;
1558 server_cert_verify_result_.cert_status &= ~CERT_STATUS_IS_EV;
1559 }
rsleevi4a6ca8c2016-06-24 03:05:221560
Emily Starkc96e9bc2017-10-10 00:10:391561 UMA_HISTOGRAM_ENUMERATION(
1562 "Net.CertificateTransparency.ConnectionComplianceStatus.SSL",
1563 ct_verify_result_.cert_policy_compliance,
1564 ct::CertPolicyCompliance::CERT_POLICY_MAX);
1565
estarkbf1b52962017-05-05 17:05:251566 if (transport_security_state_->CheckCTRequirements(
1567 host_and_port_, server_cert_verify_result_.is_issued_by_known_root,
1568 server_cert_verify_result_.public_key_hashes,
1569 server_cert_verify_result_.verified_cert.get(), server_cert_.get(),
1570 ct_verify_result_.scts,
1571 TransportSecurityState::ENABLE_EXPECT_CT_REPORTS,
1572 ct_verify_result_.cert_policy_compliance) !=
1573 TransportSecurityState::CT_REQUIREMENTS_MET) {
rsleevi4a6ca8c2016-06-24 03:05:221574 server_cert_verify_result_.cert_status |=
1575 CERT_STATUS_CERTIFICATE_TRANSPARENCY_REQUIRED;
1576 return ERR_CERTIFICATE_TRANSPARENCY_REQUIRED;
1577 }
1578
1579 return OK;
1580}
1581
svaldeze83af292016-04-26 14:33:371582int SSLClientSocketImpl::ClientCertRequestCallback(SSL* ssl) {
davidbend80c12c2016-10-11 00:13:491583 DCHECK(ssl == ssl_.get());
[email protected]82c59022014-08-15 09:38:271584
mikecirone8b85c432016-09-08 19:11:001585 net_log_.AddEvent(NetLogEventType::SSL_CLIENT_CERT_REQUESTED);
davidbenfe132d92016-09-27 18:07:211586 certificate_requested_ = true;
davidbenaf42cbe2014-11-13 03:27:461587
[email protected]82c59022014-08-15 09:38:271588 // Clear any currently configured certificates.
davidbend80c12c2016-10-11 00:13:491589 SSL_certs_clear(ssl_.get());
[email protected]97a854f2014-07-29 07:51:361590
1591#if defined(OS_IOS)
1592 // TODO(droger): Support client auth on iOS. See http://crbug.com/145954).
1593 LOG(WARNING) << "Client auth is not supported";
svaldeze83af292016-04-26 14:33:371594#else // !defined(OS_IOS)
[email protected]5ac981e182010-12-06 17:56:271595 if (!ssl_config_.send_client_cert) {
[email protected]515adc22013-01-09 16:01:231596 // First pass: we know that a client certificate is needed, but we do not
davidbenb11fd212017-01-12 17:08:031597 // have one at hand. Suspend the handshake. SSL_get_error will return
1598 // SSL_ERROR_WANT_X509_LOOKUP.
davidbenced4aa9b2015-05-12 21:22:351599 return -1;
[email protected]5ac981e182010-12-06 17:56:271600 }
1601
1602 // Second pass: a client certificate should have been selected.
[email protected]13914c92013-06-13 22:42:421603 if (ssl_config_.client_cert.get()) {
svaldez7872fd02015-11-19 21:10:541604 if (!ssl_config_.client_private_key) {
1605 // The caller supplied a null private key. Fail the handshake and surface
1606 // an appropriate error to the caller.
davidben1d489522015-07-01 18:48:461607 LOG(WARNING) << "Client cert found without private key";
1608 OpenSSLPutNetError(FROM_HERE, ERR_SSL_CLIENT_AUTH_CERT_NO_PRIVATE_KEY);
1609 return -1;
1610 }
1611
David Benjaminb8ab3852017-08-04 00:17:321612 if (!SetSSLChainAndKey(ssl_.get(), ssl_config_.client_cert.get(), nullptr,
1613 &SSLContext::kPrivateKeyMethod)) {
davidbena35b40c32017-03-09 17:33:451614 OpenSSLPutNetError(FROM_HERE, ERR_SSL_CLIENT_AUTH_CERT_BAD_FORMAT);
1615 return -1;
1616 }
svaldezf3db006f2015-09-29 16:43:581617
1618 std::vector<SSLPrivateKey::Hash> digest_prefs =
svaldez7872fd02015-11-19 21:10:541619 ssl_config_.client_private_key->GetDigestPreferences();
svaldezf3db006f2015-09-29 16:43:581620
1621 size_t digests_len = digest_prefs.size();
1622 std::vector<int> digests;
1623 for (size_t i = 0; i < digests_len; i++) {
1624 switch (digest_prefs[i]) {
1625 case SSLPrivateKey::Hash::SHA1:
1626 digests.push_back(NID_sha1);
1627 break;
1628 case SSLPrivateKey::Hash::SHA256:
1629 digests.push_back(NID_sha256);
1630 break;
1631 case SSLPrivateKey::Hash::SHA384:
1632 digests.push_back(NID_sha384);
1633 break;
1634 case SSLPrivateKey::Hash::SHA512:
1635 digests.push_back(NID_sha512);
1636 break;
1637 case SSLPrivateKey::Hash::MD5_SHA1:
1638 // MD5-SHA1 is not used in TLS 1.2.
1639 break;
1640 }
1641 }
1642
davidbend80c12c2016-10-11 00:13:491643 SSL_set_private_key_digest_prefs(ssl_.get(), digests.data(),
1644 digests.size());
davidbenaf42cbe2014-11-13 03:27:461645
David Benjaminb8ab3852017-08-04 00:17:321646 net_log_.AddEvent(
1647 NetLogEventType::SSL_CLIENT_CERT_PROVIDED,
1648 NetLog::IntCallback(
1649 "cert_count",
1650 1 + ssl_config_.client_cert->GetIntermediateCertificates().size()));
[email protected]6bad5052014-07-12 01:25:131651 return 1;
[email protected]c0787702014-05-20 21:51:441652 }
[email protected]97a854f2014-07-29 07:51:361653#endif // defined(OS_IOS)
[email protected]5ac981e182010-12-06 17:56:271654
1655 // Send no client certificate.
mikecirone8b85c432016-09-08 19:11:001656 net_log_.AddEvent(NetLogEventType::SSL_CLIENT_CERT_PROVIDED,
tfarina5e24b242015-10-27 13:11:281657 NetLog::IntCallback("cert_count", 0));
[email protected]82c59022014-08-15 09:38:271658 return 1;
[email protected]5ac981e182010-12-06 17:56:271659}
1660
svaldeze83af292016-04-26 14:33:371661void SSLClientSocketImpl::MaybeCacheSession() {
davidben44aeae62015-06-24 20:47:431662 // Only cache the session once both a new session has been established and the
1663 // certificate has been verified. Due to False Start, these events may happen
1664 // in either order.
David Benjaminb3840f42017-08-03 15:50:161665 if (!pending_session_ || !certificate_verified_ ||
1666 ssl_session_cache_shard_.empty()) {
davidbendafe4e52015-04-08 22:53:521667 return;
David Benjaminb3840f42017-08-03 15:50:161668 }
davidbendafe4e52015-04-08 22:53:521669
1670 SSLContext::GetInstance()->session_cache()->Insert(GetSessionCacheKey(),
davidbenc269cc4b2016-07-27 14:55:031671 pending_session_.get());
1672 pending_session_ = nullptr;
davidbendafe4e52015-04-08 22:53:521673}
1674
svaldeze83af292016-04-26 14:33:371675int SSLClientSocketImpl::NewSessionCallback(SSL_SESSION* session) {
David Benjaminb3840f42017-08-03 15:50:161676 if (ssl_session_cache_shard_.empty())
1677 return 0;
1678
davidbenc269cc4b2016-07-27 14:55:031679 // OpenSSL passes a reference to |session|.
1680 pending_session_.reset(session);
davidbendafe4e52015-04-08 22:53:521681 MaybeCacheSession();
davidben44aeae62015-06-24 20:47:431682 return 1;
davidbendafe4e52015-04-08 22:53:521683}
1684
svaldeze83af292016-04-26 14:33:371685void SSLClientSocketImpl::AddCTInfoToSSLInfo(SSLInfo* ssl_info) const {
estark723b5eeb2016-02-18 21:01:121686 ssl_info->UpdateCertificateTransparencyInfo(ct_verify_result_);
davidbeneb5f8ef32014-09-04 14:14:321687}
1688
svaldeze83af292016-04-26 14:33:371689std::string SSLClientSocketImpl::GetSessionCacheKey() const {
David Benjaminb3840f42017-08-03 15:50:161690 // If there is no session cache shard configured, disable session
1691 // caching. GetSessionCacheKey may not be called. When
1692 // https://crbug.com/458365 is fixed, this check will not be needed.
1693 DCHECK(!ssl_session_cache_shard_.empty());
1694
rsleevif020edc2015-03-16 19:31:241695 std::string result = host_and_port_.ToString();
davidben095ebb52017-04-12 22:23:341696 result.push_back('/');
rsleevif020edc2015-03-16 19:31:241697 result.append(ssl_session_cache_shard_);
1698
davidben095ebb52017-04-12 22:23:341699 result.push_back('/');
davidben095ebb52017-04-12 22:23:341700 result.push_back(ssl_config_.channel_id_enabled ? '1' : '0');
1701 result.push_back(ssl_config_.version_interference_probe ? '1' : '0');
rsleevif020edc2015-03-16 19:31:241702 return result;
1703}
1704
svaldeze83af292016-04-26 14:33:371705bool SSLClientSocketImpl::IsRenegotiationAllowed() const {
nharper736ceda2015-11-07 00:16:591706 if (tb_was_negotiated_)
1707 return false;
1708
bncce6ea242016-09-15 20:22:321709 if (negotiated_protocol_ == kProtoUnknown)
davidben421116c2015-05-12 19:56:511710 return ssl_config_.renego_allowed_default;
1711
davidben421116c2015-05-12 19:56:511712 for (NextProto allowed : ssl_config_.renego_allowed_for_protos) {
bnc3cf2a592016-08-11 14:48:361713 if (negotiated_protocol_ == allowed)
davidben421116c2015-05-12 19:56:511714 return true;
1715 }
1716 return false;
1717}
1718
davidben0bca07fd2016-07-18 15:12:031719ssl_private_key_result_t SSLClientSocketImpl::PrivateKeySignDigestCallback(
davidben1d489522015-07-01 18:48:461720 uint8_t* out,
1721 size_t* out_len,
1722 size_t max_out,
1723 const EVP_MD* md,
1724 const uint8_t* in,
1725 size_t in_len) {
1726 DCHECK_EQ(kNoPendingResult, signature_result_);
1727 DCHECK(signature_.empty());
svaldez7872fd02015-11-19 21:10:541728 DCHECK(ssl_config_.client_private_key);
davidben1d489522015-07-01 18:48:461729
davidben1d489522015-07-01 18:48:461730 SSLPrivateKey::Hash hash;
1731 if (!EVP_MDToPrivateKeyHash(md, &hash)) {
1732 OpenSSLPutNetError(FROM_HERE, ERR_SSL_CLIENT_AUTH_SIGNATURE_FAILED);
1733 return ssl_private_key_failure;
1734 }
1735
davidbene422380772017-04-19 22:20:011736 net_log_.BeginEvent(NetLogEventType::SSL_PRIVATE_KEY_OP,
1737 base::Bind(&NetLogPrivateKeyOperationCallback, hash));
davidben752bcf22015-12-21 22:55:501738
davidben1d489522015-07-01 18:48:461739 signature_result_ = ERR_IO_PENDING;
svaldez7872fd02015-11-19 21:10:541740 ssl_config_.client_private_key->SignDigest(
davidben1d489522015-07-01 18:48:461741 hash, base::StringPiece(reinterpret_cast<const char*>(in), in_len),
davidben0bca07fd2016-07-18 15:12:031742 base::Bind(&SSLClientSocketImpl::OnPrivateKeyComplete,
davidben1d489522015-07-01 18:48:461743 weak_factory_.GetWeakPtr()));
1744 return ssl_private_key_retry;
1745}
1746
davidben0bca07fd2016-07-18 15:12:031747ssl_private_key_result_t SSLClientSocketImpl::PrivateKeyCompleteCallback(
davidben1d489522015-07-01 18:48:461748 uint8_t* out,
1749 size_t* out_len,
1750 size_t max_out) {
1751 DCHECK_NE(kNoPendingResult, signature_result_);
svaldez7872fd02015-11-19 21:10:541752 DCHECK(ssl_config_.client_private_key);
davidben1d489522015-07-01 18:48:461753
1754 if (signature_result_ == ERR_IO_PENDING)
1755 return ssl_private_key_retry;
1756 if (signature_result_ != OK) {
1757 OpenSSLPutNetError(FROM_HERE, signature_result_);
1758 return ssl_private_key_failure;
1759 }
1760 if (signature_.size() > max_out) {
1761 OpenSSLPutNetError(FROM_HERE, ERR_SSL_CLIENT_AUTH_SIGNATURE_FAILED);
1762 return ssl_private_key_failure;
1763 }
davidben5f8b6bc2015-11-25 03:19:541764 memcpy(out, signature_.data(), signature_.size());
davidben1d489522015-07-01 18:48:461765 *out_len = signature_.size();
1766 signature_.clear();
1767 return ssl_private_key_success;
1768}
1769
davidben0bca07fd2016-07-18 15:12:031770void SSLClientSocketImpl::OnPrivateKeyComplete(
davidben1d489522015-07-01 18:48:461771 Error error,
1772 const std::vector<uint8_t>& signature) {
1773 DCHECK_EQ(ERR_IO_PENDING, signature_result_);
1774 DCHECK(signature_.empty());
svaldez7872fd02015-11-19 21:10:541775 DCHECK(ssl_config_.client_private_key);
davidben1d489522015-07-01 18:48:461776
mikecirone8b85c432016-09-08 19:11:001777 net_log_.EndEventWithNetErrorCode(NetLogEventType::SSL_PRIVATE_KEY_OP, error);
davidben1d489522015-07-01 18:48:461778
1779 signature_result_ = error;
1780 if (signature_result_ == OK)
1781 signature_ = signature;
1782
davidben1d489522015-07-01 18:48:461783 // During a renegotiation, either Read or Write calls may be blocked on an
1784 // asynchronous private key operation.
davidben3418e81f2016-10-19 00:09:451785 RetryAllOperations();
davidben1d489522015-07-01 18:48:461786}
1787
davidbencef9e212017-04-19 15:00:101788void SSLClientSocketImpl::MessageCallback(int is_write,
1789 int content_type,
1790 const void* buf,
1791 size_t len) {
1792 switch (content_type) {
1793 case SSL3_RT_ALERT:
1794 net_log_.AddEvent(is_write ? NetLogEventType::SSL_ALERT_SENT
1795 : NetLogEventType::SSL_ALERT_RECEIVED,
1796 base::Bind(&NetLogSSLAlertCallback, buf, len));
1797 break;
1798 case SSL3_RT_HANDSHAKE:
1799 net_log_.AddEvent(
1800 is_write ? NetLogEventType::SSL_HANDSHAKE_MESSAGE_SENT
1801 : NetLogEventType::SSL_HANDSHAKE_MESSAGE_RECEIVED,
1802 base::Bind(&NetLogSSLMessageCallback, !!is_write, buf, len));
1803 break;
David Benjamina961f5f2017-06-22 23:50:511804 case SSL3_RT_HEADER: {
1805 if (is_write)
1806 return;
1807 if (len != 5) {
1808 NOTREACHED();
1809 return;
1810 }
1811 const uint8_t* buf_bytes = reinterpret_cast<const uint8_t*>(buf);
1812 uint16_t record_len = (uint16_t(buf_bytes[3]) << 8) | buf_bytes[4];
1813 // See RFC 5246 section 6.2.3 for the maximum record size in TLS.
1814 UMA_HISTOGRAM_CUSTOM_COUNTS("Net.SSLRecordSizeRead", record_len, 1,
1815 16384 + 2048, 50);
1816 }
davidbencef9e212017-04-19 15:00:101817 default:
1818 return;
1819 }
1820}
1821
svaldeze83af292016-04-26 14:33:371822int SSLClientSocketImpl::TokenBindingAdd(const uint8_t** out,
1823 size_t* out_len,
1824 int* out_alert_value) {
nharper736ceda2015-11-07 00:16:591825 if (ssl_config_.token_binding_params.empty()) {
1826 return 0;
1827 }
davidbend80c12c2016-10-11 00:13:491828 bssl::ScopedCBB output;
nharper736ceda2015-11-07 00:16:591829 CBB parameters_list;
1830 if (!CBB_init(output.get(), 7) ||
1831 !CBB_add_u8(output.get(), kTbProtocolVersionMajor) ||
1832 !CBB_add_u8(output.get(), kTbProtocolVersionMinor) ||
1833 !CBB_add_u8_length_prefixed(output.get(), &parameters_list)) {
1834 *out_alert_value = SSL_AD_INTERNAL_ERROR;
1835 return -1;
1836 }
1837 for (size_t i = 0; i < ssl_config_.token_binding_params.size(); ++i) {
1838 if (!CBB_add_u8(&parameters_list, ssl_config_.token_binding_params[i])) {
1839 *out_alert_value = SSL_AD_INTERNAL_ERROR;
1840 return -1;
1841 }
1842 }
1843 // |*out| will be freed by TokenBindingFreeCallback.
1844 if (!CBB_finish(output.get(), const_cast<uint8_t**>(out), out_len)) {
1845 *out_alert_value = SSL_AD_INTERNAL_ERROR;
1846 return -1;
1847 }
1848
1849 return 1;
1850}
1851
svaldeze83af292016-04-26 14:33:371852int SSLClientSocketImpl::TokenBindingParse(const uint8_t* contents,
1853 size_t contents_len,
1854 int* out_alert_value) {
nharper736ceda2015-11-07 00:16:591855 if (completed_connect_) {
1856 // Token Binding may only be negotiated on the initial handshake.
1857 *out_alert_value = SSL_AD_ILLEGAL_PARAMETER;
1858 return 0;
1859 }
1860
1861 CBS extension;
1862 CBS_init(&extension, contents, contents_len);
1863
1864 CBS parameters_list;
1865 uint8_t version_major, version_minor, param;
1866 if (!CBS_get_u8(&extension, &version_major) ||
1867 !CBS_get_u8(&extension, &version_minor) ||
1868 !CBS_get_u8_length_prefixed(&extension, &parameters_list) ||
1869 !CBS_get_u8(&parameters_list, &param) || CBS_len(&parameters_list) > 0 ||
1870 CBS_len(&extension) > 0) {
1871 *out_alert_value = SSL_AD_DECODE_ERROR;
1872 return 0;
1873 }
1874 // The server-negotiated version must be less than or equal to our version.
1875 if (version_major > kTbProtocolVersionMajor ||
1876 (version_minor > kTbProtocolVersionMinor &&
1877 version_major == kTbProtocolVersionMajor)) {
1878 *out_alert_value = SSL_AD_ILLEGAL_PARAMETER;
1879 return 0;
1880 }
1881 // If the version the server negotiated is older than we support, don't fail
1882 // parsing the extension, but also don't set |negotiated_|.
1883 if (version_major < kTbMinProtocolVersionMajor ||
1884 (version_minor < kTbMinProtocolVersionMinor &&
1885 version_major == kTbMinProtocolVersionMajor)) {
1886 return 1;
1887 }
1888
1889 for (size_t i = 0; i < ssl_config_.token_binding_params.size(); ++i) {
1890 if (param == ssl_config_.token_binding_params[i]) {
1891 tb_negotiated_param_ = ssl_config_.token_binding_params[i];
1892 tb_was_negotiated_ = true;
1893 return 1;
1894 }
1895 }
1896
1897 *out_alert_value = SSL_AD_ILLEGAL_PARAMETER;
1898 return 0;
1899}
1900
davidben281d13f02016-04-27 20:43:281901void SSLClientSocketImpl::LogConnectEndEvent(int rv) {
1902 if (rv != OK) {
mikecirone8b85c432016-09-08 19:11:001903 net_log_.EndEventWithNetErrorCode(NetLogEventType::SSL_CONNECT, rv);
davidben281d13f02016-04-27 20:43:281904 return;
1905 }
1906
mikecirone8b85c432016-09-08 19:11:001907 net_log_.EndEvent(NetLogEventType::SSL_CONNECT,
davidben281d13f02016-04-27 20:43:281908 base::Bind(&NetLogSSLInfoCallback, base::Unretained(this)));
1909}
1910
bncbd442c22016-09-14 20:49:161911void SSLClientSocketImpl::RecordNegotiatedProtocol() const {
1912 UMA_HISTOGRAM_ENUMERATION("Net.SSLNegotiatedAlpnProtocol",
1913 negotiated_protocol_, kProtoLast + 1);
bnc3cf2a592016-08-11 14:48:361914}
1915
1916void SSLClientSocketImpl::RecordChannelIDSupport() const {
1917 // Since this enum is used for a histogram, do not change or re-use values.
1918 enum {
1919 DISABLED = 0,
1920 CLIENT_ONLY = 1,
1921 CLIENT_AND_SERVER = 2,
1922 // CLIENT_NO_ECC is unused now.
1923 // CLIENT_BAD_SYSTEM_TIME is unused now.
1924 CLIENT_BAD_SYSTEM_TIME = 4,
1925 CLIENT_NO_CHANNEL_ID_SERVICE = 5,
1926 CHANNEL_ID_USAGE_MAX
1927 } supported = DISABLED;
1928 if (channel_id_sent_) {
1929 supported = CLIENT_AND_SERVER;
1930 } else if (ssl_config_.channel_id_enabled) {
1931 if (!channel_id_service_)
1932 supported = CLIENT_NO_CHANNEL_ID_SERVICE;
1933 else
1934 supported = CLIENT_ONLY;
1935 }
1936 UMA_HISTOGRAM_ENUMERATION("DomainBoundCerts.Support", supported,
1937 CHANNEL_ID_USAGE_MAX);
1938}
1939
1940bool SSLClientSocketImpl::IsChannelIDEnabled() const {
1941 return ssl_config_.channel_id_enabled && channel_id_service_;
1942}
1943
davidbenfe132d92016-09-27 18:07:211944int SSLClientSocketImpl::MapLastOpenSSLError(
1945 int ssl_error,
1946 const crypto::OpenSSLErrStackTracer& tracer,
1947 OpenSSLErrorInfo* info) {
1948 int net_error = MapOpenSSLErrorWithDetails(ssl_error, tracer, info);
1949
1950 if (ssl_error == SSL_ERROR_SSL &&
1951 ERR_GET_LIB(info->error_code) == ERR_LIB_SSL) {
1952 // TLS does not provide an alert for missing client certificates, so most
1953 // servers send a generic handshake_failure alert. Detect this case by
1954 // checking if we have received a CertificateRequest but sent no
1955 // certificate. See https://crbug.com/646567.
1956 if (ERR_GET_REASON(info->error_code) ==
1957 SSL_R_SSLV3_ALERT_HANDSHAKE_FAILURE &&
1958 certificate_requested_ && ssl_config_.send_client_cert &&
1959 !ssl_config_.client_cert) {
1960 net_error = ERR_BAD_SSL_CLIENT_AUTH_CERT;
1961 }
1962
1963 // Per spec, access_denied is only for client-certificate-based access
1964 // control, but some buggy firewalls use it when blocking a page. To avoid a
1965 // confusing error, map it to a generic protocol error if no
1966 // CertificateRequest was sent. See https://crbug.com/630883.
1967 if (ERR_GET_REASON(info->error_code) == SSL_R_TLSV1_ALERT_ACCESS_DENIED &&
1968 !certificate_requested_) {
1969 net_error = ERR_SSL_PROTOCOL_ERROR;
1970 }
1971 }
1972
1973 return net_error;
1974}
1975
[email protected]7e5dd49f2010-12-08 18:33:491976} // namespace net