Home | History | Annotate | Download | only in server
      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/server/dbus_service.h"
     18 
     19 #include <memory>
     20 #include <string>
     21 
     22 #include <brillo/bind_lambda.h>
     23 #include <brillo/daemons/dbus_daemon.h>
     24 #include <brillo/dbus/async_event_sequencer.h>
     25 #include <dbus/bus.h>
     26 #include <dbus/object_path.h>
     27 
     28 #include "tpm_manager/common/tpm_manager_constants.h"
     29 #include "tpm_manager/common/tpm_nvram_dbus_interface.h"
     30 #include "tpm_manager/common/tpm_ownership_dbus_interface.h"
     31 
     32 namespace tpm_manager {
     33 
     34 using brillo::dbus_utils::DBusObject;
     35 
     36 DBusService::DBusService(TpmNvramInterface* nvram_service,
     37                          TpmOwnershipInterface* ownership_service)
     38     : brillo::DBusServiceDaemon(tpm_manager::kTpmManagerServiceName),
     39       nvram_service_(nvram_service),
     40       ownership_service_(ownership_service) {}
     41 
     42 DBusService::DBusService(scoped_refptr<dbus::Bus> bus,
     43                          TpmNvramInterface* nvram_service,
     44                          TpmOwnershipInterface* ownership_service)
     45     : brillo::DBusServiceDaemon(tpm_manager::kTpmManagerServiceName),
     46       dbus_object_(new DBusObject(nullptr,
     47                                   bus,
     48                                   dbus::ObjectPath(kTpmManagerServicePath))),
     49       nvram_service_(nvram_service),
     50       ownership_service_(ownership_service) {}
     51 
     52 void DBusService::RegisterDBusObjectsAsync(
     53     brillo::dbus_utils::AsyncEventSequencer* sequencer) {
     54   if (!dbus_object_.get()) {
     55     // At this point bus_ should be valid.
     56     CHECK(bus_.get());
     57     dbus_object_.reset(new DBusObject(
     58         nullptr, bus_, dbus::ObjectPath(kTpmManagerServicePath)));
     59   }
     60   brillo::dbus_utils::DBusInterface* ownership_dbus_interface =
     61       dbus_object_->AddOrGetInterface(kTpmOwnershipInterface);
     62 
     63   ownership_dbus_interface->AddMethodHandler(
     64       kGetTpmStatus, base::Unretained(this),
     65       &DBusService::HandleOwnershipDBusMethod<
     66           GetTpmStatusRequest, GetTpmStatusReply,
     67           &TpmOwnershipInterface::GetTpmStatus>);
     68 
     69   ownership_dbus_interface->AddMethodHandler(
     70       kTakeOwnership, base::Unretained(this),
     71       &DBusService::HandleOwnershipDBusMethod<
     72           TakeOwnershipRequest, TakeOwnershipReply,
     73           &TpmOwnershipInterface::TakeOwnership>);
     74 
     75   ownership_dbus_interface->AddMethodHandler(
     76       kRemoveOwnerDependency, base::Unretained(this),
     77       &DBusService::HandleOwnershipDBusMethod<
     78           RemoveOwnerDependencyRequest, RemoveOwnerDependencyReply,
     79           &TpmOwnershipInterface::RemoveOwnerDependency>);
     80 
     81   brillo::dbus_utils::DBusInterface* nvram_dbus_interface =
     82       dbus_object_->AddOrGetInterface(kTpmNvramInterface);
     83 
     84   nvram_dbus_interface->AddMethodHandler(
     85       kDefineSpace, base::Unretained(this),
     86       &DBusService::HandleNvramDBusMethod<DefineSpaceRequest, DefineSpaceReply,
     87                                           &TpmNvramInterface::DefineSpace>);
     88 
     89   nvram_dbus_interface->AddMethodHandler(
     90       kDestroySpace, base::Unretained(this),
     91       &DBusService::HandleNvramDBusMethod<DestroySpaceRequest,
     92                                           DestroySpaceReply,
     93                                           &TpmNvramInterface::DestroySpace>);
     94 
     95   nvram_dbus_interface->AddMethodHandler(
     96       kWriteSpace, base::Unretained(this),
     97       &DBusService::HandleNvramDBusMethod<WriteSpaceRequest, WriteSpaceReply,
     98                                           &TpmNvramInterface::WriteSpace>);
     99 
    100   nvram_dbus_interface->AddMethodHandler(
    101       kReadSpace, base::Unretained(this),
    102       &DBusService::HandleNvramDBusMethod<ReadSpaceRequest, ReadSpaceReply,
    103                                           &TpmNvramInterface::ReadSpace>);
    104 
    105   nvram_dbus_interface->AddMethodHandler(
    106       kLockSpace, base::Unretained(this),
    107       &DBusService::HandleNvramDBusMethod<LockSpaceRequest, LockSpaceReply,
    108                                           &TpmNvramInterface::LockSpace>);
    109 
    110   nvram_dbus_interface->AddMethodHandler(
    111       kListSpaces, base::Unretained(this),
    112       &DBusService::HandleNvramDBusMethod<ListSpacesRequest, ListSpacesReply,
    113                                           &TpmNvramInterface::ListSpaces>);
    114 
    115   nvram_dbus_interface->AddMethodHandler(
    116       kGetSpaceInfo, base::Unretained(this),
    117       &DBusService::HandleNvramDBusMethod<GetSpaceInfoRequest,
    118                                           GetSpaceInfoReply,
    119                                           &TpmNvramInterface::GetSpaceInfo>);
    120 
    121   dbus_object_->RegisterAsync(
    122       sequencer->GetHandler("Failed to register D-Bus object.", true));
    123 }
    124 
    125 template <typename RequestProtobufType,
    126           typename ReplyProtobufType,
    127           DBusService::HandlerFunction<RequestProtobufType,
    128                                        ReplyProtobufType,
    129                                        TpmNvramInterface> func>
    130 void DBusService::HandleNvramDBusMethod(
    131     std::unique_ptr<DBusMethodResponse<const ReplyProtobufType&>> response,
    132     const RequestProtobufType& request) {
    133   // Convert |response| to a shared_ptr so |nvram_service_| can safely copy the
    134   // callback.
    135   using SharedResponsePointer =
    136       std::shared_ptr<DBusMethodResponse<const ReplyProtobufType&>>;
    137   // A callback that sends off the reply protobuf.
    138   auto callback = [](const SharedResponsePointer& response,
    139                      const ReplyProtobufType& reply) {
    140     response->Return(reply);
    141   };
    142   (nvram_service_->*func)(
    143       request,
    144       base::Bind(callback, SharedResponsePointer(std::move(response))));
    145 }
    146 
    147 template <typename RequestProtobufType,
    148           typename ReplyProtobufType,
    149           DBusService::HandlerFunction<RequestProtobufType,
    150                                        ReplyProtobufType,
    151                                        TpmOwnershipInterface> func>
    152 void DBusService::HandleOwnershipDBusMethod(
    153     std::unique_ptr<DBusMethodResponse<const ReplyProtobufType&>> response,
    154     const RequestProtobufType& request) {
    155   // Convert |response| to a shared_ptr so |ownership_service_| can safely
    156   // copy the callback.
    157   using SharedResponsePointer =
    158       std::shared_ptr<DBusMethodResponse<const ReplyProtobufType&>>;
    159   // A callback that sends off the reply protobuf.
    160   auto callback = [](const SharedResponsePointer& response,
    161                      const ReplyProtobufType& reply) {
    162     response->Return(reply);
    163   };
    164   (ownership_service_->*func)(
    165       request,
    166       base::Bind(callback, SharedResponsePointer(std::move(response))));
    167 }
    168 
    169 }  // namespace tpm_manager
    170