| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/sync/util/cryptographer.h" | 5 #include "chrome/browser/sync/util/cryptographer.h" |
| 6 | 6 |
| 7 #include <string> | 7 #include <string> |
| 8 | 8 |
| 9 #include "base/memory/scoped_ptr.h" | 9 #include "base/memory/scoped_ptr.h" |
| 10 #include "base/string_util.h" | 10 #include "base/string_util.h" |
| 11 #include "chrome/browser/password_manager/encryptor.h" | 11 #include "chrome/browser/password_manager/encryptor.h" |
| 12 #include "chrome/browser/sync/protocol/nigori_specifics.pb.h" | 12 #include "chrome/browser/sync/protocol/nigori_specifics.pb.h" |
| 13 #include "chrome/browser/sync/protocol/password_specifics.pb.h" | 13 #include "chrome/browser/sync/protocol/password_specifics.pb.h" |
| 14 #include "testing/gmock/include/gmock/gmock.h" |
| 14 #include "testing/gtest/include/gtest/gtest.h" | 15 #include "testing/gtest/include/gtest/gtest.h" |
| 15 | 16 |
| 16 using syncable::ModelTypeSet; | |
| 17 | |
| 18 namespace browser_sync { | 17 namespace browser_sync { |
| 19 | 18 |
| 19 using ::testing::Mock; |
| 20 using ::testing::StrictMock; |
| 21 using syncable::ModelTypeSet; |
| 22 |
| 23 namespace { |
| 24 |
| 25 class MockObserver : public Cryptographer::Observer { |
| 26 public: |
| 27 MOCK_METHOD2(OnEncryptedTypesChanged, |
| 28 void(const syncable::ModelTypeSet&, bool)); |
| 29 MOCK_METHOD0(OnEncryptionComplete, void()); |
| 30 }; |
| 31 |
| 32 } // namespace |
| 33 |
| 20 TEST(CryptographerTest, EmptyCantDecrypt) { | 34 TEST(CryptographerTest, EmptyCantDecrypt) { |
| 21 Cryptographer cryptographer; | 35 Cryptographer cryptographer; |
| 22 EXPECT_FALSE(cryptographer.is_ready()); | 36 EXPECT_FALSE(cryptographer.is_ready()); |
| 23 | 37 |
| 24 sync_pb::EncryptedData encrypted; | 38 sync_pb::EncryptedData encrypted; |
| 25 encrypted.set_key_name("foo"); | 39 encrypted.set_key_name("foo"); |
| 26 encrypted.set_blob("bar"); | 40 encrypted.set_blob("bar"); |
| 27 | 41 |
| 28 EXPECT_FALSE(cryptographer.CanDecrypt(encrypted)); | 42 EXPECT_FALSE(cryptographer.CanDecrypt(encrypted)); |
| 29 } | 43 } |
| (...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 174 EXPECT_NE(static_cast<Nigori*>(NULL), unpacked.get()); | 188 EXPECT_NE(static_cast<Nigori*>(NULL), unpacked.get()); |
| 175 | 189 |
| 176 std::string user_key, encryption_key, mac_key; | 190 std::string user_key, encryption_key, mac_key; |
| 177 ASSERT_TRUE(unpacked->ExportKeys(&user_key, &encryption_key, &mac_key)); | 191 ASSERT_TRUE(unpacked->ExportKeys(&user_key, &encryption_key, &mac_key)); |
| 178 | 192 |
| 179 EXPECT_EQ(expected_user, user_key); | 193 EXPECT_EQ(expected_user, user_key); |
| 180 EXPECT_EQ(expected_encryption, encryption_key); | 194 EXPECT_EQ(expected_encryption, encryption_key); |
| 181 EXPECT_EQ(expected_mac, mac_key); | 195 EXPECT_EQ(expected_mac, mac_key); |
| 182 } | 196 } |
| 183 | 197 |
| 198 TEST(CryptographerTest, MarkEncryptionComplete) { |
| 199 Cryptographer cryptographer; |
| 200 StrictMock<MockObserver> observer; |
| 201 cryptographer.AddObserver(&observer); |
| 202 EXPECT_CALL(observer, |
| 203 OnEncryptedTypesChanged(Cryptographer::SensitiveTypes(), |
| 204 false)); |
| 205 EXPECT_CALL(observer, OnEncryptionComplete()); |
| 206 |
| 207 cryptographer.MarkEncryptionComplete(); |
| 208 } |
| 209 |
| 184 TEST(CryptographerTest, NigoriEncryptionTypes) { | 210 TEST(CryptographerTest, NigoriEncryptionTypes) { |
| 185 Cryptographer cryptographer; | 211 Cryptographer cryptographer; |
| 186 Cryptographer cryptographer2; | 212 Cryptographer cryptographer2; |
| 187 sync_pb::NigoriSpecifics nigori; | 213 sync_pb::NigoriSpecifics nigori; |
| 188 ModelTypeSet encrypted_types; | 214 ModelTypeSet encrypted_types; |
| 189 | 215 |
| 216 StrictMock<MockObserver> observer; |
| 217 cryptographer.AddObserver(&observer); |
| 218 StrictMock<MockObserver> observer2; |
| 219 cryptographer2.AddObserver(&observer2); |
| 220 |
| 221 EXPECT_CALL(observer, |
| 222 OnEncryptedTypesChanged(Cryptographer::SensitiveTypes(), |
| 223 false)); |
| 224 EXPECT_CALL(observer2, |
| 225 OnEncryptedTypesChanged(Cryptographer::SensitiveTypes(), |
| 226 false)); |
| 227 |
| 190 // Just set the sensitive types. | 228 // Just set the sensitive types. |
| 191 encrypted_types.insert(syncable::PASSWORDS); | 229 encrypted_types.insert(syncable::PASSWORDS); |
| 192 encrypted_types.insert(syncable::NIGORI); | 230 encrypted_types.insert(syncable::NIGORI); |
| 193 cryptographer.SetEncryptedTypes(encrypted_types); | 231 cryptographer.SetEncryptedTypes(encrypted_types); |
| 194 cryptographer.UpdateNigoriFromEncryptedTypes(&nigori); | 232 cryptographer.UpdateNigoriFromEncryptedTypes(&nigori); |
| 195 cryptographer2.UpdateEncryptedTypesFromNigori(nigori); | 233 cryptographer2.UpdateEncryptedTypesFromNigori(nigori); |
| 196 EXPECT_EQ(encrypted_types, cryptographer.GetEncryptedTypes()); | 234 EXPECT_EQ(encrypted_types, cryptographer.GetEncryptedTypes()); |
| 197 EXPECT_EQ(encrypted_types, cryptographer2.GetEncryptedTypes()); | 235 EXPECT_EQ(encrypted_types, cryptographer2.GetEncryptedTypes()); |
| 198 | 236 |
| 237 Mock::VerifyAndClearExpectations(&observer); |
| 238 Mock::VerifyAndClearExpectations(&observer2); |
| 239 |
| 240 EXPECT_CALL(observer, |
| 241 OnEncryptedTypesChanged(syncable::GetAllRealModelTypes(), |
| 242 false)); |
| 243 EXPECT_CALL(observer2, |
| 244 OnEncryptedTypesChanged(syncable::GetAllRealModelTypes(), |
| 245 false)); |
| 246 |
| 199 // Set all encrypted types | 247 // Set all encrypted types |
| 200 encrypted_types = syncable::GetAllRealModelTypes(); | 248 encrypted_types = syncable::GetAllRealModelTypes(); |
| 201 cryptographer.SetEncryptedTypes(encrypted_types); | 249 cryptographer.SetEncryptedTypes(encrypted_types); |
| 202 cryptographer.UpdateNigoriFromEncryptedTypes(&nigori); | 250 cryptographer.UpdateNigoriFromEncryptedTypes(&nigori); |
| 203 cryptographer2.UpdateEncryptedTypesFromNigori(nigori); | 251 cryptographer2.UpdateEncryptedTypesFromNigori(nigori); |
| 204 EXPECT_EQ(encrypted_types, cryptographer.GetEncryptedTypes()); | 252 EXPECT_EQ(encrypted_types, cryptographer.GetEncryptedTypes()); |
| 205 EXPECT_EQ(encrypted_types, cryptographer2.GetEncryptedTypes()); | 253 EXPECT_EQ(encrypted_types, cryptographer2.GetEncryptedTypes()); |
| 206 | 254 |
| 255 Mock::VerifyAndClearExpectations(&observer); |
| 256 Mock::VerifyAndClearExpectations(&observer2); |
| 257 |
| 207 // Ensure encrypted types are never unset. | 258 // Ensure encrypted types are never unset. |
| 208 Cryptographer cryptographer3; // Empty cryptographer. | 259 Cryptographer cryptographer3; // Empty cryptographer. |
| 260 StrictMock<MockObserver> observer3; |
| 261 cryptographer3.AddObserver(&observer3); |
| 262 |
| 263 EXPECT_CALL(observer, |
| 264 OnEncryptedTypesChanged(syncable::GetAllRealModelTypes(), |
| 265 false)); |
| 266 EXPECT_CALL(observer2, |
| 267 OnEncryptedTypesChanged(syncable::GetAllRealModelTypes(), |
| 268 false)); |
| 269 EXPECT_CALL(observer3, |
| 270 OnEncryptedTypesChanged(syncable::GetAllRealModelTypes(), |
| 271 false)); |
| 272 |
| 209 encrypted_types.erase(syncable::BOOKMARKS); | 273 encrypted_types.erase(syncable::BOOKMARKS); |
| 210 encrypted_types.erase(syncable::SESSIONS); | 274 encrypted_types.erase(syncable::SESSIONS); |
| 211 cryptographer.SetEncryptedTypes(encrypted_types); | 275 cryptographer.SetEncryptedTypes(encrypted_types); |
| 212 cryptographer.UpdateNigoriFromEncryptedTypes(&nigori); | 276 cryptographer.UpdateNigoriFromEncryptedTypes(&nigori); |
| 213 cryptographer2.UpdateEncryptedTypesFromNigori(nigori); | 277 cryptographer2.UpdateEncryptedTypesFromNigori(nigori); |
| 214 cryptographer3.UpdateEncryptedTypesFromNigori(nigori); | 278 cryptographer3.UpdateEncryptedTypesFromNigori(nigori); |
| 215 encrypted_types = syncable::GetAllRealModelTypes(); | 279 encrypted_types = syncable::GetAllRealModelTypes(); |
| 216 EXPECT_EQ(encrypted_types, cryptographer.GetEncryptedTypes()); | 280 EXPECT_EQ(encrypted_types, cryptographer.GetEncryptedTypes()); |
| 217 EXPECT_EQ(encrypted_types, cryptographer2.GetEncryptedTypes()); | 281 EXPECT_EQ(encrypted_types, cryptographer2.GetEncryptedTypes()); |
| 218 EXPECT_EQ(encrypted_types, cryptographer3.GetEncryptedTypes()); | 282 EXPECT_EQ(encrypted_types, cryptographer3.GetEncryptedTypes()); |
| 283 |
| 284 cryptographer3.RemoveObserver(&observer3); |
| 285 cryptographer2.RemoveObserver(&observer2); |
| 286 cryptographer.RemoveObserver(&observer); |
| 219 } | 287 } |
| 220 | 288 |
| 221 TEST(CryptographerTest, EncryptEverythingExplicit) { | 289 TEST(CryptographerTest, EncryptEverythingExplicit) { |
| 222 ModelTypeSet real_types = syncable::GetAllRealModelTypes(); | 290 ModelTypeSet real_types = syncable::GetAllRealModelTypes(); |
| 223 sync_pb::NigoriSpecifics specifics; | 291 sync_pb::NigoriSpecifics specifics; |
| 224 specifics.set_encrypt_everything(true); | 292 specifics.set_encrypt_everything(true); |
| 225 | 293 |
| 226 Cryptographer cryptographer; | 294 Cryptographer cryptographer; |
| 295 StrictMock<MockObserver> observer; |
| 296 cryptographer.AddObserver(&observer); |
| 297 |
| 298 EXPECT_CALL(observer, |
| 299 OnEncryptedTypesChanged(syncable::GetAllRealModelTypes(), |
| 300 true)); |
| 301 |
| 227 EXPECT_FALSE(cryptographer.encrypt_everything()); | 302 EXPECT_FALSE(cryptographer.encrypt_everything()); |
| 228 ModelTypeSet encrypted_types = cryptographer.GetEncryptedTypes(); | 303 ModelTypeSet encrypted_types = cryptographer.GetEncryptedTypes(); |
| 229 for (ModelTypeSet::iterator iter = real_types.begin(); | 304 for (ModelTypeSet::iterator iter = real_types.begin(); |
| 230 iter != real_types.end(); | 305 iter != real_types.end(); |
| 231 ++iter) { | 306 ++iter) { |
| 232 if (*iter == syncable::PASSWORDS || *iter == syncable::NIGORI) | 307 if (*iter == syncable::PASSWORDS || *iter == syncable::NIGORI) |
| 233 EXPECT_EQ(1U, encrypted_types.count(*iter)); | 308 EXPECT_EQ(1U, encrypted_types.count(*iter)); |
| 234 else | 309 else |
| 235 EXPECT_EQ(0U, encrypted_types.count(*iter)); | 310 EXPECT_EQ(0U, encrypted_types.count(*iter)); |
| 236 } | 311 } |
| 237 | 312 |
| 238 cryptographer.UpdateEncryptedTypesFromNigori(specifics); | 313 cryptographer.UpdateEncryptedTypesFromNigori(specifics); |
| 239 | 314 |
| 240 EXPECT_TRUE(cryptographer.encrypt_everything()); | 315 EXPECT_TRUE(cryptographer.encrypt_everything()); |
| 241 encrypted_types = cryptographer.GetEncryptedTypes(); | 316 encrypted_types = cryptographer.GetEncryptedTypes(); |
| 242 for (ModelTypeSet::iterator iter = real_types.begin(); | 317 for (ModelTypeSet::iterator iter = real_types.begin(); |
| 243 iter != real_types.end(); | 318 iter != real_types.end(); |
| 244 ++iter) { | 319 ++iter) { |
| 245 EXPECT_EQ(1U, encrypted_types.count(*iter)); | 320 EXPECT_EQ(1U, encrypted_types.count(*iter)); |
| 246 } | 321 } |
| 322 |
| 323 cryptographer.RemoveObserver(&observer); |
| 247 } | 324 } |
| 248 | 325 |
| 249 TEST(CryptographerTest, EncryptEverythingImplicit) { | 326 TEST(CryptographerTest, EncryptEverythingImplicit) { |
| 250 ModelTypeSet real_types = syncable::GetAllRealModelTypes(); | 327 ModelTypeSet real_types = syncable::GetAllRealModelTypes(); |
| 251 sync_pb::NigoriSpecifics specifics; | 328 sync_pb::NigoriSpecifics specifics; |
| 252 specifics.set_encrypt_bookmarks(true); // Non-passwords = encrypt everything. | 329 specifics.set_encrypt_bookmarks(true); // Non-passwords = encrypt everything |
| 253 | 330 |
| 254 Cryptographer cryptographer; | 331 Cryptographer cryptographer; |
| 332 StrictMock<MockObserver> observer; |
| 333 cryptographer.AddObserver(&observer); |
| 334 |
| 335 EXPECT_CALL(observer, |
| 336 OnEncryptedTypesChanged(syncable::GetAllRealModelTypes(), |
| 337 true)); |
| 338 |
| 255 EXPECT_FALSE(cryptographer.encrypt_everything()); | 339 EXPECT_FALSE(cryptographer.encrypt_everything()); |
| 256 ModelTypeSet encrypted_types = cryptographer.GetEncryptedTypes(); | 340 ModelTypeSet encrypted_types = cryptographer.GetEncryptedTypes(); |
| 257 for (ModelTypeSet::iterator iter = real_types.begin(); | 341 for (ModelTypeSet::iterator iter = real_types.begin(); |
| 258 iter != real_types.end(); | 342 iter != real_types.end(); |
| 259 ++iter) { | 343 ++iter) { |
| 260 if (*iter == syncable::PASSWORDS || *iter == syncable::NIGORI) | 344 if (*iter == syncable::PASSWORDS || *iter == syncable::NIGORI) |
| 261 EXPECT_EQ(1U, encrypted_types.count(*iter)); | 345 EXPECT_EQ(1U, encrypted_types.count(*iter)); |
| 262 else | 346 else |
| 263 EXPECT_EQ(0U, encrypted_types.count(*iter)); | 347 EXPECT_EQ(0U, encrypted_types.count(*iter)); |
| 264 } | 348 } |
| 265 | 349 |
| 266 cryptographer.UpdateEncryptedTypesFromNigori(specifics); | 350 cryptographer.UpdateEncryptedTypesFromNigori(specifics); |
| 267 | 351 |
| 268 EXPECT_TRUE(cryptographer.encrypt_everything()); | 352 EXPECT_TRUE(cryptographer.encrypt_everything()); |
| 269 encrypted_types = cryptographer.GetEncryptedTypes(); | 353 encrypted_types = cryptographer.GetEncryptedTypes(); |
| 270 for (ModelTypeSet::iterator iter = real_types.begin(); | 354 for (ModelTypeSet::iterator iter = real_types.begin(); |
| 271 iter != real_types.end(); | 355 iter != real_types.end(); |
| 272 ++iter) { | 356 ++iter) { |
| 273 EXPECT_EQ(1U, encrypted_types.count(*iter)); | 357 EXPECT_EQ(1U, encrypted_types.count(*iter)); |
| 274 } | 358 } |
| 359 |
| 360 cryptographer.RemoveObserver(&observer); |
| 275 } | 361 } |
| 276 | 362 |
| 277 TEST(CryptographerTest, UnknownSensitiveTypes) { | 363 TEST(CryptographerTest, UnknownSensitiveTypes) { |
| 278 ModelTypeSet real_types = syncable::GetAllRealModelTypes(); | 364 ModelTypeSet real_types = syncable::GetAllRealModelTypes(); |
| 279 sync_pb::NigoriSpecifics specifics; | 365 sync_pb::NigoriSpecifics specifics; |
| 280 // Explicitly setting encrypt everything should override logic for implicit | 366 // Explicitly setting encrypt everything should override logic for implicit |
| 281 // encrypt everything. | 367 // encrypt everything. |
| 282 specifics.set_encrypt_everything(false); | 368 specifics.set_encrypt_everything(false); |
| 283 specifics.set_encrypt_bookmarks(true); | 369 specifics.set_encrypt_bookmarks(true); |
| 284 | 370 |
| 285 Cryptographer cryptographer; | 371 Cryptographer cryptographer; |
| 372 StrictMock<MockObserver> observer; |
| 373 cryptographer.AddObserver(&observer); |
| 374 |
| 375 syncable::ModelTypeSet expected_encrypted_types = |
| 376 Cryptographer::SensitiveTypes(); |
| 377 expected_encrypted_types.insert(syncable::BOOKMARKS); |
| 378 |
| 379 EXPECT_CALL(observer, |
| 380 OnEncryptedTypesChanged(expected_encrypted_types, |
| 381 false)); |
| 382 |
| 286 EXPECT_FALSE(cryptographer.encrypt_everything()); | 383 EXPECT_FALSE(cryptographer.encrypt_everything()); |
| 287 ModelTypeSet encrypted_types = cryptographer.GetEncryptedTypes(); | 384 ModelTypeSet encrypted_types = cryptographer.GetEncryptedTypes(); |
| 288 for (ModelTypeSet::iterator iter = real_types.begin(); | 385 for (ModelTypeSet::iterator iter = real_types.begin(); |
| 289 iter != real_types.end(); | 386 iter != real_types.end(); |
| 290 ++iter) { | 387 ++iter) { |
| 291 if (*iter == syncable::PASSWORDS || *iter == syncable::NIGORI) | 388 if (*iter == syncable::PASSWORDS || *iter == syncable::NIGORI) |
| 292 EXPECT_EQ(1U, encrypted_types.count(*iter)); | 389 EXPECT_EQ(1U, encrypted_types.count(*iter)); |
| 293 else | 390 else |
| 294 EXPECT_EQ(0U, encrypted_types.count(*iter)); | 391 EXPECT_EQ(0U, encrypted_types.count(*iter)); |
| 295 } | 392 } |
| 296 | 393 |
| 297 cryptographer.UpdateEncryptedTypesFromNigori(specifics); | 394 cryptographer.UpdateEncryptedTypesFromNigori(specifics); |
| 298 | 395 |
| 299 EXPECT_FALSE(cryptographer.encrypt_everything()); | 396 EXPECT_FALSE(cryptographer.encrypt_everything()); |
| 300 encrypted_types = cryptographer.GetEncryptedTypes(); | 397 encrypted_types = cryptographer.GetEncryptedTypes(); |
| 301 for (ModelTypeSet::iterator iter = real_types.begin(); | 398 for (ModelTypeSet::iterator iter = real_types.begin(); |
| 302 iter != real_types.end(); | 399 iter != real_types.end(); |
| 303 ++iter) { | 400 ++iter) { |
| 304 if (*iter == syncable::PASSWORDS || | 401 if (*iter == syncable::PASSWORDS || |
| 305 *iter == syncable::NIGORI || | 402 *iter == syncable::NIGORI || |
| 306 *iter == syncable::BOOKMARKS) | 403 *iter == syncable::BOOKMARKS) |
| 307 EXPECT_EQ(1U, encrypted_types.count(*iter)); | 404 EXPECT_EQ(1U, encrypted_types.count(*iter)); |
| 308 else | 405 else |
| 309 EXPECT_EQ(0U, encrypted_types.count(*iter)); | 406 EXPECT_EQ(0U, encrypted_types.count(*iter)); |
| 310 } | 407 } |
| 408 |
| 409 cryptographer.RemoveObserver(&observer); |
| 311 } | 410 } |
| 312 | 411 |
| 313 } // namespace browser_sync | 412 } // namespace browser_sync |
| OLD | NEW |