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