Chromium Code Reviews| 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 427 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 438 this, &SSLClientSocketNSS::BufferRecvComplete)), | 438 this, &SSLClientSocketNSS::BufferRecvComplete)), |
| 439 transport_send_busy_(false), | 439 transport_send_busy_(false), |
| 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 user_connect_callback_(NULL), | 448 old_user_connect_callback_(NULL), |
| 449 user_read_callback_(NULL), | 449 user_read_callback_(NULL), |
| 450 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), |
| (...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 562 *proto = next_proto_; | 562 *proto = next_proto_; |
| 563 return next_proto_status_; | 563 return next_proto_status_; |
| 564 } | 564 } |
| 565 | 565 |
| 566 int SSLClientSocketNSS::Connect(OldCompletionCallback* callback) { | 566 int SSLClientSocketNSS::Connect(OldCompletionCallback* callback) { |
| 567 EnterFunction(""); | 567 EnterFunction(""); |
| 568 DCHECK(transport_.get()); | 568 DCHECK(transport_.get()); |
| 569 DCHECK(next_handshake_state_ == STATE_NONE); | 569 DCHECK(next_handshake_state_ == STATE_NONE); |
| 570 DCHECK(!user_read_callback_); | 570 DCHECK(!user_read_callback_); |
| 571 DCHECK(!user_write_callback_); | 571 DCHECK(!user_write_callback_); |
| 572 DCHECK(!user_connect_callback_); | 572 DCHECK(!old_user_connect_callback_); |
|
csilv
2011/12/06 21:03:18
make this check same as line 620
James Hawkins
2011/12/06 22:19:30
Done.
| |
| 573 DCHECK(!user_read_buf_); | 573 DCHECK(!user_read_buf_); |
| 574 DCHECK(!user_write_buf_); | 574 DCHECK(!user_write_buf_); |
| 575 | 575 |
| 576 EnsureThreadIdAssigned(); | |
| 577 | |
| 578 net_log_.BeginEvent(NetLog::TYPE_SSL_CONNECT, NULL); | |
| 579 | |
| 580 int rv = Init(); | |
| 581 if (rv != OK) { | |
| 582 net_log_.EndEventWithNetErrorCode(NetLog::TYPE_SSL_CONNECT, rv); | |
| 583 return rv; | |
| 584 } | |
| 585 | |
| 586 rv = InitializeSSLOptions(); | |
| 587 if (rv != OK) { | |
| 588 net_log_.EndEventWithNetErrorCode(NetLog::TYPE_SSL_CONNECT, rv); | |
| 589 return rv; | |
| 590 } | |
| 591 | |
| 592 rv = InitializeSSLPeerName(); | |
| 593 if (rv != OK) { | |
| 594 net_log_.EndEventWithNetErrorCode(NetLog::TYPE_SSL_CONNECT, rv); | |
| 595 return rv; | |
| 596 } | |
| 597 | |
| 598 if (ssl_config_.cached_info_enabled && ssl_host_info_.get()) { | |
| 599 GotoState(STATE_LOAD_SSL_HOST_INFO); | |
| 600 } else { | |
| 601 GotoState(STATE_HANDSHAKE); | |
| 602 } | |
| 603 | |
| 604 rv = DoHandshakeLoop(OK); | |
| 605 if (rv == ERR_IO_PENDING) { | |
| 606 old_user_connect_callback_ = callback; | |
| 607 } else { | |
| 608 net_log_.EndEventWithNetErrorCode(NetLog::TYPE_SSL_CONNECT, rv); | |
| 609 } | |
| 610 | |
| 611 LeaveFunction(""); | |
| 612 return rv > OK ? OK : rv; | |
| 613 } | |
| 614 int SSLClientSocketNSS::Connect(const CompletionCallback& callback) { | |
| 615 EnterFunction(""); | |
| 616 DCHECK(transport_.get()); | |
| 617 DCHECK(next_handshake_state_ == STATE_NONE); | |
| 618 DCHECK(!user_read_callback_); | |
| 619 DCHECK(!user_write_callback_); | |
| 620 DCHECK(!old_user_connect_callback_ && user_connect_callback_.is_null()); | |
| 621 DCHECK(!user_read_buf_); | |
| 622 DCHECK(!user_write_buf_); | |
| 623 | |
| 576 EnsureThreadIdAssigned(); | 624 EnsureThreadIdAssigned(); |
| 577 | 625 |
| 578 net_log_.BeginEvent(NetLog::TYPE_SSL_CONNECT, NULL); | 626 net_log_.BeginEvent(NetLog::TYPE_SSL_CONNECT, NULL); |
| 579 | 627 |
| 580 int rv = Init(); | 628 int rv = Init(); |
| 581 if (rv != OK) { | 629 if (rv != OK) { |
| 582 net_log_.EndEventWithNetErrorCode(NetLog::TYPE_SSL_CONNECT, rv); | 630 net_log_.EndEventWithNetErrorCode(NetLog::TYPE_SSL_CONNECT, rv); |
| 583 return rv; | 631 return rv; |
| 584 } | 632 } |
| 585 | 633 |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 629 | 677 |
| 630 // TODO(wtc): Send SSL close_notify alert. | 678 // TODO(wtc): Send SSL close_notify alert. |
| 631 if (nss_fd_ != NULL) { | 679 if (nss_fd_ != NULL) { |
| 632 PR_Close(nss_fd_); | 680 PR_Close(nss_fd_); |
| 633 nss_fd_ = NULL; | 681 nss_fd_ = NULL; |
| 634 } | 682 } |
| 635 | 683 |
| 636 // Reset object state | 684 // Reset object state |
| 637 transport_send_busy_ = false; | 685 transport_send_busy_ = false; |
| 638 transport_recv_busy_ = false; | 686 transport_recv_busy_ = false; |
| 639 user_connect_callback_ = NULL; | 687 old_user_connect_callback_ = NULL; |
| 688 user_connect_callback_.Reset(); | |
| 640 user_read_callback_ = NULL; | 689 user_read_callback_ = NULL; |
| 641 user_write_callback_ = NULL; | 690 user_write_callback_ = NULL; |
| 642 user_read_buf_ = NULL; | 691 user_read_buf_ = NULL; |
| 643 user_read_buf_len_ = 0; | 692 user_read_buf_len_ = 0; |
| 644 user_write_buf_ = NULL; | 693 user_write_buf_ = NULL; |
| 645 user_write_buf_len_ = 0; | 694 user_write_buf_len_ = 0; |
| 646 server_cert_ = NULL; | 695 server_cert_ = NULL; |
| 647 if (server_cert_nss_) { | 696 if (server_cert_nss_) { |
| 648 CERT_DestroyCertificate(server_cert_nss_); | 697 CERT_DestroyCertificate(server_cert_nss_); |
| 649 server_cert_nss_ = NULL; | 698 server_cert_nss_ = NULL; |
| (...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 751 NOTREACHED(); | 800 NOTREACHED(); |
| 752 return base::TimeDelta::FromMicroseconds(-1); | 801 return base::TimeDelta::FromMicroseconds(-1); |
| 753 } | 802 } |
| 754 | 803 |
| 755 int SSLClientSocketNSS::Read(IOBuffer* buf, int buf_len, | 804 int SSLClientSocketNSS::Read(IOBuffer* buf, int buf_len, |
| 756 OldCompletionCallback* callback) { | 805 OldCompletionCallback* callback) { |
| 757 EnterFunction(buf_len); | 806 EnterFunction(buf_len); |
| 758 DCHECK(completed_handshake_); | 807 DCHECK(completed_handshake_); |
| 759 DCHECK(next_handshake_state_ == STATE_NONE); | 808 DCHECK(next_handshake_state_ == STATE_NONE); |
| 760 DCHECK(!user_read_callback_); | 809 DCHECK(!user_read_callback_); |
| 761 DCHECK(!user_connect_callback_); | 810 DCHECK(!old_user_connect_callback_); |
| 762 DCHECK(!user_read_buf_); | 811 DCHECK(!user_read_buf_); |
| 763 DCHECK(nss_bufs_); | 812 DCHECK(nss_bufs_); |
| 764 | 813 |
| 765 user_read_buf_ = buf; | 814 user_read_buf_ = buf; |
| 766 user_read_buf_len_ = buf_len; | 815 user_read_buf_len_ = buf_len; |
| 767 | 816 |
| 768 int rv = DoReadLoop(OK); | 817 int rv = DoReadLoop(OK); |
| 769 | 818 |
| 770 if (rv == ERR_IO_PENDING) { | 819 if (rv == ERR_IO_PENDING) { |
| 771 user_read_callback_ = callback; | 820 user_read_callback_ = callback; |
| 772 } else { | 821 } else { |
| 773 user_read_buf_ = NULL; | 822 user_read_buf_ = NULL; |
| 774 user_read_buf_len_ = 0; | 823 user_read_buf_len_ = 0; |
| 775 } | 824 } |
| 776 LeaveFunction(rv); | 825 LeaveFunction(rv); |
| 777 return rv; | 826 return rv; |
| 778 } | 827 } |
| 779 | 828 |
| 780 int SSLClientSocketNSS::Write(IOBuffer* buf, int buf_len, | 829 int SSLClientSocketNSS::Write(IOBuffer* buf, int buf_len, |
| 781 OldCompletionCallback* callback) { | 830 OldCompletionCallback* callback) { |
| 782 EnterFunction(buf_len); | 831 EnterFunction(buf_len); |
| 783 DCHECK(completed_handshake_); | 832 DCHECK(completed_handshake_); |
| 784 DCHECK(next_handshake_state_ == STATE_NONE); | 833 DCHECK(next_handshake_state_ == STATE_NONE); |
| 785 DCHECK(!user_write_callback_); | 834 DCHECK(!user_write_callback_); |
| 786 DCHECK(!user_connect_callback_); | 835 DCHECK(!old_user_connect_callback_); |
| 787 DCHECK(!user_write_buf_); | 836 DCHECK(!user_write_buf_); |
| 788 DCHECK(nss_bufs_); | 837 DCHECK(nss_bufs_); |
| 789 | 838 |
| 790 user_write_buf_ = buf; | 839 user_write_buf_ = buf; |
| 791 user_write_buf_len_ = buf_len; | 840 user_write_buf_len_ = buf_len; |
| 792 | 841 |
| 793 if (corked_) { | 842 if (corked_) { |
| 794 corked_ = false; | 843 corked_ = false; |
| 795 uncork_timer_.Reset(); | 844 uncork_timer_.Reset(); |
| 796 } | 845 } |
| (...skipping 375 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1172 // As part of Connect(), the SSLClientSocketNSS object performs an SSL | 1221 // As part of Connect(), the SSLClientSocketNSS object performs an SSL |
| 1173 // handshake. This requires network IO, which in turn calls | 1222 // handshake. This requires network IO, which in turn calls |
| 1174 // BufferRecvComplete() with a non-zero byte count. This byte count eventually | 1223 // BufferRecvComplete() with a non-zero byte count. This byte count eventually |
| 1175 // winds its way through the state machine and ends up being passed to the | 1224 // winds its way through the state machine and ends up being passed to the |
| 1176 // callback. For Read() and Write(), that's what we want. But for Connect(), | 1225 // callback. For Read() and Write(), that's what we want. But for Connect(), |
| 1177 // the caller expects OK (i.e. 0) for success. | 1226 // the caller expects OK (i.e. 0) for success. |
| 1178 // | 1227 // |
| 1179 void SSLClientSocketNSS::DoConnectCallback(int rv) { | 1228 void SSLClientSocketNSS::DoConnectCallback(int rv) { |
| 1180 EnterFunction(rv); | 1229 EnterFunction(rv); |
| 1181 DCHECK_NE(rv, ERR_IO_PENDING); | 1230 DCHECK_NE(rv, ERR_IO_PENDING); |
| 1182 DCHECK(user_connect_callback_); | 1231 DCHECK(old_user_connect_callback_ || !user_connect_callback_.is_null()); |
| 1183 | 1232 |
| 1184 OldCompletionCallback* c = user_connect_callback_; | 1233 if (old_user_connect_callback_) { |
| 1185 user_connect_callback_ = NULL; | 1234 OldCompletionCallback* c = old_user_connect_callback_; |
| 1186 c->Run(rv > OK ? OK : rv); | 1235 old_user_connect_callback_ = NULL; |
| 1236 c->Run(rv > OK ? OK : rv); | |
| 1237 } else { | |
| 1238 CompletionCallback c = user_connect_callback_; | |
| 1239 user_connect_callback_.Reset(); | |
| 1240 c.Run(rv > OK ? OK : rv); | |
| 1241 } | |
| 1187 LeaveFunction(""); | 1242 LeaveFunction(""); |
| 1188 } | 1243 } |
| 1189 | 1244 |
| 1190 void SSLClientSocketNSS::OnHandshakeIOComplete(int result) { | 1245 void SSLClientSocketNSS::OnHandshakeIOComplete(int result) { |
| 1191 EnterFunction(result); | 1246 EnterFunction(result); |
| 1192 int rv = DoHandshakeLoop(result); | 1247 int rv = DoHandshakeLoop(result); |
| 1193 if (rv != ERR_IO_PENDING) { | 1248 if (rv != ERR_IO_PENDING) { |
| 1194 net_log_.EndEventWithNetErrorCode(net::NetLog::TYPE_SSL_CONNECT, rv); | 1249 net_log_.EndEventWithNetErrorCode(net::NetLog::TYPE_SSL_CONNECT, rv); |
| 1195 DoConnectCallback(rv); | 1250 DoConnectCallback(rv); |
| 1196 } | 1251 } |
| (...skipping 1421 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2618 valid_thread_id_ = base::PlatformThread::CurrentId(); | 2673 valid_thread_id_ = base::PlatformThread::CurrentId(); |
| 2619 } | 2674 } |
| 2620 | 2675 |
| 2621 bool SSLClientSocketNSS::CalledOnValidThread() const { | 2676 bool SSLClientSocketNSS::CalledOnValidThread() const { |
| 2622 EnsureThreadIdAssigned(); | 2677 EnsureThreadIdAssigned(); |
| 2623 base::AutoLock auto_lock(lock_); | 2678 base::AutoLock auto_lock(lock_); |
| 2624 return valid_thread_id_ == base::PlatformThread::CurrentId(); | 2679 return valid_thread_id_ == base::PlatformThread::CurrentId(); |
| 2625 } | 2680 } |
| 2626 | 2681 |
| 2627 } // namespace net | 2682 } // namespace net |
| OLD | NEW |