// Copyright (c) 2011 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Defines an in-memory private key store, primarily used for testing. #include "net/base/openssl_private_key_store.h" #include #include "base/logging.h" #include "base/memory/singleton.h" #include "base/synchronization/lock.h" namespace net { namespace { // A small in-memory store for public/private key pairs held in // a single EVP_PKEY object. This is intentionally distinct from // net::SSLClientKeyStore. class MemoryKeyPairStore { public: MemoryKeyPairStore() {} static MemoryKeyPairStore* GetInstance() { return Singleton::get(); } ~MemoryKeyPairStore() { base::AutoLock lock(lock_); for (std::vector::iterator it = keys_.begin(); it != keys_.end(); ++it) { EVP_PKEY_free(*it); } } bool StoreKeyPair(EVP_PKEY* pkey) { CRYPTO_add(&pkey->references, 1, CRYPTO_LOCK_EVP_PKEY); base::AutoLock lock(lock_); keys_.push_back(pkey); return true; } bool HasPrivateKey(EVP_PKEY* pkey) { base::AutoLock lock(lock_); for (std::vector::iterator it = keys_.begin(); it != keys_.end(); ++it) { if (EVP_PKEY_cmp(*it, pkey) == 1) return true; } return false; } private: std::vector keys_; base::Lock lock_; DISALLOW_COPY_AND_ASSIGN(MemoryKeyPairStore); }; } // namespace bool OpenSSLPrivateKeyStore::StoreKeyPair(const GURL& url, EVP_PKEY* pkey) { return MemoryKeyPairStore::GetInstance()->StoreKeyPair(pkey); } bool OpenSSLPrivateKeyStore::HasPrivateKey(EVP_PKEY* pub_key) { return MemoryKeyPairStore::GetInstance()->HasPrivateKey(pub_key); } } // namespace net