| 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 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 563 } | 553 } |
| 564 | 554 |
| 565 SSLClientSocket::NextProtoStatus | 555 SSLClientSocket::NextProtoStatus |
| 566 SSLClientSocketNSS::GetNextProto(std::string* proto, | 556 SSLClientSocketNSS::GetNextProto(std::string* proto, |
| 567 std::string* server_protos) { | 557 std::string* server_protos) { |
| 568 *proto = next_proto_; | 558 *proto = next_proto_; |
| 569 *server_protos = server_protos_; | 559 *server_protos = server_protos_; |
| 570 return next_proto_status_; | 560 return next_proto_status_; |
| 571 } | 561 } |
| 572 | 562 |
| 573 int SSLClientSocketNSS::Connect(OldCompletionCallback* callback) { | |
| 574 EnterFunction(""); | |
| 575 DCHECK(transport_.get()); | |
| 576 DCHECK(next_handshake_state_ == STATE_NONE); | |
| 577 DCHECK(!old_user_read_callback_ && user_read_callback_.is_null()); | |
| 578 DCHECK(!user_write_callback_); | |
| 579 DCHECK(!old_user_connect_callback_ && user_connect_callback_.is_null()); | |
| 580 DCHECK(!user_read_buf_); | |
| 581 DCHECK(!user_write_buf_); | |
| 582 | |
| 583 EnsureThreadIdAssigned(); | |
| 584 | |
| 585 net_log_.BeginEvent(NetLog::TYPE_SSL_CONNECT, NULL); | |
| 586 | |
| 587 int rv = Init(); | |
| 588 if (rv != OK) { | |
| 589 net_log_.EndEventWithNetErrorCode(NetLog::TYPE_SSL_CONNECT, rv); | |
| 590 return rv; | |
| 591 } | |
| 592 | |
| 593 rv = InitializeSSLOptions(); | |
| 594 if (rv != OK) { | |
| 595 net_log_.EndEventWithNetErrorCode(NetLog::TYPE_SSL_CONNECT, rv); | |
| 596 return rv; | |
| 597 } | |
| 598 | |
| 599 rv = InitializeSSLPeerName(); | |
| 600 if (rv != OK) { | |
| 601 net_log_.EndEventWithNetErrorCode(NetLog::TYPE_SSL_CONNECT, rv); | |
| 602 return rv; | |
| 603 } | |
| 604 | |
| 605 if (ssl_config_.cached_info_enabled && ssl_host_info_.get()) { | |
| 606 GotoState(STATE_LOAD_SSL_HOST_INFO); | |
| 607 } else { | |
| 608 GotoState(STATE_HANDSHAKE); | |
| 609 } | |
| 610 | |
| 611 rv = DoHandshakeLoop(OK); | |
| 612 if (rv == ERR_IO_PENDING) { | |
| 613 old_user_connect_callback_ = callback; | |
| 614 } else { | |
| 615 net_log_.EndEventWithNetErrorCode(NetLog::TYPE_SSL_CONNECT, rv); | |
| 616 } | |
| 617 | |
| 618 LeaveFunction(""); | |
| 619 return rv > OK ? OK : rv; | |
| 620 } | |
| 621 int SSLClientSocketNSS::Connect(const CompletionCallback& callback) { | 563 int SSLClientSocketNSS::Connect(const CompletionCallback& callback) { |
| 622 EnterFunction(""); | 564 EnterFunction(""); |
| 623 DCHECK(transport_.get()); | 565 DCHECK(transport_.get()); |
| 624 DCHECK(next_handshake_state_ == STATE_NONE); | 566 DCHECK(next_handshake_state_ == STATE_NONE); |
| 625 DCHECK(!old_user_read_callback_ && user_read_callback_.is_null()); | 567 DCHECK(user_read_callback_.is_null()); |
| 626 DCHECK(!user_write_callback_); | 568 DCHECK(user_write_callback_.is_null()); |
| 627 DCHECK(!old_user_connect_callback_ && user_connect_callback_.is_null()); | 569 DCHECK(user_connect_callback_.is_null()); |
| 628 DCHECK(!user_read_buf_); | 570 DCHECK(!user_read_buf_); |
| 629 DCHECK(!user_write_buf_); | 571 DCHECK(!user_write_buf_); |
| 630 | 572 |
| 631 EnsureThreadIdAssigned(); | 573 EnsureThreadIdAssigned(); |
| 632 | 574 |
| 633 net_log_.BeginEvent(NetLog::TYPE_SSL_CONNECT, NULL); | 575 net_log_.BeginEvent(NetLog::TYPE_SSL_CONNECT, NULL); |
| 634 | 576 |
| 635 int rv = Init(); | 577 int rv = Init(); |
| 636 if (rv != OK) { | 578 if (rv != OK) { |
| 637 net_log_.EndEventWithNetErrorCode(NetLog::TYPE_SSL_CONNECT, rv); | 579 net_log_.EndEventWithNetErrorCode(NetLog::TYPE_SSL_CONNECT, rv); |
| (...skipping 27 matching lines...) Expand all Loading... |
| 665 | 607 |
| 666 LeaveFunction(""); | 608 LeaveFunction(""); |
| 667 return rv > OK ? OK : rv; | 609 return rv > OK ? OK : rv; |
| 668 } | 610 } |
| 669 | 611 |
| 670 void SSLClientSocketNSS::Disconnect() { | 612 void SSLClientSocketNSS::Disconnect() { |
| 671 EnterFunction(""); | 613 EnterFunction(""); |
| 672 | 614 |
| 673 CHECK(CalledOnValidThread()); | 615 CHECK(CalledOnValidThread()); |
| 674 | 616 |
| 675 // Shut down anything that may call us back (through buffer_send_callback_, | 617 // Shut down anything that may call us back. |
| 676 // buffer_recv_callback, or handshake_io_callback_). | |
| 677 verifier_.reset(); | 618 verifier_.reset(); |
| 678 transport_->socket()->Disconnect(); | 619 transport_->socket()->Disconnect(); |
| 679 | 620 |
| 680 if (ob_cert_request_handle_ != NULL) { | 621 if (ob_cert_request_handle_ != NULL) { |
| 681 origin_bound_cert_service_->CancelRequest(ob_cert_request_handle_); | 622 origin_bound_cert_service_->CancelRequest(ob_cert_request_handle_); |
| 682 ob_cert_request_handle_ = NULL; | 623 ob_cert_request_handle_ = NULL; |
| 683 } | 624 } |
| 684 | 625 |
| 685 // TODO(wtc): Send SSL close_notify alert. | 626 // TODO(wtc): Send SSL close_notify alert. |
| 686 if (nss_fd_ != NULL) { | 627 if (nss_fd_ != NULL) { |
| 687 PR_Close(nss_fd_); | 628 PR_Close(nss_fd_); |
| 688 nss_fd_ = NULL; | 629 nss_fd_ = NULL; |
| 689 } | 630 } |
| 690 | 631 |
| 691 // Reset object state | 632 // Reset object state. |
| 633 user_connect_callback_.Reset(); |
| 634 user_read_callback_.Reset(); |
| 635 user_write_callback_.Reset(); |
| 692 transport_send_busy_ = false; | 636 transport_send_busy_ = false; |
| 693 transport_recv_busy_ = false; | 637 transport_recv_busy_ = false; |
| 694 old_user_connect_callback_ = NULL; | |
| 695 user_connect_callback_.Reset(); | |
| 696 old_user_read_callback_ = NULL; | |
| 697 user_read_callback_.Reset(); | |
| 698 user_write_callback_ = NULL; | |
| 699 user_read_buf_ = NULL; | 638 user_read_buf_ = NULL; |
| 700 user_read_buf_len_ = 0; | 639 user_read_buf_len_ = 0; |
| 701 user_write_buf_ = NULL; | 640 user_write_buf_ = NULL; |
| 702 user_write_buf_len_ = 0; | 641 user_write_buf_len_ = 0; |
| 703 server_cert_ = NULL; | 642 server_cert_ = NULL; |
| 704 if (server_cert_nss_) { | 643 if (server_cert_nss_) { |
| 705 CERT_DestroyCertificate(server_cert_nss_); | 644 CERT_DestroyCertificate(server_cert_nss_); |
| 706 server_cert_nss_ = NULL; | 645 server_cert_nss_ = NULL; |
| 707 } | 646 } |
| 708 local_server_cert_verify_result_.Reset(); | 647 local_server_cert_verify_result_.Reset(); |
| (...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 803 | 742 |
| 804 base::TimeDelta SSLClientSocketNSS::GetConnectTimeMicros() const { | 743 base::TimeDelta SSLClientSocketNSS::GetConnectTimeMicros() const { |
| 805 if (transport_.get() && transport_->socket()) { | 744 if (transport_.get() && transport_->socket()) { |
| 806 return transport_->socket()->GetConnectTimeMicros(); | 745 return transport_->socket()->GetConnectTimeMicros(); |
| 807 } | 746 } |
| 808 NOTREACHED(); | 747 NOTREACHED(); |
| 809 return base::TimeDelta::FromMicroseconds(-1); | 748 return base::TimeDelta::FromMicroseconds(-1); |
| 810 } | 749 } |
| 811 | 750 |
| 812 int SSLClientSocketNSS::Read(IOBuffer* buf, int buf_len, | 751 int SSLClientSocketNSS::Read(IOBuffer* buf, int buf_len, |
| 813 OldCompletionCallback* callback) { | |
| 814 EnterFunction(buf_len); | |
| 815 DCHECK(completed_handshake_); | |
| 816 DCHECK(next_handshake_state_ == STATE_NONE); | |
| 817 DCHECK(!old_user_read_callback_ && user_read_callback_.is_null()); | |
| 818 DCHECK(!old_user_connect_callback_ && user_connect_callback_.is_null()); | |
| 819 DCHECK(!user_read_buf_); | |
| 820 DCHECK(nss_bufs_); | |
| 821 | |
| 822 user_read_buf_ = buf; | |
| 823 user_read_buf_len_ = buf_len; | |
| 824 | |
| 825 int rv = DoReadLoop(OK); | |
| 826 | |
| 827 if (rv == ERR_IO_PENDING) { | |
| 828 old_user_read_callback_ = callback; | |
| 829 } else { | |
| 830 user_read_buf_ = NULL; | |
| 831 user_read_buf_len_ = 0; | |
| 832 } | |
| 833 LeaveFunction(rv); | |
| 834 return rv; | |
| 835 } | |
| 836 int SSLClientSocketNSS::Read(IOBuffer* buf, int buf_len, | |
| 837 const CompletionCallback& callback) { | 752 const CompletionCallback& callback) { |
| 838 EnterFunction(buf_len); | 753 EnterFunction(buf_len); |
| 839 DCHECK(completed_handshake_); | 754 DCHECK(completed_handshake_); |
| 840 DCHECK(next_handshake_state_ == STATE_NONE); | 755 DCHECK(next_handshake_state_ == STATE_NONE); |
| 841 DCHECK(!old_user_read_callback_ && user_read_callback_.is_null()); | 756 DCHECK(user_read_callback_.is_null()); |
| 842 DCHECK(!old_user_connect_callback_ && user_connect_callback_.is_null()); | 757 DCHECK(user_connect_callback_.is_null()); |
| 843 DCHECK(!user_read_buf_); | 758 DCHECK(!user_read_buf_); |
| 844 DCHECK(nss_bufs_); | 759 DCHECK(nss_bufs_); |
| 845 | 760 |
| 846 user_read_buf_ = buf; | 761 user_read_buf_ = buf; |
| 847 user_read_buf_len_ = buf_len; | 762 user_read_buf_len_ = buf_len; |
| 848 | 763 |
| 849 int rv = DoReadLoop(OK); | 764 int rv = DoReadLoop(OK); |
| 850 | 765 |
| 851 if (rv == ERR_IO_PENDING) { | 766 if (rv == ERR_IO_PENDING) { |
| 852 user_read_callback_ = callback; | 767 user_read_callback_ = callback; |
| 853 } else { | 768 } else { |
| 854 user_read_buf_ = NULL; | 769 user_read_buf_ = NULL; |
| 855 user_read_buf_len_ = 0; | 770 user_read_buf_len_ = 0; |
| 856 } | 771 } |
| 857 LeaveFunction(rv); | 772 LeaveFunction(rv); |
| 858 return rv; | 773 return rv; |
| 859 } | 774 } |
| 860 | 775 |
| 861 int SSLClientSocketNSS::Write(IOBuffer* buf, int buf_len, | 776 int SSLClientSocketNSS::Write(IOBuffer* buf, int buf_len, |
| 862 OldCompletionCallback* callback) { | 777 const CompletionCallback& callback) { |
| 863 EnterFunction(buf_len); | 778 EnterFunction(buf_len); |
| 864 DCHECK(completed_handshake_); | 779 DCHECK(completed_handshake_); |
| 865 DCHECK(next_handshake_state_ == STATE_NONE); | 780 DCHECK(next_handshake_state_ == STATE_NONE); |
| 866 DCHECK(!user_write_callback_); | 781 DCHECK(user_write_callback_.is_null()); |
| 867 DCHECK(!old_user_connect_callback_); | 782 DCHECK(user_connect_callback_.is_null()); |
| 868 DCHECK(!user_write_buf_); | 783 DCHECK(!user_write_buf_); |
| 869 DCHECK(nss_bufs_); | 784 DCHECK(nss_bufs_); |
| 870 | 785 |
| 871 user_write_buf_ = buf; | 786 user_write_buf_ = buf; |
| 872 user_write_buf_len_ = buf_len; | 787 user_write_buf_len_ = buf_len; |
| 873 | 788 |
| 874 if (corked_) { | 789 if (corked_) { |
| 875 corked_ = false; | 790 corked_ = false; |
| 876 uncork_timer_.Reset(); | 791 uncork_timer_.Reset(); |
| 877 } | 792 } |
| (...skipping 338 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1216 } | 1131 } |
| 1217 #endif | 1132 #endif |
| 1218 | 1133 |
| 1219 if (ssl_config_.ssl3_fallback) | 1134 if (ssl_config_.ssl3_fallback) |
| 1220 ssl_connection_status_ |= SSL_CONNECTION_SSL3_FALLBACK; | 1135 ssl_connection_status_ |= SSL_CONNECTION_SSL3_FALLBACK; |
| 1221 } | 1136 } |
| 1222 | 1137 |
| 1223 void SSLClientSocketNSS::DoReadCallback(int rv) { | 1138 void SSLClientSocketNSS::DoReadCallback(int rv) { |
| 1224 EnterFunction(rv); | 1139 EnterFunction(rv); |
| 1225 DCHECK(rv != ERR_IO_PENDING); | 1140 DCHECK(rv != ERR_IO_PENDING); |
| 1226 DCHECK(old_user_read_callback_ || user_read_callback_.is_null()); | 1141 DCHECK(!user_read_callback_.is_null()); |
| 1227 | 1142 |
| 1228 // Since Run may result in Read being called, clear |old_user_read_callback_| | 1143 // Since Run may result in Read being called, clear |user_read_callback_| |
| 1229 // up front. | 1144 // up front. |
| 1230 if (old_user_read_callback_) { | 1145 CompletionCallback c = user_read_callback_; |
| 1231 OldCompletionCallback* c = old_user_read_callback_; | 1146 user_read_callback_.Reset(); |
| 1232 old_user_read_callback_ = NULL; | 1147 user_read_buf_ = NULL; |
| 1233 user_read_buf_ = NULL; | 1148 user_read_buf_len_ = 0; |
| 1234 user_read_buf_len_ = 0; | 1149 c.Run(rv); |
| 1235 c->Run(rv); | |
| 1236 } else { | |
| 1237 CompletionCallback c = user_read_callback_; | |
| 1238 user_read_callback_.Reset(); | |
| 1239 user_read_buf_ = NULL; | |
| 1240 user_read_buf_len_ = 0; | |
| 1241 c.Run(rv); | |
| 1242 } | |
| 1243 LeaveFunction(""); | 1150 LeaveFunction(""); |
| 1244 } | 1151 } |
| 1245 | 1152 |
| 1246 void SSLClientSocketNSS::DoWriteCallback(int rv) { | 1153 void SSLClientSocketNSS::DoWriteCallback(int rv) { |
| 1247 EnterFunction(rv); | 1154 EnterFunction(rv); |
| 1248 DCHECK(rv != ERR_IO_PENDING); | 1155 DCHECK(rv != ERR_IO_PENDING); |
| 1249 DCHECK(user_write_callback_); | 1156 DCHECK(!user_write_callback_.is_null()); |
| 1250 | 1157 |
| 1251 // Since Run may result in Write being called, clear |user_write_callback_| | 1158 // Since Run may result in Write being called, clear |user_write_callback_| |
| 1252 // up front. | 1159 // up front. |
| 1253 OldCompletionCallback* c = user_write_callback_; | 1160 CompletionCallback c = user_write_callback_; |
| 1254 user_write_callback_ = NULL; | 1161 user_write_callback_.Reset(); |
| 1255 user_write_buf_ = NULL; | 1162 user_write_buf_ = NULL; |
| 1256 user_write_buf_len_ = 0; | 1163 user_write_buf_len_ = 0; |
| 1257 c->Run(rv); | 1164 c.Run(rv); |
| 1258 LeaveFunction(""); | 1165 LeaveFunction(""); |
| 1259 } | 1166 } |
| 1260 | 1167 |
| 1261 // As part of Connect(), the SSLClientSocketNSS object performs an SSL | 1168 // As part of Connect(), the SSLClientSocketNSS object performs an SSL |
| 1262 // handshake. This requires network IO, which in turn calls | 1169 // handshake. This requires network IO, which in turn calls |
| 1263 // BufferRecvComplete() with a non-zero byte count. This byte count eventually | 1170 // BufferRecvComplete() with a non-zero byte count. This byte count eventually |
| 1264 // winds its way through the state machine and ends up being passed to the | 1171 // winds its way through the state machine and ends up being passed to the |
| 1265 // callback. For Read() and Write(), that's what we want. But for Connect(), | 1172 // callback. For Read() and Write(), that's what we want. But for Connect(), |
| 1266 // the caller expects OK (i.e. 0) for success. | 1173 // the caller expects OK (i.e. 0) for success. |
| 1267 // | 1174 // |
| 1268 void SSLClientSocketNSS::DoConnectCallback(int rv) { | 1175 void SSLClientSocketNSS::DoConnectCallback(int rv) { |
| 1269 EnterFunction(rv); | 1176 EnterFunction(rv); |
| 1270 DCHECK_NE(rv, ERR_IO_PENDING); | 1177 DCHECK_NE(rv, ERR_IO_PENDING); |
| 1271 DCHECK(old_user_connect_callback_ || !user_connect_callback_.is_null()); | 1178 DCHECK(!user_connect_callback_.is_null()); |
| 1272 | 1179 |
| 1273 if (old_user_connect_callback_) { | 1180 CompletionCallback c = user_connect_callback_; |
| 1274 OldCompletionCallback* c = old_user_connect_callback_; | 1181 user_connect_callback_.Reset(); |
| 1275 old_user_connect_callback_ = NULL; | 1182 c.Run(rv > OK ? OK : rv); |
| 1276 c->Run(rv > OK ? OK : rv); | |
| 1277 } else { | |
| 1278 CompletionCallback c = user_connect_callback_; | |
| 1279 user_connect_callback_.Reset(); | |
| 1280 c.Run(rv > OK ? OK : rv); | |
| 1281 } | |
| 1282 LeaveFunction(""); | 1183 LeaveFunction(""); |
| 1283 } | 1184 } |
| 1284 | 1185 |
| 1285 void SSLClientSocketNSS::OnHandshakeIOComplete(int result) { | 1186 void SSLClientSocketNSS::OnHandshakeIOComplete(int result) { |
| 1286 EnterFunction(result); | 1187 EnterFunction(result); |
| 1287 int rv = DoHandshakeLoop(result); | 1188 int rv = DoHandshakeLoop(result); |
| 1288 if (rv != ERR_IO_PENDING) { | 1189 if (rv != ERR_IO_PENDING) { |
| 1289 net_log_.EndEventWithNetErrorCode(net::NetLog::TYPE_SSL_CONNECT, rv); | 1190 net_log_.EndEventWithNetErrorCode(net::NetLog::TYPE_SSL_CONNECT, rv); |
| 1290 DoConnectCallback(rv); | 1191 DoConnectCallback(rv); |
| 1291 } | 1192 } |
| (...skipping 184 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1476 | 1377 |
| 1477 rv = SSL_SetPredictedPeerCertificates(nss_fd_, certs.get(), certs_in.size()); | 1378 rv = SSL_SetPredictedPeerCertificates(nss_fd_, certs.get(), certs_in.size()); |
| 1478 DestroyCertificates(&certs[0], certs_in.size()); | 1379 DestroyCertificates(&certs[0], certs_in.size()); |
| 1479 DCHECK_EQ(SECSuccess, rv); | 1380 DCHECK_EQ(SECSuccess, rv); |
| 1480 | 1381 |
| 1481 return true; | 1382 return true; |
| 1482 } | 1383 } |
| 1483 | 1384 |
| 1484 int SSLClientSocketNSS::DoLoadSSLHostInfo() { | 1385 int SSLClientSocketNSS::DoLoadSSLHostInfo() { |
| 1485 EnterFunction(""); | 1386 EnterFunction(""); |
| 1486 int rv = ssl_host_info_->WaitForDataReady(handshake_io_callback_); | 1387 int rv = ssl_host_info_->WaitForDataReady( |
| 1388 base::Bind(&SSLClientSocketNSS::OnHandshakeIOComplete, |
| 1389 base::Unretained(this))); |
| 1487 GotoState(STATE_HANDSHAKE); | 1390 GotoState(STATE_HANDSHAKE); |
| 1488 | 1391 |
| 1489 if (rv == OK) { | 1392 if (rv == OK) { |
| 1490 if (!LoadSSLHostInfo()) | 1393 if (!LoadSSLHostInfo()) |
| 1491 LOG(WARNING) << "LoadSSLHostInfo failed: " << host_and_port_.ToString(); | 1394 LOG(WARNING) << "LoadSSLHostInfo failed: " << host_and_port_.ToString(); |
| 1492 } else { | 1395 } else { |
| 1493 DCHECK_EQ(ERR_IO_PENDING, rv); | 1396 DCHECK_EQ(ERR_IO_PENDING, rv); |
| 1494 GotoState(STATE_LOAD_SSL_HOST_INFO); | 1397 GotoState(STATE_LOAD_SSL_HOST_INFO); |
| 1495 } | 1398 } |
| 1496 | 1399 |
| (...skipping 282 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1779 // chain. So, if the prediction was correct, we should wait for that | 1682 // chain. So, if the prediction was correct, we should wait for that |
| 1780 // verification to finish rather than start our own. | 1683 // verification to finish rather than start our own. |
| 1781 net_log_.AddEvent(NetLog::TYPE_SSL_VERIFICATION_MERGED, NULL); | 1684 net_log_.AddEvent(NetLog::TYPE_SSL_VERIFICATION_MERGED, NULL); |
| 1782 UMA_HISTOGRAM_ENUMERATION("Net.SSLVerificationMerged", 1 /* true */, 2); | 1685 UMA_HISTOGRAM_ENUMERATION("Net.SSLVerificationMerged", 1 /* true */, 2); |
| 1783 base::TimeTicks end_time = ssl_host_info_->verification_end_time(); | 1686 base::TimeTicks end_time = ssl_host_info_->verification_end_time(); |
| 1784 if (end_time.is_null()) | 1687 if (end_time.is_null()) |
| 1785 end_time = base::TimeTicks::Now(); | 1688 end_time = base::TimeTicks::Now(); |
| 1786 UMA_HISTOGRAM_TIMES("Net.SSLVerificationMergedMsSaved", | 1689 UMA_HISTOGRAM_TIMES("Net.SSLVerificationMergedMsSaved", |
| 1787 end_time - ssl_host_info_->verification_start_time()); | 1690 end_time - ssl_host_info_->verification_start_time()); |
| 1788 server_cert_verify_result_ = &ssl_host_info_->cert_verify_result(); | 1691 server_cert_verify_result_ = &ssl_host_info_->cert_verify_result(); |
| 1789 return ssl_host_info_->WaitForCertVerification(handshake_io_callback_); | 1692 return ssl_host_info_->WaitForCertVerification( |
| 1693 base::Bind(&SSLClientSocketNSS::OnHandshakeIOComplete, |
| 1694 base::Unretained(this))); |
| 1790 } else { | 1695 } else { |
| 1791 UMA_HISTOGRAM_ENUMERATION("Net.SSLVerificationMerged", 0 /* false */, 2); | 1696 UMA_HISTOGRAM_ENUMERATION("Net.SSLVerificationMerged", 0 /* false */, 2); |
| 1792 } | 1697 } |
| 1793 | 1698 |
| 1794 int flags = 0; | 1699 int flags = 0; |
| 1795 if (ssl_config_.rev_checking_enabled) | 1700 if (ssl_config_.rev_checking_enabled) |
| 1796 flags |= X509Certificate::VERIFY_REV_CHECKING_ENABLED; | 1701 flags |= X509Certificate::VERIFY_REV_CHECKING_ENABLED; |
| 1797 if (ssl_config_.verify_ev_cert) | 1702 if (ssl_config_.verify_ev_cert) |
| 1798 flags |= X509Certificate::VERIFY_EV_CERT; | 1703 flags |= X509Certificate::VERIFY_EV_CERT; |
| 1799 verifier_.reset(new SingleRequestCertVerifier(cert_verifier_)); | 1704 verifier_.reset(new SingleRequestCertVerifier(cert_verifier_)); |
| (...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1882 // http://crbug.com/15630 for more info. | 1787 // http://crbug.com/15630 for more info. |
| 1883 | 1788 |
| 1884 // TODO(hclam): Skip logging if server cert was expected to be bad because | 1789 // TODO(hclam): Skip logging if server cert was expected to be bad because |
| 1885 // |server_cert_verify_result_| doesn't contain all the information about | 1790 // |server_cert_verify_result_| doesn't contain all the information about |
| 1886 // the cert. | 1791 // the cert. |
| 1887 if (result == OK) | 1792 if (result == OK) |
| 1888 LogConnectionTypeMetrics(); | 1793 LogConnectionTypeMetrics(); |
| 1889 | 1794 |
| 1890 completed_handshake_ = true; | 1795 completed_handshake_ = true; |
| 1891 | 1796 |
| 1892 if (old_user_read_callback_ || !user_read_callback_.is_null()) { | 1797 if (!user_read_callback_.is_null()) { |
| 1893 int rv = DoReadLoop(OK); | 1798 int rv = DoReadLoop(OK); |
| 1894 if (rv != ERR_IO_PENDING) | 1799 if (rv != ERR_IO_PENDING) |
| 1895 DoReadCallback(rv); | 1800 DoReadCallback(rv); |
| 1896 } | 1801 } |
| 1897 | 1802 |
| 1898 //#if defined(OFFICIAL_BUILD) && !defined(OS_ANDROID) | 1803 //#if defined(OFFICIAL_BUILD) && !defined(OS_ANDROID) |
| 1899 // Take care of any mandates for public key pinning. | 1804 // Take care of any mandates for public key pinning. |
| 1900 // | 1805 // |
| 1901 // Pinning is only enabled for official builds to make sure that others don't | 1806 // Pinning is only enabled for official builds to make sure that others don't |
| 1902 // end up with pins that cannot be easily updated. | 1807 // end up with pins that cannot be easily updated. |
| (...skipping 196 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2099 const unsigned int len = len1 + len2; | 2004 const unsigned int len = len1 + len2; |
| 2100 | 2005 |
| 2101 if (corked_ && len < kRecvBufferSize / 2) | 2006 if (corked_ && len < kRecvBufferSize / 2) |
| 2102 return 0; | 2007 return 0; |
| 2103 | 2008 |
| 2104 int rv = 0; | 2009 int rv = 0; |
| 2105 if (len) { | 2010 if (len) { |
| 2106 scoped_refptr<IOBuffer> send_buffer(new IOBuffer(len)); | 2011 scoped_refptr<IOBuffer> send_buffer(new IOBuffer(len)); |
| 2107 memcpy(send_buffer->data(), buf1, len1); | 2012 memcpy(send_buffer->data(), buf1, len1); |
| 2108 memcpy(send_buffer->data() + len1, buf2, len2); | 2013 memcpy(send_buffer->data() + len1, buf2, len2); |
| 2109 rv = transport_->socket()->Write(send_buffer, len, | 2014 rv = transport_->socket()->Write( |
| 2110 &buffer_send_callback_); | 2015 send_buffer, len, |
| 2016 base::Bind(&SSLClientSocketNSS::BufferSendComplete, |
| 2017 base::Unretained(this))); |
| 2111 if (rv == ERR_IO_PENDING) { | 2018 if (rv == ERR_IO_PENDING) { |
| 2112 transport_send_busy_ = true; | 2019 transport_send_busy_ = true; |
| 2113 } else { | 2020 } else { |
| 2114 memio_PutWriteResult(nss_bufs_, MapErrorToNSS(rv)); | 2021 memio_PutWriteResult(nss_bufs_, MapErrorToNSS(rv)); |
| 2115 } | 2022 } |
| 2116 } | 2023 } |
| 2117 | 2024 |
| 2118 LeaveFunction(rv); | 2025 LeaveFunction(rv); |
| 2119 return rv; | 2026 return rv; |
| 2120 } | 2027 } |
| (...skipping 11 matching lines...) Expand all Loading... |
| 2132 | 2039 |
| 2133 char *buf; | 2040 char *buf; |
| 2134 int nb = memio_GetReadParams(nss_bufs_, &buf); | 2041 int nb = memio_GetReadParams(nss_bufs_, &buf); |
| 2135 EnterFunction(nb); | 2042 EnterFunction(nb); |
| 2136 int rv; | 2043 int rv; |
| 2137 if (!nb) { | 2044 if (!nb) { |
| 2138 // buffer too full to read into, so no I/O possible at moment | 2045 // buffer too full to read into, so no I/O possible at moment |
| 2139 rv = ERR_IO_PENDING; | 2046 rv = ERR_IO_PENDING; |
| 2140 } else { | 2047 } else { |
| 2141 recv_buffer_ = new IOBuffer(nb); | 2048 recv_buffer_ = new IOBuffer(nb); |
| 2142 rv = transport_->socket()->Read(recv_buffer_, nb, &buffer_recv_callback_); | 2049 rv = transport_->socket()->Read( |
| 2050 recv_buffer_, nb, |
| 2051 base::Bind(&SSLClientSocketNSS::BufferRecvComplete, |
| 2052 base::Unretained(this))); |
| 2143 if (rv == ERR_IO_PENDING) { | 2053 if (rv == ERR_IO_PENDING) { |
| 2144 transport_recv_busy_ = true; | 2054 transport_recv_busy_ = true; |
| 2145 } else { | 2055 } else { |
| 2146 if (rv > 0) | 2056 if (rv > 0) |
| 2147 memcpy(buf, recv_buffer_->data(), rv); | 2057 memcpy(buf, recv_buffer_->data(), rv); |
| 2148 memio_PutReadResult(nss_bufs_, MapErrorToNSS(rv)); | 2058 memio_PutReadResult(nss_bufs_, MapErrorToNSS(rv)); |
| 2149 recv_buffer_ = NULL; | 2059 recv_buffer_ = NULL; |
| 2150 } | 2060 } |
| 2151 } | 2061 } |
| 2152 LeaveFunction(rv); | 2062 LeaveFunction(rv); |
| (...skipping 638 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2791 valid_thread_id_ = base::PlatformThread::CurrentId(); | 2701 valid_thread_id_ = base::PlatformThread::CurrentId(); |
| 2792 } | 2702 } |
| 2793 | 2703 |
| 2794 bool SSLClientSocketNSS::CalledOnValidThread() const { | 2704 bool SSLClientSocketNSS::CalledOnValidThread() const { |
| 2795 EnsureThreadIdAssigned(); | 2705 EnsureThreadIdAssigned(); |
| 2796 base::AutoLock auto_lock(lock_); | 2706 base::AutoLock auto_lock(lock_); |
| 2797 return valid_thread_id_ == base::PlatformThread::CurrentId(); | 2707 return valid_thread_id_ == base::PlatformThread::CurrentId(); |
| 2798 } | 2708 } |
| 2799 | 2709 |
| 2800 } // namespace net | 2710 } // namespace net |
| OLD | NEW |