• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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)64 bool OpenSSLPrivateKeyStore::StoreKeyPair(const GURL& url,
65                                           EVP_PKEY* pkey) {
66   return MemoryKeyPairStore::GetInstance()->StoreKeyPair(pkey);
67 }
68 
HasPrivateKey(EVP_PKEY * pub_key)69 bool OpenSSLPrivateKeyStore::HasPrivateKey(EVP_PKEY* pub_key) {
70   return MemoryKeyPairStore::GetInstance()->HasPrivateKey(pub_key);
71 }
72 
73 } // namespace net
74 
75