tpm_manager_service.cc revision 4dc4629c415e7ca90ff146d7bb75b5646ecd8b17
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));
424dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren Krahn  base::Closure task =
434dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren Krahn      base::Bind(&TpmManagerService::InitializeTask, 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(
1394dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren Krahn    const std::string& owner_dependency,
1404dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren Krahn    LocalData* local_data) {
1413d4bda022ae92db15a5b28ad9b22b8cede3fa7eaUtkarsh Sanghi  google::protobuf::RepeatedPtrField<std::string>* dependencies =
1423d4bda022ae92db15a5b28ad9b22b8cede3fa7eaUtkarsh Sanghi      local_data->mutable_owner_dependency();
1433d4bda022ae92db15a5b28ad9b22b8cede3fa7eaUtkarsh Sanghi  for (int i = 0; i < dependencies->size(); i++) {
1443d4bda022ae92db15a5b28ad9b22b8cede3fa7eaUtkarsh Sanghi    if (dependencies->Get(i) == owner_dependency) {
1453d4bda022ae92db15a5b28ad9b22b8cede3fa7eaUtkarsh Sanghi      dependencies->SwapElements(i, (dependencies->size() - 1));
1463d4bda022ae92db15a5b28ad9b22b8cede3fa7eaUtkarsh Sanghi      dependencies->RemoveLast();
1473d4bda022ae92db15a5b28ad9b22b8cede3fa7eaUtkarsh Sanghi      break;
1483d4bda022ae92db15a5b28ad9b22b8cede3fa7eaUtkarsh Sanghi    }
1493d4bda022ae92db15a5b28ad9b22b8cede3fa7eaUtkarsh Sanghi  }
1503d4bda022ae92db15a5b28ad9b22b8cede3fa7eaUtkarsh Sanghi  if (dependencies->empty()) {
1513d4bda022ae92db15a5b28ad9b22b8cede3fa7eaUtkarsh Sanghi    local_data->clear_owner_password();
1523d4bda022ae92db15a5b28ad9b22b8cede3fa7eaUtkarsh Sanghi    local_data->clear_endorsement_password();
1533d4bda022ae92db15a5b28ad9b22b8cede3fa7eaUtkarsh Sanghi    local_data->clear_lockout_password();
1543d4bda022ae92db15a5b28ad9b22b8cede3fa7eaUtkarsh Sanghi  }
155bbdb1b1f93626766baf7e293c7a9e532933531c3Utkarsh Sanghi}
156bbdb1b1f93626766baf7e293c7a9e532933531c3Utkarsh Sanghi
15737fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghivoid TpmManagerService::DefineNvram(const DefineNvramRequest& request,
15837fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi                                    const DefineNvramCallback& callback) {
1594dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren Krahn  PostTaskToWorkerThread<DefineNvramReply>(request, callback,
1604dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren Krahn                                           &TpmManagerService::DefineNvramTask);
16137fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi}
16237fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi
16337fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghivoid TpmManagerService::DefineNvramTask(
16437fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi    const DefineNvramRequest& request,
16537fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi    const std::shared_ptr<DefineNvramReply>& result) {
16637fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi  VLOG(1) << __func__;
16737fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi  if (!tpm_nvram_->DefineNvram(request.index(), request.length())) {
16837fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi    result->set_status(STATUS_UNEXPECTED_DEVICE_ERROR);
16937fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi    return;
17037fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi  }
17137fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi  result->set_status(STATUS_SUCCESS);
17237fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi}
17337fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi
17437fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghivoid TpmManagerService::DestroyNvram(const DestroyNvramRequest& request,
17537fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi                                     const DestroyNvramCallback& callback) {
17637fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi  PostTaskToWorkerThread<DestroyNvramReply>(
17737fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi      request, callback, &TpmManagerService::DestroyNvramTask);
17837fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi}
17937fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi
18037fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghivoid TpmManagerService::DestroyNvramTask(
18137fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi    const DestroyNvramRequest& request,
18237fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi    const std::shared_ptr<DestroyNvramReply>& result) {
18337fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi  VLOG(1) << __func__;
18437fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi  if (!tpm_nvram_->DestroyNvram(request.index())) {
18537fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi    result->set_status(STATUS_UNEXPECTED_DEVICE_ERROR);
18637fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi    return;
18737fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi  }
18837fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi  result->set_status(STATUS_SUCCESS);
18937fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi}
19037fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi
19137fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghivoid TpmManagerService::WriteNvram(const WriteNvramRequest& request,
19237fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi                                   const WriteNvramCallback& callback) {
1934dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren Krahn  PostTaskToWorkerThread<WriteNvramReply>(request, callback,
1944dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren Krahn                                          &TpmManagerService::WriteNvramTask);
19537fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi}
19637fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi
19737fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghivoid TpmManagerService::WriteNvramTask(
19837fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi    const WriteNvramRequest& request,
19937fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi    const std::shared_ptr<WriteNvramReply>& result) {
20037fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi  VLOG(1) << __func__;
20137fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi  if (!tpm_nvram_->WriteNvram(request.index(), request.data())) {
20237fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi    result->set_status(STATUS_UNEXPECTED_DEVICE_ERROR);
20337fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi    return;
20437fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi  }
20537fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi  result->set_status(STATUS_SUCCESS);
20637fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi}
20737fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi
20837fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghivoid TpmManagerService::ReadNvram(const ReadNvramRequest& request,
20937fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi                                  const ReadNvramCallback& callback) {
2104dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren Krahn  PostTaskToWorkerThread<ReadNvramReply>(request, callback,
2114dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren Krahn                                         &TpmManagerService::ReadNvramTask);
21237fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi}
21337fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi
21437fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghivoid TpmManagerService::ReadNvramTask(
21537fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi    const ReadNvramRequest& request,
21637fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi    const std::shared_ptr<ReadNvramReply>& result) {
21737fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi  VLOG(1) << __func__;
21837fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi  if (!tpm_nvram_->ReadNvram(request.index(), result->mutable_data())) {
21937fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi    result->set_status(STATUS_UNEXPECTED_DEVICE_ERROR);
22037fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi    return;
22137fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi  }
22237fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi  result->set_status(STATUS_SUCCESS);
22337fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi}
22437fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi
22537fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghivoid TpmManagerService::IsNvramDefined(const IsNvramDefinedRequest& request,
22637fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi                                       const IsNvramDefinedCallback& callback) {
22737fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi  PostTaskToWorkerThread<IsNvramDefinedReply>(
22837fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi      request, callback, &TpmManagerService::IsNvramDefinedTask);
22937fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi}
23037fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi
23137fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghivoid TpmManagerService::IsNvramDefinedTask(
23237fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi    const IsNvramDefinedRequest& request,
23337fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi    const std::shared_ptr<IsNvramDefinedReply>& result) {
23437fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi  VLOG(1) << __func__;
23537fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi  bool defined;
23637fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi  if (!tpm_nvram_->IsNvramDefined(request.index(), &defined)) {
23737fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi    result->set_status(STATUS_UNEXPECTED_DEVICE_ERROR);
23837fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi    return;
23937fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi  }
24037fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi  result->set_is_defined(defined);
24137fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi  result->set_status(STATUS_SUCCESS);
24237fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi}
24337fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi
24437fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghivoid TpmManagerService::IsNvramLocked(const IsNvramLockedRequest& request,
24537fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi                                      const IsNvramLockedCallback& callback) {
24637fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi  PostTaskToWorkerThread<IsNvramLockedReply>(
24737fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi      request, callback, &TpmManagerService::IsNvramLockedTask);
24837fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi}
24937fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi
25037fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghivoid TpmManagerService::IsNvramLockedTask(
25137fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi    const IsNvramLockedRequest& request,
25237fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi    const std::shared_ptr<IsNvramLockedReply>& result) {
25337fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi  VLOG(1) << __func__;
25437fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi  bool locked;
25537fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi  if (!tpm_nvram_->IsNvramLocked(request.index(), &locked)) {
25637fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi    result->set_status(STATUS_UNEXPECTED_DEVICE_ERROR);
25737fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi    return;
25837fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi  }
25937fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi  result->set_is_locked(locked);
26037fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi  result->set_status(STATUS_SUCCESS);
26137fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi}
26237fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi
26337fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghivoid TpmManagerService::GetNvramSize(const GetNvramSizeRequest& request,
26437fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi                                     const GetNvramSizeCallback& callback) {
26537fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi  PostTaskToWorkerThread<GetNvramSizeReply>(
26637fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi      request, callback, &TpmManagerService::GetNvramSizeTask);
26737fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi}
26837fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi
26937fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghivoid TpmManagerService::GetNvramSizeTask(
27037fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi    const GetNvramSizeRequest& request,
27137fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi    const std::shared_ptr<GetNvramSizeReply>& result) {
27237fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi  VLOG(1) << __func__;
27337fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi  size_t size;
27437fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi  if (!tpm_nvram_->GetNvramSize(request.index(), &size)) {
27537fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi    result->set_status(STATUS_UNEXPECTED_DEVICE_ERROR);
27637fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi    return;
27737fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi  }
27837fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi  result->set_size(size);
27937fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi  result->set_status(STATUS_SUCCESS);
28037fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi}
28137fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi
2824dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren Krahntemplate <typename ReplyProtobufType>
28337fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghivoid TpmManagerService::TaskRelayCallback(
28437fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi    const base::Callback<void(const ReplyProtobufType&)> callback,
28537fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi    const std::shared_ptr<ReplyProtobufType>& reply) {
28637fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi  callback.Run(*reply);
28737fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi}
28837fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi
2894dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren Krahntemplate <typename ReplyProtobufType,
2904dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren Krahn          typename RequestProtobufType,
2914dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren Krahn          typename ReplyCallbackType,
2924dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren Krahn          typename TaskType>
29337fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghivoid TpmManagerService::PostTaskToWorkerThread(RequestProtobufType& request,
29437fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi                                               ReplyCallbackType& callback,
29537fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi                                               TaskType task) {
29637fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi  auto result = std::make_shared<ReplyProtobufType>();
2974dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren Krahn  base::Closure background_task =
2984dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren Krahn      base::Bind(task, base::Unretained(this), request, result);
2994dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren Krahn  base::Closure reply =
3004dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren Krahn      base::Bind(&TpmManagerService::TaskRelayCallback<ReplyProtobufType>,
3014dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren Krahn                 weak_factory_.GetWeakPtr(), callback, result);
3024dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren Krahn  worker_thread_->task_runner()->PostTaskAndReply(FROM_HERE, background_task,
30337fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi                                                  reply);
30437fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi}
30537fb0f8c79ba0780b9a9b68082fd67dcc3ccb55dUtkarsh Sanghi
3062863c75955f0e50df2ad29587a29b4d5b06779bUtkarsh Sanghi}  // namespace tpm_manager
307