tpm_manager_service.cc revision 50e52ff6bcc478118a1cdec27903a5af5061d77b
12863c75955f0e50df2ad29587a29b4d5b06779bUtkarsh Sanghi// Copyright 2015 The Chromium OS Authors. All rights reserved. 22863c75955f0e50df2ad29587a29b4d5b06779bUtkarsh Sanghi// Use of this source code is governed by a BSD-style license that can be 32863c75955f0e50df2ad29587a29b4d5b06779bUtkarsh Sanghi// found in the LICENSE file. 42863c75955f0e50df2ad29587a29b4d5b06779bUtkarsh Sanghi 52863c75955f0e50df2ad29587a29b4d5b06779bUtkarsh Sanghi#include "tpm_manager/server/tpm_manager_service.h" 62863c75955f0e50df2ad29587a29b4d5b06779bUtkarsh Sanghi 72863c75955f0e50df2ad29587a29b4d5b06779bUtkarsh Sanghi#include <base/callback.h> 8f22a3bdbc5f53e4177608b591d5612da2512d070Darren Krahn#include <base/command_line.h> 92863c75955f0e50df2ad29587a29b4d5b06779bUtkarsh Sanghi#include <chromeos/bind_lambda.h> 102863c75955f0e50df2ad29587a29b4d5b06779bUtkarsh Sanghi 112863c75955f0e50df2ad29587a29b4d5b06779bUtkarsh Sanghinamespace tpm_manager { 122863c75955f0e50df2ad29587a29b4d5b06779bUtkarsh Sanghi 13e6419641bfebd76cbe5fffe3877c068af6b1c396Utkarsh SanghiTpmManagerService::TpmManagerService(bool wait_for_ownership, 14c8573194d35f6b6c5033aedbef1ef5b07771792bUtkarsh Sanghi LocalDataStore* local_data_store, 1550e52ff6bcc478118a1cdec27903a5af5061d77bUtkarsh Sanghi TpmStatus* tpm_status, 1650e52ff6bcc478118a1cdec27903a5af5061d77bUtkarsh Sanghi TpmInitializer* tpm_initializer) 17e6419641bfebd76cbe5fffe3877c068af6b1c396Utkarsh Sanghi : local_data_store_(local_data_store), 18c8573194d35f6b6c5033aedbef1ef5b07771792bUtkarsh Sanghi tpm_status_(tpm_status), 1950e52ff6bcc478118a1cdec27903a5af5061d77bUtkarsh Sanghi tpm_initializer_(tpm_initializer), 20e6419641bfebd76cbe5fffe3877c068af6b1c396Utkarsh Sanghi wait_for_ownership_(wait_for_ownership), 21f22a3bdbc5f53e4177608b591d5612da2512d070Darren Krahn weak_factory_(this) { 22f22a3bdbc5f53e4177608b591d5612da2512d070Darren Krahn} 232863c75955f0e50df2ad29587a29b4d5b06779bUtkarsh Sanghi 242863c75955f0e50df2ad29587a29b4d5b06779bUtkarsh Sanghibool TpmManagerService::Initialize() { 252863c75955f0e50df2ad29587a29b4d5b06779bUtkarsh Sanghi LOG(INFO) << "TpmManager service started."; 262863c75955f0e50df2ad29587a29b4d5b06779bUtkarsh Sanghi worker_thread_.reset(new base::Thread("TpmManager Service Worker")); 272863c75955f0e50df2ad29587a29b4d5b06779bUtkarsh Sanghi worker_thread_->StartWithOptions( 282863c75955f0e50df2ad29587a29b4d5b06779bUtkarsh Sanghi base::Thread::Options(base::MessageLoop::TYPE_IO, 0)); 29f22a3bdbc5f53e4177608b591d5612da2512d070Darren Krahn base::Closure task = base::Bind(&TpmManagerService::InitializeTask, 30f22a3bdbc5f53e4177608b591d5612da2512d070Darren Krahn base::Unretained(this)); 31f22a3bdbc5f53e4177608b591d5612da2512d070Darren Krahn worker_thread_->task_runner()->PostNonNestableTask(FROM_HERE, task); 322863c75955f0e50df2ad29587a29b4d5b06779bUtkarsh Sanghi return true; 332863c75955f0e50df2ad29587a29b4d5b06779bUtkarsh Sanghi} 342863c75955f0e50df2ad29587a29b4d5b06779bUtkarsh Sanghi 35f22a3bdbc5f53e4177608b591d5612da2512d070Darren Krahnvoid TpmManagerService::InitializeTask() { 36f22a3bdbc5f53e4177608b591d5612da2512d070Darren Krahn if (!tpm_status_->IsTpmEnabled()) { 37f22a3bdbc5f53e4177608b591d5612da2512d070Darren Krahn LOG(WARNING) << __func__ << ": TPM is disabled."; 38f22a3bdbc5f53e4177608b591d5612da2512d070Darren Krahn return; 39f22a3bdbc5f53e4177608b591d5612da2512d070Darren Krahn } 40f22a3bdbc5f53e4177608b591d5612da2512d070Darren Krahn if (!wait_for_ownership_) { 41f22a3bdbc5f53e4177608b591d5612da2512d070Darren Krahn VLOG(1) << "Initializing TPM."; 42f22a3bdbc5f53e4177608b591d5612da2512d070Darren Krahn if (!tpm_initializer_->InitializeTpm()) { 43f22a3bdbc5f53e4177608b591d5612da2512d070Darren Krahn LOG(WARNING) << __func__ << ": TPM initialization failed."; 44f22a3bdbc5f53e4177608b591d5612da2512d070Darren Krahn return; 45f22a3bdbc5f53e4177608b591d5612da2512d070Darren Krahn } 46f22a3bdbc5f53e4177608b591d5612da2512d070Darren Krahn } 47f22a3bdbc5f53e4177608b591d5612da2512d070Darren Krahn} 48f22a3bdbc5f53e4177608b591d5612da2512d070Darren Krahn 492863c75955f0e50df2ad29587a29b4d5b06779bUtkarsh Sanghivoid TpmManagerService::GetTpmStatus(const GetTpmStatusRequest& request, 502863c75955f0e50df2ad29587a29b4d5b06779bUtkarsh Sanghi const GetTpmStatusCallback& callback) { 512863c75955f0e50df2ad29587a29b4d5b06779bUtkarsh Sanghi auto result = std::make_shared<GetTpmStatusReply>(); 522863c75955f0e50df2ad29587a29b4d5b06779bUtkarsh Sanghi base::Closure task = base::Bind(&TpmManagerService::GetTpmStatusTask, 532863c75955f0e50df2ad29587a29b4d5b06779bUtkarsh Sanghi base::Unretained(this), request, result); 542863c75955f0e50df2ad29587a29b4d5b06779bUtkarsh Sanghi base::Closure reply = base::Bind( 552863c75955f0e50df2ad29587a29b4d5b06779bUtkarsh Sanghi &TpmManagerService::TaskRelayCallback<GetTpmStatusReply>, 562863c75955f0e50df2ad29587a29b4d5b06779bUtkarsh Sanghi weak_factory_.GetWeakPtr(), 572863c75955f0e50df2ad29587a29b4d5b06779bUtkarsh Sanghi callback, 582863c75955f0e50df2ad29587a29b4d5b06779bUtkarsh Sanghi result); 592863c75955f0e50df2ad29587a29b4d5b06779bUtkarsh Sanghi worker_thread_->task_runner()->PostTaskAndReply(FROM_HERE, task, reply); 602863c75955f0e50df2ad29587a29b4d5b06779bUtkarsh Sanghi} 612863c75955f0e50df2ad29587a29b4d5b06779bUtkarsh Sanghi 622863c75955f0e50df2ad29587a29b4d5b06779bUtkarsh Sanghivoid TpmManagerService::GetTpmStatusTask( 632863c75955f0e50df2ad29587a29b4d5b06779bUtkarsh Sanghi const GetTpmStatusRequest& request, 642863c75955f0e50df2ad29587a29b4d5b06779bUtkarsh Sanghi const std::shared_ptr<GetTpmStatusReply>& result) { 65f22a3bdbc5f53e4177608b591d5612da2512d070Darren Krahn VLOG(1) << __func__; 66f22a3bdbc5f53e4177608b591d5612da2512d070Darren Krahn result->set_enabled(tpm_status_->IsTpmEnabled()); 67f22a3bdbc5f53e4177608b591d5612da2512d070Darren Krahn result->set_owned(tpm_status_->IsTpmOwned()); 68f22a3bdbc5f53e4177608b591d5612da2512d070Darren Krahn LocalData local_data; 69c8573194d35f6b6c5033aedbef1ef5b07771792bUtkarsh Sanghi if (local_data_store_ && local_data_store_->Read(&local_data)) { 70f22a3bdbc5f53e4177608b591d5612da2512d070Darren Krahn *result->mutable_local_data() = local_data; 71f22a3bdbc5f53e4177608b591d5612da2512d070Darren Krahn } 72f22a3bdbc5f53e4177608b591d5612da2512d070Darren Krahn int counter; 73f22a3bdbc5f53e4177608b591d5612da2512d070Darren Krahn int threshold; 74f22a3bdbc5f53e4177608b591d5612da2512d070Darren Krahn bool lockout; 75f22a3bdbc5f53e4177608b591d5612da2512d070Darren Krahn int lockout_time_remaining; 76f22a3bdbc5f53e4177608b591d5612da2512d070Darren Krahn if (tpm_status_->GetDictionaryAttackInfo(&counter, &threshold, &lockout, 77f22a3bdbc5f53e4177608b591d5612da2512d070Darren Krahn &lockout_time_remaining)) { 78f22a3bdbc5f53e4177608b591d5612da2512d070Darren Krahn result->set_dictionary_attack_counter(counter); 79f22a3bdbc5f53e4177608b591d5612da2512d070Darren Krahn result->set_dictionary_attack_threshold(threshold); 80f22a3bdbc5f53e4177608b591d5612da2512d070Darren Krahn result->set_dictionary_attack_lockout_in_effect(lockout); 81f22a3bdbc5f53e4177608b591d5612da2512d070Darren Krahn result->set_dictionary_attack_lockout_seconds_remaining( 82f22a3bdbc5f53e4177608b591d5612da2512d070Darren Krahn lockout_time_remaining); 83f22a3bdbc5f53e4177608b591d5612da2512d070Darren Krahn } 84f22a3bdbc5f53e4177608b591d5612da2512d070Darren Krahn} 85f22a3bdbc5f53e4177608b591d5612da2512d070Darren Krahn 86f22a3bdbc5f53e4177608b591d5612da2512d070Darren Krahnvoid TpmManagerService::TakeOwnership(const TakeOwnershipRequest& request, 87f22a3bdbc5f53e4177608b591d5612da2512d070Darren Krahn const TakeOwnershipCallback& callback) { 88f22a3bdbc5f53e4177608b591d5612da2512d070Darren Krahn auto result = std::make_shared<TakeOwnershipReply>(); 89f22a3bdbc5f53e4177608b591d5612da2512d070Darren Krahn base::Closure task = base::Bind(&TpmManagerService::TakeOwnershipTask, 90f22a3bdbc5f53e4177608b591d5612da2512d070Darren Krahn base::Unretained(this), request, result); 91f22a3bdbc5f53e4177608b591d5612da2512d070Darren Krahn base::Closure reply = base::Bind( 92f22a3bdbc5f53e4177608b591d5612da2512d070Darren Krahn &TpmManagerService::TaskRelayCallback<TakeOwnershipReply>, 93f22a3bdbc5f53e4177608b591d5612da2512d070Darren Krahn weak_factory_.GetWeakPtr(), 94f22a3bdbc5f53e4177608b591d5612da2512d070Darren Krahn callback, 95f22a3bdbc5f53e4177608b591d5612da2512d070Darren Krahn result); 96f22a3bdbc5f53e4177608b591d5612da2512d070Darren Krahn worker_thread_->task_runner()->PostTaskAndReply(FROM_HERE, task, reply); 97f22a3bdbc5f53e4177608b591d5612da2512d070Darren Krahn} 98f22a3bdbc5f53e4177608b591d5612da2512d070Darren Krahn 99f22a3bdbc5f53e4177608b591d5612da2512d070Darren Krahnvoid TpmManagerService::TakeOwnershipTask( 100f22a3bdbc5f53e4177608b591d5612da2512d070Darren Krahn const TakeOwnershipRequest& request, 101f22a3bdbc5f53e4177608b591d5612da2512d070Darren Krahn const std::shared_ptr<TakeOwnershipReply>& result) { 102f22a3bdbc5f53e4177608b591d5612da2512d070Darren Krahn VLOG(1) << __func__; 103f22a3bdbc5f53e4177608b591d5612da2512d070Darren Krahn if (!tpm_status_->IsTpmEnabled()) { 104f22a3bdbc5f53e4177608b591d5612da2512d070Darren Krahn result->set_status(STATUS_NOT_AVAILABLE); 105f22a3bdbc5f53e4177608b591d5612da2512d070Darren Krahn return; 106f22a3bdbc5f53e4177608b591d5612da2512d070Darren Krahn } 107f22a3bdbc5f53e4177608b591d5612da2512d070Darren Krahn if (!tpm_initializer_->InitializeTpm()) { 108f22a3bdbc5f53e4177608b591d5612da2512d070Darren Krahn result->set_status(STATUS_UNEXPECTED_DEVICE_ERROR); 109f22a3bdbc5f53e4177608b591d5612da2512d070Darren Krahn return; 110f22a3bdbc5f53e4177608b591d5612da2512d070Darren Krahn } 11150e52ff6bcc478118a1cdec27903a5af5061d77bUtkarsh Sanghi result->set_status(STATUS_SUCCESS); 1122863c75955f0e50df2ad29587a29b4d5b06779bUtkarsh Sanghi} 1132863c75955f0e50df2ad29587a29b4d5b06779bUtkarsh Sanghi 1142863c75955f0e50df2ad29587a29b4d5b06779bUtkarsh Sanghi} // namespace tpm_manager 115