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