| 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 43a977122bd0700187baebba4c1a945d2ff4897c..0000000000000000000000000000000000000000
|
| --- a/chrome/browser/sync/util/cryptographer_unittest.cc
|
| +++ /dev/null
|
| @@ -1,364 +0,0 @@
|
| -// Copyright (c) 2011 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/password_manager/encryptor.h"
|
| -#include "chrome/browser/sync/protocol/nigori_specifics.pb.h"
|
| -#include "chrome/browser/sync/protocol/password_specifics.pb.h"
|
| -#include "testing/gmock/include/gmock/gmock.h"
|
| -#include "testing/gtest/include/gtest/gtest.h"
|
| -
|
| -namespace browser_sync {
|
| -
|
| -using ::testing::Mock;
|
| -using ::testing::StrictMock;
|
| -using syncable::ModelTypeSet;
|
| -
|
| -namespace {
|
| -
|
| -class MockObserver : public Cryptographer::Observer {
|
| - public:
|
| - MOCK_METHOD2(OnEncryptedTypesChanged,
|
| - void(const syncable::ModelTypeSet&, bool));
|
| -};
|
| -
|
| -} // namespace
|
| -
|
| -TEST(CryptographerTest, EmptyCantDecrypt) {
|
| - Cryptographer cryptographer;
|
| - EXPECT_FALSE(cryptographer.is_ready());
|
| -
|
| - sync_pb::EncryptedData encrypted;
|
| - encrypted.set_key_name("foo");
|
| - encrypted.set_blob("bar");
|
| -
|
| - EXPECT_FALSE(cryptographer.CanDecrypt(encrypted));
|
| -}
|
| -
|
| -TEST(CryptographerTest, EmptyCantEncrypt) {
|
| - Cryptographer cryptographer;
|
| - EXPECT_FALSE(cryptographer.is_ready());
|
| -
|
| - sync_pb::EncryptedData encrypted;
|
| - sync_pb::PasswordSpecificsData original;
|
| - EXPECT_FALSE(cryptographer.Encrypt(original, &encrypted));
|
| -}
|
| -
|
| -TEST(CryptographerTest, MissingCantDecrypt) {
|
| - Cryptographer cryptographer;
|
| -
|
| - 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(CryptographerTest, CanEncryptAndDecrypt) {
|
| - Cryptographer cryptographer;
|
| -
|
| - 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(CryptographerTest, AddKeySetsDefault) {
|
| - Cryptographer cryptographer;
|
| -
|
| - 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(CryptographerTest, 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;
|
| -
|
| - 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;
|
| - 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(CryptographerTest, MAYBE_PackUnpack) {
|
| -#if defined(OS_MACOSX)
|
| - Encryptor::UseMockKeychain(true);
|
| -#endif
|
| -
|
| - 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));
|
| -
|
| - Cryptographer cryptographer;
|
| - 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(CryptographerTest, NigoriEncryptionTypes) {
|
| - Cryptographer cryptographer;
|
| - Cryptographer cryptographer2;
|
| - 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.SetEncryptedTypesForTest(encrypted_types);
|
| - cryptographer.UpdateNigoriFromEncryptedTypes(&nigori);
|
| - cryptographer2.UpdateEncryptedTypesFromNigori(nigori);
|
| - EXPECT_EQ(encrypted_types, cryptographer.GetEncryptedTypes());
|
| - EXPECT_EQ(encrypted_types, cryptographer2.GetEncryptedTypes());
|
| -
|
| - Mock::VerifyAndClearExpectations(&observer);
|
| - Mock::VerifyAndClearExpectations(&observer2);
|
| -
|
| - EXPECT_CALL(observer,
|
| - OnEncryptedTypesChanged(syncable::GetAllRealModelTypes(),
|
| - false));
|
| - EXPECT_CALL(observer2,
|
| - OnEncryptedTypesChanged(syncable::GetAllRealModelTypes(),
|
| - false));
|
| -
|
| - // Set all encrypted types
|
| - encrypted_types = syncable::GetAllRealModelTypes();
|
| - cryptographer.SetEncryptedTypesForTest(encrypted_types);
|
| - cryptographer.UpdateNigoriFromEncryptedTypes(&nigori);
|
| - cryptographer2.UpdateEncryptedTypesFromNigori(nigori);
|
| - EXPECT_EQ(encrypted_types, cryptographer.GetEncryptedTypes());
|
| - EXPECT_EQ(encrypted_types, cryptographer2.GetEncryptedTypes());
|
| -}
|
| -
|
| -TEST(CryptographerTest, EncryptEverythingExplicit) {
|
| - ModelTypeSet real_types = syncable::GetAllRealModelTypes();
|
| - sync_pb::NigoriSpecifics specifics;
|
| - specifics.set_encrypt_everything(true);
|
| -
|
| - Cryptographer cryptographer;
|
| - StrictMock<MockObserver> observer;
|
| - cryptographer.AddObserver(&observer);
|
| -
|
| - EXPECT_CALL(observer,
|
| - OnEncryptedTypesChanged(syncable::GetAllRealModelTypes(),
|
| - true));
|
| -
|
| - EXPECT_FALSE(cryptographer.encrypt_everything());
|
| - ModelTypeSet encrypted_types = cryptographer.GetEncryptedTypes();
|
| - for (ModelTypeSet::iterator iter = real_types.begin();
|
| - iter != real_types.end();
|
| - ++iter) {
|
| - if (*iter == syncable::PASSWORDS || *iter == syncable::NIGORI)
|
| - EXPECT_EQ(1U, encrypted_types.count(*iter));
|
| - else
|
| - EXPECT_EQ(0U, encrypted_types.count(*iter));
|
| - }
|
| -
|
| - cryptographer.UpdateEncryptedTypesFromNigori(specifics);
|
| -
|
| - EXPECT_TRUE(cryptographer.encrypt_everything());
|
| - encrypted_types = cryptographer.GetEncryptedTypes();
|
| - for (ModelTypeSet::iterator iter = real_types.begin();
|
| - iter != real_types.end();
|
| - ++iter) {
|
| - EXPECT_EQ(1U, encrypted_types.count(*iter));
|
| - }
|
| -
|
| - // Shouldn't trigger another notification.
|
| - specifics.set_encrypt_everything(true);
|
| -
|
| - cryptographer.RemoveObserver(&observer);
|
| -}
|
| -
|
| -TEST(CryptographerTest, EncryptEverythingImplicit) {
|
| - ModelTypeSet real_types = syncable::GetAllRealModelTypes();
|
| - sync_pb::NigoriSpecifics specifics;
|
| - specifics.set_encrypt_bookmarks(true); // Non-passwords = encrypt everything
|
| -
|
| - Cryptographer cryptographer;
|
| - StrictMock<MockObserver> observer;
|
| - cryptographer.AddObserver(&observer);
|
| -
|
| - EXPECT_CALL(observer,
|
| - OnEncryptedTypesChanged(syncable::GetAllRealModelTypes(),
|
| - true));
|
| -
|
| - EXPECT_FALSE(cryptographer.encrypt_everything());
|
| - ModelTypeSet encrypted_types = cryptographer.GetEncryptedTypes();
|
| - for (ModelTypeSet::iterator iter = real_types.begin();
|
| - iter != real_types.end();
|
| - ++iter) {
|
| - if (*iter == syncable::PASSWORDS || *iter == syncable::NIGORI)
|
| - EXPECT_EQ(1U, encrypted_types.count(*iter));
|
| - else
|
| - EXPECT_EQ(0U, encrypted_types.count(*iter));
|
| - }
|
| -
|
| - cryptographer.UpdateEncryptedTypesFromNigori(specifics);
|
| -
|
| - EXPECT_TRUE(cryptographer.encrypt_everything());
|
| - encrypted_types = cryptographer.GetEncryptedTypes();
|
| - for (ModelTypeSet::iterator iter = real_types.begin();
|
| - iter != real_types.end();
|
| - ++iter) {
|
| - EXPECT_EQ(1U, encrypted_types.count(*iter));
|
| - }
|
| -
|
| - // Shouldn't trigger another notification.
|
| - specifics.set_encrypt_everything(true);
|
| -
|
| - cryptographer.RemoveObserver(&observer);
|
| -}
|
| -
|
| -TEST(CryptographerTest, UnknownSensitiveTypes) {
|
| - ModelTypeSet real_types = syncable::GetAllRealModelTypes();
|
| - 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);
|
| -
|
| - Cryptographer cryptographer;
|
| - StrictMock<MockObserver> observer;
|
| - cryptographer.AddObserver(&observer);
|
| -
|
| - syncable::ModelTypeSet expected_encrypted_types =
|
| - Cryptographer::SensitiveTypes();
|
| - expected_encrypted_types.insert(syncable::BOOKMARKS);
|
| -
|
| - EXPECT_CALL(observer,
|
| - OnEncryptedTypesChanged(expected_encrypted_types,
|
| - false));
|
| -
|
| - EXPECT_FALSE(cryptographer.encrypt_everything());
|
| - ModelTypeSet encrypted_types = cryptographer.GetEncryptedTypes();
|
| - for (ModelTypeSet::iterator iter = real_types.begin();
|
| - iter != real_types.end();
|
| - ++iter) {
|
| - if (*iter == syncable::PASSWORDS || *iter == syncable::NIGORI)
|
| - EXPECT_EQ(1U, encrypted_types.count(*iter));
|
| - else
|
| - EXPECT_EQ(0U, encrypted_types.count(*iter));
|
| - }
|
| -
|
| - cryptographer.UpdateEncryptedTypesFromNigori(specifics);
|
| -
|
| - EXPECT_FALSE(cryptographer.encrypt_everything());
|
| - encrypted_types = cryptographer.GetEncryptedTypes();
|
| - for (ModelTypeSet::iterator iter = real_types.begin();
|
| - iter != real_types.end();
|
| - ++iter) {
|
| - if (*iter == syncable::PASSWORDS ||
|
| - *iter == syncable::NIGORI ||
|
| - *iter == syncable::BOOKMARKS)
|
| - EXPECT_EQ(1U, encrypted_types.count(*iter));
|
| - else
|
| - EXPECT_EQ(0U, encrypted_types.count(*iter));
|
| - }
|
| -
|
| - cryptographer.RemoveObserver(&observer);
|
| -}
|
| -
|
| -} // namespace browser_sync
|
|
|