OLD | NEW |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |