OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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 // This file includes code SSLClientSocketNSS::DoVerifyCertComplete() derived | 5 // This file includes code SSLClientSocketNSS::DoVerifyCertComplete() derived |
6 // from AuthCertificateCallback() in | 6 // from AuthCertificateCallback() in |
7 // mozilla/security/manager/ssl/src/nsNSSCallbacks.cpp. | 7 // mozilla/security/manager/ssl/src/nsNSSCallbacks.cpp. |
8 | 8 |
9 /* ***** BEGIN LICENSE BLOCK ***** | 9 /* ***** BEGIN LICENSE BLOCK ***** |
10 * Version: MPL 1.1/GPL 2.0/LGPL 2.1 | 10 * Version: MPL 1.1/GPL 2.0/LGPL 2.1 |
(...skipping 429 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
440 transport_recv_busy_(false), | 440 transport_recv_busy_(false), |
441 corked_(false), | 441 corked_(false), |
442 ALLOW_THIS_IN_INITIALIZER_LIST(handshake_io_callback_( | 442 ALLOW_THIS_IN_INITIALIZER_LIST(handshake_io_callback_( |
443 base::Bind(&SSLClientSocketNSS::OnHandshakeIOComplete, | 443 base::Bind(&SSLClientSocketNSS::OnHandshakeIOComplete, |
444 base::Unretained(this)))), | 444 base::Unretained(this)))), |
445 transport_(transport_socket), | 445 transport_(transport_socket), |
446 host_and_port_(host_and_port), | 446 host_and_port_(host_and_port), |
447 ssl_config_(ssl_config), | 447 ssl_config_(ssl_config), |
448 old_user_connect_callback_(NULL), | 448 old_user_connect_callback_(NULL), |
449 old_user_read_callback_(NULL), | 449 old_user_read_callback_(NULL), |
450 user_write_callback_(NULL), | 450 old_user_write_callback_(NULL), |
451 user_read_buf_len_(0), | 451 user_read_buf_len_(0), |
452 user_write_buf_len_(0), | 452 user_write_buf_len_(0), |
453 server_cert_nss_(NULL), | 453 server_cert_nss_(NULL), |
454 server_cert_verify_result_(NULL), | 454 server_cert_verify_result_(NULL), |
455 ssl_connection_status_(0), | 455 ssl_connection_status_(0), |
456 client_auth_cert_needed_(false), | 456 client_auth_cert_needed_(false), |
457 cert_verifier_(context.cert_verifier), | 457 cert_verifier_(context.cert_verifier), |
458 ob_cert_xtn_negotiated_(false), | 458 ob_cert_xtn_negotiated_(false), |
459 origin_bound_cert_service_(context.origin_bound_cert_service), | 459 origin_bound_cert_service_(context.origin_bound_cert_service), |
460 ob_cert_request_handle_(NULL), | 460 ob_cert_request_handle_(NULL), |
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
569 *proto = next_proto_; | 569 *proto = next_proto_; |
570 *server_protos = server_protos_; | 570 *server_protos = server_protos_; |
571 return next_proto_status_; | 571 return next_proto_status_; |
572 } | 572 } |
573 | 573 |
574 int SSLClientSocketNSS::Connect(OldCompletionCallback* callback) { | 574 int SSLClientSocketNSS::Connect(OldCompletionCallback* callback) { |
575 EnterFunction(""); | 575 EnterFunction(""); |
576 DCHECK(transport_.get()); | 576 DCHECK(transport_.get()); |
577 DCHECK(next_handshake_state_ == STATE_NONE); | 577 DCHECK(next_handshake_state_ == STATE_NONE); |
578 DCHECK(!old_user_read_callback_ && user_read_callback_.is_null()); | 578 DCHECK(!old_user_read_callback_ && user_read_callback_.is_null()); |
579 DCHECK(!user_write_callback_); | 579 DCHECK(!old_user_write_callback_ && user_write_callback_.is_null()); |
580 DCHECK(!old_user_connect_callback_ && user_connect_callback_.is_null()); | 580 DCHECK(!old_user_connect_callback_ && user_connect_callback_.is_null()); |
581 DCHECK(!user_read_buf_); | 581 DCHECK(!user_read_buf_); |
582 DCHECK(!user_write_buf_); | 582 DCHECK(!user_write_buf_); |
583 | 583 |
584 EnsureThreadIdAssigned(); | 584 EnsureThreadIdAssigned(); |
585 | 585 |
586 net_log_.BeginEvent(NetLog::TYPE_SSL_CONNECT, NULL); | 586 net_log_.BeginEvent(NetLog::TYPE_SSL_CONNECT, NULL); |
587 | 587 |
588 int rv = Init(); | 588 int rv = Init(); |
589 if (rv != OK) { | 589 if (rv != OK) { |
(...skipping 27 matching lines...) Expand all Loading... |
617 } | 617 } |
618 | 618 |
619 LeaveFunction(""); | 619 LeaveFunction(""); |
620 return rv > OK ? OK : rv; | 620 return rv > OK ? OK : rv; |
621 } | 621 } |
622 int SSLClientSocketNSS::Connect(const CompletionCallback& callback) { | 622 int SSLClientSocketNSS::Connect(const CompletionCallback& callback) { |
623 EnterFunction(""); | 623 EnterFunction(""); |
624 DCHECK(transport_.get()); | 624 DCHECK(transport_.get()); |
625 DCHECK(next_handshake_state_ == STATE_NONE); | 625 DCHECK(next_handshake_state_ == STATE_NONE); |
626 DCHECK(!old_user_read_callback_ && user_read_callback_.is_null()); | 626 DCHECK(!old_user_read_callback_ && user_read_callback_.is_null()); |
627 DCHECK(!user_write_callback_); | 627 DCHECK(!old_user_write_callback_ && user_write_callback_.is_null()); |
628 DCHECK(!old_user_connect_callback_ && user_connect_callback_.is_null()); | 628 DCHECK(!old_user_connect_callback_ && user_connect_callback_.is_null()); |
629 DCHECK(!user_read_buf_); | 629 DCHECK(!user_read_buf_); |
630 DCHECK(!user_write_buf_); | 630 DCHECK(!user_write_buf_); |
631 | 631 |
632 EnsureThreadIdAssigned(); | 632 EnsureThreadIdAssigned(); |
633 | 633 |
634 net_log_.BeginEvent(NetLog::TYPE_SSL_CONNECT, NULL); | 634 net_log_.BeginEvent(NetLog::TYPE_SSL_CONNECT, NULL); |
635 | 635 |
636 int rv = Init(); | 636 int rv = Init(); |
637 if (rv != OK) { | 637 if (rv != OK) { |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
689 nss_fd_ = NULL; | 689 nss_fd_ = NULL; |
690 } | 690 } |
691 | 691 |
692 // Reset object state | 692 // Reset object state |
693 transport_send_busy_ = false; | 693 transport_send_busy_ = false; |
694 transport_recv_busy_ = false; | 694 transport_recv_busy_ = false; |
695 old_user_connect_callback_ = NULL; | 695 old_user_connect_callback_ = NULL; |
696 user_connect_callback_.Reset(); | 696 user_connect_callback_.Reset(); |
697 old_user_read_callback_ = NULL; | 697 old_user_read_callback_ = NULL; |
698 user_read_callback_.Reset(); | 698 user_read_callback_.Reset(); |
699 user_write_callback_ = NULL; | 699 old_user_write_callback_ = NULL; |
| 700 user_write_callback_.Reset(); |
700 user_read_buf_ = NULL; | 701 user_read_buf_ = NULL; |
701 user_read_buf_len_ = 0; | 702 user_read_buf_len_ = 0; |
702 user_write_buf_ = NULL; | 703 user_write_buf_ = NULL; |
703 user_write_buf_len_ = 0; | 704 user_write_buf_len_ = 0; |
704 server_cert_ = NULL; | 705 server_cert_ = NULL; |
705 if (server_cert_nss_) { | 706 if (server_cert_nss_) { |
706 CERT_DestroyCertificate(server_cert_nss_); | 707 CERT_DestroyCertificate(server_cert_nss_); |
707 server_cert_nss_ = NULL; | 708 server_cert_nss_ = NULL; |
708 } | 709 } |
709 local_server_cert_verify_result_.Reset(); | 710 local_server_cert_verify_result_.Reset(); |
(...skipping 147 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
857 } | 858 } |
858 LeaveFunction(rv); | 859 LeaveFunction(rv); |
859 return rv; | 860 return rv; |
860 } | 861 } |
861 | 862 |
862 int SSLClientSocketNSS::Write(IOBuffer* buf, int buf_len, | 863 int SSLClientSocketNSS::Write(IOBuffer* buf, int buf_len, |
863 OldCompletionCallback* callback) { | 864 OldCompletionCallback* callback) { |
864 EnterFunction(buf_len); | 865 EnterFunction(buf_len); |
865 DCHECK(completed_handshake_); | 866 DCHECK(completed_handshake_); |
866 DCHECK(next_handshake_state_ == STATE_NONE); | 867 DCHECK(next_handshake_state_ == STATE_NONE); |
867 DCHECK(!user_write_callback_); | 868 DCHECK(!old_user_write_callback_ && user_write_callback_.is_null()); |
868 DCHECK(!old_user_connect_callback_); | 869 DCHECK(!old_user_connect_callback_ && user_connect_callback_.is_null()); |
869 DCHECK(!user_write_buf_); | 870 DCHECK(!user_write_buf_); |
870 DCHECK(nss_bufs_); | 871 DCHECK(nss_bufs_); |
871 | 872 |
| 873 user_write_buf_ = buf; |
| 874 user_write_buf_len_ = buf_len; |
| 875 |
| 876 if (corked_) { |
| 877 corked_ = false; |
| 878 uncork_timer_.Reset(); |
| 879 } |
| 880 int rv = DoWriteLoop(OK); |
| 881 |
| 882 if (rv == ERR_IO_PENDING) { |
| 883 old_user_write_callback_ = callback; |
| 884 } else { |
| 885 user_write_buf_ = NULL; |
| 886 user_write_buf_len_ = 0; |
| 887 } |
| 888 LeaveFunction(rv); |
| 889 return rv; |
| 890 } |
| 891 int SSLClientSocketNSS::Write(IOBuffer* buf, int buf_len, |
| 892 const CompletionCallback& callback) { |
| 893 EnterFunction(buf_len); |
| 894 DCHECK(completed_handshake_); |
| 895 DCHECK(next_handshake_state_ == STATE_NONE); |
| 896 DCHECK(!old_user_write_callback_ && user_write_callback_.is_null()); |
| 897 DCHECK(!old_user_connect_callback_ && user_connect_callback_.is_null()); |
| 898 DCHECK(!user_write_buf_); |
| 899 DCHECK(nss_bufs_); |
| 900 |
872 user_write_buf_ = buf; | 901 user_write_buf_ = buf; |
873 user_write_buf_len_ = buf_len; | 902 user_write_buf_len_ = buf_len; |
874 | 903 |
875 if (corked_) { | 904 if (corked_) { |
876 corked_ = false; | 905 corked_ = false; |
877 uncork_timer_.Reset(); | 906 uncork_timer_.Reset(); |
878 } | 907 } |
879 int rv = DoWriteLoop(OK); | 908 int rv = DoWriteLoop(OK); |
880 | 909 |
881 if (rv == ERR_IO_PENDING) { | 910 if (rv == ERR_IO_PENDING) { |
(...skipping 358 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1240 user_read_buf_ = NULL; | 1269 user_read_buf_ = NULL; |
1241 user_read_buf_len_ = 0; | 1270 user_read_buf_len_ = 0; |
1242 c.Run(rv); | 1271 c.Run(rv); |
1243 } | 1272 } |
1244 LeaveFunction(""); | 1273 LeaveFunction(""); |
1245 } | 1274 } |
1246 | 1275 |
1247 void SSLClientSocketNSS::DoWriteCallback(int rv) { | 1276 void SSLClientSocketNSS::DoWriteCallback(int rv) { |
1248 EnterFunction(rv); | 1277 EnterFunction(rv); |
1249 DCHECK(rv != ERR_IO_PENDING); | 1278 DCHECK(rv != ERR_IO_PENDING); |
1250 DCHECK(user_write_callback_); | 1279 DCHECK(old_user_write_callback_ || !user_write_callback_.is_null()); |
1251 | 1280 |
1252 // Since Run may result in Write being called, clear |user_write_callback_| | 1281 // Since Run may result in Write being called, clear |user_write_callback_| |
1253 // up front. | 1282 // up front. |
1254 OldCompletionCallback* c = user_write_callback_; | 1283 if (old_user_write_callback_) { |
1255 user_write_callback_ = NULL; | 1284 OldCompletionCallback* c = old_user_write_callback_; |
1256 user_write_buf_ = NULL; | 1285 old_user_write_callback_ = NULL; |
1257 user_write_buf_len_ = 0; | 1286 user_write_buf_ = NULL; |
1258 c->Run(rv); | 1287 user_write_buf_len_ = 0; |
| 1288 c->Run(rv); |
| 1289 } else { |
| 1290 CompletionCallback c = user_write_callback_; |
| 1291 user_write_callback_.Reset(); |
| 1292 user_write_buf_ = NULL; |
| 1293 user_write_buf_len_ = 0; |
| 1294 c.Run(rv); |
| 1295 } |
1259 LeaveFunction(""); | 1296 LeaveFunction(""); |
1260 } | 1297 } |
1261 | 1298 |
1262 // As part of Connect(), the SSLClientSocketNSS object performs an SSL | 1299 // As part of Connect(), the SSLClientSocketNSS object performs an SSL |
1263 // handshake. This requires network IO, which in turn calls | 1300 // handshake. This requires network IO, which in turn calls |
1264 // BufferRecvComplete() with a non-zero byte count. This byte count eventually | 1301 // BufferRecvComplete() with a non-zero byte count. This byte count eventually |
1265 // winds its way through the state machine and ends up being passed to the | 1302 // winds its way through the state machine and ends up being passed to the |
1266 // callback. For Read() and Write(), that's what we want. But for Connect(), | 1303 // callback. For Read() and Write(), that's what we want. But for Connect(), |
1267 // the caller expects OK (i.e. 0) for success. | 1304 // the caller expects OK (i.e. 0) for success. |
1268 // | 1305 // |
(...skipping 1489 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2758 valid_thread_id_ = base::PlatformThread::CurrentId(); | 2795 valid_thread_id_ = base::PlatformThread::CurrentId(); |
2759 } | 2796 } |
2760 | 2797 |
2761 bool SSLClientSocketNSS::CalledOnValidThread() const { | 2798 bool SSLClientSocketNSS::CalledOnValidThread() const { |
2762 EnsureThreadIdAssigned(); | 2799 EnsureThreadIdAssigned(); |
2763 base::AutoLock auto_lock(lock_); | 2800 base::AutoLock auto_lock(lock_); |
2764 return valid_thread_id_ == base::PlatformThread::CurrentId(); | 2801 return valid_thread_id_ == base::PlatformThread::CurrentId(); |
2765 } | 2802 } |
2766 | 2803 |
2767 } // namespace net | 2804 } // namespace net |
OLD | NEW |