| OLD | NEW |
| (Empty) |
| 1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. | |
| 2 // Use of this source code is governed by a BSD-style license that can be | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 #include "net/base/openssl_util.h" | |
| 6 | |
| 7 #include <openssl/err.h> | |
| 8 | |
| 9 #include "base/logging.h" | |
| 10 #include "base/platform_thread.h" | |
| 11 | |
| 12 namespace net { | |
| 13 | |
| 14 namespace { | |
| 15 | |
| 16 // We do certificate verification after handshake, so we disable the default | |
| 17 // by registering a no-op verify function. | |
| 18 int NoOpVerifyCallback(X509_STORE_CTX*, void *) { | |
| 19 DVLOG(3) << "skipping cert verify"; | |
| 20 return 1; | |
| 21 } | |
| 22 | |
| 23 unsigned long CurrentThreadId() { | |
| 24 return static_cast<unsigned long>(PlatformThread::CurrentId()); | |
| 25 } | |
| 26 | |
| 27 SSL_CTX* CreateSSL_CTX() { | |
| 28 SSL_load_error_strings(); | |
| 29 SSL_library_init(); | |
| 30 OpenSSL_add_all_algorithms(); | |
| 31 return SSL_CTX_new(SSLv23_client_method()); | |
| 32 } | |
| 33 | |
| 34 } // namespace | |
| 35 | |
| 36 OpenSSLInitSingleton::OpenSSLInitSingleton() | |
| 37 : ssl_ctx_(CreateSSL_CTX()), | |
| 38 store_(X509_STORE_new()) { | |
| 39 CHECK(ssl_ctx_.get()); | |
| 40 CHECK(store_.get()); | |
| 41 | |
| 42 SSL_CTX_set_cert_verify_callback(ssl_ctx_.get(), NoOpVerifyCallback, NULL); | |
| 43 X509_STORE_set_default_paths(store_.get()); | |
| 44 // TODO(bulach): Enable CRL (see X509_STORE_set_flags(X509_V_FLAG_CRL_CHECK)). | |
| 45 int num_locks = CRYPTO_num_locks(); | |
| 46 for (int i = 0; i < num_locks; ++i) | |
| 47 locks_.push_back(new Lock()); | |
| 48 CRYPTO_set_locking_callback(LockingCallback); | |
| 49 CRYPTO_set_id_callback(CurrentThreadId); | |
| 50 } | |
| 51 | |
| 52 OpenSSLInitSingleton::~OpenSSLInitSingleton() { | |
| 53 CRYPTO_set_locking_callback(NULL); | |
| 54 EVP_cleanup(); | |
| 55 ERR_free_strings(); | |
| 56 } | |
| 57 | |
| 58 OpenSSLInitSingleton* GetOpenSSLInitSingleton() { | |
| 59 return Singleton<OpenSSLInitSingleton>::get(); | |
| 60 } | |
| 61 | |
| 62 void EnsureOpenSSLInit() { | |
| 63 Singleton<OpenSSLInitSingleton>::get(); | |
| 64 } | |
| 65 | |
| 66 // static | |
| 67 void OpenSSLInitSingleton::LockingCallback(int mode, | |
| 68 int n, | |
| 69 const char* file, | |
| 70 int line) { | |
| 71 GetOpenSSLInitSingleton()->OnLockingCallback(mode, n, file, line); | |
| 72 } | |
| 73 | |
| 74 void OpenSSLInitSingleton::OnLockingCallback(int mode, | |
| 75 int n, | |
| 76 const char* file, | |
| 77 int line) { | |
| 78 CHECK_LT(static_cast<size_t>(n), locks_.size()); | |
| 79 if (mode & CRYPTO_LOCK) | |
| 80 locks_[n]->Acquire(); | |
| 81 else | |
| 82 locks_[n]->Release(); | |
| 83 } | |
| 84 | |
| 85 } // namespace net | |
| 86 | |
| OLD | NEW |