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 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
51 crypto::RSAPrivateKey* key, | 51 crypto::RSAPrivateKey* key, |
52 const SSLConfig& ssl_config) { | 52 const SSLConfig& ssl_config) { |
53 return new SSLServerSocketNSS(socket, cert, key, ssl_config); | 53 return new SSLServerSocketNSS(socket, cert, key, ssl_config); |
54 } | 54 } |
55 | 55 |
56 SSLServerSocketNSS::SSLServerSocketNSS( | 56 SSLServerSocketNSS::SSLServerSocketNSS( |
57 StreamSocket* transport_socket, | 57 StreamSocket* transport_socket, |
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 : transport_send_busy_(false), |
62 this, &SSLServerSocketNSS::BufferSendComplete)), | |
63 ALLOW_THIS_IN_INITIALIZER_LIST(buffer_recv_callback_( | |
64 this, &SSLServerSocketNSS::BufferRecvComplete)), | |
65 transport_send_busy_(false), | |
66 transport_recv_busy_(false), | 62 transport_recv_busy_(false), |
67 user_handshake_callback_(NULL), | |
68 old_user_read_callback_(NULL), | |
69 user_write_callback_(NULL), | |
70 nss_fd_(NULL), | 63 nss_fd_(NULL), |
71 nss_bufs_(NULL), | 64 nss_bufs_(NULL), |
72 transport_socket_(transport_socket), | 65 transport_socket_(transport_socket), |
73 ssl_config_(ssl_config), | 66 ssl_config_(ssl_config), |
74 cert_(cert), | 67 cert_(cert), |
75 next_handshake_state_(STATE_NONE), | 68 next_handshake_state_(STATE_NONE), |
76 completed_handshake_(false) { | 69 completed_handshake_(false) { |
77 ssl_config_.false_start_enabled = false; | 70 ssl_config_.false_start_enabled = false; |
78 ssl_config_.ssl3_enabled = true; | 71 ssl_config_.ssl3_enabled = true; |
79 ssl_config_.tls1_enabled = true; | 72 ssl_config_.tls1_enabled = true; |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
136 nss_fd_, label.data(), label.size(), | 129 nss_fd_, label.data(), label.size(), |
137 reinterpret_cast<const unsigned char*>(context.data()), | 130 reinterpret_cast<const unsigned char*>(context.data()), |
138 context.length(), out, outlen); | 131 context.length(), out, outlen); |
139 if (result != SECSuccess) { | 132 if (result != SECSuccess) { |
140 LogFailedNSSFunction(net_log_, "SSL_ExportKeyingMaterial", ""); | 133 LogFailedNSSFunction(net_log_, "SSL_ExportKeyingMaterial", ""); |
141 return MapNSSError(PORT_GetError()); | 134 return MapNSSError(PORT_GetError()); |
142 } | 135 } |
143 return OK; | 136 return OK; |
144 } | 137 } |
145 | 138 |
146 int SSLServerSocketNSS::Connect(OldCompletionCallback* callback) { | |
147 NOTIMPLEMENTED(); | |
148 return ERR_NOT_IMPLEMENTED; | |
149 } | |
150 int SSLServerSocketNSS::Connect(const CompletionCallback& callback) { | 139 int SSLServerSocketNSS::Connect(const CompletionCallback& callback) { |
151 NOTIMPLEMENTED(); | 140 NOTIMPLEMENTED(); |
152 return ERR_NOT_IMPLEMENTED; | 141 return ERR_NOT_IMPLEMENTED; |
153 } | 142 } |
154 | 143 |
155 int SSLServerSocketNSS::Read(IOBuffer* buf, int buf_len, | 144 int SSLServerSocketNSS::Read(IOBuffer* buf, int buf_len, |
156 OldCompletionCallback* callback) { | 145 const CompletionCallback& callback) { |
157 DCHECK(!old_user_read_callback_ && user_read_callback_.is_null()); | 146 DCHECK(user_read_callback_.is_null()); |
158 DCHECK(!user_handshake_callback_); | 147 DCHECK(!user_handshake_callback_); |
159 DCHECK(!user_read_buf_); | 148 DCHECK(!user_read_buf_); |
160 DCHECK(nss_bufs_); | 149 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_); | |
183 | 150 |
184 user_read_buf_ = buf; | 151 user_read_buf_ = buf; |
185 user_read_buf_len_ = buf_len; | 152 user_read_buf_len_ = buf_len; |
186 | 153 |
187 DCHECK(completed_handshake_); | 154 DCHECK(completed_handshake_); |
188 | 155 |
189 int rv = DoReadLoop(OK); | 156 int rv = DoReadLoop(OK); |
190 | 157 |
191 if (rv == ERR_IO_PENDING) { | 158 if (rv == ERR_IO_PENDING) { |
192 user_read_callback_ = callback; | 159 user_read_callback_ = callback; |
193 } else { | 160 } else { |
194 user_read_buf_ = NULL; | 161 user_read_buf_ = NULL; |
195 user_read_buf_len_ = 0; | 162 user_read_buf_len_ = 0; |
196 } | 163 } |
197 return rv; | 164 return rv; |
198 } | 165 } |
199 | 166 |
200 int SSLServerSocketNSS::Write(IOBuffer* buf, int buf_len, | 167 int SSLServerSocketNSS::Write(IOBuffer* buf, int buf_len, |
201 OldCompletionCallback* callback) { | 168 const CompletionCallback& callback) { |
202 DCHECK(!user_write_callback_); | 169 DCHECK(user_write_callback_.is_null()); |
203 DCHECK(!user_write_buf_); | 170 DCHECK(!user_write_buf_); |
204 DCHECK(nss_bufs_); | 171 DCHECK(nss_bufs_); |
205 | 172 |
206 user_write_buf_ = buf; | 173 user_write_buf_ = buf; |
207 user_write_buf_len_ = buf_len; | 174 user_write_buf_len_ = buf_len; |
208 | 175 |
209 int rv = DoWriteLoop(OK); | 176 int rv = DoWriteLoop(OK); |
210 | 177 |
211 if (rv == ERR_IO_PENDING) { | 178 if (rv == ERR_IO_PENDING) { |
212 user_write_callback_ = callback; | 179 user_write_callback_ = callback; |
(...skipping 301 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
514 const char* buf2; | 481 const char* buf2; |
515 unsigned int len1, len2; | 482 unsigned int len1, len2; |
516 memio_GetWriteParams(nss_bufs_, &buf1, &len1, &buf2, &len2); | 483 memio_GetWriteParams(nss_bufs_, &buf1, &len1, &buf2, &len2); |
517 const unsigned int len = len1 + len2; | 484 const unsigned int len = len1 + len2; |
518 | 485 |
519 int rv = 0; | 486 int rv = 0; |
520 if (len) { | 487 if (len) { |
521 scoped_refptr<IOBuffer> send_buffer(new IOBuffer(len)); | 488 scoped_refptr<IOBuffer> send_buffer(new IOBuffer(len)); |
522 memcpy(send_buffer->data(), buf1, len1); | 489 memcpy(send_buffer->data(), buf1, len1); |
523 memcpy(send_buffer->data() + len1, buf2, len2); | 490 memcpy(send_buffer->data() + len1, buf2, len2); |
524 rv = transport_socket_->Write(send_buffer, len, | 491 rv = transport_socket_->Write( |
525 &buffer_send_callback_); | 492 send_buffer, len, |
| 493 base::Bind(&SSLServerSocketNSS::BufferSendComplete, |
| 494 base::Unretained(this))); |
526 if (rv == ERR_IO_PENDING) { | 495 if (rv == ERR_IO_PENDING) { |
527 transport_send_busy_ = true; | 496 transport_send_busy_ = true; |
528 } else { | 497 } else { |
529 memio_PutWriteResult(nss_bufs_, MapErrorToNSS(rv)); | 498 memio_PutWriteResult(nss_bufs_, MapErrorToNSS(rv)); |
530 } | 499 } |
531 } | 500 } |
532 | 501 |
533 return rv; | 502 return rv; |
534 } | 503 } |
535 | 504 |
536 void SSLServerSocketNSS::BufferSendComplete(int result) { | 505 void SSLServerSocketNSS::BufferSendComplete(int result) { |
537 memio_PutWriteResult(nss_bufs_, MapErrorToNSS(result)); | 506 memio_PutWriteResult(nss_bufs_, MapErrorToNSS(result)); |
538 transport_send_busy_ = false; | 507 transport_send_busy_ = false; |
539 OnSendComplete(result); | 508 OnSendComplete(result); |
540 } | 509 } |
541 | 510 |
542 int SSLServerSocketNSS::BufferRecv(void) { | 511 int SSLServerSocketNSS::BufferRecv(void) { |
543 if (transport_recv_busy_) return ERR_IO_PENDING; | 512 if (transport_recv_busy_) return ERR_IO_PENDING; |
544 | 513 |
545 char *buf; | 514 char *buf; |
546 int nb = memio_GetReadParams(nss_bufs_, &buf); | 515 int nb = memio_GetReadParams(nss_bufs_, &buf); |
547 int rv; | 516 int rv; |
548 if (!nb) { | 517 if (!nb) { |
549 // buffer too full to read into, so no I/O possible at moment | 518 // buffer too full to read into, so no I/O possible at moment |
550 rv = ERR_IO_PENDING; | 519 rv = ERR_IO_PENDING; |
551 } else { | 520 } else { |
552 recv_buffer_ = new IOBuffer(nb); | 521 recv_buffer_ = new IOBuffer(nb); |
553 rv = transport_socket_->Read(recv_buffer_, nb, &buffer_recv_callback_); | 522 rv = transport_socket_->Read( |
| 523 recv_buffer_, nb, |
| 524 base::Bind(&SSLServerSocketNSS::BufferRecvComplete, |
| 525 base::Unretained(this))); |
554 if (rv == ERR_IO_PENDING) { | 526 if (rv == ERR_IO_PENDING) { |
555 transport_recv_busy_ = true; | 527 transport_recv_busy_ = true; |
556 } else { | 528 } else { |
557 if (rv > 0) | 529 if (rv > 0) |
558 memcpy(buf, recv_buffer_->data(), rv); | 530 memcpy(buf, recv_buffer_->data(), rv); |
559 memio_PutReadResult(nss_bufs_, MapErrorToNSS(rv)); | 531 memio_PutReadResult(nss_bufs_, MapErrorToNSS(rv)); |
560 recv_buffer_ = NULL; | 532 recv_buffer_ = NULL; |
561 } | 533 } |
562 } | 534 } |
563 return rv; | 535 return rv; |
(...skipping 168 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
732 void SSLServerSocketNSS::DoHandshakeCallback(int rv) { | 704 void SSLServerSocketNSS::DoHandshakeCallback(int rv) { |
733 DCHECK_NE(rv, ERR_IO_PENDING); | 705 DCHECK_NE(rv, ERR_IO_PENDING); |
734 | 706 |
735 OldCompletionCallback* c = user_handshake_callback_; | 707 OldCompletionCallback* c = user_handshake_callback_; |
736 user_handshake_callback_ = NULL; | 708 user_handshake_callback_ = NULL; |
737 c->Run(rv > OK ? OK : rv); | 709 c->Run(rv > OK ? OK : rv); |
738 } | 710 } |
739 | 711 |
740 void SSLServerSocketNSS::DoReadCallback(int rv) { | 712 void SSLServerSocketNSS::DoReadCallback(int rv) { |
741 DCHECK(rv != ERR_IO_PENDING); | 713 DCHECK(rv != ERR_IO_PENDING); |
742 DCHECK(old_user_read_callback_ || !user_read_callback_.is_null()); | 714 DCHECK(!user_read_callback_.is_null()); |
743 | 715 |
744 // Since Run may result in Read being called, clear |user_read_callback_| | 716 // Since Run may result in Read being called, clear |user_read_callback_| |
745 // up front. | 717 // up front. |
746 if (old_user_read_callback_) { | 718 CompletionCallback c = user_read_callback_; |
747 OldCompletionCallback* c = old_user_read_callback_; | 719 user_read_callback_.Reset(); |
748 old_user_read_callback_ = NULL; | 720 user_read_buf_ = NULL; |
749 user_read_buf_ = NULL; | 721 user_read_buf_len_ = 0; |
750 user_read_buf_len_ = 0; | 722 c.Run(rv); |
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 } | |
759 } | 723 } |
760 | 724 |
761 void SSLServerSocketNSS::DoWriteCallback(int rv) { | 725 void SSLServerSocketNSS::DoWriteCallback(int rv) { |
762 DCHECK(rv != ERR_IO_PENDING); | 726 DCHECK(rv != ERR_IO_PENDING); |
763 DCHECK(user_write_callback_); | 727 DCHECK(!user_write_callback_.is_null()); |
764 | 728 |
765 // Since Run may result in Write being called, clear |user_write_callback_| | 729 // Since Run may result in Write being called, clear |user_write_callback_| |
766 // up front. | 730 // up front. |
767 OldCompletionCallback* c = user_write_callback_; | 731 CompletionCallback c = user_write_callback_; |
768 user_write_callback_ = NULL; | 732 user_write_callback_.Reset(); |
769 user_write_buf_ = NULL; | 733 user_write_buf_ = NULL; |
770 user_write_buf_len_ = 0; | 734 user_write_buf_len_ = 0; |
771 c->Run(rv); | 735 c.Run(rv); |
772 } | 736 } |
773 | 737 |
774 // static | 738 // static |
775 // NSS calls this if an incoming certificate needs to be verified. | 739 // NSS calls this if an incoming certificate needs to be verified. |
776 // Do nothing but return SECSuccess. | 740 // Do nothing but return SECSuccess. |
777 // This is called only in full handshake mode. | 741 // This is called only in full handshake mode. |
778 // Peer certificate is retrieved in HandshakeCallback() later, which is called | 742 // Peer certificate is retrieved in HandshakeCallback() later, which is called |
779 // in full handshake mode or in resumption handshake mode. | 743 // in full handshake mode or in resumption handshake mode. |
780 SECStatus SSLServerSocketNSS::OwnAuthCertHandler(void* arg, | 744 SECStatus SSLServerSocketNSS::OwnAuthCertHandler(void* arg, |
781 PRFileDesc* socket, | 745 PRFileDesc* socket, |
(...skipping 16 matching lines...) Expand all Loading... |
798 // Initialize the NSS SSL library in a threadsafe way. This also | 762 // Initialize the NSS SSL library in a threadsafe way. This also |
799 // initializes the NSS base library. | 763 // initializes the NSS base library. |
800 EnsureNSSSSLInit(); | 764 EnsureNSSSSLInit(); |
801 if (!NSS_IsInitialized()) | 765 if (!NSS_IsInitialized()) |
802 return ERR_UNEXPECTED; | 766 return ERR_UNEXPECTED; |
803 | 767 |
804 return OK; | 768 return OK; |
805 } | 769 } |
806 | 770 |
807 } // namespace net | 771 } // namespace net |
OLD | NEW |