blob: 973b4167bd2ea42e7721d00e22cb54bd36cd7f77 [file] [log] [blame]
tguilbert4a5ac602016-09-19 21:11:251// Copyright 2016 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "base/unguessable_token.h"
6
7#include "base/format_macros.h"
Daniel Cheng1f3b3e22018-08-04 18:54:018#include "base/no_destructor.h"
tguilbert4a5ac602016-09-19 21:11:259#include "base/rand_util.h"
10#include "base/strings/stringprintf.h"
11
12namespace base {
13
Ken Rockot8c6991c72018-11-07 21:23:1914UnguessableToken::UnguessableToken(const base::Token& token) : token_(token) {}
tguilbert4a5ac602016-09-19 21:11:2515
16// static
17UnguessableToken UnguessableToken::Create() {
Ken Rockot8c6991c72018-11-07 21:23:1918 return UnguessableToken(Token::CreateRandom());
tguilbert4a5ac602016-09-19 21:11:2519}
20
21// static
Daniel Cheng1f3b3e22018-08-04 18:54:0122const UnguessableToken& UnguessableToken::Null() {
23 static const NoDestructor<UnguessableToken> null_token;
24 return *null_token;
25}
26
27// static
tguilbert4a5ac602016-09-19 21:11:2528UnguessableToken UnguessableToken::Deserialize(uint64_t high, uint64_t low) {
29 // Receiving a zeroed out UnguessableToken from another process means that it
30 // was never initialized via Create(). Treat this case as a security issue.
31 DCHECK(!(high == 0 && low == 0));
Ken Rockot8c6991c72018-11-07 21:23:1932 return UnguessableToken(Token{high, low});
tguilbert4a5ac602016-09-19 21:11:2533}
34
tguilbert13be8a32016-09-20 02:04:5035std::ostream& operator<<(std::ostream& out, const UnguessableToken& token) {
Pavel Feldman7bbfbc82017-12-29 01:42:5636 return out << "(" << token.ToString() << ")";
tguilbert13be8a32016-09-20 02:04:5037}
38
tguilbert4a5ac602016-09-19 21:11:2539} // namespace base