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 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
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 old_user_read_callback_(NULL), | 68 old_user_read_callback_(NULL), |
69 user_write_callback_(NULL), | 69 old_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; |
79 ssl_config_.tls1_enabled = true; | 79 ssl_config_.tls1_enabled = true; |
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
192 user_read_callback_ = callback; | 192 user_read_callback_ = callback; |
193 } else { | 193 } else { |
194 user_read_buf_ = NULL; | 194 user_read_buf_ = NULL; |
195 user_read_buf_len_ = 0; | 195 user_read_buf_len_ = 0; |
196 } | 196 } |
197 return rv; | 197 return rv; |
198 } | 198 } |
199 | 199 |
200 int SSLServerSocketNSS::Write(IOBuffer* buf, int buf_len, | 200 int SSLServerSocketNSS::Write(IOBuffer* buf, int buf_len, |
201 OldCompletionCallback* callback) { | 201 OldCompletionCallback* callback) { |
202 DCHECK(!user_write_callback_); | 202 DCHECK(!old_user_write_callback_ && user_write_callback_.is_null()); |
203 DCHECK(!user_write_buf_); | 203 DCHECK(!user_write_buf_); |
204 DCHECK(nss_bufs_); | 204 DCHECK(nss_bufs_); |
205 | 205 |
| 206 user_write_buf_ = buf; |
| 207 user_write_buf_len_ = buf_len; |
| 208 |
| 209 int rv = DoWriteLoop(OK); |
| 210 |
| 211 if (rv == ERR_IO_PENDING) { |
| 212 old_user_write_callback_ = callback; |
| 213 } else { |
| 214 user_write_buf_ = NULL; |
| 215 user_write_buf_len_ = 0; |
| 216 } |
| 217 return rv; |
| 218 } |
| 219 int SSLServerSocketNSS::Write(IOBuffer* buf, int buf_len, |
| 220 const CompletionCallback& callback) { |
| 221 DCHECK(!old_user_write_callback_ && user_write_callback_.is_null()); |
| 222 DCHECK(!user_write_buf_); |
| 223 DCHECK(nss_bufs_); |
| 224 |
206 user_write_buf_ = buf; | 225 user_write_buf_ = buf; |
207 user_write_buf_len_ = buf_len; | 226 user_write_buf_len_ = buf_len; |
208 | 227 |
209 int rv = DoWriteLoop(OK); | 228 int rv = DoWriteLoop(OK); |
210 | 229 |
211 if (rv == ERR_IO_PENDING) { | 230 if (rv == ERR_IO_PENDING) { |
212 user_write_callback_ = callback; | 231 user_write_callback_ = callback; |
213 } else { | 232 } else { |
214 user_write_buf_ = NULL; | 233 user_write_buf_ = NULL; |
215 user_write_buf_len_ = 0; | 234 user_write_buf_len_ = 0; |
(...skipping 537 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
753 CompletionCallback c = user_read_callback_; | 772 CompletionCallback c = user_read_callback_; |
754 user_read_callback_.Reset(); | 773 user_read_callback_.Reset(); |
755 user_read_buf_ = NULL; | 774 user_read_buf_ = NULL; |
756 user_read_buf_len_ = 0; | 775 user_read_buf_len_ = 0; |
757 c.Run(rv); | 776 c.Run(rv); |
758 } | 777 } |
759 } | 778 } |
760 | 779 |
761 void SSLServerSocketNSS::DoWriteCallback(int rv) { | 780 void SSLServerSocketNSS::DoWriteCallback(int rv) { |
762 DCHECK(rv != ERR_IO_PENDING); | 781 DCHECK(rv != ERR_IO_PENDING); |
763 DCHECK(user_write_callback_); | 782 DCHECK(old_user_write_callback_ || !user_write_callback_.is_null()); |
764 | 783 |
765 // Since Run may result in Write being called, clear |user_write_callback_| | 784 // Since Run may result in Write being called, clear |user_write_callback_| |
766 // up front. | 785 // up front. |
767 OldCompletionCallback* c = user_write_callback_; | 786 if (old_user_write_callback_) { |
768 user_write_callback_ = NULL; | 787 OldCompletionCallback* c = old_user_write_callback_; |
769 user_write_buf_ = NULL; | 788 old_user_write_callback_ = NULL; |
770 user_write_buf_len_ = 0; | 789 user_write_buf_ = NULL; |
771 c->Run(rv); | 790 user_write_buf_len_ = 0; |
| 791 c->Run(rv); |
| 792 } else { |
| 793 CompletionCallback c = user_write_callback_; |
| 794 user_write_callback_.Reset(); |
| 795 user_write_buf_ = NULL; |
| 796 user_write_buf_len_ = 0; |
| 797 c.Run(rv); |
| 798 } |
772 } | 799 } |
773 | 800 |
774 // static | 801 // static |
775 // NSS calls this if an incoming certificate needs to be verified. | 802 // NSS calls this if an incoming certificate needs to be verified. |
776 // Do nothing but return SECSuccess. | 803 // Do nothing but return SECSuccess. |
777 // This is called only in full handshake mode. | 804 // This is called only in full handshake mode. |
778 // Peer certificate is retrieved in HandshakeCallback() later, which is called | 805 // Peer certificate is retrieved in HandshakeCallback() later, which is called |
779 // in full handshake mode or in resumption handshake mode. | 806 // in full handshake mode or in resumption handshake mode. |
780 SECStatus SSLServerSocketNSS::OwnAuthCertHandler(void* arg, | 807 SECStatus SSLServerSocketNSS::OwnAuthCertHandler(void* arg, |
781 PRFileDesc* socket, | 808 PRFileDesc* socket, |
(...skipping 16 matching lines...) Expand all Loading... |
798 // Initialize the NSS SSL library in a threadsafe way. This also | 825 // Initialize the NSS SSL library in a threadsafe way. This also |
799 // initializes the NSS base library. | 826 // initializes the NSS base library. |
800 EnsureNSSSSLInit(); | 827 EnsureNSSSSLInit(); |
801 if (!NSS_IsInitialized()) | 828 if (!NSS_IsInitialized()) |
802 return ERR_UNEXPECTED; | 829 return ERR_UNEXPECTED; |
803 | 830 |
804 return OK; | 831 return OK; |
805 } | 832 } |
806 | 833 |
807 } // namespace net | 834 } // namespace net |
OLD | NEW |