Chromium Code Reviews| 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 // OpenSSL binding for SSLClientSocket. The class layout and general principle | 5 // OpenSSL binding for SSLClientSocket. The class layout and general principle |
| 6 // of operation is derived from SSLClientSocketNSS. | 6 // of operation is derived from SSLClientSocketNSS. |
| 7 | 7 |
| 8 #include "net/socket/ssl_client_socket_openssl.h" | 8 #include "net/socket/ssl_client_socket_openssl.h" |
| 9 | 9 |
| 10 #include <openssl/ssl.h> | 10 #include <openssl/ssl.h> |
| (...skipping 407 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 418 } | 418 } |
| 419 | 419 |
| 420 SSLClientSocketOpenSSL::SSLClientSocketOpenSSL( | 420 SSLClientSocketOpenSSL::SSLClientSocketOpenSSL( |
| 421 ClientSocketHandle* transport_socket, | 421 ClientSocketHandle* transport_socket, |
| 422 const HostPortPair& host_and_port, | 422 const HostPortPair& host_and_port, |
| 423 const SSLConfig& ssl_config, | 423 const SSLConfig& ssl_config, |
| 424 const SSLClientSocketContext& context) | 424 const SSLClientSocketContext& context) |
| 425 : transport_send_busy_(false), | 425 : transport_send_busy_(false), |
| 426 transport_recv_busy_(false), | 426 transport_recv_busy_(false), |
| 427 transport_recv_eof_(false), | 427 transport_recv_eof_(false), |
| 428 pending_read_error_(1), | |
| 428 completed_handshake_(false), | 429 completed_handshake_(false), |
| 429 client_auth_cert_needed_(false), | 430 client_auth_cert_needed_(false), |
| 430 cert_verifier_(context.cert_verifier), | 431 cert_verifier_(context.cert_verifier), |
| 431 ssl_(NULL), | 432 ssl_(NULL), |
| 432 transport_bio_(NULL), | 433 transport_bio_(NULL), |
| 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 ssl_session_cache_shard_(context.ssl_session_cache_shard), | 437 ssl_session_cache_shard_(context.ssl_session_cache_shard), |
| 437 trying_cached_session_(false), | 438 trying_cached_session_(false), |
| (...skipping 895 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1333 bool SSLClientSocketOpenSSL::SetReceiveBufferSize(int32 size) { | 1334 bool SSLClientSocketOpenSSL::SetReceiveBufferSize(int32 size) { |
| 1334 return transport_->socket()->SetReceiveBufferSize(size); | 1335 return transport_->socket()->SetReceiveBufferSize(size); |
| 1335 } | 1336 } |
| 1336 | 1337 |
| 1337 bool SSLClientSocketOpenSSL::SetSendBufferSize(int32 size) { | 1338 bool SSLClientSocketOpenSSL::SetSendBufferSize(int32 size) { |
| 1338 return transport_->socket()->SetSendBufferSize(size); | 1339 return transport_->socket()->SetSendBufferSize(size); |
| 1339 } | 1340 } |
| 1340 | 1341 |
| 1341 int SSLClientSocketOpenSSL::DoPayloadRead() { | 1342 int SSLClientSocketOpenSSL::DoPayloadRead() { |
| 1342 crypto::OpenSSLErrStackTracer err_tracer(FROM_HERE); | 1343 crypto::OpenSSLErrStackTracer err_tracer(FROM_HERE); |
| 1343 int rv = SSL_read(ssl_, user_read_buf_->data(), user_read_buf_len_); | 1344 |
| 1344 // We don't need to invalidate the non-client-authenticated SSL session | 1345 int rv; |
| 1345 // because the server will renegotiate anyway. | 1346 if (pending_read_error_ <= 0) { |
| 1346 if (client_auth_cert_needed_) | 1347 rv = pending_read_error_; |
| 1347 return ERR_SSL_CLIENT_AUTH_CERT_NEEDED; | 1348 pending_read_error_ = 1; |
|
wtc
2013/02/13 22:06:51
If rv == 0, we need to log a NetLog::TYPE_SSL_SOCK
| |
| 1349 return rv; | |
| 1350 } | |
| 1351 | |
| 1352 int total_bytes_read = 0; | |
| 1353 do { | |
| 1354 rv = SSL_read(ssl_, user_read_buf_->data() + total_bytes_read, | |
| 1355 user_read_buf_len_ - total_bytes_read); | |
| 1356 if (rv > 0) | |
| 1357 total_bytes_read += rv; | |
| 1358 } while (total_bytes_read < user_read_buf_len_ && rv > 0); | |
| 1359 | |
| 1360 if (total_bytes_read == user_read_buf_len_) { | |
| 1361 rv = total_bytes_read; | |
| 1362 } else { | |
| 1363 int *next_result = &rv; | |
| 1364 if (total_bytes_read > 0) { | |
| 1365 pending_read_error_ = rv; | |
|
Ryan Hamilton
2013/02/13 17:23:18
It looks like this is the only place you assign a
Ryan Sleevi
2013/02/13 20:44:43
Actually, this is a "failure" value (it can only b
Ryan Hamilton
2013/02/13 21:50:34
As part of this CL, or in a different one?
| |
| 1366 rv = total_bytes_read; | |
| 1367 next_result = &pending_read_error_; | |
| 1368 } | |
| 1369 if (client_auth_cert_needed_) { | |
| 1370 *next_result = ERR_SSL_CLIENT_AUTH_CERT_NEEDED; | |
| 1371 } else if (*next_result < 0) { | |
| 1372 int err = SSL_get_error(ssl_, *next_result); | |
| 1373 *next_result = MapOpenSSLError(err, err_tracer); | |
| 1374 } | |
| 1375 } | |
| 1348 | 1376 |
| 1349 if (rv >= 0) { | 1377 if (rv >= 0) { |
| 1350 net_log_.AddByteTransferEvent(NetLog::TYPE_SSL_SOCKET_BYTES_RECEIVED, rv, | 1378 net_log_.AddByteTransferEvent(NetLog::TYPE_SSL_SOCKET_BYTES_RECEIVED, rv, |
| 1351 user_read_buf_->data()); | 1379 user_read_buf_->data()); |
| 1352 return rv; | |
| 1353 } | 1380 } |
| 1354 | 1381 return rv; |
| 1355 int err = SSL_get_error(ssl_, rv); | |
| 1356 return MapOpenSSLError(err, err_tracer); | |
| 1357 } | 1382 } |
| 1358 | 1383 |
| 1359 int SSLClientSocketOpenSSL::DoPayloadWrite() { | 1384 int SSLClientSocketOpenSSL::DoPayloadWrite() { |
| 1360 crypto::OpenSSLErrStackTracer err_tracer(FROM_HERE); | 1385 crypto::OpenSSLErrStackTracer err_tracer(FROM_HERE); |
| 1361 int rv = SSL_write(ssl_, user_write_buf_->data(), user_write_buf_len_); | 1386 int rv = SSL_write(ssl_, user_write_buf_->data(), user_write_buf_len_); |
| 1362 | 1387 |
| 1363 if (rv >= 0) { | 1388 if (rv >= 0) { |
| 1364 net_log_.AddByteTransferEvent(NetLog::TYPE_SSL_SOCKET_BYTES_SENT, rv, | 1389 net_log_.AddByteTransferEvent(NetLog::TYPE_SSL_SOCKET_BYTES_SENT, rv, |
| 1365 user_write_buf_->data()); | 1390 user_write_buf_->data()); |
| 1366 return rv; | 1391 return rv; |
| 1367 } | 1392 } |
| 1368 | 1393 |
| 1369 int err = SSL_get_error(ssl_, rv); | 1394 int err = SSL_get_error(ssl_, rv); |
| 1370 return MapOpenSSLError(err, err_tracer); | 1395 return MapOpenSSLError(err, err_tracer); |
| 1371 } | 1396 } |
| 1372 | 1397 |
| 1373 } // namespace net | 1398 } // namespace net |
| OLD | NEW |