xref: /aosp_15_r20/external/cronet/base/token.h (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
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