Index: chrome/browser/sync/util/cryptographer_unittest.cc |
diff --git a/chrome/browser/sync/util/cryptographer_unittest.cc b/chrome/browser/sync/util/cryptographer_unittest.cc |
deleted file mode 100644 |
index 99e676d3e3631b2ec6e102a1cf70f42009e80e90..0000000000000000000000000000000000000000 |
--- a/chrome/browser/sync/util/cryptographer_unittest.cc |
+++ /dev/null |
@@ -1,391 +0,0 @@ |
-// Copyright (c) 2012 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. |
- |
-#include "chrome/browser/sync/util/cryptographer.h" |
- |
-#include <string> |
- |
-#include "base/memory/scoped_ptr.h" |
-#include "base/string_util.h" |
-#include "chrome/browser/sync/syncable/model_type_test_util.h" |
-#include "chrome/browser/sync/test/fake_encryptor.h" |
-#include "sync/protocol/nigori_specifics.pb.h" |
-#include "sync/protocol/password_specifics.pb.h" |
-#include "testing/gmock/include/gmock/gmock.h" |
-#include "testing/gtest/include/gtest/gtest.h" |
- |
-namespace browser_sync { |
- |
-namespace { |
- |
-using ::testing::_; |
-using ::testing::Mock; |
-using ::testing::StrictMock; |
-using syncable::ModelTypeSet; |
- |
-class MockObserver : public Cryptographer::Observer { |
- public: |
- MOCK_METHOD2(OnEncryptedTypesChanged, |
- void(syncable::ModelTypeSet, bool)); |
-}; |
- |
-} // namespace |
- |
-class SyncCryptographerTest : public ::testing::Test { |
- protected: |
- SyncCryptographerTest() : cryptographer_(&encryptor_) {} |
- |
- FakeEncryptor encryptor_; |
- Cryptographer cryptographer_; |
-}; |
- |
-TEST_F(SyncCryptographerTest, EmptyCantDecrypt) { |
- EXPECT_FALSE(cryptographer_.is_ready()); |
- |
- sync_pb::EncryptedData encrypted; |
- encrypted.set_key_name("foo"); |
- encrypted.set_blob("bar"); |
- |
- EXPECT_FALSE(cryptographer_.CanDecrypt(encrypted)); |
-} |
- |
-TEST_F(SyncCryptographerTest, EmptyCantEncrypt) { |
- EXPECT_FALSE(cryptographer_.is_ready()); |
- |
- sync_pb::EncryptedData encrypted; |
- sync_pb::PasswordSpecificsData original; |
- EXPECT_FALSE(cryptographer_.Encrypt(original, &encrypted)); |
-} |
- |
-TEST_F(SyncCryptographerTest, MissingCantDecrypt) { |
- KeyParams params = {"localhost", "dummy", "dummy"}; |
- cryptographer_.AddKey(params); |
- EXPECT_TRUE(cryptographer_.is_ready()); |
- |
- sync_pb::EncryptedData encrypted; |
- encrypted.set_key_name("foo"); |
- encrypted.set_blob("bar"); |
- |
- EXPECT_FALSE(cryptographer_.CanDecrypt(encrypted)); |
-} |
- |
-TEST_F(SyncCryptographerTest, CanEncryptAndDecrypt) { |
- KeyParams params = {"localhost", "dummy", "dummy"}; |
- EXPECT_TRUE(cryptographer_.AddKey(params)); |
- EXPECT_TRUE(cryptographer_.is_ready()); |
- |
- sync_pb::PasswordSpecificsData original; |
- original.set_origin("http://example.com"); |
- original.set_username_value("azure"); |
- original.set_password_value("hunter2"); |
- |
- sync_pb::EncryptedData encrypted; |
- EXPECT_TRUE(cryptographer_.Encrypt(original, &encrypted)); |
- |
- sync_pb::PasswordSpecificsData decrypted; |
- EXPECT_TRUE(cryptographer_.Decrypt(encrypted, &decrypted)); |
- |
- EXPECT_EQ(original.SerializeAsString(), decrypted.SerializeAsString()); |
-} |
- |
-TEST_F(SyncCryptographerTest, EncryptOnlyIfDifferent) { |
- KeyParams params = {"localhost", "dummy", "dummy"}; |
- EXPECT_TRUE(cryptographer_.AddKey(params)); |
- EXPECT_TRUE(cryptographer_.is_ready()); |
- |
- sync_pb::PasswordSpecificsData original; |
- original.set_origin("http://example.com"); |
- original.set_username_value("azure"); |
- original.set_password_value("hunter2"); |
- |
- sync_pb::EncryptedData encrypted; |
- EXPECT_TRUE(cryptographer_.Encrypt(original, &encrypted)); |
- |
- sync_pb::EncryptedData encrypted2, encrypted3; |
- encrypted2.CopyFrom(encrypted); |
- encrypted3.CopyFrom(encrypted); |
- EXPECT_TRUE(cryptographer_.Encrypt(original, &encrypted2)); |
- |
- // Now encrypt with a new default key. Should overwrite the old data. |
- KeyParams params_new = {"localhost", "dummy", "dummy2"}; |
- cryptographer_.AddKey(params_new); |
- EXPECT_TRUE(cryptographer_.Encrypt(original, &encrypted3)); |
- |
- sync_pb::PasswordSpecificsData decrypted; |
- EXPECT_TRUE(cryptographer_.Decrypt(encrypted2, &decrypted)); |
- // encrypted2 should match encrypted, encrypted3 should not (due to salting). |
- EXPECT_EQ(encrypted.SerializeAsString(), encrypted2.SerializeAsString()); |
- EXPECT_NE(encrypted.SerializeAsString(), encrypted3.SerializeAsString()); |
- EXPECT_EQ(original.SerializeAsString(), decrypted.SerializeAsString()); |
-} |
- |
-TEST_F(SyncCryptographerTest, AddKeySetsDefault) { |
- KeyParams params1 = {"localhost", "dummy", "dummy1"}; |
- EXPECT_TRUE(cryptographer_.AddKey(params1)); |
- EXPECT_TRUE(cryptographer_.is_ready()); |
- |
- sync_pb::PasswordSpecificsData original; |
- original.set_origin("http://example.com"); |
- original.set_username_value("azure"); |
- original.set_password_value("hunter2"); |
- |
- sync_pb::EncryptedData encrypted1; |
- EXPECT_TRUE(cryptographer_.Encrypt(original, &encrypted1)); |
- sync_pb::EncryptedData encrypted2; |
- EXPECT_TRUE(cryptographer_.Encrypt(original, &encrypted2)); |
- |
- KeyParams params2 = {"localhost", "dummy", "dummy2"}; |
- EXPECT_TRUE(cryptographer_.AddKey(params2)); |
- EXPECT_TRUE(cryptographer_.is_ready()); |
- |
- sync_pb::EncryptedData encrypted3; |
- EXPECT_TRUE(cryptographer_.Encrypt(original, &encrypted3)); |
- sync_pb::EncryptedData encrypted4; |
- EXPECT_TRUE(cryptographer_.Encrypt(original, &encrypted4)); |
- |
- EXPECT_EQ(encrypted1.key_name(), encrypted2.key_name()); |
- EXPECT_NE(encrypted1.key_name(), encrypted3.key_name()); |
- EXPECT_EQ(encrypted3.key_name(), encrypted4.key_name()); |
-} |
- |
-// Crashes, Bug 55178. |
-#if defined(OS_WIN) |
-#define MAYBE_EncryptExportDecrypt DISABLED_EncryptExportDecrypt |
-#else |
-#define MAYBE_EncryptExportDecrypt EncryptExportDecrypt |
-#endif |
-TEST_F(SyncCryptographerTest, MAYBE_EncryptExportDecrypt) { |
- sync_pb::EncryptedData nigori; |
- sync_pb::EncryptedData encrypted; |
- |
- sync_pb::PasswordSpecificsData original; |
- original.set_origin("http://example.com"); |
- original.set_username_value("azure"); |
- original.set_password_value("hunter2"); |
- |
- { |
- Cryptographer cryptographer(&encryptor_); |
- |
- KeyParams params = {"localhost", "dummy", "dummy"}; |
- cryptographer.AddKey(params); |
- EXPECT_TRUE(cryptographer.is_ready()); |
- |
- EXPECT_TRUE(cryptographer.Encrypt(original, &encrypted)); |
- EXPECT_TRUE(cryptographer.GetKeys(&nigori)); |
- } |
- |
- { |
- Cryptographer cryptographer(&encryptor_); |
- EXPECT_FALSE(cryptographer.CanDecrypt(nigori)); |
- |
- cryptographer.SetPendingKeys(nigori); |
- EXPECT_FALSE(cryptographer.is_ready()); |
- EXPECT_TRUE(cryptographer.has_pending_keys()); |
- |
- KeyParams params = {"localhost", "dummy", "dummy"}; |
- EXPECT_TRUE(cryptographer.DecryptPendingKeys(params)); |
- EXPECT_TRUE(cryptographer.is_ready()); |
- EXPECT_FALSE(cryptographer.has_pending_keys()); |
- |
- sync_pb::PasswordSpecificsData decrypted; |
- EXPECT_TRUE(cryptographer.Decrypt(encrypted, &decrypted)); |
- EXPECT_EQ(original.SerializeAsString(), decrypted.SerializeAsString()); |
- } |
-} |
- |
-// Crashes, Bug 55178. |
-#if defined(OS_WIN) |
-#define MAYBE_PackUnpack DISABLED_PackUnpack |
-#else |
-#define MAYBE_PackUnpack PackUnpack |
-#endif |
-TEST_F(SyncCryptographerTest, MAYBE_PackUnpack) { |
- Nigori nigori; |
- ASSERT_TRUE(nigori.InitByDerivation("example.com", "username", "password")); |
- std::string expected_user, expected_encryption, expected_mac; |
- ASSERT_TRUE(nigori.ExportKeys(&expected_user, &expected_encryption, |
- &expected_mac)); |
- |
- std::string token; |
- EXPECT_TRUE(cryptographer_.PackBootstrapToken(&nigori, &token)); |
- EXPECT_TRUE(IsStringUTF8(token)); |
- |
- scoped_ptr<Nigori> unpacked(cryptographer_.UnpackBootstrapToken(token)); |
- EXPECT_NE(static_cast<Nigori*>(NULL), unpacked.get()); |
- |
- std::string user_key, encryption_key, mac_key; |
- ASSERT_TRUE(unpacked->ExportKeys(&user_key, &encryption_key, &mac_key)); |
- |
- EXPECT_EQ(expected_user, user_key); |
- EXPECT_EQ(expected_encryption, encryption_key); |
- EXPECT_EQ(expected_mac, mac_key); |
-} |
- |
-TEST_F(SyncCryptographerTest, NigoriEncryptionTypes) { |
- Cryptographer cryptographer2(&encryptor_); |
- sync_pb::NigoriSpecifics nigori; |
- |
- StrictMock<MockObserver> observer; |
- cryptographer_.AddObserver(&observer); |
- StrictMock<MockObserver> observer2; |
- cryptographer2.AddObserver(&observer2); |
- |
- // Just set the sensitive types (shouldn't trigger any |
- // notifications). |
- ModelTypeSet encrypted_types(Cryptographer::SensitiveTypes()); |
- cryptographer_.MergeEncryptedTypesForTest(encrypted_types); |
- cryptographer_.UpdateNigoriFromEncryptedTypes(&nigori); |
- cryptographer2.UpdateEncryptedTypesFromNigori(nigori); |
- EXPECT_TRUE(encrypted_types.Equals(cryptographer_.GetEncryptedTypes())); |
- EXPECT_TRUE(encrypted_types.Equals(cryptographer2.GetEncryptedTypes())); |
- |
- Mock::VerifyAndClearExpectations(&observer); |
- Mock::VerifyAndClearExpectations(&observer2); |
- |
- EXPECT_CALL(observer, |
- OnEncryptedTypesChanged( |
- HasModelTypes(syncable::ModelTypeSet::All()), |
- false)); |
- EXPECT_CALL(observer2, |
- OnEncryptedTypesChanged( |
- HasModelTypes(syncable::ModelTypeSet::All()), |
- false)); |
- |
- // Set all encrypted types |
- encrypted_types = syncable::ModelTypeSet::All(); |
- cryptographer_.MergeEncryptedTypesForTest(encrypted_types); |
- cryptographer_.UpdateNigoriFromEncryptedTypes(&nigori); |
- cryptographer2.UpdateEncryptedTypesFromNigori(nigori); |
- EXPECT_TRUE(encrypted_types.Equals(cryptographer_.GetEncryptedTypes())); |
- EXPECT_TRUE(encrypted_types.Equals(cryptographer2.GetEncryptedTypes())); |
- |
- // Receiving an empty nigori should not reset any encrypted types or trigger |
- // an observer notification. |
- Mock::VerifyAndClearExpectations(&observer); |
- nigori = sync_pb::NigoriSpecifics(); |
- cryptographer_.UpdateEncryptedTypesFromNigori(nigori); |
- EXPECT_TRUE(encrypted_types.Equals(cryptographer_.GetEncryptedTypes())); |
-} |
- |
-TEST_F(SyncCryptographerTest, EncryptEverythingExplicit) { |
- ModelTypeSet real_types = syncable::ModelTypeSet::All(); |
- sync_pb::NigoriSpecifics specifics; |
- specifics.set_encrypt_everything(true); |
- |
- StrictMock<MockObserver> observer; |
- cryptographer_.AddObserver(&observer); |
- |
- EXPECT_CALL(observer, |
- OnEncryptedTypesChanged( |
- HasModelTypes(syncable::ModelTypeSet::All()), true)); |
- |
- EXPECT_FALSE(cryptographer_.encrypt_everything()); |
- ModelTypeSet encrypted_types = cryptographer_.GetEncryptedTypes(); |
- for (ModelTypeSet::Iterator iter = real_types.First(); |
- iter.Good(); iter.Inc()) { |
- if (iter.Get() == syncable::PASSWORDS || iter.Get() == syncable::NIGORI) |
- EXPECT_TRUE(encrypted_types.Has(iter.Get())); |
- else |
- EXPECT_FALSE(encrypted_types.Has(iter.Get())); |
- } |
- |
- cryptographer_.UpdateEncryptedTypesFromNigori(specifics); |
- |
- EXPECT_TRUE(cryptographer_.encrypt_everything()); |
- encrypted_types = cryptographer_.GetEncryptedTypes(); |
- for (ModelTypeSet::Iterator iter = real_types.First(); |
- iter.Good(); iter.Inc()) { |
- EXPECT_TRUE(encrypted_types.Has(iter.Get())); |
- } |
- |
- // Shouldn't trigger another notification. |
- specifics.set_encrypt_everything(true); |
- |
- cryptographer_.RemoveObserver(&observer); |
-} |
- |
-TEST_F(SyncCryptographerTest, EncryptEverythingImplicit) { |
- ModelTypeSet real_types = syncable::ModelTypeSet::All(); |
- sync_pb::NigoriSpecifics specifics; |
- specifics.set_encrypt_bookmarks(true); // Non-passwords = encrypt everything |
- |
- StrictMock<MockObserver> observer; |
- cryptographer_.AddObserver(&observer); |
- |
- EXPECT_CALL(observer, |
- OnEncryptedTypesChanged( |
- HasModelTypes(syncable::ModelTypeSet::All()), true)); |
- |
- EXPECT_FALSE(cryptographer_.encrypt_everything()); |
- ModelTypeSet encrypted_types = cryptographer_.GetEncryptedTypes(); |
- for (ModelTypeSet::Iterator iter = real_types.First(); |
- iter.Good(); iter.Inc()) { |
- if (iter.Get() == syncable::PASSWORDS || iter.Get() == syncable::NIGORI) |
- EXPECT_TRUE(encrypted_types.Has(iter.Get())); |
- else |
- EXPECT_FALSE(encrypted_types.Has(iter.Get())); |
- } |
- |
- cryptographer_.UpdateEncryptedTypesFromNigori(specifics); |
- |
- EXPECT_TRUE(cryptographer_.encrypt_everything()); |
- encrypted_types = cryptographer_.GetEncryptedTypes(); |
- for (ModelTypeSet::Iterator iter = real_types.First(); |
- iter.Good(); iter.Inc()) { |
- EXPECT_TRUE(encrypted_types.Has(iter.Get())); |
- } |
- |
- // Shouldn't trigger another notification. |
- specifics.set_encrypt_everything(true); |
- |
- cryptographer_.RemoveObserver(&observer); |
-} |
- |
-TEST_F(SyncCryptographerTest, UnknownSensitiveTypes) { |
- ModelTypeSet real_types = syncable::ModelTypeSet::All(); |
- sync_pb::NigoriSpecifics specifics; |
- // Explicitly setting encrypt everything should override logic for implicit |
- // encrypt everything. |
- specifics.set_encrypt_everything(false); |
- specifics.set_encrypt_bookmarks(true); |
- |
- StrictMock<MockObserver> observer; |
- cryptographer_.AddObserver(&observer); |
- |
- syncable::ModelTypeSet expected_encrypted_types = |
- Cryptographer::SensitiveTypes(); |
- expected_encrypted_types.Put(syncable::BOOKMARKS); |
- |
- EXPECT_CALL(observer, |
- OnEncryptedTypesChanged( |
- HasModelTypes(expected_encrypted_types), false)); |
- |
- EXPECT_FALSE(cryptographer_.encrypt_everything()); |
- ModelTypeSet encrypted_types = cryptographer_.GetEncryptedTypes(); |
- for (ModelTypeSet::Iterator iter = real_types.First(); |
- iter.Good(); iter.Inc()) { |
- if (iter.Get() == syncable::PASSWORDS || iter.Get() == syncable::NIGORI) |
- EXPECT_TRUE(encrypted_types.Has(iter.Get())); |
- else |
- EXPECT_FALSE(encrypted_types.Has(iter.Get())); |
- } |
- |
- cryptographer_.UpdateEncryptedTypesFromNigori(specifics); |
- |
- EXPECT_FALSE(cryptographer_.encrypt_everything()); |
- encrypted_types = cryptographer_.GetEncryptedTypes(); |
- for (ModelTypeSet::Iterator iter = real_types.First(); |
- iter.Good(); iter.Inc()) { |
- if (iter.Get() == syncable::PASSWORDS || |
- iter.Get() == syncable::NIGORI || |
- iter.Get() == syncable::BOOKMARKS) |
- EXPECT_TRUE(encrypted_types.Has(iter.Get())); |
- else |
- EXPECT_FALSE(encrypted_types.Has(iter.Get())); |
- } |
- |
- cryptographer_.RemoveObserver(&observer); |
-} |
- |
-} // namespace browser_sync |