173f6df1f0aac12c243e2110e30337ab01aa71598Chia-chi Yeh//
273f6df1f0aac12c243e2110e30337ab01aa71598Chia-chi Yeh// Copyright (C) 2015 The Android Open Source Project
373f6df1f0aac12c243e2110e30337ab01aa71598Chia-chi Yeh//
473f6df1f0aac12c243e2110e30337ab01aa71598Chia-chi Yeh// Licensed under the Apache License, Version 2.0 (the "License");
573f6df1f0aac12c243e2110e30337ab01aa71598Chia-chi Yeh// you may not use this file except in compliance with the License.
673f6df1f0aac12c243e2110e30337ab01aa71598Chia-chi Yeh// You may obtain a copy of the License at
773f6df1f0aac12c243e2110e30337ab01aa71598Chia-chi Yeh//
873f6df1f0aac12c243e2110e30337ab01aa71598Chia-chi Yeh//      http://www.apache.org/licenses/LICENSE-2.0
973f6df1f0aac12c243e2110e30337ab01aa71598Chia-chi Yeh//
1073f6df1f0aac12c243e2110e30337ab01aa71598Chia-chi Yeh// Unless required by applicable law or agreed to in writing, software
1173f6df1f0aac12c243e2110e30337ab01aa71598Chia-chi Yeh// distributed under the License is distributed on an "AS IS" BASIS,
1273f6df1f0aac12c243e2110e30337ab01aa71598Chia-chi Yeh// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1373f6df1f0aac12c243e2110e30337ab01aa71598Chia-chi Yeh// See the License for the specific language governing permissions and
1473f6df1f0aac12c243e2110e30337ab01aa71598Chia-chi Yeh// limitations under the License.
1573f6df1f0aac12c243e2110e30337ab01aa71598Chia-chi Yeh//
1673f6df1f0aac12c243e2110e30337ab01aa71598Chia-chi Yeh
1773f6df1f0aac12c243e2110e30337ab01aa71598Chia-chi Yeh#include "tpm_manager/server/dbus_service.h"
1873f6df1f0aac12c243e2110e30337ab01aa71598Chia-chi Yeh
1973f6df1f0aac12c243e2110e30337ab01aa71598Chia-chi Yeh#include <memory>
2073f6df1f0aac12c243e2110e30337ab01aa71598Chia-chi Yeh#include <string>
2173f6df1f0aac12c243e2110e30337ab01aa71598Chia-chi Yeh
2273f6df1f0aac12c243e2110e30337ab01aa71598Chia-chi Yeh#include <brillo/bind_lambda.h>
2373f6df1f0aac12c243e2110e30337ab01aa71598Chia-chi Yeh#include <brillo/daemons/dbus_daemon.h>
2473f6df1f0aac12c243e2110e30337ab01aa71598Chia-chi Yeh#include <brillo/dbus/async_event_sequencer.h>
2573f6df1f0aac12c243e2110e30337ab01aa71598Chia-chi Yeh#include <dbus/bus.h>
2673f6df1f0aac12c243e2110e30337ab01aa71598Chia-chi Yeh#include <dbus/object_path.h>
2773f6df1f0aac12c243e2110e30337ab01aa71598Chia-chi Yeh
2873f6df1f0aac12c243e2110e30337ab01aa71598Chia-chi Yeh#include "tpm_manager/common/tpm_manager_constants.h"
2973f6df1f0aac12c243e2110e30337ab01aa71598Chia-chi Yeh#include "tpm_manager/common/tpm_nvram_dbus_interface.h"
3073f6df1f0aac12c243e2110e30337ab01aa71598Chia-chi Yeh#include "tpm_manager/common/tpm_ownership_dbus_interface.h"
3173f6df1f0aac12c243e2110e30337ab01aa71598Chia-chi Yeh
3273f6df1f0aac12c243e2110e30337ab01aa71598Chia-chi Yehnamespace tpm_manager {
3373f6df1f0aac12c243e2110e30337ab01aa71598Chia-chi Yeh
3473f6df1f0aac12c243e2110e30337ab01aa71598Chia-chi Yehusing brillo::dbus_utils::DBusObject;
3573f6df1f0aac12c243e2110e30337ab01aa71598Chia-chi Yeh
3673f6df1f0aac12c243e2110e30337ab01aa71598Chia-chi YehDBusService::DBusService(TpmNvramInterface* nvram_service,
3773f6df1f0aac12c243e2110e30337ab01aa71598Chia-chi Yeh                         TpmOwnershipInterface* ownership_service)
3873f6df1f0aac12c243e2110e30337ab01aa71598Chia-chi Yeh    : brillo::DBusServiceDaemon(tpm_manager::kTpmManagerServiceName),
3973f6df1f0aac12c243e2110e30337ab01aa71598Chia-chi Yeh      nvram_service_(nvram_service),
4073f6df1f0aac12c243e2110e30337ab01aa71598Chia-chi Yeh      ownership_service_(ownership_service) {}
4173f6df1f0aac12c243e2110e30337ab01aa71598Chia-chi Yeh
4273f6df1f0aac12c243e2110e30337ab01aa71598Chia-chi YehDBusService::DBusService(scoped_refptr<dbus::Bus> bus,
4373f6df1f0aac12c243e2110e30337ab01aa71598Chia-chi Yeh                         TpmNvramInterface* nvram_service,
4473f6df1f0aac12c243e2110e30337ab01aa71598Chia-chi Yeh                         TpmOwnershipInterface* ownership_service)
4573f6df1f0aac12c243e2110e30337ab01aa71598Chia-chi Yeh    : brillo::DBusServiceDaemon(tpm_manager::kTpmManagerServiceName),
4673f6df1f0aac12c243e2110e30337ab01aa71598Chia-chi Yeh      dbus_object_(new DBusObject(nullptr,
4773f6df1f0aac12c243e2110e30337ab01aa71598Chia-chi Yeh                                  bus,
4873f6df1f0aac12c243e2110e30337ab01aa71598Chia-chi Yeh                                  dbus::ObjectPath(kTpmManagerServicePath))),
4973f6df1f0aac12c243e2110e30337ab01aa71598Chia-chi Yeh      nvram_service_(nvram_service),
5073f6df1f0aac12c243e2110e30337ab01aa71598Chia-chi Yeh      ownership_service_(ownership_service) {}
5173f6df1f0aac12c243e2110e30337ab01aa71598Chia-chi Yeh
5273f6df1f0aac12c243e2110e30337ab01aa71598Chia-chi Yehvoid DBusService::RegisterDBusObjectsAsync(
5373f6df1f0aac12c243e2110e30337ab01aa71598Chia-chi Yeh    brillo::dbus_utils::AsyncEventSequencer* sequencer) {
5473f6df1f0aac12c243e2110e30337ab01aa71598Chia-chi Yeh  if (!dbus_object_.get()) {
5573f6df1f0aac12c243e2110e30337ab01aa71598Chia-chi Yeh    // At this point bus_ should be valid.
5673f6df1f0aac12c243e2110e30337ab01aa71598Chia-chi Yeh    CHECK(bus_.get());
5773f6df1f0aac12c243e2110e30337ab01aa71598Chia-chi Yeh    dbus_object_.reset(new DBusObject(
5873f6df1f0aac12c243e2110e30337ab01aa71598Chia-chi Yeh        nullptr, bus_, dbus::ObjectPath(kTpmManagerServicePath)));
5973f6df1f0aac12c243e2110e30337ab01aa71598Chia-chi Yeh  }
6073f6df1f0aac12c243e2110e30337ab01aa71598Chia-chi Yeh  brillo::dbus_utils::DBusInterface* ownership_dbus_interface =
6173f6df1f0aac12c243e2110e30337ab01aa71598Chia-chi Yeh      dbus_object_->AddOrGetInterface(kTpmOwnershipInterface);
6273f6df1f0aac12c243e2110e30337ab01aa71598Chia-chi Yeh
6373f6df1f0aac12c243e2110e30337ab01aa71598Chia-chi Yeh  ownership_dbus_interface->AddMethodHandler(
6473f6df1f0aac12c243e2110e30337ab01aa71598Chia-chi Yeh      kGetTpmStatus, base::Unretained(this),
6573f6df1f0aac12c243e2110e30337ab01aa71598Chia-chi Yeh      &DBusService::HandleOwnershipDBusMethod<
6673f6df1f0aac12c243e2110e30337ab01aa71598Chia-chi Yeh          GetTpmStatusRequest, GetTpmStatusReply,
6773f6df1f0aac12c243e2110e30337ab01aa71598Chia-chi Yeh          &TpmOwnershipInterface::GetTpmStatus>);
6873f6df1f0aac12c243e2110e30337ab01aa71598Chia-chi Yeh
6973f6df1f0aac12c243e2110e30337ab01aa71598Chia-chi Yeh  ownership_dbus_interface->AddMethodHandler(
7073f6df1f0aac12c243e2110e30337ab01aa71598Chia-chi Yeh      kTakeOwnership, base::Unretained(this),
7173f6df1f0aac12c243e2110e30337ab01aa71598Chia-chi Yeh      &DBusService::HandleOwnershipDBusMethod<
7273f6df1f0aac12c243e2110e30337ab01aa71598Chia-chi Yeh          TakeOwnershipRequest, TakeOwnershipReply,
7373f6df1f0aac12c243e2110e30337ab01aa71598Chia-chi Yeh          &TpmOwnershipInterface::TakeOwnership>);
7473f6df1f0aac12c243e2110e30337ab01aa71598Chia-chi Yeh
7573f6df1f0aac12c243e2110e30337ab01aa71598Chia-chi Yeh  ownership_dbus_interface->AddMethodHandler(
7673f6df1f0aac12c243e2110e30337ab01aa71598Chia-chi Yeh      kRemoveOwnerDependency, base::Unretained(this),
7773f6df1f0aac12c243e2110e30337ab01aa71598Chia-chi Yeh      &DBusService::HandleOwnershipDBusMethod<
7873f6df1f0aac12c243e2110e30337ab01aa71598Chia-chi Yeh          RemoveOwnerDependencyRequest, RemoveOwnerDependencyReply,
7973f6df1f0aac12c243e2110e30337ab01aa71598Chia-chi Yeh          &TpmOwnershipInterface::RemoveOwnerDependency>);
800d2c37c274f1db29f51f1d078f240be13b784bf2Chia-chi Yeh
8173f6df1f0aac12c243e2110e30337ab01aa71598Chia-chi Yeh  brillo::dbus_utils::DBusInterface* nvram_dbus_interface =
8273f6df1f0aac12c243e2110e30337ab01aa71598Chia-chi Yeh      dbus_object_->AddOrGetInterface(kTpmNvramInterface);
8373f6df1f0aac12c243e2110e30337ab01aa71598Chia-chi Yeh
8473f6df1f0aac12c243e2110e30337ab01aa71598Chia-chi Yeh  nvram_dbus_interface->AddMethodHandler(
8573f6df1f0aac12c243e2110e30337ab01aa71598Chia-chi Yeh      kDefineSpace, base::Unretained(this),
8673f6df1f0aac12c243e2110e30337ab01aa71598Chia-chi Yeh      &DBusService::HandleNvramDBusMethod<DefineSpaceRequest, DefineSpaceReply,
8773f6df1f0aac12c243e2110e30337ab01aa71598Chia-chi Yeh                                          &TpmNvramInterface::DefineSpace>);
8873f6df1f0aac12c243e2110e30337ab01aa71598Chia-chi Yeh
8973f6df1f0aac12c243e2110e30337ab01aa71598Chia-chi Yeh  nvram_dbus_interface->AddMethodHandler(
9073f6df1f0aac12c243e2110e30337ab01aa71598Chia-chi Yeh      kDestroySpace, base::Unretained(this),
9173f6df1f0aac12c243e2110e30337ab01aa71598Chia-chi Yeh      &DBusService::HandleNvramDBusMethod<DestroySpaceRequest,
9273f6df1f0aac12c243e2110e30337ab01aa71598Chia-chi Yeh                                          DestroySpaceReply,
9373f6df1f0aac12c243e2110e30337ab01aa71598Chia-chi Yeh                                          &TpmNvramInterface::DestroySpace>);
9473f6df1f0aac12c243e2110e30337ab01aa71598Chia-chi Yeh
9573f6df1f0aac12c243e2110e30337ab01aa71598Chia-chi Yeh  nvram_dbus_interface->AddMethodHandler(
9673f6df1f0aac12c243e2110e30337ab01aa71598Chia-chi Yeh      kWriteSpace, base::Unretained(this),
9773f6df1f0aac12c243e2110e30337ab01aa71598Chia-chi Yeh      &DBusService::HandleNvramDBusMethod<WriteSpaceRequest, WriteSpaceReply,
9873f6df1f0aac12c243e2110e30337ab01aa71598Chia-chi Yeh                                          &TpmNvramInterface::WriteSpace>);
9973f6df1f0aac12c243e2110e30337ab01aa71598Chia-chi Yeh
10073f6df1f0aac12c243e2110e30337ab01aa71598Chia-chi Yeh  nvram_dbus_interface->AddMethodHandler(
10173f6df1f0aac12c243e2110e30337ab01aa71598Chia-chi Yeh      kReadSpace, base::Unretained(this),
10273f6df1f0aac12c243e2110e30337ab01aa71598Chia-chi Yeh      &DBusService::HandleNvramDBusMethod<ReadSpaceRequest, ReadSpaceReply,
10373f6df1f0aac12c243e2110e30337ab01aa71598Chia-chi Yeh                                          &TpmNvramInterface::ReadSpace>);
10473f6df1f0aac12c243e2110e30337ab01aa71598Chia-chi Yeh
10573f6df1f0aac12c243e2110e30337ab01aa71598Chia-chi Yeh  nvram_dbus_interface->AddMethodHandler(
10673f6df1f0aac12c243e2110e30337ab01aa71598Chia-chi Yeh      kLockSpace, base::Unretained(this),
107ea7bed2487a9460ad2c01cda9ded8035e0b0c945repo sync      &DBusService::HandleNvramDBusMethod<LockSpaceRequest, LockSpaceReply,
10873f6df1f0aac12c243e2110e30337ab01aa71598Chia-chi Yeh                                          &TpmNvramInterface::LockSpace>);
10973f6df1f0aac12c243e2110e30337ab01aa71598Chia-chi Yeh
11073f6df1f0aac12c243e2110e30337ab01aa71598Chia-chi Yeh  nvram_dbus_interface->AddMethodHandler(
11173f6df1f0aac12c243e2110e30337ab01aa71598Chia-chi Yeh      kListSpaces, base::Unretained(this),
11273f6df1f0aac12c243e2110e30337ab01aa71598Chia-chi Yeh      &DBusService::HandleNvramDBusMethod<ListSpacesRequest, ListSpacesReply,
11373f6df1f0aac12c243e2110e30337ab01aa71598Chia-chi Yeh                                          &TpmNvramInterface::ListSpaces>);
11473f6df1f0aac12c243e2110e30337ab01aa71598Chia-chi Yeh
11573f6df1f0aac12c243e2110e30337ab01aa71598Chia-chi Yeh  nvram_dbus_interface->AddMethodHandler(
11673f6df1f0aac12c243e2110e30337ab01aa71598Chia-chi Yeh      kGetSpaceInfo, base::Unretained(this),
11773f6df1f0aac12c243e2110e30337ab01aa71598Chia-chi Yeh      &DBusService::HandleNvramDBusMethod<GetSpaceInfoRequest,
11873f6df1f0aac12c243e2110e30337ab01aa71598Chia-chi Yeh                                          GetSpaceInfoReply,
11973f6df1f0aac12c243e2110e30337ab01aa71598Chia-chi Yeh                                          &TpmNvramInterface::GetSpaceInfo>);
12073f6df1f0aac12c243e2110e30337ab01aa71598Chia-chi Yeh
12173f6df1f0aac12c243e2110e30337ab01aa71598Chia-chi Yeh  dbus_object_->RegisterAsync(
12273f6df1f0aac12c243e2110e30337ab01aa71598Chia-chi Yeh      sequencer->GetHandler("Failed to register D-Bus object.", true));
12373f6df1f0aac12c243e2110e30337ab01aa71598Chia-chi Yeh}
12473f6df1f0aac12c243e2110e30337ab01aa71598Chia-chi Yeh
12573f6df1f0aac12c243e2110e30337ab01aa71598Chia-chi Yehtemplate <typename RequestProtobufType,
12673f6df1f0aac12c243e2110e30337ab01aa71598Chia-chi Yeh          typename ReplyProtobufType,
12773f6df1f0aac12c243e2110e30337ab01aa71598Chia-chi Yeh          DBusService::HandlerFunction<RequestProtobufType,
12873f6df1f0aac12c243e2110e30337ab01aa71598Chia-chi Yeh                                       ReplyProtobufType,
12973f6df1f0aac12c243e2110e30337ab01aa71598Chia-chi Yeh                                       TpmNvramInterface> func>
13073f6df1f0aac12c243e2110e30337ab01aa71598Chia-chi Yehvoid DBusService::HandleNvramDBusMethod(
13173f6df1f0aac12c243e2110e30337ab01aa71598Chia-chi Yeh    std::unique_ptr<DBusMethodResponse<const ReplyProtobufType&>> response,
13273f6df1f0aac12c243e2110e30337ab01aa71598Chia-chi Yeh    const RequestProtobufType& request) {
13373f6df1f0aac12c243e2110e30337ab01aa71598Chia-chi Yeh  // Convert |response| to a shared_ptr so |nvram_service_| can safely copy the
13473f6df1f0aac12c243e2110e30337ab01aa71598Chia-chi Yeh  // callback.
13573f6df1f0aac12c243e2110e30337ab01aa71598Chia-chi Yeh  using SharedResponsePointer =
13673f6df1f0aac12c243e2110e30337ab01aa71598Chia-chi Yeh      std::shared_ptr<DBusMethodResponse<const ReplyProtobufType&>>;
13773f6df1f0aac12c243e2110e30337ab01aa71598Chia-chi Yeh  // A callback that sends off the reply protobuf.
13873f6df1f0aac12c243e2110e30337ab01aa71598Chia-chi Yeh  auto callback = [](const SharedResponsePointer& response,
13973f6df1f0aac12c243e2110e30337ab01aa71598Chia-chi Yeh                     const ReplyProtobufType& reply) {
14073f6df1f0aac12c243e2110e30337ab01aa71598Chia-chi Yeh    response->Return(reply);
14173f6df1f0aac12c243e2110e30337ab01aa71598Chia-chi Yeh  };
14273f6df1f0aac12c243e2110e30337ab01aa71598Chia-chi Yeh  (nvram_service_->*func)(
14373f6df1f0aac12c243e2110e30337ab01aa71598Chia-chi Yeh      request,
1440d2c37c274f1db29f51f1d078f240be13b784bf2Chia-chi Yeh      base::Bind(callback, SharedResponsePointer(std::move(response))));
14573f6df1f0aac12c243e2110e30337ab01aa71598Chia-chi Yeh}
14673f6df1f0aac12c243e2110e30337ab01aa71598Chia-chi Yeh
14773f6df1f0aac12c243e2110e30337ab01aa71598Chia-chi Yehtemplate <typename RequestProtobufType,
14873f6df1f0aac12c243e2110e30337ab01aa71598Chia-chi Yeh          typename ReplyProtobufType,
14973f6df1f0aac12c243e2110e30337ab01aa71598Chia-chi Yeh          DBusService::HandlerFunction<RequestProtobufType,
15073f6df1f0aac12c243e2110e30337ab01aa71598Chia-chi Yeh                                       ReplyProtobufType,
15173f6df1f0aac12c243e2110e30337ab01aa71598Chia-chi Yeh                                       TpmOwnershipInterface> func>
15273f6df1f0aac12c243e2110e30337ab01aa71598Chia-chi Yehvoid DBusService::HandleOwnershipDBusMethod(
15373f6df1f0aac12c243e2110e30337ab01aa71598Chia-chi Yeh    std::unique_ptr<DBusMethodResponse<const ReplyProtobufType&>> response,
15473f6df1f0aac12c243e2110e30337ab01aa71598Chia-chi Yeh    const RequestProtobufType& request) {
15573f6df1f0aac12c243e2110e30337ab01aa71598Chia-chi Yeh  // Convert |response| to a shared_ptr so |ownership_service_| can safely
15673f6df1f0aac12c243e2110e30337ab01aa71598Chia-chi Yeh  // copy the callback.
15773f6df1f0aac12c243e2110e30337ab01aa71598Chia-chi Yeh  using SharedResponsePointer =
15873f6df1f0aac12c243e2110e30337ab01aa71598Chia-chi Yeh      std::shared_ptr<DBusMethodResponse<const ReplyProtobufType&>>;
15973f6df1f0aac12c243e2110e30337ab01aa71598Chia-chi Yeh  // A callback that sends off the reply protobuf.
16073f6df1f0aac12c243e2110e30337ab01aa71598Chia-chi Yeh  auto callback = [](const SharedResponsePointer& response,
16173f6df1f0aac12c243e2110e30337ab01aa71598Chia-chi Yeh                     const ReplyProtobufType& reply) {
16273f6df1f0aac12c243e2110e30337ab01aa71598Chia-chi Yeh    response->Return(reply);
16373f6df1f0aac12c243e2110e30337ab01aa71598Chia-chi Yeh  };
16473f6df1f0aac12c243e2110e30337ab01aa71598Chia-chi Yeh  (ownership_service_->*func)(
16573f6df1f0aac12c243e2110e30337ab01aa71598Chia-chi Yeh      request,
16673f6df1f0aac12c243e2110e30337ab01aa71598Chia-chi Yeh      base::Bind(callback, SharedResponsePointer(std::move(response))));
16773f6df1f0aac12c243e2110e30337ab01aa71598Chia-chi Yeh}
16873f6df1f0aac12c243e2110e30337ab01aa71598Chia-chi Yeh
16973f6df1f0aac12c243e2110e30337ab01aa71598Chia-chi Yeh}  // namespace tpm_manager
17073f6df1f0aac12c243e2110e30337ab01aa71598Chia-chi Yeh