| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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_server_socket_nss.h" | 5 #include "net/socket/ssl_server_socket_nss.h" |
| 6 | 6 |
| 7 #if defined(OS_WIN) | 7 #if defined(OS_WIN) |
| 8 #include <winsock2.h> | 8 #include <winsock2.h> |
| 9 #endif | 9 #endif |
| 10 | 10 |
| (...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 111 } | 111 } |
| 112 | 112 |
| 113 SSLServerSocketNSS::~SSLServerSocketNSS() { | 113 SSLServerSocketNSS::~SSLServerSocketNSS() { |
| 114 if (nss_fd_ != NULL) { | 114 if (nss_fd_ != NULL) { |
| 115 PR_Close(nss_fd_); | 115 PR_Close(nss_fd_); |
| 116 nss_fd_ = NULL; | 116 nss_fd_ = NULL; |
| 117 } | 117 } |
| 118 } | 118 } |
| 119 | 119 |
| 120 int SSLServerSocketNSS::Handshake(const CompletionCallback& callback) { | 120 int SSLServerSocketNSS::Handshake(const CompletionCallback& callback) { |
| 121 net_log_.BeginEvent(NetLog::TYPE_SSL_SERVER_HANDSHAKE, NULL); | 121 net_log_.BeginEvent(NetLog::TYPE_SSL_SERVER_HANDSHAKE); |
| 122 | 122 |
| 123 int rv = Init(); | 123 int rv = Init(); |
| 124 if (rv != OK) { | 124 if (rv != OK) { |
| 125 LOG(ERROR) << "Failed to initialize NSS"; | 125 LOG(ERROR) << "Failed to initialize NSS"; |
| 126 net_log_.EndEventWithNetErrorCode(NetLog::TYPE_SSL_SERVER_HANDSHAKE, rv); | 126 net_log_.EndEventWithNetErrorCode(NetLog::TYPE_SSL_SERVER_HANDSHAKE, rv); |
| 127 return rv; | 127 return rv; |
| 128 } | 128 } |
| 129 | 129 |
| 130 rv = InitializeSSLOptions(); | 130 rv = InitializeSSLOptions(); |
| 131 if (rv != OK) { | 131 if (rv != OK) { |
| (...skipping 470 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 602 DCHECK_GT(user_read_buf_len_, 0); | 602 DCHECK_GT(user_read_buf_len_, 0); |
| 603 int rv = PR_Read(nss_fd_, user_read_buf_->data(), user_read_buf_len_); | 603 int rv = PR_Read(nss_fd_, user_read_buf_->data(), user_read_buf_len_); |
| 604 if (rv >= 0) | 604 if (rv >= 0) |
| 605 return rv; | 605 return rv; |
| 606 PRErrorCode prerr = PR_GetError(); | 606 PRErrorCode prerr = PR_GetError(); |
| 607 if (prerr == PR_WOULD_BLOCK_ERROR) { | 607 if (prerr == PR_WOULD_BLOCK_ERROR) { |
| 608 return ERR_IO_PENDING; | 608 return ERR_IO_PENDING; |
| 609 } | 609 } |
| 610 rv = MapNSSError(prerr); | 610 rv = MapNSSError(prerr); |
| 611 net_log_.AddEvent(NetLog::TYPE_SSL_READ_ERROR, | 611 net_log_.AddEvent(NetLog::TYPE_SSL_READ_ERROR, |
| 612 make_scoped_refptr(new SSLErrorParams(rv, prerr))); | 612 CreateNetLogSSLErrorCallback(rv, prerr)); |
| 613 return rv; | 613 return rv; |
| 614 } | 614 } |
| 615 | 615 |
| 616 int SSLServerSocketNSS::DoPayloadWrite() { | 616 int SSLServerSocketNSS::DoPayloadWrite() { |
| 617 DCHECK(user_write_buf_); | 617 DCHECK(user_write_buf_); |
| 618 int rv = PR_Write(nss_fd_, user_write_buf_->data(), user_write_buf_len_); | 618 int rv = PR_Write(nss_fd_, user_write_buf_->data(), user_write_buf_len_); |
| 619 if (rv >= 0) | 619 if (rv >= 0) |
| 620 return rv; | 620 return rv; |
| 621 PRErrorCode prerr = PR_GetError(); | 621 PRErrorCode prerr = PR_GetError(); |
| 622 if (prerr == PR_WOULD_BLOCK_ERROR) { | 622 if (prerr == PR_WOULD_BLOCK_ERROR) { |
| 623 return ERR_IO_PENDING; | 623 return ERR_IO_PENDING; |
| 624 } | 624 } |
| 625 rv = MapNSSError(prerr); | 625 rv = MapNSSError(prerr); |
| 626 net_log_.AddEvent(NetLog::TYPE_SSL_WRITE_ERROR, | 626 net_log_.AddEvent(NetLog::TYPE_SSL_WRITE_ERROR, |
| 627 make_scoped_refptr(new SSLErrorParams(rv, prerr))); | 627 CreateNetLogSSLErrorCallback(rv, prerr)); |
| 628 return rv; | 628 return rv; |
| 629 } | 629 } |
| 630 | 630 |
| 631 int SSLServerSocketNSS::DoHandshakeLoop(int last_io_result) { | 631 int SSLServerSocketNSS::DoHandshakeLoop(int last_io_result) { |
| 632 int rv = last_io_result; | 632 int rv = last_io_result; |
| 633 do { | 633 do { |
| 634 // Default to STATE_NONE for next state. | 634 // Default to STATE_NONE for next state. |
| 635 // (This is a quirk carried over from the windows | 635 // (This is a quirk carried over from the windows |
| 636 // implementation. It makes reading the logs a bit harder.) | 636 // implementation. It makes reading the logs a bit harder.) |
| 637 // State handlers can and often do call GotoState just | 637 // State handlers can and often do call GotoState just |
| (...skipping 27 matching lines...) Expand all Loading... |
| 665 DCHECK(completed_handshake_); | 665 DCHECK(completed_handshake_); |
| 666 DCHECK(next_handshake_state_ == STATE_NONE); | 666 DCHECK(next_handshake_state_ == STATE_NONE); |
| 667 | 667 |
| 668 if (result < 0) | 668 if (result < 0) |
| 669 return result; | 669 return result; |
| 670 | 670 |
| 671 if (!nss_bufs_) { | 671 if (!nss_bufs_) { |
| 672 LOG(DFATAL) << "!nss_bufs_"; | 672 LOG(DFATAL) << "!nss_bufs_"; |
| 673 int rv = ERR_UNEXPECTED; | 673 int rv = ERR_UNEXPECTED; |
| 674 net_log_.AddEvent(NetLog::TYPE_SSL_READ_ERROR, | 674 net_log_.AddEvent(NetLog::TYPE_SSL_READ_ERROR, |
| 675 make_scoped_refptr(new SSLErrorParams(rv, 0))); | 675 CreateNetLogSSLErrorCallback(rv, 0)); |
| 676 return rv; | 676 return rv; |
| 677 } | 677 } |
| 678 | 678 |
| 679 bool network_moved; | 679 bool network_moved; |
| 680 int rv; | 680 int rv; |
| 681 do { | 681 do { |
| 682 rv = DoPayloadRead(); | 682 rv = DoPayloadRead(); |
| 683 network_moved = DoTransportIO(); | 683 network_moved = DoTransportIO(); |
| 684 } while (rv == ERR_IO_PENDING && network_moved); | 684 } while (rv == ERR_IO_PENDING && network_moved); |
| 685 return rv; | 685 return rv; |
| 686 } | 686 } |
| 687 | 687 |
| 688 int SSLServerSocketNSS::DoWriteLoop(int result) { | 688 int SSLServerSocketNSS::DoWriteLoop(int result) { |
| 689 DCHECK(completed_handshake_); | 689 DCHECK(completed_handshake_); |
| 690 DCHECK(next_handshake_state_ == STATE_NONE); | 690 DCHECK(next_handshake_state_ == STATE_NONE); |
| 691 | 691 |
| 692 if (result < 0) | 692 if (result < 0) |
| 693 return result; | 693 return result; |
| 694 | 694 |
| 695 if (!nss_bufs_) { | 695 if (!nss_bufs_) { |
| 696 LOG(DFATAL) << "!nss_bufs_"; | 696 LOG(DFATAL) << "!nss_bufs_"; |
| 697 int rv = ERR_UNEXPECTED; | 697 int rv = ERR_UNEXPECTED; |
| 698 net_log_.AddEvent(NetLog::TYPE_SSL_WRITE_ERROR, | 698 net_log_.AddEvent(NetLog::TYPE_SSL_WRITE_ERROR, |
| 699 make_scoped_refptr(new SSLErrorParams(rv, 0))); | 699 CreateNetLogSSLErrorCallback(rv, 0)); |
| 700 return rv; | 700 return rv; |
| 701 } | 701 } |
| 702 | 702 |
| 703 bool network_moved; | 703 bool network_moved; |
| 704 int rv; | 704 int rv; |
| 705 do { | 705 do { |
| 706 rv = DoPayloadWrite(); | 706 rv = DoPayloadWrite(); |
| 707 network_moved = DoTransportIO(); | 707 network_moved = DoTransportIO(); |
| 708 } while (rv == ERR_IO_PENDING && network_moved); | 708 } while (rv == ERR_IO_PENDING && network_moved); |
| 709 return rv; | 709 return rv; |
| 710 } | 710 } |
| 711 | 711 |
| 712 int SSLServerSocketNSS::DoHandshake() { | 712 int SSLServerSocketNSS::DoHandshake() { |
| 713 int net_error = OK; | 713 int net_error = OK; |
| 714 SECStatus rv = SSL_ForceHandshake(nss_fd_); | 714 SECStatus rv = SSL_ForceHandshake(nss_fd_); |
| 715 | 715 |
| 716 if (rv == SECSuccess) { | 716 if (rv == SECSuccess) { |
| 717 completed_handshake_ = true; | 717 completed_handshake_ = true; |
| 718 } else { | 718 } else { |
| 719 PRErrorCode prerr = PR_GetError(); | 719 PRErrorCode prerr = PR_GetError(); |
| 720 net_error = MapNSSError(prerr); | 720 net_error = MapNSSError(prerr); |
| 721 | 721 |
| 722 // If not done, stay in this state | 722 // If not done, stay in this state |
| 723 if (net_error == ERR_IO_PENDING) { | 723 if (net_error == ERR_IO_PENDING) { |
| 724 GotoState(STATE_HANDSHAKE); | 724 GotoState(STATE_HANDSHAKE); |
| 725 } else { | 725 } else { |
| 726 LOG(ERROR) << "handshake failed; NSS error code " << prerr | 726 LOG(ERROR) << "handshake failed; NSS error code " << prerr |
| 727 << ", net_error " << net_error; | 727 << ", net_error " << net_error; |
| 728 net_log_.AddEvent( | 728 net_log_.AddEvent(NetLog::TYPE_SSL_HANDSHAKE_ERROR, |
| 729 NetLog::TYPE_SSL_HANDSHAKE_ERROR, | 729 CreateNetLogSSLErrorCallback(net_error, prerr)); |
| 730 make_scoped_refptr(new SSLErrorParams(net_error, prerr))); | |
| 731 } | 730 } |
| 732 } | 731 } |
| 733 return net_error; | 732 return net_error; |
| 734 } | 733 } |
| 735 | 734 |
| 736 void SSLServerSocketNSS::DoHandshakeCallback(int rv) { | 735 void SSLServerSocketNSS::DoHandshakeCallback(int rv) { |
| 737 DCHECK_NE(rv, ERR_IO_PENDING); | 736 DCHECK_NE(rv, ERR_IO_PENDING); |
| 738 | 737 |
| 739 CompletionCallback c = user_handshake_callback_; | 738 CompletionCallback c = user_handshake_callback_; |
| 740 user_handshake_callback_.Reset(); | 739 user_handshake_callback_.Reset(); |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 795 // initializes the NSS base library. | 794 // initializes the NSS base library. |
| 796 EnsureNSSSSLInit(); | 795 EnsureNSSSSLInit(); |
| 797 if (!NSS_IsInitialized()) | 796 if (!NSS_IsInitialized()) |
| 798 return ERR_UNEXPECTED; | 797 return ERR_UNEXPECTED; |
| 799 | 798 |
| 800 EnableSSLServerSockets(); | 799 EnableSSLServerSockets(); |
| 801 return OK; | 800 return OK; |
| 802 } | 801 } |
| 803 | 802 |
| 804 } // namespace net | 803 } // namespace net |
| OLD | NEW |