1 //
2 // Copyright (C) 2015 The Android Open Source Project
3 //
4 // Licensed under the Apache License, Version 2.0 (the "License");
5 // you may not use this file except in compliance with the License.
6 // You may obtain a copy of the License at
7 //
8 // http://www.apache.org/licenses/LICENSE-2.0
9 //
10 // Unless required by applicable law or agreed to in writing, software
11 // distributed under the License is distributed on an "AS IS" BASIS,
12 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 // See the License for the specific language governing permissions and
14 // limitations under the License.
15 //
16
17 #include <sysexits.h>
18 #include <string>
19
20 #include <base/command_line.h>
21 #include <brillo/daemons/dbus_daemon.h>
22 #include <brillo/dbus/async_event_sequencer.h>
23 #include <brillo/minijail/minijail.h>
24 #include <brillo/syslog_logging.h>
25 #include <brillo/userdb_utils.h>
26
27 #include "tpm_manager/common/tpm_manager_constants.h"
28 #include "tpm_manager/server/dbus_service.h"
29 #include "tpm_manager/server/local_data_store_impl.h"
30 #include "tpm_manager/server/tpm_manager_service.h"
31
32 #if USE_TPM2
33 #include "tpm_manager/server/tpm2_initializer_impl.h"
34 #include "tpm_manager/server/tpm2_nvram_impl.h"
35 #include "tpm_manager/server/tpm2_status_impl.h"
36 #else
37 #include "tpm_manager/server/tpm_initializer_impl.h"
38 #include "tpm_manager/server/tpm_nvram_impl.h"
39 #include "tpm_manager/server/tpm_status_impl.h"
40 #endif
41
42 using brillo::dbus_utils::AsyncEventSequencer;
43
44 namespace {
45
46 const char kWaitForOwnershipTriggerSwitch[] = "wait_for_ownership_trigger";
47
48 class TpmManagerDaemon : public brillo::DBusServiceDaemon {
49 public:
TpmManagerDaemon()50 TpmManagerDaemon()
51 : brillo::DBusServiceDaemon(tpm_manager::kTpmManagerServiceName) {
52 base::CommandLine* command_line = base::CommandLine::ForCurrentProcess();
53 local_data_store_.reset(new tpm_manager::LocalDataStoreImpl());
54 #if USE_TPM2
55 tpm_status_.reset(new tpm_manager::Tpm2StatusImpl);
56 tpm_initializer_.reset(new tpm_manager::Tpm2InitializerImpl(
57 local_data_store_.get(),
58 tpm_status_.get()));
59 tpm_nvram_.reset(new tpm_manager::Tpm2NvramImpl(local_data_store_.get()));
60 #else
61 tpm_status_.reset(new tpm_manager::TpmStatusImpl);
62 tpm_initializer_.reset(new tpm_manager::TpmInitializerImpl(
63 local_data_store_.get(),
64 tpm_status_.get()));
65 tpm_nvram_.reset(new tpm_manager::TpmNvramImpl(local_data_store_.get()));
66 #endif
67 tpm_manager_service_.reset(new tpm_manager::TpmManagerService(
68 command_line->HasSwitch(kWaitForOwnershipTriggerSwitch),
69 local_data_store_.get(),
70 tpm_status_.get(),
71 tpm_initializer_.get(),
72 tpm_nvram_.get()));
73 }
74
75 protected:
OnInit()76 int OnInit() override {
77 int result = brillo::DBusServiceDaemon::OnInit();
78 if (result != EX_OK) {
79 LOG(ERROR) << "Error starting tpm_manager dbus daemon.";
80 return result;
81 }
82 CHECK(tpm_manager_service_->Initialize());
83 return EX_OK;
84 }
85
RegisterDBusObjectsAsync(AsyncEventSequencer * sequencer)86 void RegisterDBusObjectsAsync(AsyncEventSequencer* sequencer) override {
87 dbus_service_.reset(new tpm_manager::DBusService(
88 bus_, tpm_manager_service_.get(), tpm_manager_service_.get()));
89 dbus_service_->Register(sequencer->GetHandler("Register() failed.", true));
90 }
91
92 private:
93 std::unique_ptr<tpm_manager::LocalDataStore> local_data_store_;
94 std::unique_ptr<tpm_manager::TpmStatus> tpm_status_;
95 std::unique_ptr<tpm_manager::TpmInitializer> tpm_initializer_;
96 std::unique_ptr<tpm_manager::TpmNvram> tpm_nvram_;
97 std::unique_ptr<tpm_manager::TpmManagerService> tpm_manager_service_;
98 std::unique_ptr<tpm_manager::DBusService> dbus_service_;
99
100 DISALLOW_COPY_AND_ASSIGN(TpmManagerDaemon);
101 };
102
103 } // namespace
104
main(int argc,char * argv[])105 int main(int argc, char* argv[]) {
106 base::CommandLine::Init(argc, argv);
107 base::CommandLine *cl = base::CommandLine::ForCurrentProcess();
108 int flags = brillo::kLogToSyslog;
109 if (cl->HasSwitch("log_to_stderr")) {
110 flags |= brillo::kLogToStderr;
111 }
112 brillo::InitLog(flags);
113 TpmManagerDaemon daemon;
114 LOG(INFO) << "TpmManager Daemon Started.";
115 return daemon.Run();
116 }
117