| Index: chrome/browser/internal_auth.cc
|
| diff --git a/chrome/browser/internal_auth.cc b/chrome/browser/internal_auth.cc
|
| index 84d543c2d6bbdd7b18227f56623a696d661c5503..f97baeca7c786ffe3bca476eaf0abb7eb02a8f1f 100644
|
| --- a/chrome/browser/internal_auth.cc
|
| +++ b/chrome/browser/internal_auth.cc
|
| @@ -4,8 +4,11 @@
|
|
|
| #include "chrome/browser/internal_auth.h"
|
|
|
| +#include <stdint.h>
|
| +
|
| #include <algorithm>
|
| #include <deque>
|
| +#include <limits>
|
|
|
| #include "base/base64.h"
|
| #include "base/lazy_instance.h"
|
| @@ -26,7 +29,7 @@ typedef std::map<std::string, std::string> VarValueMap;
|
| // Size of a tick in microseconds. This determines upper bound for average
|
| // number of passports generated per time unit. This bound equals to
|
| // (kMicrosecondsPerSecond / TickUs) calls per second.
|
| -const int64 kTickUs = 10000;
|
| +const int64_t kTickUs = 10000;
|
|
|
| // Verification window size in ticks; that means any passport expires in
|
| // (kVerificationWindowTicks * TickUs / kMicrosecondsPerSecond) seconds.
|
| @@ -77,11 +80,10 @@ const size_t kTickStringLength = 20;
|
| const size_t kPassportSize =
|
| BASE64_PER_RAW(kHMACSizeInBytes) + kTickStringLength;
|
|
|
| -int64 GetCurrentTick() {
|
| - int64 tick = base::Time::Now().ToInternalValue() / kTickUs;
|
| - if (tick < kVerificationWindowTicks ||
|
| - tick < kKeyRegenerationHardTicks ||
|
| - tick > kint64max - kKeyRegenerationHardTicks) {
|
| +int64_t GetCurrentTick() {
|
| + int64_t tick = base::Time::Now().ToInternalValue() / kTickUs;
|
| + if (tick < kVerificationWindowTicks || tick < kKeyRegenerationHardTicks ||
|
| + tick > std::numeric_limits<int64_t>::max() - kKeyRegenerationHardTicks) {
|
| return 0;
|
| }
|
| return tick;
|
| @@ -142,7 +144,7 @@ void ConvertVarValueMapToBlob(const VarValueMap& map, std::string* out) {
|
|
|
| void CreatePassport(const std::string& domain,
|
| const VarValueMap& map,
|
| - int64 tick,
|
| + int64_t tick,
|
| const crypto::HMAC* engine,
|
| std::string* out) {
|
| DCHECK(engine);
|
| @@ -200,8 +202,8 @@ class InternalAuthVerificationService {
|
| const std::string& passport,
|
| const std::string& domain,
|
| const VarValueMap& map) {
|
| - int64 current_tick = GetCurrentTick();
|
| - int64 tick = PreVerifyPassport(passport, domain, current_tick);
|
| + int64_t current_tick = GetCurrentTick();
|
| + int64_t tick = PreVerifyPassport(passport, domain, current_tick);
|
| if (tick == 0)
|
| return false;
|
| if (!IsVarValueMapSane(map))
|
| @@ -221,8 +223,8 @@ class InternalAuthVerificationService {
|
| }
|
|
|
| // Record used tick to prevent reuse.
|
| - std::deque<int64>::iterator it = std::lower_bound(
|
| - used_ticks_.begin(), used_ticks_.end(), tick);
|
| + std::deque<int64_t>::iterator it =
|
| + std::lower_bound(used_ticks_.begin(), used_ticks_.end(), tick);
|
| DCHECK(it == used_ticks_.end() || *it != tick);
|
| used_ticks_.insert(it, tick);
|
|
|
| @@ -261,10 +263,9 @@ class InternalAuthVerificationService {
|
| }
|
|
|
| // Returns tick bound to given passport on success or zero on failure.
|
| - int64 PreVerifyPassport(
|
| - const std::string& passport,
|
| - const std::string& domain,
|
| - int64 current_tick) {
|
| + int64_t PreVerifyPassport(const std::string& passport,
|
| + const std::string& domain,
|
| + int64_t current_tick) {
|
| if (passport.size() != kPassportSize ||
|
| !base::IsStringASCII(passport) ||
|
| !IsDomainSane(domain) ||
|
| @@ -279,7 +280,7 @@ class InternalAuthVerificationService {
|
| std::string tick_decimal =
|
| passport.substr(BASE64_PER_RAW(kHMACSizeInBytes));
|
| DCHECK(tick_decimal.size() == kTickStringLength);
|
| - int64 tick = 0;
|
| + int64_t tick = 0;
|
| if (!base::StringToInt64(tick_decimal, &tick) ||
|
| tick <= dark_tick_ ||
|
| tick > key_change_tick_ + kKeyRegenerationHardTicks ||
|
| @@ -302,16 +303,16 @@ class InternalAuthVerificationService {
|
| scoped_ptr<crypto::HMAC> old_engine_;
|
|
|
| // Tick at a time of recent key regeneration.
|
| - int64 key_change_tick_;
|
| + int64_t key_change_tick_;
|
|
|
| // Keeps track of ticks of successfully verified passports to prevent their
|
| // reuse. Size of this container is kept reasonably low by purging outdated
|
| // ticks.
|
| - std::deque<int64> used_ticks_;
|
| + std::deque<int64_t> used_ticks_;
|
|
|
| // Some ticks before |dark_tick_| were purged from |used_ticks_| container.
|
| // That means that we must not trust any tick less than or equal to dark tick.
|
| - int64 dark_tick_;
|
| + int64_t dark_tick_;
|
|
|
| DISALLOW_COPY_AND_ASSIGN(InternalAuthVerificationService);
|
| };
|
| @@ -348,7 +349,7 @@ class InternalAuthGenerationService : public base::ThreadChecker {
|
| }
|
|
|
| // Returns zero on failure.
|
| - int64 GetUnusedTick(const std::string& domain) {
|
| + int64_t GetUnusedTick(const std::string& domain) {
|
| DCHECK(CalledOnValidThread());
|
| if (engine_ == NULL) {
|
| NOTREACHED();
|
| @@ -357,7 +358,7 @@ class InternalAuthGenerationService : public base::ThreadChecker {
|
| if (!IsDomainSane(domain))
|
| return 0;
|
|
|
| - int64 current_tick = GetCurrentTick();
|
| + int64_t current_tick = GetCurrentTick();
|
| if (!used_ticks_.empty() && used_ticks_.back() > current_tick)
|
| current_tick = used_ticks_.back();
|
| for (bool first_iteration = true;; first_iteration = false) {
|
| @@ -378,9 +379,8 @@ class InternalAuthGenerationService : public base::ThreadChecker {
|
| // Average speed of GeneratePassport calls exceeds limit.
|
| return 0;
|
| }
|
| - for (int64 tick = current_tick;
|
| - tick > current_tick - kGenerationWindowTicks;
|
| - --tick) {
|
| + for (int64_t tick = current_tick;
|
| + tick > current_tick - kGenerationWindowTicks; --tick) {
|
| int idx = static_cast<int>(used_ticks_.size()) -
|
| static_cast<int>(current_tick - tick + 1);
|
| if (idx < 0 || used_ticks_[idx] != tick) {
|
| @@ -393,8 +393,9 @@ class InternalAuthGenerationService : public base::ThreadChecker {
|
| return 0;
|
| }
|
|
|
| - std::string GeneratePassport(
|
| - const std::string& domain, const VarValueMap& map, int64 tick) {
|
| + std::string GeneratePassport(const std::string& domain,
|
| + const VarValueMap& map,
|
| + int64_t tick) {
|
| DCHECK(CalledOnValidThread());
|
| if (tick == 0) {
|
| tick = GetUnusedTick(domain);
|
| @@ -417,8 +418,8 @@ class InternalAuthGenerationService : public base::ThreadChecker {
|
| }
|
|
|
| scoped_ptr<crypto::HMAC> engine_;
|
| - int64 key_regeneration_tick_;
|
| - std::deque<int64> used_ticks_;
|
| + int64_t key_regeneration_tick_;
|
| + std::deque<int64_t> used_ticks_;
|
|
|
| DISALLOW_COPY_AND_ASSIGN(InternalAuthGenerationService);
|
| };
|
|
|