| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 <string> | 5 #include <string> |
| 6 | 6 |
| 7 #include "base/strings/stringprintf.h" |
| 7 #include "base/time/time.h" | 8 #include "base/time/time.h" |
| 8 #include "chrome/browser/safe_browsing/protocol_parser.h" | 9 #include "chrome/browser/safe_browsing/protocol_parser.h" |
| 9 #include "chrome/browser/safe_browsing/safe_browsing_util.h" | 10 #include "chrome/browser/safe_browsing/safe_browsing_util.h" |
| 10 #include "testing/gtest/include/gtest/gtest.h" | 11 #include "testing/gtest/include/gtest/gtest.h" |
| 11 | 12 |
| 13 namespace { |
| 14 |
| 15 #if defined(OS_ANDROID) |
| 16 const char kDefaultPhishList[] = "goog-mobilephish-shavar"; |
| 17 const char kDefaultMalwareList[] = "goog-mobilemalware-shavar"; |
| 18 #else |
| 19 const char kDefaultPhishList[] = "goog-phish-shavar"; |
| 20 const char kDefaultMalwareList[] = "goog-malware-shavar"; |
| 21 #endif |
| 22 |
| 12 // Test parsing one add chunk. | 23 // Test parsing one add chunk. |
| 13 TEST(SafeBrowsingProtocolParsingTest, TestAddChunk) { | 24 TEST(SafeBrowsingProtocolParsingTest, TestAddChunk) { |
| 14 const char kRawAddChunk[] = { | 25 const char kRawAddChunk[] = { |
| 15 '\0', '\0', '\0', '\x1C', // 32-bit payload length in network byte order. | 26 '\0', '\0', '\0', '\x1C', // 32-bit payload length in network byte order. |
| 16 '\x08', // field 1, wire format varint | 27 '\x08', // field 1, wire format varint |
| 17 '\x01', // chunk_number varint 1 | 28 '\x01', // chunk_number varint 1 |
| 18 '\x22', // field 4, wire format length-delimited | 29 '\x22', // field 4, wire format length-delimited |
| 19 '\x18', // varint length 24 | 30 '\x18', // varint length 24 |
| 20 '1', '1', '1', '1', // 4-byte prefixes | 31 '1', '1', '1', '1', // 4-byte prefixes |
| 21 '2', '2', '2', '2', | 32 '2', '2', '2', '2', |
| (...skipping 294 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 316 deletes.clear(); | 327 deletes.clear(); |
| 317 urls.clear(); | 328 urls.clear(); |
| 318 add_del = "n:1700\nad:1-7,43-597,44444,99999\ni:malware\nsd:4,21-27171717\n"; | 329 add_del = "n:1700\nad:1-7,43-597,44444,99999\ni:malware\nsd:4,21-27171717\n"; |
| 319 EXPECT_FALSE(safe_browsing::ParseUpdate(add_del.data(), add_del.length(), | 330 EXPECT_FALSE(safe_browsing::ParseUpdate(add_del.data(), add_del.length(), |
| 320 &next_query_sec, &reset, | 331 &next_query_sec, &reset, |
| 321 &deletes, &urls)); | 332 &deletes, &urls)); |
| 322 } | 333 } |
| 323 | 334 |
| 324 // Test parsing the SafeBrowsing update response. | 335 // Test parsing the SafeBrowsing update response. |
| 325 TEST(SafeBrowsingProtocolParsingTest, TestRedirects) { | 336 TEST(SafeBrowsingProtocolParsingTest, TestRedirects) { |
| 326 std::string redirects("i:goog-malware-shavar\n" | 337 const std::string redirects(base::StringPrintf( |
| 327 "u:cache.googlevideo.com/safebrowsing/rd/goog-malware-shavar_s_1\n" | 338 "i:%s\n" |
| 328 "u:cache.googlevideo.com/safebrowsing/rd/goog-malware-shavar_s_2\n" | 339 "u:cache.googlevideo.com/safebrowsing/rd/goog-malware-shavar_s_1\n" |
| 329 "u:cache.googlevideo.com/safebrowsing/rd/goog-malware-shavar_s_3\n" | 340 "u:cache.googlevideo.com/safebrowsing/rd/goog-malware-shavar_s_2\n" |
| 330 "u:s.ytimg.com/safebrowsing/rd/goog-phish-shavar_a_8641-8800:8641-8689," | 341 "u:cache.googlevideo.com/safebrowsing/rd/goog-malware-shavar_s_3\n" |
| 331 "8691-8731,8733-8786\n"); | 342 "u:s.ytimg.com/safebrowsing/rd/goog-phish-shavar_a_8641-8800:8641-8689," |
| 343 "8691-8731,8733-8786\n", |
| 344 kDefaultMalwareList)); |
| 332 | 345 |
| 333 size_t next_query_sec = 0; | 346 size_t next_query_sec = 0; |
| 334 bool reset = false; | 347 bool reset = false; |
| 335 std::vector<SBChunkDelete> deletes; | 348 std::vector<SBChunkDelete> deletes; |
| 336 std::vector<ChunkUrl> urls; | 349 std::vector<ChunkUrl> urls; |
| 337 EXPECT_TRUE(safe_browsing::ParseUpdate(redirects.data(), redirects.length(), | 350 EXPECT_TRUE(safe_browsing::ParseUpdate(redirects.data(), redirects.length(), |
| 338 &next_query_sec, &reset, | 351 &next_query_sec, &reset, |
| 339 &deletes, &urls)); | 352 &deletes, &urls)); |
| 340 EXPECT_FALSE(reset); | 353 EXPECT_FALSE(reset); |
| 341 EXPECT_EQ(0U, next_query_sec); | 354 EXPECT_EQ(0U, next_query_sec); |
| (...skipping 23 matching lines...) Expand all Loading... |
| 365 &deletes, &urls)); | 378 &deletes, &urls)); |
| 366 | 379 |
| 367 EXPECT_EQ(1800U, next_query_sec); | 380 EXPECT_EQ(1800U, next_query_sec); |
| 368 EXPECT_FALSE(reset); | 381 EXPECT_FALSE(reset); |
| 369 EXPECT_TRUE(deletes.empty()); | 382 EXPECT_TRUE(deletes.empty()); |
| 370 EXPECT_TRUE(urls.empty()); | 383 EXPECT_TRUE(urls.empty()); |
| 371 } | 384 } |
| 372 | 385 |
| 373 // Test parsing data from a GetHashRequest | 386 // Test parsing data from a GetHashRequest |
| 374 TEST(SafeBrowsingProtocolParsingTest, TestGetHash) { | 387 TEST(SafeBrowsingProtocolParsingTest, TestGetHash) { |
| 375 std::string get_hash("45\n" | 388 const std::string get_hash(base::StringPrintf( |
| 376 "goog-phish-shavar:32:3\n" | 389 "45\n" |
| 377 "00112233445566778899aabbccddeeff" | 390 "%s:32:3\n" |
| 378 "00001111222233334444555566667777" | 391 "00112233445566778899aabbccddeeff" |
| 379 "ffffeeeeddddccccbbbbaaaa99998888"); | 392 "00001111222233334444555566667777" |
| 393 "ffffeeeeddddccccbbbbaaaa99998888", |
| 394 kDefaultPhishList)); |
| 380 std::vector<SBFullHashResult> full_hashes; | 395 std::vector<SBFullHashResult> full_hashes; |
| 381 base::TimeDelta cache_lifetime; | 396 base::TimeDelta cache_lifetime; |
| 382 EXPECT_TRUE(safe_browsing::ParseGetHash(get_hash.data(), get_hash.length(), | 397 EXPECT_TRUE(safe_browsing::ParseGetHash(get_hash.data(), get_hash.length(), |
| 383 &cache_lifetime, &full_hashes)); | 398 &cache_lifetime, &full_hashes)); |
| 384 | 399 |
| 385 ASSERT_EQ(3U, full_hashes.size()); | 400 ASSERT_EQ(3U, full_hashes.size()); |
| 386 EXPECT_EQ(memcmp(&full_hashes[0].hash, | 401 EXPECT_EQ(memcmp(&full_hashes[0].hash, |
| 387 "00112233445566778899aabbccddeeff", | 402 "00112233445566778899aabbccddeeff", |
| 388 sizeof(SBFullHash)), 0); | 403 sizeof(SBFullHash)), 0); |
| 389 EXPECT_EQ(safe_browsing_util::PHISH, full_hashes[0].list_id); | 404 EXPECT_EQ(safe_browsing_util::PHISH, full_hashes[0].list_id); |
| 390 EXPECT_EQ(memcmp(&full_hashes[1].hash, | 405 EXPECT_EQ(memcmp(&full_hashes[1].hash, |
| 391 "00001111222233334444555566667777", | 406 "00001111222233334444555566667777", |
| 392 sizeof(SBFullHash)), 0); | 407 sizeof(SBFullHash)), 0); |
| 393 EXPECT_EQ(safe_browsing_util::PHISH, full_hashes[1].list_id); | 408 EXPECT_EQ(safe_browsing_util::PHISH, full_hashes[1].list_id); |
| 394 EXPECT_EQ(memcmp(&full_hashes[2].hash, | 409 EXPECT_EQ(memcmp(&full_hashes[2].hash, |
| 395 "ffffeeeeddddccccbbbbaaaa99998888", | 410 "ffffeeeeddddccccbbbbaaaa99998888", |
| 396 sizeof(SBFullHash)), 0); | 411 sizeof(SBFullHash)), 0); |
| 397 EXPECT_EQ(safe_browsing_util::PHISH, full_hashes[2].list_id); | 412 EXPECT_EQ(safe_browsing_util::PHISH, full_hashes[2].list_id); |
| 398 | 413 |
| 399 // Test multiple lists in the GetHash results. | 414 // Test multiple lists in the GetHash results. |
| 400 std::string get_hash2("45\n" | 415 const std::string get_hash2(base::StringPrintf( |
| 401 "goog-phish-shavar:32:1\n" | 416 "45\n" |
| 402 "00112233445566778899aabbccddeeff" | 417 "%s:32:1\n" |
| 403 "goog-malware-shavar:32:2\n" | 418 "00112233445566778899aabbccddeeff" |
| 404 "cafebeefcafebeefdeaddeaddeaddead" | 419 "%s:32:2\n" |
| 405 "zzzzyyyyxxxxwwwwvvvvuuuuttttssss"); | 420 "cafebeefcafebeefdeaddeaddeaddead" |
| 421 "zzzzyyyyxxxxwwwwvvvvuuuuttttssss", |
| 422 kDefaultPhishList, |
| 423 kDefaultMalwareList)); |
| 406 EXPECT_TRUE(safe_browsing::ParseGetHash(get_hash2.data(), get_hash2.length(), | 424 EXPECT_TRUE(safe_browsing::ParseGetHash(get_hash2.data(), get_hash2.length(), |
| 407 &cache_lifetime, &full_hashes)); | 425 &cache_lifetime, &full_hashes)); |
| 408 | 426 |
| 409 ASSERT_EQ(3U, full_hashes.size()); | 427 ASSERT_EQ(3U, full_hashes.size()); |
| 410 EXPECT_EQ(memcmp(&full_hashes[0].hash, | 428 EXPECT_EQ(memcmp(&full_hashes[0].hash, |
| 411 "00112233445566778899aabbccddeeff", | 429 "00112233445566778899aabbccddeeff", |
| 412 sizeof(SBFullHash)), 0); | 430 sizeof(SBFullHash)), 0); |
| 413 EXPECT_EQ(safe_browsing_util::PHISH, full_hashes[0].list_id); | 431 EXPECT_EQ(safe_browsing_util::PHISH, full_hashes[0].list_id); |
| 414 EXPECT_EQ(memcmp(&full_hashes[1].hash, | 432 EXPECT_EQ(memcmp(&full_hashes[1].hash, |
| 415 "cafebeefcafebeefdeaddeaddeaddead", | 433 "cafebeefcafebeefdeaddeaddeaddead", |
| 416 sizeof(SBFullHash)), 0); | 434 sizeof(SBFullHash)), 0); |
| 417 EXPECT_EQ(safe_browsing_util::MALWARE, full_hashes[1].list_id); | 435 EXPECT_EQ(safe_browsing_util::MALWARE, full_hashes[1].list_id); |
| 418 EXPECT_EQ(memcmp(&full_hashes[2].hash, | 436 EXPECT_EQ(memcmp(&full_hashes[2].hash, |
| 419 "zzzzyyyyxxxxwwwwvvvvuuuuttttssss", | 437 "zzzzyyyyxxxxwwwwvvvvuuuuttttssss", |
| 420 sizeof(SBFullHash)), 0); | 438 sizeof(SBFullHash)), 0); |
| 421 EXPECT_EQ(safe_browsing_util::MALWARE, full_hashes[2].list_id); | 439 EXPECT_EQ(safe_browsing_util::MALWARE, full_hashes[2].list_id); |
| 422 | 440 |
| 423 // Test metadata parsing. | 441 // Test metadata parsing. |
| 424 // TODO(shess): Currently the code doesn't actually put the metadata anywhere, | 442 // TODO(shess): Currently the code doesn't actually put the metadata anywhere, |
| 425 // this is just testing that metadata doesn't break parsing. | 443 // this is just testing that metadata doesn't break parsing. |
| 426 std::string get_hash3("45\n" | 444 const std::string get_hash3(base::StringPrintf( |
| 427 "goog-malware-shavar:32:2:m\n" | 445 "45\n" |
| 428 "zzzzyyyyxxxxwwwwvvvvuuuuttttssss" | 446 "%s:32:2:m\n" |
| 429 "00112233445566778899aabbccddeeff" | 447 "zzzzyyyyxxxxwwwwvvvvuuuuttttssss" |
| 430 "2\nab2\nxy" | 448 "00112233445566778899aabbccddeeff" |
| 431 "goog-phish-shavar:32:1\n" | 449 "2\nab2\nxy" |
| 432 "cafebeefcafebeefdeaddeaddeaddead"); | 450 "%s:32:1\n" |
| 451 "cafebeefcafebeefdeaddeaddeaddead", |
| 452 kDefaultMalwareList, |
| 453 kDefaultPhishList)); |
| 433 EXPECT_TRUE(safe_browsing::ParseGetHash(get_hash3.data(), get_hash3.length(), | 454 EXPECT_TRUE(safe_browsing::ParseGetHash(get_hash3.data(), get_hash3.length(), |
| 434 &cache_lifetime, &full_hashes)); | 455 &cache_lifetime, &full_hashes)); |
| 435 | 456 |
| 436 ASSERT_EQ(3U, full_hashes.size()); | 457 ASSERT_EQ(3U, full_hashes.size()); |
| 437 EXPECT_EQ(memcmp(&full_hashes[0].hash, | 458 EXPECT_EQ(memcmp(&full_hashes[0].hash, |
| 438 "zzzzyyyyxxxxwwwwvvvvuuuuttttssss", | 459 "zzzzyyyyxxxxwwwwvvvvuuuuttttssss", |
| 439 sizeof(SBFullHash)), 0); | 460 sizeof(SBFullHash)), 0); |
| 440 EXPECT_EQ(safe_browsing_util::MALWARE, full_hashes[0].list_id); | 461 EXPECT_EQ(safe_browsing_util::MALWARE, full_hashes[0].list_id); |
| 441 EXPECT_EQ(memcmp(&full_hashes[1].hash, | 462 EXPECT_EQ(memcmp(&full_hashes[1].hash, |
| 442 "00112233445566778899aabbccddeeff", | 463 "00112233445566778899aabbccddeeff", |
| 443 sizeof(SBFullHash)), 0); | 464 sizeof(SBFullHash)), 0); |
| 444 EXPECT_EQ(safe_browsing_util::MALWARE, full_hashes[1].list_id); | 465 EXPECT_EQ(safe_browsing_util::MALWARE, full_hashes[1].list_id); |
| 445 EXPECT_EQ(memcmp(&full_hashes[2].hash, | 466 EXPECT_EQ(memcmp(&full_hashes[2].hash, |
| 446 "cafebeefcafebeefdeaddeaddeaddead", | 467 "cafebeefcafebeefdeaddeaddeaddead", |
| 447 sizeof(SBFullHash)), 0); | 468 sizeof(SBFullHash)), 0); |
| 448 EXPECT_EQ(safe_browsing_util::PHISH, full_hashes[2].list_id); | 469 EXPECT_EQ(safe_browsing_util::PHISH, full_hashes[2].list_id); |
| 449 } | 470 } |
| 450 | 471 |
| 451 TEST(SafeBrowsingProtocolParsingTest, TestGetHashWithUnknownList) { | 472 TEST(SafeBrowsingProtocolParsingTest, TestGetHashWithUnknownList) { |
| 452 std::string hash_response = "45\n" | 473 std::string hash_response(base::StringPrintf( |
| 453 "goog-phish-shavar:32:1\n" | 474 "45\n" |
| 454 "12345678901234567890123456789012" | 475 "%s:32:1\n" |
| 455 "googpub-phish-shavar:32:1\n" | 476 "12345678901234567890123456789012" |
| 456 "09876543210987654321098765432109"; | 477 "googpub-phish-shavar:32:1\n" |
| 478 "09876543210987654321098765432109", |
| 479 kDefaultPhishList)); |
| 457 std::vector<SBFullHashResult> full_hashes; | 480 std::vector<SBFullHashResult> full_hashes; |
| 458 base::TimeDelta cache_lifetime; | 481 base::TimeDelta cache_lifetime; |
| 459 EXPECT_TRUE(safe_browsing::ParseGetHash(hash_response.data(), | 482 EXPECT_TRUE(safe_browsing::ParseGetHash(hash_response.data(), |
| 460 hash_response.size(), | 483 hash_response.size(), |
| 461 &cache_lifetime, | 484 &cache_lifetime, |
| 462 &full_hashes)); | 485 &full_hashes)); |
| 463 | 486 |
| 464 ASSERT_EQ(1U, full_hashes.size()); | 487 ASSERT_EQ(1U, full_hashes.size()); |
| 465 EXPECT_EQ(memcmp("12345678901234567890123456789012", | 488 EXPECT_EQ(memcmp("12345678901234567890123456789012", |
| 466 &full_hashes[0].hash, sizeof(SBFullHash)), 0); | 489 &full_hashes[0].hash, sizeof(SBFullHash)), 0); |
| 467 EXPECT_EQ(safe_browsing_util::PHISH, full_hashes[0].list_id); | 490 EXPECT_EQ(safe_browsing_util::PHISH, full_hashes[0].list_id); |
| 468 | 491 |
| 469 hash_response += "goog-malware-shavar:32:1\n" | 492 hash_response += base::StringPrintf( |
| 470 "abcdefghijklmnopqrstuvwxyz123457"; | 493 "%s:32:1\n" |
| 494 "abcdefghijklmnopqrstuvwxyz123457", |
| 495 kDefaultMalwareList); |
| 471 full_hashes.clear(); | 496 full_hashes.clear(); |
| 472 EXPECT_TRUE(safe_browsing::ParseGetHash(hash_response.data(), | 497 EXPECT_TRUE(safe_browsing::ParseGetHash(hash_response.data(), |
| 473 hash_response.size(), | 498 hash_response.size(), |
| 474 &cache_lifetime, | 499 &cache_lifetime, |
| 475 &full_hashes)); | 500 &full_hashes)); |
| 476 | 501 |
| 477 EXPECT_EQ(2U, full_hashes.size()); | 502 EXPECT_EQ(2U, full_hashes.size()); |
| 478 EXPECT_EQ(memcmp("12345678901234567890123456789012", | 503 EXPECT_EQ(memcmp("12345678901234567890123456789012", |
| 479 &full_hashes[0].hash, sizeof(SBFullHash)), 0); | 504 &full_hashes[0].hash, sizeof(SBFullHash)), 0); |
| 480 EXPECT_EQ(safe_browsing_util::PHISH, full_hashes[0].list_id); | 505 EXPECT_EQ(safe_browsing_util::PHISH, full_hashes[0].list_id); |
| (...skipping 177 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 658 | 683 |
| 659 EXPECT_EQ(3, chunks[2]->ChunkNumber()); | 684 EXPECT_EQ(3, chunks[2]->ChunkNumber()); |
| 660 EXPECT_FALSE(chunks[0]->IsAdd()); | 685 EXPECT_FALSE(chunks[0]->IsAdd()); |
| 661 EXPECT_TRUE(chunks[0]->IsSub()); | 686 EXPECT_TRUE(chunks[0]->IsSub()); |
| 662 EXPECT_TRUE(chunks[2]->IsPrefix()); | 687 EXPECT_TRUE(chunks[2]->IsPrefix()); |
| 663 EXPECT_FALSE(chunks[2]->IsFullHash()); | 688 EXPECT_FALSE(chunks[2]->IsFullHash()); |
| 664 ASSERT_EQ(1U, chunks[2]->PrefixCount()); | 689 ASSERT_EQ(1U, chunks[2]->PrefixCount()); |
| 665 EXPECT_EQ(0x70707070U, chunks[2]->PrefixAt(0)); // pppp | 690 EXPECT_EQ(0x70707070U, chunks[2]->PrefixAt(0)); // pppp |
| 666 EXPECT_EQ(11, chunks[2]->AddChunkNumberAt(0)); | 691 EXPECT_EQ(11, chunks[2]->AddChunkNumberAt(0)); |
| 667 } | 692 } |
| 693 |
| 694 } // namespace |
| OLD | NEW |