| 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 |