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 |