| // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef CHROME_BROWSER_SAFE_BROWSING_PROTOCOL_PARSER_H_ |
| #define CHROME_BROWSER_SAFE_BROWSING_PROTOCOL_PARSER_H_ |
| #pragma once |
| |
| // Parse the data returned from the chunk response. |
| // |
| // Based on the SafeBrowsing v2.1 protocol: |
| // http://code.google.com/p/google-safe-browsing/wiki/Protocolv2Spec |
| // |
| // Read the response from a SafeBrowsing request, and parse into useful pieces. |
| // The protocol is generally line oriented, but can contain binary data in the |
| // actual chunk responses. The consumer of the protocol data should instantiate |
| // the parser and call the appropriate parsing function on the data. |
| // |
| // Examples of protocol responses: |
| // |
| // 1. List identification |
| // i:goog-phish-shavar\n |
| // <command>:<command_data>\n |
| // |
| // 2. Minimum time to wait (seconds) until the next download request can be made |
| // n:1200\n |
| // <command>:<time_in_seconds>\n |
| // |
| // 3. Redirect URL for retrieving a chunk |
| // u:cache.googlevideo.com/safebrowsing/rd/goog-phish-shavar_a_1\n |
| // <command>:<url>\n |
| // |
| // 4. Add and sub chunks |
| // a:1:4:523\n... <-- Add chunk + binary data |
| // s:13:4:17\n... <-- Sub chunk + binary data |
| // <chunk_type>:<chunk_number>:<prefix_len>:<chunk_bytes>\n<binary_data> |
| // |
| // 5. Add-del and sub-del requests |
| // ad:1-4000,5001\n <-- Add-del |
| // sd:1,3,5,7,903\n <-- Sub-del |
| // <command>:<chunk_range>\n |
| |
| |
| #include <string> |
| #include <vector> |
| |
| #include "base/basictypes.h" |
| #include "chrome/browser/safe_browsing/chunk_range.h" |
| #include "chrome/browser/safe_browsing/safe_browsing_util.h" |
| |
| |
| class SafeBrowsingProtocolParser { |
| public: |
| SafeBrowsingProtocolParser(); |
| |
| // Parse the response of an update request. Results for chunk deletions (both |
| // add-del and sub-del are returned in 'chunk_deletes', and new chunk URLs to |
| // download are contained in 'chunk_urls'. The next time the client is allowed |
| // to request another update is returned in 'next_update_sec'. If the service |
| // wants us to retrieve new MAC keys, 're_key' will be set to true. If we are |
| // using MACs to verify responses, the 'key' must be set to the private key |
| // returned from the SafeBrowsing servers. 'reset' will be set to true if the |
| // SafeBrowsing service wants us to dump our database. |
| // Returns 'true'if it was able to decode the chunk properly, 'false' if not |
| // decoded properly and the results should be ignored. |
| bool ParseUpdate(const char* chunk_data, |
| int chunk_len, |
| const std::string& key, |
| int* next_update_sec, |
| bool* re_key, |
| bool* reset, |
| std::vector<SBChunkDelete>* chunk_deletes, |
| std::vector<ChunkUrl>* chunk_urls); |
| |
| // Parse the response from a chunk URL request and returns the hosts/prefixes |
| // for adds and subs in "chunks". Returns 'true' on successful parsing, |
| // 'false' otherwise. Any result should be ignored when a parse has failed. |
| bool ParseChunk(const std::string& list_name, |
| const char* chunk_data, |
| int chunk_len, |
| const std::string& key, |
| const std::string& mac, |
| bool* re_key, |
| SBChunkList* chunks); |
| |
| // Parse the result of a GetHash request, returning the list of full hashes. |
| // If we are checking for valid MACs, the caller should populate 'key'. |
| bool ParseGetHash(const char* chunk_data, |
| int chunk_len, |
| const std::string& key, |
| bool* re_key, |
| std::vector<SBFullHashResult>* full_hashes); |
| |
| // Convert a list of partial hashes into a proper GetHash request. |
| void FormatGetHash(const std::vector<SBPrefix>& prefixes, |
| std::string* request); |
| |
| // Parse the keys used for subsequent communications with the SafeBrowsing |
| // servers. Returns true on successful parse, false on parse error. |
| bool ParseNewKey(const char* chunk_data, |
| int chunk_length, |
| std::string* client_key, |
| std::string* wrapped_key); |
| |
| private: |
| bool ParseAddChunk(const std::string& list_name, |
| const char* data, |
| int data_len, |
| int hash_len, |
| std::deque<SBChunkHost>* hosts); |
| bool ParseSubChunk(const std::string& list_name, |
| const char* data, |
| int data_len, |
| int hash_len, |
| std::deque<SBChunkHost>* hosts); |
| |
| // Helper functions used by ParseAddChunk and ParseSubChunk. |
| static void ReadHostAndPrefixCount(const char** data, |
| int* remaining, |
| SBPrefix* host, |
| int* count); |
| static int ReadChunkId(const char** data, int* remaining); |
| static bool ReadPrefixes( |
| const char** data, int* remaining, SBEntry* entry, int count); |
| |
| // The name of the current list |
| std::string list_name_; |
| |
| DISALLOW_COPY_AND_ASSIGN(SafeBrowsingProtocolParser); |
| }; |
| |
| |
| #endif // CHROME_BROWSER_SAFE_BROWSING_PROTOCOL_PARSER_H_ |