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 <dbus/bus.h>
     24 #include <dbus/object_path.h>
     25 
     26 #include "tpm_manager/common/tpm_manager_constants.h"
     27 #include "tpm_manager/common/tpm_nvram_dbus_interface.h"
     28 #include "tpm_manager/common/tpm_ownership_dbus_interface.h"
     29 
     30 namespace tpm_manager {
     31 
     32 DBusService::DBusService(const scoped_refptr<dbus::Bus>& bus,
     33                          TpmNvramInterface* nvram_service,
     34                          TpmOwnershipInterface* ownership_service)
     35     : dbus_object_(nullptr, bus, dbus::ObjectPath(kTpmManagerServicePath)),
     36       nvram_service_(nvram_service),
     37       ownership_service_(ownership_service) {}
     38 
     39 void DBusService::Register(const CompletionAction& callback) {
     40   brillo::dbus_utils::DBusInterface* ownership_dbus_interface =
     41       dbus_object_.AddOrGetInterface(kTpmOwnershipInterface);
     42 
     43   ownership_dbus_interface->AddMethodHandler(
     44       kGetTpmStatus,
     45       base::Unretained(this),
     46       &DBusService::HandleOwnershipDBusMethod<
     47           GetTpmStatusRequest,
     48           GetTpmStatusReply,
     49           &TpmOwnershipInterface::GetTpmStatus>);
     50 
     51   ownership_dbus_interface->AddMethodHandler(
     52       kTakeOwnership,
     53       base::Unretained(this),
     54       &DBusService::HandleOwnershipDBusMethod<
     55           TakeOwnershipRequest,
     56           TakeOwnershipReply,
     57           &TpmOwnershipInterface::TakeOwnership>);
     58 
     59   ownership_dbus_interface->AddMethodHandler(
     60       kRemoveOwnerDependency,
     61       base::Unretained(this),
     62       &DBusService::HandleOwnershipDBusMethod<
     63           RemoveOwnerDependencyRequest,
     64           RemoveOwnerDependencyReply,
     65           &TpmOwnershipInterface::RemoveOwnerDependency>);
     66 
     67   brillo::dbus_utils::DBusInterface* nvram_dbus_interface =
     68       dbus_object_.AddOrGetInterface(kTpmNvramInterface);
     69 
     70   nvram_dbus_interface->AddMethodHandler(
     71       kDefineNvram,
     72       base::Unretained(this),
     73       &DBusService::HandleNvramDBusMethod<
     74           DefineNvramRequest,
     75           DefineNvramReply,
     76           &TpmNvramInterface::DefineNvram>);
     77 
     78   nvram_dbus_interface->AddMethodHandler(
     79       kDestroyNvram,
     80       base::Unretained(this),
     81       &DBusService::HandleNvramDBusMethod<
     82           DestroyNvramRequest,
     83           DestroyNvramReply,
     84           &TpmNvramInterface::DestroyNvram>);
     85 
     86   nvram_dbus_interface->AddMethodHandler(
     87       kWriteNvram,
     88       base::Unretained(this),
     89       &DBusService::HandleNvramDBusMethod<
     90           WriteNvramRequest,
     91           WriteNvramReply,
     92           &TpmNvramInterface::WriteNvram>);
     93 
     94   nvram_dbus_interface->AddMethodHandler(
     95       kReadNvram,
     96       base::Unretained(this),
     97       &DBusService::HandleNvramDBusMethod<
     98           ReadNvramRequest,
     99           ReadNvramReply,
    100           &TpmNvramInterface::ReadNvram>);
    101 
    102   nvram_dbus_interface->AddMethodHandler(
    103       kIsNvramDefined,
    104       base::Unretained(this),
    105       &DBusService::HandleNvramDBusMethod<
    106           IsNvramDefinedRequest,
    107           IsNvramDefinedReply,
    108           &TpmNvramInterface::IsNvramDefined>);
    109 
    110   nvram_dbus_interface->AddMethodHandler(
    111       kIsNvramLocked,
    112       base::Unretained(this),
    113       &DBusService::HandleNvramDBusMethod<
    114           IsNvramLockedRequest,
    115           IsNvramLockedReply,
    116           &TpmNvramInterface::IsNvramLocked>);
    117 
    118   nvram_dbus_interface->AddMethodHandler(
    119       kGetNvramSize,
    120       base::Unretained(this),
    121       &DBusService::HandleNvramDBusMethod<
    122           GetNvramSizeRequest,
    123           GetNvramSizeReply,
    124           &TpmNvramInterface::GetNvramSize>);
    125 
    126   dbus_object_.RegisterAsync(callback);
    127 }
    128 
    129 template<typename RequestProtobufType,
    130          typename ReplyProtobufType,
    131          DBusService::HandlerFunction<RequestProtobufType,
    132                                       ReplyProtobufType,
    133                                       TpmNvramInterface> func>
    134 void DBusService::HandleNvramDBusMethod(
    135     std::unique_ptr<DBusMethodResponse<const ReplyProtobufType&>> response,
    136     const RequestProtobufType& request) {
    137   // Convert |response| to a shared_ptr so |nvram_service_| can safely copy the
    138   // callback.
    139   using SharedResponsePointer = std::shared_ptr<
    140       DBusMethodResponse<const ReplyProtobufType&>>;
    141   // A callback that sends off the reply protobuf.
    142   auto callback = [](const SharedResponsePointer& response,
    143                      const ReplyProtobufType& reply) {
    144     response->Return(reply);
    145   };
    146   (nvram_service_->*func)(
    147       request,
    148       base::Bind(callback, SharedResponsePointer(std::move(response))));
    149 }
    150 
    151 template<typename RequestProtobufType,
    152          typename ReplyProtobufType,
    153          DBusService::HandlerFunction<RequestProtobufType,
    154                                       ReplyProtobufType,
    155                                       TpmOwnershipInterface> func>
    156 void DBusService::HandleOwnershipDBusMethod(
    157     std::unique_ptr<DBusMethodResponse<const ReplyProtobufType&>> response,
    158     const RequestProtobufType& request) {
    159   // Convert |response| to a shared_ptr so |ownership_service_| can safely
    160   // copy the callback.
    161   using SharedResponsePointer = std::shared_ptr<
    162       DBusMethodResponse<const ReplyProtobufType&>>;
    163   // A callback that sends off the reply protobuf.
    164   auto callback = [](const SharedResponsePointer& response,
    165                      const ReplyProtobufType& reply) {
    166     response->Return(reply);
    167   };
    168   (ownership_service_->*func)(
    169       request,
    170       base::Bind(callback, SharedResponsePointer(std::move(response))));
    171 }
    172 
    173 }  // namespace tpm_manager
    174