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

Unified Diff: sync/util/cryptographer.h

Issue 10827266: [Sync] Add SyncEncryptionHandler (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix tests Created 8 years, 4 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 side-by-side diff with in-line comments
Download patch
Index: sync/util/cryptographer.h
diff --git a/sync/util/cryptographer.h b/sync/util/cryptographer.h
index b9c00013fa0f35a73ac4cee5f847b94d362190a4..a412ff04857ddb7335e0f3f6208d324f0715af23 100644
--- a/sync/util/cryptographer.h
+++ b/sync/util/cryptographer.h
@@ -11,15 +11,19 @@
#include "base/gtest_prod_util.h"
#include "base/memory/linked_ptr.h"
#include "base/memory/scoped_ptr.h"
-#include "base/observer_list.h"
#include "sync/internal_api/public/base/model_type.h"
#include "sync/protocol/encryption.pb.h"
-#include "sync/protocol/nigori_specifics.pb.h"
#include "sync/util/nigori.h"
+namespace sync_pb {
+class NigoriKeyBag;
+class NigoriSpecifics;
+}
+
namespace syncer {
class Encryptor;
+class SyncEncryptionHandler;
extern const char kNigoriTag[];
@@ -46,46 +50,18 @@ struct KeyParams {
// delayed until after it can be decrypted.
class Cryptographer {
public:
- // All Observer methods are done synchronously, so they're called
- // under a transaction (since all Cryptographer operations are done
- // under a transaction).
- class Observer {
- public:
- // Called when the set of encrypted types or the encrypt
- // everything flag has been changed. Note that this doesn't
- // necessarily mean that encryption has completed for the given
- // types.
- //
- // |encrypted_types| will always be a superset of
- // SensitiveTypes(). If |encrypt_everything| is true,
- // |encrypted_types| will be the set of all known types.
- //
- // Until this function is called, observers can assume that the
- // set of encrypted types is SensitiveTypes() and that the encrypt
- // everything flag is false.
- virtual void OnEncryptedTypesChanged(
- ModelTypeSet encrypted_types,
- bool encrypt_everything) = 0;
-
- protected:
- virtual ~Observer();
- };
-
// Does not take ownership of |encryptor|.
explicit Cryptographer(Encryptor* encryptor);
~Cryptographer();
- // When update on cryptographer is called this enum tells if the
- // cryptographer was succesfully able to update using the nigori node or if
- // it needs a key to decrypt the nigori node.
- enum UpdateResult {
- SUCCESS,
- NEEDS_PASSPHRASE
- };
+ // TODO(zea): refactor so that Cryptographer doesn't need any connection
+ // to the SyncEncryptionHandler.
+ void SetSyncEncryptionHandlerDelegate(SyncEncryptionHandler* delegate);
tim (not reviewing) 2012/08/13 20:01:00 As discussed offline, it looks like the set of thi
Nicolas Zea 2012/08/13 22:56:38 Done.
- // Manage observers.
- void AddObserver(Observer* observer);
- void RemoveObserver(Observer* observer);
+ // SyncEncryptionProvider delegator methods (passes through to delegate).
+ void UpdateFromNigori(const sync_pb::NigoriSpecifics& nigori) ;
+ ModelTypeSet GetEncryptedTypes() const;
+ void UpdateNigoriFromEncryptedTypes(sync_pb::NigoriSpecifics* nigori) const;
// |restored_bootstrap_token| can be provided via this method to bootstrap
// Cryptographer instance into the ready state (is_ready will be true).
@@ -142,6 +118,13 @@ class Cryptographer {
// with a cryptographer that has already been initialized.
bool AddKeyFromBootstrapToken(const std::string restored_bootstrap_token);
+ // Decrypts |encrypted| and uses its contents to initialize Nigori instances.
+ // Returns true unless decryption of |encrypted| fails. The caller is
+ // responsible for checking that CanDecrypt(encrypted) == true.
+ // Does not update the default nigori.
+ void InstallKeys(const sync_pb::EncryptedData& encrypted);
+
+
// Makes a local copy of |encrypted| to later be decrypted by
// DecryptPendingKeys. This should only be used if CanDecrypt(encrypted) ==
// false.
@@ -159,6 +142,10 @@ class Cryptographer {
// is updated.
bool DecryptPendingKeys(const KeyParams& params);
+ // Sets the default key to the nigori with name |key_name|. |key_name| must
+ // correspond to a nigori that has already been installed into the keybag.
+ void SetDefaultKey(std::string key_name);
+
bool is_initialized() const { return !nigoris_.empty() && default_nigori_; }
// Returns whether this Cryptographer is ready to encrypt and decrypt data.
@@ -176,16 +163,6 @@ class Cryptographer {
// Obtain the bootstrap token based on the keystore encryption key.
bool GetKeystoreKeyBootstrapToken(std::string* token) const;
- // Update the cryptographer based on the contents of the nigori specifics.
- // This updates both the encryption keys and the set of encrypted types.
- // Returns NEEDS_PASSPHRASE if was unable to decrypt the pending keys,
- // SUCCESS otherwise.
- // Note: will not change the default key. If the nigori's keybag
- // is decryptable, all keys are added to the local keybag and the current
- // default is preserved. If the nigori's keybag is not decryptable, it is
- // stored in the |pending_keys_|.
- UpdateResult Update(const sync_pb::NigoriSpecifics& nigori);
-
// Set the keystore-derived nigori from the provided key.
// Returns true if we succesfully create the keystore derived nigori from the
// provided key, false otherwise.
@@ -195,44 +172,12 @@ class Cryptographer {
// otherwise.
bool HasKeystoreKey() const;
- // The set of types that are always encrypted.
- static ModelTypeSet SensitiveTypes();
-
- // Reset our set of encrypted types based on the contents of the nigori
- // specifics.
- void UpdateEncryptedTypesFromNigori(const sync_pb::NigoriSpecifics& nigori);
-
- // Update the nigori to reflect the current set of encrypted types.
- void UpdateNigoriFromEncryptedTypes(sync_pb::NigoriSpecifics* nigori) const;
-
- // Setter/getter for whether all current and future datatypes should
- // be encrypted. Once set you cannot unset without reading from a
- // new nigori node. set_encrypt_everything() emits a notification
- // the first time it's called.
- void set_encrypt_everything();
- bool encrypt_everything() const;
-
- // Return the set of encrypted types.
- ModelTypeSet GetEncryptedTypes() const;
-
- // Forwards to MergeEncryptedTypes.
- void MergeEncryptedTypesForTest(ModelTypeSet encrypted_types);
+ Encryptor* encryptor() const { return encryptor_; }
private:
FRIEND_TEST_ALL_PREFIXES(SyncCryptographerTest, PackUnpack);
- typedef std::map<std::string, linked_ptr<const Nigori> > NigoriMap;
-
- // Merges the given set of encrypted types with the existing set and emits a
- // notification if necessary.
- void MergeEncryptedTypes(ModelTypeSet encrypted_types);
-
- void EmitEncryptedTypesChangedNotification();
- // Decrypts |encrypted| and uses its contents to initialize Nigori instances.
- // Returns true unless decryption of |encrypted| fails. The caller is
- // responsible for checking that CanDecrypt(encrypted) == true.
- // Does not update the default nigori.
- void InstallKeys(const sync_pb::EncryptedData& encrypted);
+ typedef std::map<std::string, linked_ptr<const Nigori> > NigoriMap;
// Helper method to instantiate Nigori instances for each set of key
// parameters in |bag|.
@@ -250,16 +195,15 @@ class Cryptographer {
Encryptor* const encryptor_;
- ObserverList<Observer> observers_;
-
NigoriMap nigoris_; // The Nigoris we know about, mapped by key name.
NigoriMap::value_type* default_nigori_; // The Nigori used for encryption.
NigoriMap::value_type* keystore_nigori_; // Nigori generated from keystore.
scoped_ptr<sync_pb::EncryptedData> pending_keys_;
- ModelTypeSet encrypted_types_;
- bool encrypt_everything_;
+ // The sync encryption provider. Necessary until we decouple the encrypted
+ // types from the cryptographer.
+ SyncEncryptionHandler* sync_encryption_delegate_;
DISALLOW_COPY_AND_ASSIGN(Cryptographer);
};

Powered by Google App Engine
This is Rietveld 408576698