tpm_manager_service.cc revision 3d4bda022ae92db15a5b28ad9b22b8cede3fa7ea
1259fa1be39c0a35ec374fe127ba49d1c5ed5eb18Utkarsh Sanghi// 2259fa1be39c0a35ec374fe127ba49d1c5ed5eb18Utkarsh Sanghi// Copyright (C) 2015 The Android Open Source Project 3259fa1be39c0a35ec374fe127ba49d1c5ed5eb18Utkarsh Sanghi// 4259fa1be39c0a35ec374fe127ba49d1c5ed5eb18Utkarsh Sanghi// Licensed under the Apache License, Version 2.0 (the "License"); 5259fa1be39c0a35ec374fe127ba49d1c5ed5eb18Utkarsh Sanghi// you may not use this file except in compliance with the License. 6259fa1be39c0a35ec374fe127ba49d1c5ed5eb18Utkarsh Sanghi// You may obtain a copy of the License at 7259fa1be39c0a35ec374fe127ba49d1c5ed5eb18Utkarsh Sanghi// 8259fa1be39c0a35ec374fe127ba49d1c5ed5eb18Utkarsh Sanghi// http://www.apache.org/licenses/LICENSE-2.0 9259fa1be39c0a35ec374fe127ba49d1c5ed5eb18Utkarsh Sanghi// 10259fa1be39c0a35ec374fe127ba49d1c5ed5eb18Utkarsh Sanghi// Unless required by applicable law or agreed to in writing, software 11259fa1be39c0a35ec374fe127ba49d1c5ed5eb18Utkarsh Sanghi// distributed under the License is distributed on an "AS IS" BASIS, 12259fa1be39c0a35ec374fe127ba49d1c5ed5eb18Utkarsh Sanghi// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13259fa1be39c0a35ec374fe127ba49d1c5ed5eb18Utkarsh Sanghi// See the License for the specific language governing permissions and 14259fa1be39c0a35ec374fe127ba49d1c5ed5eb18Utkarsh Sanghi// limitations under the License. 15259fa1be39c0a35ec374fe127ba49d1c5ed5eb18Utkarsh Sanghi// 162863c75955f0e50df2ad29587a29b4d5b06779bUtkarsh Sanghi 172863c75955f0e50df2ad29587a29b4d5b06779bUtkarsh Sanghi#include "tpm_manager/server/tpm_manager_service.h" 182863c75955f0e50df2ad29587a29b4d5b06779bUtkarsh Sanghi 192863c75955f0e50df2ad29587a29b4d5b06779bUtkarsh Sanghi#include <base/callback.h> 20f22a3bdbc5f53e4177608b591d5612da2512d070Darren Krahn#include <base/command_line.h> 21a08ddea5f4b861ddf1f4e91bb9c4c34e23dc0ba9Alex Vakulenko#include <brillo/bind_lambda.h> 222863c75955f0e50df2ad29587a29b4d5b06779bUtkarsh Sanghi 232863c75955f0e50df2ad29587a29b4d5b06779bUtkarsh Sanghinamespace tpm_manager { 242863c75955f0e50df2ad29587a29b4d5b06779bUtkarsh Sanghi 25e6419641bfebd76cbe5fffe3877c068af6b1c396Utkarsh SanghiTpmManagerService::TpmManagerService(bool wait_for_ownership, 26c8573194d35f6b6c5033aedbef1ef5b07771792bUtkarsh Sanghi LocalDataStore* local_data_store, 2750e52ff6bcc478118a1cdec27903a5af5061d77bUtkarsh Sanghi TpmStatus* tpm_status, 2837fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi TpmInitializer* tpm_initializer, 2937fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi TpmNvram* tpm_nvram) 30e6419641bfebd76cbe5fffe3877c068af6b1c396Utkarsh Sanghi : local_data_store_(local_data_store), 31c8573194d35f6b6c5033aedbef1ef5b07771792bUtkarsh Sanghi tpm_status_(tpm_status), 3250e52ff6bcc478118a1cdec27903a5af5061d77bUtkarsh Sanghi tpm_initializer_(tpm_initializer), 3337fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi tpm_nvram_(tpm_nvram), 34e6419641bfebd76cbe5fffe3877c068af6b1c396Utkarsh Sanghi wait_for_ownership_(wait_for_ownership), 3537fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi weak_factory_(this) {} 362863c75955f0e50df2ad29587a29b4d5b06779bUtkarsh Sanghi 372863c75955f0e50df2ad29587a29b4d5b06779bUtkarsh Sanghibool TpmManagerService::Initialize() { 382863c75955f0e50df2ad29587a29b4d5b06779bUtkarsh Sanghi LOG(INFO) << "TpmManager service started."; 392863c75955f0e50df2ad29587a29b4d5b06779bUtkarsh Sanghi worker_thread_.reset(new base::Thread("TpmManager Service Worker")); 402863c75955f0e50df2ad29587a29b4d5b06779bUtkarsh Sanghi worker_thread_->StartWithOptions( 412863c75955f0e50df2ad29587a29b4d5b06779bUtkarsh Sanghi base::Thread::Options(base::MessageLoop::TYPE_IO, 0)); 42f22a3bdbc5f53e4177608b591d5612da2512d070Darren Krahn base::Closure task = base::Bind(&TpmManagerService::InitializeTask, 43f22a3bdbc5f53e4177608b591d5612da2512d070Darren Krahn base::Unretained(this)); 44f22a3bdbc5f53e4177608b591d5612da2512d070Darren Krahn worker_thread_->task_runner()->PostNonNestableTask(FROM_HERE, task); 452863c75955f0e50df2ad29587a29b4d5b06779bUtkarsh Sanghi return true; 462863c75955f0e50df2ad29587a29b4d5b06779bUtkarsh Sanghi} 472863c75955f0e50df2ad29587a29b4d5b06779bUtkarsh Sanghi 48f22a3bdbc5f53e4177608b591d5612da2512d070Darren Krahnvoid TpmManagerService::InitializeTask() { 49f22a3bdbc5f53e4177608b591d5612da2512d070Darren Krahn if (!tpm_status_->IsTpmEnabled()) { 50f22a3bdbc5f53e4177608b591d5612da2512d070Darren Krahn LOG(WARNING) << __func__ << ": TPM is disabled."; 51f22a3bdbc5f53e4177608b591d5612da2512d070Darren Krahn return; 52f22a3bdbc5f53e4177608b591d5612da2512d070Darren Krahn } 53f22a3bdbc5f53e4177608b591d5612da2512d070Darren Krahn if (!wait_for_ownership_) { 54f22a3bdbc5f53e4177608b591d5612da2512d070Darren Krahn VLOG(1) << "Initializing TPM."; 55f22a3bdbc5f53e4177608b591d5612da2512d070Darren Krahn if (!tpm_initializer_->InitializeTpm()) { 56f22a3bdbc5f53e4177608b591d5612da2512d070Darren Krahn LOG(WARNING) << __func__ << ": TPM initialization failed."; 57f22a3bdbc5f53e4177608b591d5612da2512d070Darren Krahn return; 58f22a3bdbc5f53e4177608b591d5612da2512d070Darren Krahn } 59f22a3bdbc5f53e4177608b591d5612da2512d070Darren Krahn } 60f22a3bdbc5f53e4177608b591d5612da2512d070Darren Krahn} 61f22a3bdbc5f53e4177608b591d5612da2512d070Darren Krahn 622863c75955f0e50df2ad29587a29b4d5b06779bUtkarsh Sanghivoid TpmManagerService::GetTpmStatus(const GetTpmStatusRequest& request, 632863c75955f0e50df2ad29587a29b4d5b06779bUtkarsh Sanghi const GetTpmStatusCallback& callback) { 6437fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi PostTaskToWorkerThread<GetTpmStatusReply>( 6537fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi request, callback, &TpmManagerService::GetTpmStatusTask); 662863c75955f0e50df2ad29587a29b4d5b06779bUtkarsh Sanghi} 672863c75955f0e50df2ad29587a29b4d5b06779bUtkarsh Sanghi 682863c75955f0e50df2ad29587a29b4d5b06779bUtkarsh Sanghivoid TpmManagerService::GetTpmStatusTask( 692863c75955f0e50df2ad29587a29b4d5b06779bUtkarsh Sanghi const GetTpmStatusRequest& request, 702863c75955f0e50df2ad29587a29b4d5b06779bUtkarsh Sanghi const std::shared_ptr<GetTpmStatusReply>& result) { 71f22a3bdbc5f53e4177608b591d5612da2512d070Darren Krahn VLOG(1) << __func__; 72f22a3bdbc5f53e4177608b591d5612da2512d070Darren Krahn result->set_enabled(tpm_status_->IsTpmEnabled()); 73f22a3bdbc5f53e4177608b591d5612da2512d070Darren Krahn result->set_owned(tpm_status_->IsTpmOwned()); 74f22a3bdbc5f53e4177608b591d5612da2512d070Darren Krahn LocalData local_data; 75c8573194d35f6b6c5033aedbef1ef5b07771792bUtkarsh Sanghi if (local_data_store_ && local_data_store_->Read(&local_data)) { 76f22a3bdbc5f53e4177608b591d5612da2512d070Darren Krahn *result->mutable_local_data() = local_data; 77f22a3bdbc5f53e4177608b591d5612da2512d070Darren Krahn } 78f22a3bdbc5f53e4177608b591d5612da2512d070Darren Krahn int counter; 79f22a3bdbc5f53e4177608b591d5612da2512d070Darren Krahn int threshold; 80f22a3bdbc5f53e4177608b591d5612da2512d070Darren Krahn bool lockout; 81f22a3bdbc5f53e4177608b591d5612da2512d070Darren Krahn int lockout_time_remaining; 82f22a3bdbc5f53e4177608b591d5612da2512d070Darren Krahn if (tpm_status_->GetDictionaryAttackInfo(&counter, &threshold, &lockout, 83f22a3bdbc5f53e4177608b591d5612da2512d070Darren Krahn &lockout_time_remaining)) { 84f22a3bdbc5f53e4177608b591d5612da2512d070Darren Krahn result->set_dictionary_attack_counter(counter); 85f22a3bdbc5f53e4177608b591d5612da2512d070Darren Krahn result->set_dictionary_attack_threshold(threshold); 86f22a3bdbc5f53e4177608b591d5612da2512d070Darren Krahn result->set_dictionary_attack_lockout_in_effect(lockout); 87f22a3bdbc5f53e4177608b591d5612da2512d070Darren Krahn result->set_dictionary_attack_lockout_seconds_remaining( 88f22a3bdbc5f53e4177608b591d5612da2512d070Darren Krahn lockout_time_remaining); 89f22a3bdbc5f53e4177608b591d5612da2512d070Darren Krahn } 9037fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi result->set_status(STATUS_SUCCESS); 91f22a3bdbc5f53e4177608b591d5612da2512d070Darren Krahn} 92f22a3bdbc5f53e4177608b591d5612da2512d070Darren Krahn 93f22a3bdbc5f53e4177608b591d5612da2512d070Darren Krahnvoid TpmManagerService::TakeOwnership(const TakeOwnershipRequest& request, 94f22a3bdbc5f53e4177608b591d5612da2512d070Darren Krahn const TakeOwnershipCallback& callback) { 9537fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi PostTaskToWorkerThread<TakeOwnershipReply>( 9637fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi request, callback, &TpmManagerService::TakeOwnershipTask); 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 114bbdb1b1f93626766baf7e293c7a9e532933531c3Utkarsh Sanghivoid TpmManagerService::RemoveOwnerDependency( 115bbdb1b1f93626766baf7e293c7a9e532933531c3Utkarsh Sanghi const RemoveOwnerDependencyRequest& request, 116bbdb1b1f93626766baf7e293c7a9e532933531c3Utkarsh Sanghi const RemoveOwnerDependencyCallback& callback) { 117bbdb1b1f93626766baf7e293c7a9e532933531c3Utkarsh Sanghi PostTaskToWorkerThread<RemoveOwnerDependencyReply>( 118bbdb1b1f93626766baf7e293c7a9e532933531c3Utkarsh Sanghi request, callback, &TpmManagerService::RemoveOwnerDependencyTask); 119bbdb1b1f93626766baf7e293c7a9e532933531c3Utkarsh Sanghi} 120bbdb1b1f93626766baf7e293c7a9e532933531c3Utkarsh Sanghi 121bbdb1b1f93626766baf7e293c7a9e532933531c3Utkarsh Sanghivoid TpmManagerService::RemoveOwnerDependencyTask( 122bbdb1b1f93626766baf7e293c7a9e532933531c3Utkarsh Sanghi const RemoveOwnerDependencyRequest& request, 123bbdb1b1f93626766baf7e293c7a9e532933531c3Utkarsh Sanghi const std::shared_ptr<RemoveOwnerDependencyReply>& result) { 124bbdb1b1f93626766baf7e293c7a9e532933531c3Utkarsh Sanghi VLOG(1) << __func__; 1253d4bda022ae92db15a5b28ad9b22b8cede3fa7eaUtkarsh Sanghi LocalData local_data; 1263d4bda022ae92db15a5b28ad9b22b8cede3fa7eaUtkarsh Sanghi if (!local_data_store_->Read(&local_data)) { 1273d4bda022ae92db15a5b28ad9b22b8cede3fa7eaUtkarsh Sanghi result->set_status(STATUS_UNEXPECTED_DEVICE_ERROR); 1283d4bda022ae92db15a5b28ad9b22b8cede3fa7eaUtkarsh Sanghi return; 1293d4bda022ae92db15a5b28ad9b22b8cede3fa7eaUtkarsh Sanghi } 1303d4bda022ae92db15a5b28ad9b22b8cede3fa7eaUtkarsh Sanghi RemoveOwnerDependency(request.owner_dependency(), &local_data); 1313d4bda022ae92db15a5b28ad9b22b8cede3fa7eaUtkarsh Sanghi if (!local_data_store_->Write(local_data)) { 1323d4bda022ae92db15a5b28ad9b22b8cede3fa7eaUtkarsh Sanghi result->set_status(STATUS_UNEXPECTED_DEVICE_ERROR); 1333d4bda022ae92db15a5b28ad9b22b8cede3fa7eaUtkarsh Sanghi return; 1343d4bda022ae92db15a5b28ad9b22b8cede3fa7eaUtkarsh Sanghi } 1353d4bda022ae92db15a5b28ad9b22b8cede3fa7eaUtkarsh Sanghi result->set_status(STATUS_SUCCESS); 1363d4bda022ae92db15a5b28ad9b22b8cede3fa7eaUtkarsh Sanghi} 1373d4bda022ae92db15a5b28ad9b22b8cede3fa7eaUtkarsh Sanghi 1383d4bda022ae92db15a5b28ad9b22b8cede3fa7eaUtkarsh Sanghivoid TpmManagerService::RemoveOwnerDependency( 1393d4bda022ae92db15a5b28ad9b22b8cede3fa7eaUtkarsh Sanghi const std::string& owner_dependency, LocalData* local_data) { 1403d4bda022ae92db15a5b28ad9b22b8cede3fa7eaUtkarsh Sanghi google::protobuf::RepeatedPtrField<std::string>* dependencies = 1413d4bda022ae92db15a5b28ad9b22b8cede3fa7eaUtkarsh Sanghi local_data->mutable_owner_dependency(); 1423d4bda022ae92db15a5b28ad9b22b8cede3fa7eaUtkarsh Sanghi for (int i = 0; i < dependencies->size(); i++) { 1433d4bda022ae92db15a5b28ad9b22b8cede3fa7eaUtkarsh Sanghi if (dependencies->Get(i) == owner_dependency) { 1443d4bda022ae92db15a5b28ad9b22b8cede3fa7eaUtkarsh Sanghi dependencies->SwapElements(i, (dependencies->size() - 1)); 1453d4bda022ae92db15a5b28ad9b22b8cede3fa7eaUtkarsh Sanghi dependencies->RemoveLast(); 1463d4bda022ae92db15a5b28ad9b22b8cede3fa7eaUtkarsh Sanghi break; 1473d4bda022ae92db15a5b28ad9b22b8cede3fa7eaUtkarsh Sanghi } 1483d4bda022ae92db15a5b28ad9b22b8cede3fa7eaUtkarsh Sanghi } 1493d4bda022ae92db15a5b28ad9b22b8cede3fa7eaUtkarsh Sanghi if (dependencies->empty()) { 1503d4bda022ae92db15a5b28ad9b22b8cede3fa7eaUtkarsh Sanghi local_data->clear_owner_password(); 1513d4bda022ae92db15a5b28ad9b22b8cede3fa7eaUtkarsh Sanghi local_data->clear_endorsement_password(); 1523d4bda022ae92db15a5b28ad9b22b8cede3fa7eaUtkarsh Sanghi local_data->clear_lockout_password(); 1533d4bda022ae92db15a5b28ad9b22b8cede3fa7eaUtkarsh Sanghi } 154bbdb1b1f93626766baf7e293c7a9e532933531c3Utkarsh Sanghi} 155bbdb1b1f93626766baf7e293c7a9e532933531c3Utkarsh Sanghi 15637fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghivoid TpmManagerService::DefineNvram(const DefineNvramRequest& request, 15737fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi const DefineNvramCallback& callback) { 15837fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi PostTaskToWorkerThread<DefineNvramReply>( 15937fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi request, callback, &TpmManagerService::DefineNvramTask); 16037fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi} 16137fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi 16237fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghivoid TpmManagerService::DefineNvramTask( 16337fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi const DefineNvramRequest& request, 16437fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi const std::shared_ptr<DefineNvramReply>& result) { 16537fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi VLOG(1) << __func__; 16637fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi if (!tpm_nvram_->DefineNvram(request.index(), request.length())) { 16737fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi result->set_status(STATUS_UNEXPECTED_DEVICE_ERROR); 16837fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi return; 16937fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi } 17037fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi result->set_status(STATUS_SUCCESS); 17137fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi} 17237fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi 17337fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghivoid TpmManagerService::DestroyNvram(const DestroyNvramRequest& request, 17437fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi const DestroyNvramCallback& callback) { 17537fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi PostTaskToWorkerThread<DestroyNvramReply>( 17637fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi request, callback, &TpmManagerService::DestroyNvramTask); 17737fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi} 17837fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi 17937fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghivoid TpmManagerService::DestroyNvramTask( 18037fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi const DestroyNvramRequest& request, 18137fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi const std::shared_ptr<DestroyNvramReply>& result) { 18237fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi VLOG(1) << __func__; 18337fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi if (!tpm_nvram_->DestroyNvram(request.index())) { 18437fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi result->set_status(STATUS_UNEXPECTED_DEVICE_ERROR); 18537fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi return; 18637fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi } 18737fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi result->set_status(STATUS_SUCCESS); 18837fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi} 18937fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi 19037fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghivoid TpmManagerService::WriteNvram(const WriteNvramRequest& request, 19137fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi const WriteNvramCallback& callback) { 19237fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi PostTaskToWorkerThread<WriteNvramReply>( 19337fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi request, callback, &TpmManagerService::WriteNvramTask); 19437fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi} 19537fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi 19637fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghivoid TpmManagerService::WriteNvramTask( 19737fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi const WriteNvramRequest& request, 19837fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi const std::shared_ptr<WriteNvramReply>& result) { 19937fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi VLOG(1) << __func__; 20037fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi if (!tpm_nvram_->WriteNvram(request.index(), request.data())) { 20137fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi result->set_status(STATUS_UNEXPECTED_DEVICE_ERROR); 20237fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi return; 20337fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi } 20437fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi result->set_status(STATUS_SUCCESS); 20537fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi} 20637fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi 20737fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghivoid TpmManagerService::ReadNvram(const ReadNvramRequest& request, 20837fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi const ReadNvramCallback& callback) { 20937fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi PostTaskToWorkerThread<ReadNvramReply>( 21037fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi request, callback, &TpmManagerService::ReadNvramTask); 21137fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi} 21237fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi 21337fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghivoid TpmManagerService::ReadNvramTask( 21437fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi const ReadNvramRequest& request, 21537fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi const std::shared_ptr<ReadNvramReply>& result) { 21637fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi VLOG(1) << __func__; 21737fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi if (!tpm_nvram_->ReadNvram(request.index(), result->mutable_data())) { 21837fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi result->set_status(STATUS_UNEXPECTED_DEVICE_ERROR); 21937fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi return; 22037fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi } 22137fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi result->set_status(STATUS_SUCCESS); 22237fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi} 22337fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi 22437fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghivoid TpmManagerService::IsNvramDefined(const IsNvramDefinedRequest& request, 22537fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi const IsNvramDefinedCallback& callback) { 22637fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi PostTaskToWorkerThread<IsNvramDefinedReply>( 22737fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi request, callback, &TpmManagerService::IsNvramDefinedTask); 22837fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi} 22937fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi 23037fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghivoid TpmManagerService::IsNvramDefinedTask( 23137fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi const IsNvramDefinedRequest& request, 23237fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi const std::shared_ptr<IsNvramDefinedReply>& result) { 23337fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi VLOG(1) << __func__; 23437fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi bool defined; 23537fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi if (!tpm_nvram_->IsNvramDefined(request.index(), &defined)) { 23637fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi result->set_status(STATUS_UNEXPECTED_DEVICE_ERROR); 23737fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi return; 23837fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi } 23937fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi result->set_is_defined(defined); 24037fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi result->set_status(STATUS_SUCCESS); 24137fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi} 24237fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi 24337fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghivoid TpmManagerService::IsNvramLocked(const IsNvramLockedRequest& request, 24437fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi const IsNvramLockedCallback& callback) { 24537fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi PostTaskToWorkerThread<IsNvramLockedReply>( 24637fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi request, callback, &TpmManagerService::IsNvramLockedTask); 24737fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi} 24837fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi 24937fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghivoid TpmManagerService::IsNvramLockedTask( 25037fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi const IsNvramLockedRequest& request, 25137fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi const std::shared_ptr<IsNvramLockedReply>& result) { 25237fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi VLOG(1) << __func__; 25337fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi bool locked; 25437fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi if (!tpm_nvram_->IsNvramLocked(request.index(), &locked)) { 25537fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi result->set_status(STATUS_UNEXPECTED_DEVICE_ERROR); 25637fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi return; 25737fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi } 25837fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi result->set_is_locked(locked); 25937fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi result->set_status(STATUS_SUCCESS); 26037fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi} 26137fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi 26237fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghivoid TpmManagerService::GetNvramSize(const GetNvramSizeRequest& request, 26337fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi const GetNvramSizeCallback& callback) { 26437fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi PostTaskToWorkerThread<GetNvramSizeReply>( 26537fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi request, callback, &TpmManagerService::GetNvramSizeTask); 26637fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi} 26737fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi 26837fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghivoid TpmManagerService::GetNvramSizeTask( 26937fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi const GetNvramSizeRequest& request, 27037fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi const std::shared_ptr<GetNvramSizeReply>& result) { 27137fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi VLOG(1) << __func__; 27237fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi size_t size; 27337fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi if (!tpm_nvram_->GetNvramSize(request.index(), &size)) { 27437fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi result->set_status(STATUS_UNEXPECTED_DEVICE_ERROR); 27537fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi return; 27637fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi } 27737fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi result->set_size(size); 27837fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi result->set_status(STATUS_SUCCESS); 27937fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi} 28037fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi 28137fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghitemplate<typename ReplyProtobufType> 28237fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghivoid TpmManagerService::TaskRelayCallback( 28337fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi const base::Callback<void(const ReplyProtobufType&)> callback, 28437fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi const std::shared_ptr<ReplyProtobufType>& reply) { 28537fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi callback.Run(*reply); 28637fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi} 28737fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi 28837fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghitemplate<typename ReplyProtobufType, 28937fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi typename RequestProtobufType, 29037fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi typename ReplyCallbackType, 29137fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi typename TaskType> 29237fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghivoid TpmManagerService::PostTaskToWorkerThread(RequestProtobufType& request, 29337fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi ReplyCallbackType& callback, 29437fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi TaskType task) { 29537fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi auto result = std::make_shared<ReplyProtobufType>(); 29637fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi base::Closure background_task = base::Bind(task, 29737fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi base::Unretained(this), 29837fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi request, 29937fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi result); 30037fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi base::Closure reply = base::Bind( 30137fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi &TpmManagerService::TaskRelayCallback<ReplyProtobufType>, 30237fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi weak_factory_.GetWeakPtr(), 30337fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi callback, 30437fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi result); 30537fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi worker_thread_->task_runner()->PostTaskAndReply(FROM_HERE, 30637fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi background_task, 30737fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi reply); 30837fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi} 30937fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi 3102863c75955f0e50df2ad29587a29b4d5b06779bUtkarsh Sanghi} // namespace tpm_manager 311