• 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 <openssl/evp.h>
8 
9 #include "net/base/openssl_private_key_store.h"
10 
11 #include "base/logging.h"
12 #include "base/memory/singleton.h"
13 #include "base/synchronization/lock.h"
14 #include "net/base/x509_certificate.h"
15 
16 namespace net {
17 
18 namespace {
19 
20 class OpenSSLMemoryKeyStore : public OpenSSLPrivateKeyStore {
21  public:
OpenSSLMemoryKeyStore()22   OpenSSLMemoryKeyStore() {}
23 
GetInstance()24   static OpenSSLMemoryKeyStore* GetInstance() {
25     return Singleton<OpenSSLMemoryKeyStore>::get();
26   }
27 
~OpenSSLMemoryKeyStore()28   virtual ~OpenSSLMemoryKeyStore() {
29     base::AutoLock lock(lock_);
30     for (std::vector<EVP_PKEY*>::iterator it = keys_.begin();
31          it != keys_.end(); ++it) {
32       EVP_PKEY_free(*it);
33     }
34   }
35 
StorePrivateKey(const GURL & url,EVP_PKEY * pkey)36   virtual bool StorePrivateKey(const GURL& url, EVP_PKEY* pkey) {
37     CRYPTO_add(&pkey->references, 1, CRYPTO_LOCK_EVP_PKEY);
38     base::AutoLock lock(lock_);
39     keys_.push_back(pkey);
40     return true;
41   }
42 
FetchPrivateKey(EVP_PKEY * pkey)43   virtual EVP_PKEY* FetchPrivateKey(EVP_PKEY* pkey) {
44     base::AutoLock lock(lock_);
45     for (std::vector<EVP_PKEY*>::iterator it = keys_.begin();
46          it != keys_.end(); ++it) {
47       if (EVP_PKEY_cmp(*it, pkey) == 1)
48         return *it;
49     }
50     return NULL;
51   }
52 
53  private:
54   std::vector<EVP_PKEY*> keys_;
55   base::Lock lock_;
56 
57   DISALLOW_COPY_AND_ASSIGN(OpenSSLMemoryKeyStore);
58 };
59 
60 }  // namespace
61 
62 // static
GetInstance()63 OpenSSLPrivateKeyStore* OpenSSLPrivateKeyStore::GetInstance() {
64   return OpenSSLMemoryKeyStore::GetInstance();
65 }
66 
67 } // namespace net
68 
69