1*635a8641SAndroid Build Coastguard Worker // Copyright 2016 The Chromium Authors. All rights reserved. 2*635a8641SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be 3*635a8641SAndroid Build Coastguard Worker // found in the LICENSE file. 4*635a8641SAndroid Build Coastguard Worker 5*635a8641SAndroid Build Coastguard Worker #include "base/unguessable_token.h" 6*635a8641SAndroid Build Coastguard Worker 7*635a8641SAndroid Build Coastguard Worker #include "base/format_macros.h" 8*635a8641SAndroid Build Coastguard Worker #include "base/no_destructor.h" 9*635a8641SAndroid Build Coastguard Worker #include "base/rand_util.h" 10*635a8641SAndroid Build Coastguard Worker #include "base/strings/stringprintf.h" 11*635a8641SAndroid Build Coastguard Worker 12*635a8641SAndroid Build Coastguard Worker namespace base { 13*635a8641SAndroid Build Coastguard Worker UnguessableToken(const base::Token & token)14*635a8641SAndroid Build Coastguard WorkerUnguessableToken::UnguessableToken(const base::Token& token) : token_(token) {} 15*635a8641SAndroid Build Coastguard Worker 16*635a8641SAndroid Build Coastguard Worker // static Create()17*635a8641SAndroid Build Coastguard WorkerUnguessableToken UnguessableToken::Create() { 18*635a8641SAndroid Build Coastguard Worker return UnguessableToken(Token::CreateRandom()); 19*635a8641SAndroid Build Coastguard Worker } 20*635a8641SAndroid Build Coastguard Worker 21*635a8641SAndroid Build Coastguard Worker // static Null()22*635a8641SAndroid Build Coastguard Workerconst UnguessableToken& UnguessableToken::Null() { 23*635a8641SAndroid Build Coastguard Worker static const NoDestructor<UnguessableToken> null_token; 24*635a8641SAndroid Build Coastguard Worker return *null_token; 25*635a8641SAndroid Build Coastguard Worker } 26*635a8641SAndroid Build Coastguard Worker 27*635a8641SAndroid Build Coastguard Worker // static Deserialize(uint64_t high,uint64_t low)28*635a8641SAndroid Build Coastguard WorkerUnguessableToken UnguessableToken::Deserialize(uint64_t high, uint64_t low) { 29*635a8641SAndroid Build Coastguard Worker // Receiving a zeroed out UnguessableToken from another process means that it 30*635a8641SAndroid Build Coastguard Worker // was never initialized via Create(). Treat this case as a security issue. 31*635a8641SAndroid Build Coastguard Worker DCHECK(!(high == 0 && low == 0)); 32*635a8641SAndroid Build Coastguard Worker return UnguessableToken(Token{high, low}); 33*635a8641SAndroid Build Coastguard Worker } 34*635a8641SAndroid Build Coastguard Worker operator <<(std::ostream & out,const UnguessableToken & token)35*635a8641SAndroid Build Coastguard Workerstd::ostream& operator<<(std::ostream& out, const UnguessableToken& token) { 36*635a8641SAndroid Build Coastguard Worker return out << "(" << token.ToString() << ")"; 37*635a8641SAndroid Build Coastguard Worker } 38*635a8641SAndroid Build Coastguard Worker 39*635a8641SAndroid Build Coastguard Worker } // namespace base 40