Chromium Code Reviews| 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 }; | |
| 30 | |
| 31 } // namespace | |
| 32 | |
| 20 TEST(CryptographerTest, EmptyCantDecrypt) { | 33 TEST(CryptographerTest, EmptyCantDecrypt) { |
| 21 Cryptographer cryptographer; | 34 Cryptographer cryptographer; |
| 22 EXPECT_FALSE(cryptographer.is_ready()); | 35 EXPECT_FALSE(cryptographer.is_ready()); |
| 23 | 36 |
| 24 sync_pb::EncryptedData encrypted; | 37 sync_pb::EncryptedData encrypted; |
| 25 encrypted.set_key_name("foo"); | 38 encrypted.set_key_name("foo"); |
| 26 encrypted.set_blob("bar"); | 39 encrypted.set_blob("bar"); |
| 27 | 40 |
| 28 EXPECT_FALSE(cryptographer.CanDecrypt(encrypted)); | 41 EXPECT_FALSE(cryptographer.CanDecrypt(encrypted)); |
| 29 } | 42 } |
| (...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 178 | 191 |
| 179 EXPECT_EQ(expected_user, user_key); | 192 EXPECT_EQ(expected_user, user_key); |
| 180 EXPECT_EQ(expected_encryption, encryption_key); | 193 EXPECT_EQ(expected_encryption, encryption_key); |
| 181 EXPECT_EQ(expected_mac, mac_key); | 194 EXPECT_EQ(expected_mac, mac_key); |
| 182 } | 195 } |
| 183 | 196 |
| 184 TEST(CryptographerTest, NigoriEncryptionTypes) { | 197 TEST(CryptographerTest, NigoriEncryptionTypes) { |
| 185 Cryptographer cryptographer; | 198 Cryptographer cryptographer; |
| 186 Cryptographer cryptographer2; | 199 Cryptographer cryptographer2; |
| 187 sync_pb::NigoriSpecifics nigori; | 200 sync_pb::NigoriSpecifics nigori; |
| 188 ModelTypeSet encrypted_types; | |
| 189 | 201 |
| 190 // Just set the sensitive types. | 202 StrictMock<MockObserver> observer; |
| 191 encrypted_types.insert(syncable::PASSWORDS); | 203 cryptographer.AddObserver(&observer); |
| 192 encrypted_types.insert(syncable::NIGORI); | 204 StrictMock<MockObserver> observer2; |
| 193 cryptographer.SetEncryptedTypes(encrypted_types); | 205 cryptographer2.AddObserver(&observer2); |
| 206 | |
| 207 // Just set the sensitive types (shouldn't trigger any | |
| 208 // notifications). | |
| 209 ModelTypeSet encrypted_types(Cryptographer::SensitiveTypes()); | |
| 210 cryptographer.SetEncryptedTypesForTest(encrypted_types); | |
| 194 cryptographer.UpdateNigoriFromEncryptedTypes(&nigori); | 211 cryptographer.UpdateNigoriFromEncryptedTypes(&nigori); |
| 195 cryptographer2.UpdateEncryptedTypesFromNigori(nigori); | 212 cryptographer2.UpdateEncryptedTypesFromNigori(nigori); |
| 196 EXPECT_EQ(encrypted_types, cryptographer.GetEncryptedTypes()); | 213 EXPECT_EQ(encrypted_types, cryptographer.GetEncryptedTypes()); |
| 197 EXPECT_EQ(encrypted_types, cryptographer2.GetEncryptedTypes()); | 214 EXPECT_EQ(encrypted_types, cryptographer2.GetEncryptedTypes()); |
| 198 | 215 |
| 216 Mock::VerifyAndClearExpectations(&observer); | |
| 217 Mock::VerifyAndClearExpectations(&observer2); | |
| 218 | |
| 219 EXPECT_CALL(observer, | |
| 220 OnEncryptedTypesChanged(syncable::GetAllRealModelTypes(), | |
| 221 false)); | |
| 222 EXPECT_CALL(observer2, | |
| 223 OnEncryptedTypesChanged(syncable::GetAllRealModelTypes(), | |
| 224 false)); | |
| 225 | |
| 199 // Set all encrypted types | 226 // Set all encrypted types |
| 200 encrypted_types = syncable::GetAllRealModelTypes(); | 227 encrypted_types = syncable::GetAllRealModelTypes(); |
| 201 cryptographer.SetEncryptedTypes(encrypted_types); | 228 cryptographer.SetEncryptedTypesForTest(encrypted_types); |
| 202 cryptographer.UpdateNigoriFromEncryptedTypes(&nigori); | 229 cryptographer.UpdateNigoriFromEncryptedTypes(&nigori); |
| 203 cryptographer2.UpdateEncryptedTypesFromNigori(nigori); | 230 cryptographer2.UpdateEncryptedTypesFromNigori(nigori); |
| 204 EXPECT_EQ(encrypted_types, cryptographer.GetEncryptedTypes()); | 231 EXPECT_EQ(encrypted_types, cryptographer.GetEncryptedTypes()); |
| 205 EXPECT_EQ(encrypted_types, cryptographer2.GetEncryptedTypes()); | 232 EXPECT_EQ(encrypted_types, cryptographer2.GetEncryptedTypes()); |
| 206 | |
| 207 // Ensure encrypted types are never unset. | |
|
Nicolas Zea
2011/10/24 19:18:17
Any reason this was removed?
akalin
2011/10/24 19:34:13
The old public SetEncryptedTypes was more like Mer
| |
| 208 Cryptographer cryptographer3; // Empty cryptographer. | |
| 209 encrypted_types.erase(syncable::BOOKMARKS); | |
| 210 encrypted_types.erase(syncable::SESSIONS); | |
| 211 cryptographer.SetEncryptedTypes(encrypted_types); | |
| 212 cryptographer.UpdateNigoriFromEncryptedTypes(&nigori); | |
| 213 cryptographer2.UpdateEncryptedTypesFromNigori(nigori); | |
| 214 cryptographer3.UpdateEncryptedTypesFromNigori(nigori); | |
| 215 encrypted_types = syncable::GetAllRealModelTypes(); | |
| 216 EXPECT_EQ(encrypted_types, cryptographer.GetEncryptedTypes()); | |
| 217 EXPECT_EQ(encrypted_types, cryptographer2.GetEncryptedTypes()); | |
| 218 EXPECT_EQ(encrypted_types, cryptographer3.GetEncryptedTypes()); | |
| 219 } | 233 } |
| 220 | 234 |
| 221 TEST(CryptographerTest, EncryptEverythingExplicit) { | 235 TEST(CryptographerTest, EncryptEverythingExplicit) { |
| 222 ModelTypeSet real_types = syncable::GetAllRealModelTypes(); | 236 ModelTypeSet real_types = syncable::GetAllRealModelTypes(); |
| 223 sync_pb::NigoriSpecifics specifics; | 237 sync_pb::NigoriSpecifics specifics; |
| 224 specifics.set_encrypt_everything(true); | 238 specifics.set_encrypt_everything(true); |
| 225 | 239 |
| 226 Cryptographer cryptographer; | 240 Cryptographer cryptographer; |
| 241 StrictMock<MockObserver> observer; | |
| 242 cryptographer.AddObserver(&observer); | |
| 243 | |
| 244 EXPECT_CALL(observer, | |
| 245 OnEncryptedTypesChanged(syncable::GetAllRealModelTypes(), | |
| 246 true)); | |
| 247 | |
| 227 EXPECT_FALSE(cryptographer.encrypt_everything()); | 248 EXPECT_FALSE(cryptographer.encrypt_everything()); |
| 228 ModelTypeSet encrypted_types = cryptographer.GetEncryptedTypes(); | 249 ModelTypeSet encrypted_types = cryptographer.GetEncryptedTypes(); |
| 229 for (ModelTypeSet::iterator iter = real_types.begin(); | 250 for (ModelTypeSet::iterator iter = real_types.begin(); |
| 230 iter != real_types.end(); | 251 iter != real_types.end(); |
| 231 ++iter) { | 252 ++iter) { |
| 232 if (*iter == syncable::PASSWORDS || *iter == syncable::NIGORI) | 253 if (*iter == syncable::PASSWORDS || *iter == syncable::NIGORI) |
| 233 EXPECT_EQ(1U, encrypted_types.count(*iter)); | 254 EXPECT_EQ(1U, encrypted_types.count(*iter)); |
| 234 else | 255 else |
| 235 EXPECT_EQ(0U, encrypted_types.count(*iter)); | 256 EXPECT_EQ(0U, encrypted_types.count(*iter)); |
| 236 } | 257 } |
| 237 | 258 |
| 238 cryptographer.UpdateEncryptedTypesFromNigori(specifics); | 259 cryptographer.UpdateEncryptedTypesFromNigori(specifics); |
| 239 | 260 |
| 240 EXPECT_TRUE(cryptographer.encrypt_everything()); | 261 EXPECT_TRUE(cryptographer.encrypt_everything()); |
| 241 encrypted_types = cryptographer.GetEncryptedTypes(); | 262 encrypted_types = cryptographer.GetEncryptedTypes(); |
| 242 for (ModelTypeSet::iterator iter = real_types.begin(); | 263 for (ModelTypeSet::iterator iter = real_types.begin(); |
| 243 iter != real_types.end(); | 264 iter != real_types.end(); |
| 244 ++iter) { | 265 ++iter) { |
| 245 EXPECT_EQ(1U, encrypted_types.count(*iter)); | 266 EXPECT_EQ(1U, encrypted_types.count(*iter)); |
| 246 } | 267 } |
| 268 | |
| 269 // Shouldn't trigger another notification. | |
| 270 specifics.set_encrypt_everything(true); | |
| 271 | |
| 272 cryptographer.RemoveObserver(&observer); | |
| 247 } | 273 } |
| 248 | 274 |
| 249 TEST(CryptographerTest, EncryptEverythingImplicit) { | 275 TEST(CryptographerTest, EncryptEverythingImplicit) { |
| 250 ModelTypeSet real_types = syncable::GetAllRealModelTypes(); | 276 ModelTypeSet real_types = syncable::GetAllRealModelTypes(); |
| 251 sync_pb::NigoriSpecifics specifics; | 277 sync_pb::NigoriSpecifics specifics; |
| 252 specifics.set_encrypt_bookmarks(true); // Non-passwords = encrypt everything. | 278 specifics.set_encrypt_bookmarks(true); // Non-passwords = encrypt everything |
| 253 | 279 |
| 254 Cryptographer cryptographer; | 280 Cryptographer cryptographer; |
| 281 StrictMock<MockObserver> observer; | |
| 282 cryptographer.AddObserver(&observer); | |
| 283 | |
| 284 EXPECT_CALL(observer, | |
| 285 OnEncryptedTypesChanged(syncable::GetAllRealModelTypes(), | |
| 286 true)); | |
| 287 | |
| 255 EXPECT_FALSE(cryptographer.encrypt_everything()); | 288 EXPECT_FALSE(cryptographer.encrypt_everything()); |
| 256 ModelTypeSet encrypted_types = cryptographer.GetEncryptedTypes(); | 289 ModelTypeSet encrypted_types = cryptographer.GetEncryptedTypes(); |
| 257 for (ModelTypeSet::iterator iter = real_types.begin(); | 290 for (ModelTypeSet::iterator iter = real_types.begin(); |
| 258 iter != real_types.end(); | 291 iter != real_types.end(); |
| 259 ++iter) { | 292 ++iter) { |
| 260 if (*iter == syncable::PASSWORDS || *iter == syncable::NIGORI) | 293 if (*iter == syncable::PASSWORDS || *iter == syncable::NIGORI) |
| 261 EXPECT_EQ(1U, encrypted_types.count(*iter)); | 294 EXPECT_EQ(1U, encrypted_types.count(*iter)); |
| 262 else | 295 else |
| 263 EXPECT_EQ(0U, encrypted_types.count(*iter)); | 296 EXPECT_EQ(0U, encrypted_types.count(*iter)); |
| 264 } | 297 } |
| 265 | 298 |
| 266 cryptographer.UpdateEncryptedTypesFromNigori(specifics); | 299 cryptographer.UpdateEncryptedTypesFromNigori(specifics); |
| 267 | 300 |
| 268 EXPECT_TRUE(cryptographer.encrypt_everything()); | 301 EXPECT_TRUE(cryptographer.encrypt_everything()); |
| 269 encrypted_types = cryptographer.GetEncryptedTypes(); | 302 encrypted_types = cryptographer.GetEncryptedTypes(); |
| 270 for (ModelTypeSet::iterator iter = real_types.begin(); | 303 for (ModelTypeSet::iterator iter = real_types.begin(); |
| 271 iter != real_types.end(); | 304 iter != real_types.end(); |
| 272 ++iter) { | 305 ++iter) { |
| 273 EXPECT_EQ(1U, encrypted_types.count(*iter)); | 306 EXPECT_EQ(1U, encrypted_types.count(*iter)); |
| 274 } | 307 } |
| 308 | |
| 309 // Shouldn't trigger another notification. | |
| 310 specifics.set_encrypt_everything(true); | |
| 311 | |
| 312 cryptographer.RemoveObserver(&observer); | |
| 275 } | 313 } |
| 276 | 314 |
| 277 TEST(CryptographerTest, UnknownSensitiveTypes) { | 315 TEST(CryptographerTest, UnknownSensitiveTypes) { |
| 278 ModelTypeSet real_types = syncable::GetAllRealModelTypes(); | 316 ModelTypeSet real_types = syncable::GetAllRealModelTypes(); |
| 279 sync_pb::NigoriSpecifics specifics; | 317 sync_pb::NigoriSpecifics specifics; |
| 280 // Explicitly setting encrypt everything should override logic for implicit | 318 // Explicitly setting encrypt everything should override logic for implicit |
| 281 // encrypt everything. | 319 // encrypt everything. |
| 282 specifics.set_encrypt_everything(false); | 320 specifics.set_encrypt_everything(false); |
| 283 specifics.set_encrypt_bookmarks(true); | 321 specifics.set_encrypt_bookmarks(true); |
| 284 | 322 |
| 285 Cryptographer cryptographer; | 323 Cryptographer cryptographer; |
| 324 StrictMock<MockObserver> observer; | |
| 325 cryptographer.AddObserver(&observer); | |
| 326 | |
| 327 syncable::ModelTypeSet expected_encrypted_types = | |
| 328 Cryptographer::SensitiveTypes(); | |
| 329 expected_encrypted_types.insert(syncable::BOOKMARKS); | |
| 330 | |
| 331 EXPECT_CALL(observer, | |
| 332 OnEncryptedTypesChanged(expected_encrypted_types, | |
| 333 false)); | |
| 334 | |
| 286 EXPECT_FALSE(cryptographer.encrypt_everything()); | 335 EXPECT_FALSE(cryptographer.encrypt_everything()); |
| 287 ModelTypeSet encrypted_types = cryptographer.GetEncryptedTypes(); | 336 ModelTypeSet encrypted_types = cryptographer.GetEncryptedTypes(); |
| 288 for (ModelTypeSet::iterator iter = real_types.begin(); | 337 for (ModelTypeSet::iterator iter = real_types.begin(); |
| 289 iter != real_types.end(); | 338 iter != real_types.end(); |
| 290 ++iter) { | 339 ++iter) { |
| 291 if (*iter == syncable::PASSWORDS || *iter == syncable::NIGORI) | 340 if (*iter == syncable::PASSWORDS || *iter == syncable::NIGORI) |
| 292 EXPECT_EQ(1U, encrypted_types.count(*iter)); | 341 EXPECT_EQ(1U, encrypted_types.count(*iter)); |
| 293 else | 342 else |
| 294 EXPECT_EQ(0U, encrypted_types.count(*iter)); | 343 EXPECT_EQ(0U, encrypted_types.count(*iter)); |
| 295 } | 344 } |
| 296 | 345 |
| 297 cryptographer.UpdateEncryptedTypesFromNigori(specifics); | 346 cryptographer.UpdateEncryptedTypesFromNigori(specifics); |
| 298 | 347 |
| 299 EXPECT_FALSE(cryptographer.encrypt_everything()); | 348 EXPECT_FALSE(cryptographer.encrypt_everything()); |
| 300 encrypted_types = cryptographer.GetEncryptedTypes(); | 349 encrypted_types = cryptographer.GetEncryptedTypes(); |
| 301 for (ModelTypeSet::iterator iter = real_types.begin(); | 350 for (ModelTypeSet::iterator iter = real_types.begin(); |
| 302 iter != real_types.end(); | 351 iter != real_types.end(); |
| 303 ++iter) { | 352 ++iter) { |
| 304 if (*iter == syncable::PASSWORDS || | 353 if (*iter == syncable::PASSWORDS || |
| 305 *iter == syncable::NIGORI || | 354 *iter == syncable::NIGORI || |
| 306 *iter == syncable::BOOKMARKS) | 355 *iter == syncable::BOOKMARKS) |
| 307 EXPECT_EQ(1U, encrypted_types.count(*iter)); | 356 EXPECT_EQ(1U, encrypted_types.count(*iter)); |
| 308 else | 357 else |
| 309 EXPECT_EQ(0U, encrypted_types.count(*iter)); | 358 EXPECT_EQ(0U, encrypted_types.count(*iter)); |
| 310 } | 359 } |
| 360 | |
| 361 cryptographer.RemoveObserver(&observer); | |
| 311 } | 362 } |
| 312 | 363 |
| 313 } // namespace browser_sync | 364 } // namespace browser_sync |
| OLD | NEW |