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

Side by Side Diff: components/sync/core_impl/sync_encryption_handler_impl.cc

Issue 2260953002: Supplimentary identifier for passwords specific (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: cleanup Created 4 years, 3 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
OLDNEW
1 // Copyright 2012 The Chromium Authors. All rights reserved. 1 // Copyright 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 "components/sync/core_impl/sync_encryption_handler_impl.h" 5 #include "components/sync/core_impl/sync_encryption_handler_impl.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 #include <stdint.h> 8 #include <stdint.h>
9 9
10 #include <memory> 10 #include <memory>
(...skipping 178 matching lines...) Expand 10 before | Expand all | Expand 10 after
189 } 189 }
190 old_keystore_keys->resize(number_of_keystore_keys - 1); 190 old_keystore_keys->resize(number_of_keystore_keys - 1);
191 for (int i = 0; i < number_of_keystore_keys - 1; ++i) 191 for (int i = 0; i < number_of_keystore_keys - 1; ++i)
192 internal_list_value->GetString(i, &(*old_keystore_keys)[i]); 192 internal_list_value->GetString(i, &(*old_keystore_keys)[i]);
193 return true; 193 return true;
194 } 194 }
195 195
196 } // namespace 196 } // namespace
197 197
198 SyncEncryptionHandlerImpl::Vault::Vault(Encryptor* encryptor, 198 SyncEncryptionHandlerImpl::Vault::Vault(Encryptor* encryptor,
199 ModelTypeSet encrypted_types) 199 ModelTypeSet encrypted_types,
200 : cryptographer(encryptor), encrypted_types(encrypted_types) {} 200 PassphraseType passphrase_type)
201 : cryptographer(encryptor),
202 encrypted_types(encrypted_types),
203 passphrase_type(passphrase_type) {}
201 204
202 SyncEncryptionHandlerImpl::Vault::~Vault() {} 205 SyncEncryptionHandlerImpl::Vault::~Vault() {}
203 206
204 SyncEncryptionHandlerImpl::SyncEncryptionHandlerImpl( 207 SyncEncryptionHandlerImpl::SyncEncryptionHandlerImpl(
205 UserShare* user_share, 208 UserShare* user_share,
206 Encryptor* encryptor, 209 Encryptor* encryptor,
207 const std::string& restored_key_for_bootstrapping, 210 const std::string& restored_key_for_bootstrapping,
208 const std::string& restored_keystore_key_for_bootstrapping) 211 const std::string& restored_keystore_key_for_bootstrapping)
209 : user_share_(user_share), 212 : user_share_(user_share),
210 vault_unsafe_(encryptor, SensitiveTypes()), 213 vault_unsafe_(encryptor,
214 SensitiveTypes(),
215 PassphraseType::IMPLICIT_PASSPHRASE),
211 encrypt_everything_(false), 216 encrypt_everything_(false),
212 passphrase_type_(PassphraseType::IMPLICIT_PASSPHRASE),
213 nigori_overwrite_count_(0), 217 nigori_overwrite_count_(0),
214 weak_ptr_factory_(this) { 218 weak_ptr_factory_(this) {
215 // Restore the cryptographer's previous keys. Note that we don't add the 219 // Restore the cryptographer's previous keys. Note that we don't add the
216 // keystore keys into the cryptographer here, in case a migration was pending. 220 // keystore keys into the cryptographer here, in case a migration was pending.
217 vault_unsafe_.cryptographer.Bootstrap(restored_key_for_bootstrapping); 221 vault_unsafe_.cryptographer.Bootstrap(restored_key_for_bootstrapping);
218 222
219 // If this fails, we won't have a valid keystore key, and will simply request 223 // If this fails, we won't have a valid keystore key, and will simply request
220 // new ones from the server on the next DownloadUpdates. 224 // new ones from the server on the next DownloadUpdates.
221 UnpackKeystoreBootstrapToken(restored_keystore_key_for_bootstrapping, 225 UnpackKeystoreBootstrapToken(restored_keystore_key_for_bootstrapping,
222 encryptor, &old_keystore_keys_, &keystore_key_); 226 encryptor, &old_keystore_keys_, &keystore_key_);
(...skipping 19 matching lines...) Expand all
242 WriteNode node(&trans); 246 WriteNode node(&trans);
243 247
244 if (node.InitTypeRoot(NIGORI) != BaseNode::INIT_OK) 248 if (node.InitTypeRoot(NIGORI) != BaseNode::INIT_OK)
245 return; 249 return;
246 if (!ApplyNigoriUpdateImpl(node.GetNigoriSpecifics(), 250 if (!ApplyNigoriUpdateImpl(node.GetNigoriSpecifics(),
247 trans.GetWrappedTrans())) { 251 trans.GetWrappedTrans())) {
248 WriteEncryptionStateToNigori(&trans); 252 WriteEncryptionStateToNigori(&trans);
249 } 253 }
250 254
251 UMA_HISTOGRAM_ENUMERATION( 255 UMA_HISTOGRAM_ENUMERATION(
252 "Sync.PassphraseType", static_cast<unsigned>(GetPassphraseType()), 256 "Sync.PassphraseType",
257 static_cast<unsigned>(GetPassphraseType(trans.GetWrappedTrans())),
253 static_cast<unsigned>(PassphraseType::PASSPHRASE_TYPE_SIZE)); 258 static_cast<unsigned>(PassphraseType::PASSPHRASE_TYPE_SIZE));
254 259
255 bool has_pending_keys = 260 bool has_pending_keys =
256 UnlockVault(trans.GetWrappedTrans()).cryptographer.has_pending_keys(); 261 UnlockVault(trans.GetWrappedTrans()).cryptographer.has_pending_keys();
257 bool is_ready = UnlockVault(trans.GetWrappedTrans()).cryptographer.is_ready(); 262 bool is_ready = UnlockVault(trans.GetWrappedTrans()).cryptographer.is_ready();
258 // Log the state of the cryptographer regardless of migration state. 263 // Log the state of the cryptographer regardless of migration state.
259 UMA_HISTOGRAM_BOOLEAN("Sync.CryptographerReady", is_ready); 264 UMA_HISTOGRAM_BOOLEAN("Sync.CryptographerReady", is_ready);
260 UMA_HISTOGRAM_BOOLEAN("Sync.CryptographerPendingKeys", has_pending_keys); 265 UMA_HISTOGRAM_BOOLEAN("Sync.CryptographerPendingKeys", has_pending_keys);
261 if (IsNigoriMigratedToKeystore(node.GetNigoriSpecifics())) { 266 if (IsNigoriMigratedToKeystore(node.GetNigoriSpecifics())) {
262 // This account has a nigori node that has been migrated to support 267 // This account has a nigori node that has been migrated to support
263 // keystore. 268 // keystore.
264 UMA_HISTOGRAM_ENUMERATION("Sync.NigoriMigrationState", MIGRATED, 269 UMA_HISTOGRAM_ENUMERATION("Sync.NigoriMigrationState", MIGRATED,
265 MIGRATION_STATE_SIZE); 270 MIGRATION_STATE_SIZE);
266 if (has_pending_keys && 271 if (has_pending_keys &&
267 passphrase_type_ == PassphraseType::KEYSTORE_PASSPHRASE) { 272 GetPassphraseType(trans.GetWrappedTrans()) ==
273 PassphraseType::KEYSTORE_PASSPHRASE) {
268 // If this is happening, it means the keystore decryptor is either 274 // If this is happening, it means the keystore decryptor is either
269 // undecryptable with the available keystore keys or does not match the 275 // undecryptable with the available keystore keys or does not match the
270 // nigori keybag's encryption key. Otherwise we're simply missing the 276 // nigori keybag's encryption key. Otherwise we're simply missing the
271 // keystore key. 277 // keystore key.
272 UMA_HISTOGRAM_BOOLEAN("Sync.KeystoreDecryptionFailed", 278 UMA_HISTOGRAM_BOOLEAN("Sync.KeystoreDecryptionFailed",
273 !keystore_key_.empty()); 279 !keystore_key_.empty());
274 } 280 }
275 } else if (!is_ready) { 281 } else if (!is_ready) {
276 // Migration cannot occur until the cryptographer is ready (initialized 282 // Migration cannot occur until the cryptographer is ready (initialized
277 // with GAIA password and any pending keys resolved). 283 // with GAIA password and any pending keys resolved).
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
353 // logged as true. 359 // logged as true.
354 UMA_HISTOGRAM_BOOLEAN("Sync.CustomEncryption", true); 360 UMA_HISTOGRAM_BOOLEAN("Sync.CustomEncryption", true);
355 return; 361 return;
356 } 362 }
357 363
358 std::string bootstrap_token; 364 std::string bootstrap_token;
359 sync_pb::EncryptedData pending_keys; 365 sync_pb::EncryptedData pending_keys;
360 if (cryptographer->has_pending_keys()) 366 if (cryptographer->has_pending_keys())
361 pending_keys = cryptographer->GetPendingKeys(); 367 pending_keys = cryptographer->GetPendingKeys();
362 bool success = false; 368 bool success = false;
363 369 PassphraseType* passphrase_type =
370 &UnlockVaultMutable(trans.GetWrappedTrans())->passphrase_type;
364 // There are six cases to handle here: 371 // There are six cases to handle here:
365 // 1. The user has no pending keys and is setting their current GAIA password 372 // 1. The user has no pending keys and is setting their current GAIA password
366 // as the encryption passphrase. This happens either during first time sync 373 // as the encryption passphrase. This happens either during first time sync
367 // with a clean profile, or after re-authenticating on a profile that was 374 // with a clean profile, or after re-authenticating on a profile that was
368 // already signed in with the cryptographer ready. 375 // already signed in with the cryptographer ready.
369 // 2. The user has no pending keys, and is overwriting an (already provided) 376 // 2. The user has no pending keys, and is overwriting an (already provided)
370 // implicit passphrase with an explicit (custom) passphrase. 377 // implicit passphrase with an explicit (custom) passphrase.
371 // 3. The user has pending keys for an explicit passphrase that is somehow set 378 // 3. The user has pending keys for an explicit passphrase that is somehow set
372 // to their current GAIA passphrase. 379 // to their current GAIA passphrase.
373 // 4. The user has pending keys encrypted with their current GAIA passphrase 380 // 4. The user has pending keys encrypted with their current GAIA passphrase
374 // and the caller passes in the current GAIA passphrase. 381 // and the caller passes in the current GAIA passphrase.
375 // 5. The user has pending keys encrypted with an older GAIA passphrase 382 // 5. The user has pending keys encrypted with an older GAIA passphrase
376 // and the caller passes in the current GAIA passphrase. 383 // and the caller passes in the current GAIA passphrase.
377 // 6. The user has previously done encryption with an explicit passphrase. 384 // 6. The user has previously done encryption with an explicit passphrase.
378 // Furthermore, we enforce the fact that the bootstrap encryption token will 385 // Furthermore, we enforce the fact that the bootstrap encryption token will
379 // always be derived from the newest GAIA password if the account is using 386 // always be derived from the newest GAIA password if the account is using
380 // an implicit passphrase (even if the data is encrypted with an old GAIA 387 // an implicit passphrase (even if the data is encrypted with an old GAIA
381 // password). If the account is using an explicit (custom) passphrase, the 388 // password). If the account is using an explicit (custom) passphrase, the
382 // bootstrap token will be derived from the most recently provided explicit 389 // bootstrap token will be derived from the most recently provided explicit
383 // passphrase (that was able to decrypt the data). 390 // passphrase (that was able to decrypt the data).
384 if (!IsExplicitPassphrase(passphrase_type_)) { 391 if (!IsExplicitPassphrase(*passphrase_type)) {
385 if (!cryptographer->has_pending_keys()) { 392 if (!cryptographer->has_pending_keys()) {
386 if (cryptographer->AddKey(key_params)) { 393 if (cryptographer->AddKey(key_params)) {
387 // Case 1 and 2. We set a new GAIA passphrase when there are no pending 394 // Case 1 and 2. We set a new GAIA passphrase when there are no pending
388 // keys (1), or overwriting an implicit passphrase with a new explicit 395 // keys (1), or overwriting an implicit passphrase with a new explicit
389 // one (2) when there are no pending keys. 396 // one (2) when there are no pending keys.
390 if (is_explicit) { 397 if (is_explicit) {
391 DVLOG(1) << "Setting explicit passphrase for encryption."; 398 DVLOG(1) << "Setting explicit passphrase for encryption.";
392 passphrase_type_ = PassphraseType::CUSTOM_PASSPHRASE; 399 *passphrase_type = PassphraseType::CUSTOM_PASSPHRASE;
393 custom_passphrase_time_ = base::Time::Now(); 400 custom_passphrase_time_ = base::Time::Now();
394 FOR_EACH_OBSERVER(SyncEncryptionHandler::Observer, observers_, 401 FOR_EACH_OBSERVER(SyncEncryptionHandler::Observer, observers_,
395 OnPassphraseTypeChanged( 402 OnPassphraseTypeChanged(
396 passphrase_type_, GetExplicitPassphraseTime())); 403 *passphrase_type,
404 GetExplicitPassphraseTime(*passphrase_type)));
397 } else { 405 } else {
398 DVLOG(1) << "Setting implicit passphrase for encryption."; 406 DVLOG(1) << "Setting implicit passphrase for encryption.";
399 } 407 }
400 cryptographer->GetBootstrapToken(&bootstrap_token); 408 cryptographer->GetBootstrapToken(&bootstrap_token);
401 409
402 // With M26, sync accounts can be in only one of two encryption states: 410 // With M26, sync accounts can be in only one of two encryption states:
403 // 1) Encrypt only passwords with an implicit passphrase. 411 // 1) Encrypt only passwords with an implicit passphrase.
404 // 2) Encrypt all sync datatypes with an explicit passphrase. 412 // 2) Encrypt all sync datatypes with an explicit passphrase.
405 // We deprecate the "EncryptAllData" and "CustomPassphrase" histograms, 413 // We deprecate the "EncryptAllData" and "CustomPassphrase" histograms,
406 // and keep track of an account's encryption state via the 414 // and keep track of an account's encryption state via the
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
440 temp_cryptographer.GetBootstrapToken(&bootstrap_token); 448 temp_cryptographer.GetBootstrapToken(&bootstrap_token);
441 // We then set the new passphrase as the default passphrase of the 449 // We then set the new passphrase as the default passphrase of the
442 // real cryptographer, even though we have pending keys. This is safe, 450 // real cryptographer, even though we have pending keys. This is safe,
443 // as although Cryptographer::is_initialized() will now be true, 451 // as although Cryptographer::is_initialized() will now be true,
444 // is_ready() will remain false due to having pending keys. 452 // is_ready() will remain false due to having pending keys.
445 cryptographer->AddKey(key_params); 453 cryptographer->AddKey(key_params);
446 success = false; 454 success = false;
447 } 455 }
448 } // is_explicit 456 } // is_explicit
449 } // cryptographer->has_pending_keys() 457 } // cryptographer->has_pending_keys()
450 } else { // IsExplicitPassphrase(passphrase_type_) == true. 458 } else { // IsExplicitPassphrase(passphrase_type) == true.
451 // Case 6. We do not want to override a previously set explicit passphrase, 459 // Case 6. We do not want to override a previously set explicit passphrase,
452 // so we return a failure. 460 // so we return a failure.
453 DVLOG(1) << "Failing because an explicit passphrase is already set."; 461 DVLOG(1) << "Failing because an explicit passphrase is already set.";
454 success = false; 462 success = false;
455 } 463 }
456 464
457 DVLOG_IF(1, !success) 465 DVLOG_IF(1, !success)
458 << "Failure in SetEncryptionPassphrase; notifying and returning."; 466 << "Failure in SetEncryptionPassphrase; notifying and returning.";
459 DVLOG_IF(1, success) 467 DVLOG_IF(1, success)
460 << "Successfully set encryption passphrase; updating nigori and " 468 << "Successfully set encryption passphrase; updating nigori and "
(...skipping 19 matching lines...) Expand all
480 NOTREACHED(); 488 NOTREACHED();
481 return; 489 return;
482 } 490 }
483 491
484 // Once we've migrated to keystore, we're only ever decrypting keys derived 492 // Once we've migrated to keystore, we're only ever decrypting keys derived
485 // from an explicit passphrase. But, for clients without a keystore key yet 493 // from an explicit passphrase. But, for clients without a keystore key yet
486 // (either not on by default or failed to download one), we still support 494 // (either not on by default or failed to download one), we still support
487 // decrypting with a gaia passphrase, and therefore bypass the 495 // decrypting with a gaia passphrase, and therefore bypass the
488 // DecryptPendingKeysWithExplicitPassphrase logic. 496 // DecryptPendingKeysWithExplicitPassphrase logic.
489 if (IsNigoriMigratedToKeystore(node.GetNigoriSpecifics()) && 497 if (IsNigoriMigratedToKeystore(node.GetNigoriSpecifics()) &&
490 IsExplicitPassphrase(passphrase_type_)) { 498 IsExplicitPassphrase(GetPassphraseType(trans.GetWrappedTrans()))) {
491 DecryptPendingKeysWithExplicitPassphrase(passphrase, &trans, &node); 499 DecryptPendingKeysWithExplicitPassphrase(passphrase, &trans, &node);
492 return; 500 return;
493 } 501 }
494 502
495 Cryptographer* cryptographer = 503 Cryptographer* cryptographer =
496 &UnlockVaultMutable(trans.GetWrappedTrans())->cryptographer; 504 &UnlockVaultMutable(trans.GetWrappedTrans())->cryptographer;
497 if (!cryptographer->has_pending_keys()) { 505 if (!cryptographer->has_pending_keys()) {
498 // Note that this *can* happen in a rare situation where data is 506 // Note that this *can* happen in a rare situation where data is
499 // re-encrypted on another client while a SetDecryptionPassphrase() call is 507 // re-encrypted on another client while a SetDecryptionPassphrase() call is
500 // in-flight on this client. It is rare enough that we choose to do nothing. 508 // in-flight on this client. It is rare enough that we choose to do nothing.
(...skipping 13 matching lines...) Expand all
514 // passphrase, where the data is already encrypted with the newest GAIA 522 // passphrase, where the data is already encrypted with the newest GAIA
515 // password. 523 // password.
516 // 8. The user is providing an old GAIA password to decrypt the pending keys. 524 // 8. The user is providing an old GAIA password to decrypt the pending keys.
517 // In this case, the user is using an implicit passphrase, but has changed 525 // In this case, the user is using an implicit passphrase, but has changed
518 // their password since they last encrypted their data, and therefore 526 // their password since they last encrypted their data, and therefore
519 // their current GAIA password was unable to decrypt the data. This will 527 // their current GAIA password was unable to decrypt the data. This will
520 // happen when the user is setting up a new profile with a previously 528 // happen when the user is setting up a new profile with a previously
521 // encrypted account (after changing passwords). 529 // encrypted account (after changing passwords).
522 // 9. The user is providing a previously set explicit passphrase to decrypt 530 // 9. The user is providing a previously set explicit passphrase to decrypt
523 // the pending keys. 531 // the pending keys.
524 if (!IsExplicitPassphrase(passphrase_type_)) { 532 if (!IsExplicitPassphrase(GetPassphraseType(trans.GetWrappedTrans()))) {
525 if (cryptographer->is_initialized()) { 533 if (cryptographer->is_initialized()) {
526 // We only want to change the default encryption key to the pending 534 // We only want to change the default encryption key to the pending
527 // one if the pending keybag already contains the current default. 535 // one if the pending keybag already contains the current default.
528 // This covers the case where a different client re-encrypted 536 // This covers the case where a different client re-encrypted
529 // everything with a newer gaia passphrase (and hence the keybag 537 // everything with a newer gaia passphrase (and hence the keybag
530 // contains keys from all previously used gaia passphrases). 538 // contains keys from all previously used gaia passphrases).
531 // Otherwise, we're in a situation where the pending keys are 539 // Otherwise, we're in a situation where the pending keys are
532 // encrypted with an old gaia passphrase, while the default is the 540 // encrypted with an old gaia passphrase, while the default is the
533 // current gaia passphrase. In that case, we preserve the default. 541 // current gaia passphrase. In that case, we preserve the default.
534 Cryptographer temp_cryptographer(cryptographer->encryptor()); 542 Cryptographer temp_cryptographer(cryptographer->encryptor());
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after
620 WriteEncryptionStateToNigori(&trans); 628 WriteEncryptionStateToNigori(&trans);
621 if (UnlockVault(trans.GetWrappedTrans()).cryptographer.is_ready()) 629 if (UnlockVault(trans.GetWrappedTrans()).cryptographer.is_ready())
622 ReEncryptEverything(&trans); 630 ReEncryptEverything(&trans);
623 } 631 }
624 632
625 bool SyncEncryptionHandlerImpl::IsEncryptEverythingEnabled() const { 633 bool SyncEncryptionHandlerImpl::IsEncryptEverythingEnabled() const {
626 DCHECK(thread_checker_.CalledOnValidThread()); 634 DCHECK(thread_checker_.CalledOnValidThread());
627 return encrypt_everything_; 635 return encrypt_everything_;
628 } 636 }
629 637
630 PassphraseType SyncEncryptionHandlerImpl::GetPassphraseType() const {
631 DCHECK(thread_checker_.CalledOnValidThread());
632 return passphrase_type_;
633 }
634
635 // Note: this is called from within a syncable transaction, so we need to post 638 // Note: this is called from within a syncable transaction, so we need to post
636 // tasks if we want to do any work that creates a new sync_api transaction. 639 // tasks if we want to do any work that creates a new sync_api transaction.
637 void SyncEncryptionHandlerImpl::ApplyNigoriUpdate( 640 void SyncEncryptionHandlerImpl::ApplyNigoriUpdate(
638 const sync_pb::NigoriSpecifics& nigori, 641 const sync_pb::NigoriSpecifics& nigori,
639 syncable::BaseTransaction* const trans) { 642 syncable::BaseTransaction* const trans) {
640 DCHECK(thread_checker_.CalledOnValidThread()); 643 DCHECK(thread_checker_.CalledOnValidThread());
641 DCHECK(trans); 644 DCHECK(trans);
642 if (!ApplyNigoriUpdateImpl(nigori, trans)) { 645 if (!ApplyNigoriUpdateImpl(nigori, trans)) {
643 base::ThreadTaskRunnerHandle::Get()->PostTask( 646 base::ThreadTaskRunnerHandle::Get()->PostTask(
644 FROM_HERE, base::Bind(&SyncEncryptionHandlerImpl::RewriteNigori, 647 FROM_HERE, base::Bind(&SyncEncryptionHandlerImpl::RewriteNigori,
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
709 const sync_pb::NigoriSpecifics& nigori = entry.GetSpecifics().nigori(); 712 const sync_pb::NigoriSpecifics& nigori = entry.GetSpecifics().nigori();
710 if (cryptographer->has_pending_keys() && IsNigoriMigratedToKeystore(nigori) && 713 if (cryptographer->has_pending_keys() && IsNigoriMigratedToKeystore(nigori) &&
711 !nigori.keystore_decryptor_token().blob().empty()) { 714 !nigori.keystore_decryptor_token().blob().empty()) {
712 // If the nigori is already migrated and we have pending keys, we might 715 // If the nigori is already migrated and we have pending keys, we might
713 // be able to decrypt them using either the keystore decryptor token 716 // be able to decrypt them using either the keystore decryptor token
714 // or the existing keystore keys. 717 // or the existing keystore keys.
715 DecryptPendingKeysWithKeystoreKey( 718 DecryptPendingKeysWithKeystoreKey(
716 keystore_key_, nigori.keystore_decryptor_token(), cryptographer); 719 keystore_key_, nigori.keystore_decryptor_token(), cryptographer);
717 } 720 }
718 721
722 PassphraseType* passphrase_type = &UnlockVaultMutable(trans)->passphrase_type;
719 // Note that triggering migration will have no effect if we're already 723 // Note that triggering migration will have no effect if we're already
720 // properly migrated with the newest keystore keys. 724 // properly migrated with the newest keystore keys.
721 if (ShouldTriggerMigration(nigori, *cryptographer)) { 725 if (ShouldTriggerMigration(nigori, *cryptographer, passphrase_type)) {
722 base::ThreadTaskRunnerHandle::Get()->PostTask( 726 base::ThreadTaskRunnerHandle::Get()->PostTask(
723 FROM_HERE, base::Bind(&SyncEncryptionHandlerImpl::RewriteNigori, 727 FROM_HERE, base::Bind(&SyncEncryptionHandlerImpl::RewriteNigori,
724 weak_ptr_factory_.GetWeakPtr())); 728 weak_ptr_factory_.GetWeakPtr()));
725 } 729 }
726 730
727 return true; 731 return true;
728 } 732 }
729 733
730 ModelTypeSet SyncEncryptionHandlerImpl::GetEncryptedTypes( 734 ModelTypeSet SyncEncryptionHandlerImpl::GetEncryptedTypes(
731 syncable::BaseTransaction* const trans) const { 735 syncable::BaseTransaction* const trans) const {
732 return UnlockVault(trans).encrypted_types; 736 return UnlockVault(trans).encrypted_types;
733 } 737 }
734 738
739 PassphraseType SyncEncryptionHandlerImpl::GetPassphraseType(
740 syncable::BaseTransaction* const trans) const {
741 return UnlockVault(trans).passphrase_type;
742 }
743
735 Cryptographer* SyncEncryptionHandlerImpl::GetCryptographerUnsafe() { 744 Cryptographer* SyncEncryptionHandlerImpl::GetCryptographerUnsafe() {
736 DCHECK(thread_checker_.CalledOnValidThread()); 745 DCHECK(thread_checker_.CalledOnValidThread());
737 return &vault_unsafe_.cryptographer; 746 return &vault_unsafe_.cryptographer;
738 } 747 }
739 748
740 ModelTypeSet SyncEncryptionHandlerImpl::GetEncryptedTypesUnsafe() { 749 ModelTypeSet SyncEncryptionHandlerImpl::GetEncryptedTypesUnsafe() {
741 DCHECK(thread_checker_.CalledOnValidThread()); 750 DCHECK(thread_checker_.CalledOnValidThread());
742 return vault_unsafe_.encrypted_types; 751 return vault_unsafe_.encrypted_types;
743 } 752 }
744 753
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after
858 syncable::BaseTransaction* const trans) { 867 syncable::BaseTransaction* const trans) {
859 DCHECK(thread_checker_.CalledOnValidThread()); 868 DCHECK(thread_checker_.CalledOnValidThread());
860 DVLOG(1) << "Applying nigori node update."; 869 DVLOG(1) << "Applying nigori node update.";
861 bool nigori_types_need_update = 870 bool nigori_types_need_update =
862 !UpdateEncryptedTypesFromNigori(nigori, trans); 871 !UpdateEncryptedTypesFromNigori(nigori, trans);
863 872
864 if (nigori.custom_passphrase_time() != 0) { 873 if (nigori.custom_passphrase_time() != 0) {
865 custom_passphrase_time_ = ProtoTimeToTime(nigori.custom_passphrase_time()); 874 custom_passphrase_time_ = ProtoTimeToTime(nigori.custom_passphrase_time());
866 } 875 }
867 bool is_nigori_migrated = IsNigoriMigratedToKeystore(nigori); 876 bool is_nigori_migrated = IsNigoriMigratedToKeystore(nigori);
877 PassphraseType* passphrase_type = &UnlockVaultMutable(trans)->passphrase_type;
868 if (is_nigori_migrated) { 878 if (is_nigori_migrated) {
869 migration_time_ = ProtoTimeToTime(nigori.keystore_migration_time()); 879 migration_time_ = ProtoTimeToTime(nigori.keystore_migration_time());
870 PassphraseType nigori_passphrase_type = 880 PassphraseType nigori_passphrase_type =
871 ProtoPassphraseTypeToEnum(nigori.passphrase_type()); 881 ProtoPassphraseTypeToEnum(nigori.passphrase_type());
872 882
873 // Only update the local passphrase state if it's a valid transition: 883 // Only update the local passphrase state if it's a valid transition:
874 // - implicit -> keystore 884 // - implicit -> keystore
875 // - implicit -> frozen implicit 885 // - implicit -> frozen implicit
876 // - implicit -> custom 886 // - implicit -> custom
877 // - keystore -> custom 887 // - keystore -> custom
878 // Note: frozen implicit -> custom is not technically a valid transition, 888 // Note: frozen implicit -> custom is not technically a valid transition,
879 // but we let it through here as well in case future versions do add support 889 // but we let it through here as well in case future versions do add support
880 // for this transition. 890 // for this transition.
881 if (passphrase_type_ != nigori_passphrase_type && 891 if (*passphrase_type != nigori_passphrase_type &&
882 nigori_passphrase_type != PassphraseType::IMPLICIT_PASSPHRASE && 892 nigori_passphrase_type != PassphraseType::IMPLICIT_PASSPHRASE &&
883 (passphrase_type_ == PassphraseType::IMPLICIT_PASSPHRASE || 893 (*passphrase_type == PassphraseType::IMPLICIT_PASSPHRASE ||
884 nigori_passphrase_type == PassphraseType::CUSTOM_PASSPHRASE)) { 894 nigori_passphrase_type == PassphraseType::CUSTOM_PASSPHRASE)) {
885 DVLOG(1) << "Changing passphrase state from " 895 DVLOG(1) << "Changing passphrase state from "
886 << PassphraseTypeToString(passphrase_type_) << " to " 896 << PassphraseTypeToString(*passphrase_type) << " to "
887 << PassphraseTypeToString(nigori_passphrase_type); 897 << PassphraseTypeToString(nigori_passphrase_type);
888 passphrase_type_ = nigori_passphrase_type; 898 *passphrase_type = nigori_passphrase_type;
889 FOR_EACH_OBSERVER(SyncEncryptionHandler::Observer, observers_, 899 FOR_EACH_OBSERVER(
890 OnPassphraseTypeChanged(passphrase_type_, 900 SyncEncryptionHandler::Observer, observers_,
891 GetExplicitPassphraseTime())); 901 OnPassphraseTypeChanged(*passphrase_type,
902 GetExplicitPassphraseTime(*passphrase_type)));
892 } 903 }
893 if (passphrase_type_ == PassphraseType::KEYSTORE_PASSPHRASE && 904 if (*passphrase_type == PassphraseType::KEYSTORE_PASSPHRASE &&
894 encrypt_everything_) { 905 encrypt_everything_) {
895 // This is the case where another client that didn't support keystore 906 // This is the case where another client that didn't support keystore
896 // encryption attempted to enable full encryption. We detect it 907 // encryption attempted to enable full encryption. We detect it
897 // and switch the passphrase type to frozen implicit passphrase instead 908 // and switch the passphrase type to frozen implicit passphrase instead
898 // due to full encryption not being compatible with keystore passphrase. 909 // due to full encryption not being compatible with keystore passphrase.
899 // Because the local passphrase type will not match the nigori passphrase 910 // Because the local passphrase type will not match the nigori passphrase
900 // type, we will trigger a rewrite and subsequently a re-migration. 911 // type, we will trigger a rewrite and subsequently a re-migration.
901 DVLOG(1) << "Changing passphrase state to FROZEN_IMPLICIT_PASSPHRASE " 912 DVLOG(1) << "Changing passphrase state to FROZEN_IMPLICIT_PASSPHRASE "
902 << "due to full encryption."; 913 << "due to full encryption.";
903 passphrase_type_ = PassphraseType::FROZEN_IMPLICIT_PASSPHRASE; 914 *passphrase_type = PassphraseType::FROZEN_IMPLICIT_PASSPHRASE;
904 FOR_EACH_OBSERVER(SyncEncryptionHandler::Observer, observers_, 915 FOR_EACH_OBSERVER(
905 OnPassphraseTypeChanged(passphrase_type_, 916 SyncEncryptionHandler::Observer, observers_,
906 GetExplicitPassphraseTime())); 917 OnPassphraseTypeChanged(*passphrase_type,
918 GetExplicitPassphraseTime(*passphrase_type)));
907 } 919 }
908 } else { 920 } else {
909 // It's possible that while we're waiting for migration a client that does 921 // It's possible that while we're waiting for migration a client that does
910 // not have keystore encryption enabled switches to a custom passphrase. 922 // not have keystore encryption enabled switches to a custom passphrase.
911 if (nigori.keybag_is_frozen() && 923 if (nigori.keybag_is_frozen() &&
912 passphrase_type_ != PassphraseType::CUSTOM_PASSPHRASE) { 924 *passphrase_type != PassphraseType::CUSTOM_PASSPHRASE) {
913 passphrase_type_ = PassphraseType::CUSTOM_PASSPHRASE; 925 *passphrase_type = PassphraseType::CUSTOM_PASSPHRASE;
914 FOR_EACH_OBSERVER(SyncEncryptionHandler::Observer, observers_, 926 FOR_EACH_OBSERVER(
915 OnPassphraseTypeChanged(passphrase_type_, 927 SyncEncryptionHandler::Observer, observers_,
916 GetExplicitPassphraseTime())); 928 OnPassphraseTypeChanged(*passphrase_type,
929 GetExplicitPassphraseTime(*passphrase_type)));
917 } 930 }
918 } 931 }
919 932
920 Cryptographer* cryptographer = &UnlockVaultMutable(trans)->cryptographer; 933 Cryptographer* cryptographer = &UnlockVaultMutable(trans)->cryptographer;
921 bool nigori_needs_new_keys = false; 934 bool nigori_needs_new_keys = false;
922 if (!nigori.encryption_keybag().blob().empty()) { 935 if (!nigori.encryption_keybag().blob().empty()) {
923 // We only update the default key if this was a new explicit passphrase. 936 // We only update the default key if this was a new explicit passphrase.
924 // Else, since it was decryptable, it must not have been a new key. 937 // Else, since it was decryptable, it must not have been a new key.
925 bool need_new_default_key = false; 938 bool need_new_default_key = false;
926 if (is_nigori_migrated) { 939 if (is_nigori_migrated) {
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
971 DVLOG(1) << "OnPassphraseRequired sent because cryptographer is not " 984 DVLOG(1) << "OnPassphraseRequired sent because cryptographer is not "
972 << "ready"; 985 << "ready";
973 FOR_EACH_OBSERVER( 986 FOR_EACH_OBSERVER(
974 SyncEncryptionHandler::Observer, observers_, 987 SyncEncryptionHandler::Observer, observers_,
975 OnPassphraseRequired(REASON_ENCRYPTION, sync_pb::EncryptedData())); 988 OnPassphraseRequired(REASON_ENCRYPTION, sync_pb::EncryptedData()));
976 } 989 }
977 990
978 // Check if the current local encryption state is stricter/newer than the 991 // Check if the current local encryption state is stricter/newer than the
979 // nigori state. If so, we need to overwrite the nigori node with the local 992 // nigori state. If so, we need to overwrite the nigori node with the local
980 // state. 993 // state.
981 bool passphrase_type_matches = true; 994 bool passphrase_typematches = true;
982 if (!is_nigori_migrated) { 995 if (!is_nigori_migrated) {
983 DCHECK(passphrase_type_ == PassphraseType::CUSTOM_PASSPHRASE || 996 DCHECK(*passphrase_type == PassphraseType::CUSTOM_PASSPHRASE ||
984 passphrase_type_ == PassphraseType::IMPLICIT_PASSPHRASE); 997 *passphrase_type == PassphraseType::IMPLICIT_PASSPHRASE);
985 passphrase_type_matches = 998 passphrase_typematches =
986 nigori.keybag_is_frozen() == IsExplicitPassphrase(passphrase_type_); 999 nigori.keybag_is_frozen() == IsExplicitPassphrase(*passphrase_type);
987 } else { 1000 } else {
988 passphrase_type_matches = 1001 passphrase_typematches =
989 (ProtoPassphraseTypeToEnum(nigori.passphrase_type()) == 1002 (ProtoPassphraseTypeToEnum(nigori.passphrase_type()) ==
990 passphrase_type_); 1003 *passphrase_type);
991 } 1004 }
992 if (!passphrase_type_matches || 1005 if (!passphrase_typematches ||
993 nigori.encrypt_everything() != encrypt_everything_ || 1006 nigori.encrypt_everything() != encrypt_everything_ ||
994 nigori_types_need_update || nigori_needs_new_keys) { 1007 nigori_types_need_update || nigori_needs_new_keys) {
995 DVLOG(1) << "Triggering nigori rewrite."; 1008 DVLOG(1) << "Triggering nigori rewrite.";
996 return false; 1009 return false;
997 } 1010 }
998 return true; 1011 return true;
999 } 1012 }
1000 1013
1001 void SyncEncryptionHandlerImpl::RewriteNigori() { 1014 void SyncEncryptionHandlerImpl::RewriteNigori() {
1002 DVLOG(1) << "Writing local encryption state into nigori."; 1015 DVLOG(1) << "Writing local encryption state into nigori.";
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after
1095 } 1108 }
1096 1109
1097 void SyncEncryptionHandlerImpl::SetCustomPassphrase( 1110 void SyncEncryptionHandlerImpl::SetCustomPassphrase(
1098 const std::string& passphrase, 1111 const std::string& passphrase,
1099 WriteTransaction* trans, 1112 WriteTransaction* trans,
1100 WriteNode* nigori_node) { 1113 WriteNode* nigori_node) {
1101 DCHECK(thread_checker_.CalledOnValidThread()); 1114 DCHECK(thread_checker_.CalledOnValidThread());
1102 DCHECK(IsNigoriMigratedToKeystore(nigori_node->GetNigoriSpecifics())); 1115 DCHECK(IsNigoriMigratedToKeystore(nigori_node->GetNigoriSpecifics()));
1103 KeyParams key_params = {"localhost", "dummy", passphrase}; 1116 KeyParams key_params = {"localhost", "dummy", passphrase};
1104 1117
1105 if (passphrase_type_ != PassphraseType::KEYSTORE_PASSPHRASE) { 1118 if (GetPassphraseType(trans->GetWrappedTrans()) !=
1119 PassphraseType::KEYSTORE_PASSPHRASE) {
1106 DVLOG(1) << "Failing to set a custom passphrase because one has already " 1120 DVLOG(1) << "Failing to set a custom passphrase because one has already "
1107 << "been set."; 1121 << "been set.";
1108 FinishSetPassphrase(false, std::string(), trans, nigori_node); 1122 FinishSetPassphrase(false, std::string(), trans, nigori_node);
1109 return; 1123 return;
1110 } 1124 }
1111 1125
1112 Cryptographer* cryptographer = 1126 Cryptographer* cryptographer =
1113 &UnlockVaultMutable(trans->GetWrappedTrans())->cryptographer; 1127 &UnlockVaultMutable(trans->GetWrappedTrans())->cryptographer;
1114 if (cryptographer->has_pending_keys()) { 1128 if (cryptographer->has_pending_keys()) {
1115 // This theoretically shouldn't happen, because the only way to have pending 1129 // This theoretically shouldn't happen, because the only way to have pending
1116 // keys after migrating to keystore support is if a custom passphrase was 1130 // keys after migrating to keystore support is if a custom passphrase was
1117 // set, which should update passpshrase_state_ and should be caught by the 1131 // set, which should update passpshrase_state_ and should be caught by the
1118 // if statement above. For the sake of safety though, we check for it in 1132 // if statement above. For the sake of safety though, we check for it in
1119 // case a client is misbehaving. 1133 // case a client is misbehaving.
1120 LOG(ERROR) << "Failing to set custom passphrase because of pending keys."; 1134 LOG(ERROR) << "Failing to set custom passphrase because of pending keys.";
1121 FinishSetPassphrase(false, std::string(), trans, nigori_node); 1135 FinishSetPassphrase(false, std::string(), trans, nigori_node);
1122 return; 1136 return;
1123 } 1137 }
1124 1138
1125 std::string bootstrap_token; 1139 std::string bootstrap_token;
1126 if (!cryptographer->AddKey(key_params)) { 1140 if (!cryptographer->AddKey(key_params)) {
1127 NOTREACHED() << "Failed to add key to cryptographer."; 1141 NOTREACHED() << "Failed to add key to cryptographer.";
1128 return; 1142 return;
1129 } 1143 }
1130 1144
1131 DVLOG(1) << "Setting custom passphrase."; 1145 DVLOG(1) << "Setting custom passphrase.";
1132 cryptographer->GetBootstrapToken(&bootstrap_token); 1146 cryptographer->GetBootstrapToken(&bootstrap_token);
1133 passphrase_type_ = PassphraseType::CUSTOM_PASSPHRASE; 1147 PassphraseType* passphrase_type =
1148 &UnlockVaultMutable(trans->GetWrappedTrans())->passphrase_type;
1149 *passphrase_type = PassphraseType::CUSTOM_PASSPHRASE;
1134 custom_passphrase_time_ = base::Time::Now(); 1150 custom_passphrase_time_ = base::Time::Now();
1135 FOR_EACH_OBSERVER( 1151 FOR_EACH_OBSERVER(
1136 SyncEncryptionHandler::Observer, observers_, 1152 SyncEncryptionHandler::Observer, observers_,
1137 OnPassphraseTypeChanged(passphrase_type_, GetExplicitPassphraseTime())); 1153 OnPassphraseTypeChanged(*passphrase_type,
1154 GetExplicitPassphraseTime(*passphrase_type)));
1138 FinishSetPassphrase(true, bootstrap_token, trans, nigori_node); 1155 FinishSetPassphrase(true, bootstrap_token, trans, nigori_node);
1139 } 1156 }
1140 1157
1141 void SyncEncryptionHandlerImpl::NotifyObserversOfLocalCustomPassphrase( 1158 void SyncEncryptionHandlerImpl::NotifyObserversOfLocalCustomPassphrase(
1142 WriteTransaction* trans) { 1159 WriteTransaction* trans) {
1143 WriteNode nigori_node(trans); 1160 WriteNode nigori_node(trans);
1144 BaseNode::InitByLookupResult init_result = nigori_node.InitTypeRoot(NIGORI); 1161 BaseNode::InitByLookupResult init_result = nigori_node.InitTypeRoot(NIGORI);
1145 DCHECK_EQ(init_result, BaseNode::INIT_OK); 1162 DCHECK_EQ(init_result, BaseNode::INIT_OK);
1146 NigoriState nigori_state; 1163 NigoriState nigori_state;
1147 nigori_state.nigori_specifics = nigori_node.GetNigoriSpecifics(); 1164 nigori_state.nigori_specifics = nigori_node.GetNigoriSpecifics();
1148 DCHECK(nigori_state.nigori_specifics.passphrase_type() == 1165 DCHECK(nigori_state.nigori_specifics.passphrase_type() ==
1149 sync_pb::NigoriSpecifics::CUSTOM_PASSPHRASE || 1166 sync_pb::NigoriSpecifics::CUSTOM_PASSPHRASE ||
1150 nigori_state.nigori_specifics.passphrase_type() == 1167 nigori_state.nigori_specifics.passphrase_type() ==
1151 sync_pb::NigoriSpecifics::FROZEN_IMPLICIT_PASSPHRASE); 1168 sync_pb::NigoriSpecifics::FROZEN_IMPLICIT_PASSPHRASE);
1152 FOR_EACH_OBSERVER(SyncEncryptionHandler::Observer, observers_, 1169 FOR_EACH_OBSERVER(SyncEncryptionHandler::Observer, observers_,
1153 OnLocalSetPassphraseEncryption(nigori_state)); 1170 OnLocalSetPassphraseEncryption(nigori_state));
1154 } 1171 }
1155 1172
1156 void SyncEncryptionHandlerImpl::DecryptPendingKeysWithExplicitPassphrase( 1173 void SyncEncryptionHandlerImpl::DecryptPendingKeysWithExplicitPassphrase(
1157 const std::string& passphrase, 1174 const std::string& passphrase,
1158 WriteTransaction* trans, 1175 WriteTransaction* trans,
1159 WriteNode* nigori_node) { 1176 WriteNode* nigori_node) {
1160 DCHECK(thread_checker_.CalledOnValidThread()); 1177 DCHECK(thread_checker_.CalledOnValidThread());
1161 DCHECK(IsExplicitPassphrase(passphrase_type_)); 1178 DCHECK(IsExplicitPassphrase(GetPassphraseType(trans->GetWrappedTrans())));
1162 KeyParams key_params = {"localhost", "dummy", passphrase}; 1179 KeyParams key_params = {"localhost", "dummy", passphrase};
1163 1180
1164 Cryptographer* cryptographer = 1181 Cryptographer* cryptographer =
1165 &UnlockVaultMutable(trans->GetWrappedTrans())->cryptographer; 1182 &UnlockVaultMutable(trans->GetWrappedTrans())->cryptographer;
1166 if (!cryptographer->has_pending_keys()) { 1183 if (!cryptographer->has_pending_keys()) {
1167 // Note that this *can* happen in a rare situation where data is 1184 // Note that this *can* happen in a rare situation where data is
1168 // re-encrypted on another client while a SetDecryptionPassphrase() call is 1185 // re-encrypted on another client while a SetDecryptionPassphrase() call is
1169 // in-flight on this client. It is rare enough that we choose to do nothing. 1186 // in-flight on this client. It is rare enough that we choose to do nothing.
1170 NOTREACHED() << "Attempt to set decryption passphrase failed because there " 1187 NOTREACHED() << "Attempt to set decryption passphrase failed because there "
1171 << "were no pending keys."; 1188 << "were no pending keys.";
1172 return; 1189 return;
1173 } 1190 }
1174 1191
1175 DCHECK(IsExplicitPassphrase(passphrase_type_)); 1192 DCHECK(IsExplicitPassphrase(GetPassphraseType(trans->GetWrappedTrans())));
1176 bool success = false; 1193 bool success = false;
1177 std::string bootstrap_token; 1194 std::string bootstrap_token;
1178 if (cryptographer->DecryptPendingKeys(key_params)) { 1195 if (cryptographer->DecryptPendingKeys(key_params)) {
1179 DVLOG(1) << "Explicit passphrase accepted for decryption."; 1196 DVLOG(1) << "Explicit passphrase accepted for decryption.";
1180 cryptographer->GetBootstrapToken(&bootstrap_token); 1197 cryptographer->GetBootstrapToken(&bootstrap_token);
1181 success = true; 1198 success = true;
1182 } else { 1199 } else {
1183 DVLOG(1) << "Explicit passphrase failed to decrypt."; 1200 DVLOG(1) << "Explicit passphrase failed to decrypt.";
1184 success = false; 1201 success = false;
1185 } 1202 }
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
1237 // (in otherwords, if ShouldTriggerMigration is false). 1254 // (in otherwords, if ShouldTriggerMigration is false).
1238 // Otherwise will update the nigori node with the current migrated state, 1255 // Otherwise will update the nigori node with the current migrated state,
1239 // writing all encryption state as it does. 1256 // writing all encryption state as it does.
1240 if (!AttemptToMigrateNigoriToKeystore(trans, nigori_node)) { 1257 if (!AttemptToMigrateNigoriToKeystore(trans, nigori_node)) {
1241 sync_pb::NigoriSpecifics nigori(nigori_node->GetNigoriSpecifics()); 1258 sync_pb::NigoriSpecifics nigori(nigori_node->GetNigoriSpecifics());
1242 // Does not modify nigori.encryption_keybag() if the original decrypted 1259 // Does not modify nigori.encryption_keybag() if the original decrypted
1243 // data was the same. 1260 // data was the same.
1244 if (!cryptographer.GetKeys(nigori.mutable_encryption_keybag())) 1261 if (!cryptographer.GetKeys(nigori.mutable_encryption_keybag()))
1245 NOTREACHED(); 1262 NOTREACHED();
1246 if (IsNigoriMigratedToKeystore(nigori)) { 1263 if (IsNigoriMigratedToKeystore(nigori)) {
1247 DCHECK(keystore_key_.empty() || IsExplicitPassphrase(passphrase_type_)); 1264 DCHECK(keystore_key_.empty() ||
1265 IsExplicitPassphrase(GetPassphraseType(trans->GetWrappedTrans())));
1248 DVLOG(1) << "Leaving nigori migration state untouched after setting" 1266 DVLOG(1) << "Leaving nigori migration state untouched after setting"
1249 << " passphrase."; 1267 << " passphrase.";
1250 } else { 1268 } else {
1251 nigori.set_keybag_is_frozen(IsExplicitPassphrase(passphrase_type_)); 1269 nigori.set_keybag_is_frozen(
1270 IsExplicitPassphrase(GetPassphraseType(trans->GetWrappedTrans())));
1252 } 1271 }
1253 // If we set a new custom passphrase, store the timestamp. 1272 // If we set a new custom passphrase, store the timestamp.
1254 if (!custom_passphrase_time_.is_null()) { 1273 if (!custom_passphrase_time_.is_null()) {
1255 nigori.set_custom_passphrase_time( 1274 nigori.set_custom_passphrase_time(
1256 TimeToProtoTime(custom_passphrase_time_)); 1275 TimeToProtoTime(custom_passphrase_time_));
1257 } 1276 }
1258 nigori_node->SetNigoriSpecifics(nigori); 1277 nigori_node->SetNigoriSpecifics(nigori);
1259 } 1278 }
1260 1279
1261 // Must do this after OnPassphraseTypeChanged, in order to ensure the PSS 1280 // Must do this after OnPassphraseTypeChanged, in order to ensure the PSS
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
1293 } 1312 }
1294 1313
1295 const SyncEncryptionHandlerImpl::Vault& SyncEncryptionHandlerImpl::UnlockVault( 1314 const SyncEncryptionHandlerImpl::Vault& SyncEncryptionHandlerImpl::UnlockVault(
1296 syncable::BaseTransaction* const trans) const { 1315 syncable::BaseTransaction* const trans) const {
1297 DCHECK_EQ(user_share_->directory.get(), trans->directory()); 1316 DCHECK_EQ(user_share_->directory.get(), trans->directory());
1298 return vault_unsafe_; 1317 return vault_unsafe_;
1299 } 1318 }
1300 1319
1301 bool SyncEncryptionHandlerImpl::ShouldTriggerMigration( 1320 bool SyncEncryptionHandlerImpl::ShouldTriggerMigration(
1302 const sync_pb::NigoriSpecifics& nigori, 1321 const sync_pb::NigoriSpecifics& nigori,
1303 const Cryptographer& cryptographer) const { 1322 const Cryptographer& cryptographer,
1323 PassphraseType* passphrase_type) const {
1304 DCHECK(thread_checker_.CalledOnValidThread()); 1324 DCHECK(thread_checker_.CalledOnValidThread());
1305 // Don't migrate if there are pending encryption keys (because data 1325 // Don't migrate if there are pending encryption keys (because data
1306 // encrypted with the pending keys will not be decryptable). 1326 // encrypted with the pending keys will not be decryptable).
1307 if (cryptographer.has_pending_keys()) 1327 if (cryptographer.has_pending_keys())
1308 return false; 1328 return false;
1309 if (IsNigoriMigratedToKeystore(nigori)) { 1329 if (IsNigoriMigratedToKeystore(nigori)) {
1310 // If the nigori is already migrated but does not reflect the explicit 1330 // If the nigori is already migrated but does not reflect the explicit
1311 // passphrase state, remigrate. Similarly, if the nigori has an explicit 1331 // passphrase state, remigrate. Similarly, if the nigori has an explicit
1312 // passphrase but does not have full encryption, or the nigori has an 1332 // passphrase but does not have full encryption, or the nigori has an
1313 // implicit passphrase but does have full encryption, re-migrate. 1333 // implicit passphrase but does have full encryption, re-migrate.
1314 // Note that this is to defend against other clients without keystore 1334 // Note that this is to defend against other clients without keystore
1315 // encryption enabled transitioning to states that are no longer valid. 1335 // encryption enabled transitioning to states that are no longer valid.
1316 if (passphrase_type_ != PassphraseType::KEYSTORE_PASSPHRASE && 1336 if (*passphrase_type != PassphraseType::KEYSTORE_PASSPHRASE &&
1317 nigori.passphrase_type() == 1337 nigori.passphrase_type() ==
1318 sync_pb::NigoriSpecifics::KEYSTORE_PASSPHRASE) { 1338 sync_pb::NigoriSpecifics::KEYSTORE_PASSPHRASE) {
1319 return true; 1339 return true;
1320 } else if (IsExplicitPassphrase(passphrase_type_) && !encrypt_everything_) { 1340 } else if (IsExplicitPassphrase(*passphrase_type) && !encrypt_everything_) {
1321 return true; 1341 return true;
1322 } else if (passphrase_type_ == PassphraseType::KEYSTORE_PASSPHRASE && 1342 } else if (*passphrase_type == PassphraseType::KEYSTORE_PASSPHRASE &&
1323 encrypt_everything_) { 1343 encrypt_everything_) {
1324 return true; 1344 return true;
1325 } else if (cryptographer.is_ready() && 1345 } else if (cryptographer.is_ready() &&
1326 !cryptographer.CanDecryptUsingDefaultKey( 1346 !cryptographer.CanDecryptUsingDefaultKey(
1327 nigori.encryption_keybag())) { 1347 nigori.encryption_keybag())) {
1328 // We need to overwrite the keybag. This might involve overwriting the 1348 // We need to overwrite the keybag. This might involve overwriting the
1329 // keystore decryptor too. 1349 // keystore decryptor too.
1330 return true; 1350 return true;
1331 } else if (old_keystore_keys_.size() > 0 && !keystore_key_.empty()) { 1351 } else if (old_keystore_keys_.size() > 0 && !keystore_key_.empty()) {
1332 // Check to see if a server key rotation has happened, but the nigori 1352 // Check to see if a server key rotation has happened, but the nigori
(...skipping 21 matching lines...) Expand all
1354 } 1374 }
1355 1375
1356 bool SyncEncryptionHandlerImpl::AttemptToMigrateNigoriToKeystore( 1376 bool SyncEncryptionHandlerImpl::AttemptToMigrateNigoriToKeystore(
1357 WriteTransaction* trans, 1377 WriteTransaction* trans,
1358 WriteNode* nigori_node) { 1378 WriteNode* nigori_node) {
1359 DCHECK(thread_checker_.CalledOnValidThread()); 1379 DCHECK(thread_checker_.CalledOnValidThread());
1360 const sync_pb::NigoriSpecifics& old_nigori = 1380 const sync_pb::NigoriSpecifics& old_nigori =
1361 nigori_node->GetNigoriSpecifics(); 1381 nigori_node->GetNigoriSpecifics();
1362 Cryptographer* cryptographer = 1382 Cryptographer* cryptographer =
1363 &UnlockVaultMutable(trans->GetWrappedTrans())->cryptographer; 1383 &UnlockVaultMutable(trans->GetWrappedTrans())->cryptographer;
1364 1384 PassphraseType* passphrase_type =
1365 if (!ShouldTriggerMigration(old_nigori, *cryptographer)) 1385 &UnlockVaultMutable(trans->GetWrappedTrans())->passphrase_type;
1386 if (!ShouldTriggerMigration(old_nigori, *cryptographer, passphrase_type))
1366 return false; 1387 return false;
1367 1388
1368 DVLOG(1) << "Starting nigori migration to keystore support."; 1389 DVLOG(1) << "Starting nigori migration to keystore support.";
1369 sync_pb::NigoriSpecifics migrated_nigori(old_nigori); 1390 sync_pb::NigoriSpecifics migrated_nigori(old_nigori);
1370 1391
1371 PassphraseType new_passphrase_type = passphrase_type_; 1392 PassphraseType new_passphrase_type =
1393 GetPassphraseType(trans->GetWrappedTrans());
1372 bool new_encrypt_everything = encrypt_everything_; 1394 bool new_encrypt_everything = encrypt_everything_;
1373 if (encrypt_everything_ && !IsExplicitPassphrase(passphrase_type_)) { 1395 if (encrypt_everything_ && !IsExplicitPassphrase(*passphrase_type)) {
1374 DVLOG(1) << "Switching to frozen implicit passphrase due to already having " 1396 DVLOG(1) << "Switching to frozen implicit passphrase due to already having "
1375 << "full encryption."; 1397 << "full encryption.";
1376 new_passphrase_type = PassphraseType::FROZEN_IMPLICIT_PASSPHRASE; 1398 new_passphrase_type = PassphraseType::FROZEN_IMPLICIT_PASSPHRASE;
1377 migrated_nigori.clear_keystore_decryptor_token(); 1399 migrated_nigori.clear_keystore_decryptor_token();
1378 } else if (IsExplicitPassphrase(passphrase_type_)) { 1400 } else if (IsExplicitPassphrase(*passphrase_type)) {
1379 DVLOG_IF(1, !encrypt_everything_) << "Enabling encrypt everything due to " 1401 DVLOG_IF(1, !encrypt_everything_) << "Enabling encrypt everything due to "
1380 << "explicit passphrase"; 1402 << "explicit passphrase";
1381 new_encrypt_everything = true; 1403 new_encrypt_everything = true;
1382 migrated_nigori.clear_keystore_decryptor_token(); 1404 migrated_nigori.clear_keystore_decryptor_token();
1383 } else { 1405 } else {
1384 DCHECK(!encrypt_everything_); 1406 DCHECK(!encrypt_everything_);
1385 new_passphrase_type = PassphraseType::KEYSTORE_PASSPHRASE; 1407 new_passphrase_type = PassphraseType::KEYSTORE_PASSPHRASE;
1386 DVLOG(1) << "Switching to keystore passphrase state."; 1408 DVLOG(1) << "Switching to keystore passphrase state.";
1387 } 1409 }
1388 migrated_nigori.set_encrypt_everything(new_encrypt_everything); 1410 migrated_nigori.set_encrypt_everything(new_encrypt_everything);
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
1460 migration_time_ = base::Time::Now(); 1482 migration_time_ = base::Time::Now();
1461 migrated_nigori.set_keystore_migration_time(TimeToProtoTime(migration_time_)); 1483 migrated_nigori.set_keystore_migration_time(TimeToProtoTime(migration_time_));
1462 1484
1463 if (!custom_passphrase_time_.is_null()) { 1485 if (!custom_passphrase_time_.is_null()) {
1464 migrated_nigori.set_custom_passphrase_time( 1486 migrated_nigori.set_custom_passphrase_time(
1465 TimeToProtoTime(custom_passphrase_time_)); 1487 TimeToProtoTime(custom_passphrase_time_));
1466 } 1488 }
1467 1489
1468 FOR_EACH_OBSERVER(SyncEncryptionHandler::Observer, observers_, 1490 FOR_EACH_OBSERVER(SyncEncryptionHandler::Observer, observers_,
1469 OnCryptographerStateChanged(cryptographer)); 1491 OnCryptographerStateChanged(cryptographer));
1470 if (passphrase_type_ != new_passphrase_type) { 1492 if (*passphrase_type != new_passphrase_type) {
1471 passphrase_type_ = new_passphrase_type; 1493 *passphrase_type = new_passphrase_type;
1472 FOR_EACH_OBSERVER( 1494 FOR_EACH_OBSERVER(
1473 SyncEncryptionHandler::Observer, observers_, 1495 SyncEncryptionHandler::Observer, observers_,
1474 OnPassphraseTypeChanged(passphrase_type_, GetExplicitPassphraseTime())); 1496 OnPassphraseTypeChanged(*passphrase_type,
1497 GetExplicitPassphraseTime(*passphrase_type)));
1475 } 1498 }
1476 1499
1477 if (new_encrypt_everything && !encrypt_everything_) { 1500 if (new_encrypt_everything && !encrypt_everything_) {
1478 EnableEncryptEverythingImpl(trans->GetWrappedTrans()); 1501 EnableEncryptEverythingImpl(trans->GetWrappedTrans());
1479 ReEncryptEverything(trans); 1502 ReEncryptEverything(trans);
1480 } else if (!cryptographer->CanDecryptUsingDefaultKey( 1503 } else if (!cryptographer->CanDecryptUsingDefaultKey(
1481 old_nigori.encryption_keybag())) { 1504 old_nigori.encryption_keybag())) {
1482 DVLOG(1) << "Rencrypting everything due to key rotation."; 1505 DVLOG(1) << "Rencrypting everything due to key rotation.";
1483 ReEncryptEverything(trans); 1506 ReEncryptEverything(trans);
1484 } 1507 }
(...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after
1633 SyncEncryptionHandler::Observer, observers_, 1656 SyncEncryptionHandler::Observer, observers_,
1634 OnBootstrapTokenUpdated(bootstrap_token, PASSPHRASE_BOOTSTRAP_TOKEN)); 1657 OnBootstrapTokenUpdated(bootstrap_token, PASSPHRASE_BOOTSTRAP_TOKEN));
1635 FOR_EACH_OBSERVER(SyncEncryptionHandler::Observer, observers_, 1658 FOR_EACH_OBSERVER(SyncEncryptionHandler::Observer, observers_,
1636 OnCryptographerStateChanged(cryptographer)); 1659 OnCryptographerStateChanged(cryptographer));
1637 return true; 1660 return true;
1638 } 1661 }
1639 } 1662 }
1640 return false; 1663 return false;
1641 } 1664 }
1642 1665
1643 base::Time SyncEncryptionHandlerImpl::GetExplicitPassphraseTime() const { 1666 base::Time SyncEncryptionHandlerImpl::GetExplicitPassphraseTime(
1644 if (passphrase_type_ == PassphraseType::FROZEN_IMPLICIT_PASSPHRASE) 1667 PassphraseType passphrase_type) const {
1668 if (passphrase_type == PassphraseType::FROZEN_IMPLICIT_PASSPHRASE)
1645 return migration_time(); 1669 return migration_time();
1646 else if (passphrase_type_ == PassphraseType::CUSTOM_PASSPHRASE) 1670 else if (passphrase_type == PassphraseType::CUSTOM_PASSPHRASE)
1647 return custom_passphrase_time(); 1671 return custom_passphrase_time();
1648 return base::Time(); 1672 return base::Time();
1649 } 1673 }
1650 1674
1651 } // namespace syncer 1675 } // namespace syncer
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698