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 #include "net/socket/ssl_client_socket_mac.h" | 5 #include "net/socket/ssl_client_socket_mac.h" |
6 | 6 |
7 #include <CoreServices/CoreServices.h> | 7 #include <CoreServices/CoreServices.h> |
8 #include <netdb.h> | 8 #include <netdb.h> |
9 #include <sys/socket.h> | 9 #include <sys/socket.h> |
10 #include <sys/types.h> | 10 #include <sys/types.h> |
(...skipping 506 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
517 } | 517 } |
518 | 518 |
519 } // namespace | 519 } // namespace |
520 | 520 |
521 //----------------------------------------------------------------------------- | 521 //----------------------------------------------------------------------------- |
522 | 522 |
523 SSLClientSocketMac::SSLClientSocketMac(ClientSocketHandle* transport_socket, | 523 SSLClientSocketMac::SSLClientSocketMac(ClientSocketHandle* transport_socket, |
524 const HostPortPair& host_and_port, | 524 const HostPortPair& host_and_port, |
525 const SSLConfig& ssl_config, | 525 const SSLConfig& ssl_config, |
526 const SSLClientSocketContext& context) | 526 const SSLClientSocketContext& context) |
527 : transport_read_callback_(this, | 527 : transport_(transport_socket), |
528 &SSLClientSocketMac::OnTransportReadComplete), | |
529 transport_write_callback_(this, | |
530 &SSLClientSocketMac::OnTransportWriteComplete), | |
531 transport_(transport_socket), | |
532 host_and_port_(host_and_port), | 528 host_and_port_(host_and_port), |
533 ssl_config_(ssl_config), | 529 ssl_config_(ssl_config), |
534 old_user_connect_callback_(NULL), | |
535 old_user_read_callback_(NULL), | |
536 user_write_callback_(NULL), | |
537 user_read_buf_len_(0), | 530 user_read_buf_len_(0), |
538 user_write_buf_len_(0), | 531 user_write_buf_len_(0), |
539 next_handshake_state_(STATE_NONE), | 532 next_handshake_state_(STATE_NONE), |
540 cert_verifier_(context.cert_verifier), | 533 cert_verifier_(context.cert_verifier), |
541 renegotiating_(false), | 534 renegotiating_(false), |
542 client_cert_requested_(false), | 535 client_cert_requested_(false), |
543 ssl_context_(NULL), | 536 ssl_context_(NULL), |
544 bytes_read_after_renegotiation_(0), | 537 bytes_read_after_renegotiation_(0), |
545 pending_send_error_(OK), | 538 pending_send_error_(OK), |
546 net_log_(transport_socket->socket()->NetLog()) { | 539 net_log_(transport_socket->socket()->NetLog()) { |
547 // Sort the list of ciphers to disable, since disabling ciphers on Mac | 540 // Sort the list of ciphers to disable, since disabling ciphers on Mac |
548 // requires subtracting from a list of enabled ciphers while maintaining | 541 // requires subtracting from a list of enabled ciphers while maintaining |
549 // ordering, as opposed to merely needing to iterate them as with NSS. | 542 // ordering, as opposed to merely needing to iterate them as with NSS. |
550 sort(ssl_config_.disabled_cipher_suites.begin(), | 543 sort(ssl_config_.disabled_cipher_suites.begin(), |
551 ssl_config_.disabled_cipher_suites.end()); | 544 ssl_config_.disabled_cipher_suites.end()); |
552 } | 545 } |
553 | 546 |
554 SSLClientSocketMac::~SSLClientSocketMac() { | 547 SSLClientSocketMac::~SSLClientSocketMac() { |
555 Disconnect(); | 548 Disconnect(); |
556 } | 549 } |
557 | 550 |
558 int SSLClientSocketMac::Connect(OldCompletionCallback* callback) { | 551 int SSLClientSocketMac::Connect(const CompletionCallback& callback) { |
559 DCHECK(transport_.get()); | 552 DCHECK(transport_.get()); |
560 DCHECK(next_handshake_state_ == STATE_NONE); | 553 DCHECK(next_handshake_state_ == STATE_NONE); |
561 DCHECK(!old_user_connect_callback_ && user_connect_callback_.is_null()); | 554 DCHECK(user_connect_callback_.is_null()); |
562 | 555 |
563 net_log_.BeginEvent(NetLog::TYPE_SSL_CONNECT, NULL); | 556 net_log_.BeginEvent(NetLog::TYPE_SSL_CONNECT, NULL); |
564 | 557 |
565 int rv = InitializeSSLContext(); | |
566 if (rv != OK) { | |
567 net_log_.EndEventWithNetErrorCode(NetLog::TYPE_SSL_CONNECT, rv); | |
568 return rv; | |
569 } | |
570 | |
571 next_handshake_state_ = STATE_HANDSHAKE; | |
572 rv = DoHandshakeLoop(OK); | |
573 if (rv == ERR_IO_PENDING) { | |
574 old_user_connect_callback_ = callback; | |
575 } else { | |
576 net_log_.EndEventWithNetErrorCode(NetLog::TYPE_SSL_CONNECT, rv); | |
577 } | |
578 return rv; | |
579 } | |
580 int SSLClientSocketMac::Connect(const CompletionCallback& callback) { | |
581 DCHECK(transport_.get()); | |
582 DCHECK(next_handshake_state_ == STATE_NONE); | |
583 DCHECK(!old_user_connect_callback_ && user_connect_callback_.is_null()); | |
584 | |
585 net_log_.BeginEvent(NetLog::TYPE_SSL_CONNECT, NULL); | |
586 | |
587 int rv = InitializeSSLContext(); | 558 int rv = InitializeSSLContext(); |
588 if (rv != OK) { | 559 if (rv != OK) { |
589 net_log_.EndEventWithNetErrorCode(NetLog::TYPE_SSL_CONNECT, rv); | 560 net_log_.EndEventWithNetErrorCode(NetLog::TYPE_SSL_CONNECT, rv); |
590 return rv; | 561 return rv; |
591 } | 562 } |
592 | 563 |
593 next_handshake_state_ = STATE_HANDSHAKE; | 564 next_handshake_state_ = STATE_HANDSHAKE; |
594 rv = DoHandshakeLoop(OK); | 565 rv = DoHandshakeLoop(OK); |
595 if (rv == ERR_IO_PENDING) { | 566 if (rv == ERR_IO_PENDING) { |
596 user_connect_callback_ = callback; | 567 user_connect_callback_ = callback; |
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
691 | 662 |
692 base::TimeDelta SSLClientSocketMac::GetConnectTimeMicros() const { | 663 base::TimeDelta SSLClientSocketMac::GetConnectTimeMicros() const { |
693 if (transport_.get() && transport_->socket()) { | 664 if (transport_.get() && transport_->socket()) { |
694 return transport_->socket()->GetConnectTimeMicros(); | 665 return transport_->socket()->GetConnectTimeMicros(); |
695 } | 666 } |
696 NOTREACHED(); | 667 NOTREACHED(); |
697 return base::TimeDelta::FromMicroseconds(-1); | 668 return base::TimeDelta::FromMicroseconds(-1); |
698 } | 669 } |
699 | 670 |
700 int SSLClientSocketMac::Read(IOBuffer* buf, int buf_len, | 671 int SSLClientSocketMac::Read(IOBuffer* buf, int buf_len, |
701 OldCompletionCallback* callback) { | 672 const CompletionCallback& callback) { |
702 DCHECK(completed_handshake()); | 673 DCHECK(completed_handshake()); |
703 DCHECK(!old_user_read_callback_ && user_read_callback_.is_null()); | 674 DCHECK(user_read_callback_.is_null()); |
704 DCHECK(!user_read_buf_); | 675 DCHECK(!user_read_buf_); |
705 | 676 |
706 user_read_buf_ = buf; | 677 user_read_buf_ = buf; |
707 user_read_buf_len_ = buf_len; | |
708 | |
709 int rv = DoPayloadRead(); | |
710 if (rv == ERR_IO_PENDING) { | |
711 old_user_read_callback_ = callback; | |
712 } else { | |
713 user_read_buf_ = NULL; | |
714 user_read_buf_len_ = 0; | |
715 } | |
716 return rv; | |
717 } | |
718 int SSLClientSocketMac::Read(IOBuffer* buf, int buf_len, | |
719 const CompletionCallback& callback) { | |
720 DCHECK(completed_handshake()); | |
721 DCHECK(!old_user_read_callback_ && user_read_callback_.is_null()); | |
722 DCHECK(!user_read_buf_); | |
723 | |
724 user_read_buf_ = buf; | |
725 user_read_buf_len_ = buf_len; | 678 user_read_buf_len_ = buf_len; |
726 | 679 |
727 int rv = DoPayloadRead(); | 680 int rv = DoPayloadRead(); |
728 if (rv == ERR_IO_PENDING) { | 681 if (rv == ERR_IO_PENDING) { |
729 user_read_callback_ = callback; | 682 user_read_callback_ = callback; |
730 } else { | 683 } else { |
731 user_read_buf_ = NULL; | 684 user_read_buf_ = NULL; |
732 user_read_buf_len_ = 0; | 685 user_read_buf_len_ = 0; |
733 } | 686 } |
734 return rv; | 687 return rv; |
735 } | 688 } |
736 | 689 |
737 int SSLClientSocketMac::Write(IOBuffer* buf, int buf_len, | 690 int SSLClientSocketMac::Write(IOBuffer* buf, int buf_len, |
738 OldCompletionCallback* callback) { | 691 const CompletionCallback& callback) { |
739 DCHECK(completed_handshake()); | 692 DCHECK(completed_handshake()); |
740 DCHECK(!user_write_callback_); | 693 DCHECK(user_write_callback_.is_null()); |
741 DCHECK(!user_write_buf_); | 694 DCHECK(!user_write_buf_); |
742 | 695 |
743 user_write_buf_ = buf; | 696 user_write_buf_ = buf; |
744 user_write_buf_len_ = buf_len; | 697 user_write_buf_len_ = buf_len; |
745 | 698 |
746 int rv = DoPayloadWrite(); | 699 int rv = DoPayloadWrite(); |
747 if (rv == ERR_IO_PENDING) { | 700 if (rv == ERR_IO_PENDING) { |
748 user_write_callback_ = callback; | 701 user_write_callback_ = callback; |
749 } else { | 702 } else { |
750 user_write_buf_ = NULL; | 703 user_write_buf_ = NULL; |
(...skipping 178 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
929 // own copy. | 882 // own copy. |
930 status = SSLSetPeerID(ssl_context_, peer_id.data(), peer_id.length()); | 883 status = SSLSetPeerID(ssl_context_, peer_id.data(), peer_id.length()); |
931 if (status) | 884 if (status) |
932 return NetErrorFromOSStatus(status); | 885 return NetErrorFromOSStatus(status); |
933 | 886 |
934 return OK; | 887 return OK; |
935 } | 888 } |
936 | 889 |
937 void SSLClientSocketMac::DoConnectCallback(int rv) { | 890 void SSLClientSocketMac::DoConnectCallback(int rv) { |
938 DCHECK(rv != ERR_IO_PENDING); | 891 DCHECK(rv != ERR_IO_PENDING); |
939 DCHECK(old_user_connect_callback_ || !user_connect_callback_.is_null()); | 892 DCHECK(!user_connect_callback_.is_null()); |
940 | 893 |
941 if (old_user_connect_callback_) { | 894 CompletionCallback c = user_connect_callback_; |
942 OldCompletionCallback* c = old_user_connect_callback_; | 895 user_connect_callback_.Reset(); |
943 old_user_connect_callback_ = NULL; | 896 c.Run(rv > OK ? OK : rv); |
944 c->Run(rv > OK ? OK : rv); | |
945 } else { | |
946 CompletionCallback c = user_connect_callback_; | |
947 user_connect_callback_.Reset(); | |
948 c.Run(rv > OK ? OK : rv); | |
949 } | |
950 } | 897 } |
951 | 898 |
952 void SSLClientSocketMac::DoReadCallback(int rv) { | 899 void SSLClientSocketMac::DoReadCallback(int rv) { |
953 DCHECK(rv != ERR_IO_PENDING); | 900 DCHECK(rv != ERR_IO_PENDING); |
954 DCHECK(old_user_read_callback_ || !user_read_callback_.is_null()); | 901 DCHECK(!user_read_callback_.is_null()); |
955 | 902 |
956 // Since Run may result in Read being called, clear user_read_callback_ up | 903 // Since Run may result in Read being called, clear user_read_callback_ up |
957 // front. | 904 // front. |
958 if (old_user_read_callback_) { | 905 CompletionCallback c = user_read_callback_; |
959 OldCompletionCallback* c = old_user_read_callback_; | 906 user_read_callback_.Reset(); |
960 old_user_read_callback_ = NULL; | 907 user_read_buf_ = NULL; |
961 user_read_buf_ = NULL; | 908 user_read_buf_len_ = 0; |
962 user_read_buf_len_ = 0; | 909 c.Run(rv); |
963 c->Run(rv); | |
964 } else { | |
965 CompletionCallback c = user_read_callback_; | |
966 user_read_callback_.Reset(); | |
967 user_read_buf_ = NULL; | |
968 user_read_buf_len_ = 0; | |
969 c.Run(rv); | |
970 } | |
971 } | 910 } |
972 | 911 |
973 void SSLClientSocketMac::DoWriteCallback(int rv) { | 912 void SSLClientSocketMac::DoWriteCallback(int rv) { |
974 DCHECK(rv != ERR_IO_PENDING); | 913 DCHECK(rv != ERR_IO_PENDING); |
975 DCHECK(user_write_callback_); | 914 DCHECK(!user_write_callback_.is_null()); |
976 | 915 |
977 // Since Run may result in Write being called, clear user_write_callback_ up | 916 // Since Run may result in Write being called, clear user_write_callback_ up |
978 // front. | 917 // front. |
979 OldCompletionCallback* c = user_write_callback_; | 918 CompletionCallback c = user_write_callback_; |
980 user_write_callback_ = NULL; | 919 user_write_callback_.Reset(); |
981 user_write_buf_ = NULL; | 920 user_write_buf_ = NULL; |
982 user_write_buf_len_ = 0; | 921 user_write_buf_len_ = 0; |
983 c->Run(rv); | 922 c.Run(rv); |
984 } | 923 } |
985 | 924 |
986 void SSLClientSocketMac::OnHandshakeIOComplete(int result) { | 925 void SSLClientSocketMac::OnHandshakeIOComplete(int result) { |
987 int rv = DoHandshakeLoop(result); | 926 int rv = DoHandshakeLoop(result); |
988 if (rv != ERR_IO_PENDING) { | 927 if (rv != ERR_IO_PENDING) { |
989 // If there is no connect callback available to call, we are | 928 // If there is no connect callback available to call, we are |
990 // renegotiating (which occurs because we are in the middle of a Read | 929 // renegotiating (which occurs because we are in the middle of a Read |
991 // when the renegotiation process starts). So we complete the Read | 930 // when the renegotiation process starts). So we complete the Read |
992 // here. | 931 // here. |
993 if (!old_user_connect_callback_ && user_connect_callback_.is_null()) { | 932 if (user_connect_callback_.is_null()) { |
994 DoReadCallback(rv); | 933 DoReadCallback(rv); |
995 return; | 934 return; |
996 } | 935 } |
997 net_log_.EndEventWithNetErrorCode(NetLog::TYPE_SSL_CONNECT, rv); | 936 net_log_.EndEventWithNetErrorCode(NetLog::TYPE_SSL_CONNECT, rv); |
998 DoConnectCallback(rv); | 937 DoConnectCallback(rv); |
999 } | 938 } |
1000 } | 939 } |
1001 | 940 |
1002 void SSLClientSocketMac::OnTransportReadComplete(int result) { | 941 void SSLClientSocketMac::OnTransportReadComplete(int result) { |
1003 if (result > 0) { | 942 if (result > 0) { |
(...skipping 317 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1321 // The user had a read in progress, which was interrupted by the | 1260 // The user had a read in progress, which was interrupted by the |
1322 // renegotiation. Return the application data that was processed after the | 1261 // renegotiation. Return the application data that was processed after the |
1323 // handshake completed. | 1262 // handshake completed. |
1324 next_handshake_state_ = STATE_COMPLETED_HANDSHAKE; | 1263 next_handshake_state_ = STATE_COMPLETED_HANDSHAKE; |
1325 if (result != OK) | 1264 if (result != OK) |
1326 return result; | 1265 return result; |
1327 return bytes_read_after_renegotiation_; | 1266 return bytes_read_after_renegotiation_; |
1328 } | 1267 } |
1329 | 1268 |
1330 void SSLClientSocketMac::DidCompleteRenegotiation() { | 1269 void SSLClientSocketMac::DidCompleteRenegotiation() { |
1331 DCHECK(!old_user_connect_callback_ && user_connect_callback_.is_null()); | 1270 DCHECK(user_connect_callback_.is_null()); |
1332 renegotiating_ = false; | 1271 renegotiating_ = false; |
1333 next_handshake_state_ = STATE_COMPLETED_RENEGOTIATION; | 1272 next_handshake_state_ = STATE_COMPLETED_RENEGOTIATION; |
1334 } | 1273 } |
1335 | 1274 |
1336 int SSLClientSocketMac::DidCompleteHandshake() { | 1275 int SSLClientSocketMac::DidCompleteHandshake() { |
1337 DCHECK(!server_cert_ || renegotiating_); | 1276 DCHECK(!server_cert_ || renegotiating_); |
1338 VLOG(1) << "Handshake completed, next verify cert"; | 1277 VLOG(1) << "Handshake completed, next verify cert"; |
1339 | 1278 |
1340 scoped_refptr<X509Certificate> new_server_cert( | 1279 scoped_refptr<X509Certificate> new_server_cert( |
1341 GetServerCert(ssl_context_)); | 1280 GetServerCert(ssl_context_)); |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1401 us->renegotiating_ = true; | 1340 us->renegotiating_ = true; |
1402 return errSSLWouldBlock; | 1341 return errSSLWouldBlock; |
1403 } | 1342 } |
1404 } | 1343 } |
1405 | 1344 |
1406 size_t total_read = us->recv_buffer_.size(); | 1345 size_t total_read = us->recv_buffer_.size(); |
1407 | 1346 |
1408 int rv = 1; // any old value to spin the loop below | 1347 int rv = 1; // any old value to spin the loop below |
1409 while (rv > 0 && total_read < *data_length) { | 1348 while (rv > 0 && total_read < *data_length) { |
1410 us->read_io_buf_ = new IOBuffer(*data_length - total_read); | 1349 us->read_io_buf_ = new IOBuffer(*data_length - total_read); |
1411 rv = us->transport_->socket()->Read(us->read_io_buf_, | 1350 rv = us->transport_->socket()->Read( |
1412 *data_length - total_read, | 1351 us->read_io_buf_, |
1413 &us->transport_read_callback_); | 1352 *data_length - total_read, |
| 1353 base::Bind(&SSLClientSocketMac::OnTransportReadComplete, |
| 1354 base::Unretained(us))); |
1414 | 1355 |
1415 if (rv >= 0) { | 1356 if (rv >= 0) { |
1416 us->recv_buffer_.insert(us->recv_buffer_.end(), | 1357 us->recv_buffer_.insert(us->recv_buffer_.end(), |
1417 us->read_io_buf_->data(), | 1358 us->read_io_buf_->data(), |
1418 us->read_io_buf_->data() + rv); | 1359 us->read_io_buf_->data() + rv); |
1419 us->read_io_buf_ = NULL; | 1360 us->read_io_buf_ = NULL; |
1420 total_read += rv; | 1361 total_read += rv; |
1421 } | 1362 } |
1422 } | 1363 } |
1423 | 1364 |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1463 // new data when it sees that data remains in the buffer after removing the | 1404 // new data when it sees that data remains in the buffer after removing the |
1464 // sent data. As always, lie to our caller. | 1405 // sent data. As always, lie to our caller. |
1465 return noErr; | 1406 return noErr; |
1466 } | 1407 } |
1467 | 1408 |
1468 int rv; | 1409 int rv; |
1469 do { | 1410 do { |
1470 us->write_io_buf_ = new IOBuffer(us->send_buffer_.size()); | 1411 us->write_io_buf_ = new IOBuffer(us->send_buffer_.size()); |
1471 memcpy(us->write_io_buf_->data(), &us->send_buffer_[0], | 1412 memcpy(us->write_io_buf_->data(), &us->send_buffer_[0], |
1472 us->send_buffer_.size()); | 1413 us->send_buffer_.size()); |
1473 rv = us->transport_->socket()->Write(us->write_io_buf_, | 1414 rv = us->transport_->socket()->Write( |
1474 us->send_buffer_.size(), | 1415 us->write_io_buf_, |
1475 &us->transport_write_callback_); | 1416 us->send_buffer_.size(), |
| 1417 base::Bind(&SSLClientSocketMac::OnTransportWriteComplete, |
| 1418 base::Unretained(us))); |
1476 if (rv > 0) { | 1419 if (rv > 0) { |
1477 us->send_buffer_.erase(us->send_buffer_.begin(), | 1420 us->send_buffer_.erase(us->send_buffer_.begin(), |
1478 us->send_buffer_.begin() + rv); | 1421 us->send_buffer_.begin() + rv); |
1479 us->write_io_buf_ = NULL; | 1422 us->write_io_buf_ = NULL; |
1480 } | 1423 } |
1481 } while (rv > 0 && !us->send_buffer_.empty()); | 1424 } while (rv > 0 && !us->send_buffer_.empty()); |
1482 | 1425 |
1483 if (rv < 0 && rv != ERR_IO_PENDING) { | 1426 if (rv < 0 && rv != ERR_IO_PENDING) { |
1484 us->write_io_buf_ = NULL; | 1427 us->write_io_buf_ = NULL; |
1485 return OSStatusFromNetError(rv); | 1428 return OSStatusFromNetError(rv); |
1486 } | 1429 } |
1487 | 1430 |
1488 // always lie to our caller | 1431 // always lie to our caller |
1489 return noErr; | 1432 return noErr; |
1490 } | 1433 } |
1491 | 1434 |
1492 } // namespace net | 1435 } // namespace net |
OLD | NEW |