Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(39)

Side by Side Diff: components/sync/core/sync_encryption_handler.h

Issue 2413313004: [Sync] Move the last things out of core/. (Closed)
Patch Set: Address comments. Created 4 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « components/sync/core/sync_db_util.cc ('k') | components/sync/core/sync_encryption_handler.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 // Copyright 2012 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 #ifndef COMPONENTS_SYNC_CORE_SYNC_ENCRYPTION_HANDLER_H_
6 #define COMPONENTS_SYNC_CORE_SYNC_ENCRYPTION_HANDLER_H_
7
8 #include <string>
9
10 #include "base/time/time.h"
11 #include "components/sync/base/model_type.h"
12 #include "components/sync/protocol/sync.pb.h"
13
14 namespace syncer {
15
16 class Cryptographer;
17 enum class PassphraseType;
18
19 // Reasons due to which Cryptographer might require a passphrase.
20 enum PassphraseRequiredReason {
21 REASON_PASSPHRASE_NOT_REQUIRED = 0, // Initial value.
22 REASON_ENCRYPTION = 1, // The cryptographer requires a
23 // passphrase for its first attempt at
24 // encryption. Happens only during
25 // migration or upgrade.
26 REASON_DECRYPTION = 2, // The cryptographer requires a
27 // passphrase for its first attempt at
28 // decryption.
29 };
30
31 // Enum used to distinguish which bootstrap encryption token is being updated.
32 enum BootstrapTokenType {
33 PASSPHRASE_BOOTSTRAP_TOKEN,
34 KEYSTORE_BOOTSTRAP_TOKEN
35 };
36
37 // Sync's encryption handler. Handles tracking encrypted types, ensuring the
38 // cryptographer encrypts with the proper key and has the most recent keybag,
39 // and keeps the nigori node up to date.
40 // Implementations of this class must be assumed to be non-thread-safe. All
41 // methods must be invoked on the sync thread.
42 class SyncEncryptionHandler {
43 public:
44 class NigoriState;
45
46 // All Observer methods are done synchronously from within a transaction and
47 // on the sync thread.
48 class Observer {
49 public:
50 Observer();
51
52 // Called when user interaction is required to obtain a valid passphrase.
53 // - If the passphrase is required for encryption, |reason| will be
54 // REASON_ENCRYPTION.
55 // - If the passphrase is required for the decryption of data that has
56 // already been encrypted, |reason| will be REASON_DECRYPTION.
57 // - If the passphrase is required because decryption failed, and a new
58 // passphrase is required, |reason| will be REASON_SET_PASSPHRASE_FAILED.
59 //
60 // |pending_keys| is a copy of the cryptographer's pending keys, that may be
61 // cached by the frontend for subsequent use by the UI.
62 virtual void OnPassphraseRequired(
63 PassphraseRequiredReason reason,
64 const sync_pb::EncryptedData& pending_keys) = 0;
65 // Called when the passphrase provided by the user has been accepted and is
66 // now used to encrypt sync data.
67
68 virtual void OnPassphraseAccepted() = 0;
69 // |bootstrap_token| is an opaque base64 encoded representation of the key
70 // generated by the current passphrase, and is provided to the observer for
71 // persistence purposes and use in a future initialization of sync (e.g.
72 // after restart). The boostrap token will always be derived from the most
73 // recent GAIA password (for accounts with implicit passphrases), even if
74 // the data is still encrypted with an older GAIA password. For accounts
75 // with explicit passphrases, it will be the most recently seen custom
76 // passphrase.
77 virtual void OnBootstrapTokenUpdated(const std::string& bootstrap_token,
78 BootstrapTokenType type) = 0;
79
80 // Called when the set of encrypted types or the encrypt
81 // everything flag has been changed. Note that encryption isn't
82 // complete until the OnEncryptionComplete() notification has been
83 // sent (see below).
84 //
85 // |encrypted_types| will always be a superset of
86 // Cryptographer::SensitiveTypes(). If |encrypt_everything| is
87 // true, |encrypted_types| will be the set of all known types.
88 //
89 // Until this function is called, observers can assume that the
90 // set of encrypted types is Cryptographer::SensitiveTypes() and
91 // that the encrypt everything flag is false.
92 virtual void OnEncryptedTypesChanged(ModelTypeSet encrypted_types,
93 bool encrypt_everything) = 0;
94
95 // Called after we finish encrypting the current set of encrypted
96 // types.
97 virtual void OnEncryptionComplete() = 0;
98
99 // The cryptographer has been updated. Listeners should check that their
100 // own state matches the cryptographer.
101 // Used primarily for debugging.
102 virtual void OnCryptographerStateChanged(Cryptographer* cryptographer) = 0;
103
104 // The passphrase type has changed. |type| is the new type,
105 // |passphrase_time| is the time the passphrase was set (unset if |type|
106 // is KEYSTORE_PASSPHRASE or the passphrase was set before we started
107 // recording the time).
108 virtual void OnPassphraseTypeChanged(PassphraseType type,
109 base::Time passphrase_time) = 0;
110
111 // The user has set a passphrase using this device.
112 //
113 // |nigori_state| can be used to restore nigori state across
114 // SyncEncryptionHandlerImpl lifetimes. See also SyncEncryptionHandlerImpl's
115 // RestoredNigori method.
116 virtual void OnLocalSetPassphraseEncryption(
117 const NigoriState& nigori_state) = 0;
118
119 protected:
120 virtual ~Observer();
121 };
122
123 class NigoriState {
124 public:
125 NigoriState() {}
126 sync_pb::NigoriSpecifics nigori_specifics;
127 };
128
129 SyncEncryptionHandler();
130 virtual ~SyncEncryptionHandler();
131
132 // Add/Remove SyncEncryptionHandler::Observers.
133 virtual void AddObserver(Observer* observer) = 0;
134 virtual void RemoveObserver(Observer* observer) = 0;
135
136 // Reads the nigori node, updates internal state as needed, and, if an
137 // empty/stale nigori node is detected, overwrites the existing
138 // nigori node. Upon completion, if the cryptographer is still ready
139 // attempts to re-encrypt all sync data.
140 // Note: This method is expensive (it iterates through all encrypted types),
141 // so should only be used sparingly (e.g. on startup).
142 virtual void Init() = 0;
143
144 // Attempts to re-encrypt encrypted data types using the passphrase provided.
145 // Notifies observers of the result of the operation via OnPassphraseAccepted
146 // or OnPassphraseRequired, updates the nigori node, and does re-encryption as
147 // appropriate. If an explicit password has been set previously, we drop
148 // subsequent requests to set a passphrase. If the cryptographer has pending
149 // keys, and a new implicit passphrase is provided, we try decrypting the
150 // pending keys with it, and if that fails, we cache the passphrase for
151 // re-encryption once the pending keys are decrypted.
152 virtual void SetEncryptionPassphrase(const std::string& passphrase,
153 bool is_explicit) = 0;
154
155 // Provides a passphrase for decrypting the user's existing sync data.
156 // Notifies observers of the result of the operation via OnPassphraseAccepted
157 // or OnPassphraseRequired, updates the nigori node, and does re-encryption as
158 // appropriate if there is a previously cached encryption passphrase. It is an
159 // error to call this when we don't have pending keys.
160 virtual void SetDecryptionPassphrase(const std::string& passphrase) = 0;
161
162 // Enables encryption of all datatypes.
163 virtual void EnableEncryptEverything() = 0;
164
165 // Whether encryption of all datatypes is enabled. If false, only sensitive
166 // types are encrypted.
167 virtual bool IsEncryptEverythingEnabled() const = 0;
168
169 // The set of types that are always encrypted.
170 static ModelTypeSet SensitiveTypes();
171 };
172
173 } // namespace syncer
174
175 #endif // COMPONENTS_SYNC_CORE_SYNC_ENCRYPTION_HANDLER_H_
OLDNEW
« no previous file with comments | « components/sync/core/sync_db_util.cc ('k') | components/sync/core/sync_encryption_handler.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698