| // Copyright 2015 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. |
| |
| #ifndef NET_SSL_CLIENT_KEY_STORE_H_ |
| #define NET_SSL_CLIENT_KEY_STORE_H_ |
| |
| #include <memory> |
| #include <vector> |
| |
| #include "base/callback.h" |
| #include "base/lazy_instance.h" |
| #include "base/macros.h" |
| #include "base/synchronization/lock.h" |
| #include "net/base/net_export.h" |
| |
| namespace net { |
| |
| class SSLPrivateKey; |
| class X509Certificate; |
| |
| // TODO(rsleevi, davidben): Remove this once https://crbug.com/394131 is fixed. |
| // A certificate and key store that allows several external certificate |
| // providers to expose certificates and keys through this store. All currently |
| // provided certificates will be accessible through |FetchClientCertPrivateKey|. |
| // Methods of this singleton can be called from any thread. |
| class NET_EXPORT ClientKeyStore { |
| public: |
| class CertKeyProvider { |
| public: |
| // This can be called from any thread. |
| virtual ~CertKeyProvider() {} |
| |
| // Obtains a handle to the certificate private key for |cert| and stores it |
| // in |private_key|. |
| // If the CertKeyProvider does not know about the |cert|, returns false. If |
| // it knows about the certificate, but is unable to return the private key, |
| // returns true and sets |*private_key| to nullptr. |
| // This can be called from any thread. |
| virtual bool GetCertificateKey( |
| const X509Certificate& cert, |
| scoped_refptr<SSLPrivateKey>* private_key) = 0; |
| }; |
| |
| static ClientKeyStore* GetInstance(); |
| |
| // The |provider| will be accessed on any thread but no concurrent method |
| // invocations will happen. |provider| must be valid until it is removed using |
| // |RemoveProvider| or the store is destroyed. |
| void AddProvider(CertKeyProvider* provider); |
| |
| void RemoveProvider(const CertKeyProvider* provider); |
| |
| // Given a |certificate|'s public key, return the corresponding private |
| // key if any of the registered providers has a matching key. |
| // Returns its matching private key on success, nullptr otherwise. |
| scoped_refptr<SSLPrivateKey> FetchClientCertPrivateKey( |
| const X509Certificate& certificate); |
| |
| private: |
| friend struct base::DefaultLazyInstanceTraits<ClientKeyStore>; |
| |
| ClientKeyStore(); |
| ~ClientKeyStore(); |
| |
| base::Lock lock_; |
| std::vector<CertKeyProvider*> providers_; |
| |
| DISALLOW_COPY_AND_ASSIGN(ClientKeyStore); |
| }; |
| |
| } // namespace net |
| |
| #endif // NET_SSL_CLIENT_KEY_STORE_H_ |