| 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 414 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 425 return r; | 425 return r; |
| 426 } | 426 } |
| 427 | 427 |
| 428 } // namespace | 428 } // namespace |
| 429 | 429 |
| 430 SSLClientSocketNSS::SSLClientSocketNSS(ClientSocketHandle* transport_socket, | 430 SSLClientSocketNSS::SSLClientSocketNSS(ClientSocketHandle* transport_socket, |
| 431 const HostPortPair& host_and_port, | 431 const HostPortPair& host_and_port, |
| 432 const SSLConfig& ssl_config, | 432 const SSLConfig& ssl_config, |
| 433 SSLHostInfo* ssl_host_info, | 433 SSLHostInfo* ssl_host_info, |
| 434 const SSLClientSocketContext& context) | 434 const SSLClientSocketContext& context) |
| 435 : ALLOW_THIS_IN_INITIALIZER_LIST(buffer_send_callback_( | 435 : transport_send_busy_(false), |
| 436 this, &SSLClientSocketNSS::BufferSendComplete)), | |
| 437 ALLOW_THIS_IN_INITIALIZER_LIST(buffer_recv_callback_( | |
| 438 this, &SSLClientSocketNSS::BufferRecvComplete)), | |
| 439 transport_send_busy_(false), | |
| 440 transport_recv_busy_(false), | 436 transport_recv_busy_(false), |
| 441 corked_(false), | 437 corked_(false), |
| 442 ALLOW_THIS_IN_INITIALIZER_LIST(handshake_io_callback_( | |
| 443 base::Bind(&SSLClientSocketNSS::OnHandshakeIOComplete, | |
| 444 base::Unretained(this)))), | |
| 445 transport_(transport_socket), | 438 transport_(transport_socket), |
| 446 host_and_port_(host_and_port), | 439 host_and_port_(host_and_port), |
| 447 ssl_config_(ssl_config), | 440 ssl_config_(ssl_config), |
| 448 old_user_connect_callback_(NULL), | |
| 449 old_user_read_callback_(NULL), | |
| 450 user_write_callback_(NULL), | |
| 451 user_read_buf_len_(0), | 441 user_read_buf_len_(0), |
| 452 user_write_buf_len_(0), | 442 user_write_buf_len_(0), |
| 453 server_cert_nss_(NULL), | 443 server_cert_nss_(NULL), |
| 454 server_cert_verify_result_(NULL), | 444 server_cert_verify_result_(NULL), |
| 455 ssl_connection_status_(0), | 445 ssl_connection_status_(0), |
| 456 client_auth_cert_needed_(false), | 446 client_auth_cert_needed_(false), |
| 457 cert_verifier_(context.cert_verifier), | 447 cert_verifier_(context.cert_verifier), |
| 458 ob_cert_xtn_negotiated_(false), | 448 ob_cert_xtn_negotiated_(false), |
| 459 origin_bound_cert_service_(context.origin_bound_cert_service), | 449 origin_bound_cert_service_(context.origin_bound_cert_service), |
| 460 ob_cert_request_handle_(NULL), | 450 ob_cert_request_handle_(NULL), |
| (...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 564 } | 554 } |
| 565 | 555 |
| 566 SSLClientSocket::NextProtoStatus | 556 SSLClientSocket::NextProtoStatus |
| 567 SSLClientSocketNSS::GetNextProto(std::string* proto, | 557 SSLClientSocketNSS::GetNextProto(std::string* proto, |
| 568 std::string* server_protos) { | 558 std::string* server_protos) { |
| 569 *proto = next_proto_; | 559 *proto = next_proto_; |
| 570 *server_protos = server_protos_; | 560 *server_protos = server_protos_; |
| 571 return next_proto_status_; | 561 return next_proto_status_; |
| 572 } | 562 } |
| 573 | 563 |
| 574 int SSLClientSocketNSS::Connect(OldCompletionCallback* callback) { | |
| 575 EnterFunction(""); | |
| 576 DCHECK(transport_.get()); | |
| 577 DCHECK(next_handshake_state_ == STATE_NONE); | |
| 578 DCHECK(!old_user_read_callback_ && user_read_callback_.is_null()); | |
| 579 DCHECK(!user_write_callback_); | |
| 580 DCHECK(!old_user_connect_callback_ && user_connect_callback_.is_null()); | |
| 581 DCHECK(!user_read_buf_); | |
| 582 DCHECK(!user_write_buf_); | |
| 583 | |
| 584 EnsureThreadIdAssigned(); | |
| 585 | |
| 586 net_log_.BeginEvent(NetLog::TYPE_SSL_CONNECT, NULL); | |
| 587 | |
| 588 int rv = Init(); | |
| 589 if (rv != OK) { | |
| 590 net_log_.EndEventWithNetErrorCode(NetLog::TYPE_SSL_CONNECT, rv); | |
| 591 return rv; | |
| 592 } | |
| 593 | |
| 594 rv = InitializeSSLOptions(); | |
| 595 if (rv != OK) { | |
| 596 net_log_.EndEventWithNetErrorCode(NetLog::TYPE_SSL_CONNECT, rv); | |
| 597 return rv; | |
| 598 } | |
| 599 | |
| 600 rv = InitializeSSLPeerName(); | |
| 601 if (rv != OK) { | |
| 602 net_log_.EndEventWithNetErrorCode(NetLog::TYPE_SSL_CONNECT, rv); | |
| 603 return rv; | |
| 604 } | |
| 605 | |
| 606 if (ssl_config_.cached_info_enabled && ssl_host_info_.get()) { | |
| 607 GotoState(STATE_LOAD_SSL_HOST_INFO); | |
| 608 } else { | |
| 609 GotoState(STATE_HANDSHAKE); | |
| 610 } | |
| 611 | |
| 612 rv = DoHandshakeLoop(OK); | |
| 613 if (rv == ERR_IO_PENDING) { | |
| 614 old_user_connect_callback_ = callback; | |
| 615 } else { | |
| 616 net_log_.EndEventWithNetErrorCode(NetLog::TYPE_SSL_CONNECT, rv); | |
| 617 } | |
| 618 | |
| 619 LeaveFunction(""); | |
| 620 return rv > OK ? OK : rv; | |
| 621 } | |
| 622 int SSLClientSocketNSS::Connect(const CompletionCallback& callback) { | 564 int SSLClientSocketNSS::Connect(const CompletionCallback& callback) { |
| 623 EnterFunction(""); | 565 EnterFunction(""); |
| 624 DCHECK(transport_.get()); | 566 DCHECK(transport_.get()); |
| 625 DCHECK(next_handshake_state_ == STATE_NONE); | 567 DCHECK(next_handshake_state_ == STATE_NONE); |
| 626 DCHECK(!old_user_read_callback_ && user_read_callback_.is_null()); | 568 DCHECK(user_read_callback_.is_null()); |
| 627 DCHECK(!user_write_callback_); | 569 DCHECK(user_write_callback_.is_null()); |
| 628 DCHECK(!old_user_connect_callback_ && user_connect_callback_.is_null()); | 570 DCHECK(user_connect_callback_.is_null()); |
| 629 DCHECK(!user_read_buf_); | 571 DCHECK(!user_read_buf_); |
| 630 DCHECK(!user_write_buf_); | 572 DCHECK(!user_write_buf_); |
| 631 | 573 |
| 632 EnsureThreadIdAssigned(); | 574 EnsureThreadIdAssigned(); |
| 633 | 575 |
| 634 net_log_.BeginEvent(NetLog::TYPE_SSL_CONNECT, NULL); | 576 net_log_.BeginEvent(NetLog::TYPE_SSL_CONNECT, NULL); |
| 635 | 577 |
| 636 int rv = Init(); | 578 int rv = Init(); |
| 637 if (rv != OK) { | 579 if (rv != OK) { |
| 638 net_log_.EndEventWithNetErrorCode(NetLog::TYPE_SSL_CONNECT, rv); | 580 net_log_.EndEventWithNetErrorCode(NetLog::TYPE_SSL_CONNECT, rv); |
| (...skipping 27 matching lines...) Expand all Loading... |
| 666 | 608 |
| 667 LeaveFunction(""); | 609 LeaveFunction(""); |
| 668 return rv > OK ? OK : rv; | 610 return rv > OK ? OK : rv; |
| 669 } | 611 } |
| 670 | 612 |
| 671 void SSLClientSocketNSS::Disconnect() { | 613 void SSLClientSocketNSS::Disconnect() { |
| 672 EnterFunction(""); | 614 EnterFunction(""); |
| 673 | 615 |
| 674 CHECK(CalledOnValidThread()); | 616 CHECK(CalledOnValidThread()); |
| 675 | 617 |
| 676 // Shut down anything that may call us back (through buffer_send_callback_, | 618 // Shut down anything that may call us back. |
| 677 // buffer_recv_callback, or handshake_io_callback_). | |
| 678 verifier_.reset(); | 619 verifier_.reset(); |
| 679 transport_->socket()->Disconnect(); | 620 transport_->socket()->Disconnect(); |
| 680 | 621 |
| 681 if (ob_cert_request_handle_ != NULL) { | 622 if (ob_cert_request_handle_ != NULL) { |
| 682 origin_bound_cert_service_->CancelRequest(ob_cert_request_handle_); | 623 origin_bound_cert_service_->CancelRequest(ob_cert_request_handle_); |
| 683 ob_cert_request_handle_ = NULL; | 624 ob_cert_request_handle_ = NULL; |
| 684 } | 625 } |
| 685 | 626 |
| 686 // TODO(wtc): Send SSL close_notify alert. | 627 // TODO(wtc): Send SSL close_notify alert. |
| 687 if (nss_fd_ != NULL) { | 628 if (nss_fd_ != NULL) { |
| 688 PR_Close(nss_fd_); | 629 PR_Close(nss_fd_); |
| 689 nss_fd_ = NULL; | 630 nss_fd_ = NULL; |
| 690 } | 631 } |
| 691 | 632 |
| 692 // Reset object state | 633 // Reset object state. |
| 634 user_connect_callback_.Reset(); |
| 635 user_read_callback_.Reset(); |
| 636 user_write_callback_.Reset(); |
| 693 transport_send_busy_ = false; | 637 transport_send_busy_ = false; |
| 694 transport_recv_busy_ = false; | 638 transport_recv_busy_ = false; |
| 695 old_user_connect_callback_ = NULL; | |
| 696 user_connect_callback_.Reset(); | |
| 697 old_user_read_callback_ = NULL; | |
| 698 user_read_callback_.Reset(); | |
| 699 user_write_callback_ = NULL; | |
| 700 user_read_buf_ = NULL; | 639 user_read_buf_ = NULL; |
| 701 user_read_buf_len_ = 0; | 640 user_read_buf_len_ = 0; |
| 702 user_write_buf_ = NULL; | 641 user_write_buf_ = NULL; |
| 703 user_write_buf_len_ = 0; | 642 user_write_buf_len_ = 0; |
| 704 server_cert_ = NULL; | 643 server_cert_ = NULL; |
| 705 if (server_cert_nss_) { | 644 if (server_cert_nss_) { |
| 706 CERT_DestroyCertificate(server_cert_nss_); | 645 CERT_DestroyCertificate(server_cert_nss_); |
| 707 server_cert_nss_ = NULL; | 646 server_cert_nss_ = NULL; |
| 708 } | 647 } |
| 709 local_server_cert_verify_result_.Reset(); | 648 local_server_cert_verify_result_.Reset(); |
| (...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 804 | 743 |
| 805 base::TimeDelta SSLClientSocketNSS::GetConnectTimeMicros() const { | 744 base::TimeDelta SSLClientSocketNSS::GetConnectTimeMicros() const { |
| 806 if (transport_.get() && transport_->socket()) { | 745 if (transport_.get() && transport_->socket()) { |
| 807 return transport_->socket()->GetConnectTimeMicros(); | 746 return transport_->socket()->GetConnectTimeMicros(); |
| 808 } | 747 } |
| 809 NOTREACHED(); | 748 NOTREACHED(); |
| 810 return base::TimeDelta::FromMicroseconds(-1); | 749 return base::TimeDelta::FromMicroseconds(-1); |
| 811 } | 750 } |
| 812 | 751 |
| 813 int SSLClientSocketNSS::Read(IOBuffer* buf, int buf_len, | 752 int SSLClientSocketNSS::Read(IOBuffer* buf, int buf_len, |
| 814 OldCompletionCallback* callback) { | |
| 815 EnterFunction(buf_len); | |
| 816 DCHECK(completed_handshake_); | |
| 817 DCHECK(next_handshake_state_ == STATE_NONE); | |
| 818 DCHECK(!old_user_read_callback_ && user_read_callback_.is_null()); | |
| 819 DCHECK(!old_user_connect_callback_ && user_connect_callback_.is_null()); | |
| 820 DCHECK(!user_read_buf_); | |
| 821 DCHECK(nss_bufs_); | |
| 822 | |
| 823 user_read_buf_ = buf; | |
| 824 user_read_buf_len_ = buf_len; | |
| 825 | |
| 826 int rv = DoReadLoop(OK); | |
| 827 | |
| 828 if (rv == ERR_IO_PENDING) { | |
| 829 old_user_read_callback_ = callback; | |
| 830 } else { | |
| 831 user_read_buf_ = NULL; | |
| 832 user_read_buf_len_ = 0; | |
| 833 } | |
| 834 LeaveFunction(rv); | |
| 835 return rv; | |
| 836 } | |
| 837 int SSLClientSocketNSS::Read(IOBuffer* buf, int buf_len, | |
| 838 const CompletionCallback& callback) { | 753 const CompletionCallback& callback) { |
| 839 EnterFunction(buf_len); | 754 EnterFunction(buf_len); |
| 840 DCHECK(completed_handshake_); | 755 DCHECK(completed_handshake_); |
| 841 DCHECK(next_handshake_state_ == STATE_NONE); | 756 DCHECK(next_handshake_state_ == STATE_NONE); |
| 842 DCHECK(!old_user_read_callback_ && user_read_callback_.is_null()); | 757 DCHECK(user_read_callback_.is_null()); |
| 843 DCHECK(!old_user_connect_callback_ && user_connect_callback_.is_null()); | 758 DCHECK(user_connect_callback_.is_null()); |
| 844 DCHECK(!user_read_buf_); | 759 DCHECK(!user_read_buf_); |
| 845 DCHECK(nss_bufs_); | 760 DCHECK(nss_bufs_); |
| 846 | 761 |
| 847 user_read_buf_ = buf; | 762 user_read_buf_ = buf; |
| 848 user_read_buf_len_ = buf_len; | 763 user_read_buf_len_ = buf_len; |
| 849 | 764 |
| 850 int rv = DoReadLoop(OK); | 765 int rv = DoReadLoop(OK); |
| 851 | 766 |
| 852 if (rv == ERR_IO_PENDING) { | 767 if (rv == ERR_IO_PENDING) { |
| 853 user_read_callback_ = callback; | 768 user_read_callback_ = callback; |
| 854 } else { | 769 } else { |
| 855 user_read_buf_ = NULL; | 770 user_read_buf_ = NULL; |
| 856 user_read_buf_len_ = 0; | 771 user_read_buf_len_ = 0; |
| 857 } | 772 } |
| 858 LeaveFunction(rv); | 773 LeaveFunction(rv); |
| 859 return rv; | 774 return rv; |
| 860 } | 775 } |
| 861 | 776 |
| 862 int SSLClientSocketNSS::Write(IOBuffer* buf, int buf_len, | 777 int SSLClientSocketNSS::Write(IOBuffer* buf, int buf_len, |
| 863 OldCompletionCallback* callback) { | 778 const CompletionCallback& callback) { |
| 864 EnterFunction(buf_len); | 779 EnterFunction(buf_len); |
| 865 DCHECK(completed_handshake_); | 780 DCHECK(completed_handshake_); |
| 866 DCHECK(next_handshake_state_ == STATE_NONE); | 781 DCHECK(next_handshake_state_ == STATE_NONE); |
| 867 DCHECK(!user_write_callback_); | 782 DCHECK(user_write_callback_.is_null()); |
| 868 DCHECK(!old_user_connect_callback_); | 783 DCHECK(user_connect_callback_.is_null()); |
| 869 DCHECK(!user_write_buf_); | 784 DCHECK(!user_write_buf_); |
| 870 DCHECK(nss_bufs_); | 785 DCHECK(nss_bufs_); |
| 871 | 786 |
| 872 user_write_buf_ = buf; | 787 user_write_buf_ = buf; |
| 873 user_write_buf_len_ = buf_len; | 788 user_write_buf_len_ = buf_len; |
| 874 | 789 |
| 875 if (corked_) { | 790 if (corked_) { |
| 876 corked_ = false; | 791 corked_ = false; |
| 877 uncork_timer_.Reset(); | 792 uncork_timer_.Reset(); |
| 878 } | 793 } |
| (...skipping 338 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1217 } | 1132 } |
| 1218 #endif | 1133 #endif |
| 1219 | 1134 |
| 1220 if (ssl_config_.ssl3_fallback) | 1135 if (ssl_config_.ssl3_fallback) |
| 1221 ssl_connection_status_ |= SSL_CONNECTION_SSL3_FALLBACK; | 1136 ssl_connection_status_ |= SSL_CONNECTION_SSL3_FALLBACK; |
| 1222 } | 1137 } |
| 1223 | 1138 |
| 1224 void SSLClientSocketNSS::DoReadCallback(int rv) { | 1139 void SSLClientSocketNSS::DoReadCallback(int rv) { |
| 1225 EnterFunction(rv); | 1140 EnterFunction(rv); |
| 1226 DCHECK(rv != ERR_IO_PENDING); | 1141 DCHECK(rv != ERR_IO_PENDING); |
| 1227 DCHECK(old_user_read_callback_ || user_read_callback_.is_null()); | 1142 DCHECK(!user_read_callback_.is_null()); |
| 1228 | 1143 |
| 1229 // Since Run may result in Read being called, clear |old_user_read_callback_| | 1144 // Since Run may result in Read being called, clear |user_read_callback_| |
| 1230 // up front. | 1145 // up front. |
| 1231 if (old_user_read_callback_) { | 1146 CompletionCallback c = user_read_callback_; |
| 1232 OldCompletionCallback* c = old_user_read_callback_; | 1147 user_read_callback_.Reset(); |
| 1233 old_user_read_callback_ = NULL; | 1148 user_read_buf_ = NULL; |
| 1234 user_read_buf_ = NULL; | 1149 user_read_buf_len_ = 0; |
| 1235 user_read_buf_len_ = 0; | 1150 c.Run(rv); |
| 1236 c->Run(rv); | |
| 1237 } else { | |
| 1238 CompletionCallback c = user_read_callback_; | |
| 1239 user_read_callback_.Reset(); | |
| 1240 user_read_buf_ = NULL; | |
| 1241 user_read_buf_len_ = 0; | |
| 1242 c.Run(rv); | |
| 1243 } | |
| 1244 LeaveFunction(""); | 1151 LeaveFunction(""); |
| 1245 } | 1152 } |
| 1246 | 1153 |
| 1247 void SSLClientSocketNSS::DoWriteCallback(int rv) { | 1154 void SSLClientSocketNSS::DoWriteCallback(int rv) { |
| 1248 EnterFunction(rv); | 1155 EnterFunction(rv); |
| 1249 DCHECK(rv != ERR_IO_PENDING); | 1156 DCHECK(rv != ERR_IO_PENDING); |
| 1250 DCHECK(user_write_callback_); | 1157 DCHECK(!user_write_callback_.is_null()); |
| 1251 | 1158 |
| 1252 // Since Run may result in Write being called, clear |user_write_callback_| | 1159 // Since Run may result in Write being called, clear |user_write_callback_| |
| 1253 // up front. | 1160 // up front. |
| 1254 OldCompletionCallback* c = user_write_callback_; | 1161 CompletionCallback c = user_write_callback_; |
| 1255 user_write_callback_ = NULL; | 1162 user_write_callback_.Reset(); |
| 1256 user_write_buf_ = NULL; | 1163 user_write_buf_ = NULL; |
| 1257 user_write_buf_len_ = 0; | 1164 user_write_buf_len_ = 0; |
| 1258 c->Run(rv); | 1165 c.Run(rv); |
| 1259 LeaveFunction(""); | 1166 LeaveFunction(""); |
| 1260 } | 1167 } |
| 1261 | 1168 |
| 1262 // As part of Connect(), the SSLClientSocketNSS object performs an SSL | 1169 // As part of Connect(), the SSLClientSocketNSS object performs an SSL |
| 1263 // handshake. This requires network IO, which in turn calls | 1170 // handshake. This requires network IO, which in turn calls |
| 1264 // BufferRecvComplete() with a non-zero byte count. This byte count eventually | 1171 // 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 | 1172 // 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(), | 1173 // callback. For Read() and Write(), that's what we want. But for Connect(), |
| 1267 // the caller expects OK (i.e. 0) for success. | 1174 // the caller expects OK (i.e. 0) for success. |
| 1268 // | 1175 // |
| 1269 void SSLClientSocketNSS::DoConnectCallback(int rv) { | 1176 void SSLClientSocketNSS::DoConnectCallback(int rv) { |
| 1270 EnterFunction(rv); | 1177 EnterFunction(rv); |
| 1271 DCHECK_NE(rv, ERR_IO_PENDING); | 1178 DCHECK_NE(rv, ERR_IO_PENDING); |
| 1272 DCHECK(old_user_connect_callback_ || !user_connect_callback_.is_null()); | 1179 DCHECK(!user_connect_callback_.is_null()); |
| 1273 | 1180 |
| 1274 if (old_user_connect_callback_) { | 1181 CompletionCallback c = user_connect_callback_; |
| 1275 OldCompletionCallback* c = old_user_connect_callback_; | 1182 user_connect_callback_.Reset(); |
| 1276 old_user_connect_callback_ = NULL; | 1183 c.Run(rv > OK ? OK : rv); |
| 1277 c->Run(rv > OK ? OK : rv); | |
| 1278 } else { | |
| 1279 CompletionCallback c = user_connect_callback_; | |
| 1280 user_connect_callback_.Reset(); | |
| 1281 c.Run(rv > OK ? OK : rv); | |
| 1282 } | |
| 1283 LeaveFunction(""); | 1184 LeaveFunction(""); |
| 1284 } | 1185 } |
| 1285 | 1186 |
| 1286 void SSLClientSocketNSS::OnHandshakeIOComplete(int result) { | 1187 void SSLClientSocketNSS::OnHandshakeIOComplete(int result) { |
| 1287 EnterFunction(result); | 1188 EnterFunction(result); |
| 1288 int rv = DoHandshakeLoop(result); | 1189 int rv = DoHandshakeLoop(result); |
| 1289 if (rv != ERR_IO_PENDING) { | 1190 if (rv != ERR_IO_PENDING) { |
| 1290 net_log_.EndEventWithNetErrorCode(net::NetLog::TYPE_SSL_CONNECT, rv); | 1191 net_log_.EndEventWithNetErrorCode(net::NetLog::TYPE_SSL_CONNECT, rv); |
| 1291 DoConnectCallback(rv); | 1192 DoConnectCallback(rv); |
| 1292 } | 1193 } |
| (...skipping 184 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1477 | 1378 |
| 1478 rv = SSL_SetPredictedPeerCertificates(nss_fd_, certs.get(), certs_in.size()); | 1379 rv = SSL_SetPredictedPeerCertificates(nss_fd_, certs.get(), certs_in.size()); |
| 1479 DestroyCertificates(&certs[0], certs_in.size()); | 1380 DestroyCertificates(&certs[0], certs_in.size()); |
| 1480 DCHECK_EQ(SECSuccess, rv); | 1381 DCHECK_EQ(SECSuccess, rv); |
| 1481 | 1382 |
| 1482 return true; | 1383 return true; |
| 1483 } | 1384 } |
| 1484 | 1385 |
| 1485 int SSLClientSocketNSS::DoLoadSSLHostInfo() { | 1386 int SSLClientSocketNSS::DoLoadSSLHostInfo() { |
| 1486 EnterFunction(""); | 1387 EnterFunction(""); |
| 1487 int rv = ssl_host_info_->WaitForDataReady(handshake_io_callback_); | 1388 int rv = ssl_host_info_->WaitForDataReady( |
| 1389 base::Bind(&SSLClientSocketNSS::OnHandshakeIOComplete, |
| 1390 base::Unretained(this))); |
| 1488 GotoState(STATE_HANDSHAKE); | 1391 GotoState(STATE_HANDSHAKE); |
| 1489 | 1392 |
| 1490 if (rv == OK) { | 1393 if (rv == OK) { |
| 1491 if (!LoadSSLHostInfo()) | 1394 if (!LoadSSLHostInfo()) |
| 1492 LOG(WARNING) << "LoadSSLHostInfo failed: " << host_and_port_.ToString(); | 1395 LOG(WARNING) << "LoadSSLHostInfo failed: " << host_and_port_.ToString(); |
| 1493 } else { | 1396 } else { |
| 1494 DCHECK_EQ(ERR_IO_PENDING, rv); | 1397 DCHECK_EQ(ERR_IO_PENDING, rv); |
| 1495 GotoState(STATE_LOAD_SSL_HOST_INFO); | 1398 GotoState(STATE_LOAD_SSL_HOST_INFO); |
| 1496 } | 1399 } |
| 1497 | 1400 |
| (...skipping 288 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1786 // chain. So, if the prediction was correct, we should wait for that | 1689 // chain. So, if the prediction was correct, we should wait for that |
| 1787 // verification to finish rather than start our own. | 1690 // verification to finish rather than start our own. |
| 1788 net_log_.AddEvent(NetLog::TYPE_SSL_VERIFICATION_MERGED, NULL); | 1691 net_log_.AddEvent(NetLog::TYPE_SSL_VERIFICATION_MERGED, NULL); |
| 1789 UMA_HISTOGRAM_ENUMERATION("Net.SSLVerificationMerged", 1 /* true */, 2); | 1692 UMA_HISTOGRAM_ENUMERATION("Net.SSLVerificationMerged", 1 /* true */, 2); |
| 1790 base::TimeTicks end_time = ssl_host_info_->verification_end_time(); | 1693 base::TimeTicks end_time = ssl_host_info_->verification_end_time(); |
| 1791 if (end_time.is_null()) | 1694 if (end_time.is_null()) |
| 1792 end_time = base::TimeTicks::Now(); | 1695 end_time = base::TimeTicks::Now(); |
| 1793 UMA_HISTOGRAM_TIMES("Net.SSLVerificationMergedMsSaved", | 1696 UMA_HISTOGRAM_TIMES("Net.SSLVerificationMergedMsSaved", |
| 1794 end_time - ssl_host_info_->verification_start_time()); | 1697 end_time - ssl_host_info_->verification_start_time()); |
| 1795 server_cert_verify_result_ = &ssl_host_info_->cert_verify_result(); | 1698 server_cert_verify_result_ = &ssl_host_info_->cert_verify_result(); |
| 1796 return ssl_host_info_->WaitForCertVerification(handshake_io_callback_); | 1699 return ssl_host_info_->WaitForCertVerification( |
| 1700 base::Bind(&SSLClientSocketNSS::OnHandshakeIOComplete, |
| 1701 base::Unretained(this))); |
| 1797 } else { | 1702 } else { |
| 1798 UMA_HISTOGRAM_ENUMERATION("Net.SSLVerificationMerged", 0 /* false */, 2); | 1703 UMA_HISTOGRAM_ENUMERATION("Net.SSLVerificationMerged", 0 /* false */, 2); |
| 1799 } | 1704 } |
| 1800 | 1705 |
| 1801 int flags = 0; | 1706 int flags = 0; |
| 1802 if (ssl_config_.rev_checking_enabled) | 1707 if (ssl_config_.rev_checking_enabled) |
| 1803 flags |= X509Certificate::VERIFY_REV_CHECKING_ENABLED; | 1708 flags |= X509Certificate::VERIFY_REV_CHECKING_ENABLED; |
| 1804 if (ssl_config_.verify_ev_cert) | 1709 if (ssl_config_.verify_ev_cert) |
| 1805 flags |= X509Certificate::VERIFY_EV_CERT; | 1710 flags |= X509Certificate::VERIFY_EV_CERT; |
| 1806 verifier_.reset(new SingleRequestCertVerifier(cert_verifier_)); | 1711 verifier_.reset(new SingleRequestCertVerifier(cert_verifier_)); |
| (...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1889 // http://crbug.com/15630 for more info. | 1794 // http://crbug.com/15630 for more info. |
| 1890 | 1795 |
| 1891 // TODO(hclam): Skip logging if server cert was expected to be bad because | 1796 // TODO(hclam): Skip logging if server cert was expected to be bad because |
| 1892 // |server_cert_verify_results_| doesn't contain all the information about | 1797 // |server_cert_verify_results_| doesn't contain all the information about |
| 1893 // the cert. | 1798 // the cert. |
| 1894 if (result == OK) | 1799 if (result == OK) |
| 1895 LogConnectionTypeMetrics(); | 1800 LogConnectionTypeMetrics(); |
| 1896 | 1801 |
| 1897 completed_handshake_ = true; | 1802 completed_handshake_ = true; |
| 1898 | 1803 |
| 1899 if (old_user_read_callback_ || !user_read_callback_.is_null()) { | 1804 if (!user_read_callback_.is_null()) { |
| 1900 int rv = DoReadLoop(OK); | 1805 int rv = DoReadLoop(OK); |
| 1901 if (rv != ERR_IO_PENDING) | 1806 if (rv != ERR_IO_PENDING) |
| 1902 DoReadCallback(rv); | 1807 DoReadCallback(rv); |
| 1903 } | 1808 } |
| 1904 | 1809 |
| 1905 // Exit DoHandshakeLoop and return the result to the caller to Connect. | 1810 // Exit DoHandshakeLoop and return the result to the caller to Connect. |
| 1906 DCHECK(next_handshake_state_ == STATE_NONE); | 1811 DCHECK(next_handshake_state_ == STATE_NONE); |
| 1907 return result; | 1812 return result; |
| 1908 } | 1813 } |
| 1909 | 1814 |
| (...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2065 const unsigned int len = len1 + len2; | 1970 const unsigned int len = len1 + len2; |
| 2066 | 1971 |
| 2067 if (corked_ && len < kRecvBufferSize / 2) | 1972 if (corked_ && len < kRecvBufferSize / 2) |
| 2068 return 0; | 1973 return 0; |
| 2069 | 1974 |
| 2070 int rv = 0; | 1975 int rv = 0; |
| 2071 if (len) { | 1976 if (len) { |
| 2072 scoped_refptr<IOBuffer> send_buffer(new IOBuffer(len)); | 1977 scoped_refptr<IOBuffer> send_buffer(new IOBuffer(len)); |
| 2073 memcpy(send_buffer->data(), buf1, len1); | 1978 memcpy(send_buffer->data(), buf1, len1); |
| 2074 memcpy(send_buffer->data() + len1, buf2, len2); | 1979 memcpy(send_buffer->data() + len1, buf2, len2); |
| 2075 rv = transport_->socket()->Write(send_buffer, len, | 1980 rv = transport_->socket()->Write( |
| 2076 &buffer_send_callback_); | 1981 send_buffer, len, |
| 1982 base::Bind(&SSLClientSocketNSS::BufferSendComplete, |
| 1983 base::Unretained(this))); |
| 2077 if (rv == ERR_IO_PENDING) { | 1984 if (rv == ERR_IO_PENDING) { |
| 2078 transport_send_busy_ = true; | 1985 transport_send_busy_ = true; |
| 2079 } else { | 1986 } else { |
| 2080 memio_PutWriteResult(nss_bufs_, MapErrorToNSS(rv)); | 1987 memio_PutWriteResult(nss_bufs_, MapErrorToNSS(rv)); |
| 2081 } | 1988 } |
| 2082 } | 1989 } |
| 2083 | 1990 |
| 2084 LeaveFunction(rv); | 1991 LeaveFunction(rv); |
| 2085 return rv; | 1992 return rv; |
| 2086 } | 1993 } |
| (...skipping 11 matching lines...) Expand all Loading... |
| 2098 | 2005 |
| 2099 char *buf; | 2006 char *buf; |
| 2100 int nb = memio_GetReadParams(nss_bufs_, &buf); | 2007 int nb = memio_GetReadParams(nss_bufs_, &buf); |
| 2101 EnterFunction(nb); | 2008 EnterFunction(nb); |
| 2102 int rv; | 2009 int rv; |
| 2103 if (!nb) { | 2010 if (!nb) { |
| 2104 // buffer too full to read into, so no I/O possible at moment | 2011 // buffer too full to read into, so no I/O possible at moment |
| 2105 rv = ERR_IO_PENDING; | 2012 rv = ERR_IO_PENDING; |
| 2106 } else { | 2013 } else { |
| 2107 recv_buffer_ = new IOBuffer(nb); | 2014 recv_buffer_ = new IOBuffer(nb); |
| 2108 rv = transport_->socket()->Read(recv_buffer_, nb, &buffer_recv_callback_); | 2015 rv = transport_->socket()->Read( |
| 2016 recv_buffer_, nb, |
| 2017 base::Bind(&SSLClientSocketNSS::BufferRecvComplete, |
| 2018 base::Unretained(this))); |
| 2109 if (rv == ERR_IO_PENDING) { | 2019 if (rv == ERR_IO_PENDING) { |
| 2110 transport_recv_busy_ = true; | 2020 transport_recv_busy_ = true; |
| 2111 } else { | 2021 } else { |
| 2112 if (rv > 0) | 2022 if (rv > 0) |
| 2113 memcpy(buf, recv_buffer_->data(), rv); | 2023 memcpy(buf, recv_buffer_->data(), rv); |
| 2114 memio_PutReadResult(nss_bufs_, MapErrorToNSS(rv)); | 2024 memio_PutReadResult(nss_bufs_, MapErrorToNSS(rv)); |
| 2115 recv_buffer_ = NULL; | 2025 recv_buffer_ = NULL; |
| 2116 } | 2026 } |
| 2117 } | 2027 } |
| 2118 LeaveFunction(rv); | 2028 LeaveFunction(rv); |
| (...skipping 635 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2754 valid_thread_id_ = base::PlatformThread::CurrentId(); | 2664 valid_thread_id_ = base::PlatformThread::CurrentId(); |
| 2755 } | 2665 } |
| 2756 | 2666 |
| 2757 bool SSLClientSocketNSS::CalledOnValidThread() const { | 2667 bool SSLClientSocketNSS::CalledOnValidThread() const { |
| 2758 EnsureThreadIdAssigned(); | 2668 EnsureThreadIdAssigned(); |
| 2759 base::AutoLock auto_lock(lock_); | 2669 base::AutoLock auto_lock(lock_); |
| 2760 return valid_thread_id_ == base::PlatformThread::CurrentId(); | 2670 return valid_thread_id_ == base::PlatformThread::CurrentId(); |
| 2761 } | 2671 } |
| 2762 | 2672 |
| 2763 } // namespace net | 2673 } // namespace net |
| OLD | NEW |