Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(552)

Unified Diff: components/data_reduction_proxy/browser/data_reduction_proxy_tamper_detect.h

Issue 338483002: Chrome Participated Tamper Detect (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: components/data_reduction_proxy/browser/data_reduction_proxy_tamper_detect.h
diff --git a/components/data_reduction_proxy/browser/data_reduction_proxy_tamper_detect.h b/components/data_reduction_proxy/browser/data_reduction_proxy_tamper_detect.h
new file mode 100644
index 0000000000000000000000000000000000000000..ab50070057baf7aaca9793d172e724b16674e655
--- /dev/null
+++ b/components/data_reduction_proxy/browser/data_reduction_proxy_tamper_detect.h
@@ -0,0 +1,124 @@
+// Copyright 2014 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 COMPONENTS_DATA_REDUCTION_PROXY_BROWSER_DATA_REDUCTION_PROXY_TAMPER_DETECT_H_
+#define COMPONENTS_DATA_REDUCTION_PROXY_BROWSER_DATA_REDUCTION_PROXY_TAMPER_DETECT_H_
+
+#include "components/data_reduction_proxy/common/data_reduction_proxy_headers.h"
+
+#include "net/http/http_response_headers.h"
+
+namespace data_reduction_proxy {
+
+// The class for detecting tampering.
+// For each type of fingerprint, we have a pair of functions:
+// * checking function: returns true if such fingerprint got tampered;
+// (function name Is...Tampered)
+// * reporting function: reporting tampering to corresponding UMA.
+// (function name Report...TamperedUMA)
+class DataReductionProxyTamperDetect {
+ public:
+ DataReductionProxyTamperDetect(
+ const net::HttpResponseHeaders* response_headers,
+ bool is_secure_scheme,
+ unsigned mcc_mnc,
+ std::vector<std::string>* chrome_proxy_header_values);
+
+ virtual ~DataReductionProxyTamperDetect();
+
+ // The main function for detecting tampering, which takes two parameters:
+ // 1. a pointer to HttpResponseHeaders,
+ // 2. a boolean variable that indicates whether the connection between
+ // Chrome and data reduction proxy is on HTTPS or HTTP.
+ // The function checks whether there is a tamper detect request
+ // (i.e., contains fingerprints) from data reduction proxy, if so, it checks
+ // whether there are tampers and report the results to UMA.
+ static void CheckResponseFingerprint(const net::HttpResponseHeaders*, bool);
bolian 2014/07/09 22:51:06 Name the parameters.
xingx 2014/07/10 03:07:41 Done.
+
+ private:
+ friend class DataReductionProxyTamperDetectTest;
+ FRIEND_TEST_ALL_PREFIXES(DataReductionProxyTamperDetectTest,
+ TestFingerprintCommon);
+ FRIEND_TEST_ALL_PREFIXES(DataReductionProxyTamperDetectTest,
+ ChromeProxy);
+ FRIEND_TEST_ALL_PREFIXES(DataReductionProxyTamperDetectTest,
+ Via);
+ FRIEND_TEST_ALL_PREFIXES(DataReductionProxyTamperDetectTest,
+ OtherHeaders);
+ FRIEND_TEST_ALL_PREFIXES(DataReductionProxyTamperDetectTest,
+ ContentLength);
+ FRIEND_TEST_ALL_PREFIXES(DataReductionProxyTamperDetectTest,
+ Parsing);
+ FRIEND_TEST_ALL_PREFIXES(DataReductionProxyTamperDetectTest,
+ Completed);
+
+ // Enum for each fingerprint type.
+ enum FingerprintCode { CHROMEPROXY,
+ VIA,
+ OTHERHEADERS,
+ CONTENTLENGTH,
+ NONEXIST };
+
+ // Returns true if the Chrome-Proxy header has been tampered.
+ bool IsChromeProxyHeaderTampered(const std::string& fingerprint) const;
+
+ // Returns true if the Via header has been tampered.
+ bool IsViaHeaderTampered(const std::string& fingerprint) const;
+ // Report UMA for tampering of the Via header.
bolian 2014/07/09 22:51:06 s/Report/Reports/ here and below.
xingx 2014/07/10 03:07:41 Done.
+ void ReportViaHeaderTamperedUMA() const;
+
+ // Returns true if other headers (a list of headers) have been tampered.
bolian 2014/07/09 22:51:06 How about // Returns true if a list of server def
xingx 2014/07/10 03:07:41 Done.
+ bool AreOtherHeadersTampered(const std::string& fingerprint) const;
+ // Report UMA for tampering of values of the list of headers.
+ void ReportOtherHeadersTamperedUMA() const;
+
+ // Returns true if Content-Length has been tampered.
+ bool IsContentLengthHeaderTampered(const std::string& fingerprint) const;
+ // Report UMA for tampering of Content-Length.
+ void ReportContentLengthHeaderTamperedUMA() const;
+
+ // Return fingerprint code (enum) for the given fingerprint tag.
bolian 2014/07/09 22:51:06 Returns
xingx 2014/07/10 03:07:41 Done.
+ FingerprintCode GetFingerprintCode(const std::string& fingerprint_tag);
+
+ // Utility function. Check whether values of a header field |values| contains
+ // the Chrome-Proxy header's fingerprint. If it does, return true, and save
+ // Chrome-Proxy header's fingerprint to |chrome_proxy_fingerprint|; also save
+ // other fingerprints to |other_fingerprints|. Return false if there is no
+ // Chrome-Proxy header fingerprint found.
+ static bool ContainsTamperDetectFingerprints(std::vector<std::string>* values,
+ std::string* chrome_proxy_fingerprint,
+ std::string* other_fingerprints);
+
+ // Utility function. Return string of sorted values of |values|.
+ static std::string ValuesToSortedString(std::vector<std::string> &values);
+
+ // Utility function. Return MD5 hash value for a given string |input|.
+ // We need raw MD5 hash value so it's different to MD5String which is base16
+ // encoded. It's similar to MD5Sum but with digest converted to string.
+ static std::string GetMD5(const std::string& input);
+
+ // Utility function. Return all the values of a header field |header_name|
+ // of the response header |headers|, as a vector.
+ static std::vector<std::string> GetHeaderValues(
+ const net::HttpResponseHeaders* headers, const std::string& header_name);
+
+ const net::HttpResponseHeaders* response_headers;
+
+ // The communication to data reduction proxy is on HTTPS or not.
+ const bool is_secure_scheme;
bolian 2014/07/09 22:51:06 // If true, the connection to the data reduction p
bolian 2014/07/09 22:51:06 Add trailing "_" to all private member vars.
xingx 2014/07/10 03:07:41 Done.
xingx 2014/07/10 03:07:41 Done.
+
+ // Carrier ID.
+ const unsigned mcc_mnc;
+
+ // Values for Chrome-Proxy header, with its fingerprint value removed.
+ // Save it as temporary result so we don't need to parse Chrome-Proxy header
+ // twice.
+ std::vector<std::string>* clean_chrome_proxy_header_values;
+
+ // Map a fingerprint tag (string) to a fingerprint code (enum).
+ std::map<std::string, FingerprintCode> fingperprint_tag_code_map;
+};
+
+} // namespace data_reduction_proxy
+#endif // COMPONENTS_DATA_REDUCTION_PROXY_BROWSER_DATA_REDUCTION_PROXY_TAMPER_DETECT_H_

Powered by Google App Engine
This is Rietveld 408576698