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