| 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 182 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 193 | 193 |
| 194 int SSLServerSocketNSS::Connect(const CompletionCallback& callback) { | 194 int SSLServerSocketNSS::Connect(const CompletionCallback& callback) { |
| 195 NOTIMPLEMENTED(); | 195 NOTIMPLEMENTED(); |
| 196 return ERR_NOT_IMPLEMENTED; | 196 return ERR_NOT_IMPLEMENTED; |
| 197 } | 197 } |
| 198 | 198 |
| 199 int SSLServerSocketNSS::Read(IOBuffer* buf, int buf_len, | 199 int SSLServerSocketNSS::Read(IOBuffer* buf, int buf_len, |
| 200 const CompletionCallback& callback) { | 200 const CompletionCallback& callback) { |
| 201 DCHECK(user_read_callback_.is_null()); | 201 DCHECK(user_read_callback_.is_null()); |
| 202 DCHECK(user_handshake_callback_.is_null()); | 202 DCHECK(user_handshake_callback_.is_null()); |
| 203 DCHECK(!user_read_buf_); | 203 DCHECK(!user_read_buf_.get()); |
| 204 DCHECK(nss_bufs_); | 204 DCHECK(nss_bufs_); |
| 205 DCHECK(!callback.is_null()); | 205 DCHECK(!callback.is_null()); |
| 206 | 206 |
| 207 user_read_buf_ = buf; | 207 user_read_buf_ = buf; |
| 208 user_read_buf_len_ = buf_len; | 208 user_read_buf_len_ = buf_len; |
| 209 | 209 |
| 210 DCHECK(completed_handshake_); | 210 DCHECK(completed_handshake_); |
| 211 | 211 |
| 212 int rv = DoReadLoop(OK); | 212 int rv = DoReadLoop(OK); |
| 213 | 213 |
| 214 if (rv == ERR_IO_PENDING) { | 214 if (rv == ERR_IO_PENDING) { |
| 215 user_read_callback_ = callback; | 215 user_read_callback_ = callback; |
| 216 } else { | 216 } else { |
| 217 user_read_buf_ = NULL; | 217 user_read_buf_ = NULL; |
| 218 user_read_buf_len_ = 0; | 218 user_read_buf_len_ = 0; |
| 219 } | 219 } |
| 220 return rv; | 220 return rv; |
| 221 } | 221 } |
| 222 | 222 |
| 223 int SSLServerSocketNSS::Write(IOBuffer* buf, int buf_len, | 223 int SSLServerSocketNSS::Write(IOBuffer* buf, int buf_len, |
| 224 const CompletionCallback& callback) { | 224 const CompletionCallback& callback) { |
| 225 DCHECK(user_write_callback_.is_null()); | 225 DCHECK(user_write_callback_.is_null()); |
| 226 DCHECK(!user_write_buf_); | 226 DCHECK(!user_write_buf_.get()); |
| 227 DCHECK(nss_bufs_); | 227 DCHECK(nss_bufs_); |
| 228 DCHECK(!callback.is_null()); | 228 DCHECK(!callback.is_null()); |
| 229 | 229 |
| 230 user_write_buf_ = buf; | 230 user_write_buf_ = buf; |
| 231 user_write_buf_len_ = buf_len; | 231 user_write_buf_len_ = buf_len; |
| 232 | 232 |
| 233 int rv = DoWriteLoop(OK); | 233 int rv = DoWriteLoop(OK); |
| 234 | 234 |
| 235 if (rv == ERR_IO_PENDING) { | 235 if (rv == ERR_IO_PENDING) { |
| 236 user_write_callback_ = callback; | 236 user_write_callback_ = callback; |
| (...skipping 242 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 479 void SSLServerSocketNSS::OnSendComplete(int result) { | 479 void SSLServerSocketNSS::OnSendComplete(int result) { |
| 480 if (next_handshake_state_ == STATE_HANDSHAKE) { | 480 if (next_handshake_state_ == STATE_HANDSHAKE) { |
| 481 // In handshake phase. | 481 // In handshake phase. |
| 482 OnHandshakeIOComplete(result); | 482 OnHandshakeIOComplete(result); |
| 483 return; | 483 return; |
| 484 } | 484 } |
| 485 | 485 |
| 486 if (!completed_handshake_) | 486 if (!completed_handshake_) |
| 487 return; | 487 return; |
| 488 | 488 |
| 489 if (user_write_buf_) { | 489 if (user_write_buf_.get()) { |
| 490 int rv = DoWriteLoop(result); | 490 int rv = DoWriteLoop(result); |
| 491 if (rv != ERR_IO_PENDING) | 491 if (rv != ERR_IO_PENDING) |
| 492 DoWriteCallback(rv); | 492 DoWriteCallback(rv); |
| 493 } else { | 493 } else { |
| 494 // Ensure that any queued ciphertext is flushed. | 494 // Ensure that any queued ciphertext is flushed. |
| 495 DoTransportIO(); | 495 DoTransportIO(); |
| 496 } | 496 } |
| 497 } | 497 } |
| 498 | 498 |
| 499 void SSLServerSocketNSS::OnRecvComplete(int result) { | 499 void SSLServerSocketNSS::OnRecvComplete(int result) { |
| 500 if (next_handshake_state_ == STATE_HANDSHAKE) { | 500 if (next_handshake_state_ == STATE_HANDSHAKE) { |
| 501 // In handshake phase. | 501 // In handshake phase. |
| 502 OnHandshakeIOComplete(result); | 502 OnHandshakeIOComplete(result); |
| 503 return; | 503 return; |
| 504 } | 504 } |
| 505 | 505 |
| 506 // Network layer received some data, check if client requested to read | 506 // Network layer received some data, check if client requested to read |
| 507 // decrypted data. | 507 // decrypted data. |
| 508 if (!user_read_buf_ || !completed_handshake_) | 508 if (!user_read_buf_.get() || !completed_handshake_) |
| 509 return; | 509 return; |
| 510 | 510 |
| 511 int rv = DoReadLoop(result); | 511 int rv = DoReadLoop(result); |
| 512 if (rv != ERR_IO_PENDING) | 512 if (rv != ERR_IO_PENDING) |
| 513 DoReadCallback(rv); | 513 DoReadCallback(rv); |
| 514 } | 514 } |
| 515 | 515 |
| 516 void SSLServerSocketNSS::OnHandshakeIOComplete(int result) { | 516 void SSLServerSocketNSS::OnHandshakeIOComplete(int result) { |
| 517 int rv = DoHandshakeLoop(result); | 517 int rv = DoHandshakeLoop(result); |
| 518 if (rv != ERR_IO_PENDING) { | 518 if (rv != ERR_IO_PENDING) { |
| (...skipping 15 matching lines...) Expand all Loading... |
| 534 unsigned int len1, len2; | 534 unsigned int len1, len2; |
| 535 memio_GetWriteParams(nss_bufs_, &buf1, &len1, &buf2, &len2); | 535 memio_GetWriteParams(nss_bufs_, &buf1, &len1, &buf2, &len2); |
| 536 const unsigned int len = len1 + len2; | 536 const unsigned int len = len1 + len2; |
| 537 | 537 |
| 538 int rv = 0; | 538 int rv = 0; |
| 539 if (len) { | 539 if (len) { |
| 540 scoped_refptr<IOBuffer> send_buffer(new IOBuffer(len)); | 540 scoped_refptr<IOBuffer> send_buffer(new IOBuffer(len)); |
| 541 memcpy(send_buffer->data(), buf1, len1); | 541 memcpy(send_buffer->data(), buf1, len1); |
| 542 memcpy(send_buffer->data() + len1, buf2, len2); | 542 memcpy(send_buffer->data() + len1, buf2, len2); |
| 543 rv = transport_socket_->Write( | 543 rv = transport_socket_->Write( |
| 544 send_buffer, len, | 544 send_buffer.get(), |
| 545 len, |
| 545 base::Bind(&SSLServerSocketNSS::BufferSendComplete, | 546 base::Bind(&SSLServerSocketNSS::BufferSendComplete, |
| 546 base::Unretained(this))); | 547 base::Unretained(this))); |
| 547 if (rv == ERR_IO_PENDING) { | 548 if (rv == ERR_IO_PENDING) { |
| 548 transport_send_busy_ = true; | 549 transport_send_busy_ = true; |
| 549 } else { | 550 } else { |
| 550 memio_PutWriteResult(nss_bufs_, MapErrorToNSS(rv)); | 551 memio_PutWriteResult(nss_bufs_, MapErrorToNSS(rv)); |
| 551 } | 552 } |
| 552 } | 553 } |
| 553 | 554 |
| 554 return rv; | 555 return rv; |
| (...skipping 10 matching lines...) Expand all Loading... |
| 565 | 566 |
| 566 char* buf; | 567 char* buf; |
| 567 int nb = memio_GetReadParams(nss_bufs_, &buf); | 568 int nb = memio_GetReadParams(nss_bufs_, &buf); |
| 568 int rv; | 569 int rv; |
| 569 if (!nb) { | 570 if (!nb) { |
| 570 // buffer too full to read into, so no I/O possible at moment | 571 // buffer too full to read into, so no I/O possible at moment |
| 571 rv = ERR_IO_PENDING; | 572 rv = ERR_IO_PENDING; |
| 572 } else { | 573 } else { |
| 573 recv_buffer_ = new IOBuffer(nb); | 574 recv_buffer_ = new IOBuffer(nb); |
| 574 rv = transport_socket_->Read( | 575 rv = transport_socket_->Read( |
| 575 recv_buffer_, nb, | 576 recv_buffer_.get(), |
| 577 nb, |
| 576 base::Bind(&SSLServerSocketNSS::BufferRecvComplete, | 578 base::Bind(&SSLServerSocketNSS::BufferRecvComplete, |
| 577 base::Unretained(this))); | 579 base::Unretained(this))); |
| 578 if (rv == ERR_IO_PENDING) { | 580 if (rv == ERR_IO_PENDING) { |
| 579 transport_recv_busy_ = true; | 581 transport_recv_busy_ = true; |
| 580 } else { | 582 } else { |
| 581 if (rv > 0) | 583 if (rv > 0) |
| 582 memcpy(buf, recv_buffer_->data(), rv); | 584 memcpy(buf, recv_buffer_->data(), rv); |
| 583 memio_PutReadResult(nss_bufs_, MapErrorToNSS(rv)); | 585 memio_PutReadResult(nss_bufs_, MapErrorToNSS(rv)); |
| 584 recv_buffer_ = NULL; | 586 recv_buffer_ = NULL; |
| 585 } | 587 } |
| (...skipping 27 matching lines...) Expand all Loading... |
| 613 if (rv > 0) | 615 if (rv > 0) |
| 614 network_moved = true; | 616 network_moved = true; |
| 615 } while (rv > 0); | 617 } while (rv > 0); |
| 616 if (BufferRecv() >= 0) | 618 if (BufferRecv() >= 0) |
| 617 network_moved = true; | 619 network_moved = true; |
| 618 } | 620 } |
| 619 return network_moved; | 621 return network_moved; |
| 620 } | 622 } |
| 621 | 623 |
| 622 int SSLServerSocketNSS::DoPayloadRead() { | 624 int SSLServerSocketNSS::DoPayloadRead() { |
| 623 DCHECK(user_read_buf_); | 625 DCHECK(user_read_buf_.get()); |
| 624 DCHECK_GT(user_read_buf_len_, 0); | 626 DCHECK_GT(user_read_buf_len_, 0); |
| 625 int rv = PR_Read(nss_fd_, user_read_buf_->data(), user_read_buf_len_); | 627 int rv = PR_Read(nss_fd_, user_read_buf_->data(), user_read_buf_len_); |
| 626 if (rv >= 0) | 628 if (rv >= 0) |
| 627 return rv; | 629 return rv; |
| 628 PRErrorCode prerr = PR_GetError(); | 630 PRErrorCode prerr = PR_GetError(); |
| 629 if (prerr == PR_WOULD_BLOCK_ERROR) { | 631 if (prerr == PR_WOULD_BLOCK_ERROR) { |
| 630 return ERR_IO_PENDING; | 632 return ERR_IO_PENDING; |
| 631 } | 633 } |
| 632 rv = MapNSSError(prerr); | 634 rv = MapNSSError(prerr); |
| 633 net_log_.AddEvent(NetLog::TYPE_SSL_READ_ERROR, | 635 net_log_.AddEvent(NetLog::TYPE_SSL_READ_ERROR, |
| 634 CreateNetLogSSLErrorCallback(rv, prerr)); | 636 CreateNetLogSSLErrorCallback(rv, prerr)); |
| 635 return rv; | 637 return rv; |
| 636 } | 638 } |
| 637 | 639 |
| 638 int SSLServerSocketNSS::DoPayloadWrite() { | 640 int SSLServerSocketNSS::DoPayloadWrite() { |
| 639 DCHECK(user_write_buf_); | 641 DCHECK(user_write_buf_.get()); |
| 640 int rv = PR_Write(nss_fd_, user_write_buf_->data(), user_write_buf_len_); | 642 int rv = PR_Write(nss_fd_, user_write_buf_->data(), user_write_buf_len_); |
| 641 if (rv >= 0) | 643 if (rv >= 0) |
| 642 return rv; | 644 return rv; |
| 643 PRErrorCode prerr = PR_GetError(); | 645 PRErrorCode prerr = PR_GetError(); |
| 644 if (prerr == PR_WOULD_BLOCK_ERROR) { | 646 if (prerr == PR_WOULD_BLOCK_ERROR) { |
| 645 return ERR_IO_PENDING; | 647 return ERR_IO_PENDING; |
| 646 } | 648 } |
| 647 rv = MapNSSError(prerr); | 649 rv = MapNSSError(prerr); |
| 648 net_log_.AddEvent(NetLog::TYPE_SSL_WRITE_ERROR, | 650 net_log_.AddEvent(NetLog::TYPE_SSL_WRITE_ERROR, |
| 649 CreateNetLogSSLErrorCallback(rv, prerr)); | 651 CreateNetLogSSLErrorCallback(rv, prerr)); |
| (...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 816 // initializes the NSS base library. | 818 // initializes the NSS base library. |
| 817 EnsureNSSSSLInit(); | 819 EnsureNSSSSLInit(); |
| 818 if (!NSS_IsInitialized()) | 820 if (!NSS_IsInitialized()) |
| 819 return ERR_UNEXPECTED; | 821 return ERR_UNEXPECTED; |
| 820 | 822 |
| 821 EnableSSLServerSockets(); | 823 EnableSSLServerSockets(); |
| 822 return OK; | 824 return OK; |
| 823 } | 825 } |
| 824 | 826 |
| 825 } // namespace net | 827 } // namespace net |
| OLD | NEW |