Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(823)

Side by Side Diff: net/socket/ssl_client_socket_impl.cc

Issue 1921563003: Renaming _openssl files to _impl (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 // OpenSSL binding for SSLClientSocket. The class layout and general principle 5 #include "net/socket/ssl_client_socket_impl.h"
6 // of operation is derived from SSLClientSocketNSS.
7
8 #include "net/socket/ssl_client_socket_openssl.h"
9 6
10 #include <errno.h> 7 #include <errno.h>
11 #include <openssl/bio.h> 8 #include <openssl/bio.h>
12 #include <openssl/bytestring.h> 9 #include <openssl/bytestring.h>
13 #include <openssl/err.h> 10 #include <openssl/err.h>
14 #include <openssl/evp.h> 11 #include <openssl/evp.h>
15 #include <openssl/mem.h> 12 #include <openssl/mem.h>
16 #include <openssl/ssl.h> 13 #include <openssl/ssl.h>
17 #include <string.h> 14 #include <string.h>
18 15
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
62 #if defined(USE_NSS_CERTS) 59 #if defined(USE_NSS_CERTS)
63 #include "net/cert_net/nss_ocsp.h" 60 #include "net/cert_net/nss_ocsp.h"
64 #endif 61 #endif
65 62
66 namespace net { 63 namespace net {
67 64
68 namespace { 65 namespace {
69 66
70 // Enable this to see logging for state machine state transitions. 67 // Enable this to see logging for state machine state transitions.
71 #if 0 68 #if 0
72 #define GotoState(s) do { DVLOG(2) << (void *)this << " " << __FUNCTION__ << \ 69 #define GotoState(s) \
73 " jump to state " << s; \ 70 do { \
74 next_handshake_state_ = s; } while (0) 71 DVLOG(2) << (void*)this << " " << __FUNCTION__ << " jump to state " << s; \
72 next_handshake_state_ = s; \
73 } while (0)
75 #else 74 #else
76 #define GotoState(s) next_handshake_state_ = s 75 #define GotoState(s) next_handshake_state_ = s
77 #endif 76 #endif
78 77
79 // This constant can be any non-negative/non-zero value (eg: it does not 78 // This constant can be any non-negative/non-zero value (eg: it does not
80 // overlap with any value of the net::Error range, including net::OK). 79 // overlap with any value of the net::Error range, including net::OK).
81 const int kNoPendingResult = 1; 80 const int kNoPendingResult = 1;
82 81
83 // If a client doesn't have a list of protocols that it supports, but 82 // If a client doesn't have a list of protocols that it supports, but
84 // the server supports NPN, choosing "http/1.1" is the best answer. 83 // the server supports NPN, choosing "http/1.1" is the best answer.
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after
181 if (capture_mode.include_cookies_and_credentials()) { 180 if (capture_mode.include_cookies_and_credentials()) {
182 key_to_log = base::HexEncode(raw_key.data(), raw_key.length()); 181 key_to_log = base::HexEncode(raw_key.data(), raw_key.length());
183 } 182 }
184 dict->SetString("key", key_to_log); 183 dict->SetString("key", key_to_log);
185 } 184 }
186 return std::move(dict); 185 return std::move(dict);
187 } 186 }
188 187
189 } // namespace 188 } // namespace
190 189
191 class SSLClientSocketOpenSSL::SSLContext { 190 class SSLClientSocketImpl::SSLContext {
192 public: 191 public:
193 static SSLContext* GetInstance() { 192 static SSLContext* GetInstance() {
194 return base::Singleton<SSLContext>::get(); 193 return base::Singleton<SSLContext>::get();
195 } 194 }
196 SSL_CTX* ssl_ctx() { return ssl_ctx_.get(); } 195 SSL_CTX* ssl_ctx() { return ssl_ctx_.get(); }
197 SSLClientSessionCacheOpenSSL* session_cache() { return &session_cache_; } 196 SSLClientSessionCacheImpl* session_cache() { return &session_cache_; }
198 197
199 SSLClientSocketOpenSSL* GetClientSocketFromSSL(const SSL* ssl) { 198 SSLClientSocketImpl* GetClientSocketFromSSL(const SSL* ssl) {
200 DCHECK(ssl); 199 DCHECK(ssl);
201 SSLClientSocketOpenSSL* socket = static_cast<SSLClientSocketOpenSSL*>( 200 SSLClientSocketImpl* socket = static_cast<SSLClientSocketImpl*>(
202 SSL_get_ex_data(ssl, ssl_socket_data_index_)); 201 SSL_get_ex_data(ssl, ssl_socket_data_index_));
203 DCHECK(socket); 202 DCHECK(socket);
204 return socket; 203 return socket;
205 } 204 }
206 205
207 bool SetClientSocketForSSL(SSL* ssl, SSLClientSocketOpenSSL* socket) { 206 bool SetClientSocketForSSL(SSL* ssl, SSLClientSocketImpl* socket) {
208 return SSL_set_ex_data(ssl, ssl_socket_data_index_, socket) != 0; 207 return SSL_set_ex_data(ssl, ssl_socket_data_index_, socket) != 0;
209 } 208 }
210 209
211 #if !defined(OS_NACL) 210 #if !defined(OS_NACL)
212 void SetSSLKeyLogFile( 211 void SetSSLKeyLogFile(
213 const base::FilePath& path, 212 const base::FilePath& path,
214 const scoped_refptr<base::SequencedTaskRunner>& task_runner) { 213 const scoped_refptr<base::SequencedTaskRunner>& task_runner) {
215 DCHECK(!ssl_key_logger_); 214 DCHECK(!ssl_key_logger_);
216 ssl_key_logger_.reset(new SSLKeyLogger(path, task_runner)); 215 ssl_key_logger_.reset(new SSLKeyLogger(path, task_runner));
217 SSL_CTX_set_keylog_callback(ssl_ctx_.get(), KeyLogCallback); 216 SSL_CTX_set_keylog_callback(ssl_ctx_.get(), KeyLogCallback);
218 } 217 }
219 #endif 218 #endif
220 219
221 static const SSL_PRIVATE_KEY_METHOD kPrivateKeyMethod; 220 static const SSL_PRIVATE_KEY_METHOD kPrivateKeyMethod;
222 221
223 private: 222 private:
224 friend struct base::DefaultSingletonTraits<SSLContext>; 223 friend struct base::DefaultSingletonTraits<SSLContext>;
225 224
226 SSLContext() : session_cache_(SSLClientSessionCacheOpenSSL::Config()) { 225 SSLContext() : session_cache_(SSLClientSessionCacheImpl::Config()) {
227 crypto::EnsureOpenSSLInit(); 226 crypto::EnsureOpenSSLInit();
228 ssl_socket_data_index_ = SSL_get_ex_new_index(0, 0, 0, 0, 0); 227 ssl_socket_data_index_ = SSL_get_ex_new_index(0, 0, 0, 0, 0);
229 DCHECK_NE(ssl_socket_data_index_, -1); 228 DCHECK_NE(ssl_socket_data_index_, -1);
230 ssl_ctx_.reset(SSL_CTX_new(SSLv23_client_method())); 229 ssl_ctx_.reset(SSL_CTX_new(SSLv23_client_method()));
231 SSL_CTX_set_cert_verify_callback(ssl_ctx_.get(), CertVerifyCallback, NULL); 230 SSL_CTX_set_cert_verify_callback(ssl_ctx_.get(), CertVerifyCallback, NULL);
232 SSL_CTX_set_cert_cb(ssl_ctx_.get(), ClientCertRequestCallback, NULL); 231 SSL_CTX_set_cert_cb(ssl_ctx_.get(), ClientCertRequestCallback, NULL);
233 SSL_CTX_set_verify(ssl_ctx_.get(), SSL_VERIFY_PEER, NULL); 232 SSL_CTX_set_verify(ssl_ctx_.get(), SSL_VERIFY_PEER, NULL);
234 // This stops |SSL_shutdown| from generating the close_notify message, which 233 // This stops |SSL_shutdown| from generating the close_notify message, which
235 // is currently not sent on the network. 234 // is currently not sent on the network.
236 // TODO(haavardm): Remove setting quiet shutdown once 118366 is fixed. 235 // TODO(haavardm): Remove setting quiet shutdown once 118366 is fixed.
237 SSL_CTX_set_quiet_shutdown(ssl_ctx_.get(), 1); 236 SSL_CTX_set_quiet_shutdown(ssl_ctx_.get(), 1);
238 // Note that SSL_OP_DISABLE_NPN is used to disable NPN if 237 // Note that SSL_OP_DISABLE_NPN is used to disable NPN if
239 // ssl_config_.next_proto is empty. 238 // ssl_config_.next_proto is empty.
240 SSL_CTX_set_next_proto_select_cb(ssl_ctx_.get(), SelectNextProtoCallback, 239 SSL_CTX_set_next_proto_select_cb(ssl_ctx_.get(), SelectNextProtoCallback,
241 NULL); 240 NULL);
242 241
243 // Disable the internal session cache. Session caching is handled 242 // Disable the internal session cache. Session caching is handled
244 // externally (i.e. by SSLClientSessionCacheOpenSSL). 243 // externally (i.e. by SSLClientSessionCacheImpl).
245 SSL_CTX_set_session_cache_mode( 244 SSL_CTX_set_session_cache_mode(
246 ssl_ctx_.get(), SSL_SESS_CACHE_CLIENT | SSL_SESS_CACHE_NO_INTERNAL); 245 ssl_ctx_.get(), SSL_SESS_CACHE_CLIENT | SSL_SESS_CACHE_NO_INTERNAL);
247 SSL_CTX_sess_set_new_cb(ssl_ctx_.get(), NewSessionCallback); 246 SSL_CTX_sess_set_new_cb(ssl_ctx_.get(), NewSessionCallback);
248 247
249 if (!SSL_CTX_add_client_custom_ext(ssl_ctx_.get(), kTbExtNum, 248 if (!SSL_CTX_add_client_custom_ext(ssl_ctx_.get(), kTbExtNum,
250 &TokenBindingAddCallback, 249 &TokenBindingAddCallback,
251 &TokenBindingFreeCallback, nullptr, 250 &TokenBindingFreeCallback, nullptr,
252 &TokenBindingParseCallback, nullptr)) { 251 &TokenBindingParseCallback, nullptr)) {
253 NOTREACHED(); 252 NOTREACHED();
254 } 253 }
255 } 254 }
256 255
257 static int TokenBindingAddCallback(SSL* ssl, 256 static int TokenBindingAddCallback(SSL* ssl,
258 unsigned int extension_value, 257 unsigned int extension_value,
259 const uint8_t** out, 258 const uint8_t** out,
260 size_t* out_len, 259 size_t* out_len,
261 int* out_alert_value, 260 int* out_alert_value,
262 void* add_arg) { 261 void* add_arg) {
263 DCHECK_EQ(extension_value, kTbExtNum); 262 DCHECK_EQ(extension_value, kTbExtNum);
264 SSLClientSocketOpenSSL* socket = 263 SSLClientSocketImpl* socket =
265 SSLClientSocketOpenSSL::SSLContext::GetInstance() 264 SSLClientSocketImpl::SSLContext::GetInstance()->GetClientSocketFromSSL(
266 ->GetClientSocketFromSSL(ssl); 265 ssl);
267 return socket->TokenBindingAdd(out, out_len, out_alert_value); 266 return socket->TokenBindingAdd(out, out_len, out_alert_value);
268 } 267 }
269 268
270 static void TokenBindingFreeCallback(SSL* ssl, 269 static void TokenBindingFreeCallback(SSL* ssl,
271 unsigned extension_value, 270 unsigned extension_value,
272 const uint8_t* out, 271 const uint8_t* out,
273 void* add_arg) { 272 void* add_arg) {
274 DCHECK_EQ(extension_value, kTbExtNum); 273 DCHECK_EQ(extension_value, kTbExtNum);
275 OPENSSL_free(const_cast<unsigned char*>(out)); 274 OPENSSL_free(const_cast<unsigned char*>(out));
276 } 275 }
277 276
278 static int TokenBindingParseCallback(SSL* ssl, 277 static int TokenBindingParseCallback(SSL* ssl,
279 unsigned int extension_value, 278 unsigned int extension_value,
280 const uint8_t* contents, 279 const uint8_t* contents,
281 size_t contents_len, 280 size_t contents_len,
282 int* out_alert_value, 281 int* out_alert_value,
283 void* parse_arg) { 282 void* parse_arg) {
284 DCHECK_EQ(extension_value, kTbExtNum); 283 DCHECK_EQ(extension_value, kTbExtNum);
285 SSLClientSocketOpenSSL* socket = 284 SSLClientSocketImpl* socket =
286 SSLClientSocketOpenSSL::SSLContext::GetInstance() 285 SSLClientSocketImpl::SSLContext::GetInstance()->GetClientSocketFromSSL(
287 ->GetClientSocketFromSSL(ssl); 286 ssl);
288 return socket->TokenBindingParse(contents, contents_len, out_alert_value); 287 return socket->TokenBindingParse(contents, contents_len, out_alert_value);
289 } 288 }
290 289
291 static int ClientCertRequestCallback(SSL* ssl, void* arg) { 290 static int ClientCertRequestCallback(SSL* ssl, void* arg) {
292 SSLClientSocketOpenSSL* socket = GetInstance()->GetClientSocketFromSSL(ssl); 291 SSLClientSocketImpl* socket = GetInstance()->GetClientSocketFromSSL(ssl);
293 DCHECK(socket); 292 DCHECK(socket);
294 return socket->ClientCertRequestCallback(ssl); 293 return socket->ClientCertRequestCallback(ssl);
295 } 294 }
296 295
297 static int CertVerifyCallback(X509_STORE_CTX *store_ctx, void *arg) { 296 static int CertVerifyCallback(X509_STORE_CTX* store_ctx, void* arg) {
298 SSL* ssl = reinterpret_cast<SSL*>(X509_STORE_CTX_get_ex_data( 297 SSL* ssl = reinterpret_cast<SSL*>(X509_STORE_CTX_get_ex_data(
299 store_ctx, SSL_get_ex_data_X509_STORE_CTX_idx())); 298 store_ctx, SSL_get_ex_data_X509_STORE_CTX_idx()));
300 SSLClientSocketOpenSSL* socket = GetInstance()->GetClientSocketFromSSL(ssl); 299 SSLClientSocketImpl* socket = GetInstance()->GetClientSocketFromSSL(ssl);
301 CHECK(socket); 300 CHECK(socket);
302 301
303 return socket->CertVerifyCallback(store_ctx); 302 return socket->CertVerifyCallback(store_ctx);
304 } 303 }
305 304
306 static int SelectNextProtoCallback(SSL* ssl, 305 static int SelectNextProtoCallback(SSL* ssl,
307 unsigned char** out, unsigned char* outlen, 306 unsigned char** out,
307 unsigned char* outlen,
308 const unsigned char* in, 308 const unsigned char* in,
309 unsigned int inlen, void* arg) { 309 unsigned int inlen,
310 SSLClientSocketOpenSSL* socket = GetInstance()->GetClientSocketFromSSL(ssl); 310 void* arg) {
311 SSLClientSocketImpl* socket = GetInstance()->GetClientSocketFromSSL(ssl);
311 return socket->SelectNextProtoCallback(out, outlen, in, inlen); 312 return socket->SelectNextProtoCallback(out, outlen, in, inlen);
312 } 313 }
313 314
314 static int NewSessionCallback(SSL* ssl, SSL_SESSION* session) { 315 static int NewSessionCallback(SSL* ssl, SSL_SESSION* session) {
315 SSLClientSocketOpenSSL* socket = GetInstance()->GetClientSocketFromSSL(ssl); 316 SSLClientSocketImpl* socket = GetInstance()->GetClientSocketFromSSL(ssl);
316 return socket->NewSessionCallback(session); 317 return socket->NewSessionCallback(session);
317 } 318 }
318 319
319 static int PrivateKeyTypeCallback(SSL* ssl) { 320 static int PrivateKeyTypeCallback(SSL* ssl) {
320 SSLClientSocketOpenSSL* socket = GetInstance()->GetClientSocketFromSSL(ssl); 321 SSLClientSocketImpl* socket = GetInstance()->GetClientSocketFromSSL(ssl);
321 return socket->PrivateKeyTypeCallback(); 322 return socket->PrivateKeyTypeCallback();
322 } 323 }
323 324
324 static size_t PrivateKeyMaxSignatureLenCallback(SSL* ssl) { 325 static size_t PrivateKeyMaxSignatureLenCallback(SSL* ssl) {
325 SSLClientSocketOpenSSL* socket = GetInstance()->GetClientSocketFromSSL(ssl); 326 SSLClientSocketImpl* socket = GetInstance()->GetClientSocketFromSSL(ssl);
326 return socket->PrivateKeyMaxSignatureLenCallback(); 327 return socket->PrivateKeyMaxSignatureLenCallback();
327 } 328 }
328 329
329 static ssl_private_key_result_t PrivateKeySignCallback(SSL* ssl, 330 static ssl_private_key_result_t PrivateKeySignCallback(SSL* ssl,
330 uint8_t* out, 331 uint8_t* out,
331 size_t* out_len, 332 size_t* out_len,
332 size_t max_out, 333 size_t max_out,
333 const EVP_MD* md, 334 const EVP_MD* md,
334 const uint8_t* in, 335 const uint8_t* in,
335 size_t in_len) { 336 size_t in_len) {
336 SSLClientSocketOpenSSL* socket = GetInstance()->GetClientSocketFromSSL(ssl); 337 SSLClientSocketImpl* socket = GetInstance()->GetClientSocketFromSSL(ssl);
337 return socket->PrivateKeySignCallback(out, out_len, max_out, md, in, 338 return socket->PrivateKeySignCallback(out, out_len, max_out, md, in,
338 in_len); 339 in_len);
339 } 340 }
340 341
341 static ssl_private_key_result_t PrivateKeySignCompleteCallback( 342 static ssl_private_key_result_t PrivateKeySignCompleteCallback(
342 SSL* ssl, 343 SSL* ssl,
343 uint8_t* out, 344 uint8_t* out,
344 size_t* out_len, 345 size_t* out_len,
345 size_t max_out) { 346 size_t max_out) {
346 SSLClientSocketOpenSSL* socket = GetInstance()->GetClientSocketFromSSL(ssl); 347 SSLClientSocketImpl* socket = GetInstance()->GetClientSocketFromSSL(ssl);
347 return socket->PrivateKeySignCompleteCallback(out, out_len, max_out); 348 return socket->PrivateKeySignCompleteCallback(out, out_len, max_out);
348 } 349 }
349 350
350 #if !defined(OS_NACL) 351 #if !defined(OS_NACL)
351 static void KeyLogCallback(const SSL* ssl, const char* line) { 352 static void KeyLogCallback(const SSL* ssl, const char* line) {
352 GetInstance()->ssl_key_logger_->WriteLine(line); 353 GetInstance()->ssl_key_logger_->WriteLine(line);
353 } 354 }
354 #endif 355 #endif
355 356
356 // This is the index used with SSL_get_ex_data to retrieve the owner 357 // This is the index used with SSL_get_ex_data to retrieve the owner
357 // SSLClientSocketOpenSSL object from an SSL instance. 358 // SSLClientSocketImpl object from an SSL instance.
358 int ssl_socket_data_index_; 359 int ssl_socket_data_index_;
359 360
360 ScopedSSL_CTX ssl_ctx_; 361 ScopedSSL_CTX ssl_ctx_;
361 362
362 #if !defined(OS_NACL) 363 #if !defined(OS_NACL)
363 std::unique_ptr<SSLKeyLogger> ssl_key_logger_; 364 std::unique_ptr<SSLKeyLogger> ssl_key_logger_;
364 #endif 365 #endif
365 366
366 // TODO(davidben): Use a separate cache per URLRequestContext. 367 // TODO(davidben): Use a separate cache per URLRequestContext.
367 // https://crbug.com/458365 368 // https://crbug.com/458365
368 // 369 //
369 // TODO(davidben): Sessions should be invalidated on fatal 370 // TODO(davidben): Sessions should be invalidated on fatal
370 // alerts. https://crbug.com/466352 371 // alerts. https://crbug.com/466352
371 SSLClientSessionCacheOpenSSL session_cache_; 372 SSLClientSessionCacheImpl session_cache_;
372 }; 373 };
373 374
374 const SSL_PRIVATE_KEY_METHOD 375 const SSL_PRIVATE_KEY_METHOD
375 SSLClientSocketOpenSSL::SSLContext::kPrivateKeyMethod = { 376 SSLClientSocketImpl::SSLContext::kPrivateKeyMethod = {
376 &SSLClientSocketOpenSSL::SSLContext::PrivateKeyTypeCallback, 377 &SSLClientSocketImpl::SSLContext::PrivateKeyTypeCallback,
377 &SSLClientSocketOpenSSL::SSLContext::PrivateKeyMaxSignatureLenCallback, 378 &SSLClientSocketImpl::SSLContext::PrivateKeyMaxSignatureLenCallback,
378 &SSLClientSocketOpenSSL::SSLContext::PrivateKeySignCallback, 379 &SSLClientSocketImpl::SSLContext::PrivateKeySignCallback,
379 &SSLClientSocketOpenSSL::SSLContext::PrivateKeySignCompleteCallback, 380 &SSLClientSocketImpl::SSLContext::PrivateKeySignCompleteCallback,
380 }; 381 };
381 382
382 // PeerCertificateChain is a helper object which extracts the certificate 383 // PeerCertificateChain is a helper object which extracts the certificate
383 // chain, as given by the server, from an OpenSSL socket and performs the needed 384 // chain, as given by the server, from an OpenSSL socket and performs the needed
384 // resource management. The first element of the chain is the leaf certificate 385 // resource management. The first element of the chain is the leaf certificate
385 // and the other elements are in the order given by the server. 386 // and the other elements are in the order given by the server.
386 class SSLClientSocketOpenSSL::PeerCertificateChain { 387 class SSLClientSocketImpl::PeerCertificateChain {
387 public: 388 public:
388 explicit PeerCertificateChain(STACK_OF(X509)* chain) { Reset(chain); } 389 explicit PeerCertificateChain(STACK_OF(X509) * chain) { Reset(chain); }
389 PeerCertificateChain(const PeerCertificateChain& other) { *this = other; } 390 PeerCertificateChain(const PeerCertificateChain& other) { *this = other; }
390 ~PeerCertificateChain() {} 391 ~PeerCertificateChain() {}
391 PeerCertificateChain& operator=(const PeerCertificateChain& other); 392 PeerCertificateChain& operator=(const PeerCertificateChain& other);
392 393
393 // Resets the PeerCertificateChain to the set of certificates in|chain|, 394 // Resets the PeerCertificateChain to the set of certificates in|chain|,
394 // which may be NULL, indicating to empty the store certificates. 395 // which may be NULL, indicating to empty the store certificates.
395 // Note: If an error occurs, such as being unable to parse the certificates, 396 // Note: If an error occurs, such as being unable to parse the certificates,
396 // this will behave as if Reset(NULL) was called. 397 // this will behave as if Reset(NULL) was called.
397 void Reset(STACK_OF(X509)* chain); 398 void Reset(STACK_OF(X509) * chain);
398 399
399 // Note that when USE_OPENSSL_CERTS is defined, OSCertHandle is X509* 400 // Note that when USE_OPENSSL_CERTS is defined, OSCertHandle is X509*
400 scoped_refptr<X509Certificate> AsOSChain() const; 401 scoped_refptr<X509Certificate> AsOSChain() const;
401 402
402 size_t size() const { 403 size_t size() const {
403 if (!openssl_chain_.get()) 404 if (!openssl_chain_.get())
404 return 0; 405 return 0;
405 return sk_X509_num(openssl_chain_.get()); 406 return sk_X509_num(openssl_chain_.get());
406 } 407 }
407 408
408 bool empty() const { 409 bool empty() const { return size() == 0; }
409 return size() == 0;
410 }
411 410
412 X509* Get(size_t index) const { 411 X509* Get(size_t index) const {
413 DCHECK_LT(index, size()); 412 DCHECK_LT(index, size());
414 return sk_X509_value(openssl_chain_.get(), index); 413 return sk_X509_value(openssl_chain_.get(), index);
415 } 414 }
416 415
417 private: 416 private:
418 ScopedX509Stack openssl_chain_; 417 ScopedX509Stack openssl_chain_;
419 }; 418 };
420 419
421 SSLClientSocketOpenSSL::PeerCertificateChain& 420 SSLClientSocketImpl::PeerCertificateChain&
422 SSLClientSocketOpenSSL::PeerCertificateChain::operator=( 421 SSLClientSocketImpl::PeerCertificateChain::operator=(
423 const PeerCertificateChain& other) { 422 const PeerCertificateChain& other) {
424 if (this == &other) 423 if (this == &other)
425 return *this; 424 return *this;
426 425
427 openssl_chain_.reset(X509_chain_up_ref(other.openssl_chain_.get())); 426 openssl_chain_.reset(X509_chain_up_ref(other.openssl_chain_.get()));
428 return *this; 427 return *this;
429 } 428 }
430 429
431 void SSLClientSocketOpenSSL::PeerCertificateChain::Reset( 430 void SSLClientSocketImpl::PeerCertificateChain::Reset(STACK_OF(X509) * chain) {
432 STACK_OF(X509)* chain) {
433 openssl_chain_.reset(chain ? X509_chain_up_ref(chain) : NULL); 431 openssl_chain_.reset(chain ? X509_chain_up_ref(chain) : NULL);
434 } 432 }
435 433
436 scoped_refptr<X509Certificate> 434 scoped_refptr<X509Certificate>
437 SSLClientSocketOpenSSL::PeerCertificateChain::AsOSChain() const { 435 SSLClientSocketImpl::PeerCertificateChain::AsOSChain() const {
438 #if defined(USE_OPENSSL_CERTS) 436 #if defined(USE_OPENSSL_CERTS)
439 // When OSCertHandle is typedef'ed to X509, this implementation does a short 437 // When OSCertHandle is typedef'ed to X509, this implementation does a short
440 // cut to avoid converting back and forth between DER and the X509 struct. 438 // cut to avoid converting back and forth between DER and the X509 struct.
441 X509Certificate::OSCertHandles intermediates; 439 X509Certificate::OSCertHandles intermediates;
442 for (size_t i = 1; i < sk_X509_num(openssl_chain_.get()); ++i) { 440 for (size_t i = 1; i < sk_X509_num(openssl_chain_.get()); ++i) {
443 intermediates.push_back(sk_X509_value(openssl_chain_.get(), i)); 441 intermediates.push_back(sk_X509_value(openssl_chain_.get(), i));
444 } 442 }
445 443
446 return X509Certificate::CreateFromHandle( 444 return X509Certificate::CreateFromHandle(
447 sk_X509_value(openssl_chain_.get(), 0), intermediates); 445 sk_X509_value(openssl_chain_.get(), 0), intermediates);
448 #else 446 #else
449 // DER-encode the chain and convert to a platform certificate handle. 447 // DER-encode the chain and convert to a platform certificate handle.
450 std::vector<base::StringPiece> der_chain; 448 std::vector<base::StringPiece> der_chain;
451 for (size_t i = 0; i < sk_X509_num(openssl_chain_.get()); ++i) { 449 for (size_t i = 0; i < sk_X509_num(openssl_chain_.get()); ++i) {
452 X509* x = sk_X509_value(openssl_chain_.get(), i); 450 X509* x = sk_X509_value(openssl_chain_.get(), i);
453 base::StringPiece der; 451 base::StringPiece der;
454 if (!x509_util::GetDER(x, &der)) 452 if (!x509_util::GetDER(x, &der))
455 return NULL; 453 return NULL;
456 der_chain.push_back(der); 454 der_chain.push_back(der);
457 } 455 }
458 456
459 return X509Certificate::CreateFromDERCertChain(der_chain); 457 return X509Certificate::CreateFromDERCertChain(der_chain);
460 #endif 458 #endif
461 } 459 }
462 460
463 // static 461 // static
464 void SSLClientSocket::ClearSessionCache() { 462 void SSLClientSocket::ClearSessionCache() {
465 SSLClientSocketOpenSSL::SSLContext* context = 463 SSLClientSocketImpl::SSLContext* context =
466 SSLClientSocketOpenSSL::SSLContext::GetInstance(); 464 SSLClientSocketImpl::SSLContext::GetInstance();
467 context->session_cache()->Flush(); 465 context->session_cache()->Flush();
468 } 466 }
469 467
470 SSLClientSocketOpenSSL::SSLClientSocketOpenSSL( 468 SSLClientSocketImpl::SSLClientSocketImpl(
471 std::unique_ptr<ClientSocketHandle> transport_socket, 469 std::unique_ptr<ClientSocketHandle> transport_socket,
472 const HostPortPair& host_and_port, 470 const HostPortPair& host_and_port,
473 const SSLConfig& ssl_config, 471 const SSLConfig& ssl_config,
474 const SSLClientSocketContext& context) 472 const SSLClientSocketContext& context)
475 : transport_send_busy_(false), 473 : transport_send_busy_(false),
476 transport_recv_busy_(false), 474 transport_recv_busy_(false),
477 pending_read_error_(kNoPendingResult), 475 pending_read_error_(kNoPendingResult),
478 pending_read_ssl_error_(SSL_ERROR_NONE), 476 pending_read_ssl_error_(SSL_ERROR_NONE),
479 transport_read_error_(OK), 477 transport_read_error_(OK),
480 transport_write_error_(OK), 478 transport_write_error_(OK),
(...skipping 20 matching lines...) Expand all
501 certificate_verified_(false), 499 certificate_verified_(false),
502 ssl_failure_state_(SSL_FAILURE_NONE), 500 ssl_failure_state_(SSL_FAILURE_NONE),
503 signature_result_(kNoPendingResult), 501 signature_result_(kNoPendingResult),
504 transport_security_state_(context.transport_security_state), 502 transport_security_state_(context.transport_security_state),
505 policy_enforcer_(context.ct_policy_enforcer), 503 policy_enforcer_(context.ct_policy_enforcer),
506 net_log_(transport_->socket()->NetLog()), 504 net_log_(transport_->socket()->NetLog()),
507 weak_factory_(this) { 505 weak_factory_(this) {
508 DCHECK(cert_verifier_); 506 DCHECK(cert_verifier_);
509 } 507 }
510 508
511 SSLClientSocketOpenSSL::~SSLClientSocketOpenSSL() { 509 SSLClientSocketImpl::~SSLClientSocketImpl() {
512 Disconnect(); 510 Disconnect();
513 } 511 }
514 512
515 #if !defined(OS_NACL) 513 #if !defined(OS_NACL)
516 void SSLClientSocketOpenSSL::SetSSLKeyLogFile( 514 void SSLClientSocketImpl::SetSSLKeyLogFile(
517 const base::FilePath& ssl_keylog_file, 515 const base::FilePath& ssl_keylog_file,
518 const scoped_refptr<base::SequencedTaskRunner>& task_runner) { 516 const scoped_refptr<base::SequencedTaskRunner>& task_runner) {
519 SSLContext::GetInstance()->SetSSLKeyLogFile(ssl_keylog_file, task_runner); 517 SSLContext::GetInstance()->SetSSLKeyLogFile(ssl_keylog_file, task_runner);
520 } 518 }
521 #endif 519 #endif
522 520
523 void SSLClientSocketOpenSSL::GetSSLCertRequestInfo( 521 void SSLClientSocketImpl::GetSSLCertRequestInfo(
524 SSLCertRequestInfo* cert_request_info) { 522 SSLCertRequestInfo* cert_request_info) {
525 cert_request_info->host_and_port = host_and_port_; 523 cert_request_info->host_and_port = host_and_port_;
526 cert_request_info->cert_authorities = cert_authorities_; 524 cert_request_info->cert_authorities = cert_authorities_;
527 cert_request_info->cert_key_types = cert_key_types_; 525 cert_request_info->cert_key_types = cert_key_types_;
528 } 526 }
529 527
530 SSLClientSocket::NextProtoStatus SSLClientSocketOpenSSL::GetNextProto( 528 SSLClientSocket::NextProtoStatus SSLClientSocketImpl::GetNextProto(
531 std::string* proto) const { 529 std::string* proto) const {
532 *proto = npn_proto_; 530 *proto = npn_proto_;
533 return npn_status_; 531 return npn_status_;
534 } 532 }
535 533
536 ChannelIDService* 534 ChannelIDService* SSLClientSocketImpl::GetChannelIDService() const {
537 SSLClientSocketOpenSSL::GetChannelIDService() const {
538 return channel_id_service_; 535 return channel_id_service_;
539 } 536 }
540 537
541 Error SSLClientSocketOpenSSL::GetSignedEKMForTokenBinding( 538 Error SSLClientSocketImpl::GetSignedEKMForTokenBinding(
542 crypto::ECPrivateKey* key, 539 crypto::ECPrivateKey* key,
543 std::vector<uint8_t>* out) { 540 std::vector<uint8_t>* out) {
544 // The same key will be used across multiple requests to sign the same value, 541 // The same key will be used across multiple requests to sign the same value,
545 // so the signature is cached. 542 // so the signature is cached.
546 std::string raw_public_key; 543 std::string raw_public_key;
547 if (!key->ExportRawPublicKey(&raw_public_key)) 544 if (!key->ExportRawPublicKey(&raw_public_key))
548 return ERR_FAILED; 545 return ERR_FAILED;
549 SignedEkmMap::iterator it = tb_signed_ekm_map_.Get(raw_public_key); 546 SignedEkmMap::iterator it = tb_signed_ekm_map_.Get(raw_public_key);
550 if (it != tb_signed_ekm_map_.end()) { 547 if (it != tb_signed_ekm_map_.end()) {
551 *out = it->second; 548 *out = it->second;
(...skipping 12 matching lines...) Expand all
564 if (!SignTokenBindingEkm( 561 if (!SignTokenBindingEkm(
565 base::StringPiece(reinterpret_cast<char*>(tb_ekm_buf), 562 base::StringPiece(reinterpret_cast<char*>(tb_ekm_buf),
566 sizeof(tb_ekm_buf)), 563 sizeof(tb_ekm_buf)),
567 key, out)) 564 key, out))
568 return ERR_FAILED; 565 return ERR_FAILED;
569 566
570 tb_signed_ekm_map_.Put(raw_public_key, *out); 567 tb_signed_ekm_map_.Put(raw_public_key, *out);
571 return OK; 568 return OK;
572 } 569 }
573 570
574 crypto::ECPrivateKey* SSLClientSocketOpenSSL::GetChannelIDKey() const { 571 crypto::ECPrivateKey* SSLClientSocketImpl::GetChannelIDKey() const {
575 return channel_id_key_.get(); 572 return channel_id_key_.get();
576 } 573 }
577 574
578 SSLFailureState SSLClientSocketOpenSSL::GetSSLFailureState() const { 575 SSLFailureState SSLClientSocketImpl::GetSSLFailureState() const {
579 return ssl_failure_state_; 576 return ssl_failure_state_;
580 } 577 }
581 578
582 int SSLClientSocketOpenSSL::ExportKeyingMaterial( 579 int SSLClientSocketImpl::ExportKeyingMaterial(const base::StringPiece& label,
583 const base::StringPiece& label, 580 bool has_context,
584 bool has_context, const base::StringPiece& context, 581 const base::StringPiece& context,
585 unsigned char* out, unsigned int outlen) { 582 unsigned char* out,
583 unsigned int outlen) {
586 if (!IsConnected()) 584 if (!IsConnected())
587 return ERR_SOCKET_NOT_CONNECTED; 585 return ERR_SOCKET_NOT_CONNECTED;
588 586
589 crypto::OpenSSLErrStackTracer err_tracer(FROM_HERE); 587 crypto::OpenSSLErrStackTracer err_tracer(FROM_HERE);
590 588
591 int rv = SSL_export_keying_material( 589 int rv = SSL_export_keying_material(
592 ssl_, out, outlen, label.data(), label.size(), 590 ssl_, out, outlen, label.data(), label.size(),
593 reinterpret_cast<const unsigned char*>(context.data()), context.length(), 591 reinterpret_cast<const unsigned char*>(context.data()), context.length(),
594 has_context ? 1 : 0); 592 has_context ? 1 : 0);
595 593
596 if (rv != 1) { 594 if (rv != 1) {
597 int ssl_error = SSL_get_error(ssl_, rv); 595 int ssl_error = SSL_get_error(ssl_, rv);
598 LOG(ERROR) << "Failed to export keying material;" 596 LOG(ERROR) << "Failed to export keying material;"
599 << " returned " << rv 597 << " returned " << rv << ", SSL error code " << ssl_error;
600 << ", SSL error code " << ssl_error;
601 return MapOpenSSLError(ssl_error, err_tracer); 598 return MapOpenSSLError(ssl_error, err_tracer);
602 } 599 }
603 return OK; 600 return OK;
604 } 601 }
605 602
606 int SSLClientSocketOpenSSL::Connect(const CompletionCallback& callback) { 603 int SSLClientSocketImpl::Connect(const CompletionCallback& callback) {
607 // It is an error to create an SSLClientSocket whose context has no 604 // It is an error to create an SSLClientSocket whose context has no
608 // TransportSecurityState. 605 // TransportSecurityState.
609 DCHECK(transport_security_state_); 606 DCHECK(transport_security_state_);
610 607
611 // Although StreamSocket does allow calling Connect() after Disconnect(), 608 // Although StreamSocket does allow calling Connect() after Disconnect(),
612 // this has never worked for layered sockets. CHECK to detect any consumers 609 // this has never worked for layered sockets. CHECK to detect any consumers
613 // reconnecting an SSL socket. 610 // reconnecting an SSL socket.
614 // 611 //
615 // TODO(davidben,mmenke): Remove this API feature. See 612 // TODO(davidben,mmenke): Remove this API feature. See
616 // https://crbug.com/499289. 613 // https://crbug.com/499289.
(...skipping 15 matching lines...) Expand all
632 rv = DoHandshakeLoop(OK); 629 rv = DoHandshakeLoop(OK);
633 if (rv == ERR_IO_PENDING) { 630 if (rv == ERR_IO_PENDING) {
634 user_connect_callback_ = callback; 631 user_connect_callback_ = callback;
635 } else { 632 } else {
636 net_log_.EndEventWithNetErrorCode(NetLog::TYPE_SSL_CONNECT, rv); 633 net_log_.EndEventWithNetErrorCode(NetLog::TYPE_SSL_CONNECT, rv);
637 } 634 }
638 635
639 return rv > OK ? OK : rv; 636 return rv > OK ? OK : rv;
640 } 637 }
641 638
642 void SSLClientSocketOpenSSL::Disconnect() { 639 void SSLClientSocketImpl::Disconnect() {
643 crypto::OpenSSLErrStackTracer tracer(FROM_HERE); 640 crypto::OpenSSLErrStackTracer tracer(FROM_HERE);
644 641
645 if (ssl_) { 642 if (ssl_) {
646 // Calling SSL_shutdown prevents the session from being marked as 643 // Calling SSL_shutdown prevents the session from being marked as
647 // unresumable. 644 // unresumable.
648 SSL_shutdown(ssl_); 645 SSL_shutdown(ssl_);
649 SSL_free(ssl_); 646 SSL_free(ssl_);
650 ssl_ = NULL; 647 ssl_ = NULL;
651 } 648 }
652 if (transport_bio_) { 649 if (transport_bio_) {
653 BIO_free_all(transport_bio_); 650 BIO_free_all(transport_bio_);
654 transport_bio_ = NULL; 651 transport_bio_ = NULL;
655 } 652 }
656 653
657 disconnected_ = true; 654 disconnected_ = true;
658 655
659 // Shut down anything that may call us back. 656 // Shut down anything that may call us back.
660 cert_verifier_request_.reset(); 657 cert_verifier_request_.reset();
661 transport_->socket()->Disconnect(); 658 transport_->socket()->Disconnect();
662 659
663 // Null all callbacks, delete all buffers. 660 // Null all callbacks, delete all buffers.
664 transport_send_busy_ = false; 661 transport_send_busy_ = false;
665 send_buffer_ = NULL; 662 send_buffer_ = NULL;
666 transport_recv_busy_ = false; 663 transport_recv_busy_ = false;
667 recv_buffer_ = NULL; 664 recv_buffer_ = NULL;
668 665
669 user_connect_callback_.Reset(); 666 user_connect_callback_.Reset();
670 user_read_callback_.Reset(); 667 user_read_callback_.Reset();
671 user_write_callback_.Reset(); 668 user_write_callback_.Reset();
672 user_read_buf_ = NULL; 669 user_read_buf_ = NULL;
673 user_read_buf_len_ = 0; 670 user_read_buf_len_ = 0;
674 user_write_buf_ = NULL; 671 user_write_buf_ = NULL;
675 user_write_buf_len_ = 0; 672 user_write_buf_len_ = 0;
676 673
677 pending_read_error_ = kNoPendingResult; 674 pending_read_error_ = kNoPendingResult;
678 pending_read_ssl_error_ = SSL_ERROR_NONE; 675 pending_read_ssl_error_ = SSL_ERROR_NONE;
679 pending_read_error_info_ = OpenSSLErrorInfo(); 676 pending_read_error_info_ = OpenSSLErrorInfo();
680 677
681 transport_read_error_ = OK; 678 transport_read_error_ = OK;
682 transport_write_error_ = OK; 679 transport_write_error_ = OK;
683 680
684 server_cert_verify_result_.Reset(); 681 server_cert_verify_result_.Reset();
685 completed_connect_ = false; 682 completed_connect_ = false;
(...skipping 10 matching lines...) Expand all
696 tb_was_negotiated_ = false; 693 tb_was_negotiated_ = false;
697 session_pending_ = false; 694 session_pending_ = false;
698 certificate_verified_ = false; 695 certificate_verified_ = false;
699 channel_id_request_.Cancel(); 696 channel_id_request_.Cancel();
700 ssl_failure_state_ = SSL_FAILURE_NONE; 697 ssl_failure_state_ = SSL_FAILURE_NONE;
701 698
702 signature_result_ = kNoPendingResult; 699 signature_result_ = kNoPendingResult;
703 signature_.clear(); 700 signature_.clear();
704 } 701 }
705 702
706 bool SSLClientSocketOpenSSL::IsConnected() const { 703 bool SSLClientSocketImpl::IsConnected() const {
707 // If the handshake has not yet completed. 704 // If the handshake has not yet completed.
708 if (!completed_connect_) 705 if (!completed_connect_)
709 return false; 706 return false;
710 // If an asynchronous operation is still pending. 707 // If an asynchronous operation is still pending.
711 if (user_read_buf_.get() || user_write_buf_.get()) 708 if (user_read_buf_.get() || user_write_buf_.get())
712 return true; 709 return true;
713 710
714 return transport_->socket()->IsConnected(); 711 return transport_->socket()->IsConnected();
715 } 712 }
716 713
717 bool SSLClientSocketOpenSSL::IsConnectedAndIdle() const { 714 bool SSLClientSocketImpl::IsConnectedAndIdle() const {
718 // If the handshake has not yet completed. 715 // If the handshake has not yet completed.
719 if (!completed_connect_) 716 if (!completed_connect_)
720 return false; 717 return false;
721 // If an asynchronous operation is still pending. 718 // If an asynchronous operation is still pending.
722 if (user_read_buf_.get() || user_write_buf_.get()) 719 if (user_read_buf_.get() || user_write_buf_.get())
723 return false; 720 return false;
724 721
725 // If there is data read from the network that has not yet been consumed, do 722 // If there is data read from the network that has not yet been consumed, do
726 // not treat the connection as idle. 723 // not treat the connection as idle.
727 // 724 //
728 // Note that this does not check |BIO_pending|, whether there is ciphertext 725 // Note that this does not check |BIO_pending|, whether there is ciphertext
729 // that has not yet been flushed to the network. |Write| returns early, so 726 // that has not yet been flushed to the network. |Write| returns early, so
730 // this can cause race conditions which cause a socket to not be treated 727 // this can cause race conditions which cause a socket to not be treated
731 // reusable when it should be. See https://crbug.com/466147. 728 // reusable when it should be. See https://crbug.com/466147.
732 if (BIO_wpending(transport_bio_) > 0) 729 if (BIO_wpending(transport_bio_) > 0)
733 return false; 730 return false;
734 731
735 return transport_->socket()->IsConnectedAndIdle(); 732 return transport_->socket()->IsConnectedAndIdle();
736 } 733 }
737 734
738 int SSLClientSocketOpenSSL::GetPeerAddress(IPEndPoint* addressList) const { 735 int SSLClientSocketImpl::GetPeerAddress(IPEndPoint* addressList) const {
739 return transport_->socket()->GetPeerAddress(addressList); 736 return transport_->socket()->GetPeerAddress(addressList);
740 } 737 }
741 738
742 int SSLClientSocketOpenSSL::GetLocalAddress(IPEndPoint* addressList) const { 739 int SSLClientSocketImpl::GetLocalAddress(IPEndPoint* addressList) const {
743 return transport_->socket()->GetLocalAddress(addressList); 740 return transport_->socket()->GetLocalAddress(addressList);
744 } 741 }
745 742
746 const BoundNetLog& SSLClientSocketOpenSSL::NetLog() const { 743 const BoundNetLog& SSLClientSocketImpl::NetLog() const {
747 return net_log_; 744 return net_log_;
748 } 745 }
749 746
750 void SSLClientSocketOpenSSL::SetSubresourceSpeculation() { 747 void SSLClientSocketImpl::SetSubresourceSpeculation() {
751 if (transport_.get() && transport_->socket()) { 748 if (transport_.get() && transport_->socket()) {
752 transport_->socket()->SetSubresourceSpeculation(); 749 transport_->socket()->SetSubresourceSpeculation();
753 } else { 750 } else {
754 NOTREACHED(); 751 NOTREACHED();
755 } 752 }
756 } 753 }
757 754
758 void SSLClientSocketOpenSSL::SetOmniboxSpeculation() { 755 void SSLClientSocketImpl::SetOmniboxSpeculation() {
759 if (transport_.get() && transport_->socket()) { 756 if (transport_.get() && transport_->socket()) {
760 transport_->socket()->SetOmniboxSpeculation(); 757 transport_->socket()->SetOmniboxSpeculation();
761 } else { 758 } else {
762 NOTREACHED(); 759 NOTREACHED();
763 } 760 }
764 } 761 }
765 762
766 bool SSLClientSocketOpenSSL::WasEverUsed() const { 763 bool SSLClientSocketImpl::WasEverUsed() const {
767 return was_ever_used_; 764 return was_ever_used_;
768 } 765 }
769 766
770 bool SSLClientSocketOpenSSL::GetSSLInfo(SSLInfo* ssl_info) { 767 bool SSLClientSocketImpl::GetSSLInfo(SSLInfo* ssl_info) {
771 ssl_info->Reset(); 768 ssl_info->Reset();
772 if (server_cert_chain_->empty()) 769 if (server_cert_chain_->empty())
773 return false; 770 return false;
774 771
775 ssl_info->cert = server_cert_verify_result_.verified_cert; 772 ssl_info->cert = server_cert_verify_result_.verified_cert;
776 ssl_info->unverified_cert = server_cert_; 773 ssl_info->unverified_cert = server_cert_;
777 ssl_info->cert_status = server_cert_verify_result_.cert_status; 774 ssl_info->cert_status = server_cert_verify_result_.cert_status;
778 ssl_info->is_issued_by_known_root = 775 ssl_info->is_issued_by_known_root =
779 server_cert_verify_result_.is_issued_by_known_root; 776 server_cert_verify_result_.is_issued_by_known_root;
780 ssl_info->public_key_hashes = 777 ssl_info->public_key_hashes = server_cert_verify_result_.public_key_hashes;
781 server_cert_verify_result_.public_key_hashes;
782 ssl_info->client_cert_sent = 778 ssl_info->client_cert_sent =
783 ssl_config_.send_client_cert && ssl_config_.client_cert.get(); 779 ssl_config_.send_client_cert && ssl_config_.client_cert.get();
784 ssl_info->channel_id_sent = channel_id_sent_; 780 ssl_info->channel_id_sent = channel_id_sent_;
785 ssl_info->token_binding_negotiated = tb_was_negotiated_; 781 ssl_info->token_binding_negotiated = tb_was_negotiated_;
786 ssl_info->token_binding_key_param = tb_negotiated_param_; 782 ssl_info->token_binding_key_param = tb_negotiated_param_;
787 ssl_info->pinning_failure_log = pinning_failure_log_; 783 ssl_info->pinning_failure_log = pinning_failure_log_;
788 784
789 AddCTInfoToSSLInfo(ssl_info); 785 AddCTInfoToSSLInfo(ssl_info);
790 786
791 const SSL_CIPHER* cipher = SSL_get_current_cipher(ssl_); 787 const SSL_CIPHER* cipher = SSL_get_current_cipher(ssl_);
792 CHECK(cipher); 788 CHECK(cipher);
793 ssl_info->security_bits = SSL_CIPHER_get_bits(cipher, NULL); 789 ssl_info->security_bits = SSL_CIPHER_get_bits(cipher, NULL);
794 ssl_info->key_exchange_info = 790 ssl_info->key_exchange_info =
795 SSL_SESSION_get_key_exchange_info(SSL_get_session(ssl_)); 791 SSL_SESSION_get_key_exchange_info(SSL_get_session(ssl_));
796 792
797 SSLConnectionStatusSetCipherSuite( 793 SSLConnectionStatusSetCipherSuite(
798 static_cast<uint16_t>(SSL_CIPHER_get_id(cipher)), 794 static_cast<uint16_t>(SSL_CIPHER_get_id(cipher)),
799 &ssl_info->connection_status); 795 &ssl_info->connection_status);
800 SSLConnectionStatusSetVersion(GetNetSSLVersion(ssl_), 796 SSLConnectionStatusSetVersion(GetNetSSLVersion(ssl_),
801 &ssl_info->connection_status); 797 &ssl_info->connection_status);
802 798
803 if (!SSL_get_secure_renegotiation_support(ssl_)) 799 if (!SSL_get_secure_renegotiation_support(ssl_))
804 ssl_info->connection_status |= SSL_CONNECTION_NO_RENEGOTIATION_EXTENSION; 800 ssl_info->connection_status |= SSL_CONNECTION_NO_RENEGOTIATION_EXTENSION;
805 801
806 if (ssl_config_.version_fallback) 802 if (ssl_config_.version_fallback)
807 ssl_info->connection_status |= SSL_CONNECTION_VERSION_FALLBACK; 803 ssl_info->connection_status |= SSL_CONNECTION_VERSION_FALLBACK;
808 804
809 ssl_info->handshake_type = SSL_session_reused(ssl_) ? 805 ssl_info->handshake_type = SSL_session_reused(ssl_)
810 SSLInfo::HANDSHAKE_RESUME : SSLInfo::HANDSHAKE_FULL; 806 ? SSLInfo::HANDSHAKE_RESUME
807 : SSLInfo::HANDSHAKE_FULL;
811 808
812 DVLOG(3) << "Encoded connection status: cipher suite = " 809 DVLOG(3) << "Encoded connection status: cipher suite = "
813 << SSLConnectionStatusToCipherSuite(ssl_info->connection_status) 810 << SSLConnectionStatusToCipherSuite(ssl_info->connection_status)
814 << " version = " 811 << " version = "
815 << SSLConnectionStatusToVersion(ssl_info->connection_status); 812 << SSLConnectionStatusToVersion(ssl_info->connection_status);
816 return true; 813 return true;
817 } 814 }
818 815
819 void SSLClientSocketOpenSSL::GetConnectionAttempts( 816 void SSLClientSocketImpl::GetConnectionAttempts(ConnectionAttempts* out) const {
820 ConnectionAttempts* out) const {
821 out->clear(); 817 out->clear();
822 } 818 }
823 819
824 int64_t SSLClientSocketOpenSSL::GetTotalReceivedBytes() const { 820 int64_t SSLClientSocketImpl::GetTotalReceivedBytes() const {
825 return transport_->socket()->GetTotalReceivedBytes(); 821 return transport_->socket()->GetTotalReceivedBytes();
826 } 822 }
827 823
828 int SSLClientSocketOpenSSL::Read(IOBuffer* buf, 824 int SSLClientSocketImpl::Read(IOBuffer* buf,
829 int buf_len, 825 int buf_len,
830 const CompletionCallback& callback) { 826 const CompletionCallback& callback) {
831 user_read_buf_ = buf; 827 user_read_buf_ = buf;
832 user_read_buf_len_ = buf_len; 828 user_read_buf_len_ = buf_len;
833 829
834 int rv = DoReadLoop(); 830 int rv = DoReadLoop();
835 831
836 if (rv == ERR_IO_PENDING) { 832 if (rv == ERR_IO_PENDING) {
837 user_read_callback_ = callback; 833 user_read_callback_ = callback;
838 } else { 834 } else {
839 if (rv > 0) 835 if (rv > 0)
840 was_ever_used_ = true; 836 was_ever_used_ = true;
841 user_read_buf_ = NULL; 837 user_read_buf_ = NULL;
842 user_read_buf_len_ = 0; 838 user_read_buf_len_ = 0;
843 } 839 }
844 840
845 return rv; 841 return rv;
846 } 842 }
847 843
848 int SSLClientSocketOpenSSL::Write(IOBuffer* buf, 844 int SSLClientSocketImpl::Write(IOBuffer* buf,
849 int buf_len, 845 int buf_len,
850 const CompletionCallback& callback) { 846 const CompletionCallback& callback) {
851 user_write_buf_ = buf; 847 user_write_buf_ = buf;
852 user_write_buf_len_ = buf_len; 848 user_write_buf_len_ = buf_len;
853 849
854 int rv = DoWriteLoop(); 850 int rv = DoWriteLoop();
855 851
856 if (rv == ERR_IO_PENDING) { 852 if (rv == ERR_IO_PENDING) {
857 user_write_callback_ = callback; 853 user_write_callback_ = callback;
858 } else { 854 } else {
859 if (rv > 0) 855 if (rv > 0)
860 was_ever_used_ = true; 856 was_ever_used_ = true;
861 user_write_buf_ = NULL; 857 user_write_buf_ = NULL;
862 user_write_buf_len_ = 0; 858 user_write_buf_len_ = 0;
863 } 859 }
864 860
865 return rv; 861 return rv;
866 } 862 }
867 863
868 int SSLClientSocketOpenSSL::SetReceiveBufferSize(int32_t size) { 864 int SSLClientSocketImpl::SetReceiveBufferSize(int32_t size) {
869 return transport_->socket()->SetReceiveBufferSize(size); 865 return transport_->socket()->SetReceiveBufferSize(size);
870 } 866 }
871 867
872 int SSLClientSocketOpenSSL::SetSendBufferSize(int32_t size) { 868 int SSLClientSocketImpl::SetSendBufferSize(int32_t size) {
873 return transport_->socket()->SetSendBufferSize(size); 869 return transport_->socket()->SetSendBufferSize(size);
874 } 870 }
875 871
876 int SSLClientSocketOpenSSL::Init() { 872 int SSLClientSocketImpl::Init() {
877 DCHECK(!ssl_); 873 DCHECK(!ssl_);
878 DCHECK(!transport_bio_); 874 DCHECK(!transport_bio_);
879 875
880 #if defined(USE_NSS_CERTS) 876 #if defined(USE_NSS_CERTS)
881 if (ssl_config_.cert_io_enabled) { 877 if (ssl_config_.cert_io_enabled) {
882 // TODO(davidben): Move this out of SSLClientSocket. See 878 // TODO(davidben): Move this out of SSLClientSocket. See
883 // https://crbug.com/539520. 879 // https://crbug.com/539520.
884 EnsureNSSHttpIOInit(); 880 EnsureNSSHttpIOInit();
885 } 881 }
886 #endif 882 #endif
(...skipping 21 matching lines...) Expand all
908 if (session) 904 if (session)
909 SSL_set_session(ssl_, session.get()); 905 SSL_set_session(ssl_, session.get());
910 906
911 send_buffer_ = new GrowableIOBuffer(); 907 send_buffer_ = new GrowableIOBuffer();
912 send_buffer_->SetCapacity(KDefaultOpenSSLBufferSize); 908 send_buffer_->SetCapacity(KDefaultOpenSSLBufferSize);
913 recv_buffer_ = new GrowableIOBuffer(); 909 recv_buffer_ = new GrowableIOBuffer();
914 recv_buffer_->SetCapacity(KDefaultOpenSSLBufferSize); 910 recv_buffer_->SetCapacity(KDefaultOpenSSLBufferSize);
915 911
916 BIO* ssl_bio = NULL; 912 BIO* ssl_bio = NULL;
917 913
918 // SSLClientSocketOpenSSL retains ownership of the BIO buffers. 914 // SSLClientSocketImpl retains ownership of the BIO buffers.
919 if (!BIO_new_bio_pair_external_buf( 915 if (!BIO_new_bio_pair_external_buf(
920 &ssl_bio, send_buffer_->capacity(), 916 &ssl_bio, send_buffer_->capacity(),
921 reinterpret_cast<uint8_t*>(send_buffer_->data()), &transport_bio_, 917 reinterpret_cast<uint8_t*>(send_buffer_->data()), &transport_bio_,
922 recv_buffer_->capacity(), 918 recv_buffer_->capacity(),
923 reinterpret_cast<uint8_t*>(recv_buffer_->data()))) 919 reinterpret_cast<uint8_t*>(recv_buffer_->data())))
924 return ERR_UNEXPECTED; 920 return ERR_UNEXPECTED;
925 DCHECK(ssl_bio); 921 DCHECK(ssl_bio);
926 DCHECK(transport_bio_); 922 DCHECK(transport_bio_);
927 923
928 // Install a callback on OpenSSL's end to plumb transport errors through. 924 // Install a callback on OpenSSL's end to plumb transport errors through.
929 BIO_set_callback(ssl_bio, &SSLClientSocketOpenSSL::BIOCallback); 925 BIO_set_callback(ssl_bio, &SSLClientSocketImpl::BIOCallback);
930 BIO_set_callback_arg(ssl_bio, reinterpret_cast<char*>(this)); 926 BIO_set_callback_arg(ssl_bio, reinterpret_cast<char*>(this));
931 927
932 SSL_set_bio(ssl_, ssl_bio, ssl_bio); 928 SSL_set_bio(ssl_, ssl_bio, ssl_bio);
933 929
934 DCHECK_LT(SSL3_VERSION, ssl_config_.version_min); 930 DCHECK_LT(SSL3_VERSION, ssl_config_.version_min);
935 DCHECK_LT(SSL3_VERSION, ssl_config_.version_max); 931 DCHECK_LT(SSL3_VERSION, ssl_config_.version_max);
936 SSL_set_min_version(ssl_, ssl_config_.version_min); 932 SSL_set_min_version(ssl_, ssl_config_.version_min);
937 SSL_set_max_version(ssl_, ssl_config_.version_max); 933 SSL_set_max_version(ssl_, ssl_config_.version_max);
938 934
939 // OpenSSL defaults some options to on, others to off. To avoid ambiguity, 935 // OpenSSL defaults some options to on, others to off. To avoid ambiguity,
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
989 command.append(":!"); 985 command.append(":!");
990 command.append(SSL_CIPHER_get_name(cipher)); 986 command.append(SSL_CIPHER_get_name(cipher));
991 } 987 }
992 } 988 }
993 989
994 int rv = SSL_set_cipher_list(ssl_, command.c_str()); 990 int rv = SSL_set_cipher_list(ssl_, command.c_str());
995 // If this fails (rv = 0) it means there are no ciphers enabled on this SSL. 991 // If this fails (rv = 0) it means there are no ciphers enabled on this SSL.
996 // This will almost certainly result in the socket failing to complete the 992 // This will almost certainly result in the socket failing to complete the
997 // handshake at which point the appropriate error is bubbled up to the client. 993 // handshake at which point the appropriate error is bubbled up to the client.
998 LOG_IF(WARNING, rv != 1) << "SSL_set_cipher_list('" << command << "') " 994 LOG_IF(WARNING, rv != 1) << "SSL_set_cipher_list('" << command << "') "
999 "returned " << rv; 995 "returned "
996 << rv;
1000 997
1001 // TLS channel ids. 998 // TLS channel ids.
1002 if (IsChannelIDEnabled(ssl_config_, channel_id_service_)) { 999 if (IsChannelIDEnabled(ssl_config_, channel_id_service_)) {
1003 SSL_enable_tls_channel_id(ssl_); 1000 SSL_enable_tls_channel_id(ssl_);
1004 } 1001 }
1005 1002
1006 if (!ssl_config_.alpn_protos.empty()) { 1003 if (!ssl_config_.alpn_protos.empty()) {
1007 // Get list of ciphers that are enabled. 1004 // Get list of ciphers that are enabled.
1008 STACK_OF(SSL_CIPHER)* enabled_ciphers = SSL_get_ciphers(ssl_); 1005 STACK_OF(SSL_CIPHER)* enabled_ciphers = SSL_get_ciphers(ssl_);
1009 DCHECK(enabled_ciphers); 1006 DCHECK(enabled_ciphers);
(...skipping 21 matching lines...) Expand all
1031 SSL_enable_signed_cert_timestamps(ssl_); 1028 SSL_enable_signed_cert_timestamps(ssl_);
1032 SSL_enable_ocsp_stapling(ssl_); 1029 SSL_enable_ocsp_stapling(ssl_);
1033 } 1030 }
1034 1031
1035 if (cert_verifier_->SupportsOCSPStapling()) 1032 if (cert_verifier_->SupportsOCSPStapling())
1036 SSL_enable_ocsp_stapling(ssl_); 1033 SSL_enable_ocsp_stapling(ssl_);
1037 1034
1038 return OK; 1035 return OK;
1039 } 1036 }
1040 1037
1041 void SSLClientSocketOpenSSL::DoReadCallback(int rv) { 1038 void SSLClientSocketImpl::DoReadCallback(int rv) {
1042 // Since Run may result in Read being called, clear |user_read_callback_| 1039 // Since Run may result in Read being called, clear |user_read_callback_|
1043 // up front. 1040 // up front.
1044 if (rv > 0) 1041 if (rv > 0)
1045 was_ever_used_ = true; 1042 was_ever_used_ = true;
1046 user_read_buf_ = NULL; 1043 user_read_buf_ = NULL;
1047 user_read_buf_len_ = 0; 1044 user_read_buf_len_ = 0;
1048 base::ResetAndReturn(&user_read_callback_).Run(rv); 1045 base::ResetAndReturn(&user_read_callback_).Run(rv);
1049 } 1046 }
1050 1047
1051 void SSLClientSocketOpenSSL::DoWriteCallback(int rv) { 1048 void SSLClientSocketImpl::DoWriteCallback(int rv) {
1052 // Since Run may result in Write being called, clear |user_write_callback_| 1049 // Since Run may result in Write being called, clear |user_write_callback_|
1053 // up front. 1050 // up front.
1054 if (rv > 0) 1051 if (rv > 0)
1055 was_ever_used_ = true; 1052 was_ever_used_ = true;
1056 user_write_buf_ = NULL; 1053 user_write_buf_ = NULL;
1057 user_write_buf_len_ = 0; 1054 user_write_buf_len_ = 0;
1058 base::ResetAndReturn(&user_write_callback_).Run(rv); 1055 base::ResetAndReturn(&user_write_callback_).Run(rv);
1059 } 1056 }
1060 1057
1061 bool SSLClientSocketOpenSSL::DoTransportIO() { 1058 bool SSLClientSocketImpl::DoTransportIO() {
1062 bool network_moved = false; 1059 bool network_moved = false;
1063 int rv; 1060 int rv;
1064 // Read and write as much data as possible. The loop is necessary because 1061 // Read and write as much data as possible. The loop is necessary because
1065 // Write() may return synchronously. 1062 // Write() may return synchronously.
1066 do { 1063 do {
1067 rv = BufferSend(); 1064 rv = BufferSend();
1068 if (rv != ERR_IO_PENDING && rv != 0) 1065 if (rv != ERR_IO_PENDING && rv != 0)
1069 network_moved = true; 1066 network_moved = true;
1070 } while (rv > 0); 1067 } while (rv > 0);
1071 if (transport_read_error_ == OK && BufferRecv() != ERR_IO_PENDING) 1068 if (transport_read_error_ == OK && BufferRecv() != ERR_IO_PENDING)
1072 network_moved = true; 1069 network_moved = true;
1073 return network_moved; 1070 return network_moved;
1074 } 1071 }
1075 1072
1076 // TODO(cbentzel): Remove including "base/threading/thread_local.h" and 1073 // TODO(cbentzel): Remove including "base/threading/thread_local.h" and
1077 // g_first_run_completed once crbug.com/424386 is fixed. 1074 // g_first_run_completed once crbug.com/424386 is fixed.
1078 base::LazyInstance<base::ThreadLocalBoolean>::Leaky g_first_run_completed = 1075 base::LazyInstance<base::ThreadLocalBoolean>::Leaky g_first_run_completed =
1079 LAZY_INSTANCE_INITIALIZER; 1076 LAZY_INSTANCE_INITIALIZER;
1080 1077
1081 int SSLClientSocketOpenSSL::DoHandshake() { 1078 int SSLClientSocketImpl::DoHandshake() {
1082 crypto::OpenSSLErrStackTracer err_tracer(FROM_HERE); 1079 crypto::OpenSSLErrStackTracer err_tracer(FROM_HERE);
1083 1080
1084 int rv; 1081 int rv;
1085 1082
1086 // TODO(cbentzel): Leave only 1 call to SSL_do_handshake once crbug.com/424386 1083 // TODO(cbentzel): Leave only 1 call to SSL_do_handshake once crbug.com/424386
1087 // is fixed. 1084 // is fixed.
1088 if (ssl_config_.send_client_cert && ssl_config_.client_cert.get()) { 1085 if (ssl_config_.send_client_cert && ssl_config_.client_cert.get()) {
1089 rv = SSL_do_handshake(ssl_); 1086 rv = SSL_do_handshake(ssl_);
1090 } else { 1087 } else {
1091 if (g_first_run_completed.Get().Get()) { 1088 if (g_first_run_completed.Get().Get()) {
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
1158 ssl_failure_state_ = SSL_FAILURE_NEXT_PROTO; 1155 ssl_failure_state_ = SSL_FAILURE_NEXT_PROTO;
1159 } else { 1156 } else {
1160 ssl_failure_state_ = SSL_FAILURE_UNKNOWN; 1157 ssl_failure_state_ = SSL_FAILURE_UNKNOWN;
1161 } 1158 }
1162 } 1159 }
1163 1160
1164 GotoState(STATE_HANDSHAKE_COMPLETE); 1161 GotoState(STATE_HANDSHAKE_COMPLETE);
1165 return net_error; 1162 return net_error;
1166 } 1163 }
1167 1164
1168 int SSLClientSocketOpenSSL::DoHandshakeComplete(int result) { 1165 int SSLClientSocketImpl::DoHandshakeComplete(int result) {
1169 if (result < 0) 1166 if (result < 0)
1170 return result; 1167 return result;
1171 1168
1172 if (ssl_config_.version_fallback && 1169 if (ssl_config_.version_fallback &&
1173 ssl_config_.version_max < ssl_config_.version_fallback_min) { 1170 ssl_config_.version_max < ssl_config_.version_fallback_min) {
1174 return ERR_SSL_FALLBACK_BEYOND_MINIMUM_VERSION; 1171 return ERR_SSL_FALLBACK_BEYOND_MINIMUM_VERSION;
1175 } 1172 }
1176 1173
1177 // Check that if token binding was negotiated, then extended master secret 1174 // Check that if token binding was negotiated, then extended master secret
1178 // must also be negotiated. 1175 // must also be negotiated.
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
1219 UMA_HISTOGRAM_SPARSE_SLOWLY("Net.SSLServerKeyExchangeHash", 1216 UMA_HISTOGRAM_SPARSE_SLOWLY("Net.SSLServerKeyExchangeHash",
1220 server_key_exchange_hash); 1217 server_key_exchange_hash);
1221 } 1218 }
1222 1219
1223 // Verify the certificate. 1220 // Verify the certificate.
1224 UpdateServerCert(); 1221 UpdateServerCert();
1225 GotoState(STATE_VERIFY_CERT); 1222 GotoState(STATE_VERIFY_CERT);
1226 return OK; 1223 return OK;
1227 } 1224 }
1228 1225
1229 int SSLClientSocketOpenSSL::DoChannelIDLookup() { 1226 int SSLClientSocketImpl::DoChannelIDLookup() {
1230 NetLog::ParametersCallback callback = base::Bind( 1227 NetLog::ParametersCallback callback = base::Bind(
1231 &NetLogChannelIDLookupCallback, base::Unretained(channel_id_service_)); 1228 &NetLogChannelIDLookupCallback, base::Unretained(channel_id_service_));
1232 net_log_.BeginEvent(NetLog::TYPE_SSL_GET_CHANNEL_ID, callback); 1229 net_log_.BeginEvent(NetLog::TYPE_SSL_GET_CHANNEL_ID, callback);
1233 GotoState(STATE_CHANNEL_ID_LOOKUP_COMPLETE); 1230 GotoState(STATE_CHANNEL_ID_LOOKUP_COMPLETE);
1234 return channel_id_service_->GetOrCreateChannelID( 1231 return channel_id_service_->GetOrCreateChannelID(
1235 host_and_port_.host(), &channel_id_key_, 1232 host_and_port_.host(), &channel_id_key_,
1236 base::Bind(&SSLClientSocketOpenSSL::OnHandshakeIOComplete, 1233 base::Bind(&SSLClientSocketImpl::OnHandshakeIOComplete,
1237 base::Unretained(this)), 1234 base::Unretained(this)),
1238 &channel_id_request_); 1235 &channel_id_request_);
1239 } 1236 }
1240 1237
1241 int SSLClientSocketOpenSSL::DoChannelIDLookupComplete(int result) { 1238 int SSLClientSocketImpl::DoChannelIDLookupComplete(int result) {
1242 net_log_.EndEvent(NetLog::TYPE_SSL_GET_CHANNEL_ID, 1239 net_log_.EndEvent(NetLog::TYPE_SSL_GET_CHANNEL_ID,
1243 base::Bind(&NetLogChannelIDLookupCompleteCallback, 1240 base::Bind(&NetLogChannelIDLookupCompleteCallback,
1244 channel_id_key_.get(), result)); 1241 channel_id_key_.get(), result));
1245 if (result < 0) 1242 if (result < 0)
1246 return result; 1243 return result;
1247 1244
1248 // Hand the key to OpenSSL. Check for error in case OpenSSL rejects the key 1245 // Hand the key to OpenSSL. Check for error in case OpenSSL rejects the key
1249 // type. 1246 // type.
1250 DCHECK(channel_id_key_); 1247 DCHECK(channel_id_key_);
1251 crypto::OpenSSLErrStackTracer err_tracer(FROM_HERE); 1248 crypto::OpenSSLErrStackTracer err_tracer(FROM_HERE);
1252 int rv = SSL_set1_tls_channel_id(ssl_, channel_id_key_->key()); 1249 int rv = SSL_set1_tls_channel_id(ssl_, channel_id_key_->key());
1253 if (!rv) { 1250 if (!rv) {
1254 LOG(ERROR) << "Failed to set Channel ID."; 1251 LOG(ERROR) << "Failed to set Channel ID.";
1255 int err = SSL_get_error(ssl_, rv); 1252 int err = SSL_get_error(ssl_, rv);
1256 return MapOpenSSLError(err, err_tracer); 1253 return MapOpenSSLError(err, err_tracer);
1257 } 1254 }
1258 1255
1259 // Return to the handshake. 1256 // Return to the handshake.
1260 channel_id_sent_ = true; 1257 channel_id_sent_ = true;
1261 GotoState(STATE_HANDSHAKE); 1258 GotoState(STATE_HANDSHAKE);
1262 return OK; 1259 return OK;
1263 } 1260 }
1264 1261
1265 int SSLClientSocketOpenSSL::DoVerifyCert(int result) { 1262 int SSLClientSocketImpl::DoVerifyCert(int result) {
1266 DCHECK(!server_cert_chain_->empty()); 1263 DCHECK(!server_cert_chain_->empty());
1267 DCHECK(start_cert_verification_time_.is_null()); 1264 DCHECK(start_cert_verification_time_.is_null());
1268 1265
1269 GotoState(STATE_VERIFY_CERT_COMPLETE); 1266 GotoState(STATE_VERIFY_CERT_COMPLETE);
1270 1267
1271 // OpenSSL decoded the certificate, but the platform certificate 1268 // OpenSSL decoded the certificate, but the platform certificate
1272 // implementation could not. This is treated as a fatal SSL-level protocol 1269 // implementation could not. This is treated as a fatal SSL-level protocol
1273 // error rather than a certificate error. See https://crbug.com/91341. 1270 // error rather than a certificate error. See https://crbug.com/91341.
1274 if (!server_cert_.get()) 1271 if (!server_cert_.get())
1275 return ERR_SSL_SERVER_CERT_BAD_FORMAT; 1272 return ERR_SSL_SERVER_CERT_BAD_FORMAT;
(...skipping 24 matching lines...) Expand all
1300 } 1297 }
1301 1298
1302 start_cert_verification_time_ = base::TimeTicks::Now(); 1299 start_cert_verification_time_ = base::TimeTicks::Now();
1303 1300
1304 return cert_verifier_->Verify( 1301 return cert_verifier_->Verify(
1305 server_cert_.get(), host_and_port_.host(), ocsp_response, 1302 server_cert_.get(), host_and_port_.host(), ocsp_response,
1306 ssl_config_.GetCertVerifyFlags(), 1303 ssl_config_.GetCertVerifyFlags(),
1307 // TODO(davidben): Route the CRLSet through SSLConfig so 1304 // TODO(davidben): Route the CRLSet through SSLConfig so
1308 // SSLClientSocket doesn't depend on SSLConfigService. 1305 // SSLClientSocket doesn't depend on SSLConfigService.
1309 SSLConfigService::GetCRLSet().get(), &server_cert_verify_result_, 1306 SSLConfigService::GetCRLSet().get(), &server_cert_verify_result_,
1310 base::Bind(&SSLClientSocketOpenSSL::OnHandshakeIOComplete, 1307 base::Bind(&SSLClientSocketImpl::OnHandshakeIOComplete,
1311 base::Unretained(this)), 1308 base::Unretained(this)),
1312 &cert_verifier_request_, net_log_); 1309 &cert_verifier_request_, net_log_);
1313 } 1310 }
1314 1311
1315 int SSLClientSocketOpenSSL::DoVerifyCertComplete(int result) { 1312 int SSLClientSocketImpl::DoVerifyCertComplete(int result) {
1316 cert_verifier_request_.reset(); 1313 cert_verifier_request_.reset();
1317 1314
1318 if (!start_cert_verification_time_.is_null()) { 1315 if (!start_cert_verification_time_.is_null()) {
1319 base::TimeDelta verify_time = 1316 base::TimeDelta verify_time =
1320 base::TimeTicks::Now() - start_cert_verification_time_; 1317 base::TimeTicks::Now() - start_cert_verification_time_;
1321 if (result == OK) { 1318 if (result == OK) {
1322 UMA_HISTOGRAM_TIMES("Net.SSLCertVerificationTime", verify_time); 1319 UMA_HISTOGRAM_TIMES("Net.SSLCertVerificationTime", verify_time);
1323 } else { 1320 } else {
1324 UMA_HISTOGRAM_TIMES("Net.SSLCertVerificationTimeError", verify_time); 1321 UMA_HISTOGRAM_TIMES("Net.SSLCertVerificationTimeError", verify_time);
1325 } 1322 }
(...skipping 13 matching lines...) Expand all
1339 1336
1340 if (result == OK) { 1337 if (result == OK) {
1341 // Only check Certificate Transparency if there were no other errors with 1338 // Only check Certificate Transparency if there were no other errors with
1342 // the connection. 1339 // the connection.
1343 VerifyCT(); 1340 VerifyCT();
1344 1341
1345 DCHECK(!certificate_verified_); 1342 DCHECK(!certificate_verified_);
1346 certificate_verified_ = true; 1343 certificate_verified_ = true;
1347 MaybeCacheSession(); 1344 MaybeCacheSession();
1348 } else { 1345 } else {
1349 DVLOG(1) << "DoVerifyCertComplete error " << ErrorToString(result) 1346 DVLOG(1) << "DoVerifyCertComplete error " << ErrorToString(result) << " ("
1350 << " (" << result << ")"; 1347 << result << ")";
1351 } 1348 }
1352 1349
1353 completed_connect_ = true; 1350 completed_connect_ = true;
1354 // Exit DoHandshakeLoop and return the result to the caller to Connect. 1351 // Exit DoHandshakeLoop and return the result to the caller to Connect.
1355 DCHECK_EQ(STATE_NONE, next_handshake_state_); 1352 DCHECK_EQ(STATE_NONE, next_handshake_state_);
1356 return result; 1353 return result;
1357 } 1354 }
1358 1355
1359 void SSLClientSocketOpenSSL::DoConnectCallback(int rv) { 1356 void SSLClientSocketImpl::DoConnectCallback(int rv) {
1360 if (!user_connect_callback_.is_null()) { 1357 if (!user_connect_callback_.is_null()) {
1361 CompletionCallback c = user_connect_callback_; 1358 CompletionCallback c = user_connect_callback_;
1362 user_connect_callback_.Reset(); 1359 user_connect_callback_.Reset();
1363 c.Run(rv > OK ? OK : rv); 1360 c.Run(rv > OK ? OK : rv);
1364 } 1361 }
1365 } 1362 }
1366 1363
1367 void SSLClientSocketOpenSSL::UpdateServerCert() { 1364 void SSLClientSocketImpl::UpdateServerCert() {
1368 server_cert_chain_->Reset(SSL_get_peer_cert_chain(ssl_)); 1365 server_cert_chain_->Reset(SSL_get_peer_cert_chain(ssl_));
1369 server_cert_ = server_cert_chain_->AsOSChain(); 1366 server_cert_ = server_cert_chain_->AsOSChain();
1370 if (server_cert_.get()) { 1367 if (server_cert_.get()) {
1371 net_log_.AddEvent( 1368 net_log_.AddEvent(NetLog::TYPE_SSL_CERTIFICATES_RECEIVED,
1372 NetLog::TYPE_SSL_CERTIFICATES_RECEIVED, 1369 base::Bind(&NetLogX509CertificateCallback,
1373 base::Bind(&NetLogX509CertificateCallback, 1370 base::Unretained(server_cert_.get())));
1374 base::Unretained(server_cert_.get())));
1375 } 1371 }
1376 } 1372 }
1377 1373
1378 void SSLClientSocketOpenSSL::VerifyCT() { 1374 void SSLClientSocketImpl::VerifyCT() {
1379 if (!cert_transparency_verifier_) 1375 if (!cert_transparency_verifier_)
1380 return; 1376 return;
1381 1377
1382 const uint8_t* ocsp_response_raw; 1378 const uint8_t* ocsp_response_raw;
1383 size_t ocsp_response_len; 1379 size_t ocsp_response_len;
1384 SSL_get0_ocsp_response(ssl_, &ocsp_response_raw, &ocsp_response_len); 1380 SSL_get0_ocsp_response(ssl_, &ocsp_response_raw, &ocsp_response_len);
1385 std::string ocsp_response; 1381 std::string ocsp_response;
1386 if (ocsp_response_len > 0) { 1382 if (ocsp_response_len > 0) {
1387 ocsp_response.assign(reinterpret_cast<const char*>(ocsp_response_raw), 1383 ocsp_response.assign(reinterpret_cast<const char*>(ocsp_response_raw),
1388 ocsp_response_len); 1384 ocsp_response_len);
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
1430 server_cert_verify_result_.cert_status &= ~CERT_STATUS_IS_EV; 1426 server_cert_verify_result_.cert_status &= ~CERT_STATUS_IS_EV;
1431 } 1427 }
1432 } 1428 }
1433 ct_verify_result_.cert_policy_compliance = 1429 ct_verify_result_.cert_policy_compliance =
1434 policy_enforcer_->DoesConformToCertPolicy( 1430 policy_enforcer_->DoesConformToCertPolicy(
1435 server_cert_verify_result_.verified_cert.get(), 1431 server_cert_verify_result_.verified_cert.get(),
1436 ct_verify_result_.verified_scts, net_log_); 1432 ct_verify_result_.verified_scts, net_log_);
1437 } 1433 }
1438 } 1434 }
1439 1435
1440 void SSLClientSocketOpenSSL::OnHandshakeIOComplete(int result) { 1436 void SSLClientSocketImpl::OnHandshakeIOComplete(int result) {
1441 int rv = DoHandshakeLoop(result); 1437 int rv = DoHandshakeLoop(result);
1442 if (rv != ERR_IO_PENDING) { 1438 if (rv != ERR_IO_PENDING) {
1443 net_log_.EndEventWithNetErrorCode(NetLog::TYPE_SSL_CONNECT, rv); 1439 net_log_.EndEventWithNetErrorCode(NetLog::TYPE_SSL_CONNECT, rv);
1444 DoConnectCallback(rv); 1440 DoConnectCallback(rv);
1445 } 1441 }
1446 } 1442 }
1447 1443
1448 void SSLClientSocketOpenSSL::OnSendComplete(int result) { 1444 void SSLClientSocketImpl::OnSendComplete(int result) {
1449 if (next_handshake_state_ == STATE_HANDSHAKE) { 1445 if (next_handshake_state_ == STATE_HANDSHAKE) {
1450 // In handshake phase. 1446 // In handshake phase.
1451 OnHandshakeIOComplete(result); 1447 OnHandshakeIOComplete(result);
1452 return; 1448 return;
1453 } 1449 }
1454 1450
1455 // During a renegotiation, a Read call may also be blocked on a transport 1451 // During a renegotiation, a Read call may also be blocked on a transport
1456 // write, so retry both operations. 1452 // write, so retry both operations.
1457 PumpReadWriteEvents(); 1453 PumpReadWriteEvents();
1458 } 1454 }
1459 1455
1460 void SSLClientSocketOpenSSL::OnRecvComplete(int result) { 1456 void SSLClientSocketImpl::OnRecvComplete(int result) {
1461 TRACE_EVENT0("net", "SSLClientSocketOpenSSL::OnRecvComplete"); 1457 TRACE_EVENT0("net", "SSLClientSocketImpl::OnRecvComplete");
1462 if (next_handshake_state_ == STATE_HANDSHAKE) { 1458 if (next_handshake_state_ == STATE_HANDSHAKE) {
1463 // In handshake phase. 1459 // In handshake phase.
1464 OnHandshakeIOComplete(result); 1460 OnHandshakeIOComplete(result);
1465 return; 1461 return;
1466 } 1462 }
1467 1463
1468 // Network layer received some data, check if client requested to read 1464 // Network layer received some data, check if client requested to read
1469 // decrypted data. 1465 // decrypted data.
1470 if (!user_read_buf_.get()) 1466 if (!user_read_buf_.get())
1471 return; 1467 return;
1472 1468
1473 int rv = DoReadLoop(); 1469 int rv = DoReadLoop();
1474 if (rv != ERR_IO_PENDING) 1470 if (rv != ERR_IO_PENDING)
1475 DoReadCallback(rv); 1471 DoReadCallback(rv);
1476 } 1472 }
1477 1473
1478 int SSLClientSocketOpenSSL::DoHandshakeLoop(int last_io_result) { 1474 int SSLClientSocketImpl::DoHandshakeLoop(int last_io_result) {
1479 TRACE_EVENT0("net", "SSLClientSocketOpenSSL::DoHandshakeLoop"); 1475 TRACE_EVENT0("net", "SSLClientSocketImpl::DoHandshakeLoop");
1480 int rv = last_io_result; 1476 int rv = last_io_result;
1481 do { 1477 do {
1482 // Default to STATE_NONE for next state. 1478 // Default to STATE_NONE for next state.
1483 // (This is a quirk carried over from the windows 1479 // (This is a quirk carried over from the windows
1484 // implementation. It makes reading the logs a bit harder.) 1480 // implementation. It makes reading the logs a bit harder.)
1485 // State handlers can and often do call GotoState just 1481 // State handlers can and often do call GotoState just
1486 // to stay in the current state. 1482 // to stay in the current state.
1487 State state = next_handshake_state_; 1483 State state = next_handshake_state_;
1488 GotoState(STATE_NONE); 1484 GotoState(STATE_NONE);
1489 switch (state) { 1485 switch (state) {
1490 case STATE_HANDSHAKE: 1486 case STATE_HANDSHAKE:
1491 rv = DoHandshake(); 1487 rv = DoHandshake();
1492 break; 1488 break;
1493 case STATE_HANDSHAKE_COMPLETE: 1489 case STATE_HANDSHAKE_COMPLETE:
1494 rv = DoHandshakeComplete(rv); 1490 rv = DoHandshakeComplete(rv);
1495 break; 1491 break;
1496 case STATE_CHANNEL_ID_LOOKUP: 1492 case STATE_CHANNEL_ID_LOOKUP:
1497 DCHECK_EQ(OK, rv); 1493 DCHECK_EQ(OK, rv);
1498 rv = DoChannelIDLookup(); 1494 rv = DoChannelIDLookup();
1499 break; 1495 break;
1500 case STATE_CHANNEL_ID_LOOKUP_COMPLETE: 1496 case STATE_CHANNEL_ID_LOOKUP_COMPLETE:
1501 rv = DoChannelIDLookupComplete(rv); 1497 rv = DoChannelIDLookupComplete(rv);
1502 break; 1498 break;
1503 case STATE_VERIFY_CERT: 1499 case STATE_VERIFY_CERT:
1504 DCHECK_EQ(OK, rv); 1500 DCHECK_EQ(OK, rv);
1505 rv = DoVerifyCert(rv); 1501 rv = DoVerifyCert(rv);
1506 break; 1502 break;
1507 case STATE_VERIFY_CERT_COMPLETE: 1503 case STATE_VERIFY_CERT_COMPLETE:
1508 rv = DoVerifyCertComplete(rv); 1504 rv = DoVerifyCertComplete(rv);
1509 break; 1505 break;
1510 case STATE_NONE: 1506 case STATE_NONE:
1511 default: 1507 default:
1512 rv = ERR_UNEXPECTED; 1508 rv = ERR_UNEXPECTED;
1513 NOTREACHED() << "unexpected state" << state; 1509 NOTREACHED() << "unexpected state" << state;
1514 break; 1510 break;
1515 } 1511 }
1516 1512
1517 bool network_moved = DoTransportIO(); 1513 bool network_moved = DoTransportIO();
1518 if (network_moved && next_handshake_state_ == STATE_HANDSHAKE) { 1514 if (network_moved && next_handshake_state_ == STATE_HANDSHAKE) {
1519 // In general we exit the loop if rv is ERR_IO_PENDING. In this 1515 // In general we exit the loop if rv is ERR_IO_PENDING. In this
1520 // special case we keep looping even if rv is ERR_IO_PENDING because 1516 // special case we keep looping even if rv is ERR_IO_PENDING because
1521 // the transport IO may allow DoHandshake to make progress. 1517 // the transport IO may allow DoHandshake to make progress.
1522 rv = OK; // This causes us to stay in the loop. 1518 rv = OK; // This causes us to stay in the loop.
1523 } 1519 }
1524 } while (rv != ERR_IO_PENDING && next_handshake_state_ != STATE_NONE); 1520 } while (rv != ERR_IO_PENDING && next_handshake_state_ != STATE_NONE);
1525 return rv; 1521 return rv;
1526 } 1522 }
1527 1523
1528 int SSLClientSocketOpenSSL::DoReadLoop() { 1524 int SSLClientSocketImpl::DoReadLoop() {
1529 bool network_moved; 1525 bool network_moved;
1530 int rv; 1526 int rv;
1531 do { 1527 do {
1532 rv = DoPayloadRead(); 1528 rv = DoPayloadRead();
1533 network_moved = DoTransportIO(); 1529 network_moved = DoTransportIO();
1534 } while (rv == ERR_IO_PENDING && network_moved); 1530 } while (rv == ERR_IO_PENDING && network_moved);
1535 1531
1536 return rv; 1532 return rv;
1537 } 1533 }
1538 1534
1539 int SSLClientSocketOpenSSL::DoWriteLoop() { 1535 int SSLClientSocketImpl::DoWriteLoop() {
1540 bool network_moved; 1536 bool network_moved;
1541 int rv; 1537 int rv;
1542 do { 1538 do {
1543 rv = DoPayloadWrite(); 1539 rv = DoPayloadWrite();
1544 network_moved = DoTransportIO(); 1540 network_moved = DoTransportIO();
1545 } while (rv == ERR_IO_PENDING && network_moved); 1541 } while (rv == ERR_IO_PENDING && network_moved);
1546 1542
1547 return rv; 1543 return rv;
1548 } 1544 }
1549 1545
1550 int SSLClientSocketOpenSSL::DoPayloadRead() { 1546 int SSLClientSocketImpl::DoPayloadRead() {
1551 crypto::OpenSSLErrStackTracer err_tracer(FROM_HERE); 1547 crypto::OpenSSLErrStackTracer err_tracer(FROM_HERE);
1552 1548
1553 DCHECK_LT(0, user_read_buf_len_); 1549 DCHECK_LT(0, user_read_buf_len_);
1554 DCHECK(user_read_buf_.get()); 1550 DCHECK(user_read_buf_.get());
1555 1551
1556 int rv; 1552 int rv;
1557 if (pending_read_error_ != kNoPendingResult) { 1553 if (pending_read_error_ != kNoPendingResult) {
1558 rv = pending_read_error_; 1554 rv = pending_read_error_;
1559 pending_read_error_ = kNoPendingResult; 1555 pending_read_error_ = kNoPendingResult;
1560 if (rv == 0) { 1556 if (rv == 0) {
1561 net_log_.AddByteTransferEvent(NetLog::TYPE_SSL_SOCKET_BYTES_RECEIVED, 1557 net_log_.AddByteTransferEvent(NetLog::TYPE_SSL_SOCKET_BYTES_RECEIVED, rv,
1562 rv, user_read_buf_->data()); 1558 user_read_buf_->data());
1563 } else { 1559 } else {
1564 net_log_.AddEvent( 1560 net_log_.AddEvent(
1565 NetLog::TYPE_SSL_READ_ERROR, 1561 NetLog::TYPE_SSL_READ_ERROR,
1566 CreateNetLogOpenSSLErrorCallback(rv, pending_read_ssl_error_, 1562 CreateNetLogOpenSSLErrorCallback(rv, pending_read_ssl_error_,
1567 pending_read_error_info_)); 1563 pending_read_error_info_));
1568 } 1564 }
1569 pending_read_ssl_error_ = SSL_ERROR_NONE; 1565 pending_read_ssl_error_ = SSL_ERROR_NONE;
1570 pending_read_error_info_ = OpenSSLErrorInfo(); 1566 pending_read_error_info_ = OpenSSLErrorInfo();
1571 return rv; 1567 return rv;
1572 } 1568 }
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
1642 net_log_.AddEvent( 1638 net_log_.AddEvent(
1643 NetLog::TYPE_SSL_READ_ERROR, 1639 NetLog::TYPE_SSL_READ_ERROR,
1644 CreateNetLogOpenSSLErrorCallback(rv, pending_read_ssl_error_, 1640 CreateNetLogOpenSSLErrorCallback(rv, pending_read_ssl_error_,
1645 pending_read_error_info_)); 1641 pending_read_error_info_));
1646 pending_read_ssl_error_ = SSL_ERROR_NONE; 1642 pending_read_ssl_error_ = SSL_ERROR_NONE;
1647 pending_read_error_info_ = OpenSSLErrorInfo(); 1643 pending_read_error_info_ = OpenSSLErrorInfo();
1648 } 1644 }
1649 return rv; 1645 return rv;
1650 } 1646 }
1651 1647
1652 int SSLClientSocketOpenSSL::DoPayloadWrite() { 1648 int SSLClientSocketImpl::DoPayloadWrite() {
1653 crypto::OpenSSLErrStackTracer err_tracer(FROM_HERE); 1649 crypto::OpenSSLErrStackTracer err_tracer(FROM_HERE);
1654 int rv = SSL_write(ssl_, user_write_buf_->data(), user_write_buf_len_); 1650 int rv = SSL_write(ssl_, user_write_buf_->data(), user_write_buf_len_);
1655 1651
1656 if (rv >= 0) { 1652 if (rv >= 0) {
1657 net_log_.AddByteTransferEvent(NetLog::TYPE_SSL_SOCKET_BYTES_SENT, rv, 1653 net_log_.AddByteTransferEvent(NetLog::TYPE_SSL_SOCKET_BYTES_SENT, rv,
1658 user_write_buf_->data()); 1654 user_write_buf_->data());
1659 return rv; 1655 return rv;
1660 } 1656 }
1661 1657
1662 int ssl_error = SSL_get_error(ssl_, rv); 1658 int ssl_error = SSL_get_error(ssl_, rv);
1663 if (ssl_error == SSL_ERROR_WANT_PRIVATE_KEY_OPERATION) 1659 if (ssl_error == SSL_ERROR_WANT_PRIVATE_KEY_OPERATION)
1664 return ERR_IO_PENDING; 1660 return ERR_IO_PENDING;
1665 OpenSSLErrorInfo error_info; 1661 OpenSSLErrorInfo error_info;
1666 int net_error = MapOpenSSLErrorWithDetails(ssl_error, err_tracer, 1662 int net_error =
1667 &error_info); 1663 MapOpenSSLErrorWithDetails(ssl_error, err_tracer, &error_info);
1668 1664
1669 if (net_error != ERR_IO_PENDING) { 1665 if (net_error != ERR_IO_PENDING) {
1670 net_log_.AddEvent( 1666 net_log_.AddEvent(
1671 NetLog::TYPE_SSL_WRITE_ERROR, 1667 NetLog::TYPE_SSL_WRITE_ERROR,
1672 CreateNetLogOpenSSLErrorCallback(net_error, ssl_error, error_info)); 1668 CreateNetLogOpenSSLErrorCallback(net_error, ssl_error, error_info));
1673 } 1669 }
1674 return net_error; 1670 return net_error;
1675 } 1671 }
1676 1672
1677 void SSLClientSocketOpenSSL::PumpReadWriteEvents() { 1673 void SSLClientSocketImpl::PumpReadWriteEvents() {
1678 int rv_read = ERR_IO_PENDING; 1674 int rv_read = ERR_IO_PENDING;
1679 int rv_write = ERR_IO_PENDING; 1675 int rv_write = ERR_IO_PENDING;
1680 bool network_moved; 1676 bool network_moved;
1681 do { 1677 do {
1682 if (user_read_buf_.get()) 1678 if (user_read_buf_.get())
1683 rv_read = DoPayloadRead(); 1679 rv_read = DoPayloadRead();
1684 if (user_write_buf_.get()) 1680 if (user_write_buf_.get())
1685 rv_write = DoPayloadWrite(); 1681 rv_write = DoPayloadWrite();
1686 network_moved = DoTransportIO(); 1682 network_moved = DoTransportIO();
1687 } while (rv_read == ERR_IO_PENDING && rv_write == ERR_IO_PENDING && 1683 } while (rv_read == ERR_IO_PENDING && rv_write == ERR_IO_PENDING &&
1688 (user_read_buf_.get() || user_write_buf_.get()) && network_moved); 1684 (user_read_buf_.get() || user_write_buf_.get()) && network_moved);
1689 1685
1690 // Performing the Read callback may cause |this| to be deleted. If this 1686 // Performing the Read callback may cause |this| to be deleted. If this
1691 // happens, the Write callback should not be invoked. Guard against this by 1687 // happens, the Write callback should not be invoked. Guard against this by
1692 // holding a WeakPtr to |this| and ensuring it's still valid. 1688 // holding a WeakPtr to |this| and ensuring it's still valid.
1693 base::WeakPtr<SSLClientSocketOpenSSL> guard(weak_factory_.GetWeakPtr()); 1689 base::WeakPtr<SSLClientSocketImpl> guard(weak_factory_.GetWeakPtr());
1694 if (user_read_buf_.get() && rv_read != ERR_IO_PENDING) 1690 if (user_read_buf_.get() && rv_read != ERR_IO_PENDING)
1695 DoReadCallback(rv_read); 1691 DoReadCallback(rv_read);
1696 1692
1697 if (!guard.get()) 1693 if (!guard.get())
1698 return; 1694 return;
1699 1695
1700 if (user_write_buf_.get() && rv_write != ERR_IO_PENDING) 1696 if (user_write_buf_.get() && rv_write != ERR_IO_PENDING)
1701 DoWriteCallback(rv_write); 1697 DoWriteCallback(rv_write);
1702 } 1698 }
1703 1699
1704 int SSLClientSocketOpenSSL::BufferSend(void) { 1700 int SSLClientSocketImpl::BufferSend(void) {
1705 if (transport_send_busy_) 1701 if (transport_send_busy_)
1706 return ERR_IO_PENDING; 1702 return ERR_IO_PENDING;
1707 1703
1708 size_t buffer_read_offset; 1704 size_t buffer_read_offset;
1709 uint8_t* read_buf; 1705 uint8_t* read_buf;
1710 size_t max_read; 1706 size_t max_read;
1711 int status = BIO_zero_copy_get_read_buf(transport_bio_, &read_buf, 1707 int status = BIO_zero_copy_get_read_buf(transport_bio_, &read_buf,
1712 &buffer_read_offset, &max_read); 1708 &buffer_read_offset, &max_read);
1713 DCHECK_EQ(status, 1); // Should never fail. 1709 DCHECK_EQ(status, 1); // Should never fail.
1714 if (!max_read) 1710 if (!max_read)
1715 return 0; // Nothing pending in the OpenSSL write BIO. 1711 return 0; // Nothing pending in the OpenSSL write BIO.
1716 CHECK_EQ(read_buf, reinterpret_cast<uint8_t*>(send_buffer_->StartOfBuffer())); 1712 CHECK_EQ(read_buf, reinterpret_cast<uint8_t*>(send_buffer_->StartOfBuffer()));
1717 CHECK_LT(buffer_read_offset, static_cast<size_t>(send_buffer_->capacity())); 1713 CHECK_LT(buffer_read_offset, static_cast<size_t>(send_buffer_->capacity()));
1718 send_buffer_->set_offset(buffer_read_offset); 1714 send_buffer_->set_offset(buffer_read_offset);
1719 1715
1720 int rv = transport_->socket()->Write( 1716 int rv = transport_->socket()->Write(
1721 send_buffer_.get(), max_read, 1717 send_buffer_.get(), max_read,
1722 base::Bind(&SSLClientSocketOpenSSL::BufferSendComplete, 1718 base::Bind(&SSLClientSocketImpl::BufferSendComplete,
1723 base::Unretained(this))); 1719 base::Unretained(this)));
1724 if (rv == ERR_IO_PENDING) { 1720 if (rv == ERR_IO_PENDING) {
1725 transport_send_busy_ = true; 1721 transport_send_busy_ = true;
1726 } else { 1722 } else {
1727 TransportWriteComplete(rv); 1723 TransportWriteComplete(rv);
1728 } 1724 }
1729 return rv; 1725 return rv;
1730 } 1726 }
1731 1727
1732 int SSLClientSocketOpenSSL::BufferRecv(void) { 1728 int SSLClientSocketImpl::BufferRecv(void) {
1733 if (transport_recv_busy_) 1729 if (transport_recv_busy_)
1734 return ERR_IO_PENDING; 1730 return ERR_IO_PENDING;
1735 1731
1736 // Determine how much was requested from |transport_bio_| that was not 1732 // Determine how much was requested from |transport_bio_| that was not
1737 // actually available. 1733 // actually available.
1738 size_t requested = BIO_ctrl_get_read_request(transport_bio_); 1734 size_t requested = BIO_ctrl_get_read_request(transport_bio_);
1739 if (requested == 0) { 1735 if (requested == 0) {
1740 // This is not a perfect match of error codes, as no operation is 1736 // This is not a perfect match of error codes, as no operation is
1741 // actually pending. However, returning 0 would be interpreted as 1737 // actually pending. However, returning 0 would be interpreted as
1742 // a possible sign of EOF, which is also an inappropriate match. 1738 // a possible sign of EOF, which is also an inappropriate match.
(...skipping 17 matching lines...) Expand all
1760 DCHECK_EQ(status, 1); // Should never fail. 1756 DCHECK_EQ(status, 1); // Should never fail.
1761 if (!max_write) 1757 if (!max_write)
1762 return ERR_IO_PENDING; 1758 return ERR_IO_PENDING;
1763 1759
1764 CHECK_EQ(write_buf, 1760 CHECK_EQ(write_buf,
1765 reinterpret_cast<uint8_t*>(recv_buffer_->StartOfBuffer())); 1761 reinterpret_cast<uint8_t*>(recv_buffer_->StartOfBuffer()));
1766 CHECK_LT(buffer_write_offset, static_cast<size_t>(recv_buffer_->capacity())); 1762 CHECK_LT(buffer_write_offset, static_cast<size_t>(recv_buffer_->capacity()));
1767 1763
1768 recv_buffer_->set_offset(buffer_write_offset); 1764 recv_buffer_->set_offset(buffer_write_offset);
1769 int rv = transport_->socket()->Read( 1765 int rv = transport_->socket()->Read(
1770 recv_buffer_.get(), 1766 recv_buffer_.get(), max_write,
1771 max_write, 1767 base::Bind(&SSLClientSocketImpl::BufferRecvComplete,
1772 base::Bind(&SSLClientSocketOpenSSL::BufferRecvComplete,
1773 base::Unretained(this))); 1768 base::Unretained(this)));
1774 if (rv == ERR_IO_PENDING) { 1769 if (rv == ERR_IO_PENDING) {
1775 transport_recv_busy_ = true; 1770 transport_recv_busy_ = true;
1776 } else { 1771 } else {
1777 rv = TransportReadComplete(rv); 1772 rv = TransportReadComplete(rv);
1778 } 1773 }
1779 return rv; 1774 return rv;
1780 } 1775 }
1781 1776
1782 void SSLClientSocketOpenSSL::BufferSendComplete(int result) { 1777 void SSLClientSocketImpl::BufferSendComplete(int result) {
1783 TransportWriteComplete(result); 1778 TransportWriteComplete(result);
1784 OnSendComplete(result); 1779 OnSendComplete(result);
1785 } 1780 }
1786 1781
1787 void SSLClientSocketOpenSSL::BufferRecvComplete(int result) { 1782 void SSLClientSocketImpl::BufferRecvComplete(int result) {
1788 result = TransportReadComplete(result); 1783 result = TransportReadComplete(result);
1789 OnRecvComplete(result); 1784 OnRecvComplete(result);
1790 } 1785 }
1791 1786
1792 void SSLClientSocketOpenSSL::TransportWriteComplete(int result) { 1787 void SSLClientSocketImpl::TransportWriteComplete(int result) {
1793 DCHECK(ERR_IO_PENDING != result); 1788 DCHECK(ERR_IO_PENDING != result);
1794 int bytes_written = 0; 1789 int bytes_written = 0;
1795 if (result < 0) { 1790 if (result < 0) {
1796 // Record the error. Save it to be reported in a future read or write on 1791 // Record the error. Save it to be reported in a future read or write on
1797 // transport_bio_'s peer. 1792 // transport_bio_'s peer.
1798 transport_write_error_ = result; 1793 transport_write_error_ = result;
1799 } else { 1794 } else {
1800 bytes_written = result; 1795 bytes_written = result;
1801 } 1796 }
1802 DCHECK_GE(send_buffer_->RemainingCapacity(), bytes_written); 1797 DCHECK_GE(send_buffer_->RemainingCapacity(), bytes_written);
1803 int ret = BIO_zero_copy_get_read_buf_done(transport_bio_, bytes_written); 1798 int ret = BIO_zero_copy_get_read_buf_done(transport_bio_, bytes_written);
1804 DCHECK_EQ(1, ret); 1799 DCHECK_EQ(1, ret);
1805 transport_send_busy_ = false; 1800 transport_send_busy_ = false;
1806 } 1801 }
1807 1802
1808 int SSLClientSocketOpenSSL::TransportReadComplete(int result) { 1803 int SSLClientSocketImpl::TransportReadComplete(int result) {
1809 DCHECK(ERR_IO_PENDING != result); 1804 DCHECK(ERR_IO_PENDING != result);
1810 // If an EOF, canonicalize to ERR_CONNECTION_CLOSED here so MapOpenSSLError 1805 // If an EOF, canonicalize to ERR_CONNECTION_CLOSED here so MapOpenSSLError
1811 // does not report success. 1806 // does not report success.
1812 if (result == 0) 1807 if (result == 0)
1813 result = ERR_CONNECTION_CLOSED; 1808 result = ERR_CONNECTION_CLOSED;
1814 int bytes_read = 0; 1809 int bytes_read = 0;
1815 if (result < 0) { 1810 if (result < 0) {
1816 DVLOG(1) << "TransportReadComplete result " << result; 1811 DVLOG(1) << "TransportReadComplete result " << result;
1817 // Received an error. Save it to be reported in a future read on 1812 // Received an error. Save it to be reported in a future read on
1818 // transport_bio_'s peer. 1813 // transport_bio_'s peer.
1819 transport_read_error_ = result; 1814 transport_read_error_ = result;
1820 } else { 1815 } else {
1821 bytes_read = result; 1816 bytes_read = result;
1822 } 1817 }
1823 DCHECK_GE(recv_buffer_->RemainingCapacity(), bytes_read); 1818 DCHECK_GE(recv_buffer_->RemainingCapacity(), bytes_read);
1824 int ret = BIO_zero_copy_get_write_buf_done(transport_bio_, bytes_read); 1819 int ret = BIO_zero_copy_get_write_buf_done(transport_bio_, bytes_read);
1825 DCHECK_EQ(1, ret); 1820 DCHECK_EQ(1, ret);
1826 transport_recv_busy_ = false; 1821 transport_recv_busy_ = false;
1827 return result; 1822 return result;
1828 } 1823 }
1829 1824
1830 int SSLClientSocketOpenSSL::ClientCertRequestCallback(SSL* ssl) { 1825 int SSLClientSocketImpl::ClientCertRequestCallback(SSL* ssl) {
1831 DVLOG(3) << "OpenSSL ClientCertRequestCallback called"; 1826 DVLOG(3) << "OpenSSL ClientCertRequestCallback called";
1832 DCHECK(ssl == ssl_); 1827 DCHECK(ssl == ssl_);
1833 1828
1834 net_log_.AddEvent(NetLog::TYPE_SSL_CLIENT_CERT_REQUESTED); 1829 net_log_.AddEvent(NetLog::TYPE_SSL_CLIENT_CERT_REQUESTED);
1835 1830
1836 // Clear any currently configured certificates. 1831 // Clear any currently configured certificates.
1837 SSL_certs_clear(ssl_); 1832 SSL_certs_clear(ssl_);
1838 1833
1839 #if defined(OS_IOS) 1834 #if defined(OS_IOS)
1840 // TODO(droger): Support client auth on iOS. See http://crbug.com/145954). 1835 // TODO(droger): Support client auth on iOS. See http://crbug.com/145954).
1841 LOG(WARNING) << "Client auth is not supported"; 1836 LOG(WARNING) << "Client auth is not supported";
1842 #else // !defined(OS_IOS) 1837 #else // !defined(OS_IOS)
1843 if (!ssl_config_.send_client_cert) { 1838 if (!ssl_config_.send_client_cert) {
1844 // First pass: we know that a client certificate is needed, but we do not 1839 // First pass: we know that a client certificate is needed, but we do not
1845 // have one at hand. 1840 // have one at hand.
1846 STACK_OF(X509_NAME) *authorities = SSL_get_client_CA_list(ssl); 1841 STACK_OF(X509_NAME)* authorities = SSL_get_client_CA_list(ssl);
1847 for (size_t i = 0; i < sk_X509_NAME_num(authorities); i++) { 1842 for (size_t i = 0; i < sk_X509_NAME_num(authorities); i++) {
1848 X509_NAME *ca_name = (X509_NAME *)sk_X509_NAME_value(authorities, i); 1843 X509_NAME* ca_name = (X509_NAME*)sk_X509_NAME_value(authorities, i);
1849 unsigned char* str = NULL; 1844 unsigned char* str = NULL;
1850 int length = i2d_X509_NAME(ca_name, &str); 1845 int length = i2d_X509_NAME(ca_name, &str);
1851 cert_authorities_.push_back(std::string( 1846 cert_authorities_.push_back(std::string(
1852 reinterpret_cast<const char*>(str), 1847 reinterpret_cast<const char*>(str), static_cast<size_t>(length)));
1853 static_cast<size_t>(length)));
1854 OPENSSL_free(str); 1848 OPENSSL_free(str);
1855 } 1849 }
1856 1850
1857 const unsigned char* client_cert_types; 1851 const unsigned char* client_cert_types;
1858 size_t num_client_cert_types = 1852 size_t num_client_cert_types =
1859 SSL_get0_certificate_types(ssl, &client_cert_types); 1853 SSL_get0_certificate_types(ssl, &client_cert_types);
1860 for (size_t i = 0; i < num_client_cert_types; i++) { 1854 for (size_t i = 0; i < num_client_cert_types; i++) {
1861 cert_key_types_.push_back( 1855 cert_key_types_.push_back(
1862 static_cast<SSLClientCertType>(client_cert_types[i])); 1856 static_cast<SSLClientCertType>(client_cert_types[i]));
1863 } 1857 }
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
1933 return 1; 1927 return 1;
1934 } 1928 }
1935 #endif // defined(OS_IOS) 1929 #endif // defined(OS_IOS)
1936 1930
1937 // Send no client certificate. 1931 // Send no client certificate.
1938 net_log_.AddEvent(NetLog::TYPE_SSL_CLIENT_CERT_PROVIDED, 1932 net_log_.AddEvent(NetLog::TYPE_SSL_CLIENT_CERT_PROVIDED,
1939 NetLog::IntCallback("cert_count", 0)); 1933 NetLog::IntCallback("cert_count", 0));
1940 return 1; 1934 return 1;
1941 } 1935 }
1942 1936
1943 int SSLClientSocketOpenSSL::CertVerifyCallback(X509_STORE_CTX* store_ctx) { 1937 int SSLClientSocketImpl::CertVerifyCallback(X509_STORE_CTX* store_ctx) {
1944 if (!completed_connect_) { 1938 if (!completed_connect_) {
1945 // If the first handshake hasn't completed then we accept any certificates 1939 // If the first handshake hasn't completed then we accept any certificates
1946 // because we verify after the handshake. 1940 // because we verify after the handshake.
1947 return 1; 1941 return 1;
1948 } 1942 }
1949 1943
1950 // Disallow the server certificate to change in a renegotiation. 1944 // Disallow the server certificate to change in a renegotiation.
1951 if (server_cert_chain_->empty()) { 1945 if (server_cert_chain_->empty()) {
1952 LOG(ERROR) << "Received invalid certificate chain between handshakes"; 1946 LOG(ERROR) << "Received invalid certificate chain between handshakes";
1953 return 0; 1947 return 0;
(...skipping 10 matching lines...) Expand all
1964 return 0; 1958 return 0;
1965 } 1959 }
1966 1960
1967 return 1; 1961 return 1;
1968 } 1962 }
1969 1963
1970 // SelectNextProtoCallback is called by OpenSSL during the handshake. If the 1964 // SelectNextProtoCallback is called by OpenSSL during the handshake. If the
1971 // server supports NPN, selects a protocol from the list that the server 1965 // server supports NPN, selects a protocol from the list that the server
1972 // provides. According to third_party/boringssl/src/ssl/ssl_lib.c, the 1966 // provides. According to third_party/boringssl/src/ssl/ssl_lib.c, the
1973 // callback can assume that |in| is syntactically valid. 1967 // callback can assume that |in| is syntactically valid.
1974 int SSLClientSocketOpenSSL::SelectNextProtoCallback(unsigned char** out, 1968 int SSLClientSocketImpl::SelectNextProtoCallback(unsigned char** out,
1975 unsigned char* outlen, 1969 unsigned char* outlen,
1976 const unsigned char* in, 1970 const unsigned char* in,
1977 unsigned int inlen) { 1971 unsigned int inlen) {
1978 if (ssl_config_.npn_protos.empty()) { 1972 if (ssl_config_.npn_protos.empty()) {
1979 *out = reinterpret_cast<uint8_t*>( 1973 *out = reinterpret_cast<uint8_t*>(
1980 const_cast<char*>(kDefaultSupportedNPNProtocol)); 1974 const_cast<char*>(kDefaultSupportedNPNProtocol));
1981 *outlen = arraysize(kDefaultSupportedNPNProtocol) - 1; 1975 *outlen = arraysize(kDefaultSupportedNPNProtocol) - 1;
1982 npn_status_ = kNextProtoUnsupported; 1976 npn_status_ = kNextProtoUnsupported;
1983 return SSL_TLSEXT_ERR_OK; 1977 return SSL_TLSEXT_ERR_OK;
1984 } 1978 }
1985 1979
1986 // Assume there's no overlap between our protocols and the server's list. 1980 // Assume there's no overlap between our protocols and the server's list.
1987 npn_status_ = kNextProtoNoOverlap; 1981 npn_status_ = kNextProtoNoOverlap;
(...skipping 22 matching lines...) Expand all
2010 *out = reinterpret_cast<unsigned char*>(const_cast<char*>(proto)); 2004 *out = reinterpret_cast<unsigned char*>(const_cast<char*>(proto));
2011 *outlen = strlen(proto); 2005 *outlen = strlen(proto);
2012 } 2006 }
2013 2007
2014 npn_proto_.assign(reinterpret_cast<const char*>(*out), *outlen); 2008 npn_proto_.assign(reinterpret_cast<const char*>(*out), *outlen);
2015 DVLOG(2) << "next protocol: '" << npn_proto_ << "' status: " << npn_status_; 2009 DVLOG(2) << "next protocol: '" << npn_proto_ << "' status: " << npn_status_;
2016 set_negotiation_extension(kExtensionNPN); 2010 set_negotiation_extension(kExtensionNPN);
2017 return SSL_TLSEXT_ERR_OK; 2011 return SSL_TLSEXT_ERR_OK;
2018 } 2012 }
2019 2013
2020 long SSLClientSocketOpenSSL::MaybeReplayTransportError( 2014 long SSLClientSocketImpl::MaybeReplayTransportError(BIO* bio,
2021 BIO *bio, 2015 int cmd,
2022 int cmd, 2016 const char* argp,
2023 const char *argp, int argi, long argl, 2017 int argi,
2024 long retvalue) { 2018 long argl,
2025 if (cmd == (BIO_CB_READ|BIO_CB_RETURN) && retvalue <= 0) { 2019 long retvalue) {
2020 if (cmd == (BIO_CB_READ | BIO_CB_RETURN) && retvalue <= 0) {
2026 // If there is no more data in the buffer, report any pending errors that 2021 // If there is no more data in the buffer, report any pending errors that
2027 // were observed. Note that both the readbuf and the writebuf are checked 2022 // were observed. Note that both the readbuf and the writebuf are checked
2028 // for errors, since the application may have encountered a socket error 2023 // for errors, since the application may have encountered a socket error
2029 // while writing that would otherwise not be reported until the application 2024 // while writing that would otherwise not be reported until the application
2030 // attempted to write again - which it may never do. See 2025 // attempted to write again - which it may never do. See
2031 // https://crbug.com/249848. 2026 // https://crbug.com/249848.
2032 if (transport_read_error_ != OK) { 2027 if (transport_read_error_ != OK) {
2033 OpenSSLPutNetError(FROM_HERE, transport_read_error_); 2028 OpenSSLPutNetError(FROM_HERE, transport_read_error_);
2034 return -1; 2029 return -1;
2035 } 2030 }
2036 if (transport_write_error_ != OK) { 2031 if (transport_write_error_ != OK) {
2037 OpenSSLPutNetError(FROM_HERE, transport_write_error_); 2032 OpenSSLPutNetError(FROM_HERE, transport_write_error_);
2038 return -1; 2033 return -1;
2039 } 2034 }
2040 } else if (cmd == BIO_CB_WRITE) { 2035 } else if (cmd == BIO_CB_WRITE) {
2041 // Because of the write buffer, this reports a failure from the previous 2036 // Because of the write buffer, this reports a failure from the previous
2042 // write payload. If the current payload fails to write, the error will be 2037 // write payload. If the current payload fails to write, the error will be
2043 // reported in a future write or read to |bio|. 2038 // reported in a future write or read to |bio|.
2044 if (transport_write_error_ != OK) { 2039 if (transport_write_error_ != OK) {
2045 OpenSSLPutNetError(FROM_HERE, transport_write_error_); 2040 OpenSSLPutNetError(FROM_HERE, transport_write_error_);
2046 return -1; 2041 return -1;
2047 } 2042 }
2048 } 2043 }
2049 return retvalue; 2044 return retvalue;
2050 } 2045 }
2051 2046
2052 // static 2047 // static
2053 long SSLClientSocketOpenSSL::BIOCallback( 2048 long SSLClientSocketImpl::BIOCallback(BIO* bio,
2054 BIO *bio, 2049 int cmd,
2055 int cmd, 2050 const char* argp,
2056 const char *argp, int argi, long argl, 2051 int argi,
2057 long retvalue) { 2052 long argl,
2058 SSLClientSocketOpenSSL* socket = reinterpret_cast<SSLClientSocketOpenSSL*>( 2053 long retvalue) {
2059 BIO_get_callback_arg(bio)); 2054 SSLClientSocketImpl* socket =
2055 reinterpret_cast<SSLClientSocketImpl*>(BIO_get_callback_arg(bio));
2060 CHECK(socket); 2056 CHECK(socket);
2061 return socket->MaybeReplayTransportError( 2057 return socket->MaybeReplayTransportError(bio, cmd, argp, argi, argl,
2062 bio, cmd, argp, argi, argl, retvalue); 2058 retvalue);
2063 } 2059 }
2064 2060
2065 void SSLClientSocketOpenSSL::MaybeCacheSession() { 2061 void SSLClientSocketImpl::MaybeCacheSession() {
2066 // Only cache the session once both a new session has been established and the 2062 // Only cache the session once both a new session has been established and the
2067 // certificate has been verified. Due to False Start, these events may happen 2063 // certificate has been verified. Due to False Start, these events may happen
2068 // in either order. 2064 // in either order.
2069 if (!session_pending_ || !certificate_verified_) 2065 if (!session_pending_ || !certificate_verified_)
2070 return; 2066 return;
2071 2067
2072 SSLContext::GetInstance()->session_cache()->Insert(GetSessionCacheKey(), 2068 SSLContext::GetInstance()->session_cache()->Insert(GetSessionCacheKey(),
2073 SSL_get_session(ssl_)); 2069 SSL_get_session(ssl_));
2074 session_pending_ = false; 2070 session_pending_ = false;
2075 } 2071 }
2076 2072
2077 int SSLClientSocketOpenSSL::NewSessionCallback(SSL_SESSION* session) { 2073 int SSLClientSocketImpl::NewSessionCallback(SSL_SESSION* session) {
2078 DCHECK_EQ(session, SSL_get_session(ssl_)); 2074 DCHECK_EQ(session, SSL_get_session(ssl_));
2079 2075
2080 // Only sessions from the initial handshake get cached. Note this callback may 2076 // Only sessions from the initial handshake get cached. Note this callback may
2081 // be signaled on abbreviated handshakes if the ticket was renewed. 2077 // be signaled on abbreviated handshakes if the ticket was renewed.
2082 session_pending_ = true; 2078 session_pending_ = true;
2083 MaybeCacheSession(); 2079 MaybeCacheSession();
2084 2080
2085 // OpenSSL passes a reference to |session|, but the session cache does not 2081 // OpenSSL passes a reference to |session|, but the session cache does not
2086 // take this reference, so release it. 2082 // take this reference, so release it.
2087 SSL_SESSION_free(session); 2083 SSL_SESSION_free(session);
2088 return 1; 2084 return 1;
2089 } 2085 }
2090 2086
2091 void SSLClientSocketOpenSSL::AddCTInfoToSSLInfo(SSLInfo* ssl_info) const { 2087 void SSLClientSocketImpl::AddCTInfoToSSLInfo(SSLInfo* ssl_info) const {
2092 ssl_info->UpdateCertificateTransparencyInfo(ct_verify_result_); 2088 ssl_info->UpdateCertificateTransparencyInfo(ct_verify_result_);
2093 } 2089 }
2094 2090
2095 std::string SSLClientSocketOpenSSL::GetSessionCacheKey() const { 2091 std::string SSLClientSocketImpl::GetSessionCacheKey() const {
2096 std::string result = host_and_port_.ToString(); 2092 std::string result = host_and_port_.ToString();
2097 result.append("/"); 2093 result.append("/");
2098 result.append(ssl_session_cache_shard_); 2094 result.append(ssl_session_cache_shard_);
2099 2095
2100 // Shard the session cache based on maximum protocol version. This causes 2096 // Shard the session cache based on maximum protocol version. This causes
2101 // fallback connections to use a separate session cache. 2097 // fallback connections to use a separate session cache.
2102 result.append("/"); 2098 result.append("/");
2103 switch (ssl_config_.version_max) { 2099 switch (ssl_config_.version_max) {
2104 case SSL_PROTOCOL_VERSION_TLS1: 2100 case SSL_PROTOCOL_VERSION_TLS1:
2105 result.append("tls1"); 2101 result.append("tls1");
(...skipping 12 matching lines...) Expand all
2118 if (ssl_config_.deprecated_cipher_suites_enabled) 2114 if (ssl_config_.deprecated_cipher_suites_enabled)
2119 result.append("deprecated"); 2115 result.append("deprecated");
2120 2116
2121 result.append("/"); 2117 result.append("/");
2122 if (ssl_config_.channel_id_enabled) 2118 if (ssl_config_.channel_id_enabled)
2123 result.append("channelid"); 2119 result.append("channelid");
2124 2120
2125 return result; 2121 return result;
2126 } 2122 }
2127 2123
2128 bool SSLClientSocketOpenSSL::IsRenegotiationAllowed() const { 2124 bool SSLClientSocketImpl::IsRenegotiationAllowed() const {
2129 if (tb_was_negotiated_) 2125 if (tb_was_negotiated_)
2130 return false; 2126 return false;
2131 2127
2132 if (npn_status_ == kNextProtoUnsupported) 2128 if (npn_status_ == kNextProtoUnsupported)
2133 return ssl_config_.renego_allowed_default; 2129 return ssl_config_.renego_allowed_default;
2134 2130
2135 NextProto next_proto = NextProtoFromString(npn_proto_); 2131 NextProto next_proto = NextProtoFromString(npn_proto_);
2136 for (NextProto allowed : ssl_config_.renego_allowed_for_protos) { 2132 for (NextProto allowed : ssl_config_.renego_allowed_for_protos) {
2137 if (next_proto == allowed) 2133 if (next_proto == allowed)
2138 return true; 2134 return true;
2139 } 2135 }
2140 return false; 2136 return false;
2141 } 2137 }
2142 2138
2143 int SSLClientSocketOpenSSL::PrivateKeyTypeCallback() { 2139 int SSLClientSocketImpl::PrivateKeyTypeCallback() {
2144 switch (ssl_config_.client_private_key->GetType()) { 2140 switch (ssl_config_.client_private_key->GetType()) {
2145 case SSLPrivateKey::Type::RSA: 2141 case SSLPrivateKey::Type::RSA:
2146 return EVP_PKEY_RSA; 2142 return EVP_PKEY_RSA;
2147 case SSLPrivateKey::Type::ECDSA: 2143 case SSLPrivateKey::Type::ECDSA:
2148 return EVP_PKEY_EC; 2144 return EVP_PKEY_EC;
2149 } 2145 }
2150 NOTREACHED(); 2146 NOTREACHED();
2151 return EVP_PKEY_NONE; 2147 return EVP_PKEY_NONE;
2152 } 2148 }
2153 2149
2154 size_t SSLClientSocketOpenSSL::PrivateKeyMaxSignatureLenCallback() { 2150 size_t SSLClientSocketImpl::PrivateKeyMaxSignatureLenCallback() {
2155 return ssl_config_.client_private_key->GetMaxSignatureLengthInBytes(); 2151 return ssl_config_.client_private_key->GetMaxSignatureLengthInBytes();
2156 } 2152 }
2157 2153
2158 ssl_private_key_result_t SSLClientSocketOpenSSL::PrivateKeySignCallback( 2154 ssl_private_key_result_t SSLClientSocketImpl::PrivateKeySignCallback(
2159 uint8_t* out, 2155 uint8_t* out,
2160 size_t* out_len, 2156 size_t* out_len,
2161 size_t max_out, 2157 size_t max_out,
2162 const EVP_MD* md, 2158 const EVP_MD* md,
2163 const uint8_t* in, 2159 const uint8_t* in,
2164 size_t in_len) { 2160 size_t in_len) {
2165 DCHECK_EQ(kNoPendingResult, signature_result_); 2161 DCHECK_EQ(kNoPendingResult, signature_result_);
2166 DCHECK(signature_.empty()); 2162 DCHECK(signature_.empty());
2167 DCHECK(ssl_config_.client_private_key); 2163 DCHECK(ssl_config_.client_private_key);
2168 2164
2169 SSLPrivateKey::Hash hash; 2165 SSLPrivateKey::Hash hash;
2170 if (!EVP_MDToPrivateKeyHash(md, &hash)) { 2166 if (!EVP_MDToPrivateKeyHash(md, &hash)) {
2171 OpenSSLPutNetError(FROM_HERE, ERR_SSL_CLIENT_AUTH_SIGNATURE_FAILED); 2167 OpenSSLPutNetError(FROM_HERE, ERR_SSL_CLIENT_AUTH_SIGNATURE_FAILED);
2172 return ssl_private_key_failure; 2168 return ssl_private_key_failure;
2173 } 2169 }
2174 2170
2175 net_log_.BeginEvent( 2171 net_log_.BeginEvent(
2176 NetLog::TYPE_SSL_PRIVATE_KEY_OPERATION, 2172 NetLog::TYPE_SSL_PRIVATE_KEY_OPERATION,
2177 base::Bind(&NetLogPrivateKeyOperationCallback, 2173 base::Bind(&NetLogPrivateKeyOperationCallback,
2178 ssl_config_.client_private_key->GetType(), hash)); 2174 ssl_config_.client_private_key->GetType(), hash));
2179 2175
2180 signature_result_ = ERR_IO_PENDING; 2176 signature_result_ = ERR_IO_PENDING;
2181 ssl_config_.client_private_key->SignDigest( 2177 ssl_config_.client_private_key->SignDigest(
2182 hash, base::StringPiece(reinterpret_cast<const char*>(in), in_len), 2178 hash, base::StringPiece(reinterpret_cast<const char*>(in), in_len),
2183 base::Bind(&SSLClientSocketOpenSSL::OnPrivateKeySignComplete, 2179 base::Bind(&SSLClientSocketImpl::OnPrivateKeySignComplete,
2184 weak_factory_.GetWeakPtr())); 2180 weak_factory_.GetWeakPtr()));
2185 return ssl_private_key_retry; 2181 return ssl_private_key_retry;
2186 } 2182 }
2187 2183
2188 ssl_private_key_result_t SSLClientSocketOpenSSL::PrivateKeySignCompleteCallback( 2184 ssl_private_key_result_t SSLClientSocketImpl::PrivateKeySignCompleteCallback(
2189 uint8_t* out, 2185 uint8_t* out,
2190 size_t* out_len, 2186 size_t* out_len,
2191 size_t max_out) { 2187 size_t max_out) {
2192 DCHECK_NE(kNoPendingResult, signature_result_); 2188 DCHECK_NE(kNoPendingResult, signature_result_);
2193 DCHECK(ssl_config_.client_private_key); 2189 DCHECK(ssl_config_.client_private_key);
2194 2190
2195 if (signature_result_ == ERR_IO_PENDING) 2191 if (signature_result_ == ERR_IO_PENDING)
2196 return ssl_private_key_retry; 2192 return ssl_private_key_retry;
2197 if (signature_result_ != OK) { 2193 if (signature_result_ != OK) {
2198 OpenSSLPutNetError(FROM_HERE, signature_result_); 2194 OpenSSLPutNetError(FROM_HERE, signature_result_);
2199 return ssl_private_key_failure; 2195 return ssl_private_key_failure;
2200 } 2196 }
2201 if (signature_.size() > max_out) { 2197 if (signature_.size() > max_out) {
2202 OpenSSLPutNetError(FROM_HERE, ERR_SSL_CLIENT_AUTH_SIGNATURE_FAILED); 2198 OpenSSLPutNetError(FROM_HERE, ERR_SSL_CLIENT_AUTH_SIGNATURE_FAILED);
2203 return ssl_private_key_failure; 2199 return ssl_private_key_failure;
2204 } 2200 }
2205 memcpy(out, signature_.data(), signature_.size()); 2201 memcpy(out, signature_.data(), signature_.size());
2206 *out_len = signature_.size(); 2202 *out_len = signature_.size();
2207 signature_.clear(); 2203 signature_.clear();
2208 return ssl_private_key_success; 2204 return ssl_private_key_success;
2209 } 2205 }
2210 2206
2211 void SSLClientSocketOpenSSL::OnPrivateKeySignComplete( 2207 void SSLClientSocketImpl::OnPrivateKeySignComplete(
2212 Error error, 2208 Error error,
2213 const std::vector<uint8_t>& signature) { 2209 const std::vector<uint8_t>& signature) {
2214 DCHECK_EQ(ERR_IO_PENDING, signature_result_); 2210 DCHECK_EQ(ERR_IO_PENDING, signature_result_);
2215 DCHECK(signature_.empty()); 2211 DCHECK(signature_.empty());
2216 DCHECK(ssl_config_.client_private_key); 2212 DCHECK(ssl_config_.client_private_key);
2217 2213
2218 net_log_.EndEventWithNetErrorCode(NetLog::TYPE_SSL_PRIVATE_KEY_OPERATION, 2214 net_log_.EndEventWithNetErrorCode(NetLog::TYPE_SSL_PRIVATE_KEY_OPERATION,
2219 error); 2215 error);
2220 2216
2221 signature_result_ = error; 2217 signature_result_ = error;
2222 if (signature_result_ == OK) 2218 if (signature_result_ == OK)
2223 signature_ = signature; 2219 signature_ = signature;
2224 2220
2225 if (next_handshake_state_ == STATE_HANDSHAKE) { 2221 if (next_handshake_state_ == STATE_HANDSHAKE) {
2226 OnHandshakeIOComplete(signature_result_); 2222 OnHandshakeIOComplete(signature_result_);
2227 return; 2223 return;
2228 } 2224 }
2229 2225
2230 // During a renegotiation, either Read or Write calls may be blocked on an 2226 // During a renegotiation, either Read or Write calls may be blocked on an
2231 // asynchronous private key operation. 2227 // asynchronous private key operation.
2232 PumpReadWriteEvents(); 2228 PumpReadWriteEvents();
2233 } 2229 }
2234 2230
2235 int SSLClientSocketOpenSSL::TokenBindingAdd(const uint8_t** out, 2231 int SSLClientSocketImpl::TokenBindingAdd(const uint8_t** out,
2236 size_t* out_len, 2232 size_t* out_len,
2237 int* out_alert_value) { 2233 int* out_alert_value) {
2238 if (ssl_config_.token_binding_params.empty()) { 2234 if (ssl_config_.token_binding_params.empty()) {
2239 return 0; 2235 return 0;
2240 } 2236 }
2241 crypto::AutoCBB output; 2237 crypto::AutoCBB output;
2242 CBB parameters_list; 2238 CBB parameters_list;
2243 if (!CBB_init(output.get(), 7) || 2239 if (!CBB_init(output.get(), 7) ||
2244 !CBB_add_u8(output.get(), kTbProtocolVersionMajor) || 2240 !CBB_add_u8(output.get(), kTbProtocolVersionMajor) ||
2245 !CBB_add_u8(output.get(), kTbProtocolVersionMinor) || 2241 !CBB_add_u8(output.get(), kTbProtocolVersionMinor) ||
2246 !CBB_add_u8_length_prefixed(output.get(), &parameters_list)) { 2242 !CBB_add_u8_length_prefixed(output.get(), &parameters_list)) {
2247 *out_alert_value = SSL_AD_INTERNAL_ERROR; 2243 *out_alert_value = SSL_AD_INTERNAL_ERROR;
2248 return -1; 2244 return -1;
2249 } 2245 }
2250 for (size_t i = 0; i < ssl_config_.token_binding_params.size(); ++i) { 2246 for (size_t i = 0; i < ssl_config_.token_binding_params.size(); ++i) {
2251 if (!CBB_add_u8(&parameters_list, ssl_config_.token_binding_params[i])) { 2247 if (!CBB_add_u8(&parameters_list, ssl_config_.token_binding_params[i])) {
2252 *out_alert_value = SSL_AD_INTERNAL_ERROR; 2248 *out_alert_value = SSL_AD_INTERNAL_ERROR;
2253 return -1; 2249 return -1;
2254 } 2250 }
2255 } 2251 }
2256 // |*out| will be freed by TokenBindingFreeCallback. 2252 // |*out| will be freed by TokenBindingFreeCallback.
2257 if (!CBB_finish(output.get(), const_cast<uint8_t**>(out), out_len)) { 2253 if (!CBB_finish(output.get(), const_cast<uint8_t**>(out), out_len)) {
2258 *out_alert_value = SSL_AD_INTERNAL_ERROR; 2254 *out_alert_value = SSL_AD_INTERNAL_ERROR;
2259 return -1; 2255 return -1;
2260 } 2256 }
2261 2257
2262 return 1; 2258 return 1;
2263 } 2259 }
2264 2260
2265 int SSLClientSocketOpenSSL::TokenBindingParse(const uint8_t* contents, 2261 int SSLClientSocketImpl::TokenBindingParse(const uint8_t* contents,
2266 size_t contents_len, 2262 size_t contents_len,
2267 int* out_alert_value) { 2263 int* out_alert_value) {
2268 if (completed_connect_) { 2264 if (completed_connect_) {
2269 // Token Binding may only be negotiated on the initial handshake. 2265 // Token Binding may only be negotiated on the initial handshake.
2270 *out_alert_value = SSL_AD_ILLEGAL_PARAMETER; 2266 *out_alert_value = SSL_AD_ILLEGAL_PARAMETER;
2271 return 0; 2267 return 0;
2272 } 2268 }
2273 2269
2274 CBS extension; 2270 CBS extension;
2275 CBS_init(&extension, contents, contents_len); 2271 CBS_init(&extension, contents, contents_len);
2276 2272
2277 CBS parameters_list; 2273 CBS parameters_list;
(...skipping 27 matching lines...) Expand all
2305 tb_was_negotiated_ = true; 2301 tb_was_negotiated_ = true;
2306 return 1; 2302 return 1;
2307 } 2303 }
2308 } 2304 }
2309 2305
2310 *out_alert_value = SSL_AD_ILLEGAL_PARAMETER; 2306 *out_alert_value = SSL_AD_ILLEGAL_PARAMETER;
2311 return 0; 2307 return 0;
2312 } 2308 }
2313 2309
2314 } // namespace net 2310 } // namespace net
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698