Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(513)

Unified Diff: net/socket/ssl_server_socket_impl.cc

Issue 2400033005: Use BoringSSL scopers in //net. (Closed)
Patch Set: eroman comments Created 4 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « net/socket/ssl_server_socket_impl.h ('k') | net/socket/ssl_server_socket_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: net/socket/ssl_server_socket_impl.cc
diff --git a/net/socket/ssl_server_socket_impl.cc b/net/socket/ssl_server_socket_impl.cc
index 56ba598bbe9033533ce8c5a05a0833d1d63f54e8..eddea2cd2a509e2796ed784a9366602a4b6613b9 100644
--- a/net/socket/ssl_server_socket_impl.cc
+++ b/net/socket/ssl_server_socket_impl.cc
@@ -6,6 +6,7 @@
#include <openssl/err.h>
#include <openssl/ssl.h>
+#include <openssl/x509.h>
#include <utility>
#include "base/callback_helpers.h"
@@ -13,7 +14,6 @@
#include "base/strings/string_util.h"
#include "crypto/openssl_util.h"
#include "crypto/rsa_private_key.h"
-#include "crypto/scoped_openssl_types.h"
#include "net/base/net_errors.h"
#include "net/cert/cert_verify_result.h"
#include "net/cert/client_cert_verifier.h"
@@ -57,7 +57,8 @@ class SSLServerSocketImpl : public SSLServerSocket {
public:
// See comments on CreateSSLServerSocket for details of how these
// parameters are used.
- SSLServerSocketImpl(std::unique_ptr<StreamSocket> socket, SSL* ssl);
+ SSLServerSocketImpl(std::unique_ptr<StreamSocket> socket,
+ bssl::UniquePtr<SSL> ssl);
~SSLServerSocketImpl() override;
// SSLServerSocket interface.
@@ -158,8 +159,8 @@ class SSLServerSocketImpl : public SSLServerSocket {
int transport_write_error_;
// OpenSSL stuff
- SSL* ssl_;
- BIO* transport_bio_;
+ bssl::UniquePtr<SSL> ssl_;
+ bssl::UniquePtr<BIO> transport_bio_;
// StreamSocket for sending and receiving data.
std::unique_ptr<StreamSocket> transport_socket_;
@@ -175,15 +176,14 @@ class SSLServerSocketImpl : public SSLServerSocket {
SSLServerSocketImpl::SSLServerSocketImpl(
std::unique_ptr<StreamSocket> transport_socket,
- SSL* ssl)
+ bssl::UniquePtr<SSL> ssl)
: transport_send_busy_(false),
transport_recv_busy_(false),
transport_recv_eof_(false),
user_read_buf_len_(0),
user_write_buf_len_(0),
transport_write_error_(OK),
- ssl_(ssl),
- transport_bio_(NULL),
+ ssl_(std::move(ssl)),
transport_socket_(std::move(transport_socket)),
next_handshake_state_(STATE_NONE),
completed_handshake_(false) {}
@@ -192,13 +192,8 @@ SSLServerSocketImpl::~SSLServerSocketImpl() {
if (ssl_) {
// Calling SSL_shutdown prevents the session from being marked as
// unresumable.
- SSL_shutdown(ssl_);
- SSL_free(ssl_);
- ssl_ = NULL;
- }
- if (transport_bio_) {
- BIO_free_all(transport_bio_);
- transport_bio_ = NULL;
+ SSL_shutdown(ssl_.get());
+ ssl_.reset();
}
}
@@ -215,7 +210,7 @@ int SSLServerSocketImpl::Handshake(const CompletionCallback& callback) {
}
// Set SSL to server mode. Handshake happens in the loop below.
- SSL_set_accept_state(ssl_);
+ SSL_set_accept_state(ssl_.get());
GotoState(STATE_HANDSHAKE);
rv = DoHandshakeLoop(OK);
@@ -240,12 +235,12 @@ int SSLServerSocketImpl::ExportKeyingMaterial(const base::StringPiece& label,
crypto::OpenSSLErrStackTracer err_tracer(FROM_HERE);
int rv = SSL_export_keying_material(
- ssl_, out, outlen, label.data(), label.size(),
+ ssl_.get(), out, outlen, label.data(), label.size(),
reinterpret_cast<const unsigned char*>(context.data()), context.length(),
context.length() > 0);
if (rv != 1) {
- int ssl_error = SSL_get_error(ssl_, rv);
+ int ssl_error = SSL_get_error(ssl_.get(), rv);
LOG(ERROR) << "Failed to export keying material;"
<< " returned " << rv << ", SSL error code " << ssl_error;
return MapOpenSSLError(ssl_error, err_tracer);
@@ -371,20 +366,20 @@ bool SSLServerSocketImpl::GetSSLInfo(SSLInfo* ssl_info) {
ssl_info->cert = client_cert_;
- const SSL_CIPHER* cipher = SSL_get_current_cipher(ssl_);
+ const SSL_CIPHER* cipher = SSL_get_current_cipher(ssl_.get());
CHECK(cipher);
ssl_info->security_bits = SSL_CIPHER_get_bits(cipher, NULL);
SSLConnectionStatusSetCipherSuite(
static_cast<uint16_t>(SSL_CIPHER_get_id(cipher)),
&ssl_info->connection_status);
- SSLConnectionStatusSetVersion(GetNetSSLVersion(ssl_),
+ SSLConnectionStatusSetVersion(GetNetSSLVersion(ssl_.get()),
&ssl_info->connection_status);
- if (!SSL_get_secure_renegotiation_support(ssl_))
+ if (!SSL_get_secure_renegotiation_support(ssl_.get()))
ssl_info->connection_status |= SSL_CONNECTION_NO_RENEGOTIATION_EXTENSION;
- ssl_info->handshake_type = SSL_session_reused(ssl_)
+ ssl_info->handshake_type = SSL_session_reused(ssl_.get())
? SSLInfo::HANDSHAKE_RESUME
: SSLInfo::HANDSHAKE_FULL;
@@ -457,11 +452,12 @@ int SSLServerSocketImpl::BufferSend() {
if (!send_buffer_) {
// Get a fresh send buffer out of the send BIO.
- size_t max_read = BIO_pending(transport_bio_);
+ size_t max_read = BIO_pending(transport_bio_.get());
if (!max_read)
return 0; // Nothing pending in the OpenSSL write BIO.
send_buffer_ = new DrainableIOBuffer(new IOBuffer(max_read), max_read);
- int read_bytes = BIO_read(transport_bio_, send_buffer_->data(), max_read);
+ int read_bytes =
+ BIO_read(transport_bio_.get(), send_buffer_->data(), max_read);
DCHECK_GT(read_bytes, 0);
CHECK_EQ(static_cast<int>(max_read), read_bytes);
}
@@ -493,14 +489,14 @@ void SSLServerSocketImpl::TransportWriteComplete(int result) {
// the BIO so it gets (re-)detected in OnSendComplete. Perhaps with
// BIO_set_callback.
DVLOG(1) << "TransportWriteComplete error " << result;
- (void)BIO_shutdown_wr(SSL_get_wbio(ssl_));
+ (void)BIO_shutdown_wr(SSL_get_wbio(ssl_.get()));
// Match the fix for http://crbug.com/249848 in NSS by erroring future reads
// from the socket after a write error.
//
// TODO(davidben): Avoid having read and write ends interact this way.
transport_write_error_ = result;
- (void)BIO_shutdown_wr(transport_bio_);
+ (void)BIO_shutdown_wr(transport_bio_.get());
send_buffer_ = NULL;
} else {
DCHECK(send_buffer_);
@@ -517,7 +513,7 @@ int SSLServerSocketImpl::BufferRecv() {
// Determine how much was requested from |transport_bio_| that was not
// actually available.
- size_t requested = BIO_ctrl_get_read_request(transport_bio_);
+ size_t requested = BIO_ctrl_get_read_request(transport_bio_.get());
if (requested == 0) {
// This is not a perfect match of error codes, as no operation is
// actually pending. However, returning 0 would be interpreted as
@@ -533,7 +529,7 @@ int SSLServerSocketImpl::BufferRecv() {
// fill |transport_bio_| is issued. As long as an SSL client socket cannot
// be gracefully shutdown (via SSL close alerts) and re-used for non-SSL
// traffic, this over-subscribed Read()ing will not cause issues.
- size_t max_write = BIO_ctrl_get_write_guarantee(transport_bio_);
+ size_t max_write = BIO_ctrl_get_write_guarantee(transport_bio_.get());
if (!max_write)
return ERR_IO_PENDING;
@@ -564,7 +560,7 @@ int SSLServerSocketImpl::TransportReadComplete(int result) {
// relay up to the SSL socket client (i.e. via DoReadCallback).
if (result == 0)
transport_recv_eof_ = true;
- (void)BIO_shutdown_wr(transport_bio_);
+ (void)BIO_shutdown_wr(transport_bio_.get());
} else if (transport_write_error_ < 0) {
// Mirror transport write errors as read failures; transport_bio_ has been
// shut down by TransportWriteComplete, so the BIO_write will fail, failing
@@ -572,7 +568,7 @@ int SSLServerSocketImpl::TransportReadComplete(int result) {
result = transport_write_error_;
} else {
DCHECK(recv_buffer_);
- int ret = BIO_write(transport_bio_, recv_buffer_->data(), result);
+ int ret = BIO_write(transport_bio_.get(), recv_buffer_->data(), result);
// A write into a memory BIO should always succeed.
DCHECK_EQ(result, ret);
}
@@ -603,10 +599,10 @@ int SSLServerSocketImpl::DoPayloadRead() {
DCHECK(user_read_buf_);
DCHECK_GT(user_read_buf_len_, 0);
crypto::OpenSSLErrStackTracer err_tracer(FROM_HERE);
- int rv = SSL_read(ssl_, user_read_buf_->data(), user_read_buf_len_);
+ int rv = SSL_read(ssl_.get(), user_read_buf_->data(), user_read_buf_len_);
if (rv >= 0)
return rv;
- int ssl_error = SSL_get_error(ssl_, rv);
+ int ssl_error = SSL_get_error(ssl_.get(), rv);
OpenSSLErrorInfo error_info;
int net_error =
MapOpenSSLErrorWithDetails(ssl_error, err_tracer, &error_info);
@@ -621,10 +617,10 @@ int SSLServerSocketImpl::DoPayloadRead() {
int SSLServerSocketImpl::DoPayloadWrite() {
DCHECK(user_write_buf_);
crypto::OpenSSLErrStackTracer err_tracer(FROM_HERE);
- int rv = SSL_write(ssl_, user_write_buf_->data(), user_write_buf_len_);
+ int rv = SSL_write(ssl_.get(), user_write_buf_->data(), user_write_buf_len_);
if (rv >= 0)
return rv;
- int ssl_error = SSL_get_error(ssl_, rv);
+ int ssl_error = SSL_get_error(ssl_.get(), rv);
OpenSSLErrorInfo error_info;
int net_error =
MapOpenSSLErrorWithDetails(ssl_error, err_tracer, &error_info);
@@ -704,22 +700,22 @@ int SSLServerSocketImpl::DoWriteLoop(int result) {
int SSLServerSocketImpl::DoHandshake() {
crypto::OpenSSLErrStackTracer err_tracer(FROM_HERE);
int net_error = OK;
- int rv = SSL_do_handshake(ssl_);
+ int rv = SSL_do_handshake(ssl_.get());
if (rv == 1) {
completed_handshake_ = true;
// The results of SSL_get_peer_certificate() must be explicitly freed.
- ScopedX509 cert(SSL_get_peer_certificate(ssl_));
+ bssl::UniquePtr<X509> cert(SSL_get_peer_certificate(ssl_.get()));
if (cert) {
// The caller does not take ownership of SSL_get_peer_cert_chain's
// results.
- STACK_OF(X509)* chain = SSL_get_peer_cert_chain(ssl_);
+ STACK_OF(X509)* chain = SSL_get_peer_cert_chain(ssl_.get());
client_cert_ = CreateX509Certificate(cert.get(), chain);
if (!client_cert_.get())
return ERR_SSL_CLIENT_AUTH_CERT_BAD_FORMAT;
}
} else {
- int ssl_error = SSL_get_error(ssl_, rv);
+ int ssl_error = SSL_get_error(ssl_.get(), rv);
OpenSSLErrorInfo error_info;
net_error = MapOpenSSLErrorWithDetails(ssl_error, err_tracer, &error_info);
@@ -775,14 +771,16 @@ int SSLServerSocketImpl::Init() {
if (!ssl_)
return ERR_UNEXPECTED;
- BIO* ssl_bio = NULL;
+ BIO* ssl_bio = nullptr;
+ BIO* transport_bio_raw = nullptr;
// 0 => use default buffer sizes.
- if (!BIO_new_bio_pair(&ssl_bio, 0, &transport_bio_, 0))
+ if (!BIO_new_bio_pair(&ssl_bio, 0, &transport_bio_raw, 0))
return ERR_UNEXPECTED;
+ transport_bio_.reset(transport_bio_raw);
DCHECK(ssl_bio);
DCHECK(transport_bio_);
- SSL_set_bio(ssl_, ssl_bio, ssl_bio);
+ SSL_set_bio(ssl_.get(), ssl_bio, ssl_bio);
return OK;
}
@@ -870,7 +868,8 @@ SSLServerContextImpl::SSLServerContextImpl(
const unsigned char* der_string_array =
reinterpret_cast<const unsigned char*>(der_string.data());
- ScopedX509 x509(d2i_X509(NULL, &der_string_array, der_string.length()));
+ bssl::UniquePtr<X509> x509(
+ d2i_X509(NULL, &der_string_array, der_string.length()));
CHECK(x509);
// On success, SSL_CTX_use_certificate acquires a reference to |x509|.
@@ -929,11 +928,12 @@ SSLServerContextImpl::SSLServerContextImpl(
if (ssl_server_config_.client_cert_type !=
SSLServerConfig::ClientCertType::NO_CLIENT_CERT &&
!ssl_server_config_.cert_authorities_.empty()) {
- ScopedX509NameStack stack(sk_X509_NAME_new_null());
+ bssl::UniquePtr<STACK_OF(X509_NAME)> stack(sk_X509_NAME_new_null());
for (const auto& authority : ssl_server_config_.cert_authorities_) {
const uint8_t* name = reinterpret_cast<const uint8_t*>(authority.c_str());
const uint8_t* name_start = name;
- ScopedX509_NAME subj(d2i_X509_NAME(nullptr, &name, authority.length()));
+ bssl::UniquePtr<X509_NAME> subj(
+ d2i_X509_NAME(nullptr, &name, authority.length()));
CHECK(subj && name == name_start + authority.length());
sk_X509_NAME_push(stack.get(), subj.release());
}
@@ -945,9 +945,9 @@ SSLServerContextImpl::~SSLServerContextImpl() {}
std::unique_ptr<SSLServerSocket> SSLServerContextImpl::CreateSSLServerSocket(
std::unique_ptr<StreamSocket> socket) {
- SSL* ssl = SSL_new(ssl_ctx_.get());
+ bssl::UniquePtr<SSL> ssl(SSL_new(ssl_ctx_.get()));
return std::unique_ptr<SSLServerSocket>(
- new SSLServerSocketImpl(std::move(socket), ssl));
+ new SSLServerSocketImpl(std::move(socket), std::move(ssl)));
}
void EnableSSLServerSockets() {
« no previous file with comments | « net/socket/ssl_server_socket_impl.h ('k') | net/socket/ssl_server_socket_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698