summaryrefslogtreecommitdiffstats
path: root/net/socket
diff options
context:
space:
mode:
authorjoth@chromium.org <joth@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-11-17 09:57:18 +0000
committerjoth@chromium.org <joth@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-11-17 09:57:18 +0000
commit313834720d46a68071afe305975f8b70e9bc5782 (patch)
tree1d7b0dea339a8bcf3499cf29f27217cc985f35a1 /net/socket
parent0d18ee21d5ddbfecf3951ac8fc0f5a30465e0ffe (diff)
downloadchromium_src-313834720d46a68071afe305975f8b70e9bc5782.zip
chromium_src-313834720d46a68071afe305975f8b70e9bc5782.tar.gz
chromium_src-313834720d46a68071afe305975f8b70e9bc5782.tar.bz2
Refactor EnsureOpenSSLInit and openssl_util into base
This allows the base/crypto methods to call EnsureOpenSSLInit. Also factors out the SSL_CTX and X509_STORE to be more closely associated with their consumers (ssl socket and X509Certificate resp.) rather than process wide globals. BUG=None TEST=None Review URL: http://codereview.chromium.org/4963002 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@66413 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'net/socket')
-rw-r--r--net/socket/ssl_client_socket_openssl.cc34
1 files changed, 28 insertions, 6 deletions
diff --git a/net/socket/ssl_client_socket_openssl.cc b/net/socket/ssl_client_socket_openssl.cc
index 3f01db2..62f3dbb 100644
--- a/net/socket/ssl_client_socket_openssl.cc
+++ b/net/socket/ssl_client_socket_openssl.cc
@@ -10,10 +10,10 @@
#include <openssl/ssl.h>
#include <openssl/err.h>
-#include "net/base/cert_verifier.h"
#include "base/metrics/histogram.h"
+#include "base/openssl_util.h"
+#include "net/base/cert_verifier.h"
#include "net/base/net_errors.h"
-#include "net/base/openssl_util.h"
#include "net/base/ssl_connection_status_flags.h"
#include "net/base/ssl_info.h"
@@ -58,6 +58,29 @@ int MapOpenSSLError(int err) {
}
}
+// We do certificate verification after handshake, so we disable the default
+// by registering a no-op verify function.
+int NoOpVerifyCallback(X509_STORE_CTX*, void *) {
+ DVLOG(3) << "skipping cert verify";
+ return 1;
+}
+
+struct SSLContextSingletonTraits : public DefaultSingletonTraits<SSL_CTX> {
+ static SSL_CTX* New() {
+ base::EnsureOpenSSLInit();
+ SSL_CTX* self = SSL_CTX_new(SSLv23_client_method());
+ SSL_CTX_set_cert_verify_callback(self, NoOpVerifyCallback, NULL);
+ return self;
+ }
+ static void Delete(SSL_CTX* self) {
+ SSL_CTX_free(self);
+ }
+};
+
+SSL_CTX* GetSSLContext() {
+ return Singleton<SSL_CTX, SSLContextSingletonTraits>::get();
+}
+
} // namespace
SSLClientSocketOpenSSL::SSLClientSocketOpenSSL(
@@ -93,7 +116,7 @@ bool SSLClientSocketOpenSSL::Init() {
DCHECK(!ssl_);
DCHECK(!transport_bio_);
- ssl_ = SSL_new(GetOpenSSLInitSingleton()->ssl_ctx());
+ ssl_ = SSL_new(GetSSLContext());
if (!ssl_) {
MaybeLogSSLError();
return false;
@@ -394,8 +417,7 @@ void SSLClientSocketOpenSSL::InvalidateSessionIfBadCertificate() {
// see SSL_CTX_set_session_cache_mode(SSL_SESS_CACHE_CLIENT).
SSL_SESSION* session = SSL_get_session(ssl_);
LOG_IF(ERROR, session) << "Connection has a session?? " << session;
- int rv = SSL_CTX_remove_session(GetOpenSSLInitSingleton()->ssl_ctx(),
- session);
+ int rv = SSL_CTX_remove_session(GetSSLContext(), session);
LOG_IF(ERROR, rv) << "Session was cached?? " << rv;
}
}
@@ -404,7 +426,7 @@ X509Certificate* SSLClientSocketOpenSSL::UpdateServerCert() {
if (server_cert_)
return server_cert_;
- ScopedSSL<X509, X509_free> cert(SSL_get_peer_certificate(ssl_));
+ base::ScopedOpenSSL<X509, X509_free> cert(SSL_get_peer_certificate(ssl_));
if (!cert.get()) {
LOG(WARNING) << "SSL_get_peer_certificate returned NULL";
return NULL;