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