1cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 2a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// found in the LICENSE file. 4a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 5cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#ifndef COMPONENTS_VARIATIONS_CACHING_PERMUTED_ENTROPY_PROVIDER_H_ 6cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#define COMPONENTS_VARIATIONS_CACHING_PERMUTED_ENTROPY_PROVIDER_H_ 7a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 8a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "base/basictypes.h" 9a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "base/compiler_specific.h" 10a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "base/threading/thread_checker.h" 11424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)#include "components/variations/entropy_provider.h" 12cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "components/variations/proto/permuted_entropy_cache.pb.h" 13a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 14a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)class PrefService; 15a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)class PrefRegistrySimple; 16a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 17a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)namespace metrics { 18a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 19a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// CachingPermutedEntropyProvider is an entropy provider that uses the same 20a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// algorithm as the PermutedEntropyProvider, but caches the results in Local 21a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// State between runs. 22a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)class CachingPermutedEntropyProvider : public PermutedEntropyProvider { 23a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) public: 24a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Creates a CachingPermutedEntropyProvider using the given |local_state| 25a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // prefs service with the specified |low_entropy_source|, which should have a 26a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // value in the range of [0, low_entropy_source_max). 27a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) CachingPermutedEntropyProvider(PrefService* local_state, 28a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) uint16 low_entropy_source, 29a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) size_t low_entropy_source_max); 30a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) virtual ~CachingPermutedEntropyProvider(); 31a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 32a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Registers pref keys used by this class in the Local State pref registry. 33a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) static void RegisterPrefs(PrefRegistrySimple* registry); 34a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 35a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Clears the cache in local state. Should be called when the low entropy 36a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // source value gets reset. 37a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) static void ClearCache(PrefService* local_state); 38a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 39a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) private: 40a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // PermutedEntropyProvider overrides: 41a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) virtual uint16 GetPermutedValue(uint32 randomization_seed) const OVERRIDE; 42a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 43a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Reads the cache from local state. 44a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) void ReadFromLocalState() const; 45a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 46a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Updates local state with the state of the cache. 47a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) void UpdateLocalState() const; 48a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 49a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Adds |randomization_seed| -> |value| to the cache. 50a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) void AddToCache(uint32 randomization_seed, uint16 value) const; 51a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 52a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // Finds the value corresponding to |randomization_seed|, setting |value| and 53a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) // returning true if found. 54a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) bool FindValue(uint32 randomization_seed, uint16* value) const; 55a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 56a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::ThreadChecker thread_checker_; 57a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) PrefService* local_state_; 58a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) mutable PermutedEntropyCache cache_; 59a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 60a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(CachingPermutedEntropyProvider); 61a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}; 62a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 63a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} // namespace metrics 64a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 65cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#endif // COMPONENTS_VARIATIONS_CACHING_PERMUTED_ENTROPY_PROVIDER_H_ 66