Chromium Code Reviews| Index: net/socket/ssl_server_socket_openssl.cc |
| diff --git a/net/socket/ssl_server_socket_openssl.cc b/net/socket/ssl_server_socket_openssl.cc |
| index 9736b603753951373803b8fb27099e46f63883ab..ab917df911a3c4fa3c690bdf054afccbf736a77b 100644 |
| --- a/net/socket/ssl_server_socket_openssl.cc |
| +++ b/net/socket/ssl_server_socket_openssl.cc |
| @@ -19,7 +19,6 @@ |
| #include "net/cert/client_cert_verifier.h" |
| #include "net/cert/x509_util_openssl.h" |
| #include "net/ssl/openssl_ssl_util.h" |
| -#include "net/ssl/scoped_openssl_types.h" |
| #include "net/ssl/ssl_connection_status_flags.h" |
| #include "net/ssl/ssl_info.h" |
| @@ -63,32 +62,66 @@ void DoNothingOnCompletion(int ignore) {} |
| } // namespace |
| +scoped_ptr<SSLServerSocketContext> CreateSSLServerSocketContext( |
| + X509Certificate* certificate, |
| + const crypto::RSAPrivateKey& key, |
| + const SSLServerConfig& ssl_server_config) { |
| + crypto::EnsureOpenSSLInit(); |
| + return scoped_ptr<SSLServerSocketContext>( |
| + new SSLServerSocketContextOpenSSL(certificate, key, ssl_server_config)); |
| +} |
| + |
| void EnableSSLServerSockets() { |
| // No-op because CreateSSLServerSocket() calls crypto::EnsureOpenSSLInit(). |
| } |
| -scoped_ptr<SSLServerSocket> CreateSSLServerSocket( |
| - scoped_ptr<StreamSocket> socket, |
| - X509Certificate* certificate, |
| +SSLServerSocketContextOpenSSL::SSLServerSocketContextOpenSSL( |
| + scoped_refptr<X509Certificate> certificate, |
| const crypto::RSAPrivateKey& key, |
| - const SSLServerConfig& ssl_server_config) { |
| + const SSLServerConfig& ssl_server_config) |
| + : ssl_ctx_(SSL_CTX_new(SSLv23_server_method())), |
|
davidben
2016/01/22 23:57:48
Nit: It's the same thing, but this ought to be TLS
ryanchung
2016/01/29 23:28:15
Done.
|
| + ssl_server_config_(ssl_server_config), |
| + cert_(certificate), |
| + key_(key.Copy()) { |
| + SSL_CTX_set_session_cache_mode(ssl_ctx_.get(), SSL_SESS_CACHE_SERVER); |
| + int session_ctx_id = 0; |
| + SSL_CTX_set_session_id_context( |
| + ssl_ctx_.get(), (unsigned char*)&session_ctx_id, sizeof(session_ctx_id)); |
|
davidben
2016/01/22 23:57:48
unsigned char -> uint8_t. Also C++-style casts. Bu
ryanchung
2016/01/29 23:28:15
Done.
|
| + |
| + if (ssl_server_config_.require_client_cert) { |
| + SSL_CTX_set_verify(ssl_ctx_.get(), |
| + SSL_VERIFY_PEER | SSL_VERIFY_FAIL_IF_NO_PEER_CERT, NULL); |
| + } |
| + SSL_CTX_set_cert_verify_callback(ssl_ctx_.get(), |
| + SSLServerSocketOpenSSL::CertVerifyCallback, |
| + ssl_server_config_.client_cert_verifier); |
| + CHECK(key_); |
|
davidben
2016/01/22 23:57:48
This probably should be the first line.
ryanchung
2016/01/29 23:28:16
Done.
|
| +} |
| + |
| +SSLServerSocketContextOpenSSL::~SSLServerSocketContextOpenSSL() {} |
| + |
| +scoped_ptr<SSLServerSocket> |
| +SSLServerSocketContextOpenSSL::CreateSSLServerSocket( |
| + scoped_ptr<StreamSocket> socket) { |
| crypto::EnsureOpenSSLInit(); |
| + SSL* ssl = SSL_new(ssl_ctx_.get()); |
| return scoped_ptr<SSLServerSocket>(new SSLServerSocketOpenSSL( |
| - std::move(socket), certificate, key, ssl_server_config)); |
| + std::move(socket), cert_.get(), *key_, ssl_server_config_, ssl)); |
| } |
| SSLServerSocketOpenSSL::SSLServerSocketOpenSSL( |
| scoped_ptr<StreamSocket> transport_socket, |
| scoped_refptr<X509Certificate> certificate, |
| const crypto::RSAPrivateKey& key, |
| - const SSLServerConfig& ssl_server_config) |
| + const SSLServerConfig& ssl_server_config, |
| + 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_(NULL), |
| + ssl_(ssl), |
| transport_bio_(NULL), |
| transport_socket_(std::move(transport_socket)), |
| ssl_server_config_(ssl_server_config), |
| @@ -681,19 +714,10 @@ void SSLServerSocketOpenSSL::DoWriteCallback(int rv) { |
| } |
| int SSLServerSocketOpenSSL::Init() { |
| - DCHECK(!ssl_); |
| DCHECK(!transport_bio_); |
| crypto::OpenSSLErrStackTracer err_tracer(FROM_HERE); |
| - ScopedSSL_CTX ssl_ctx(SSL_CTX_new(SSLv23_server_method())); |
| - if (ssl_server_config_.require_client_cert) { |
| - SSL_CTX_set_verify(ssl_ctx.get(), |
| - SSL_VERIFY_PEER | SSL_VERIFY_FAIL_IF_NO_PEER_CERT, NULL); |
| - } |
| - SSL_CTX_set_cert_verify_callback(ssl_ctx.get(), CertVerifyCallback, |
| - ssl_server_config_.client_cert_verifier); |
| - ssl_ = SSL_new(ssl_ctx.get()); |
| if (!ssl_) |
| return ERR_UNEXPECTED; |
| @@ -748,6 +772,7 @@ int SSLServerSocketOpenSSL::Init() { |
| // set everything we care about to an absolute value. |
| SslSetClearMask options; |
| options.ConfigureFlag(SSL_OP_NO_COMPRESSION, true); |
| + options.ConfigureFlag(SSL_OP_NO_TICKET, true); |
|
davidben
2016/01/22 23:57:48
Why turn off tickets? I can't think of any reason
ryanchung
2016/01/29 23:28:15
Done. Should not be turned off. Line removed.
|
| SSL_set_options(ssl_, options.set_mask); |
| SSL_clear_options(ssl_, options.clear_mask); |