Index: chrome/browser/chromeos/ownership/owner_settings_service_chromeos.cc |
diff --git a/chrome/browser/chromeos/ownership/owner_settings_service_chromeos.cc b/chrome/browser/chromeos/ownership/owner_settings_service_chromeos.cc |
index 037df4ea963351ab9601afbabaf385dfaae5f594..aa61394b1a5cc0e00c873975f98fecbf5075053f 100644 |
--- a/chrome/browser/chromeos/ownership/owner_settings_service_chromeos.cc |
+++ b/chrome/browser/chromeos/ownership/owner_settings_service_chromeos.cc |
@@ -65,10 +65,21 @@ void LoadPrivateKeyByPublicKey( |
const scoped_refptr<PrivateKey>& private_key)>& |
callback) { |
crypto::EnsureNSSInit(); |
- crypto::ScopedPK11Slot slot = |
+ crypto::ScopedPK11Slot public_slot = |
crypto::GetPublicSlotForChromeOSUser(username_hash); |
- scoped_refptr<PrivateKey> private_key(new PrivateKey( |
- owner_key_util->FindPrivateKeyInSlot(public_key->data(), slot.get()))); |
+ crypto::ScopedPK11Slot private_slot = crypto::GetPrivateSlotForChromeOSUser( |
+ username_hash, base::Callback<void(crypto::ScopedPK11Slot)>()); |
+ |
+ // If private slot is already available, this will check it. If not, |
+ // we'll get called again later when the TPM Token is ready, and the |
+ // slot will be available then. |
+ scoped_refptr<PrivateKey> private_key( |
+ new PrivateKey(owner_key_util->FindPrivateKeyInSlot(public_key->data(), |
+ private_slot.get()))); |
+ if (!private_key->key()) { |
+ private_key = new PrivateKey(owner_key_util->FindPrivateKeyInSlot( |
+ public_key->data(), public_slot.get())); |
+ } |
BrowserThread::PostTask(BrowserThread::UI, |
FROM_HERE, |
base::Bind(callback, public_key, private_key)); |