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 // This file includes code SSLClientSocketNSS::DoVerifyCertComplete() derived | 5 // This file includes code SSLClientSocketNSS::DoVerifyCertComplete() derived |
6 // from AuthCertificateCallback() in | 6 // from AuthCertificateCallback() in |
7 // mozilla/security/manager/ssl/src/nsNSSCallbacks.cpp. | 7 // mozilla/security/manager/ssl/src/nsNSSCallbacks.cpp. |
8 | 8 |
9 /* ***** BEGIN LICENSE BLOCK ***** | 9 /* ***** BEGIN LICENSE BLOCK ***** |
10 * Version: MPL 1.1/GPL 2.0/LGPL 2.1 | 10 * Version: MPL 1.1/GPL 2.0/LGPL 2.1 |
(...skipping 412 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
423 | 423 |
424 } // namespace | 424 } // namespace |
425 | 425 |
426 SSLClientSocketNSS::SSLClientSocketNSS(ClientSocketHandle* transport_socket, | 426 SSLClientSocketNSS::SSLClientSocketNSS(ClientSocketHandle* transport_socket, |
427 const HostPortPair& host_and_port, | 427 const HostPortPair& host_and_port, |
428 const SSLConfig& ssl_config, | 428 const SSLConfig& ssl_config, |
429 SSLHostInfo* ssl_host_info, | 429 SSLHostInfo* ssl_host_info, |
430 const SSLClientSocketContext& context) | 430 const SSLClientSocketContext& context) |
431 : transport_send_busy_(false), | 431 : transport_send_busy_(false), |
432 transport_recv_busy_(false), | 432 transport_recv_busy_(false), |
| 433 transport_recv_eof_(false), |
433 transport_(transport_socket), | 434 transport_(transport_socket), |
434 host_and_port_(host_and_port), | 435 host_and_port_(host_and_port), |
435 ssl_config_(ssl_config), | 436 ssl_config_(ssl_config), |
436 user_read_buf_len_(0), | 437 user_read_buf_len_(0), |
437 user_write_buf_len_(0), | 438 user_write_buf_len_(0), |
438 server_cert_nss_(NULL), | 439 server_cert_nss_(NULL), |
439 server_cert_verify_result_(NULL), | 440 server_cert_verify_result_(NULL), |
440 ssl_connection_status_(0), | 441 ssl_connection_status_(0), |
441 client_auth_cert_needed_(false), | 442 client_auth_cert_needed_(false), |
442 cert_verifier_(context.cert_verifier), | 443 cert_verifier_(context.cert_verifier), |
(...skipping 183 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
626 PR_Close(nss_fd_); | 627 PR_Close(nss_fd_); |
627 nss_fd_ = NULL; | 628 nss_fd_ = NULL; |
628 } | 629 } |
629 | 630 |
630 // Reset object state. | 631 // Reset object state. |
631 user_connect_callback_.Reset(); | 632 user_connect_callback_.Reset(); |
632 user_read_callback_.Reset(); | 633 user_read_callback_.Reset(); |
633 user_write_callback_.Reset(); | 634 user_write_callback_.Reset(); |
634 transport_send_busy_ = false; | 635 transport_send_busy_ = false; |
635 transport_recv_busy_ = false; | 636 transport_recv_busy_ = false; |
| 637 transport_recv_eof_ = false; |
636 user_read_buf_ = NULL; | 638 user_read_buf_ = NULL; |
637 user_read_buf_len_ = 0; | 639 user_read_buf_len_ = 0; |
638 user_write_buf_ = NULL; | 640 user_write_buf_ = NULL; |
639 user_write_buf_len_ = 0; | 641 user_write_buf_len_ = 0; |
640 server_cert_ = NULL; | 642 server_cert_ = NULL; |
641 if (server_cert_nss_) { | 643 if (server_cert_nss_) { |
642 CERT_DestroyCertificate(server_cert_nss_); | 644 CERT_DestroyCertificate(server_cert_nss_); |
643 server_cert_nss_ = NULL; | 645 server_cert_nss_ = NULL; |
644 } | 646 } |
645 local_server_cert_verify_result_.Reset(); | 647 local_server_cert_verify_result_.Reset(); |
(...skipping 566 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1212 int rv_write = ERR_IO_PENDING; | 1214 int rv_write = ERR_IO_PENDING; |
1213 bool network_moved; | 1215 bool network_moved; |
1214 do { | 1216 do { |
1215 if (user_read_buf_) | 1217 if (user_read_buf_) |
1216 rv_read = DoPayloadRead(); | 1218 rv_read = DoPayloadRead(); |
1217 if (user_write_buf_) | 1219 if (user_write_buf_) |
1218 rv_write = DoPayloadWrite(); | 1220 rv_write = DoPayloadWrite(); |
1219 network_moved = DoTransportIO(); | 1221 network_moved = DoTransportIO(); |
1220 } while (rv_read == ERR_IO_PENDING && | 1222 } while (rv_read == ERR_IO_PENDING && |
1221 rv_write == ERR_IO_PENDING && | 1223 rv_write == ERR_IO_PENDING && |
| 1224 (user_read_buf_ || user_write_buf_) && |
1222 network_moved); | 1225 network_moved); |
1223 | 1226 |
1224 if (user_read_buf_ && rv_read != ERR_IO_PENDING) | 1227 if (user_read_buf_ && rv_read != ERR_IO_PENDING) |
1225 DoReadCallback(rv_read); | 1228 DoReadCallback(rv_read); |
1226 if (user_write_buf_ && rv_write != ERR_IO_PENDING) | 1229 if (user_write_buf_ && rv_write != ERR_IO_PENDING) |
1227 DoWriteCallback(rv_write); | 1230 DoWriteCallback(rv_write); |
1228 | 1231 |
1229 LeaveFunction(""); | 1232 LeaveFunction(""); |
1230 } | 1233 } |
1231 | 1234 |
(...skipping 683 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1915 bool network_moved = false; | 1918 bool network_moved = false; |
1916 if (nss_bufs_ != NULL) { | 1919 if (nss_bufs_ != NULL) { |
1917 int rv; | 1920 int rv; |
1918 // Read and write as much data as we can. The loop is neccessary | 1921 // Read and write as much data as we can. The loop is neccessary |
1919 // because Write() may return synchronously. | 1922 // because Write() may return synchronously. |
1920 do { | 1923 do { |
1921 rv = BufferSend(); | 1924 rv = BufferSend(); |
1922 if (rv > 0) | 1925 if (rv > 0) |
1923 network_moved = true; | 1926 network_moved = true; |
1924 } while (rv > 0); | 1927 } while (rv > 0); |
1925 if (BufferRecv() >= 0) | 1928 if (!transport_recv_eof_ && BufferRecv() >= 0) |
1926 network_moved = true; | 1929 network_moved = true; |
1927 } | 1930 } |
1928 LeaveFunction(network_moved); | 1931 LeaveFunction(network_moved); |
1929 return network_moved; | 1932 return network_moved; |
1930 } | 1933 } |
1931 | 1934 |
1932 // Return 0 for EOF, | 1935 // Return 0 for EOF, |
1933 // > 0 for bytes transferred immediately, | 1936 // > 0 for bytes transferred immediately, |
1934 // < 0 for error (or the non-error ERR_IO_PENDING). | 1937 // < 0 for error (or the non-error ERR_IO_PENDING). |
1935 int SSLClientSocketNSS::BufferSend(void) { | 1938 int SSLClientSocketNSS::BufferSend() { |
1936 if (transport_send_busy_) | 1939 if (transport_send_busy_) |
1937 return ERR_IO_PENDING; | 1940 return ERR_IO_PENDING; |
1938 | 1941 |
1939 EnterFunction(""); | 1942 EnterFunction(""); |
1940 const char* buf1; | 1943 const char* buf1; |
1941 const char* buf2; | 1944 const char* buf2; |
1942 unsigned int len1, len2; | 1945 unsigned int len1, len2; |
1943 memio_GetWriteParams(nss_bufs_, &buf1, &len1, &buf2, &len2); | 1946 memio_GetWriteParams(nss_bufs_, &buf1, &len1, &buf2, &len2); |
1944 const unsigned int len = len1 + len2; | 1947 const unsigned int len = len1 + len2; |
1945 | 1948 |
(...skipping 18 matching lines...) Expand all Loading... |
1964 } | 1967 } |
1965 | 1968 |
1966 void SSLClientSocketNSS::BufferSendComplete(int result) { | 1969 void SSLClientSocketNSS::BufferSendComplete(int result) { |
1967 EnterFunction(result); | 1970 EnterFunction(result); |
1968 memio_PutWriteResult(nss_bufs_, MapErrorToNSS(result)); | 1971 memio_PutWriteResult(nss_bufs_, MapErrorToNSS(result)); |
1969 transport_send_busy_ = false; | 1972 transport_send_busy_ = false; |
1970 OnSendComplete(result); | 1973 OnSendComplete(result); |
1971 LeaveFunction(""); | 1974 LeaveFunction(""); |
1972 } | 1975 } |
1973 | 1976 |
1974 int SSLClientSocketNSS::BufferRecv(void) { | 1977 int SSLClientSocketNSS::BufferRecv() { |
1975 if (transport_recv_busy_) return ERR_IO_PENDING; | 1978 if (transport_recv_busy_) return ERR_IO_PENDING; |
1976 | 1979 |
1977 char* buf; | 1980 char* buf; |
1978 int nb = memio_GetReadParams(nss_bufs_, &buf); | 1981 int nb = memio_GetReadParams(nss_bufs_, &buf); |
1979 EnterFunction(nb); | 1982 EnterFunction(nb); |
1980 int rv; | 1983 int rv; |
1981 if (!nb) { | 1984 if (!nb) { |
1982 // buffer too full to read into, so no I/O possible at moment | 1985 // buffer too full to read into, so no I/O possible at moment |
1983 rv = ERR_IO_PENDING; | 1986 rv = ERR_IO_PENDING; |
1984 } else { | 1987 } else { |
1985 recv_buffer_ = new IOBuffer(nb); | 1988 recv_buffer_ = new IOBuffer(nb); |
1986 rv = transport_->socket()->Read( | 1989 rv = transport_->socket()->Read( |
1987 recv_buffer_, nb, | 1990 recv_buffer_, nb, |
1988 base::Bind(&SSLClientSocketNSS::BufferRecvComplete, | 1991 base::Bind(&SSLClientSocketNSS::BufferRecvComplete, |
1989 base::Unretained(this))); | 1992 base::Unretained(this))); |
1990 if (rv == ERR_IO_PENDING) { | 1993 if (rv == ERR_IO_PENDING) { |
1991 transport_recv_busy_ = true; | 1994 transport_recv_busy_ = true; |
1992 } else { | 1995 } else { |
1993 if (rv > 0) | 1996 if (rv > 0) { |
1994 memcpy(buf, recv_buffer_->data(), rv); | 1997 memcpy(buf, recv_buffer_->data(), rv); |
| 1998 } else if (rv == 0) { |
| 1999 transport_recv_eof_ = true; |
| 2000 } |
1995 memio_PutReadResult(nss_bufs_, MapErrorToNSS(rv)); | 2001 memio_PutReadResult(nss_bufs_, MapErrorToNSS(rv)); |
1996 recv_buffer_ = NULL; | 2002 recv_buffer_ = NULL; |
1997 } | 2003 } |
1998 } | 2004 } |
1999 LeaveFunction(rv); | 2005 LeaveFunction(rv); |
2000 return rv; | 2006 return rv; |
2001 } | 2007 } |
2002 | 2008 |
2003 void SSLClientSocketNSS::BufferRecvComplete(int result) { | 2009 void SSLClientSocketNSS::BufferRecvComplete(int result) { |
2004 EnterFunction(result); | 2010 EnterFunction(result); |
2005 if (result > 0) { | 2011 if (result > 0) { |
2006 char* buf; | 2012 char* buf; |
2007 memio_GetReadParams(nss_bufs_, &buf); | 2013 memio_GetReadParams(nss_bufs_, &buf); |
2008 memcpy(buf, recv_buffer_->data(), result); | 2014 memcpy(buf, recv_buffer_->data(), result); |
| 2015 } else if (result == 0) { |
| 2016 transport_recv_eof_ = true; |
2009 } | 2017 } |
2010 recv_buffer_ = NULL; | 2018 recv_buffer_ = NULL; |
2011 memio_PutReadResult(nss_bufs_, MapErrorToNSS(result)); | 2019 memio_PutReadResult(nss_bufs_, MapErrorToNSS(result)); |
2012 transport_recv_busy_ = false; | 2020 transport_recv_busy_ = false; |
2013 OnRecvComplete(result); | 2021 OnRecvComplete(result); |
2014 LeaveFunction(""); | 2022 LeaveFunction(""); |
2015 } | 2023 } |
2016 | 2024 |
2017 int SSLClientSocketNSS::HandleNSSError(PRErrorCode nss_error, | 2025 int SSLClientSocketNSS::HandleNSSError(PRErrorCode nss_error, |
2018 bool handshake_error) { | 2026 bool handshake_error) { |
(...skipping 621 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2640 EnsureThreadIdAssigned(); | 2648 EnsureThreadIdAssigned(); |
2641 base::AutoLock auto_lock(lock_); | 2649 base::AutoLock auto_lock(lock_); |
2642 return valid_thread_id_ == base::PlatformThread::CurrentId(); | 2650 return valid_thread_id_ == base::PlatformThread::CurrentId(); |
2643 } | 2651 } |
2644 | 2652 |
2645 ServerBoundCertService* SSLClientSocketNSS::GetServerBoundCertService() const { | 2653 ServerBoundCertService* SSLClientSocketNSS::GetServerBoundCertService() const { |
2646 return server_bound_cert_service_; | 2654 return server_bound_cert_service_; |
2647 } | 2655 } |
2648 | 2656 |
2649 } // namespace net | 2657 } // namespace net |
OLD | NEW |