1 // Copyright (c) 2011 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 // Defines an in-memory private key store, primarily used for testing. 6 7 #include "net/base/openssl_private_key_store.h" 8 9 #include <openssl/evp.h> 10 11 #include "base/logging.h" 12 #include "base/memory/singleton.h" 13 #include "base/synchronization/lock.h" 14 15 namespace net { 16 17 namespace { 18 19 // A small in-memory store for public/private key pairs held in 20 // a single EVP_PKEY object. This is intentionally distinct from 21 // net::SSLClientKeyStore. 22 class MemoryKeyPairStore { 23 public: MemoryKeyPairStore()24 MemoryKeyPairStore() {} 25 GetInstance()26 static MemoryKeyPairStore* GetInstance() { 27 return Singleton<MemoryKeyPairStore>::get(); 28 } 29 ~MemoryKeyPairStore()30 ~MemoryKeyPairStore() { 31 base::AutoLock lock(lock_); 32 for (std::vector<EVP_PKEY*>::iterator it = keys_.begin(); 33 it != keys_.end(); ++it) { 34 EVP_PKEY_free(*it); 35 } 36 } 37 StoreKeyPair(EVP_PKEY * pkey)38 bool StoreKeyPair(EVP_PKEY* pkey) { 39 EVP_PKEY_dup(pkey); 40 base::AutoLock lock(lock_); 41 keys_.push_back(pkey); 42 return true; 43 } 44 HasPrivateKey(EVP_PKEY * pkey)45 bool HasPrivateKey(EVP_PKEY* pkey) { 46 base::AutoLock lock(lock_); 47 for (std::vector<EVP_PKEY*>::iterator it = keys_.begin(); 48 it != keys_.end(); ++it) { 49 if (EVP_PKEY_cmp(*it, pkey) == 1) 50 return true; 51 } 52 return false; 53 } 54 55 private: 56 std::vector<EVP_PKEY*> keys_; 57 base::Lock lock_; 58 59 DISALLOW_COPY_AND_ASSIGN(MemoryKeyPairStore); 60 }; 61 62 } // namespace 63 StoreKeyPair(const GURL & url,EVP_PKEY * pkey)64bool OpenSSLPrivateKeyStore::StoreKeyPair(const GURL& url, 65 EVP_PKEY* pkey) { 66 return MemoryKeyPairStore::GetInstance()->StoreKeyPair(pkey); 67 } 68 HasPrivateKey(EVP_PKEY * pub_key)69bool OpenSSLPrivateKeyStore::HasPrivateKey(EVP_PKEY* pub_key) { 70 return MemoryKeyPairStore::GetInstance()->HasPrivateKey(pub_key); 71 } 72 73 } // namespace net 74 75