1c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. 2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file. 4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// 5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Program to test the SafeBrowsing protocol parsing v2.1. 6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 7c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/string_util.h" 8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/safe_browsing/protocol_parser.h" 972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/safe_browsing/safe_browsing_util.h" 10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "testing/gtest/include/gtest/gtest.h" 11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Test parsing one add chunk. 13c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(SafeBrowsingProtocolParsingTest, TestAddChunk) { 14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::string add_chunk("a:1:4:35\naaaax1111\0032222333344447777\00288889999"); 15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch add_chunk[13] = '\0'; 16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Run the parse. 18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SafeBrowsingProtocolParser parser; 19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool re_key = false; 20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SBChunkList chunks; 2172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen bool result = parser.ParseChunk( 2272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen safe_browsing_util::kMalwareList, 2372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen add_chunk.data(), 2472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen static_cast<int>(add_chunk.length()), 2572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen "", "", &re_key, &chunks); 26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(result); 27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(re_key); 2872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_EQ(chunks.size(), 1U); 29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(chunks[0].chunk_number, 1); 3072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_EQ(chunks[0].hosts.size(), 3U); 31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(chunks[0].hosts[0].host, 0x61616161); 33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SBEntry* entry = chunks[0].hosts[0].entry; 34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(entry->IsAdd()); 35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(entry->IsPrefix()); 36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(entry->prefix_count(), 0); 37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(chunks[0].hosts[1].host, 0x31313131); 39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch entry = chunks[0].hosts[1].entry; 40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(entry->IsAdd()); 41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(entry->IsPrefix()); 42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(entry->prefix_count(), 3); 43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(entry->PrefixAt(0), 0x32323232); 44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(entry->PrefixAt(1), 0x33333333); 45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(entry->PrefixAt(2), 0x34343434); 46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(chunks[0].hosts[2].host, 0x37373737); 48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch entry = chunks[0].hosts[2].entry; 49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(entry->IsAdd()); 50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(entry->IsPrefix()); 51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(entry->prefix_count(), 2); 52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(entry->PrefixAt(0), 0x38383838); 53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(entry->PrefixAt(1), 0x39393939); 54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Test parsing one add chunk with full hashes. 57c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(SafeBrowsingProtocolParsingTest, TestAddFullChunk) { 58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::string add_chunk("a:1:32:69\naaaa"); 59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch add_chunk.push_back(2); 60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SBFullHash full_hash1, full_hash2; 62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch for (int i = 0; i < 32; ++i) { 63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch full_hash1.full_hash[i] = i % 2 ? 1 : 2; 64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch full_hash2.full_hash[i] = i % 2 ? 3 : 4; 65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch add_chunk.append(full_hash1.full_hash, 32); 68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch add_chunk.append(full_hash2.full_hash, 32); 69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Run the parse. 71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SafeBrowsingProtocolParser parser; 72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool re_key = false; 73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SBChunkList chunks; 7472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen bool result = parser.ParseChunk( 7572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen safe_browsing_util::kMalwareList, 7672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen add_chunk.data(), 7772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen static_cast<int>(add_chunk.length()), 7872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen "", "", &re_key, &chunks); 79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(result); 80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(re_key); 8172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_EQ(chunks.size(), 1U); 82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(chunks[0].chunk_number, 1); 8372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_EQ(chunks[0].hosts.size(), 1U); 84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(chunks[0].hosts[0].host, 0x61616161); 86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SBEntry* entry = chunks[0].hosts[0].entry; 87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(entry->IsAdd()); 88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(entry->IsPrefix()); 89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(entry->prefix_count(), 2); 90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(entry->FullHashAt(0) == full_hash1); 91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(entry->FullHashAt(1) == full_hash2); 92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Test parsing multiple add chunks. We'll use the same chunk as above, and add 95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// one more after it. 96c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(SafeBrowsingProtocolParsingTest, TestAddChunks) { 97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::string add_chunk("a:1:4:35\naaaax1111\0032222333344447777\00288889999" 98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "a:2:4:13\n5555\002ppppgggg"); 99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch add_chunk[13] = '\0'; 100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Run the parse. 102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SafeBrowsingProtocolParser parser; 103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool re_key = false; 104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SBChunkList chunks; 10572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen bool result = parser.ParseChunk( 10672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen safe_browsing_util::kMalwareList, 10772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen add_chunk.data(), 10872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen static_cast<int>(add_chunk.length()), 10972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen "", "", &re_key, &chunks); 110c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(result); 111c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(re_key); 11272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_EQ(chunks.size(), 2U); 113c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(chunks[0].chunk_number, 1); 11472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_EQ(chunks[0].hosts.size(), 3U); 115c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 116c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(chunks[0].hosts[0].host, 0x61616161); 117c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SBEntry* entry = chunks[0].hosts[0].entry; 118c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(entry->IsAdd()); 119c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(entry->IsPrefix()); 120c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(entry->prefix_count(), 0); 121c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 122c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(chunks[0].hosts[1].host, 0x31313131); 123c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch entry = chunks[0].hosts[1].entry; 124c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(entry->IsAdd()); 125c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(entry->IsPrefix()); 126c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(entry->prefix_count(), 3); 127c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(entry->PrefixAt(0), 0x32323232); 128c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(entry->PrefixAt(1), 0x33333333); 129c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(entry->PrefixAt(2), 0x34343434); 130c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 131c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(chunks[0].hosts[2].host, 0x37373737); 132c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch entry = chunks[0].hosts[2].entry; 133c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(entry->IsAdd()); 134c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(entry->IsPrefix()); 135c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(entry->prefix_count(), 2); 136c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(entry->PrefixAt(0), 0x38383838); 137c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(entry->PrefixAt(1), 0x39393939); 138c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 139c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 140c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(chunks[1].chunk_number, 2); 14172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_EQ(chunks[1].hosts.size(), 1U); 142c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 143c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(chunks[1].hosts[0].host, 0x35353535); 144c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch entry = chunks[1].hosts[0].entry; 145c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(entry->IsAdd()); 146c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(entry->IsPrefix()); 147c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(entry->prefix_count(), 2); 148c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(entry->PrefixAt(0), 0x70707070); 149c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(entry->PrefixAt(1), 0x67676767); 150c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 151c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 152c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Test parsing one add chunk where a hostkey spans several entries. 153c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(SafeBrowsingProtocolParsingTest, TestAddBigChunk) { 154c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::string add_chunk("a:1:4:1050\naaaaX"); 155c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch add_chunk[add_chunk.size() - 1] |= 0xFF; 156c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch for (int i = 0; i < 255; ++i) 157c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch add_chunk.append(StringPrintf("%04d", i)); 158c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 159c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch add_chunk.append("aaaa"); 160c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch add_chunk.push_back(5); 161c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch for (int i = 0; i < 5; ++i) 162c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch add_chunk.append(StringPrintf("001%d", i)); 163c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 164c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SafeBrowsingProtocolParser parser; 165c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool re_key = false; 166c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SBChunkList chunks; 16772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen bool result = parser.ParseChunk( 16872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen safe_browsing_util::kMalwareList, 16972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen add_chunk.data(), 17072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen static_cast<int>(add_chunk.length()), 17172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen "", "", &re_key, &chunks); 172c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(result); 173c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(re_key); 17472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_EQ(chunks.size(), 1U); 175c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(chunks[0].chunk_number, 1); 176c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 17772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_EQ(chunks[0].hosts.size(), 2U); 17872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 17972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen const SBChunkHost& host0 = chunks[0].hosts[0]; 18072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_EQ(host0.host, 0x61616161); 18172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_EQ(host0.entry->prefix_count(), 255); 18272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 18372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen const SBChunkHost& host1 = chunks[0].hosts[1]; 18472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_EQ(host1.host, 0x61616161); 18572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_EQ(host1.entry->prefix_count(), 5); 18672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 18772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 18872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Test to make sure we could deal with truncated bin hash chunk. 18972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenTEST(SafeBrowsingProtocolParsingTest, TestTruncatedBinHashChunk) { 19072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // This chunk delares there are 4 prefixes but actually only contains 2. 19172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen const char add_chunk[] = "a:1:4:16\n11112222"; 19272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen SafeBrowsingProtocolParser parser; 19372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen bool re_key = false; 19472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen SBChunkList chunks; 19572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen bool result = parser.ParseChunk(add_chunk, 19672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen safe_browsing_util::kBinHashList, 19772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen static_cast<int>(sizeof(add_chunk)), 19872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen "", "", &re_key, &chunks); 19972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_FALSE(result); 20072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_FALSE(re_key); 20172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_EQ(chunks.size(), 0U); 20272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 20372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 20472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Test to make sure we could deal with truncated malwarelist chunk. 20572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenTEST(SafeBrowsingProtocolParsingTest, TestTruncatedUrlHashChunk) { 20672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // This chunk delares there are 4 prefixes but actually only contains 2. 20772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen const char add_chunk[] = "a:1:4:21\naaaa\00411112222"; 20872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen SafeBrowsingProtocolParser parser; 20972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen bool re_key = false; 21072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen SBChunkList chunks; 21172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 21272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // For safe_browsing_util::kMalwareList. 21372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen bool result = parser.ParseChunk(add_chunk, 21472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen safe_browsing_util::kMalwareList, 21572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen static_cast<int>(sizeof(add_chunk)), 21672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen "", "", &re_key, &chunks); 21772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_FALSE(result); 21872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_FALSE(re_key); 21972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_EQ(chunks.size(), 0U); 22072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 22172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // For safe_browsing_util::kPhishingList. 22272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen result = parser.ParseChunk(add_chunk, 22372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen safe_browsing_util::kPhishingList, 22472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen static_cast<int>(sizeof(add_chunk)), 22572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen "", "", &re_key, &chunks); 22672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_FALSE(result); 22772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_FALSE(re_key); 22872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_EQ(chunks.size(), 0U); 229c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 23072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // For safe_browsing_util::kBinUrlList. 23172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen result = parser.ParseChunk(add_chunk, 23272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen safe_browsing_util::kBinUrlList, 23372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen static_cast<int>(sizeof(add_chunk)), 23472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen "", "", &re_key, &chunks); 23572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_FALSE(result); 23672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_FALSE(re_key); 23772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_EQ(chunks.size(), 0U); 238c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 239c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 240c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Test parsing one sub chunk. 241c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(SafeBrowsingProtocolParsingTest, TestSubChunk) { 242c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::string sub_chunk("s:9:4:59\naaaaxkkkk1111\003" 243c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "zzzz2222zzzz3333zzzz4444" 244c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "7777\002yyyy8888yyyy9999"); 245c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch sub_chunk[13] = '\0'; 246c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 247c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Run the parse. 248c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SafeBrowsingProtocolParser parser; 249c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool re_key = false; 250c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SBChunkList chunks; 25172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen bool result = parser.ParseChunk( 25272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen safe_browsing_util::kMalwareList, 25372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen sub_chunk.data(), 25472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen static_cast<int>(sub_chunk.length()), 25572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen "", "", &re_key, &chunks); 256c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(result); 257c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(re_key); 25872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_EQ(chunks.size(), 1U); 259c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(chunks[0].chunk_number, 9); 26072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_EQ(chunks[0].hosts.size(), 3U); 261c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 262c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(chunks[0].hosts[0].host, 0x61616161); 263c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SBEntry* entry = chunks[0].hosts[0].entry; 264c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(entry->IsSub()); 265c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(entry->IsPrefix()); 266c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(entry->chunk_id(), 0x6b6b6b6b); 267c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(entry->prefix_count(), 0); 268c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 269c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(chunks[0].hosts[1].host, 0x31313131); 270c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch entry = chunks[0].hosts[1].entry; 271c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(entry->IsSub()); 272c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(entry->IsPrefix()); 273c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(entry->prefix_count(), 3); 274c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(entry->ChunkIdAtPrefix(0), 0x7a7a7a7a); 275c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(entry->PrefixAt(0), 0x32323232); 276c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(entry->ChunkIdAtPrefix(1), 0x7a7a7a7a); 277c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(entry->PrefixAt(1), 0x33333333); 278c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(entry->ChunkIdAtPrefix(2), 0x7a7a7a7a); 279c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(entry->PrefixAt(2), 0x34343434); 280c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 281c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(chunks[0].hosts[2].host, 0x37373737); 282c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch entry = chunks[0].hosts[2].entry; 283c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(entry->IsSub()); 284c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(entry->IsPrefix()); 285c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(entry->prefix_count(), 2); 286c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(entry->ChunkIdAtPrefix(0), 0x79797979); 287c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(entry->PrefixAt(0), 0x38383838); 288c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(entry->ChunkIdAtPrefix(1), 0x79797979); 289c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(entry->PrefixAt(1), 0x39393939); 290c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 291c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 292c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Test parsing one sub chunk with full hashes. 293c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(SafeBrowsingProtocolParsingTest, TestSubFullChunk) { 294c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::string sub_chunk("s:1:32:77\naaaa"); 295c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch sub_chunk.push_back(2); 296c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 297c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SBFullHash full_hash1, full_hash2; 298c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch for (int i = 0; i < 32; ++i) { 299c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch full_hash1.full_hash[i] = i % 2 ? 1 : 2; 300c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch full_hash2.full_hash[i] = i % 2 ? 3 : 4; 301c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 302c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 303c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch sub_chunk.append("yyyy"); 304c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch sub_chunk.append(full_hash1.full_hash, 32); 305c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch sub_chunk.append("zzzz"); 306c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch sub_chunk.append(full_hash2.full_hash, 32); 307c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 308c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Run the parse. 309c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SafeBrowsingProtocolParser parser; 310c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool re_key = false; 311c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SBChunkList chunks; 31272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen bool result = parser.ParseChunk( 31372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen safe_browsing_util::kMalwareList, 31472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen sub_chunk.data(), 31572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen static_cast<int>(sub_chunk.length()), 31672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen "", "", &re_key, &chunks); 317c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(result); 318c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(re_key); 31972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_EQ(chunks.size(), 1U); 320c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(chunks[0].chunk_number, 1); 32172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_EQ(chunks[0].hosts.size(), 1U); 322c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 323c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(chunks[0].hosts[0].host, 0x61616161); 324c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SBEntry* entry = chunks[0].hosts[0].entry; 325c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(entry->IsSub()); 326c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(entry->IsPrefix()); 327c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(entry->prefix_count(), 2); 328c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(entry->ChunkIdAtPrefix(0), 0x79797979); 329c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(entry->FullHashAt(0) == full_hash1); 330c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(entry->ChunkIdAtPrefix(1), 0x7a7a7a7a); 331c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(entry->FullHashAt(1) == full_hash2); 332c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 333c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 334c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Test parsing the SafeBrowsing update response. 335c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(SafeBrowsingProtocolParsingTest, TestChunkDelete) { 336c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::string add_del("n:1700\ni:phishy\nad:1-7,43-597,44444,99999\n" 337c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "i:malware\nsd:21-27,42,171717\n"); 338c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 339c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SafeBrowsingProtocolParser parser; 340c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int next_query_sec = 0; 341c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool re_key = false; 342c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool reset = false; 343c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::vector<SBChunkDelete> deletes; 344c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::vector<ChunkUrl> urls; 345c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(parser.ParseUpdate(add_del.data(), 346c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch static_cast<int>(add_del.length()), "", 347c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch &next_query_sec, &re_key, 348c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch &reset, &deletes, &urls)); 349c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 350c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(urls.empty()); 351c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(re_key); 352c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(reset); 353c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(next_query_sec, 1700); 35472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_EQ(deletes.size(), 2U); 355c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 35672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_EQ(deletes[0].chunk_del.size(), 4U); 357c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(deletes[0].chunk_del[0] == ChunkRange(1, 7)); 358c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(deletes[0].chunk_del[1] == ChunkRange(43, 597)); 359c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(deletes[0].chunk_del[2] == ChunkRange(44444)); 360c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(deletes[0].chunk_del[3] == ChunkRange(99999)); 361c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 36272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_EQ(deletes[1].chunk_del.size(), 3U); 363c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(deletes[1].chunk_del[0] == ChunkRange(21, 27)); 364c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(deletes[1].chunk_del[1] == ChunkRange(42)); 365c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(deletes[1].chunk_del[2] == ChunkRange(171717)); 366c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 367c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // An update response with missing list name. 368c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 369c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch next_query_sec = 0; 370c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch deletes.clear(); 371c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch urls.clear(); 372c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch add_del = "n:1700\nad:1-7,43-597,44444,99999\ni:malware\nsd:4,21-27171717\n"; 373c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(parser.ParseUpdate(add_del.data(), 374c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch static_cast<int>(add_del.length()), "", 375c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch &next_query_sec, &re_key, 376c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch &reset, &deletes, &urls)); 377c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 378c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 379c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Test parsing the SafeBrowsing update response. 380c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(SafeBrowsingProtocolParsingTest, TestRedirects) { 381c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::string redirects("i:goog-malware-shavar\n" 382c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "u:cache.googlevideo.com/safebrowsing/rd/goog-malware-shavar_s_1\n" 383c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "u:cache.googlevideo.com/safebrowsing/rd/goog-malware-shavar_s_2\n" 384c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "u:cache.googlevideo.com/safebrowsing/rd/goog-malware-shavar_s_3\n" 385c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "u:s.ytimg.com/safebrowsing/rd/goog-phish-shavar_a_8641-8800:8641-8689," 386c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "8691-8731,8733-8786\n"); 387c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 388c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SafeBrowsingProtocolParser parser; 389c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int next_query_sec = 0; 390c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool re_key = false; 391c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool reset = false; 392c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::vector<SBChunkDelete> deletes; 393c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::vector<ChunkUrl> urls; 394c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(parser.ParseUpdate(redirects.data(), 395c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch static_cast<int>(redirects.length()), "", 396c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch &next_query_sec, &re_key, 397c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch &reset, &deletes, &urls)); 398c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 399c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(re_key); 400c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(reset); 40172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_EQ(urls.size(), 4U); 402c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(urls[0].url, 403c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "cache.googlevideo.com/safebrowsing/rd/goog-malware-shavar_s_1"); 404c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(urls[1].url, 405c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "cache.googlevideo.com/safebrowsing/rd/goog-malware-shavar_s_2"); 406c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(urls[2].url, 407c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "cache.googlevideo.com/safebrowsing/rd/goog-malware-shavar_s_3"); 408c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(urls[3].url, 409c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "s.ytimg.com/safebrowsing/rd/goog-phish-shavar_a_8641-8800:8641-8689," 410c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "8691-8731,8733-8786"); 411c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(next_query_sec, 0); 412c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(deletes.empty()); 413c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 414c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 415c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(SafeBrowsingProtocolParsingTest, TestRedirectsWithMac) { 416c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::string redirects("i:goog-phish-shavar\n" 417c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "u:s.ytimg.com/safebrowsing/rd/goog-phish-shavar_s_6501-6505:6501-6505," 418c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "pcY6iVeT9-CBQ3fdAF0rpnKjR1Y=\n" 419c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "u:s.ytimg.com/safebrowsing/rd/goog-phish-shavar_a_8001-8160:8001-8024," 420c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "8026-8045,8048-8049,8051-8134,8136-8152,8155-8160," 421c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "j6XXAEWnjYk9tVVLBSdQvIEq2Wg=\n"); 422c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 423c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SafeBrowsingProtocolParser parser; 424c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int next_query_sec = 0; 425c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool re_key = false; 426c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool reset = false; 427c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const std::string key("58Lqn5WIP961x3zuLGo5Uw=="); 428c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::vector<SBChunkDelete> deletes; 429c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::vector<ChunkUrl> urls; 430c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(parser.ParseUpdate(redirects.data(), 431c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch static_cast<int>(redirects.length()), key, 432c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch &next_query_sec, &re_key, 433c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch &reset, &deletes, &urls)); 434c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 435c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(re_key); 436c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(reset); 43772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_EQ(urls.size(), 2U); 438c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(urls[0].url, 439c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "s.ytimg.com/safebrowsing/rd/goog-phish-shavar_s_6501-6505:6501-6505"); 440c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(urls[0].mac, "pcY6iVeT9-CBQ3fdAF0rpnKjR1Y="); 441c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(urls[1].url, 442c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "s.ytimg.com/safebrowsing/rd/goog-phish-shavar_a_8001-8160:8001-8024," 443c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "8026-8045,8048-8049,8051-8134,8136-8152,8155-8160"); 444c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(urls[1].mac, "j6XXAEWnjYk9tVVLBSdQvIEq2Wg="); 445c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 446c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 447c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Test parsing various SafeBrowsing protocol headers. 448c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(SafeBrowsingProtocolParsingTest, TestNextQueryTime) { 449c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::string headers("n:1800\ni:goog-white-shavar\n"); 450c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SafeBrowsingProtocolParser parser; 451c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int next_query_sec = 0; 452c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool re_key = false; 453c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool reset = false; 454c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::vector<SBChunkDelete> deletes; 455c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::vector<ChunkUrl> urls; 456c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(parser.ParseUpdate(headers.data(), 457c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch static_cast<int>(headers.length()), "", 458c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch &next_query_sec, &re_key, 459c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch &reset, &deletes, &urls)); 460c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 461c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(next_query_sec, 1800); 462c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(re_key); 463c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(reset); 464c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(deletes.empty()); 465c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(urls.empty()); 466c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 467c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 468c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Test parsing data from a GetHashRequest 469c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(SafeBrowsingProtocolParsingTest, TestGetHash) { 470c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::string get_hash("goog-phish-shavar:19:96\n" 471c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "00112233445566778899aabbccddeeff" 472c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "00001111222233334444555566667777" 473c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "ffffeeeeddddccccbbbbaaaa99998888"); 474c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::vector<SBFullHashResult> full_hashes; 475c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool re_key = false; 476c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SafeBrowsingProtocolParser parser; 477c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(parser.ParseGetHash(get_hash.data(), 478c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch static_cast<int>(get_hash.length()), "", 479c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch &re_key, 480c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch &full_hashes)); 481c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 482c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(re_key); 48372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_EQ(full_hashes.size(), 3U); 484c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(memcmp(&full_hashes[0].hash, 485c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "00112233445566778899aabbccddeeff", 486c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch sizeof(SBFullHash)), 0); 487c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(full_hashes[0].list_name, "goog-phish-shavar"); 488c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(memcmp(&full_hashes[1].hash, 489c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "00001111222233334444555566667777", 490c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch sizeof(SBFullHash)), 0); 491c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(full_hashes[1].list_name, "goog-phish-shavar"); 492c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(memcmp(&full_hashes[2].hash, 493c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "ffffeeeeddddccccbbbbaaaa99998888", 494c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch sizeof(SBFullHash)), 0); 495c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(full_hashes[2].list_name, "goog-phish-shavar"); 496c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 497c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Test multiple lists in the GetHash results. 498c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::string get_hash2("goog-phish-shavar:19:32\n" 499c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "00112233445566778899aabbccddeeff" 500c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "goog-malware-shavar:19:64\n" 501c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "cafebeefcafebeefdeaddeaddeaddead" 502c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "zzzzyyyyxxxxwwwwvvvvuuuuttttssss"); 503c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(parser.ParseGetHash(get_hash2.data(), 504c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch static_cast<int>(get_hash2.length()), "", 505c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch &re_key, 506c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch &full_hashes)); 507c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 508c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(re_key); 50972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_EQ(full_hashes.size(), 3U); 510c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(memcmp(&full_hashes[0].hash, 511c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "00112233445566778899aabbccddeeff", 512c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch sizeof(SBFullHash)), 0); 513c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(full_hashes[0].list_name, "goog-phish-shavar"); 514c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(memcmp(&full_hashes[1].hash, 515c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "cafebeefcafebeefdeaddeaddeaddead", 516c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch sizeof(SBFullHash)), 0); 517c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(full_hashes[1].list_name, "goog-malware-shavar"); 518c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(memcmp(&full_hashes[2].hash, 519c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "zzzzyyyyxxxxwwwwvvvvuuuuttttssss", 520c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch sizeof(SBFullHash)), 0); 521c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(full_hashes[2].list_name, "goog-malware-shavar"); 522c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 523c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 524c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(SafeBrowsingProtocolParsingTest, TestGetHashWithMac) { 525c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const unsigned char get_hash[] = { 526c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 0x32, 0x56, 0x74, 0x6f, 0x6b, 0x36, 0x64, 0x41, 527c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 0x51, 0x72, 0x65, 0x51, 0x62, 0x38, 0x51, 0x68, 528c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 0x59, 0x45, 0x57, 0x51, 0x57, 0x4d, 0x52, 0x65, 529c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 0x42, 0x63, 0x41, 0x3d, 0x0a, 0x67, 0x6f, 0x6f, 530c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 0x67, 0x2d, 0x70, 0x68, 0x69, 0x73, 0x68, 0x2d, 531c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 0x73, 0x68, 0x61, 0x76, 0x61, 0x72, 0x3a, 0x36, 532c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 0x31, 0x36, 0x39, 0x3a, 0x33, 0x32, 0x0a, 0x17, 533c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 0x7f, 0x03, 0x42, 0x28, 0x1c, 0x31, 0xb9, 0x0b, 534c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 0x1c, 0x7b, 0x9d, 0xaf, 0x7b, 0x43, 0x99, 0x10, 535c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 0xc1, 0xab, 0xe3, 0x1b, 0x35, 0x80, 0x38, 0x96, 536c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 0xf9, 0x44, 0x4f, 0x28, 0xb4, 0xeb, 0x45 537c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch }; 538c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 539c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const unsigned char hash_result[] = { 540c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 0x17, 0x7f, 0x03, 0x42, 0x28, 0x1c, 0x31, 0xb9, 541c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 0x0b, 0x1c, 0x7b, 0x9d, 0xaf, 0x7b, 0x43, 0x99, 542c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 0x10, 0xc1, 0xab, 0xe3, 0x1b, 0x35, 0x80, 0x38, 543c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 0x96, 0xf9, 0x44, 0x4f, 0x28, 0xb4, 0xeb, 0x45 544c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch }; 545c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 546c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const std::string key = "58Lqn5WIP961x3zuLGo5Uw=="; 547c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::vector<SBFullHashResult> full_hashes; 548c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool re_key = false; 549c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SafeBrowsingProtocolParser parser; 550c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(parser.ParseGetHash(reinterpret_cast<const char*>(get_hash), 551c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch sizeof(get_hash), 552c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch key, 553c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch &re_key, 554c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch &full_hashes)); 555c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(re_key); 55672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_EQ(full_hashes.size(), 1U); 557c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(memcmp(hash_result, &full_hashes[0].hash, sizeof(SBFullHash)), 0); 558c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 559c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 560c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(SafeBrowsingProtocolParsingTest, TestGetHashWithUnknownList) { 561c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::string hash_response = "goog-phish-shavar:1:32\n" 562c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "12345678901234567890123456789012" 563c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "googpub-phish-shavar:19:32\n" 564c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "09876543210987654321098765432109"; 565c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool re_key = false; 566c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::string key = ""; 567c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::vector<SBFullHashResult> full_hashes; 568c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SafeBrowsingProtocolParser parser; 569c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(parser.ParseGetHash(hash_response.data(), 570c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch hash_response.size(), 571c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch key, 572c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch &re_key, 573c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch &full_hashes)); 574c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 57572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_EQ(full_hashes.size(), 1U); 576c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(memcmp("12345678901234567890123456789012", 577c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch &full_hashes[0].hash, sizeof(SBFullHash)), 0); 578c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(full_hashes[0].list_name, "goog-phish-shavar"); 579c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(full_hashes[0].add_chunk_id, 1); 580c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 581c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch hash_response += "goog-malware-shavar:7:32\n" 582c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "abcdefghijklmnopqrstuvwxyz123457"; 583c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch full_hashes.clear(); 584c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(parser.ParseGetHash(hash_response.data(), 585c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch hash_response.size(), 586c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch key, 587c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch &re_key, 588c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch &full_hashes)); 589c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 59072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_EQ(full_hashes.size(), 2U); 591c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(memcmp("12345678901234567890123456789012", 592c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch &full_hashes[0].hash, sizeof(SBFullHash)), 0); 593c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(full_hashes[0].list_name, "goog-phish-shavar"); 594c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(full_hashes[0].add_chunk_id, 1); 595c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(memcmp("abcdefghijklmnopqrstuvwxyz123457", 596c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch &full_hashes[1].hash, sizeof(SBFullHash)), 0); 597c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(full_hashes[1].list_name, "goog-malware-shavar"); 598c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(full_hashes[1].add_chunk_id, 7); 599c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 600c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 601c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(SafeBrowsingProtocolParsingTest, TestFormatHash) { 602c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SafeBrowsingProtocolParser parser; 603c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::vector<SBPrefix> prefixes; 604c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::string get_hash; 605c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 606c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch prefixes.push_back(0x34333231); 607c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch prefixes.push_back(0x64636261); 608c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch prefixes.push_back(0x73727170); 609c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 610c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch parser.FormatGetHash(prefixes, &get_hash); 611c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(get_hash, "4:12\n1234abcdpqrs"); 612c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 613c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 614c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(SafeBrowsingProtocolParsingTest, TestGetKey) { 615c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SafeBrowsingProtocolParser parser; 616c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::string key_response("clientkey:10:0123456789\n" 617c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "wrappedkey:20:abcdefghijklmnopqrst\n"); 618c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 619c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::string client_key, wrapped_key; 620c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(parser.ParseNewKey(key_response.data(), 621c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch static_cast<int>(key_response.length()), 622c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch &client_key, 623c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch &wrapped_key)); 624c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 625c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(client_key, "0123456789"); 626c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(wrapped_key, "abcdefghijklmnopqrst"); 627c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 628c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 629c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(SafeBrowsingProtocolParsingTest, TestReKey) { 630c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SafeBrowsingProtocolParser parser; 631c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::string update("n:1800\ni:phishy\ne:pleaserekey\n"); 632c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 633c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool re_key = false; 634c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool reset = false; 635c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int next_update = -1; 636c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::vector<SBChunkDelete> deletes; 637c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::vector<ChunkUrl> urls; 638c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(parser.ParseUpdate(update.data(), 639c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch static_cast<int>(update.size()), "", 640c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch &next_update, &re_key, 641c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch &reset, &deletes, &urls)); 642c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(re_key); 643c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 644c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 645c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(SafeBrowsingProtocolParsingTest, TestReset) { 646c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SafeBrowsingProtocolParser parser; 647c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::string update("n:1800\ni:phishy\nr:pleasereset\n"); 648c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 649c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool re_key = false; 650c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool reset = false; 651c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int next_update = -1; 652c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::vector<SBChunkDelete> deletes; 653c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::vector<ChunkUrl> urls; 654c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(parser.ParseUpdate(update.data(), 655c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch static_cast<int>(update.size()), "", 656c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch &next_update, &re_key, 657c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch &reset, &deletes, &urls)); 658c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(reset); 659c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 660c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 661c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// The SafeBrowsing service will occasionally send zero length chunks so that 662c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// client requests will have longer contiguous chunk number ranges, and thus 663c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// reduce the request size. 664c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(SafeBrowsingProtocolParsingTest, TestZeroSizeAddChunk) { 665c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::string add_chunk("a:1:4:0\n"); 666c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SafeBrowsingProtocolParser parser; 667c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool re_key = false; 668c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SBChunkList chunks; 669c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 67072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen bool result = parser.ParseChunk( 67172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen safe_browsing_util::kMalwareList, 67272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen add_chunk.data(), 67372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen static_cast<int>(add_chunk.length()), 67472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen "", "", &re_key, &chunks); 675c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(result); 67672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_EQ(chunks.size(), 1U); 677c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(chunks[0].chunk_number, 1); 67872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_EQ(chunks[0].hosts.size(), 0U); 679c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 680c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Now test a zero size chunk in between normal chunks. 681c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch chunks.clear(); 682c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::string add_chunks("a:1:4:18\n1234\001abcd5678\001wxyz" 683c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "a:2:4:0\n" 684c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "a:3:4:9\ncafe\001beef"); 68572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen result = parser.ParseChunk( 68672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen safe_browsing_util::kMalwareList, 68772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen add_chunks.data(), 68872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen static_cast<int>(add_chunks.length()), 68972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen "", "", &re_key, &chunks); 690c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(result); 69172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_EQ(chunks.size(), 3U); 692c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 693c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // See that each chunk has the right content. 694c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(chunks[0].chunk_number, 1); 69572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_EQ(chunks[0].hosts.size(), 2U); 696c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(chunks[0].hosts[0].host, 0x34333231); 697c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(chunks[0].hosts[0].entry->PrefixAt(0), 0x64636261); 698c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(chunks[0].hosts[1].host, 0x38373635); 699c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(chunks[0].hosts[1].entry->PrefixAt(0), 0x7a797877); 700c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 701c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(chunks[1].chunk_number, 2); 70272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_EQ(chunks[1].hosts.size(), 0U); 703c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 704c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(chunks[2].chunk_number, 3); 70572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_EQ(chunks[2].hosts.size(), 1U); 706c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(chunks[2].hosts[0].host, 0x65666163); 707c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(chunks[2].hosts[0].entry->PrefixAt(0), 0x66656562); 708c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 709c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 710c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Test parsing a zero sized sub chunk. 711c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(SafeBrowsingProtocolParsingTest, TestZeroSizeSubChunk) { 712c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::string sub_chunk("s:9:4:0\n"); 713c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SafeBrowsingProtocolParser parser; 714c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool re_key = false; 715c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SBChunkList chunks; 716c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 71772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen bool result = parser.ParseChunk( 71872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen safe_browsing_util::kMalwareList, 71972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen sub_chunk.data(), 72072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen static_cast<int>(sub_chunk.length()), 72172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen "", "", &re_key, &chunks); 722c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(result); 72372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_EQ(chunks.size(), 1U); 724c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(chunks[0].chunk_number, 9); 72572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_EQ(chunks[0].hosts.size(), 0U); 726c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch chunks.clear(); 727c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 728c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Test parsing a zero sized sub chunk mixed in with content carrying chunks. 729c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::string sub_chunks("s:1:4:9\nabcdxwxyz" 730c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "s:2:4:0\n" 731c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "s:3:4:26\nefgh\0011234pqrscafe\0015678lmno"); 732c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch sub_chunks[12] = '\0'; 733c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 73472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen result = parser.ParseChunk( 73572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen safe_browsing_util::kMalwareList, 73672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen sub_chunks.data(), 73772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen static_cast<int>(sub_chunks.length()), 73872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen "", "", &re_key, &chunks); 739c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(result); 740c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 741c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(chunks[0].chunk_number, 1); 74272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_EQ(chunks[0].hosts.size(), 1U); 743c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(chunks[0].hosts[0].host, 0x64636261); 744c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(chunks[0].hosts[0].entry->prefix_count(), 0); 745c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 746c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(chunks[1].chunk_number, 2); 74772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_EQ(chunks[1].hosts.size(), 0U); 748c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 749c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(chunks[2].chunk_number, 3); 75072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_EQ(chunks[2].hosts.size(), 2U); 751c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(chunks[2].hosts[0].host, 0x68676665); 752c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(chunks[2].hosts[0].entry->prefix_count(), 1); 753c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(chunks[2].hosts[0].entry->PrefixAt(0), 0x73727170); 754c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(chunks[2].hosts[0].entry->ChunkIdAtPrefix(0), 0x31323334); 755c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(chunks[2].hosts[1].host, 0x65666163); 756c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(chunks[2].hosts[1].entry->prefix_count(), 1); 757c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(chunks[2].hosts[1].entry->PrefixAt(0), 0x6f6e6d6c); 758c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(chunks[2].hosts[1].entry->ChunkIdAtPrefix(0), 0x35363738); 759c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 760c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 761c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(SafeBrowsingProtocolParsingTest, TestVerifyUpdateMac) { 762c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SafeBrowsingProtocolParser parser; 763c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 764c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const std::string update = 765c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "m:XIU0LiQhAPJq6dynXwHbygjS5tw=\n" 766c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "n:1895\n" 767c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "i:goog-phish-shavar\n" 768c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "u:s.ytimg.com/safebrowsing/rd/goog-phish-shavar_s_6501-6505:6501-6505," 769c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "pcY6iVeT9-CBQ3fdAF0rpnKjR1Y=\n" 770c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "u:s.ytimg.com/safebrowsing/rd/goog-phish-shavar_s_6506-6510:6506-6510," 771c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "SDBrYC3rX3KEPe72LOypnP6QYac=\n" 772c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "u:s.ytimg.com/safebrowsing/rd/goog-phish-shavar_s_6511-6520:6511-6520," 773c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "9UQo-e7OkcsXT2wFWTAhOuWOsUs=\n" 774c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "u:s.ytimg.com/safebrowsing/rd/goog-phish-shavar_s_6521-6560:6521-6560," 775c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "qVNw6JIpR1q6PIXST7J4LJ9n3Zg=\n" 776c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "u:s.ytimg.com/safebrowsing/rd/goog-phish-shavar_s_6561-6720:6561-6720," 777c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "7OiJvCbiwvpzPITW-hQohY5NHuc=\n" 778c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "u:s.ytimg.com/safebrowsing/rd/goog-phish-shavar_s_6721-6880:6721-6880," 779c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "oBS3svhoi9deIa0sWZ_gnD0ujj8=\n" 780c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "u:s.ytimg.com/safebrowsing/rd/goog-phish-shavar_s_6881-7040:6881-7040," 781c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "a0r8Xit4VvH39xgyQHZTPczKBIE=\n" 782c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "u:s.ytimg.com/safebrowsing/rd/goog-phish-shavar_s_7041-7200:7041-7163," 783c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "q538LChutGknBw55s6kcE2wTcvU=\n" 784c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "u:s.ytimg.com/safebrowsing/rd/goog-phish-shavar_a_8001-8160:8001-8024," 785c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "8026-8045,8048-8049,8051-8134,8136-8152,8155-8160," 786c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "j6XXAEWnjYk9tVVLBSdQvIEq2Wg=\n" 787c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "u:s.ytimg.com/safebrowsing/rd/goog-phish-shavar_a_8161-8320:8161-8215," 788c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "8217-8222,8224-8320,YaNfiqdQOt-uLCLWVLj46AZpAjQ=\n" 789c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "u:s.ytimg.com/safebrowsing/rd/goog-phish-shavar_a_8321-8480:8321-8391," 790c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "8393-8399,8402,8404-8419,8421-8425,8427,8431-8433,8435-8439,8441-8443," 791c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "8445-8446,8448-8480,ALj31GQMwGiIeU3bM2ZYKITfU-U=\n" 792c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "u:s.ytimg.com/safebrowsing/rd/goog-phish-shavar_a_8481-8640:8481-8500," 793c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "8502-8508,8510-8511,8513-8517,8519-8525,8527-8531,8533,8536-8539," 794c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "8541-8576,8578-8638,8640,TlQYRmS_kZ5PBAUIUyNQDq0Jprs=\n" 795c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "u:s.ytimg.com/safebrowsing/rd/goog-phish-shavar_a_8641-8800:8641-8689," 796c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch "8691-8731,8733-8786,x1Qf7hdNrO8b6yym03ZzNydDS1o=\n"; 797c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 798c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool re_key = false; 799c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool reset = false; 800c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int next_update = -1; 801c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::vector<SBChunkDelete> deletes; 802c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::vector<ChunkUrl> urls; 803c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const std::string key("58Lqn5WIP961x3zuLGo5Uw=="); 804c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(parser.ParseUpdate(update.data(), 805c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch static_cast<int>(update.size()), key, 806c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch &next_update, &re_key, 807c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch &reset, &deletes, &urls)); 808c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(re_key); 809c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(next_update, 1895); 810c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 811c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 812c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(SafeBrowsingProtocolParsingTest, TestVerifyChunkMac) { 813c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SafeBrowsingProtocolParser parser; 814c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 815c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const unsigned char chunk[] = { 816c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 0x73, 0x3a, 0x32, 0x30, 0x30, 0x32, 0x3a, 0x34, 817c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 0x3a, 0x32, 0x32, 0x0a, 0x2f, 0x4f, 0x89, 0x7a, 818c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 0x01, 0x00, 0x00, 0x0a, 0x59, 0xc8, 0x71, 0xdf, 819c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 0x9d, 0x29, 0x0c, 0xba, 0xd7, 0x00, 0x00, 0x00, 820c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 0x0a, 0x59 821c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch }; 822c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 823c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool re_key = false; 824c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch SBChunkList chunks; 825c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const std::string key("v_aDSz6jI92WeHCOoZ07QA=="); 826c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const std::string mac("W9Xp2fUcQ9V66If6Cvsrstpa4Kk="); 827c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 82872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_TRUE(parser.ParseChunk( 82972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen safe_browsing_util::kMalwareList, 83072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen reinterpret_cast<const char*>(chunk), 83172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen sizeof(chunk), key, mac, 83272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen &re_key, &chunks)); 83372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_FALSE(re_key); 83472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 83572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 83672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenTEST(SafeBrowsingProtocolParsingTest, TestAddBinHashChunks) { 83772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen std::string add_chunk("a:1:4:16\naaaabbbbccccdddd" 83872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen "a:2:4:8\n11112222"); 83972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // Run the parse. 84072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen SafeBrowsingProtocolParser parser; 84172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen bool re_key = false; 84272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen SBChunkList chunks; 84372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen bool result = parser.ParseChunk( 84472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen safe_browsing_util::kBinHashList, 84572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen add_chunk.data(), 84672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen static_cast<int>(add_chunk.length()), 84772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen "", "", &re_key, &chunks); 84872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_TRUE(result); 84972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_FALSE(re_key); 85072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_EQ(chunks.size(), 2U); 85172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_EQ(chunks[0].chunk_number, 1); 85272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_EQ(chunks[0].hosts.size(), 1U); 85372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 85472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_EQ(chunks[0].hosts[0].host, 0); 85572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen SBEntry* entry = chunks[0].hosts[0].entry; 85672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_TRUE(entry->IsAdd()); 85772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_TRUE(entry->IsPrefix()); 85872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_EQ(entry->prefix_count(), 4); 85972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 86072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_EQ(chunks[1].chunk_number, 2); 86172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_EQ(chunks[1].hosts.size(), 1U); 86272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 86372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_EQ(chunks[1].hosts[0].host, 0); 86472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen entry = chunks[1].hosts[0].entry; 86572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_TRUE(entry->IsAdd()); 86672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_TRUE(entry->IsPrefix()); 86772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_EQ(entry->prefix_count(), 2); 86872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_EQ(entry->PrefixAt(0), 0x31313131); 86972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_EQ(entry->PrefixAt(1), 0x32323232); 87072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 87172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 87272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Test parsing one add chunk where a hostkey spans several entries. 87372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenTEST(SafeBrowsingProtocolParsingTest, TestAddBigBinHashChunk) { 87472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen std::string add_chunk("a:1:4:1028\n"); 87572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen for (int i = 0; i < 257; ++i) 87672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen add_chunk.append(StringPrintf("%04d", i)); 87772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 87872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen SafeBrowsingProtocolParser parser; 87972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen bool re_key = false; 88072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen SBChunkList chunks; 88172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen bool result = parser.ParseChunk( 88272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen safe_browsing_util::kBinHashList, 88372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen add_chunk.data(), 88472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen static_cast<int>(add_chunk.length()), 88572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen "", "", &re_key, &chunks); 88672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_TRUE(result); 88772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_FALSE(re_key); 88872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_EQ(chunks.size(), 1U); 88972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_EQ(chunks[0].chunk_number, 1); 89072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 89172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_EQ(chunks[0].hosts.size(), 1U); 89272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 89372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen const SBChunkHost& host0 = chunks[0].hosts[0]; 89472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_EQ(host0.host, 0); 89572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_EQ(host0.entry->prefix_count(), 257); 89672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 89772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 89872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Test parsing one sub chunk. 89972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenTEST(SafeBrowsingProtocolParsingTest, TestSubBinHashChunk) { 90072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen std::string sub_chunk("s:9:4:16\n1111mmmm2222nnnn"); 90172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 90272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // Run the parser. 90372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen SafeBrowsingProtocolParser parser; 90472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen bool re_key = false; 90572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen SBChunkList chunks; 90672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen bool result = parser.ParseChunk( 90772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen safe_browsing_util::kBinHashList, 90872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen sub_chunk.data(), 90972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen static_cast<int>(sub_chunk.length()), 91072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen "", "", &re_key, &chunks); 91172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_TRUE(result); 912c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_FALSE(re_key); 91372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_EQ(chunks.size(), 1U); 91472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_EQ(chunks[0].chunk_number, 9); 91572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_EQ(chunks[0].hosts.size(), 1U); 91672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 91772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_EQ(chunks[0].hosts[0].host, 0); 91872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen SBEntry* entry = chunks[0].hosts[0].entry; 91972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_TRUE(entry->IsSub()); 92072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_TRUE(entry->IsPrefix()); 92172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_EQ(entry->prefix_count(), 2); 92272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_EQ(entry->ChunkIdAtPrefix(0), 0x31313131); 92372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_EQ(entry->PrefixAt(0), 0x6d6d6d6d); 92472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_EQ(entry->ChunkIdAtPrefix(1), 0x32323232); 92572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_EQ(entry->PrefixAt(1), 0x6e6e6e6e); 926c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 927