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 |