15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef CHROME_BROWSER_SAFE_BROWSING_PROTOCOL_PARSER_H_ 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROME_BROWSER_SAFE_BROWSING_PROTOCOL_PARSER_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// Parsers and formatters for SafeBrowsing v3.0 protocol: 91320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// https://developers.google.com/safe-browsing/developers_guide_v3 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 11f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// The quoted references are with respect to that document. 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string> 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector> 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h" 17f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "base/memory/scoped_vector.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/safe_browsing/safe_browsing_util.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 20f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)namespace base { 21f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)class TimeDelta; 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 24f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)namespace safe_browsing { 25f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 26f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// TODO(shess): Maybe the data/len pairs could be productively replaced with 27f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// const base::StringPiece&. 28f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 29f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// Parse body of "HTTP Response for Data". |*next_update_sec| is the minimum 30f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// delay to next update. |*reset| is set to true if the update requested a 31f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// database reset. |*chunk_deletes| receives add-del and sub-del requests, 32f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// while |*chunk_urls| receives the list of redirect urls to fetch. Returns 33f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// |false| if the update could not be decoded properly, in which case all 34f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// results should be discarded. 35f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)bool ParseUpdate(const char* chunk_data, 36f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) size_t chunk_len, 37f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) size_t* next_update_sec, 38f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) bool* reset, 39f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) std::vector<SBChunkDelete>* chunk_deletes, 40f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) std::vector<ChunkUrl>* chunk_urls); 41f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 42f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// Parse body of a redirect response. |*chunks| receives the parsed chunk data. 43f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// Returns |false| if the data could not be parsed correctly, in which case all 44f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// results should be discarded. 45f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)bool ParseChunk(const char* chunk_data, 46f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) size_t chunk_len, 47f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ScopedVector<SBChunkData>* chunks); 48f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 49f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// Parse body of "HTTP Response for Full-Length Hashes", returning the list of 50f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// full hashes. Returns |false| if the data could not be parsed correctly, in 51f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// which case all results should be discarded. 52f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)bool ParseGetHash(const char* chunk_data, 53f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) size_t chunk_len, 54f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::TimeDelta* cache_lifetime, 55f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) std::vector<SBFullHashResult>* full_hashes); 56f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 57f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// Convert prefix hashes into a "HTTP Request for Full-Length Hashes" body. 58f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)std::string FormatGetHash(const std::vector<SBPrefix>& prefixes); 59f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 60f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// Format the LIST part of "HTTP Request for Data" body. 61f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)std::string FormatList(const SBListChunkRanges& list); 62f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 63f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} // namespace safe_browsing 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // CHROME_BROWSER_SAFE_BROWSING_PROTOCOL_PARSER_H_ 66