| 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 |