Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(65)

Side by Side Diff: net/socket/ssl_server_socket_nss.cc

Issue 8824006: Migrate net/socket/socket.h, net/socket/stream_socket.h to base::Bind(). (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: rebased Created 9 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « net/socket/ssl_server_socket_nss.h ('k') | net/socket/ssl_server_socket_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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
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
OLDNEW
« no previous file with comments | « net/socket/ssl_server_socket_nss.h ('k') | net/socket/ssl_server_socket_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698