Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(723)

Side by Side Diff: chrome/browser/chromeos/login/parallel_authenticator.cc

Issue 10701075: Remove chromeos::CryptohomeLibrary::HashPassword (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: _ Created 8 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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/chromeos/login/parallel_authenticator.h" 5 #include "chrome/browser/chromeos/login/parallel_authenticator.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/command_line.h" 8 #include "base/command_line.h"
9 #include "base/file_path.h" 9 #include "base/file_path.h"
10 #include "base/file_util.h" 10 #include "base/file_util.h"
11 #include "base/logging.h" 11 #include "base/logging.h"
12 #include "base/string_number_conversions.h"
12 #include "base/string_util.h" 13 #include "base/string_util.h"
13 #include "chrome/browser/chromeos/boot_times_loader.h" 14 #include "chrome/browser/chromeos/boot_times_loader.h"
14 #include "chrome/browser/chromeos/cros/cert_library.h" 15 #include "chrome/browser/chromeos/cros/cert_library.h"
15 #include "chrome/browser/chromeos/cros/cros_library.h" 16 #include "chrome/browser/chromeos/cros/cros_library.h"
16 #include "chrome/browser/chromeos/cros/cryptohome_library.h" 17 #include "chrome/browser/chromeos/cros/cryptohome_library.h"
17 #include "chrome/browser/chromeos/cros_settings.h" 18 #include "chrome/browser/chromeos/cros_settings.h"
18 #include "chrome/browser/chromeos/cryptohome/async_method_caller.h" 19 #include "chrome/browser/chromeos/cryptohome/async_method_caller.h"
19 #include "chrome/browser/chromeos/login/authentication_notification_details.h" 20 #include "chrome/browser/chromeos/login/authentication_notification_details.h"
20 #include "chrome/browser/chromeos/login/login_status_consumer.h" 21 #include "chrome/browser/chromeos/login/login_status_consumer.h"
21 #include "chrome/browser/chromeos/login/ownership_service.h" 22 #include "chrome/browser/chromeos/login/ownership_service.h"
22 #include "chrome/browser/chromeos/login/user_manager.h" 23 #include "chrome/browser/chromeos/login/user_manager.h"
23 #include "chrome/common/chrome_notification_types.h" 24 #include "chrome/common/chrome_notification_types.h"
24 #include "chrome/common/chrome_switches.h" 25 #include "chrome/common/chrome_switches.h"
25 #include "chrome/common/net/gaia/gaia_auth_util.h" 26 #include "chrome/common/net/gaia/gaia_auth_util.h"
26 #include "chromeos/dbus/cryptohome_client.h" 27 #include "chromeos/dbus/cryptohome_client.h"
27 #include "chromeos/dbus/dbus_thread_manager.h" 28 #include "chromeos/dbus/dbus_thread_manager.h"
28 #include "content/public/browser/browser_thread.h" 29 #include "content/public/browser/browser_thread.h"
29 #include "content/public/browser/notification_service.h" 30 #include "content/public/browser/notification_service.h"
31 #include "crypto/sha2.h"
30 #include "third_party/cros_system_api/dbus/service_constants.h" 32 #include "third_party/cros_system_api/dbus/service_constants.h"
31 33
32 using content::BrowserThread; 34 using content::BrowserThread;
33 35
34 namespace chromeos { 36 namespace chromeos {
35 37
36 namespace { 38 namespace {
37 39
38 // Milliseconds until we timeout our attempt to hit ClientLogin. 40 // Milliseconds until we timeout our attempt to hit ClientLogin.
39 const int kClientLoginTimeoutMs = 10000; 41 const int kClientLoginTimeoutMs = 10000;
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after
155 157
156 // Returns whether the login failure was connection issue. 158 // Returns whether the login failure was connection issue.
157 bool WasConnectionIssue(const LoginFailure& online_outcome) { 159 bool WasConnectionIssue(const LoginFailure& online_outcome) {
158 return ((online_outcome.reason() == LoginFailure::LOGIN_TIMED_OUT) || 160 return ((online_outcome.reason() == LoginFailure::LOGIN_TIMED_OUT) ||
159 (online_outcome.error().state() == 161 (online_outcome.error().state() ==
160 GoogleServiceAuthError::CONNECTION_FAILED) || 162 GoogleServiceAuthError::CONNECTION_FAILED) ||
161 (online_outcome.error().state() == 163 (online_outcome.error().state() ==
162 GoogleServiceAuthError::REQUEST_CANCELED)); 164 GoogleServiceAuthError::REQUEST_CANCELED));
163 } 165 }
164 166
167 // Returns hash of |password|, salted with the system salt.
168 std::string HashPassword(const std::string& password) {
169 // Get salt, ascii encode, update sha with that, then update with ascii
170 // of password, then end.
171 const int kPassHashLen = 32;
stevenjb 2012/07/03 15:31:14 nit: constant at top of file
hashimoto 2012/07/04 04:33:34 Done.
172 std::string ascii_salt =
173 CrosLibrary::Get()->GetCryptohomeLibrary()->GetSystemSalt();
174 char passhash_buf[kPassHashLen];
175
176 // Hash salt and password
177 crypto::SHA256HashString(ascii_salt + password,
178 &passhash_buf, sizeof(passhash_buf));
179
180 return StringToLowerASCII(base::HexEncode(
181 reinterpret_cast<const void*>(passhash_buf),
182 sizeof(passhash_buf) / 2));
stevenjb 2012/07/03 15:31:14 Why / 2? Maybe use a const or sizeof() instead of
hashimoto 2012/07/04 04:33:34 Looks like this '/2' trick has been there for 20 m
183 }
184
165 } // namespace 185 } // namespace
166 186
167 ParallelAuthenticator::ParallelAuthenticator(LoginStatusConsumer* consumer) 187 ParallelAuthenticator::ParallelAuthenticator(LoginStatusConsumer* consumer)
168 : Authenticator(consumer), 188 : Authenticator(consumer),
169 migrate_attempted_(false), 189 migrate_attempted_(false),
170 remove_attempted_(false), 190 remove_attempted_(false),
171 mount_guest_attempted_(false), 191 mount_guest_attempted_(false),
172 check_key_attempted_(false), 192 check_key_attempted_(false),
173 already_reported_success_(false), 193 already_reported_success_(false),
174 owner_is_verified_(false), 194 owner_is_verified_(false),
(...skipping 11 matching lines...) Expand all
186 const std::string& username, 206 const std::string& username,
187 const std::string& password, 207 const std::string& password,
188 const std::string& login_token, 208 const std::string& login_token,
189 const std::string& login_captcha) { 209 const std::string& login_captcha) {
190 std::string canonicalized = gaia::CanonicalizeEmail(username); 210 std::string canonicalized = gaia::CanonicalizeEmail(username);
191 authentication_profile_ = profile; 211 authentication_profile_ = profile;
192 current_state_.reset( 212 current_state_.reset(
193 new AuthAttemptState( 213 new AuthAttemptState(
194 canonicalized, 214 canonicalized,
195 password, 215 password,
196 CrosLibrary::Get()->GetCryptohomeLibrary()->HashPassword(password), 216 HashPassword(password),
197 login_token, 217 login_token,
198 login_captcha, 218 login_captcha,
199 !UserManager::Get()->IsKnownUser(canonicalized))); 219 !UserManager::Get()->IsKnownUser(canonicalized)));
200 { 220 {
201 // Reset the verified flag. 221 // Reset the verified flag.
202 base::AutoLock for_this_block(owner_verified_lock_); 222 base::AutoLock for_this_block(owner_verified_lock_);
203 owner_is_verified_ = false; 223 owner_is_verified_ = false;
204 } 224 }
205 225
206 const bool create_if_missing = false; 226 const bool create_if_missing = false;
(...skipping 16 matching lines...) Expand all
223 243
224 void ParallelAuthenticator::CompleteLogin(Profile* profile, 244 void ParallelAuthenticator::CompleteLogin(Profile* profile,
225 const std::string& username, 245 const std::string& username,
226 const std::string& password) { 246 const std::string& password) {
227 std::string canonicalized = gaia::CanonicalizeEmail(username); 247 std::string canonicalized = gaia::CanonicalizeEmail(username);
228 authentication_profile_ = profile; 248 authentication_profile_ = profile;
229 current_state_.reset( 249 current_state_.reset(
230 new AuthAttemptState( 250 new AuthAttemptState(
231 canonicalized, 251 canonicalized,
232 password, 252 password,
233 CrosLibrary::Get()->GetCryptohomeLibrary()->HashPassword(password), 253 HashPassword(password),
234 !UserManager::Get()->IsKnownUser(canonicalized))); 254 !UserManager::Get()->IsKnownUser(canonicalized)));
235 { 255 {
236 // Reset the verified flag. 256 // Reset the verified flag.
237 base::AutoLock for_this_block(owner_verified_lock_); 257 base::AutoLock for_this_block(owner_verified_lock_);
238 owner_is_verified_ = false; 258 owner_is_verified_ = false;
239 } 259 }
240 260
241 const bool create_if_missing = false; 261 const bool create_if_missing = false;
242 BrowserThread::PostTask( 262 BrowserThread::PostTask(
243 BrowserThread::UI, FROM_HERE, 263 BrowserThread::UI, FROM_HERE,
(...skipping 19 matching lines...) Expand all
263 BrowserThread::UI, FROM_HERE, 283 BrowserThread::UI, FROM_HERE,
264 base::Bind(&ParallelAuthenticator::ResolveLoginCompletionStatus, this)); 284 base::Bind(&ParallelAuthenticator::ResolveLoginCompletionStatus, this));
265 } 285 }
266 } 286 }
267 287
268 void ParallelAuthenticator::AuthenticateToUnlock(const std::string& username, 288 void ParallelAuthenticator::AuthenticateToUnlock(const std::string& username,
269 const std::string& password) { 289 const std::string& password) {
270 current_state_.reset( 290 current_state_.reset(
271 new AuthAttemptState( 291 new AuthAttemptState(
272 gaia::CanonicalizeEmail(username), 292 gaia::CanonicalizeEmail(username),
273 CrosLibrary::Get()->GetCryptohomeLibrary()->HashPassword(password))); 293 HashPassword(password)));
274 check_key_attempted_ = true; 294 check_key_attempted_ = true;
275 BrowserThread::PostTask( 295 BrowserThread::PostTask(
276 BrowserThread::UI, FROM_HERE, 296 BrowserThread::UI, FROM_HERE,
277 base::Bind(&CheckKey, 297 base::Bind(&CheckKey,
278 current_state_.get(), 298 current_state_.get(),
279 static_cast<AuthAttemptStateResolver*>(this))); 299 static_cast<AuthAttemptStateResolver*>(this)));
280 } 300 }
281 301
282 void ParallelAuthenticator::LoginDemoUser() { 302 void ParallelAuthenticator::LoginDemoUser() {
283 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 303 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after
360 const std::string& user_name) { 380 const std::string& user_name) {
361 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); 381 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
362 DCHECK(using_oauth_); 382 DCHECK(using_oauth_);
363 // Mark this account's OAuth token state as invalid in the local state. 383 // Mark this account's OAuth token state as invalid in the local state.
364 UserManager::Get()->SaveUserOAuthStatus(user_name, 384 UserManager::Get()->SaveUserOAuthStatus(user_name,
365 User::OAUTH_TOKEN_STATUS_INVALID); 385 User::OAUTH_TOKEN_STATUS_INVALID);
366 } 386 }
367 387
368 void ParallelAuthenticator::RecoverEncryptedData( 388 void ParallelAuthenticator::RecoverEncryptedData(
369 const std::string& old_password) { 389 const std::string& old_password) {
370 std::string old_hash = 390 std::string old_hash = HashPassword(old_password);
371 CrosLibrary::Get()->GetCryptohomeLibrary()->HashPassword(old_password);
372 migrate_attempted_ = true; 391 migrate_attempted_ = true;
373 current_state_->ResetCryptohomeStatus(); 392 current_state_->ResetCryptohomeStatus();
374 BrowserThread::PostTask( 393 BrowserThread::PostTask(
375 BrowserThread::UI, FROM_HERE, 394 BrowserThread::UI, FROM_HERE,
376 base::Bind(&Migrate, 395 base::Bind(&Migrate,
377 current_state_.get(), 396 current_state_.get(),
378 static_cast<AuthAttemptStateResolver*>(this), 397 static_cast<AuthAttemptStateResolver*>(this),
379 true, 398 true,
380 old_hash)); 399 old_hash));
381 } 400 }
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
425 444
426 void ParallelAuthenticator::RetryAuth(Profile* profile, 445 void ParallelAuthenticator::RetryAuth(Profile* profile,
427 const std::string& username, 446 const std::string& username,
428 const std::string& password, 447 const std::string& password,
429 const std::string& login_token, 448 const std::string& login_token,
430 const std::string& login_captcha) { 449 const std::string& login_captcha) {
431 reauth_state_.reset( 450 reauth_state_.reset(
432 new AuthAttemptState( 451 new AuthAttemptState(
433 gaia::CanonicalizeEmail(username), 452 gaia::CanonicalizeEmail(username),
434 password, 453 password,
435 CrosLibrary::Get()->GetCryptohomeLibrary()->HashPassword(password), 454 HashPassword(password),
436 login_token, 455 login_token,
437 login_captcha, 456 login_captcha,
438 false /* not a new user */)); 457 false /* not a new user */));
439 // Always use ClientLogin regardless of using_oauth flag. This is because 458 // Always use ClientLogin regardless of using_oauth flag. This is because
440 // we are unable to renew oauth token on lock screen currently and will 459 // we are unable to renew oauth token on lock screen currently and will
441 // stuck with lock screen if we use OAuthLogin here. 460 // stuck with lock screen if we use OAuthLogin here.
442 // TODO(xiyuan): Revisit this after we support Gaia in lock screen. 461 // TODO(xiyuan): Revisit this after we support Gaia in lock screen.
443 current_online_.reset(new OnlineAttempt(false /* using_oauth */, 462 current_online_.reset(new OnlineAttempt(false /* using_oauth */,
444 reauth_state_.get(), 463 reauth_state_.get(),
445 this)); 464 this));
(...skipping 332 matching lines...) Expand 10 before | Expand all | Expand 10 after
778 } 797 }
779 798
780 void ParallelAuthenticator::SetOwnerState(bool owner_check_finished, 799 void ParallelAuthenticator::SetOwnerState(bool owner_check_finished,
781 bool check_result) { 800 bool check_result) {
782 base::AutoLock for_this_block(owner_verified_lock_); 801 base::AutoLock for_this_block(owner_verified_lock_);
783 owner_is_verified_ = owner_check_finished; 802 owner_is_verified_ = owner_check_finished;
784 user_can_login_ = check_result; 803 user_can_login_ = check_result;
785 } 804 }
786 805
787 } // namespace chromeos 806 } // namespace chromeos
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698