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