Index: sync/util/cryptographer_unittest.cc |
diff --git a/sync/util/cryptographer_unittest.cc b/sync/util/cryptographer_unittest.cc |
index 3719db39b3482a8d4d492771c36e84a44b46222c..94a20c8bc735ea226129a1e3740c5742751a1e93 100644 |
--- a/sync/util/cryptographer_unittest.cc |
+++ b/sync/util/cryptographer_unittest.cc |
@@ -201,4 +201,67 @@ TEST_F(CryptographerTest, Bootstrap) { |
EXPECT_TRUE(cryptographer_.CanDecryptUsingDefaultKey(encrypted)); |
} |
+// Verifies that copied cryptographers are just as good as the original. |
+// |
+// Encrypt an item using the original cryptographer and two different sets of |
+// keys. Verify that it can decrypt them. |
+// |
+// Then copy the original cryptographer and ensure it can also decrypt these |
+// items and encrypt them with the most recent key. |
+TEST_F(CryptographerTest, CopyConstructor) { |
+ sync_pb::PasswordSpecificsData original; |
+ original.set_origin("http://example.com"); |
+ original.set_username_value("luser"); |
+ original.set_password_value("p4ssw0rd"); |
+ |
+ // Start by testing the original cryptogprapher. |
+ KeyParams params1 = {"localhost", "dummy", "dummy"}; |
+ EXPECT_TRUE(cryptographer_.AddKey(params1)); |
+ EXPECT_TRUE(cryptographer_.is_ready()); |
+ |
+ sync_pb::EncryptedData encrypted_k1; |
+ EXPECT_TRUE(cryptographer_.Encrypt(original, &encrypted_k1)); |
+ |
+ KeyParams params2 = {"localhost", "fatuous", "fatuous"}; |
+ EXPECT_TRUE(cryptographer_.AddKey(params2)); |
+ EXPECT_TRUE(cryptographer_.is_ready()); |
+ |
+ sync_pb::EncryptedData encrypted_k2; |
+ EXPECT_TRUE(cryptographer_.Encrypt(original, &encrypted_k2)); |
+ |
+ sync_pb::PasswordSpecificsData decrypted_k1; |
+ sync_pb::PasswordSpecificsData decrypted_k2; |
+ EXPECT_TRUE(cryptographer_.Decrypt(encrypted_k1, &decrypted_k1)); |
+ EXPECT_TRUE(cryptographer_.Decrypt(encrypted_k2, &decrypted_k2)); |
+ |
+ EXPECT_EQ(original.SerializeAsString(), decrypted_k1.SerializeAsString()); |
+ EXPECT_EQ(original.SerializeAsString(), decrypted_k2.SerializeAsString()); |
+ |
+ // Clone the cryptographer and test that it behaves the same. |
+ Cryptographer cryptographer_clone(cryptographer_); |
+ |
+ // The clone should be able to decrypt with old and new keys. |
+ sync_pb::PasswordSpecificsData decrypted_k1_clone; |
+ sync_pb::PasswordSpecificsData decrypted_k2_clone; |
+ EXPECT_TRUE(cryptographer_clone.Decrypt(encrypted_k1, &decrypted_k1_clone)); |
+ EXPECT_TRUE(cryptographer_clone.Decrypt(encrypted_k2, &decrypted_k2_clone)); |
+ |
+ EXPECT_EQ(original.SerializeAsString(), |
+ decrypted_k1_clone.SerializeAsString()); |
+ EXPECT_EQ(original.SerializeAsString(), |
+ decrypted_k2_clone.SerializeAsString()); |
+ |
+ // The old cryptographer should be able to decrypt things encrypted by the |
+ // new. |
+ sync_pb::EncryptedData encrypted_c; |
+ EXPECT_TRUE(cryptographer_clone.Encrypt(original, &encrypted_c)); |
+ |
+ sync_pb::PasswordSpecificsData decrypted_c; |
+ EXPECT_TRUE(cryptographer_.Decrypt(encrypted_c, &decrypted_c)); |
+ EXPECT_EQ(original.SerializeAsString(), decrypted_c.SerializeAsString()); |
+ |
+ // The cloned cryptographer should be using the latest key. |
+ EXPECT_EQ(encrypted_c.key_name(), encrypted_k2.key_name()); |
+} |
+ |
} // namespace syncer |