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

Unified Diff: chromeos/network/cert_loader.cc

Issue 15649018: Call crypto::InitializeTPMToken on the IO thread (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Merge Created 7 years, 6 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 side-by-side diff with in-line comments
Download patch
Index: chromeos/network/cert_loader.cc
diff --git a/chromeos/network/cert_loader.cc b/chromeos/network/cert_loader.cc
index f75f8bb959b6f2863e1254336eb9d77bb1ee5bde..0847d0deb1e43d4a96e6759024378e20c741afaa 100644
--- a/chromeos/network/cert_loader.cc
+++ b/chromeos/network/cert_loader.cc
@@ -7,7 +7,9 @@
#include <algorithm>
#include "base/chromeos/chromeos_version.h"
+#include "base/message_loop/message_loop_proxy.h"
#include "base/observer_list.h"
+#include "base/sequenced_task_runner.h"
#include "base/strings/string_number_conversions.h"
#include "base/task_runner_util.h"
#include "base/threading/worker_pool.h"
@@ -58,6 +60,12 @@ CertLoader::CertLoader()
base::TimeDelta::FromMilliseconds(kInitialRequestDelayMs)),
initialize_token_factory_(this),
update_certificates_factory_(this) {
+}
+
+void CertLoader::Init(
+ const scoped_refptr<base::SequencedTaskRunner>& crypto_task_runner) {
+ main_task_runner_ = base::MessageLoopProxy::current();
+ crypto_task_runner_ = crypto_task_runner;
net::CertDatabase::GetInstance()->AddObserver(this);
if (LoginState::IsInitialized())
LoginState::Get()->AddObserver(this);
@@ -96,15 +104,27 @@ void CertLoader::RequestCertificates() {
certificates_requested_ = true;
+ crypto_task_runner_->PostTask(
+ FROM_HERE,
+ base::Bind(&CertLoader::CallOpenPersistentNSSDB,
+ initialize_token_factory_.GetWeakPtr()));
+}
+
+void CertLoader::CallOpenPersistentNSSDB() {
+ VLOG(1) << "CallOpenPersistentNSSDB";
Ryan Sleevi 2013/06/06 23:03:41 Necessary?
stevenjb 2013/06/07 02:37:47 This can be very helpful when debugging hardware t
+
// Ensure we've opened the user's key/certificate database.
crypto::OpenPersistentNSSDB();
if (base::chromeos::IsRunningOnChromeOS())
crypto::EnableTPMTokenForNSS();
- // This is the entry point to the TPM token initialization process, which we
- // should do at most once.
- DCHECK(!initialize_token_factory_.HasWeakPtrs());
- InitializeTokenAndLoadCertificates();
+ // This is the entry point to the TPM token initialization process,
+ // which we should do at most once.
+ DCHECK(tpm_token_state_ == TPM_STATE_UNKNOWN);
Ryan Sleevi 2013/06/06 23:03:41 DCHECK_EQ
stevenjb 2013/06/07 02:37:47 Done.
+ main_task_runner_->PostTask(
+ FROM_HERE,
+ base::Bind(&CertLoader::InitializeTokenAndLoadCertificates,
+ initialize_token_factory_.GetWeakPtr()));
}
void CertLoader::InitializeTokenAndLoadCertificates() {
@@ -138,6 +158,17 @@ void CertLoader::InitializeTokenAndLoadCertificates() {
return;
}
case TPM_TOKEN_INFO_RECEIVED: {
+ if (base::chromeos::IsRunningOnChromeOS()) {
+ crypto_task_runner_->PostTask(
+ FROM_HERE,
+ base::Bind(&CertLoader::CallInitializeTPMToken,
+ initialize_token_factory_.GetWeakPtr()));
+ return;
+ }
+ tpm_token_state_ = TPM_TOKEN_INITIALIZED;
+ // FALLTHROUGH_INTENDED
+ }
+ case TPM_TOKEN_INITIALIZED: {
InitializeNSSForTPMToken();
return;
}
@@ -234,11 +265,19 @@ void CertLoader::OnPkcs11GetTpmTokenInfo(DBusMethodCallStatus call_status,
InitializeTokenAndLoadCertificates();
}
+void CertLoader::CallInitializeTPMToken() {
+ if (crypto::InitializeTPMToken(tpm_token_name_, tpm_user_pin_))
+ tpm_token_state_ = TPM_TOKEN_INITIALIZED;
Ryan Sleevi 2013/06/06 23:03:41 THREADING: You're mutating this object on another
stevenjb 2013/06/07 02:37:47 Was that rhetorical? :) Fixed with the change sugg
+ // Call InitializeNSSForTPMToken() on the main (UI) thread.
+ main_task_runner_->PostTask(
+ FROM_HERE,
+ base::Bind(&CertLoader::CallInitializeTPMToken,
+ initialize_token_factory_.GetWeakPtr()));
Ryan Sleevi 2013/06/06 23:03:41 THREADING: You're passing the same WeakPtr() on tw
stevenjb 2013/06/07 02:37:47 Yeah, that was an oversight. I like your suggestio
+}
+
void CertLoader::InitializeNSSForTPMToken() {
VLOG(1) << "InitializeNSSForTPMToken";
-
- if (base::chromeos::IsRunningOnChromeOS() &&
- !crypto::InitializeTPMToken(tpm_token_name_, tpm_user_pin_)) {
+ if (tpm_token_state_ != TPM_TOKEN_INITIALIZED) {
RetryTokenInitializationLater();
return;
}

Powered by Google App Engine
This is Rietveld 408576698