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 |