| // Copyright 2014 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_CHANNEL_ID_STORE_H_ | 
 | #define NET_SSL_CHANNEL_ID_STORE_H_ | 
 |  | 
 | #include <list> | 
 | #include <memory> | 
 | #include <string> | 
 |  | 
 | #include "base/callback.h" | 
 | #include "base/threading/thread_checker.h" | 
 | #include "base/time/time.h" | 
 | #include "crypto/ec_private_key.h" | 
 | #include "net/base/net_export.h" | 
 |  | 
 | namespace net { | 
 |  | 
 | // An interface for storing and retrieving channel ID keypairs. | 
 | // See https://tools.ietf.org/html/draft-balfanz-tls-channelid-01 | 
 |  | 
 | // Owned only by a single ChannelIDService object, which is responsible | 
 | // for deleting it. | 
 | class NET_EXPORT ChannelIDStore { | 
 |  public: | 
 |   // The ChannelID class contains a keypair, along with the corresponding | 
 |   // hostname (server identifier) and creation time. | 
 |   class NET_EXPORT ChannelID { | 
 |    public: | 
 |     ChannelID(); | 
 |     ChannelID(const std::string& server_identifier, | 
 |               base::Time creation_time, | 
 |               std::unique_ptr<crypto::ECPrivateKey> key); | 
 |     ChannelID(const ChannelID& other); | 
 |     ChannelID& operator=(const ChannelID& other); | 
 |     ~ChannelID(); | 
 |  | 
 |     // Server identifier. | 
 |     const std::string& server_identifier() const { return server_identifier_; } | 
 |     // The time the keypair was created. | 
 |     base::Time creation_time() const { return creation_time_; } | 
 |     // Returns the keypair for the channel ID. This pointer is only valid for | 
 |     // the lifetime of the ChannelID object - the ECPrivateKey object remains | 
 |     // owned by the ChannelID object; no ownership is transferred. | 
 |     crypto::ECPrivateKey* key() const { return key_.get(); } | 
 |  | 
 |    private: | 
 |     std::string server_identifier_; | 
 |     base::Time creation_time_; | 
 |     std::unique_ptr<crypto::ECPrivateKey> key_; | 
 |   }; | 
 |  | 
 |   typedef std::list<ChannelID> ChannelIDList; | 
 |  | 
 |   typedef base::OnceCallback< | 
 |       void(int, const std::string&, std::unique_ptr<crypto::ECPrivateKey>)> | 
 |       GetChannelIDCallback; | 
 |   typedef base::OnceCallback<void(const ChannelIDList&)> | 
 |       GetChannelIDListCallback; | 
 |  | 
 |   virtual ~ChannelIDStore(); | 
 |  | 
 |   // GetChannelID may return the result synchronously through the | 
 |   // output parameters, in which case it will return either OK if a keypair is | 
 |   // found in the store, or ERR_FILE_NOT_FOUND if none is found.  If the | 
 |   // result cannot be returned synchronously, GetChannelID will | 
 |   // return ERR_IO_PENDING and the callback will be called with the result | 
 |   // asynchronously. | 
 |   virtual int GetChannelID(const std::string& server_identifier, | 
 |                            std::unique_ptr<crypto::ECPrivateKey>* key_result, | 
 |                            GetChannelIDCallback callback) = 0; | 
 |  | 
 |   // Adds the keypair for a hostname to the store. | 
 |   virtual void SetChannelID(std::unique_ptr<ChannelID> channel_id) = 0; | 
 |  | 
 |   // Removes a keypair from the store. | 
 |   virtual void DeleteChannelID(const std::string& server_identifier, | 
 |                                base::OnceClosure completion_callback) = 0; | 
 |  | 
 |   // Deletes the channel ID keypairs that have a creation_date greater than | 
 |   // or equal to |delete_begin| and less than |delete_end| and whose server | 
 |   // identifier matches the |domain_predicate|. If base::Time value is_null, | 
 |   // that side of the comparison is unbounded. | 
 |   virtual void DeleteForDomainsCreatedBetween( | 
 |       const base::Callback<bool(const std::string&)>& domain_predicate, | 
 |       base::Time delete_begin, | 
 |       base::Time delete_end, | 
 |       base::OnceClosure completion_callback) = 0; | 
 |  | 
 |   // Removes all channel ID keypairs from the store. | 
 |   virtual void DeleteAll(base::OnceClosure completion_callback) = 0; | 
 |  | 
 |   // Returns all channel ID keypairs. | 
 |   virtual void GetAllChannelIDs(GetChannelIDListCallback callback) = 0; | 
 |  | 
 |   // Signals to the backing store that any pending writes should be flushed. | 
 |   virtual void Flush() = 0; | 
 |  | 
 |   // Helper function that adds all keypairs from |list| into this instance. | 
 |   void InitializeFrom(const ChannelIDList& list); | 
 |  | 
 |   // Returns the number of keypairs in the store.  May return 0 if the backing | 
 |   // store is not loaded yet. | 
 |   // Public only for unit testing. | 
 |   virtual int GetChannelIDCount() = 0; | 
 |  | 
 |   // When invoked, instructs the store to keep session related data on | 
 |   // destruction. | 
 |   virtual void SetForceKeepSessionState() = 0; | 
 |  | 
 |   // Returns true if this ChannelIDStore is ephemeral, and false if it is | 
 |   // persistent. | 
 |   virtual bool IsEphemeral() = 0; | 
 |  | 
 |  protected: | 
 |   THREAD_CHECKER(thread_checker_); | 
 | }; | 
 |  | 
 | }  // namespace net | 
 |  | 
 | #endif  // NET_SSL_CHANNEL_ID_STORE_H_ |