| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/internal_auth.h" | 5 #include "chrome/browser/internal_auth.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <deque> | 8 #include <deque> |
| 9 | 9 |
| 10 #include "base/base64.h" | 10 #include "base/base64.h" |
| (...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 82 tick < kKeyRegenerationHardTicks || | 82 tick < kKeyRegenerationHardTicks || |
| 83 tick > kint64max - kKeyRegenerationHardTicks) { | 83 tick > kint64max - kKeyRegenerationHardTicks) { |
| 84 return 0; | 84 return 0; |
| 85 } | 85 } |
| 86 return tick; | 86 return tick; |
| 87 } | 87 } |
| 88 | 88 |
| 89 bool IsDomainSane(const std::string& domain) { | 89 bool IsDomainSane(const std::string& domain) { |
| 90 return !domain.empty() && | 90 return !domain.empty() && |
| 91 domain.size() <= kStringLengthLimit && | 91 domain.size() <= kStringLengthLimit && |
| 92 IsStringUTF8(domain) && | 92 base::IsStringUTF8(domain) && |
| 93 domain.find_first_of(kItemSeparator) == std::string::npos; | 93 domain.find_first_of(kItemSeparator) == std::string::npos; |
| 94 } | 94 } |
| 95 | 95 |
| 96 bool IsVarSane(const std::string& var) { | 96 bool IsVarSane(const std::string& var) { |
| 97 static const char kAllowedChars[] = | 97 static const char kAllowedChars[] = |
| 98 "ABCDEFGHIJKLMNOPQRSTUVWXYZ" | 98 "ABCDEFGHIJKLMNOPQRSTUVWXYZ" |
| 99 "abcdefghijklmnopqrstuvwxyz" | 99 "abcdefghijklmnopqrstuvwxyz" |
| 100 "0123456789" | 100 "0123456789" |
| 101 "_"; | 101 "_"; |
| 102 COMPILE_ASSERT( | 102 COMPILE_ASSERT( |
| 103 sizeof(kAllowedChars) == 26 + 26 + 10 + 1 + 1, some_mess_with_chars); | 103 sizeof(kAllowedChars) == 26 + 26 + 10 + 1 + 1, some_mess_with_chars); |
| 104 // We must not allow kItemSeparator in anything used as an input to construct | 104 // We must not allow kItemSeparator in anything used as an input to construct |
| 105 // message to sign. | 105 // message to sign. |
| 106 DCHECK(std::find(kAllowedChars, kAllowedChars + arraysize(kAllowedChars), | 106 DCHECK(std::find(kAllowedChars, kAllowedChars + arraysize(kAllowedChars), |
| 107 kItemSeparator) == kAllowedChars + arraysize(kAllowedChars)); | 107 kItemSeparator) == kAllowedChars + arraysize(kAllowedChars)); |
| 108 DCHECK(std::find(kAllowedChars, kAllowedChars + arraysize(kAllowedChars), | 108 DCHECK(std::find(kAllowedChars, kAllowedChars + arraysize(kAllowedChars), |
| 109 kVarValueSeparator) == kAllowedChars + arraysize(kAllowedChars)); | 109 kVarValueSeparator) == kAllowedChars + arraysize(kAllowedChars)); |
| 110 return !var.empty() && | 110 return !var.empty() && |
| 111 var.size() <= kStringLengthLimit && | 111 var.size() <= kStringLengthLimit && |
| 112 IsStringASCII(var) && | 112 base::IsStringASCII(var) && |
| 113 var.find_first_not_of(kAllowedChars) == std::string::npos && | 113 var.find_first_not_of(kAllowedChars) == std::string::npos && |
| 114 !IsAsciiDigit(var[0]); | 114 !IsAsciiDigit(var[0]); |
| 115 } | 115 } |
| 116 | 116 |
| 117 bool IsValueSane(const std::string& value) { | 117 bool IsValueSane(const std::string& value) { |
| 118 return value.size() <= kStringLengthLimit && | 118 return value.size() <= kStringLengthLimit && |
| 119 IsStringUTF8(value) && | 119 base::IsStringUTF8(value) && |
| 120 value.find_first_of(kItemSeparator) == std::string::npos; | 120 value.find_first_of(kItemSeparator) == std::string::npos; |
| 121 } | 121 } |
| 122 | 122 |
| 123 bool IsVarValueMapSane(const VarValueMap& map) { | 123 bool IsVarValueMapSane(const VarValueMap& map) { |
| 124 if (map.size() > kVarsLimit) | 124 if (map.size() > kVarsLimit) |
| 125 return false; | 125 return false; |
| 126 for (VarValueMap::const_iterator it = map.begin(); it != map.end(); ++it) { | 126 for (VarValueMap::const_iterator it = map.begin(); it != map.end(); ++it) { |
| 127 const std::string& var = it->first; | 127 const std::string& var = it->first; |
| 128 const std::string& value = it->second; | 128 const std::string& value = it->second; |
| 129 if (!IsVarSane(var) || !IsValueSane(value)) | 129 if (!IsVarSane(var) || !IsValueSane(value)) |
| (...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 258 static int get_verification_window_ticks() { | 258 static int get_verification_window_ticks() { |
| 259 return InternalAuthVerification::get_verification_window_ticks(); | 259 return InternalAuthVerification::get_verification_window_ticks(); |
| 260 } | 260 } |
| 261 | 261 |
| 262 // Returns tick bound to given passport on success or zero on failure. | 262 // Returns tick bound to given passport on success or zero on failure. |
| 263 int64 PreVerifyPassport( | 263 int64 PreVerifyPassport( |
| 264 const std::string& passport, | 264 const std::string& passport, |
| 265 const std::string& domain, | 265 const std::string& domain, |
| 266 int64 current_tick) { | 266 int64 current_tick) { |
| 267 if (passport.size() != kPassportSize || | 267 if (passport.size() != kPassportSize || |
| 268 !IsStringASCII(passport) || | 268 !base::IsStringASCII(passport) || |
| 269 !IsDomainSane(domain) || | 269 !IsDomainSane(domain) || |
| 270 current_tick <= dark_tick_ || | 270 current_tick <= dark_tick_ || |
| 271 current_tick > key_change_tick_ + kKeyRegenerationHardTicks || | 271 current_tick > key_change_tick_ + kKeyRegenerationHardTicks || |
| 272 key_.empty() || | 272 key_.empty() || |
| 273 engine_ == NULL) { | 273 engine_ == NULL) { |
| 274 return 0; | 274 return 0; |
| 275 } | 275 } |
| 276 | 276 |
| 277 // Passport consists of 2 parts: first hmac and then tick. | 277 // Passport consists of 2 parts: first hmac and then tick. |
| 278 std::string tick_decimal = | 278 std::string tick_decimal = |
| (...skipping 186 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 465 const std::string& domain, const VarValueMap& var_value_map) { | 465 const std::string& domain, const VarValueMap& var_value_map) { |
| 466 return g_generation_service.Get().GeneratePassport(domain, var_value_map, 0); | 466 return g_generation_service.Get().GeneratePassport(domain, var_value_map, 0); |
| 467 } | 467 } |
| 468 | 468 |
| 469 // static | 469 // static |
| 470 void InternalAuthGeneration::GenerateNewKey() { | 470 void InternalAuthGeneration::GenerateNewKey() { |
| 471 g_generation_service.Get().GenerateNewKey(); | 471 g_generation_service.Get().GenerateNewKey(); |
| 472 } | 472 } |
| 473 | 473 |
| 474 } // namespace chrome | 474 } // namespace chrome |
| OLD | NEW |