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