xref: /aosp_15_r20/external/libchrome/libchrome_tools/patches/Add-base-Token-class.patch (revision 635a864187cb8b6c713ff48b7e790a6b21769273)
1*635a8641SAndroid Build Coastguard WorkerFrom bd984b07c2672500cf1344ee16807e52a42cfe0c Mon Sep 17 00:00:00 2001
2*635a8641SAndroid Build Coastguard WorkerFrom: Soshun Naito <[email protected]>
3*635a8641SAndroid Build Coastguard WorkerDate: Tue, 6 Aug 2024 08:37:44 +0000
4*635a8641SAndroid Build Coastguard WorkerSubject: [PATCH] base: Add base::Token class
5*635a8641SAndroid Build Coastguard Worker
6*635a8641SAndroid Build Coastguard WorkerThis CL is a cherry-pick of the following CL: https://crrev.com/c/1320190
7*635a8641SAndroid Build Coastguard WorkerIt adds token.h and token.cc introduced in the CL above. These files are
8*635a8641SAndroid Build Coastguard Workerrequried to build ARC with [Uuid] attribute in Mojo enabled.
9*635a8641SAndroid Build Coastguard WorkerThis CL also replaces unguessable_token.h and unguessable_token.cc with
10*635a8641SAndroid Build Coastguard Workerthose in the original CL to let base::UnguessableToken to inherit
11*635a8641SAndroid Build Coastguard Workerbase::Token.
12*635a8641SAndroid Build Coastguard Worker
13*635a8641SAndroid Build Coastguard WorkerBug: b:357737923, b:41420830
14*635a8641SAndroid Build Coastguard WorkerTest: m
15*635a8641SAndroid Build Coastguard Worker
16*635a8641SAndroid Build Coastguard WorkerChange-Id: I93cc0a588a4268416d3a3ba28e170992794e479d
17*635a8641SAndroid Build Coastguard Worker---
18*635a8641SAndroid Build Coastguard Worker Android.bp                |  2 ++
19*635a8641SAndroid Build Coastguard Worker base/token.cc             | 28 +++++++++++++++
20*635a8641SAndroid Build Coastguard Worker base/token.h              | 72 +++++++++++++++++++++++++++++++++++++++
21*635a8641SAndroid Build Coastguard Worker base/unguessable_token.cc | 20 +++++------
22*635a8641SAndroid Build Coastguard Worker base/unguessable_token.h  | 36 ++++++++++++--------
23*635a8641SAndroid Build Coastguard Worker 5 files changed, 132 insertions(+), 26 deletions(-)
24*635a8641SAndroid Build Coastguard Worker create mode 100644 base/token.cc
25*635a8641SAndroid Build Coastguard Worker create mode 100644 base/token.h
26*635a8641SAndroid Build Coastguard Worker
27*635a8641SAndroid Build Coastguard Workerdiff --git a/Android.bp b/Android.bp
28*635a8641SAndroid Build Coastguard Workerindex 340a194ac..c9b031519 100644
29*635a8641SAndroid Build Coastguard Worker--- a/Android.bp
30*635a8641SAndroid Build Coastguard Worker+++ b/Android.bp
31*635a8641SAndroid Build Coastguard Worker@@ -458,6 +458,7 @@ filegroup {
32*635a8641SAndroid Build Coastguard Worker         "base/timer/hi_res_timer_manager.h",
33*635a8641SAndroid Build Coastguard Worker         "base/timer/mock_timer.h",
34*635a8641SAndroid Build Coastguard Worker         "base/timer/timer.h",
35*635a8641SAndroid Build Coastguard Worker+        "base/token.h",
36*635a8641SAndroid Build Coastguard Worker         "base/trace_event/common/trace_event_common.h",
37*635a8641SAndroid Build Coastguard Worker         "base/trace_event/heap_profiler.h",
38*635a8641SAndroid Build Coastguard Worker         "base/trace_event/trace_event.h",
39*635a8641SAndroid Build Coastguard Worker@@ -736,6 +737,7 @@ libchromeCommonSrc = [
40*635a8641SAndroid Build Coastguard Worker     "base/time/time_override.cc",
41*635a8641SAndroid Build Coastguard Worker     "base/timer/elapsed_timer.cc",
42*635a8641SAndroid Build Coastguard Worker     "base/timer/timer.cc",
43*635a8641SAndroid Build Coastguard Worker+    "base/token.cc",
44*635a8641SAndroid Build Coastguard Worker     "base/unguessable_token.cc",
45*635a8641SAndroid Build Coastguard Worker     "base/value_iterators.cc",
46*635a8641SAndroid Build Coastguard Worker     "base/values.cc",
47*635a8641SAndroid Build Coastguard Workerdiff --git a/base/token.cc b/base/token.cc
48*635a8641SAndroid Build Coastguard Workernew file mode 100644
49*635a8641SAndroid Build Coastguard Workerindex 000000000..e7ad89671
50*635a8641SAndroid Build Coastguard Worker--- /dev/null
51*635a8641SAndroid Build Coastguard Worker+++ b/base/token.cc
52*635a8641SAndroid Build Coastguard Worker@@ -0,0 +1,28 @@
53*635a8641SAndroid Build Coastguard Worker+// Copyright 2018 The Chromium Authors. All rights reserved.
54*635a8641SAndroid Build Coastguard Worker+// Use of this source code is governed by a BSD-style license that can be
55*635a8641SAndroid Build Coastguard Worker+// found in the LICENSE file.
56*635a8641SAndroid Build Coastguard Worker+
57*635a8641SAndroid Build Coastguard Worker+#include "base/token.h"
58*635a8641SAndroid Build Coastguard Worker+
59*635a8641SAndroid Build Coastguard Worker+#include <inttypes.h>
60*635a8641SAndroid Build Coastguard Worker+
61*635a8641SAndroid Build Coastguard Worker+#include "base/rand_util.h"
62*635a8641SAndroid Build Coastguard Worker+#include "base/strings/stringprintf.h"
63*635a8641SAndroid Build Coastguard Worker+
64*635a8641SAndroid Build Coastguard Worker+namespace base {
65*635a8641SAndroid Build Coastguard Worker+
66*635a8641SAndroid Build Coastguard Worker+// static
67*635a8641SAndroid Build Coastguard Worker+Token Token::CreateRandom() {
68*635a8641SAndroid Build Coastguard Worker+  Token token;
69*635a8641SAndroid Build Coastguard Worker+
70*635a8641SAndroid Build Coastguard Worker+  // Use base::RandBytes instead of crypto::RandBytes, because crypto calls the
71*635a8641SAndroid Build Coastguard Worker+  // base version directly, and to prevent the dependency from base/ to crypto/.
72*635a8641SAndroid Build Coastguard Worker+  base::RandBytes(&token, sizeof(token));
73*635a8641SAndroid Build Coastguard Worker+  return token;
74*635a8641SAndroid Build Coastguard Worker+}
75*635a8641SAndroid Build Coastguard Worker+
76*635a8641SAndroid Build Coastguard Worker+std::string Token::ToString() const {
77*635a8641SAndroid Build Coastguard Worker+  return base::StringPrintf("%016" PRIX64 "%016" PRIX64, high_, low_);
78*635a8641SAndroid Build Coastguard Worker+}
79*635a8641SAndroid Build Coastguard Worker+
80*635a8641SAndroid Build Coastguard Worker+}  // namespace base
81*635a8641SAndroid Build Coastguard Workerdiff --git a/base/token.h b/base/token.h
82*635a8641SAndroid Build Coastguard Workernew file mode 100644
83*635a8641SAndroid Build Coastguard Workerindex 000000000..f12277e11
84*635a8641SAndroid Build Coastguard Worker--- /dev/null
85*635a8641SAndroid Build Coastguard Worker+++ b/base/token.h
86*635a8641SAndroid Build Coastguard Worker@@ -0,0 +1,72 @@
87*635a8641SAndroid Build Coastguard Worker+// Copyright 2018 The Chromium Authors. All rights reserved.
88*635a8641SAndroid Build Coastguard Worker+// Use of this source code is governed by a BSD-style license that can be
89*635a8641SAndroid Build Coastguard Worker+// found in the LICENSE file.
90*635a8641SAndroid Build Coastguard Worker+
91*635a8641SAndroid Build Coastguard Worker+#ifndef BASE_TOKEN_H_
92*635a8641SAndroid Build Coastguard Worker+#define BASE_TOKEN_H_
93*635a8641SAndroid Build Coastguard Worker+
94*635a8641SAndroid Build Coastguard Worker+#include <stdint.h>
95*635a8641SAndroid Build Coastguard Worker+
96*635a8641SAndroid Build Coastguard Worker+#include <iosfwd>
97*635a8641SAndroid Build Coastguard Worker+#include <tuple>
98*635a8641SAndroid Build Coastguard Worker+
99*635a8641SAndroid Build Coastguard Worker+#include "base/base_export.h"
100*635a8641SAndroid Build Coastguard Worker+#include "base/hash.h"
101*635a8641SAndroid Build Coastguard Worker+
102*635a8641SAndroid Build Coastguard Worker+namespace base {
103*635a8641SAndroid Build Coastguard Worker+
104*635a8641SAndroid Build Coastguard Worker+// A Token is a randomly chosen 128-bit integer. This class supports generation
105*635a8641SAndroid Build Coastguard Worker+// from a cryptographically strong random source, or constexpr construction over
106*635a8641SAndroid Build Coastguard Worker+// fixed values (e.g. to store a pre-generated constant value). Tokens are
107*635a8641SAndroid Build Coastguard Worker+// similar in spirit and purpose to UUIDs, without many of the constraints and
108*635a8641SAndroid Build Coastguard Worker+// expectations (such as byte layout and string representation) clasically
109*635a8641SAndroid Build Coastguard Worker+// associated with UUIDs.
110*635a8641SAndroid Build Coastguard Worker+class BASE_EXPORT Token {
111*635a8641SAndroid Build Coastguard Worker+ public:
112*635a8641SAndroid Build Coastguard Worker+  // Constructs a zero Token.
113*635a8641SAndroid Build Coastguard Worker+  constexpr Token() : high_(0), low_(0) {}
114*635a8641SAndroid Build Coastguard Worker+
115*635a8641SAndroid Build Coastguard Worker+  // Constructs a Token with |high| and |low| as its contents.
116*635a8641SAndroid Build Coastguard Worker+  constexpr Token(uint64_t high, uint64_t low) : high_(high), low_(low) {}
117*635a8641SAndroid Build Coastguard Worker+
118*635a8641SAndroid Build Coastguard Worker+  // Constructs a new Token with random |high| and |low| values taken from a
119*635a8641SAndroid Build Coastguard Worker+  // cryptographically strong random source.
120*635a8641SAndroid Build Coastguard Worker+  static Token CreateRandom();
121*635a8641SAndroid Build Coastguard Worker+
122*635a8641SAndroid Build Coastguard Worker+  // The high and low 64 bits of this Token.
123*635a8641SAndroid Build Coastguard Worker+  uint64_t high() const { return high_; }
124*635a8641SAndroid Build Coastguard Worker+  uint64_t low() const { return low_; }
125*635a8641SAndroid Build Coastguard Worker+
126*635a8641SAndroid Build Coastguard Worker+  bool is_zero() const { return high_ == 0 && low_ == 0; }
127*635a8641SAndroid Build Coastguard Worker+
128*635a8641SAndroid Build Coastguard Worker+  bool operator==(const Token& other) const {
129*635a8641SAndroid Build Coastguard Worker+    return high_ == other.high_ && low_ == other.low_;
130*635a8641SAndroid Build Coastguard Worker+  }
131*635a8641SAndroid Build Coastguard Worker+
132*635a8641SAndroid Build Coastguard Worker+  bool operator!=(const Token& other) const { return !(*this == other); }
133*635a8641SAndroid Build Coastguard Worker+
134*635a8641SAndroid Build Coastguard Worker+  bool operator<(const Token& other) const {
135*635a8641SAndroid Build Coastguard Worker+    return std::tie(high_, low_) < std::tie(other.high_, other.low_);
136*635a8641SAndroid Build Coastguard Worker+  }
137*635a8641SAndroid Build Coastguard Worker+
138*635a8641SAndroid Build Coastguard Worker+  // Generates a string representation of this Token useful for e.g. logging.
139*635a8641SAndroid Build Coastguard Worker+  std::string ToString() const;
140*635a8641SAndroid Build Coastguard Worker+
141*635a8641SAndroid Build Coastguard Worker+ private:
142*635a8641SAndroid Build Coastguard Worker+  // Note: Two uint64_t are used instead of uint8_t[16] in order to have a
143*635a8641SAndroid Build Coastguard Worker+  // simpler implementation, paricularly for |ToString()|, |is_zero()|, and
144*635a8641SAndroid Build Coastguard Worker+  // constexpr value construction.
145*635a8641SAndroid Build Coastguard Worker+  uint64_t high_;
146*635a8641SAndroid Build Coastguard Worker+  uint64_t low_;
147*635a8641SAndroid Build Coastguard Worker+};
148*635a8641SAndroid Build Coastguard Worker+
149*635a8641SAndroid Build Coastguard Worker+// For use in std::unordered_map.
150*635a8641SAndroid Build Coastguard Worker+struct TokenHash {
151*635a8641SAndroid Build Coastguard Worker+  size_t operator()(const base::Token& token) const {
152*635a8641SAndroid Build Coastguard Worker+    return base::HashInts64(token.high(), token.low());
153*635a8641SAndroid Build Coastguard Worker+  }
154*635a8641SAndroid Build Coastguard Worker+};
155*635a8641SAndroid Build Coastguard Worker+
156*635a8641SAndroid Build Coastguard Worker+}  // namespace base
157*635a8641SAndroid Build Coastguard Worker+
158*635a8641SAndroid Build Coastguard Worker+#endif  // BASE_TOKEN_H_
159*635a8641SAndroid Build Coastguard Worker\ No newline at end of file
160*635a8641SAndroid Build Coastguard Workerdiff --git a/base/unguessable_token.cc b/base/unguessable_token.cc
161*635a8641SAndroid Build Coastguard Workerindex 0d8aad39c..973b4167b 100644
162*635a8641SAndroid Build Coastguard Worker--- a/base/unguessable_token.cc
163*635a8641SAndroid Build Coastguard Worker+++ b/base/unguessable_token.cc
164*635a8641SAndroid Build Coastguard Worker@@ -5,25 +5,23 @@
165*635a8641SAndroid Build Coastguard Worker #include "base/unguessable_token.h"
166*635a8641SAndroid Build Coastguard Worker
167*635a8641SAndroid Build Coastguard Worker #include "base/format_macros.h"
168*635a8641SAndroid Build Coastguard Worker+#include "base/no_destructor.h"
169*635a8641SAndroid Build Coastguard Worker #include "base/rand_util.h"
170*635a8641SAndroid Build Coastguard Worker #include "base/strings/stringprintf.h"
171*635a8641SAndroid Build Coastguard Worker
172*635a8641SAndroid Build Coastguard Worker namespace base {
173*635a8641SAndroid Build Coastguard Worker
174*635a8641SAndroid Build Coastguard Worker-UnguessableToken::UnguessableToken(uint64_t high, uint64_t low)
175*635a8641SAndroid Build Coastguard Worker-    : high_(high), low_(low) {}
176*635a8641SAndroid Build Coastguard Worker+UnguessableToken::UnguessableToken(const base::Token& token) : token_(token) {}
177*635a8641SAndroid Build Coastguard Worker
178*635a8641SAndroid Build Coastguard Worker-std::string UnguessableToken::ToString() const {
179*635a8641SAndroid Build Coastguard Worker-  return base::StringPrintf("%016" PRIX64 "%016" PRIX64, high_, low_);
180*635a8641SAndroid Build Coastguard Worker+// static
181*635a8641SAndroid Build Coastguard Worker+UnguessableToken UnguessableToken::Create() {
182*635a8641SAndroid Build Coastguard Worker+  return UnguessableToken(Token::CreateRandom());
183*635a8641SAndroid Build Coastguard Worker }
184*635a8641SAndroid Build Coastguard Worker
185*635a8641SAndroid Build Coastguard Worker // static
186*635a8641SAndroid Build Coastguard Worker-UnguessableToken UnguessableToken::Create() {
187*635a8641SAndroid Build Coastguard Worker-  UnguessableToken token;
188*635a8641SAndroid Build Coastguard Worker-  // Use base::RandBytes instead of crypto::RandBytes, because crypto calls the
189*635a8641SAndroid Build Coastguard Worker-  // base version directly, and to prevent the dependency from base/ to crypto/.
190*635a8641SAndroid Build Coastguard Worker-  base::RandBytes(&token, sizeof(token));
191*635a8641SAndroid Build Coastguard Worker-  return token;
192*635a8641SAndroid Build Coastguard Worker+const UnguessableToken& UnguessableToken::Null() {
193*635a8641SAndroid Build Coastguard Worker+  static const NoDestructor<UnguessableToken> null_token;
194*635a8641SAndroid Build Coastguard Worker+  return *null_token;
195*635a8641SAndroid Build Coastguard Worker }
196*635a8641SAndroid Build Coastguard Worker
197*635a8641SAndroid Build Coastguard Worker // static
198*635a8641SAndroid Build Coastguard Worker@@ -31,7 +29,7 @@ UnguessableToken UnguessableToken::Deserialize(uint64_t high, uint64_t low) {
199*635a8641SAndroid Build Coastguard Worker   // Receiving a zeroed out UnguessableToken from another process means that it
200*635a8641SAndroid Build Coastguard Worker   // was never initialized via Create(). Treat this case as a security issue.
201*635a8641SAndroid Build Coastguard Worker   DCHECK(!(high == 0 && low == 0));
202*635a8641SAndroid Build Coastguard Worker-  return UnguessableToken(high, low);
203*635a8641SAndroid Build Coastguard Worker+  return UnguessableToken(Token{high, low});
204*635a8641SAndroid Build Coastguard Worker }
205*635a8641SAndroid Build Coastguard Worker
206*635a8641SAndroid Build Coastguard Worker std::ostream& operator<<(std::ostream& out, const UnguessableToken& token) {
207*635a8641SAndroid Build Coastguard Workerdiff --git a/base/unguessable_token.h b/base/unguessable_token.h
208*635a8641SAndroid Build Coastguard Workerindex 6858e22a4..7f7b59a3a 100644
209*635a8641SAndroid Build Coastguard Worker--- a/base/unguessable_token.h
210*635a8641SAndroid Build Coastguard Worker+++ b/base/unguessable_token.h
211*635a8641SAndroid Build Coastguard Worker@@ -13,14 +13,17 @@
212*635a8641SAndroid Build Coastguard Worker #include "base/base_export.h"
213*635a8641SAndroid Build Coastguard Worker #include "base/hash.h"
214*635a8641SAndroid Build Coastguard Worker #include "base/logging.h"
215*635a8641SAndroid Build Coastguard Worker+#include "base/token.h"
216*635a8641SAndroid Build Coastguard Worker
217*635a8641SAndroid Build Coastguard Worker namespace base {
218*635a8641SAndroid Build Coastguard Worker
219*635a8641SAndroid Build Coastguard Worker struct UnguessableTokenHash;
220*635a8641SAndroid Build Coastguard Worker
221*635a8641SAndroid Build Coastguard Worker-// A UnguessableToken is an 128-bit token generated from a cryptographically
222*635a8641SAndroid Build Coastguard Worker-// strong random source. It can be used as part of a larger aggregate type,
223*635a8641SAndroid Build Coastguard Worker-// or as an ID in and of itself.
224*635a8641SAndroid Build Coastguard Worker+// UnguessableToken is, like Token, a randomly chosen 128-bit value. Unlike
225*635a8641SAndroid Build Coastguard Worker+// Token however, a new UnguessableToken must always be generated at runtime
226*635a8641SAndroid Build Coastguard Worker+// from a cryptographically strong random source (or copied or serialized and
227*635a8641SAndroid Build Coastguard Worker+// deserialized from another such UnguessableToken). It can be used as part of a
228*635a8641SAndroid Build Coastguard Worker+// larger aggregate type, or as an ID in and of itself.
229*635a8641SAndroid Build Coastguard Worker //
230*635a8641SAndroid Build Coastguard Worker // UnguessableToken can be used to implement "Capability-Based Security".
231*635a8641SAndroid Build Coastguard Worker // In other words, UnguessableToken can be used when the resource associated
232*635a8641SAndroid Build Coastguard Worker@@ -42,6 +45,12 @@ class BASE_EXPORT UnguessableToken {
233*635a8641SAndroid Build Coastguard Worker   // Create a unique UnguessableToken.
234*635a8641SAndroid Build Coastguard Worker   static UnguessableToken Create();
235*635a8641SAndroid Build Coastguard Worker
236*635a8641SAndroid Build Coastguard Worker+  // Returns a reference to a global null UnguessableToken. This should only be
237*635a8641SAndroid Build Coastguard Worker+  // used for functions that need to return a reference to an UnguessableToken,
238*635a8641SAndroid Build Coastguard Worker+  // and should not be used as a general-purpose substitute for invoking the
239*635a8641SAndroid Build Coastguard Worker+  // default constructor.
240*635a8641SAndroid Build Coastguard Worker+  static const UnguessableToken& Null();
241*635a8641SAndroid Build Coastguard Worker+
242*635a8641SAndroid Build Coastguard Worker   // Return a UnguessableToken built from the high/low bytes provided.
243*635a8641SAndroid Build Coastguard Worker   // It should only be used in deserialization scenarios.
244*635a8641SAndroid Build Coastguard Worker   //
245*635a8641SAndroid Build Coastguard Worker@@ -56,28 +65,28 @@ class BASE_EXPORT UnguessableToken {
246*635a8641SAndroid Build Coastguard Worker   // NOTE: Serializing an empty UnguessableToken is an illegal operation.
247*635a8641SAndroid Build Coastguard Worker   uint64_t GetHighForSerialization() const {
248*635a8641SAndroid Build Coastguard Worker     DCHECK(!is_empty());
249*635a8641SAndroid Build Coastguard Worker-    return high_;
250*635a8641SAndroid Build Coastguard Worker+    return token_.high();
251*635a8641SAndroid Build Coastguard Worker   }
252*635a8641SAndroid Build Coastguard Worker
253*635a8641SAndroid Build Coastguard Worker   // NOTE: Serializing an empty UnguessableToken is an illegal operation.
254*635a8641SAndroid Build Coastguard Worker   uint64_t GetLowForSerialization() const {
255*635a8641SAndroid Build Coastguard Worker     DCHECK(!is_empty());
256*635a8641SAndroid Build Coastguard Worker-    return low_;
257*635a8641SAndroid Build Coastguard Worker+    return token_.low();
258*635a8641SAndroid Build Coastguard Worker   }
259*635a8641SAndroid Build Coastguard Worker
260*635a8641SAndroid Build Coastguard Worker-  bool is_empty() const { return high_ == 0 && low_ == 0; }
261*635a8641SAndroid Build Coastguard Worker+  bool is_empty() const { return token_.is_zero(); }
262*635a8641SAndroid Build Coastguard Worker
263*635a8641SAndroid Build Coastguard Worker   // Hex representation of the unguessable token.
264*635a8641SAndroid Build Coastguard Worker-  std::string ToString() const;
265*635a8641SAndroid Build Coastguard Worker+  std::string ToString() const { return token_.ToString(); }
266*635a8641SAndroid Build Coastguard Worker
267*635a8641SAndroid Build Coastguard Worker   explicit operator bool() const { return !is_empty(); }
268*635a8641SAndroid Build Coastguard Worker
269*635a8641SAndroid Build Coastguard Worker   bool operator<(const UnguessableToken& other) const {
270*635a8641SAndroid Build Coastguard Worker-    return std::tie(high_, low_) < std::tie(other.high_, other.low_);
271*635a8641SAndroid Build Coastguard Worker+    return token_ < other.token_;
272*635a8641SAndroid Build Coastguard Worker   }
273*635a8641SAndroid Build Coastguard Worker
274*635a8641SAndroid Build Coastguard Worker   bool operator==(const UnguessableToken& other) const {
275*635a8641SAndroid Build Coastguard Worker-    return high_ == other.high_ && low_ == other.low_;
276*635a8641SAndroid Build Coastguard Worker+    return token_ == other.token_;
277*635a8641SAndroid Build Coastguard Worker   }
278*635a8641SAndroid Build Coastguard Worker
279*635a8641SAndroid Build Coastguard Worker   bool operator!=(const UnguessableToken& other) const {
280*635a8641SAndroid Build Coastguard Worker@@ -86,12 +95,9 @@ class BASE_EXPORT UnguessableToken {
281*635a8641SAndroid Build Coastguard Worker
282*635a8641SAndroid Build Coastguard Worker  private:
283*635a8641SAndroid Build Coastguard Worker   friend struct UnguessableTokenHash;
284*635a8641SAndroid Build Coastguard Worker-  UnguessableToken(uint64_t high, uint64_t low);
285*635a8641SAndroid Build Coastguard Worker+  explicit UnguessableToken(const Token& token);
286*635a8641SAndroid Build Coastguard Worker
287*635a8641SAndroid Build Coastguard Worker-  // Note: Two uint64_t are used instead of uint8_t[16], in order to have a
288*635a8641SAndroid Build Coastguard Worker-  // simpler ToString() and is_empty().
289*635a8641SAndroid Build Coastguard Worker-  uint64_t high_ = 0;
290*635a8641SAndroid Build Coastguard Worker-  uint64_t low_ = 0;
291*635a8641SAndroid Build Coastguard Worker+  base::Token token_;
292*635a8641SAndroid Build Coastguard Worker };
293*635a8641SAndroid Build Coastguard Worker
294*635a8641SAndroid Build Coastguard Worker BASE_EXPORT std::ostream& operator<<(std::ostream& out,
295*635a8641SAndroid Build Coastguard Worker@@ -101,7 +107,7 @@ BASE_EXPORT std::ostream& operator<<(std::ostream& out,
296*635a8641SAndroid Build Coastguard Worker struct UnguessableTokenHash {
297*635a8641SAndroid Build Coastguard Worker   size_t operator()(const base::UnguessableToken& token) const {
298*635a8641SAndroid Build Coastguard Worker     DCHECK(token);
299*635a8641SAndroid Build Coastguard Worker-    return base::HashInts64(token.high_, token.low_);
300*635a8641SAndroid Build Coastguard Worker+    return TokenHash()(token.token_);
301*635a8641SAndroid Build Coastguard Worker   }
302*635a8641SAndroid Build Coastguard Worker };
303*635a8641SAndroid Build Coastguard Worker
304*635a8641SAndroid Build Coastguard Worker--
305*635a8641SAndroid Build Coastguard Worker2.46.0.rc2.264.g509ed76dc8-goog
306*635a8641SAndroid Build Coastguard Worker
307