Index: chrome/browser/prefs/pref_hash_calculator.cc |
diff --git a/chrome/browser/prefs/pref_hash_calculator.cc b/chrome/browser/prefs/pref_hash_calculator.cc |
index 4a787a8a1abb699d8a3447c3a34caf3eee638bb8..356502c205b7f15ac61b1fd77ba7331c60babc01 100644 |
--- a/chrome/browser/prefs/pref_hash_calculator.cc |
+++ b/chrome/browser/prefs/pref_hash_calculator.cc |
@@ -16,6 +16,17 @@ |
namespace { |
+// Calculates an HMAC of |message| using |key|, encoded as a hexadecimal string. |
+std::string GetHMACHex(const std::string& key, const std::string& message) { |
+ crypto::HMAC hmac(crypto::HMAC::SHA256); |
+ std::vector<uint8> digest(hmac.DigestLength()); |
gab
2014/01/07 19:18:07
This is nicer than the previous method hardcoding
erikwright (departed)
2014/01/08 22:11:24
We now have two HMAC calculations. They are virtua
gab
2014/01/08 23:48:20
Of course, my bad, I'd overlooked this initially.
|
+ if (!hmac.Init(key) || !hmac.Sign(message, &digest[0], digest.size())) { |
Bernhard Bauer
2014/01/07 19:20:45
When does this fail? Is it really necessary to han
erikwright (departed)
2014/01/08 22:11:24
It should presumably never fail, but it's inapprop
Bernhard Bauer
2014/01/09 08:51:35
Yes, but in production the code will look like thi
|
+ NOTREACHED(); |
+ return std::string(); |
+ } |
+ return base::HexEncode(digest.data(), digest.size()); |
+} |
+ |
// Renders |value| as a string. |value| may be NULL, in which case the result |
// is an empty string. |
std::string ValueAsString(const base::Value* value) { |
@@ -42,29 +53,40 @@ std::string CalculateFromValueAndComponents( |
const std::string& seed, |
const base::Value* value, |
const std::vector<std::string>& extra_components) { |
- static const size_t kSHA256DigestSize = 32; |
- |
std::string message = JoinString(extra_components, "") + ValueAsString(value); |
+ return GetHMACHex(seed, message); |
+} |
- crypto::HMAC hmac(crypto::HMAC::SHA256); |
- unsigned char digest[kSHA256DigestSize]; |
- if (!hmac.Init(seed) || !hmac.Sign(message, digest, arraysize(digest))) { |
- NOTREACHED(); |
- return std::string(); |
- } |
+// Calculate a hash using a deprecated hash algorithm. For validating old |
+// hashes during migration. |
+std::string CalculateLegacyHash( |
+ const std::string& seed, const base::Value* value) { |
+ return CalculateFromValueAndComponents( |
+ seed, value, std::vector<std::string>()); |
+} |
- return base::HexEncode(digest, arraysize(digest)); |
+// Generates a device ID based on the input device ID. The derived device ID has |
+// no useful properties beyond those of the input device ID except that it is |
+// consistent with previous implementations. |
+std::string GenerateDeviceIdLikePrefMetricsServiceDid( |
+ const std::string& original_device_id) { |
+ if (original_device_id.empty()) |
+ return std::string(); |
+ return StringToLowerASCII( |
+ GetHMACHex(original_device_id, "PrefMetricsService")); |
} |
} // namespace |
PrefHashCalculator::PrefHashCalculator(const std::string& seed, |
const std::string& device_id) |
- : seed_(seed), device_id_(device_id) {} |
+ : seed_(seed), |
+ device_id_(GenerateDeviceIdLikePrefMetricsServiceDid(device_id)) {} |
std::string PrefHashCalculator::Calculate(const std::string& path, |
const base::Value* value) const { |
std::vector<std::string> components; |
+ |
if (!device_id_.empty()) |
components.push_back(device_id_); |
components.push_back(path); |
@@ -77,14 +99,7 @@ PrefHashCalculator::ValidationResult PrefHashCalculator::Validate( |
const std::string& hash) const { |
if (hash == Calculate(path, value)) |
return VALID; |
- if (hash == CalculateLegacyHash(path, value)) |
+ if (hash == CalculateLegacyHash(seed_, value)) |
return VALID_LEGACY; |
return INVALID; |
} |
- |
-std::string PrefHashCalculator::CalculateLegacyHash( |
- const std::string& path, const base::Value* value) const { |
gab
2014/01/07 19:18:07
Why move this? The move doesn't appear to be relat
|
- return CalculateFromValueAndComponents(seed_, |
- value, |
- std::vector<std::string>()); |
-} |