// Copyright 2023 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "components/metrics/structured/lib/key_util.h" #include #include "base/check_op.h" #include "base/unguessable_token.h" namespace metrics::structured::util { namespace { constexpr std::string_view kKeyString = "key"; constexpr std::string_view kLastRotationString = "last_rotation"; constexpr std::string_view kRotationPeriodString = "rotation_period"; } // namespace std::string GenerateNewKey() { const std::string key = base::UnguessableToken::Create().ToString(); CHECK_EQ(key.size(), kKeySize); return key; } base::Value CreateValueFromKeyProto(const KeyProto& proto) { base::Value::Dict key = base::Value::Dict() .Set(kKeyString, proto.key()) // last_rotation and rotation_period are represented as int64's but // should never exceed int. .Set(kLastRotationString, static_cast(proto.last_rotation())) .Set(kRotationPeriodString, static_cast(proto.rotation_period())); return base::Value(std::move(key)); } std::optional CreateKeyProtoFromValue( const base::Value::Dict& value) { const std::string* key = value.FindString(kKeyString); if (!key) { return std::nullopt; } std::optional last_rotation = value.FindInt(kLastRotationString); if (!last_rotation.has_value()) { return std::nullopt; } std::optional rotation_period = value.FindInt(kRotationPeriodString); if (!rotation_period.has_value()) { return std::nullopt; } KeyProto proto; proto.set_key(*key); proto.set_last_rotation(*last_rotation); proto.set_rotation_period(*rotation_period); return proto; } } // namespace metrics::structured::util