• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 "tpm_manager/client/tpm_nvram_dbus_proxy.h"
18 
19 #include <brillo/bind_lambda.h>
20 #include <brillo/dbus/dbus_method_invoker.h>
21 
22 #include "tpm_manager/common/tpm_manager_constants.h"
23 #include "tpm_manager/common/tpm_nvram_dbus_interface.h"
24 
25 namespace {
26 
27 // Use a two minute timeout because TPM operations can take a long time.
28 const int kDBusTimeoutMS = 2 * 60 * 1000;
29 
30 }  // namespace
31 
32 namespace tpm_manager {
33 
~TpmNvramDBusProxy()34 TpmNvramDBusProxy::~TpmNvramDBusProxy() {
35   if (bus_) {
36     bus_->ShutdownAndBlock();
37   }
38 }
39 
Initialize()40 bool TpmNvramDBusProxy::Initialize() {
41   dbus::Bus::Options options;
42   options.bus_type = dbus::Bus::SYSTEM;
43   bus_ = new dbus::Bus(options);
44   object_proxy_ = bus_->GetObjectProxy(
45       tpm_manager::kTpmManagerServiceName,
46       dbus::ObjectPath(tpm_manager::kTpmManagerServicePath));
47   return (object_proxy_ != nullptr);
48 }
49 
DefineNvram(const DefineNvramRequest & request,const DefineNvramCallback & callback)50 void TpmNvramDBusProxy::DefineNvram(const DefineNvramRequest& request,
51                                     const DefineNvramCallback& callback) {
52   CallMethod<DefineNvramReply>(tpm_manager::kDefineNvram, request, callback);
53 }
54 
DestroyNvram(const DestroyNvramRequest & request,const DestroyNvramCallback & callback)55 void TpmNvramDBusProxy::DestroyNvram(const DestroyNvramRequest& request,
56                                      const DestroyNvramCallback& callback) {
57   CallMethod<DestroyNvramReply>(tpm_manager::kDestroyNvram, request, callback);
58 }
59 
WriteNvram(const WriteNvramRequest & request,const WriteNvramCallback & callback)60 void TpmNvramDBusProxy::WriteNvram(const WriteNvramRequest& request,
61                                    const WriteNvramCallback& callback) {
62   CallMethod<WriteNvramReply>(tpm_manager::kWriteNvram, request, callback);
63 }
64 
ReadNvram(const ReadNvramRequest & request,const ReadNvramCallback & callback)65 void TpmNvramDBusProxy::ReadNvram(const ReadNvramRequest& request,
66                                   const ReadNvramCallback& callback) {
67   CallMethod<ReadNvramReply>(tpm_manager::kReadNvram, request, callback);
68 }
69 
IsNvramDefined(const IsNvramDefinedRequest & request,const IsNvramDefinedCallback & callback)70 void TpmNvramDBusProxy::IsNvramDefined(const IsNvramDefinedRequest& request,
71                                        const IsNvramDefinedCallback& callback) {
72   CallMethod<IsNvramDefinedReply>(
73       tpm_manager::kIsNvramDefined, request, callback);
74 }
75 
IsNvramLocked(const IsNvramLockedRequest & request,const IsNvramLockedCallback & callback)76 void TpmNvramDBusProxy::IsNvramLocked(const IsNvramLockedRequest& request,
77                                       const IsNvramLockedCallback& callback) {
78   CallMethod<IsNvramLockedReply>(
79       tpm_manager::kIsNvramLocked, request, callback);
80 }
81 
GetNvramSize(const GetNvramSizeRequest & request,const GetNvramSizeCallback & callback)82 void TpmNvramDBusProxy::GetNvramSize(const GetNvramSizeRequest& request,
83                                      const GetNvramSizeCallback& callback) {
84   CallMethod<GetNvramSizeReply>(tpm_manager::kGetNvramSize, request, callback);
85 }
86 
87 template<typename ReplyProtobufType,
88          typename RequestProtobufType,
89          typename CallbackType>
CallMethod(const std::string & method_name,const RequestProtobufType & request,const CallbackType & callback)90 void TpmNvramDBusProxy::CallMethod(const std::string& method_name,
91                                    const RequestProtobufType& request,
92                                    const CallbackType& callback) {
93   auto on_error = [callback](brillo::Error* error) {
94     ReplyProtobufType reply;
95     reply.set_status(STATUS_NOT_AVAILABLE);
96     callback.Run(reply);
97   };
98   brillo::dbus_utils::CallMethodWithTimeout(
99       kDBusTimeoutMS,
100       object_proxy_,
101       tpm_manager::kTpmNvramInterface,
102       method_name,
103       callback,
104       base::Bind(on_error),
105       request);
106 }
107 
108 }  // namespace tpm_manager
109