Index: tpm_init.cc |
diff --git a/tpm_init.cc b/tpm_init.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..92f1c7e86d9de0e18a4e4dd98226e7f0d420d47d |
--- /dev/null |
+++ b/tpm_init.cc |
@@ -0,0 +1,128 @@ |
+// Copyright (c) 2009-2010 The Chromium OS Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+// Contains the implementation of class TpmInit |
+ |
+#include "tpm_init.h" |
+ |
+#include <base/logging.h> |
+#include <base/time.h> |
+ |
+#include "tpm.h" |
+ |
+namespace tpm_init { |
+ |
+// TpmInitTask is a private class used to handle asynchronous initialization of |
+// the TPM. |
+class TpmInitTask : public PlatformThread::Delegate { |
+ public: |
+ TpmInitTask(); |
+ virtual ~TpmInitTask(); |
+ |
+ void Init(); |
+ |
+ virtual void ThreadMain(); |
+ |
+ bool IsTpmReady(); |
+ bool IsTpmEnabled(); |
+ bool GetTpmPassword(chromeos::Blob* password); |
+ long GetInitializationMillis(); |
+ |
+ private: |
+ scoped_ptr<tpm_init::Tpm> default_tpm_; |
+ tpm_init::Tpm* tpm_; |
+ bool initialize_status_; |
+ bool task_done_; |
+ long initialization_time_; |
+}; |
+ |
+TpmInit::TpmInit() |
+ : tpm_init_(new TpmInitTask()) { |
+} |
+ |
+TpmInit::~TpmInit() { |
+} |
+ |
+bool TpmInit::StartInitializeTpm() { |
+ tpm_init_->Init(); |
+ if (!PlatformThread::CreateNonJoinable(0, tpm_init_.get())) { |
+ LOG(ERROR) << "Unable to create TPM initialization background thread."; |
+ return false; |
+ } |
+ return true; |
+} |
+ |
+bool TpmInit::IsTpmReady() { |
+ return tpm_init_->IsTpmReady(); |
+} |
+ |
+bool TpmInit::IsTpmEnabled() { |
+ return tpm_init_->IsTpmEnabled(); |
+} |
+ |
+bool TpmInit::GetTpmPassword(chromeos::Blob* password) { |
+ return tpm_init_->GetTpmPassword(password); |
+} |
+ |
+long TpmInit::GetInitializationMillis() { |
+ return tpm_init_->GetInitializationMillis(); |
+} |
+ |
+TpmInitTask::TpmInitTask() |
+ : default_tpm_(new tpm_init::Tpm()), |
+ tpm_(default_tpm_.get()), |
+ initialize_status_(false), |
+ task_done_(false), |
+ initialization_time_(-1) { |
+} |
+ |
+TpmInitTask::~TpmInitTask() { |
+} |
+ |
+void TpmInitTask::Init() { |
+ tpm_->Init(); |
+} |
+ |
+void TpmInitTask::ThreadMain() { |
+ base::TimeTicks start = base::TimeTicks::Now(); |
+ initialize_status_ = tpm_->InitializeTpm(); |
+ base::TimeDelta delta = (base::TimeTicks::Now() - start); |
+ initialization_time_ = delta.InMilliseconds(); |
+ if (initialize_status_) { |
+ LOG(ERROR) << "TPM initialization took " << initialization_time_ << "ms"; |
+ } |
+ task_done_ = true; |
+} |
+ |
+bool TpmInitTask::IsTpmReady() { |
+ // The TPM is not "ready" if the init call has not completed. It may be in |
+ // the middle of taking ownership. |
+ if (!task_done_) { |
+ return false; |
+ } |
+ // If initialize_status_ is true, then the TPM went through a full succesful |
+ // ownership cycle in InitializeTpm() |
+ if (initialize_status_) { |
+ return true; |
+ } |
+ // If we get here, then the call to InitializeTpm() is complete and it |
+ // returned false. That merely means that it did not successfully take |
+ // ownership, which is the common case after ownership is established on OOBE. |
+ // In that case, the TPM is ready if it is enabled and owned. |
+ return (tpm_->IsEnabled() && tpm_->IsOwned()); |
+} |
+ |
+bool TpmInitTask::IsTpmEnabled() { |
+ return tpm_->IsEnabled(); |
+} |
+ |
+bool TpmInitTask::GetTpmPassword(chromeos::Blob* password) { |
+ return tpm_->GetOwnerPassword(password); |
+} |
+ |
+long TpmInitTask::GetInitializationMillis() { |
+ return initialization_time_; |
+} |
+ |
+} // namespace tpm_init |