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