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 183 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
194 | 194 |
195 int SSLServerSocketNSS::Connect(const CompletionCallback& callback) { | 195 int SSLServerSocketNSS::Connect(const CompletionCallback& callback) { |
196 NOTIMPLEMENTED(); | 196 NOTIMPLEMENTED(); |
197 return ERR_NOT_IMPLEMENTED; | 197 return ERR_NOT_IMPLEMENTED; |
198 } | 198 } |
199 | 199 |
200 int SSLServerSocketNSS::Read(IOBuffer* buf, int buf_len, | 200 int SSLServerSocketNSS::Read(IOBuffer* buf, int buf_len, |
201 const CompletionCallback& callback) { | 201 const CompletionCallback& callback) { |
202 DCHECK(user_read_callback_.is_null()); | 202 DCHECK(user_read_callback_.is_null()); |
203 DCHECK(user_handshake_callback_.is_null()); | 203 DCHECK(user_handshake_callback_.is_null()); |
204 DCHECK(!user_read_buf_); | 204 DCHECK(!user_read_buf_.get()); |
205 DCHECK(nss_bufs_); | 205 DCHECK(nss_bufs_); |
206 DCHECK(!callback.is_null()); | 206 DCHECK(!callback.is_null()); |
207 | 207 |
208 user_read_buf_ = buf; | 208 user_read_buf_ = buf; |
209 user_read_buf_len_ = buf_len; | 209 user_read_buf_len_ = buf_len; |
210 | 210 |
211 DCHECK(completed_handshake_); | 211 DCHECK(completed_handshake_); |
212 | 212 |
213 int rv = DoReadLoop(OK); | 213 int rv = DoReadLoop(OK); |
214 | 214 |
215 if (rv == ERR_IO_PENDING) { | 215 if (rv == ERR_IO_PENDING) { |
216 user_read_callback_ = callback; | 216 user_read_callback_ = callback; |
217 } else { | 217 } else { |
218 user_read_buf_ = NULL; | 218 user_read_buf_ = NULL; |
219 user_read_buf_len_ = 0; | 219 user_read_buf_len_ = 0; |
220 } | 220 } |
221 return rv; | 221 return rv; |
222 } | 222 } |
223 | 223 |
224 int SSLServerSocketNSS::Write(IOBuffer* buf, int buf_len, | 224 int SSLServerSocketNSS::Write(IOBuffer* buf, int buf_len, |
225 const CompletionCallback& callback) { | 225 const CompletionCallback& callback) { |
226 DCHECK(user_write_callback_.is_null()); | 226 DCHECK(user_write_callback_.is_null()); |
227 DCHECK(!user_write_buf_); | 227 DCHECK(!user_write_buf_.get()); |
228 DCHECK(nss_bufs_); | 228 DCHECK(nss_bufs_); |
229 DCHECK(!callback.is_null()); | 229 DCHECK(!callback.is_null()); |
230 | 230 |
231 user_write_buf_ = buf; | 231 user_write_buf_ = buf; |
232 user_write_buf_len_ = buf_len; | 232 user_write_buf_len_ = buf_len; |
233 | 233 |
234 int rv = DoWriteLoop(OK); | 234 int rv = DoWriteLoop(OK); |
235 | 235 |
236 if (rv == ERR_IO_PENDING) { | 236 if (rv == ERR_IO_PENDING) { |
237 user_write_callback_ = callback; | 237 user_write_callback_ = callback; |
(...skipping 250 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
488 void SSLServerSocketNSS::OnSendComplete(int result) { | 488 void SSLServerSocketNSS::OnSendComplete(int result) { |
489 if (next_handshake_state_ == STATE_HANDSHAKE) { | 489 if (next_handshake_state_ == STATE_HANDSHAKE) { |
490 // In handshake phase. | 490 // In handshake phase. |
491 OnHandshakeIOComplete(result); | 491 OnHandshakeIOComplete(result); |
492 return; | 492 return; |
493 } | 493 } |
494 | 494 |
495 if (!completed_handshake_) | 495 if (!completed_handshake_) |
496 return; | 496 return; |
497 | 497 |
498 if (user_write_buf_) { | 498 if (user_write_buf_.get()) { |
499 int rv = DoWriteLoop(result); | 499 int rv = DoWriteLoop(result); |
500 if (rv != ERR_IO_PENDING) | 500 if (rv != ERR_IO_PENDING) |
501 DoWriteCallback(rv); | 501 DoWriteCallback(rv); |
502 } else { | 502 } else { |
503 // Ensure that any queued ciphertext is flushed. | 503 // Ensure that any queued ciphertext is flushed. |
504 DoTransportIO(); | 504 DoTransportIO(); |
505 } | 505 } |
506 } | 506 } |
507 | 507 |
508 void SSLServerSocketNSS::OnRecvComplete(int result) { | 508 void SSLServerSocketNSS::OnRecvComplete(int result) { |
509 if (next_handshake_state_ == STATE_HANDSHAKE) { | 509 if (next_handshake_state_ == STATE_HANDSHAKE) { |
510 // In handshake phase. | 510 // In handshake phase. |
511 OnHandshakeIOComplete(result); | 511 OnHandshakeIOComplete(result); |
512 return; | 512 return; |
513 } | 513 } |
514 | 514 |
515 // Network layer received some data, check if client requested to read | 515 // Network layer received some data, check if client requested to read |
516 // decrypted data. | 516 // decrypted data. |
517 if (!user_read_buf_ || !completed_handshake_) | 517 if (!user_read_buf_.get() || !completed_handshake_) |
518 return; | 518 return; |
519 | 519 |
520 int rv = DoReadLoop(result); | 520 int rv = DoReadLoop(result); |
521 if (rv != ERR_IO_PENDING) | 521 if (rv != ERR_IO_PENDING) |
522 DoReadCallback(rv); | 522 DoReadCallback(rv); |
523 } | 523 } |
524 | 524 |
525 void SSLServerSocketNSS::OnHandshakeIOComplete(int result) { | 525 void SSLServerSocketNSS::OnHandshakeIOComplete(int result) { |
526 int rv = DoHandshakeLoop(result); | 526 int rv = DoHandshakeLoop(result); |
527 if (rv != ERR_IO_PENDING) { | 527 if (rv != ERR_IO_PENDING) { |
(...skipping 15 matching lines...) Expand all Loading... |
543 unsigned int len1, len2; | 543 unsigned int len1, len2; |
544 memio_GetWriteParams(nss_bufs_, &buf1, &len1, &buf2, &len2); | 544 memio_GetWriteParams(nss_bufs_, &buf1, &len1, &buf2, &len2); |
545 const unsigned int len = len1 + len2; | 545 const unsigned int len = len1 + len2; |
546 | 546 |
547 int rv = 0; | 547 int rv = 0; |
548 if (len) { | 548 if (len) { |
549 scoped_refptr<IOBuffer> send_buffer(new IOBuffer(len)); | 549 scoped_refptr<IOBuffer> send_buffer(new IOBuffer(len)); |
550 memcpy(send_buffer->data(), buf1, len1); | 550 memcpy(send_buffer->data(), buf1, len1); |
551 memcpy(send_buffer->data() + len1, buf2, len2); | 551 memcpy(send_buffer->data() + len1, buf2, len2); |
552 rv = transport_socket_->Write( | 552 rv = transport_socket_->Write( |
553 send_buffer, len, | 553 send_buffer.get(), len, |
554 base::Bind(&SSLServerSocketNSS::BufferSendComplete, | 554 base::Bind(&SSLServerSocketNSS::BufferSendComplete, |
555 base::Unretained(this))); | 555 base::Unretained(this))); |
556 if (rv == ERR_IO_PENDING) { | 556 if (rv == ERR_IO_PENDING) { |
557 transport_send_busy_ = true; | 557 transport_send_busy_ = true; |
558 } else { | 558 } else { |
559 memio_PutWriteResult(nss_bufs_, MapErrorToNSS(rv)); | 559 memio_PutWriteResult(nss_bufs_, MapErrorToNSS(rv)); |
560 } | 560 } |
561 } | 561 } |
562 | 562 |
563 return rv; | 563 return rv; |
(...skipping 10 matching lines...) Expand all Loading... |
574 | 574 |
575 char* buf; | 575 char* buf; |
576 int nb = memio_GetReadParams(nss_bufs_, &buf); | 576 int nb = memio_GetReadParams(nss_bufs_, &buf); |
577 int rv; | 577 int rv; |
578 if (!nb) { | 578 if (!nb) { |
579 // buffer too full to read into, so no I/O possible at moment | 579 // buffer too full to read into, so no I/O possible at moment |
580 rv = ERR_IO_PENDING; | 580 rv = ERR_IO_PENDING; |
581 } else { | 581 } else { |
582 recv_buffer_ = new IOBuffer(nb); | 582 recv_buffer_ = new IOBuffer(nb); |
583 rv = transport_socket_->Read( | 583 rv = transport_socket_->Read( |
584 recv_buffer_, nb, | 584 recv_buffer_.get(), nb, |
585 base::Bind(&SSLServerSocketNSS::BufferRecvComplete, | 585 base::Bind(&SSLServerSocketNSS::BufferRecvComplete, |
586 base::Unretained(this))); | 586 base::Unretained(this))); |
587 if (rv == ERR_IO_PENDING) { | 587 if (rv == ERR_IO_PENDING) { |
588 transport_recv_busy_ = true; | 588 transport_recv_busy_ = true; |
589 } else { | 589 } else { |
590 if (rv > 0) | 590 if (rv > 0) |
591 memcpy(buf, recv_buffer_->data(), rv); | 591 memcpy(buf, recv_buffer_->data(), rv); |
592 memio_PutReadResult(nss_bufs_, MapErrorToNSS(rv)); | 592 memio_PutReadResult(nss_bufs_, MapErrorToNSS(rv)); |
593 recv_buffer_ = NULL; | 593 recv_buffer_ = NULL; |
594 } | 594 } |
(...skipping 230 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
825 // initializes the NSS base library. | 825 // initializes the NSS base library. |
826 EnsureNSSSSLInit(); | 826 EnsureNSSSSLInit(); |
827 if (!NSS_IsInitialized()) | 827 if (!NSS_IsInitialized()) |
828 return ERR_UNEXPECTED; | 828 return ERR_UNEXPECTED; |
829 | 829 |
830 EnableSSLServerSockets(); | 830 EnableSSLServerSockets(); |
831 return OK; | 831 return OK; |
832 } | 832 } |
833 | 833 |
834 } // namespace net | 834 } // namespace net |
OLD | NEW |