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