1 // Copyright 2015 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.
5 #ifndef COMPONENTS_GCM_DRIVER_CRYPTO_GCM_KEY_STORE_H_
6 #define COMPONENTS_GCM_DRIVER_CRYPTO_GCM_KEY_STORE_H_
12 #include "base/callback_forward.h"
13 #include "base/files/file_path.h"
14 #include "base/macros.h"
15 #include "base/memory/ref_counted.h"
16 #include "base/memory/scoped_ptr.h"
17 #include "base/memory/weak_ptr.h"
18 #include "components/gcm_driver/crypto/proto/gcm_encryption_data.pb.h"
19 #include "components/gcm_driver/gcm_delayed_task_controller.h"
22 class SequencedTaskRunner
;
25 namespace leveldb_proto
{
32 // Key storage for use with encrypted messages received from Google Cloud
33 // Messaging. It provides the ability to create and store a key-pair for a given
34 // app id, as well as retrieving and deleting key-pairs.
36 // This class is backed by a proto database and might end up doing file I/O on
37 // a background task runner. For this reason, all public APIs take a callback
38 // rather than returning the result. Do not rely on the timing of the callbacks.
41 using KeysCallback
= base::Callback
<void(const KeyPair
& pair
)>;
42 using DeleteCallback
= base::Callback
<void(bool success
)>;
45 const base::FilePath
& key_store_path
,
46 const scoped_refptr
<base::SequencedTaskRunner
>& blocking_task_runner
);
49 // Retrieves the public/private key-pair associated with |app_id|, and
50 // invokes |callback| when they are available, or when an error occurred.
51 void GetKeys(const std::string
& app_id
, const KeysCallback
& callback
);
53 // Creates a new public/private key-pair for |app_id|, and invokes
54 // |callback| when they are available, or when an error occurred.
55 void CreateKeys(const std::string
& app_id
, const KeysCallback
& callback
);
57 // Deletes the keys associated with |app_id|, and invokes |callback| when
58 // the deletion has finished, or when an error occurred.
59 void DeleteKeys(const std::string
& app_id
, const DeleteCallback
& callback
);
62 // Initializes the database if necessary, and runs |done_closure| when done.
63 void LazyInitialize(const base::Closure
& done_closure
);
65 void DidInitialize(bool success
);
66 void DidLoadKeys(bool success
,
67 scoped_ptr
<std::vector
<EncryptionData
>> entries
);
69 void DidStoreKeys(const std::string
& app_id
,
71 const KeysCallback
& callback
,
74 void DidDeleteKeys(const std::string
& app_id
,
75 const DeleteCallback
& callback
,
78 // Private implementations of the API that will be executed when the database
79 // has either been successfully loaded, or failed to load.
81 void GetKeysAfterInitialize(const std::string
& app_id
,
82 const KeysCallback
& callback
);
83 void CreateKeysAfterInitialize(const std::string
& app_id
,
84 const KeysCallback
& callback
);
85 void DeleteKeysAfterInitialize(const std::string
& app_id
,
86 const DeleteCallback
& callback
);
88 // Path in which the key store database will be saved.
89 base::FilePath key_store_path_
;
91 // Blocking task runner which the database will do I/O operations on.
92 scoped_refptr
<base::SequencedTaskRunner
> blocking_task_runner_
;
94 // Instance of the ProtoDatabase backing the key store.
95 scoped_ptr
<leveldb_proto::ProtoDatabase
<EncryptionData
>> database_
;
99 // The current state of the database. It has to be initialized before use.
102 // Controller for tasks that should be executed once the key store has
103 // finished initializing.
104 GCMDelayedTaskController delayed_task_controller_
;
106 // Mapping of an app id to the loaded EncryptedData structure.
107 std::map
<std::string
, KeyPair
> key_pairs_
;
109 base::WeakPtrFactory
<GCMKeyStore
> weak_factory_
;
111 DISALLOW_COPY_AND_ASSIGN(GCMKeyStore
);
116 #endif // COMPONENTS_GCM_DRIVER_CRYPTO_GCM_KEY_STORE_H_