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_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 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
58 scoped_refptr<X509Certificate> cert, | 58 scoped_refptr<X509Certificate> cert, |
59 crypto::RSAPrivateKey* key, | 59 crypto::RSAPrivateKey* key, |
60 const SSLConfig& ssl_config) | 60 const SSLConfig& ssl_config) |
61 : ALLOW_THIS_IN_INITIALIZER_LIST(buffer_send_callback_( | 61 : ALLOW_THIS_IN_INITIALIZER_LIST(buffer_send_callback_( |
62 this, &SSLServerSocketNSS::BufferSendComplete)), | 62 this, &SSLServerSocketNSS::BufferSendComplete)), |
63 ALLOW_THIS_IN_INITIALIZER_LIST(buffer_recv_callback_( | 63 ALLOW_THIS_IN_INITIALIZER_LIST(buffer_recv_callback_( |
64 this, &SSLServerSocketNSS::BufferRecvComplete)), | 64 this, &SSLServerSocketNSS::BufferRecvComplete)), |
65 transport_send_busy_(false), | 65 transport_send_busy_(false), |
66 transport_recv_busy_(false), | 66 transport_recv_busy_(false), |
67 user_handshake_callback_(NULL), | 67 user_handshake_callback_(NULL), |
68 user_read_callback_(NULL), | 68 old_user_read_callback_(NULL), |
69 user_write_callback_(NULL), | 69 user_write_callback_(NULL), |
70 nss_fd_(NULL), | 70 nss_fd_(NULL), |
71 nss_bufs_(NULL), | 71 nss_bufs_(NULL), |
72 transport_socket_(transport_socket), | 72 transport_socket_(transport_socket), |
73 ssl_config_(ssl_config), | 73 ssl_config_(ssl_config), |
74 cert_(cert), | 74 cert_(cert), |
75 next_handshake_state_(STATE_NONE), | 75 next_handshake_state_(STATE_NONE), |
76 completed_handshake_(false) { | 76 completed_handshake_(false) { |
77 ssl_config_.false_start_enabled = false; | 77 ssl_config_.false_start_enabled = false; |
78 ssl_config_.ssl3_enabled = true; | 78 ssl_config_.ssl3_enabled = true; |
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
147 NOTIMPLEMENTED(); | 147 NOTIMPLEMENTED(); |
148 return ERR_NOT_IMPLEMENTED; | 148 return ERR_NOT_IMPLEMENTED; |
149 } | 149 } |
150 int SSLServerSocketNSS::Connect(const CompletionCallback& callback) { | 150 int SSLServerSocketNSS::Connect(const CompletionCallback& callback) { |
151 NOTIMPLEMENTED(); | 151 NOTIMPLEMENTED(); |
152 return ERR_NOT_IMPLEMENTED; | 152 return ERR_NOT_IMPLEMENTED; |
153 } | 153 } |
154 | 154 |
155 int SSLServerSocketNSS::Read(IOBuffer* buf, int buf_len, | 155 int SSLServerSocketNSS::Read(IOBuffer* buf, int buf_len, |
156 OldCompletionCallback* callback) { | 156 OldCompletionCallback* callback) { |
157 DCHECK(!user_read_callback_); | 157 DCHECK(!old_user_read_callback_ && user_read_callback_.is_null()); |
158 DCHECK(!user_handshake_callback_); | 158 DCHECK(!user_handshake_callback_); |
159 DCHECK(!user_read_buf_); | 159 DCHECK(!user_read_buf_); |
160 DCHECK(nss_bufs_); | 160 DCHECK(nss_bufs_); |
| 161 |
| 162 user_read_buf_ = buf; |
| 163 user_read_buf_len_ = buf_len; |
| 164 |
| 165 DCHECK(completed_handshake_); |
| 166 |
| 167 int rv = DoReadLoop(OK); |
| 168 |
| 169 if (rv == ERR_IO_PENDING) { |
| 170 old_user_read_callback_ = callback; |
| 171 } else { |
| 172 user_read_buf_ = NULL; |
| 173 user_read_buf_len_ = 0; |
| 174 } |
| 175 return rv; |
| 176 } |
| 177 int SSLServerSocketNSS::Read(IOBuffer* buf, int buf_len, |
| 178 const CompletionCallback& callback) { |
| 179 DCHECK(!old_user_read_callback_ && user_read_callback_.is_null()); |
| 180 DCHECK(!user_handshake_callback_); |
| 181 DCHECK(!user_read_buf_); |
| 182 DCHECK(nss_bufs_); |
161 | 183 |
162 user_read_buf_ = buf; | 184 user_read_buf_ = buf; |
163 user_read_buf_len_ = buf_len; | 185 user_read_buf_len_ = buf_len; |
164 | 186 |
165 DCHECK(completed_handshake_); | 187 DCHECK(completed_handshake_); |
166 | 188 |
167 int rv = DoReadLoop(OK); | 189 int rv = DoReadLoop(OK); |
168 | 190 |
169 if (rv == ERR_IO_PENDING) { | 191 if (rv == ERR_IO_PENDING) { |
170 user_read_callback_ = callback; | 192 user_read_callback_ = callback; |
(...skipping 539 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
710 void SSLServerSocketNSS::DoHandshakeCallback(int rv) { | 732 void SSLServerSocketNSS::DoHandshakeCallback(int rv) { |
711 DCHECK_NE(rv, ERR_IO_PENDING); | 733 DCHECK_NE(rv, ERR_IO_PENDING); |
712 | 734 |
713 OldCompletionCallback* c = user_handshake_callback_; | 735 OldCompletionCallback* c = user_handshake_callback_; |
714 user_handshake_callback_ = NULL; | 736 user_handshake_callback_ = NULL; |
715 c->Run(rv > OK ? OK : rv); | 737 c->Run(rv > OK ? OK : rv); |
716 } | 738 } |
717 | 739 |
718 void SSLServerSocketNSS::DoReadCallback(int rv) { | 740 void SSLServerSocketNSS::DoReadCallback(int rv) { |
719 DCHECK(rv != ERR_IO_PENDING); | 741 DCHECK(rv != ERR_IO_PENDING); |
720 DCHECK(user_read_callback_); | 742 DCHECK(old_user_read_callback_ || !user_read_callback_.is_null()); |
721 | 743 |
722 // Since Run may result in Read being called, clear |user_read_callback_| | 744 // Since Run may result in Read being called, clear |user_read_callback_| |
723 // up front. | 745 // up front. |
724 OldCompletionCallback* c = user_read_callback_; | 746 if (old_user_read_callback_) { |
725 user_read_callback_ = NULL; | 747 OldCompletionCallback* c = old_user_read_callback_; |
726 user_read_buf_ = NULL; | 748 old_user_read_callback_ = NULL; |
727 user_read_buf_len_ = 0; | 749 user_read_buf_ = NULL; |
728 c->Run(rv); | 750 user_read_buf_len_ = 0; |
| 751 c->Run(rv); |
| 752 } else { |
| 753 CompletionCallback c = user_read_callback_; |
| 754 user_read_callback_.Reset(); |
| 755 user_read_buf_ = NULL; |
| 756 user_read_buf_len_ = 0; |
| 757 c.Run(rv); |
| 758 } |
729 } | 759 } |
730 | 760 |
731 void SSLServerSocketNSS::DoWriteCallback(int rv) { | 761 void SSLServerSocketNSS::DoWriteCallback(int rv) { |
732 DCHECK(rv != ERR_IO_PENDING); | 762 DCHECK(rv != ERR_IO_PENDING); |
733 DCHECK(user_write_callback_); | 763 DCHECK(user_write_callback_); |
734 | 764 |
735 // Since Run may result in Write being called, clear |user_write_callback_| | 765 // Since Run may result in Write being called, clear |user_write_callback_| |
736 // up front. | 766 // up front. |
737 OldCompletionCallback* c = user_write_callback_; | 767 OldCompletionCallback* c = user_write_callback_; |
738 user_write_callback_ = NULL; | 768 user_write_callback_ = NULL; |
(...skipping 29 matching lines...) Expand all Loading... |
768 // Initialize the NSS SSL library in a threadsafe way. This also | 798 // Initialize the NSS SSL library in a threadsafe way. This also |
769 // initializes the NSS base library. | 799 // initializes the NSS base library. |
770 EnsureNSSSSLInit(); | 800 EnsureNSSSSLInit(); |
771 if (!NSS_IsInitialized()) | 801 if (!NSS_IsInitialized()) |
772 return ERR_UNEXPECTED; | 802 return ERR_UNEXPECTED; |
773 | 803 |
774 return OK; | 804 return OK; |
775 } | 805 } |
776 | 806 |
777 } // namespace net | 807 } // namespace net |
OLD | NEW |