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