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 |