Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(475)

Side by Side Diff: components/safe_browsing_db/v4_store_unittest.cc

Issue 2206733002: PVer4: Verify checksum for downloaded updates (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@01_v4_rice_store
Patch Set: Minor: nparker@'s CR feedback Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 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 "base/bind.h" 5 #include "base/bind.h"
6 #include "base/files/file_util.h" 6 #include "base/files/file_util.h"
7 #include "base/files/scoped_temp_dir.h" 7 #include "base/files/scoped_temp_dir.h"
8 #include "base/memory/ptr_util.h" 8 #include "base/memory/ptr_util.h"
9 #include "base/run_loop.h" 9 #include "base/run_loop.h"
10 #include "base/test/test_simple_task_runner.h" 10 #include "base/test/test_simple_task_runner.h"
11 #include "base/time/time.h" 11 #include "base/time/time.h"
12 #include "components/safe_browsing_db/v4_store.h" 12 #include "components/safe_browsing_db/v4_store.h"
13 #include "components/safe_browsing_db/v4_store.pb.h" 13 #include "components/safe_browsing_db/v4_store.pb.h"
14 #include "content/public/test/test_browser_thread_bundle.h" 14 #include "content/public/test/test_browser_thread_bundle.h"
15 #include "crypto/sha2.h"
15 #include "testing/platform_test.h" 16 #include "testing/platform_test.h"
16 17
17 namespace safe_browsing { 18 namespace safe_browsing {
18 19
19 using ::google::protobuf::RepeatedField; 20 using ::google::protobuf::RepeatedField;
20 using ::google::protobuf::RepeatedPtrField; 21 using ::google::protobuf::RepeatedPtrField;
21 using ::google::protobuf::int32; 22 using ::google::protobuf::int32;
22 23
23 class V4StoreTest : public PlatformTest { 24 class V4StoreTest : public PlatformTest {
24 public: 25 public:
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after
115 116
116 TEST_F(V4StoreTest, TestReadFromNoHashPrefixInfoFile) { 117 TEST_F(V4StoreTest, TestReadFromNoHashPrefixInfoFile) {
117 WriteFileFormatProtoToFile(0x600D71FE, 9); 118 WriteFileFormatProtoToFile(0x600D71FE, 9);
118 EXPECT_EQ(HASH_PREFIX_INFO_MISSING_FAILURE, 119 EXPECT_EQ(HASH_PREFIX_INFO_MISSING_FAILURE,
119 V4Store(task_runner_, store_path_).ReadFromDisk()); 120 V4Store(task_runner_, store_path_).ReadFromDisk());
120 } 121 }
121 122
122 TEST_F(V4StoreTest, TestReadFromNoHashPrefixesFile) { 123 TEST_F(V4StoreTest, TestReadFromNoHashPrefixesFile) {
123 ListUpdateResponse list_update_response; 124 ListUpdateResponse list_update_response;
124 list_update_response.set_platform_type(LINUX_PLATFORM); 125 list_update_response.set_platform_type(LINUX_PLATFORM);
126 list_update_response.set_response_type(ListUpdateResponse::FULL_UPDATE);
125 WriteFileFormatProtoToFile(0x600D71FE, 9, &list_update_response); 127 WriteFileFormatProtoToFile(0x600D71FE, 9, &list_update_response);
126 EXPECT_EQ(READ_SUCCESS, V4Store(task_runner_, store_path_).ReadFromDisk()); 128 EXPECT_EQ(READ_SUCCESS, V4Store(task_runner_, store_path_).ReadFromDisk());
127 } 129 }
128 130
129 TEST_F(V4StoreTest, TestWriteNoResponseType) { 131 TEST_F(V4StoreTest, TestWriteNoResponseType) {
130 EXPECT_EQ(INVALID_RESPONSE_TYPE_FAILURE, 132 EXPECT_EQ(INVALID_RESPONSE_TYPE_FAILURE,
131 V4Store(task_runner_, store_path_) 133 V4Store(task_runner_, store_path_)
132 .WriteToDisk(base::WrapUnique(new ListUpdateResponse))); 134 .WriteToDisk(base::WrapUnique(new ListUpdateResponse)));
133 } 135 }
134 136
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after
222 EXPECT_EQ(APPLY_UPDATE_SUCCESS, 224 EXPECT_EQ(APPLY_UPDATE_SUCCESS,
223 V4Store::AddUnlumpedHashes(5, "54321abcde", &prefix_map_old)); 225 V4Store::AddUnlumpedHashes(5, "54321abcde", &prefix_map_old));
224 HashPrefixMap prefix_map_additions; 226 HashPrefixMap prefix_map_additions;
225 EXPECT_EQ( 227 EXPECT_EQ(
226 APPLY_UPDATE_SUCCESS, 228 APPLY_UPDATE_SUCCESS,
227 V4Store::AddUnlumpedHashes(4, "----1111bbbb", &prefix_map_additions)); 229 V4Store::AddUnlumpedHashes(4, "----1111bbbb", &prefix_map_additions));
228 EXPECT_EQ(APPLY_UPDATE_SUCCESS, 230 EXPECT_EQ(APPLY_UPDATE_SUCCESS,
229 V4Store::AddUnlumpedHashes(5, "22222bcdef", &prefix_map_additions)); 231 V4Store::AddUnlumpedHashes(5, "22222bcdef", &prefix_map_additions));
230 232
231 V4Store store(task_runner_, store_path_); 233 V4Store store(task_runner_, store_path_);
234 // Proof of checksum validity using python:
235 // >>> import hashlib
236 // >>> m = hashlib.sha256()
237 // >>> m.update("----11112222254321abcdabcdebbbbbcdefefgh")
238 // >>> m.digest()
239 // "\xbc\xb3\xedk\xe3x\xd1(\xa9\xedz7]"
240 // "x\x18\xbdn]\xa5\xa8R\xf7\xab\xcf\xc1\xa3\xa3\xc5Z,\xa6o"
241 std::string expected_checksum = std::string(
242 "\xBC\xB3\xEDk\xE3x\xD1(\xA9\xEDz7]x\x18\xBDn]"
243 "\xA5\xA8R\xF7\xAB\xCF\xC1\xA3\xA3\xC5Z,\xA6o",
244 crypto::kSHA256Length);
232 EXPECT_EQ(APPLY_UPDATE_SUCCESS, 245 EXPECT_EQ(APPLY_UPDATE_SUCCESS,
233 store.MergeUpdate(prefix_map_old, prefix_map_additions, nullptr)); 246 store.MergeUpdate(prefix_map_old, prefix_map_additions, nullptr,
247 expected_checksum));
248
234 const HashPrefixMap& prefix_map = store.hash_prefix_map_; 249 const HashPrefixMap& prefix_map = store.hash_prefix_map_;
235 EXPECT_EQ(2u, prefix_map.size()); 250 EXPECT_EQ(2u, prefix_map.size());
236 251
237 PrefixSize prefix_size = 4; 252 PrefixSize prefix_size = 4;
238 HashPrefixes hash_prefixes = prefix_map.at(prefix_size); 253 HashPrefixes hash_prefixes = prefix_map.at(prefix_size);
239 EXPECT_EQ(5 * prefix_size, hash_prefixes.size()); 254 EXPECT_EQ(5 * prefix_size, hash_prefixes.size());
240 EXPECT_EQ("----", hash_prefixes.substr(0 * prefix_size, prefix_size)); 255 EXPECT_EQ("----", hash_prefixes.substr(0 * prefix_size, prefix_size));
241 EXPECT_EQ("1111", hash_prefixes.substr(1 * prefix_size, prefix_size)); 256 EXPECT_EQ("1111", hash_prefixes.substr(1 * prefix_size, prefix_size));
242 EXPECT_EQ("abcd", hash_prefixes.substr(2 * prefix_size, prefix_size)); 257 EXPECT_EQ("abcd", hash_prefixes.substr(2 * prefix_size, prefix_size));
243 EXPECT_EQ("bbbb", hash_prefixes.substr(3 * prefix_size, prefix_size)); 258 EXPECT_EQ("bbbb", hash_prefixes.substr(3 * prefix_size, prefix_size));
(...skipping 10 matching lines...) Expand all
254 269
255 TEST_F(V4StoreTest, TestMergeUpdatesWithDifferentSizesInEachMap) { 270 TEST_F(V4StoreTest, TestMergeUpdatesWithDifferentSizesInEachMap) {
256 HashPrefixMap prefix_map_old; 271 HashPrefixMap prefix_map_old;
257 EXPECT_EQ(APPLY_UPDATE_SUCCESS, 272 EXPECT_EQ(APPLY_UPDATE_SUCCESS,
258 V4Store::AddUnlumpedHashes(4, "1111abcdefgh", &prefix_map_old)); 273 V4Store::AddUnlumpedHashes(4, "1111abcdefgh", &prefix_map_old));
259 HashPrefixMap prefix_map_additions; 274 HashPrefixMap prefix_map_additions;
260 EXPECT_EQ(APPLY_UPDATE_SUCCESS, 275 EXPECT_EQ(APPLY_UPDATE_SUCCESS,
261 V4Store::AddUnlumpedHashes(5, "22222bcdef", &prefix_map_additions)); 276 V4Store::AddUnlumpedHashes(5, "22222bcdef", &prefix_map_additions));
262 277
263 V4Store store(task_runner_, store_path_); 278 V4Store store(task_runner_, store_path_);
279 std::string expected_checksum = std::string(
280 "\xA5\x8B\xCAsD\xC7\xF9\xCE\xD2\xF4\x4="
281 "\xB2\"\x82\x1A\xC1\xB8\x1F\x10\r\v\x9A\x93\xFD\xE1\xB8"
282 "B\x1Eh\xF7\xB4",
283 crypto::kSHA256Length);
264 EXPECT_EQ(APPLY_UPDATE_SUCCESS, 284 EXPECT_EQ(APPLY_UPDATE_SUCCESS,
265 store.MergeUpdate(prefix_map_old, prefix_map_additions, nullptr)); 285 store.MergeUpdate(prefix_map_old, prefix_map_additions, nullptr,
286 expected_checksum));
287
266 const HashPrefixMap& prefix_map = store.hash_prefix_map_; 288 const HashPrefixMap& prefix_map = store.hash_prefix_map_;
267 EXPECT_EQ(2u, prefix_map.size()); 289 EXPECT_EQ(2u, prefix_map.size());
268 290
269 PrefixSize prefix_size = 4; 291 PrefixSize prefix_size = 4;
270 HashPrefixes hash_prefixes = prefix_map.at(prefix_size); 292 HashPrefixes hash_prefixes = prefix_map.at(prefix_size);
271 EXPECT_EQ(3 * prefix_size, hash_prefixes.size()); 293 EXPECT_EQ(3 * prefix_size, hash_prefixes.size());
272 EXPECT_EQ("1111abcdefgh", hash_prefixes); 294 EXPECT_EQ("1111abcdefgh", hash_prefixes);
273 295
274 prefix_size = 5; 296 prefix_size = 5;
275 hash_prefixes = prefix_map.at(prefix_size); 297 hash_prefixes = prefix_map.at(prefix_size);
276 EXPECT_EQ(2 * prefix_size, hash_prefixes.size()); 298 EXPECT_EQ(2 * prefix_size, hash_prefixes.size());
277 EXPECT_EQ("22222bcdef", hash_prefixes); 299 EXPECT_EQ("22222bcdef", hash_prefixes);
278 } 300 }
279 301
280 TEST_F(V4StoreTest, TestMergeUpdatesOldMapRunsOutFirst) { 302 TEST_F(V4StoreTest, TestMergeUpdatesOldMapRunsOutFirst) {
281 HashPrefixMap prefix_map_old; 303 HashPrefixMap prefix_map_old;
282 EXPECT_EQ(APPLY_UPDATE_SUCCESS, 304 EXPECT_EQ(APPLY_UPDATE_SUCCESS,
283 V4Store::AddUnlumpedHashes(4, "00001111", &prefix_map_old)); 305 V4Store::AddUnlumpedHashes(4, "00001111", &prefix_map_old));
284 HashPrefixMap prefix_map_additions; 306 HashPrefixMap prefix_map_additions;
285 EXPECT_EQ(APPLY_UPDATE_SUCCESS, 307 EXPECT_EQ(APPLY_UPDATE_SUCCESS,
286 V4Store::AddUnlumpedHashes(4, "2222", &prefix_map_additions)); 308 V4Store::AddUnlumpedHashes(4, "2222", &prefix_map_additions));
287 309
288 V4Store store(task_runner_, store_path_); 310 V4Store store(task_runner_, store_path_);
311 std::string expected_checksum = std::string(
312 "\x84\x92\xET\xED\xF7\x97"
313 "C\xCE}\xFF"
314 "E\x1\xAB-\b>\xDB\x95\b\xD8H\xD5\x1D\xF9]8x\xA4\xD4\xC2\xFA",
315 crypto::kSHA256Length);
289 EXPECT_EQ(APPLY_UPDATE_SUCCESS, 316 EXPECT_EQ(APPLY_UPDATE_SUCCESS,
290 store.MergeUpdate(prefix_map_old, prefix_map_additions, nullptr)); 317 store.MergeUpdate(prefix_map_old, prefix_map_additions, nullptr,
318 expected_checksum));
319
291 const HashPrefixMap& prefix_map = store.hash_prefix_map_; 320 const HashPrefixMap& prefix_map = store.hash_prefix_map_;
292 EXPECT_EQ(1u, prefix_map.size()); 321 EXPECT_EQ(1u, prefix_map.size());
293 322
294 PrefixSize prefix_size = 4; 323 PrefixSize prefix_size = 4;
295 HashPrefixes hash_prefixes = prefix_map.at(prefix_size); 324 HashPrefixes hash_prefixes = prefix_map.at(prefix_size);
296 EXPECT_EQ(3 * prefix_size, hash_prefixes.size()); 325 EXPECT_EQ(3 * prefix_size, hash_prefixes.size());
297 EXPECT_EQ("0000", hash_prefixes.substr(0 * prefix_size, prefix_size)); 326 EXPECT_EQ("0000", hash_prefixes.substr(0 * prefix_size, prefix_size));
298 EXPECT_EQ("1111", hash_prefixes.substr(1 * prefix_size, prefix_size)); 327 EXPECT_EQ("1111", hash_prefixes.substr(1 * prefix_size, prefix_size));
299 EXPECT_EQ("2222", hash_prefixes.substr(2 * prefix_size, prefix_size)); 328 EXPECT_EQ("2222", hash_prefixes.substr(2 * prefix_size, prefix_size));
300 } 329 }
301 330
302 TEST_F(V4StoreTest, TestMergeUpdatesAdditionsMapRunsOutFirst) { 331 TEST_F(V4StoreTest, TestMergeUpdatesAdditionsMapRunsOutFirst) {
303 HashPrefixMap prefix_map_old; 332 HashPrefixMap prefix_map_old;
304 EXPECT_EQ(APPLY_UPDATE_SUCCESS, 333 EXPECT_EQ(APPLY_UPDATE_SUCCESS,
305 V4Store::AddUnlumpedHashes(4, "2222", &prefix_map_old)); 334 V4Store::AddUnlumpedHashes(4, "2222", &prefix_map_old));
306 HashPrefixMap prefix_map_additions; 335 HashPrefixMap prefix_map_additions;
307 EXPECT_EQ(APPLY_UPDATE_SUCCESS, 336 EXPECT_EQ(APPLY_UPDATE_SUCCESS,
308 V4Store::AddUnlumpedHashes(4, "00001111", &prefix_map_additions)); 337 V4Store::AddUnlumpedHashes(4, "00001111", &prefix_map_additions));
309 338
310 V4Store store(task_runner_, store_path_); 339 V4Store store(task_runner_, store_path_);
340 std::string expected_checksum = std::string(
341 "\x84\x92\xET\xED\xF7\x97"
342 "C\xCE}\xFF"
343 "E\x1\xAB-\b>\xDB\x95\b\xD8H\xD5\x1D\xF9]8x\xA4\xD4\xC2\xFA",
344 crypto::kSHA256Length);
311 EXPECT_EQ(APPLY_UPDATE_SUCCESS, 345 EXPECT_EQ(APPLY_UPDATE_SUCCESS,
312 store.MergeUpdate(prefix_map_old, prefix_map_additions, nullptr)); 346 store.MergeUpdate(prefix_map_old, prefix_map_additions, nullptr,
347 expected_checksum));
348
313 const HashPrefixMap& prefix_map = store.hash_prefix_map_; 349 const HashPrefixMap& prefix_map = store.hash_prefix_map_;
314 EXPECT_EQ(1u, prefix_map.size()); 350 EXPECT_EQ(1u, prefix_map.size());
315 351
316 PrefixSize prefix_size = 4; 352 PrefixSize prefix_size = 4;
317 HashPrefixes hash_prefixes = prefix_map.at(prefix_size); 353 HashPrefixes hash_prefixes = prefix_map.at(prefix_size);
318 EXPECT_EQ(3 * prefix_size, hash_prefixes.size()); 354 EXPECT_EQ(3 * prefix_size, hash_prefixes.size());
319 EXPECT_EQ("0000", hash_prefixes.substr(0 * prefix_size, prefix_size)); 355 EXPECT_EQ("0000", hash_prefixes.substr(0 * prefix_size, prefix_size));
320 EXPECT_EQ("1111", hash_prefixes.substr(1 * prefix_size, prefix_size)); 356 EXPECT_EQ("1111", hash_prefixes.substr(1 * prefix_size, prefix_size));
321 EXPECT_EQ("2222", hash_prefixes.substr(2 * prefix_size, prefix_size)); 357 EXPECT_EQ("2222", hash_prefixes.substr(2 * prefix_size, prefix_size));
322 } 358 }
323 359
324 TEST_F(V4StoreTest, TestMergeUpdatesFailsForRepeatedHashPrefix) { 360 TEST_F(V4StoreTest, TestMergeUpdatesFailsForRepeatedHashPrefix) {
325 HashPrefixMap prefix_map_old; 361 HashPrefixMap prefix_map_old;
326 EXPECT_EQ(APPLY_UPDATE_SUCCESS, 362 EXPECT_EQ(APPLY_UPDATE_SUCCESS,
327 V4Store::AddUnlumpedHashes(4, "2222", &prefix_map_old)); 363 V4Store::AddUnlumpedHashes(4, "2222", &prefix_map_old));
328 HashPrefixMap prefix_map_additions; 364 HashPrefixMap prefix_map_additions;
329 EXPECT_EQ(APPLY_UPDATE_SUCCESS, 365 EXPECT_EQ(APPLY_UPDATE_SUCCESS,
330 V4Store::AddUnlumpedHashes(4, "2222", &prefix_map_additions)); 366 V4Store::AddUnlumpedHashes(4, "2222", &prefix_map_additions));
331 367
332 V4Store store(task_runner_, store_path_); 368 V4Store store(task_runner_, store_path_);
369 std::string expected_checksum;
333 EXPECT_EQ(ADDITIONS_HAS_EXISTING_PREFIX_FAILURE, 370 EXPECT_EQ(ADDITIONS_HAS_EXISTING_PREFIX_FAILURE,
334 store.MergeUpdate(prefix_map_old, prefix_map_additions, nullptr)); 371 store.MergeUpdate(prefix_map_old, prefix_map_additions, nullptr,
372 expected_checksum));
335 } 373 }
336 374
337 TEST_F(V4StoreTest, TestMergeUpdatesFailsWhenRemovalsIndexTooLarge) { 375 TEST_F(V4StoreTest, TestMergeUpdatesFailsWhenRemovalsIndexTooLarge) {
338 HashPrefixMap prefix_map_old; 376 HashPrefixMap prefix_map_old;
339 EXPECT_EQ(APPLY_UPDATE_SUCCESS, 377 EXPECT_EQ(APPLY_UPDATE_SUCCESS,
340 V4Store::AddUnlumpedHashes(4, "2222", &prefix_map_old)); 378 V4Store::AddUnlumpedHashes(4, "2222", &prefix_map_old));
341 HashPrefixMap prefix_map_additions; 379 HashPrefixMap prefix_map_additions;
342 EXPECT_EQ(APPLY_UPDATE_SUCCESS, 380 EXPECT_EQ(APPLY_UPDATE_SUCCESS,
343 V4Store::AddUnlumpedHashes(4, "11113333", &prefix_map_additions)); 381 V4Store::AddUnlumpedHashes(4, "11113333", &prefix_map_additions));
344 382
345 // Even though the merged map could have size 3 without removals, the 383 // Even though the merged map could have size 3 without removals, the
346 // removals index should only count the entries in the old map. 384 // removals index should only count the entries in the old map.
347 V4Store store(task_runner_, store_path_); 385 V4Store store(task_runner_, store_path_);
348 RepeatedField<int32> raw_removals; 386 RepeatedField<int32> raw_removals;
349 // old_store: ["2222"] 387 // old_store: ["2222"]
350 raw_removals.Add(1); 388 raw_removals.Add(1);
351 EXPECT_EQ( 389 std::string expected_checksum;
352 REMOVALS_INDEX_TOO_LARGE_FAILURE, 390 EXPECT_EQ(REMOVALS_INDEX_TOO_LARGE_FAILURE,
353 store.MergeUpdate(prefix_map_old, prefix_map_additions, &raw_removals)); 391 store.MergeUpdate(prefix_map_old, prefix_map_additions,
392 &raw_removals, expected_checksum));
354 } 393 }
355 394
356 TEST_F(V4StoreTest, TestMergeUpdatesRemovesOnlyElement) { 395 TEST_F(V4StoreTest, TestMergeUpdatesRemovesOnlyElement) {
357 HashPrefixMap prefix_map_old; 396 HashPrefixMap prefix_map_old;
358 EXPECT_EQ(APPLY_UPDATE_SUCCESS, 397 EXPECT_EQ(APPLY_UPDATE_SUCCESS,
359 V4Store::AddUnlumpedHashes(4, "2222", &prefix_map_old)); 398 V4Store::AddUnlumpedHashes(4, "2222", &prefix_map_old));
360 HashPrefixMap prefix_map_additions; 399 HashPrefixMap prefix_map_additions;
361 EXPECT_EQ(APPLY_UPDATE_SUCCESS, 400 EXPECT_EQ(APPLY_UPDATE_SUCCESS,
362 V4Store::AddUnlumpedHashes(5, "1111133333", &prefix_map_additions)); 401 V4Store::AddUnlumpedHashes(5, "1111133333", &prefix_map_additions));
363 402
364 V4Store store(task_runner_, store_path_); 403 V4Store store(task_runner_, store_path_);
365 RepeatedField<int32> raw_removals; 404 RepeatedField<int32> raw_removals;
366 // old_store: ["2222"] 405 // old_store: ["2222"]
367 raw_removals.Add(0); // Removes "2222" 406 raw_removals.Add(0); // Removes "2222"
368 EXPECT_EQ( 407 std::string expected_checksum = std::string(
369 APPLY_UPDATE_SUCCESS, 408 "\xE6\xB0\x1\x12\x89\x83\xF0/"
370 store.MergeUpdate(prefix_map_old, prefix_map_additions, &raw_removals)); 409 "\xE7\xD2\xE6\xDC\x16\xB9\x8C+\xA2\xB3\x9E\x89<,\x88"
410 "B3\xA5\xB1"
411 "D\x9E\x9E'\x14",
412 crypto::kSHA256Length);
413 EXPECT_EQ(APPLY_UPDATE_SUCCESS,
414 store.MergeUpdate(prefix_map_old, prefix_map_additions,
415 &raw_removals, expected_checksum));
416
371 const HashPrefixMap& prefix_map = store.hash_prefix_map_; 417 const HashPrefixMap& prefix_map = store.hash_prefix_map_;
372 // The size is 2 since we reserve space anyway. 418 // The size is 2 since we reserve space anyway.
373 EXPECT_EQ(2u, prefix_map.size()); 419 EXPECT_EQ(2u, prefix_map.size());
374 EXPECT_TRUE(prefix_map.at(4).empty()); 420 EXPECT_TRUE(prefix_map.at(4).empty());
375 EXPECT_EQ("1111133333", prefix_map.at(5)); 421 EXPECT_EQ("1111133333", prefix_map.at(5));
376 } 422 }
377 423
378 TEST_F(V4StoreTest, TestMergeUpdatesRemovesFirstElement) { 424 TEST_F(V4StoreTest, TestMergeUpdatesRemovesFirstElement) {
379 HashPrefixMap prefix_map_old; 425 HashPrefixMap prefix_map_old;
380 EXPECT_EQ(APPLY_UPDATE_SUCCESS, 426 EXPECT_EQ(APPLY_UPDATE_SUCCESS,
381 V4Store::AddUnlumpedHashes(4, "22224444", &prefix_map_old)); 427 V4Store::AddUnlumpedHashes(4, "22224444", &prefix_map_old));
382 HashPrefixMap prefix_map_additions; 428 HashPrefixMap prefix_map_additions;
383 EXPECT_EQ(APPLY_UPDATE_SUCCESS, 429 EXPECT_EQ(APPLY_UPDATE_SUCCESS,
384 V4Store::AddUnlumpedHashes(5, "1111133333", &prefix_map_additions)); 430 V4Store::AddUnlumpedHashes(5, "1111133333", &prefix_map_additions));
385 431
386 V4Store store(task_runner_, store_path_); 432 V4Store store(task_runner_, store_path_);
387 RepeatedField<int32> raw_removals; 433 RepeatedField<int32> raw_removals;
388 // old_store: ["2222", "4444"] 434 // old_store: ["2222", "4444"]
389 raw_removals.Add(0); // Removes "2222" 435 raw_removals.Add(0); // Removes "2222"
390 EXPECT_EQ( 436 std::string expected_checksum = std::string(
391 APPLY_UPDATE_SUCCESS, 437 "\x9D\xF3\xF2\x82\0\x1E{\xDF\xCD\xC0V\xBE\xD6<\x85"
392 store.MergeUpdate(prefix_map_old, prefix_map_additions, &raw_removals)); 438 "D7=\xB5v\xAD\b1\xC9\xB3"
439 "A\xAC"
440 "b\xF1lf\xA4",
441 crypto::kSHA256Length);
442 EXPECT_EQ(APPLY_UPDATE_SUCCESS,
443 store.MergeUpdate(prefix_map_old, prefix_map_additions,
444 &raw_removals, expected_checksum));
445
393 const HashPrefixMap& prefix_map = store.hash_prefix_map_; 446 const HashPrefixMap& prefix_map = store.hash_prefix_map_;
394 // The size is 2 since we reserve space anyway. 447 // The size is 2 since we reserve space anyway.
395 EXPECT_EQ(2u, prefix_map.size()); 448 EXPECT_EQ(2u, prefix_map.size());
396 EXPECT_EQ("4444", prefix_map.at(4)); 449 EXPECT_EQ("4444", prefix_map.at(4));
397 EXPECT_EQ("1111133333", prefix_map.at(5)); 450 EXPECT_EQ("1111133333", prefix_map.at(5));
398 } 451 }
399 452
400 TEST_F(V4StoreTest, TestMergeUpdatesRemovesMiddleElement) { 453 TEST_F(V4StoreTest, TestMergeUpdatesRemovesMiddleElement) {
401 HashPrefixMap prefix_map_old; 454 HashPrefixMap prefix_map_old;
402 EXPECT_EQ(APPLY_UPDATE_SUCCESS, 455 EXPECT_EQ(APPLY_UPDATE_SUCCESS,
403 V4Store::AddUnlumpedHashes(4, "222233334444", &prefix_map_old)); 456 V4Store::AddUnlumpedHashes(4, "222233334444", &prefix_map_old));
404 HashPrefixMap prefix_map_additions; 457 HashPrefixMap prefix_map_additions;
405 EXPECT_EQ(APPLY_UPDATE_SUCCESS, 458 EXPECT_EQ(APPLY_UPDATE_SUCCESS,
406 V4Store::AddUnlumpedHashes(5, "1111133333", &prefix_map_additions)); 459 V4Store::AddUnlumpedHashes(5, "1111133333", &prefix_map_additions));
407 460
408 V4Store store(task_runner_, store_path_); 461 V4Store store(task_runner_, store_path_);
409 RepeatedField<int32> raw_removals; 462 RepeatedField<int32> raw_removals;
410 // old_store: ["2222", "3333", 4444"] 463 // old_store: ["2222", "3333", 4444"]
411 raw_removals.Add(1); // Removes "3333" 464 raw_removals.Add(1); // Removes "3333"
412 EXPECT_EQ( 465 std::string expected_checksum = std::string(
413 APPLY_UPDATE_SUCCESS, 466 "\xFA-A\x15{\x17\0>\xAE"
414 store.MergeUpdate(prefix_map_old, prefix_map_additions, &raw_removals)); 467 "8\xACigR\xD1\x93<\xB2\xC9\xB5\x81\xC0\xFB\xBB\x2\f\xAFpN\xEA"
468 "44",
469 crypto::kSHA256Length);
470 EXPECT_EQ(APPLY_UPDATE_SUCCESS,
471 store.MergeUpdate(prefix_map_old, prefix_map_additions,
472 &raw_removals, expected_checksum));
473
415 const HashPrefixMap& prefix_map = store.hash_prefix_map_; 474 const HashPrefixMap& prefix_map = store.hash_prefix_map_;
416 // The size is 2 since we reserve space anyway. 475 // The size is 2 since we reserve space anyway.
417 EXPECT_EQ(2u, prefix_map.size()); 476 EXPECT_EQ(2u, prefix_map.size());
418 EXPECT_EQ("22224444", prefix_map.at(4)); 477 EXPECT_EQ("22224444", prefix_map.at(4));
419 EXPECT_EQ("1111133333", prefix_map.at(5)); 478 EXPECT_EQ("1111133333", prefix_map.at(5));
420 } 479 }
421 480
422 TEST_F(V4StoreTest, TestMergeUpdatesRemovesLastElement) { 481 TEST_F(V4StoreTest, TestMergeUpdatesRemovesLastElement) {
423 HashPrefixMap prefix_map_old; 482 HashPrefixMap prefix_map_old;
424 EXPECT_EQ(APPLY_UPDATE_SUCCESS, 483 EXPECT_EQ(APPLY_UPDATE_SUCCESS,
425 V4Store::AddUnlumpedHashes(4, "222233334444", &prefix_map_old)); 484 V4Store::AddUnlumpedHashes(4, "222233334444", &prefix_map_old));
426 HashPrefixMap prefix_map_additions; 485 HashPrefixMap prefix_map_additions;
427 EXPECT_EQ(APPLY_UPDATE_SUCCESS, 486 EXPECT_EQ(APPLY_UPDATE_SUCCESS,
428 V4Store::AddUnlumpedHashes(5, "1111133333", &prefix_map_additions)); 487 V4Store::AddUnlumpedHashes(5, "1111133333", &prefix_map_additions));
429 488
430 V4Store store(task_runner_, store_path_); 489 V4Store store(task_runner_, store_path_);
431 RepeatedField<int32> raw_removals; 490 RepeatedField<int32> raw_removals;
432 // old_store: ["2222", "3333", 4444"] 491 // old_store: ["2222", "3333", 4444"]
433 raw_removals.Add(2); // Removes "4444" 492 raw_removals.Add(2); // Removes "4444"
434 EXPECT_EQ( 493 std::string expected_checksum = std::string(
435 APPLY_UPDATE_SUCCESS, 494 "a\xE1\xAD\x96\xFE\xA6"
436 store.MergeUpdate(prefix_map_old, prefix_map_additions, &raw_removals)); 495 "A\xCA~7W\xF6z\xD8\n\xCA?\x96\x8A\x17U\x5\v\r\x88]\n\xB2JX\xC4S",
496 crypto::kSHA256Length);
497 EXPECT_EQ(APPLY_UPDATE_SUCCESS,
498 store.MergeUpdate(prefix_map_old, prefix_map_additions,
499 &raw_removals, expected_checksum));
500
437 const HashPrefixMap& prefix_map = store.hash_prefix_map_; 501 const HashPrefixMap& prefix_map = store.hash_prefix_map_;
438 // The size is 2 since we reserve space anyway. 502 // The size is 2 since we reserve space anyway.
439 EXPECT_EQ(2u, prefix_map.size()); 503 EXPECT_EQ(2u, prefix_map.size());
440 EXPECT_EQ("22223333", prefix_map.at(4)); 504 EXPECT_EQ("22223333", prefix_map.at(4));
441 EXPECT_EQ("1111133333", prefix_map.at(5)); 505 EXPECT_EQ("1111133333", prefix_map.at(5));
442 } 506 }
443 507
444 TEST_F(V4StoreTest, TestMergeUpdatesRemovesWhenOldHasDifferentSizes) { 508 TEST_F(V4StoreTest, TestMergeUpdatesRemovesWhenOldHasDifferentSizes) {
445 HashPrefixMap prefix_map_old; 509 HashPrefixMap prefix_map_old;
446 EXPECT_EQ(APPLY_UPDATE_SUCCESS, 510 EXPECT_EQ(APPLY_UPDATE_SUCCESS,
447 V4Store::AddUnlumpedHashes(4, "222233334444", &prefix_map_old)); 511 V4Store::AddUnlumpedHashes(4, "222233334444", &prefix_map_old));
448 EXPECT_EQ(APPLY_UPDATE_SUCCESS, 512 EXPECT_EQ(APPLY_UPDATE_SUCCESS,
449 V4Store::AddUnlumpedHashes(5, "aaaaabbbbb", &prefix_map_old)); 513 V4Store::AddUnlumpedHashes(5, "aaaaabbbbb", &prefix_map_old));
450 HashPrefixMap prefix_map_additions; 514 HashPrefixMap prefix_map_additions;
451 EXPECT_EQ(APPLY_UPDATE_SUCCESS, 515 EXPECT_EQ(APPLY_UPDATE_SUCCESS,
452 V4Store::AddUnlumpedHashes(5, "1111133333", &prefix_map_additions)); 516 V4Store::AddUnlumpedHashes(5, "1111133333", &prefix_map_additions));
453 517
454 V4Store store(task_runner_, store_path_); 518 V4Store store(task_runner_, store_path_);
455 RepeatedField<int32> raw_removals; 519 RepeatedField<int32> raw_removals;
456 // old_store: ["2222", "3333", 4444", "aaaaa", "bbbbb"] 520 // old_store: ["2222", "3333", 4444", "aaaaa", "bbbbb"]
457 raw_removals.Add(3); // Removes "aaaaa" 521 raw_removals.Add(3); // Removes "aaaaa"
458 EXPECT_EQ( 522 std::string expected_checksum = std::string(
459 APPLY_UPDATE_SUCCESS, 523 "\xA7OG\x9D\x83.\x9D-f\x8A\xE\x8B\r&\x19"
460 store.MergeUpdate(prefix_map_old, prefix_map_additions, &raw_removals)); 524 "6\xE3\xF0\xEFTi\xA7\x5\xEA\xF7"
525 "ej,\xA8\x9D\xAD\x91",
526 crypto::kSHA256Length);
527 EXPECT_EQ(APPLY_UPDATE_SUCCESS,
528 store.MergeUpdate(prefix_map_old, prefix_map_additions,
529 &raw_removals, expected_checksum));
530
461 const HashPrefixMap& prefix_map = store.hash_prefix_map_; 531 const HashPrefixMap& prefix_map = store.hash_prefix_map_;
462 // The size is 2 since we reserve space anyway. 532 // The size is 2 since we reserve space anyway.
463 EXPECT_EQ(2u, prefix_map.size()); 533 EXPECT_EQ(2u, prefix_map.size());
464 EXPECT_EQ("222233334444", prefix_map.at(4)); 534 EXPECT_EQ("222233334444", prefix_map.at(4));
465 EXPECT_EQ("1111133333bbbbb", prefix_map.at(5)); 535 EXPECT_EQ("1111133333bbbbb", prefix_map.at(5));
466 } 536 }
467 537
468 TEST_F(V4StoreTest, TestMergeUpdatesRemovesMultipleAcrossDifferentSizes) { 538 TEST_F(V4StoreTest, TestMergeUpdatesRemovesMultipleAcrossDifferentSizes) {
469 HashPrefixMap prefix_map_old; 539 HashPrefixMap prefix_map_old;
470 EXPECT_EQ(APPLY_UPDATE_SUCCESS, 540 EXPECT_EQ(APPLY_UPDATE_SUCCESS,
471 V4Store::AddUnlumpedHashes(4, "22223333aaaa", &prefix_map_old)); 541 V4Store::AddUnlumpedHashes(4, "22223333aaaa", &prefix_map_old));
472 EXPECT_EQ(APPLY_UPDATE_SUCCESS, 542 EXPECT_EQ(APPLY_UPDATE_SUCCESS,
473 V4Store::AddUnlumpedHashes(5, "3333344444bbbbb", &prefix_map_old)); 543 V4Store::AddUnlumpedHashes(5, "3333344444bbbbb", &prefix_map_old));
474 HashPrefixMap prefix_map_additions; 544 HashPrefixMap prefix_map_additions;
475 EXPECT_EQ(APPLY_UPDATE_SUCCESS, 545 EXPECT_EQ(APPLY_UPDATE_SUCCESS,
476 V4Store::AddUnlumpedHashes(5, "11111", &prefix_map_additions)); 546 V4Store::AddUnlumpedHashes(5, "11111", &prefix_map_additions));
477 547
478 V4Store store(task_runner_, store_path_); 548 V4Store store(task_runner_, store_path_);
479 RepeatedField<int32> raw_removals; 549 RepeatedField<int32> raw_removals;
480 // old_store: ["2222", "3333", "33333", "44444", "aaaa", "bbbbb"] 550 // old_store: ["2222", "3333", "33333", "44444", "aaaa", "bbbbb"]
481 raw_removals.Add(1); // Removes "3333" 551 raw_removals.Add(1); // Removes "3333"
482 raw_removals.Add(3); // Removes "44444" 552 raw_removals.Add(3); // Removes "44444"
483 EXPECT_EQ( 553 std::string expected_checksum = std::string(
484 APPLY_UPDATE_SUCCESS, 554 "!D\xB7&L\xA7&G0\x85\xB4"
485 store.MergeUpdate(prefix_map_old, prefix_map_additions, &raw_removals)); 555 "E\xDD\x10\"\x9A\xCA\xF1"
556 "3^\x83w\xBBL\x19n\xAD\xBDM\x9D"
557 "b\x9F",
558 crypto::kSHA256Length);
559 EXPECT_EQ(APPLY_UPDATE_SUCCESS,
560 store.MergeUpdate(prefix_map_old, prefix_map_additions,
561 &raw_removals, expected_checksum));
562
486 const HashPrefixMap& prefix_map = store.hash_prefix_map_; 563 const HashPrefixMap& prefix_map = store.hash_prefix_map_;
487 // The size is 2 since we reserve space anyway. 564 // The size is 2 since we reserve space anyway.
488 EXPECT_EQ(2u, prefix_map.size()); 565 EXPECT_EQ(2u, prefix_map.size());
489 EXPECT_EQ("2222aaaa", prefix_map.at(4)); 566 EXPECT_EQ("2222aaaa", prefix_map.at(4));
490 EXPECT_EQ("1111133333bbbbb", prefix_map.at(5)); 567 EXPECT_EQ("1111133333bbbbb", prefix_map.at(5));
491 } 568 }
492 569
493 TEST_F(V4StoreTest, TestReadFullResponseWithValidHashPrefixMap) { 570 TEST_F(V4StoreTest, TestReadFullResponseWithValidHashPrefixMap) {
494 std::unique_ptr<ListUpdateResponse> lur(new ListUpdateResponse); 571 std::unique_ptr<ListUpdateResponse> lur(new ListUpdateResponse);
495 lur->set_response_type(ListUpdateResponse::FULL_UPDATE); 572 lur->set_response_type(ListUpdateResponse::FULL_UPDATE);
(...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after
660 737
661 TEST_F(V4StoreTest, TestRemovalsWithRiceEncodingSucceeds) { 738 TEST_F(V4StoreTest, TestRemovalsWithRiceEncodingSucceeds) {
662 HashPrefixMap prefix_map_old; 739 HashPrefixMap prefix_map_old;
663 EXPECT_EQ(APPLY_UPDATE_SUCCESS, 740 EXPECT_EQ(APPLY_UPDATE_SUCCESS,
664 V4Store::AddUnlumpedHashes(4, "1111abcdefgh", &prefix_map_old)); 741 V4Store::AddUnlumpedHashes(4, "1111abcdefgh", &prefix_map_old));
665 HashPrefixMap prefix_map_additions; 742 HashPrefixMap prefix_map_additions;
666 EXPECT_EQ(APPLY_UPDATE_SUCCESS, 743 EXPECT_EQ(APPLY_UPDATE_SUCCESS,
667 V4Store::AddUnlumpedHashes(5, "22222bcdef", &prefix_map_additions)); 744 V4Store::AddUnlumpedHashes(5, "22222bcdef", &prefix_map_additions));
668 745
669 V4Store store(task_runner_, store_path_); 746 V4Store store(task_runner_, store_path_);
747 std::string expected_checksum = std::string(
748 "\xA5\x8B\xCAsD\xC7\xF9\xCE\xD2\xF4\x4="
749 "\xB2\"\x82\x1A\xC1\xB8\x1F\x10\r\v\x9A\x93\xFD\xE1\xB8"
750 "B\x1Eh\xF7\xB4",
751 crypto::kSHA256Length);
670 EXPECT_EQ(APPLY_UPDATE_SUCCESS, 752 EXPECT_EQ(APPLY_UPDATE_SUCCESS,
671 store.MergeUpdate(prefix_map_old, prefix_map_additions, nullptr)); 753 store.MergeUpdate(prefix_map_old, prefix_map_additions, nullptr,
754 expected_checksum));
672 755
673 // At this point, the store map looks like this: 756 // At this point, the store map looks like this:
674 // 4: 1111abcdefgh 757 // 4: 1111abcdefgh
675 // 5: 22222bcdef 758 // 5: 22222bcdef
676 // sorted: 1111, 22222, abcd, bcdef, efgh 759 // sorted: 1111, 22222, abcd, bcdef, efgh
677 // We'll now try to delete hashes at indexes 0, 3 and 4 in the sorted list. 760 // We'll now try to delete hashes at indexes 0, 3 and 4 in the sorted list.
678 761
679 std::unique_ptr<ListUpdateResponse> lur(new ListUpdateResponse); 762 std::unique_ptr<ListUpdateResponse> lur(new ListUpdateResponse);
680 lur->set_response_type(ListUpdateResponse::PARTIAL_UPDATE); 763 lur->set_response_type(ListUpdateResponse::PARTIAL_UPDATE);
681 ThreatEntrySet* removal = lur->add_removals(); 764 ThreatEntrySet* removal = lur->add_removals();
682 removal->set_compression_type(RICE); 765 removal->set_compression_type(RICE);
683 RiceDeltaEncoding* rice_indices = removal->mutable_rice_indices(); 766 RiceDeltaEncoding* rice_indices = removal->mutable_rice_indices();
684 rice_indices->set_first_value(0); 767 rice_indices->set_first_value(0);
685 rice_indices->set_num_entries(2); 768 rice_indices->set_num_entries(2);
686 rice_indices->set_rice_parameter(2); 769 rice_indices->set_rice_parameter(2);
687 rice_indices->set_encoded_data("\x16"); 770 rice_indices->set_encoded_data("\x16");
688 771
689 bool called_back = false; 772 bool called_back = false;
690 UpdatedStoreReadyCallback store_ready_callback = 773 UpdatedStoreReadyCallback store_ready_callback =
691 base::Bind(&V4StoreTest::UpdatedStoreReadyAfterRiceRemovals, 774 base::Bind(&V4StoreTest::UpdatedStoreReadyAfterRiceRemovals,
692 base::Unretained(this), &called_back); 775 base::Unretained(this), &called_back);
693 store.ApplyUpdate(std::move(lur), task_runner_, store_ready_callback); 776 store.ApplyUpdate(std::move(lur), task_runner_, store_ready_callback);
694 task_runner_->RunPendingTasks(); 777 task_runner_->RunPendingTasks();
695 base::RunLoop().RunUntilIdle(); 778 base::RunLoop().RunUntilIdle();
696 779
697 // This ensures that the callback was called. 780 // This ensures that the callback was called.
698 EXPECT_TRUE(called_back); 781 EXPECT_TRUE(called_back);
699 } 782 }
700 783
784 TEST_F(V4StoreTest, TestMergeUpdatesFailsChecksum) {
785 // Proof of checksum mismatch using python:
786 // >>> import hashlib
787 // >>> m = hashlib.sha256()
788 // >>> m.update("2222")
789 // >>> m.digest()
790 // "\xed\xee)\xf8\x82T;\x95f
791 // \xb2m\x0e\xe0\xe7\xe9P9\x9b\x1cB"\xf5\xde\x05\xe0d%\xb4\xc9\x95\xe9"
792
793 HashPrefixMap prefix_map_old;
794 EXPECT_EQ(APPLY_UPDATE_SUCCESS,
795 V4Store::AddUnlumpedHashes(4, "2222", &prefix_map_old));
796 EXPECT_EQ(CHECKSUM_MISMATCH_FAILURE,
797 V4Store(task_runner_, store_path_)
798 .MergeUpdate(prefix_map_old, HashPrefixMap(), nullptr, "aawc"));
799 }
800
701 } // namespace safe_browsing 801 } // namespace safe_browsing
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698