1*6777b538SAndroid Build Coastguard Worker // Copyright 2018 The Chromium Authors 2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be 3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file. 4*6777b538SAndroid Build Coastguard Worker 5*6777b538SAndroid Build Coastguard Worker #ifndef BASE_TOKEN_H_ 6*6777b538SAndroid Build Coastguard Worker #define BASE_TOKEN_H_ 7*6777b538SAndroid Build Coastguard Worker 8*6777b538SAndroid Build Coastguard Worker #include <stdint.h> 9*6777b538SAndroid Build Coastguard Worker 10*6777b538SAndroid Build Coastguard Worker #include <compare> 11*6777b538SAndroid Build Coastguard Worker #include <optional> 12*6777b538SAndroid Build Coastguard Worker #include <string> 13*6777b538SAndroid Build Coastguard Worker 14*6777b538SAndroid Build Coastguard Worker #include "base/base_export.h" 15*6777b538SAndroid Build Coastguard Worker #include "base/containers/span.h" 16*6777b538SAndroid Build Coastguard Worker #include "base/strings/string_piece.h" 17*6777b538SAndroid Build Coastguard Worker 18*6777b538SAndroid Build Coastguard Worker namespace base { 19*6777b538SAndroid Build Coastguard Worker 20*6777b538SAndroid Build Coastguard Worker // A Token is a randomly chosen 128-bit integer. This class supports generation 21*6777b538SAndroid Build Coastguard Worker // from a cryptographically strong random source, or constexpr construction over 22*6777b538SAndroid Build Coastguard Worker // fixed values (e.g. to store a pre-generated constant value). Tokens are 23*6777b538SAndroid Build Coastguard Worker // similar in spirit and purpose to UUIDs, without many of the constraints and 24*6777b538SAndroid Build Coastguard Worker // expectations (such as byte layout and string representation) clasically 25*6777b538SAndroid Build Coastguard Worker // associated with UUIDs. 26*6777b538SAndroid Build Coastguard Worker class BASE_EXPORT Token { 27*6777b538SAndroid Build Coastguard Worker public: 28*6777b538SAndroid Build Coastguard Worker // Constructs a zero Token. 29*6777b538SAndroid Build Coastguard Worker constexpr Token() = default; 30*6777b538SAndroid Build Coastguard Worker 31*6777b538SAndroid Build Coastguard Worker // Constructs a Token with |high| and |low| as its contents. Token(uint64_t high,uint64_t low)32*6777b538SAndroid Build Coastguard Worker constexpr Token(uint64_t high, uint64_t low) : words_{high, low} {} 33*6777b538SAndroid Build Coastguard Worker 34*6777b538SAndroid Build Coastguard Worker constexpr Token(const Token&) = default; 35*6777b538SAndroid Build Coastguard Worker constexpr Token& operator=(const Token&) = default; 36*6777b538SAndroid Build Coastguard Worker constexpr Token(Token&&) noexcept = default; 37*6777b538SAndroid Build Coastguard Worker constexpr Token& operator=(Token&&) = default; 38*6777b538SAndroid Build Coastguard Worker 39*6777b538SAndroid Build Coastguard Worker // Constructs a new Token with random |high| and |low| values taken from a 40*6777b538SAndroid Build Coastguard Worker // cryptographically strong random source. The result's |is_zero()| is 41*6777b538SAndroid Build Coastguard Worker // guaranteed to be false. 42*6777b538SAndroid Build Coastguard Worker static Token CreateRandom(); 43*6777b538SAndroid Build Coastguard Worker 44*6777b538SAndroid Build Coastguard Worker // The high and low 64 bits of this Token. high()45*6777b538SAndroid Build Coastguard Worker constexpr uint64_t high() const { return words_[0]; } low()46*6777b538SAndroid Build Coastguard Worker constexpr uint64_t low() const { return words_[1]; } 47*6777b538SAndroid Build Coastguard Worker is_zero()48*6777b538SAndroid Build Coastguard Worker constexpr bool is_zero() const { return words_[0] == 0 && words_[1] == 0; } 49*6777b538SAndroid Build Coastguard Worker AsBytes()50*6777b538SAndroid Build Coastguard Worker span<const uint8_t, 16> AsBytes() const { 51*6777b538SAndroid Build Coastguard Worker return as_bytes(make_span(words_)); 52*6777b538SAndroid Build Coastguard Worker } 53*6777b538SAndroid Build Coastguard Worker 54*6777b538SAndroid Build Coastguard Worker friend constexpr auto operator<=>(const Token& lhs, 55*6777b538SAndroid Build Coastguard Worker const Token& rhs) = default; 56*6777b538SAndroid Build Coastguard Worker friend constexpr bool operator==(const Token& lhs, 57*6777b538SAndroid Build Coastguard Worker const Token& rhs) = default; 58*6777b538SAndroid Build Coastguard Worker 59*6777b538SAndroid Build Coastguard Worker // Generates a string representation of this Token useful for e.g. logging. 60*6777b538SAndroid Build Coastguard Worker std::string ToString() const; 61*6777b538SAndroid Build Coastguard Worker 62*6777b538SAndroid Build Coastguard Worker // FromString is the opposite of ToString. It returns std::nullopt if the 63*6777b538SAndroid Build Coastguard Worker // |string_representation| is invalid. 64*6777b538SAndroid Build Coastguard Worker static std::optional<Token> FromString(StringPiece string_representation); 65*6777b538SAndroid Build Coastguard Worker 66*6777b538SAndroid Build Coastguard Worker private: 67*6777b538SAndroid Build Coastguard Worker // Note: Two uint64_t are used instead of uint8_t[16] in order to have a 68*6777b538SAndroid Build Coastguard Worker // simpler implementation, paricularly for |ToString()|, |is_zero()|, and 69*6777b538SAndroid Build Coastguard Worker // constexpr value construction. 70*6777b538SAndroid Build Coastguard Worker 71*6777b538SAndroid Build Coastguard Worker uint64_t words_[2] = {0, 0}; 72*6777b538SAndroid Build Coastguard Worker }; 73*6777b538SAndroid Build Coastguard Worker 74*6777b538SAndroid Build Coastguard Worker // For use in std::unordered_map. 75*6777b538SAndroid Build Coastguard Worker struct BASE_EXPORT TokenHash { 76*6777b538SAndroid Build Coastguard Worker size_t operator()(const Token& token) const; 77*6777b538SAndroid Build Coastguard Worker }; 78*6777b538SAndroid Build Coastguard Worker 79*6777b538SAndroid Build Coastguard Worker class Pickle; 80*6777b538SAndroid Build Coastguard Worker class PickleIterator; 81*6777b538SAndroid Build Coastguard Worker 82*6777b538SAndroid Build Coastguard Worker // For serializing and deserializing Token values. 83*6777b538SAndroid Build Coastguard Worker BASE_EXPORT void WriteTokenToPickle(Pickle* pickle, const Token& token); 84*6777b538SAndroid Build Coastguard Worker BASE_EXPORT std::optional<Token> ReadTokenFromPickle( 85*6777b538SAndroid Build Coastguard Worker PickleIterator* pickle_iterator); 86*6777b538SAndroid Build Coastguard Worker 87*6777b538SAndroid Build Coastguard Worker } // namespace base 88*6777b538SAndroid Build Coastguard Worker 89*6777b538SAndroid Build Coastguard Worker #endif // BASE_TOKEN_H_ 90