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