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_send_busy_(false), | 440 transport_send_busy_(false), |
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 user_read_callback_(NULL), | 450 old_user_read_callback_(NULL), |
451 user_write_callback_(NULL), | 451 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), |
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
569 std::string* server_protos) { | 569 std::string* server_protos) { |
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(!user_read_callback_); | 579 DCHECK(!old_user_read_callback_ && user_read_callback_.is_null()); |
580 DCHECK(!user_write_callback_); | 580 DCHECK(!user_write_callback_); |
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(); |
(...skipping 27 matching lines...) Expand all Loading... |
617 net_log_.EndEventWithNetErrorCode(NetLog::TYPE_SSL_CONNECT, rv); | 617 net_log_.EndEventWithNetErrorCode(NetLog::TYPE_SSL_CONNECT, rv); |
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(!user_read_callback_); | 627 DCHECK(!old_user_read_callback_ && user_read_callback_.is_null()); |
628 DCHECK(!user_write_callback_); | 628 DCHECK(!user_write_callback_); |
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(); |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
688 if (nss_fd_ != NULL) { | 688 if (nss_fd_ != NULL) { |
689 PR_Close(nss_fd_); | 689 PR_Close(nss_fd_); |
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 user_read_callback_ = NULL; | 698 old_user_read_callback_ = NULL; |
| 699 user_read_callback_.Reset(); |
699 user_write_callback_ = NULL; | 700 user_write_callback_ = NULL; |
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 } |
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
808 } | 809 } |
809 NOTREACHED(); | 810 NOTREACHED(); |
810 return base::TimeDelta::FromMicroseconds(-1); | 811 return base::TimeDelta::FromMicroseconds(-1); |
811 } | 812 } |
812 | 813 |
813 int SSLClientSocketNSS::Read(IOBuffer* buf, int buf_len, | 814 int SSLClientSocketNSS::Read(IOBuffer* buf, int buf_len, |
814 OldCompletionCallback* callback) { | 815 OldCompletionCallback* callback) { |
815 EnterFunction(buf_len); | 816 EnterFunction(buf_len); |
816 DCHECK(completed_handshake_); | 817 DCHECK(completed_handshake_); |
817 DCHECK(next_handshake_state_ == STATE_NONE); | 818 DCHECK(next_handshake_state_ == STATE_NONE); |
818 DCHECK(!user_read_callback_); | 819 DCHECK(!old_user_read_callback_ && user_read_callback_.is_null()); |
819 DCHECK(!old_user_connect_callback_); | 820 DCHECK(!old_user_connect_callback_ && user_connect_callback_.is_null()); |
820 DCHECK(!user_read_buf_); | 821 DCHECK(!user_read_buf_); |
821 DCHECK(nss_bufs_); | 822 DCHECK(nss_bufs_); |
822 | 823 |
| 824 user_read_buf_ = buf; |
| 825 user_read_buf_len_ = buf_len; |
| 826 |
| 827 int rv = DoReadLoop(OK); |
| 828 |
| 829 if (rv == ERR_IO_PENDING) { |
| 830 old_user_read_callback_ = callback; |
| 831 } else { |
| 832 user_read_buf_ = NULL; |
| 833 user_read_buf_len_ = 0; |
| 834 } |
| 835 LeaveFunction(rv); |
| 836 return rv; |
| 837 } |
| 838 int SSLClientSocketNSS::Read(IOBuffer* buf, int buf_len, |
| 839 const CompletionCallback& callback) { |
| 840 EnterFunction(buf_len); |
| 841 DCHECK(completed_handshake_); |
| 842 DCHECK(next_handshake_state_ == STATE_NONE); |
| 843 DCHECK(!old_user_read_callback_ && user_read_callback_.is_null()); |
| 844 DCHECK(!old_user_connect_callback_ && user_connect_callback_.is_null()); |
| 845 DCHECK(!user_read_buf_); |
| 846 DCHECK(nss_bufs_); |
| 847 |
823 user_read_buf_ = buf; | 848 user_read_buf_ = buf; |
824 user_read_buf_len_ = buf_len; | 849 user_read_buf_len_ = buf_len; |
825 | 850 |
826 int rv = DoReadLoop(OK); | 851 int rv = DoReadLoop(OK); |
827 | 852 |
828 if (rv == ERR_IO_PENDING) { | 853 if (rv == ERR_IO_PENDING) { |
829 user_read_callback_ = callback; | 854 user_read_callback_ = callback; |
830 } else { | 855 } else { |
831 user_read_buf_ = NULL; | 856 user_read_buf_ = NULL; |
832 user_read_buf_len_ = 0; | 857 user_read_buf_len_ = 0; |
(...skipping 360 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1193 } | 1218 } |
1194 #endif | 1219 #endif |
1195 | 1220 |
1196 if (ssl_config_.ssl3_fallback) | 1221 if (ssl_config_.ssl3_fallback) |
1197 ssl_connection_status_ |= SSL_CONNECTION_SSL3_FALLBACK; | 1222 ssl_connection_status_ |= SSL_CONNECTION_SSL3_FALLBACK; |
1198 } | 1223 } |
1199 | 1224 |
1200 void SSLClientSocketNSS::DoReadCallback(int rv) { | 1225 void SSLClientSocketNSS::DoReadCallback(int rv) { |
1201 EnterFunction(rv); | 1226 EnterFunction(rv); |
1202 DCHECK(rv != ERR_IO_PENDING); | 1227 DCHECK(rv != ERR_IO_PENDING); |
1203 DCHECK(user_read_callback_); | 1228 DCHECK(old_user_read_callback_ || user_read_callback_.is_null()); |
1204 | 1229 |
1205 // Since Run may result in Read being called, clear |user_read_callback_| | 1230 // Since Run may result in Read being called, clear |old_user_read_callback_| |
1206 // up front. | 1231 // up front. |
1207 OldCompletionCallback* c = user_read_callback_; | 1232 if (old_user_read_callback_) { |
1208 user_read_callback_ = NULL; | 1233 OldCompletionCallback* c = old_user_read_callback_; |
1209 user_read_buf_ = NULL; | 1234 old_user_read_callback_ = NULL; |
1210 user_read_buf_len_ = 0; | 1235 user_read_buf_ = NULL; |
1211 c->Run(rv); | 1236 user_read_buf_len_ = 0; |
| 1237 c->Run(rv); |
| 1238 } else { |
| 1239 CompletionCallback c = user_read_callback_; |
| 1240 user_read_callback_.Reset(); |
| 1241 user_read_buf_ = NULL; |
| 1242 user_read_buf_len_ = 0; |
| 1243 c.Run(rv); |
| 1244 } |
1212 LeaveFunction(""); | 1245 LeaveFunction(""); |
1213 } | 1246 } |
1214 | 1247 |
1215 void SSLClientSocketNSS::DoWriteCallback(int rv) { | 1248 void SSLClientSocketNSS::DoWriteCallback(int rv) { |
1216 EnterFunction(rv); | 1249 EnterFunction(rv); |
1217 DCHECK(rv != ERR_IO_PENDING); | 1250 DCHECK(rv != ERR_IO_PENDING); |
1218 DCHECK(user_write_callback_); | 1251 DCHECK(user_write_callback_); |
1219 | 1252 |
1220 // Since Run may result in Write being called, clear |user_write_callback_| | 1253 // Since Run may result in Write being called, clear |user_write_callback_| |
1221 // up front. | 1254 // up front. |
(...skipping 635 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1857 // http://crbug.com/15630 for more info. | 1890 // http://crbug.com/15630 for more info. |
1858 | 1891 |
1859 // TODO(hclam): Skip logging if server cert was expected to be bad because | 1892 // TODO(hclam): Skip logging if server cert was expected to be bad because |
1860 // |server_cert_verify_results_| doesn't contain all the information about | 1893 // |server_cert_verify_results_| doesn't contain all the information about |
1861 // the cert. | 1894 // the cert. |
1862 if (result == OK) | 1895 if (result == OK) |
1863 LogConnectionTypeMetrics(); | 1896 LogConnectionTypeMetrics(); |
1864 | 1897 |
1865 completed_handshake_ = true; | 1898 completed_handshake_ = true; |
1866 | 1899 |
1867 if (user_read_callback_) { | 1900 if (old_user_read_callback_ || !user_read_callback_.is_null()) { |
1868 int rv = DoReadLoop(OK); | 1901 int rv = DoReadLoop(OK); |
1869 if (rv != ERR_IO_PENDING) | 1902 if (rv != ERR_IO_PENDING) |
1870 DoReadCallback(rv); | 1903 DoReadCallback(rv); |
1871 } | 1904 } |
1872 | 1905 |
1873 // Exit DoHandshakeLoop and return the result to the caller to Connect. | 1906 // Exit DoHandshakeLoop and return the result to the caller to Connect. |
1874 DCHECK(next_handshake_state_ == STATE_NONE); | 1907 DCHECK(next_handshake_state_ == STATE_NONE); |
1875 return result; | 1908 return result; |
1876 } | 1909 } |
1877 | 1910 |
(...skipping 844 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2722 valid_thread_id_ = base::PlatformThread::CurrentId(); | 2755 valid_thread_id_ = base::PlatformThread::CurrentId(); |
2723 } | 2756 } |
2724 | 2757 |
2725 bool SSLClientSocketNSS::CalledOnValidThread() const { | 2758 bool SSLClientSocketNSS::CalledOnValidThread() const { |
2726 EnsureThreadIdAssigned(); | 2759 EnsureThreadIdAssigned(); |
2727 base::AutoLock auto_lock(lock_); | 2760 base::AutoLock auto_lock(lock_); |
2728 return valid_thread_id_ == base::PlatformThread::CurrentId(); | 2761 return valid_thread_id_ == base::PlatformThread::CurrentId(); |
2729 } | 2762 } |
2730 | 2763 |
2731 } // namespace net | 2764 } // namespace net |
OLD | NEW |