summaryrefslogtreecommitdiffstats
path: root/chrome/browser/sync/util/cryptographer.h
diff options
context:
space:
mode:
Diffstat (limited to 'chrome/browser/sync/util/cryptographer.h')
-rw-r--r--chrome/browser/sync/util/cryptographer.h109
1 files changed, 109 insertions, 0 deletions
diff --git a/chrome/browser/sync/util/cryptographer.h b/chrome/browser/sync/util/cryptographer.h
new file mode 100644
index 0000000..0ffa84f
--- /dev/null
+++ b/chrome/browser/sync/util/cryptographer.h
@@ -0,0 +1,109 @@
+// Copyright (c) 2010 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 CHROME_BROWSER_SYNC_UTIL_CRYPTOGRAPHER_H_
+#define CHROME_BROWSER_SYNC_UTIL_CRYPTOGRAPHER_H_
+
+#include <map>
+#include <string>
+
+#include "base/linked_ptr.h"
+#include "base/scoped_ptr.h"
+#include "chrome/browser/sync/protocol/nigori_specifics.pb.h"
+#include "chrome/browser/sync/util/nigori.h"
+
+namespace browser_sync {
+
+extern const char kNigoriTag[];
+
+// The parameters used to initialize a Nigori instance.
+struct KeyParams {
+ std::string hostname;
+ std::string username;
+ std::string password;
+};
+
+// This class manages the Nigori objects used to encrypt and decrypt sensitive
+// sync data (eg. passwords). Each Nigori object knows how to handle data
+// protected with a particular passphrase.
+//
+// Whenever an update to the Nigori sync node is received from the server,
+// SetPendingKeys should be called with the encrypted contents of that node.
+// Most likely, an updated Nigori node means that a new passphrase has been set
+// and that future node updates won't be decryptable. To remedy this, the user
+// should be prompted for the new passphrase and DecryptPendingKeys be called.
+//
+// Whenever a update to an encrypted node is received from the server,
+// CanDecrypt should be used to verify whether the Cryptographer can decrypt
+// that node. If it cannot, then the application of that update should be
+// delayed until after it can be decrypted.
+class Cryptographer {
+ public:
+ Cryptographer();
+
+ // Returns whether we can decrypt |encrypted| using the keys we currently know
+ // about.
+ bool CanDecrypt(const sync_pb::EncryptedData& encrypted) const;
+
+ // Encrypts |message| into |encrypted|. Returns true unless encryption fails.
+ // Note that encryption will fail if |message| isn't valid (eg. a required
+ // field isn't set).
+ bool Encrypt(const ::google::protobuf::MessageLite& message,
+ sync_pb::EncryptedData* encrypted) const;
+
+ // Decrypts |encrypted| into |message|. Returns true unless decryption fails,
+ // or |message| fails to parse the decrypted data.
+ bool Decrypt(const sync_pb::EncryptedData& encrypted,
+ ::google::protobuf::MessageLite* message) const;
+
+ // Encrypts the set of currently known keys into |encrypted|. Returns true if
+ // successful.
+ bool GetKeys(sync_pb::EncryptedData* encrypted) const;
+
+ // Creates a new Nigori instance using |params|. If successful, |params| will
+ // become the default encryption key and be used for all future calls to
+ // Encrypt.
+ bool AddKey(const KeyParams& params);
+
+ // 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.
+ bool SetKeys(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.
+ void SetPendingKeys(const sync_pb::EncryptedData& encrypted);
+
+ // Attepmts to decrypt the set of keys that was copied in the previous call to
+ // SetPendingKeys using |params|. Returns true if the pending keys were
+ // successfully decrypted and installed.
+ bool DecryptPendingKeys(const KeyParams& params);
+
+ // Returns whether this Cryptographer is ready to encrypt and decrypt data.
+ bool is_ready() const { return !nigoris_.empty() && default_nigori_; }
+
+ // Returns whether there is a pending set of keys that needs to be decrypted.
+ bool has_pending_keys() const { return NULL != pending_keys_.get(); }
+
+ private:
+ typedef std::map<std::string, linked_ptr<const Nigori> > NigoriMap;
+
+ // Helper method to instancitate Nigori instances for each set of key
+ // parameters in |bag| and setting the default encryption key to
+ // |default_key_name|.
+ void InstallKeys(const std::string& default_key_name,
+ const sync_pb::NigoriKeyBag& bag);
+
+ NigoriMap nigoris_; // The Nigoris we know about, mapped by key name.
+ NigoriMap::value_type* default_nigori_; // The Nigori used for encryption.
+
+ scoped_ptr<sync_pb::EncryptedData> pending_keys_;
+
+ DISALLOW_COPY_AND_ASSIGN(Cryptographer);
+};
+
+} // namespace browser_sync
+
+#endif // CHROME_BROWSER_SYNC_UTIL_CRYPTOGRAPHER_H_