// Copyright 2022 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_BROWSING_TOPICS_UTIL_H_ #define COMPONENTS_BROWSING_TOPICS_UTIL_H_ #include "base/containers/span.h" #include "base/time/time.h" #include "components/browsing_topics/common/common_types.h" #include "third_party/abseil-cpp/absl/types/optional.h" namespace browsing_topics { using HmacKey = std::array; using ReadOnlyHmacKey = base::span; // Get the size of the taxonomy. This is used for generating random topics from // [1, `GetTaxonomySize()`]. It returns nullopt if this Chrome binary does not // support the finch configured taxonomy version // `kBrowsingTopicsTaxonomyVersion`. // // TODO(yaoxia): this should be maintained by UX along with the string mappings. // Consider moving to a UX component. absl::optional GetTaxonomySize(); // Generate a 256 bit random hmac key. HmacKey GenerateRandomHmacKey(); // Returns a per-user, per-epoch hash of `top_domain` for the purpose of // deciding whether to return the random or top topic. The `hmac_key` is // per-use and `epoch_calculation_time` represents the epoch. uint64_t HashTopDomainForRandomOrTopTopicDecision( ReadOnlyHmacKey hmac_key, base::Time epoch_calculation_time, const std::string& top_domain); // Returns a per-user, per-epoch hash of `top_domain` for the purpose of // deciding which random topic among the full taxonomy should be returned. The // `hmac_key` is per-use and `epoch_calculation_time` represents the epoch. uint64_t HashTopDomainForRandomTopicIndexDecision( ReadOnlyHmacKey hmac_key, base::Time epoch_calculation_time, const std::string& top_domain); // Returns a per-user, per-epoch hash of `top_domain` for the purpose of // deciding which top topic to return. The `hmac_key` is per-user and // `epoch_calculation_time` represents the epoch. uint64_t HashTopDomainForTopTopicIndexDecision( ReadOnlyHmacKey hmac_key, base::Time epoch_calculation_time, const std::string& top_domain); // Returns a per-user hash of `top_domain` for the purpose of deciding the epoch // switch-over time. The `hmac_key` is per-user. uint64_t HashTopDomainForEpochSwitchTimeDecision(ReadOnlyHmacKey hmac_key, const std::string& top_domain); // Returns a per-user hash of `context_domain` to be stored more efficiently in // disk and memory. The `hmac_key` is per-user. A per-user hash is necessary to // prevent a context from learning the topics that don't belong to it via // collision attack. HashedDomain HashContextDomainForStorage(ReadOnlyHmacKey hmac_key, const std::string& context_domain); // Returns a hash of `main_frame_host` to be stored more efficiently in disk and // memory. HashedHost HashMainFrameHostForStorage(const std::string& main_frame_host); // Returns the maximum of |`calculation_time` - history data time range|, and // |data_accessible_since|. base::Time DeriveHistoryDataStartTime( base::Time calculation_time, base::Time data_accessible_since = base::Time()); // Returns the maximum of |`calculation_time` - api usage data time range|, // and |data_accessible_since|. base::Time DeriveApiUsageContextDataStartTime( base::Time calculation_time, base::Time data_accessible_since = base::Time()); // Override the key to be returned for subsequent invocations of // `GenerateRandomHmacKey()`. void OverrideHmacKeyForTesting(ReadOnlyHmacKey hmac_key); } // namespace browsing_topics #endif // COMPONENTS_BROWSING_TOPICS_UTIL_H_