dbus_service.cc revision 4dc4629c415e7ca90ff146d7bb75b5646ecd8b17
13daa5a0d71ba8facd8be9370df54c20c23be6d8dUtkarsh Sanghi// 23daa5a0d71ba8facd8be9370df54c20c23be6d8dUtkarsh Sanghi// Copyright (C) 2014 The Android Open Source Project 33daa5a0d71ba8facd8be9370df54c20c23be6d8dUtkarsh Sanghi// 43daa5a0d71ba8facd8be9370df54c20c23be6d8dUtkarsh Sanghi// Licensed under the Apache License, Version 2.0 (the "License"); 53daa5a0d71ba8facd8be9370df54c20c23be6d8dUtkarsh Sanghi// you may not use this file except in compliance with the License. 63daa5a0d71ba8facd8be9370df54c20c23be6d8dUtkarsh Sanghi// You may obtain a copy of the License at 73daa5a0d71ba8facd8be9370df54c20c23be6d8dUtkarsh Sanghi// 83daa5a0d71ba8facd8be9370df54c20c23be6d8dUtkarsh Sanghi// http://www.apache.org/licenses/LICENSE-2.0 93daa5a0d71ba8facd8be9370df54c20c23be6d8dUtkarsh Sanghi// 103daa5a0d71ba8facd8be9370df54c20c23be6d8dUtkarsh Sanghi// Unless required by applicable law or agreed to in writing, software 113daa5a0d71ba8facd8be9370df54c20c23be6d8dUtkarsh Sanghi// distributed under the License is distributed on an "AS IS" BASIS, 123daa5a0d71ba8facd8be9370df54c20c23be6d8dUtkarsh Sanghi// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 133daa5a0d71ba8facd8be9370df54c20c23be6d8dUtkarsh Sanghi// See the License for the specific language governing permissions and 143daa5a0d71ba8facd8be9370df54c20c23be6d8dUtkarsh Sanghi// limitations under the License. 153daa5a0d71ba8facd8be9370df54c20c23be6d8dUtkarsh Sanghi// 16b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn 17b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn#include "attestation/server/dbus_service.h" 18b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn 1939f82d968e22cd3de567df5ddb2d00a923c0bb74Darren Krahn#include <memory> 20b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn#include <string> 21b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn 22e270d8c69ab46b2ad2973d5b9395aae7c1f52bf6Alex Vakulenko#include <brillo/bind_lambda.h> 23b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn#include <dbus/bus.h> 24b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn#include <dbus/object_path.h> 25b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn 26b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn#include "attestation/common/dbus_interface.h" 27b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn 28e270d8c69ab46b2ad2973d5b9395aae7c1f52bf6Alex Vakulenkousing brillo::dbus_utils::DBusMethodResponse; 290752bd25ba9f45c07bc989d42bf5272133a85afaDarren Krahn 30b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahnnamespace attestation { 31b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn 32b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren KrahnDBusService::DBusService(const scoped_refptr<dbus::Bus>& bus, 33b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn AttestationInterface* service) 34b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn : dbus_object_(nullptr, bus, dbus::ObjectPath(kAttestationServicePath)), 354dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren Krahn service_(service) {} 36b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn 37b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahnvoid DBusService::Register(const CompletionAction& callback) { 38e270d8c69ab46b2ad2973d5b9395aae7c1f52bf6Alex Vakulenko brillo::dbus_utils::DBusInterface* dbus_interface = 39b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn dbus_object_.AddOrGetInterface(kAttestationInterface); 40b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn 41bc0c74963418442991072b2c87baec839eec9c20Darren Krahn dbus_interface->AddMethodHandler(kCreateGoogleAttestedKey, 42bc0c74963418442991072b2c87baec839eec9c20Darren Krahn base::Unretained(this), 43bc0c74963418442991072b2c87baec839eec9c20Darren Krahn &DBusService::HandleCreateGoogleAttestedKey); 444dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren Krahn dbus_interface->AddMethodHandler(kGetKeyInfo, base::Unretained(this), 45bc0c74963418442991072b2c87baec839eec9c20Darren Krahn &DBusService::HandleGetKeyInfo); 464dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren Krahn dbus_interface->AddMethodHandler(kGetEndorsementInfo, base::Unretained(this), 47bc0c74963418442991072b2c87baec839eec9c20Darren Krahn &DBusService::HandleGetEndorsementInfo); 48bc0c74963418442991072b2c87baec839eec9c20Darren Krahn dbus_interface->AddMethodHandler(kGetAttestationKeyInfo, 49bc0c74963418442991072b2c87baec839eec9c20Darren Krahn base::Unretained(this), 50bc0c74963418442991072b2c87baec839eec9c20Darren Krahn &DBusService::HandleGetAttestationKeyInfo); 51bc0c74963418442991072b2c87baec839eec9c20Darren Krahn dbus_interface->AddMethodHandler(kActivateAttestationKey, 52bc0c74963418442991072b2c87baec839eec9c20Darren Krahn base::Unretained(this), 53bc0c74963418442991072b2c87baec839eec9c20Darren Krahn &DBusService::HandleActivateAttestationKey); 54bc0c74963418442991072b2c87baec839eec9c20Darren Krahn dbus_interface->AddMethodHandler(kCreateCertifiableKey, 55bc0c74963418442991072b2c87baec839eec9c20Darren Krahn base::Unretained(this), 56bc0c74963418442991072b2c87baec839eec9c20Darren Krahn &DBusService::HandleCreateCertifiableKey); 574dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren Krahn dbus_interface->AddMethodHandler(kDecrypt, base::Unretained(this), 58bc0c74963418442991072b2c87baec839eec9c20Darren Krahn &DBusService::HandleDecrypt); 594dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren Krahn dbus_interface->AddMethodHandler(kSign, base::Unretained(this), 60ccf90703bb6989e659b12a6494e84fdb921008edDarren Krahn &DBusService::HandleSign); 61594849c7cf872d055575277b930f4f596bef1988Darren Krahn dbus_interface->AddMethodHandler( 624dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren Krahn kRegisterKeyWithChapsToken, base::Unretained(this), 63594849c7cf872d055575277b930f4f596bef1988Darren Krahn &DBusService::HandleRegisterKeyWithChapsToken); 64b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn 65b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn dbus_object_.RegisterAsync(callback); 66b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn} 67b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn 680752bd25ba9f45c07bc989d42bf5272133a85afaDarren Krahnvoid DBusService::HandleCreateGoogleAttestedKey( 699bb29b0861b022a9c89bff02401efbdfa884edd9Alex Vakulenko std::unique_ptr<DBusMethodResponse<const CreateGoogleAttestedKeyReply&>> 700752bd25ba9f45c07bc989d42bf5272133a85afaDarren Krahn response, 710752bd25ba9f45c07bc989d42bf5272133a85afaDarren Krahn const CreateGoogleAttestedKeyRequest& request) { 72b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn VLOG(1) << __func__; 7339f82d968e22cd3de567df5ddb2d00a923c0bb74Darren Krahn // Convert |response| to a shared_ptr so |service_| can safely copy the 7439f82d968e22cd3de567df5ddb2d00a923c0bb74Darren Krahn // callback. 754dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren Krahn using SharedResponsePointer = 764dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren Krahn std::shared_ptr<DBusMethodResponse<const CreateGoogleAttestedKeyReply&>>; 770752bd25ba9f45c07bc989d42bf5272133a85afaDarren Krahn // A callback that fills the reply protobuf and sends it. 7839f82d968e22cd3de567df5ddb2d00a923c0bb74Darren Krahn auto callback = [](const SharedResponsePointer& response, 79b48a50fc394b9c8a1059463c9eaba4c8d1985b9bDarren Krahn const CreateGoogleAttestedKeyReply& reply) { 800752bd25ba9f45c07bc989d42bf5272133a85afaDarren Krahn response->Return(reply); 810752bd25ba9f45c07bc989d42bf5272133a85afaDarren Krahn }; 8239f82d968e22cd3de567df5ddb2d00a923c0bb74Darren Krahn service_->CreateGoogleAttestedKey( 83b48a50fc394b9c8a1059463c9eaba4c8d1985b9bDarren Krahn request, 846222defa52eb13c0d90673f642f2647f7753478bDarren Krahn base::Bind(callback, SharedResponsePointer(std::move(response)))); 856222defa52eb13c0d90673f642f2647f7753478bDarren Krahn} 866222defa52eb13c0d90673f642f2647f7753478bDarren Krahn 876222defa52eb13c0d90673f642f2647f7753478bDarren Krahnvoid DBusService::HandleGetKeyInfo( 886222defa52eb13c0d90673f642f2647f7753478bDarren Krahn std::unique_ptr<DBusMethodResponse<const GetKeyInfoReply&>> response, 896222defa52eb13c0d90673f642f2647f7753478bDarren Krahn const GetKeyInfoRequest& request) { 906222defa52eb13c0d90673f642f2647f7753478bDarren Krahn VLOG(1) << __func__; 916222defa52eb13c0d90673f642f2647f7753478bDarren Krahn // Convert |response| to a shared_ptr so |service_| can safely copy the 926222defa52eb13c0d90673f642f2647f7753478bDarren Krahn // callback. 934dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren Krahn using SharedResponsePointer = 944dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren Krahn std::shared_ptr<DBusMethodResponse<const GetKeyInfoReply&>>; 956222defa52eb13c0d90673f642f2647f7753478bDarren Krahn // A callback that fills the reply protobuf and sends it. 966222defa52eb13c0d90673f642f2647f7753478bDarren Krahn auto callback = [](const SharedResponsePointer& response, 974dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren Krahn const GetKeyInfoReply& reply) { response->Return(reply); }; 986222defa52eb13c0d90673f642f2647f7753478bDarren Krahn service_->GetKeyInfo( 996222defa52eb13c0d90673f642f2647f7753478bDarren Krahn request, 1006222defa52eb13c0d90673f642f2647f7753478bDarren Krahn base::Bind(callback, SharedResponsePointer(std::move(response)))); 101b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn} 102b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn 103cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahnvoid DBusService::HandleGetEndorsementInfo( 104cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn std::unique_ptr<DBusMethodResponse<const GetEndorsementInfoReply&>> 105cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn response, 106cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn const GetEndorsementInfoRequest& request) { 107cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn VLOG(1) << __func__; 108cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn // Convert |response| to a shared_ptr so |service_| can safely copy the 109cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn // callback. 1104dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren Krahn using SharedResponsePointer = 1114dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren Krahn std::shared_ptr<DBusMethodResponse<const GetEndorsementInfoReply&>>; 112cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn // A callback that fills the reply protobuf and sends it. 113cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn auto callback = [](const SharedResponsePointer& response, 114cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn const GetEndorsementInfoReply& reply) { 115cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn response->Return(reply); 116cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn }; 117cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn service_->GetEndorsementInfo( 118cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn request, 119cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn base::Bind(callback, SharedResponsePointer(std::move(response)))); 120cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn} 121cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn 122566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahnvoid DBusService::HandleGetAttestationKeyInfo( 123566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn std::unique_ptr<DBusMethodResponse<const GetAttestationKeyInfoReply&>> 124566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn response, 125566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn const GetAttestationKeyInfoRequest& request) { 126566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn VLOG(1) << __func__; 127566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn // Convert |response| to a shared_ptr so |service_| can safely copy the 128566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn // callback. 1294dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren Krahn using SharedResponsePointer = 1304dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren Krahn std::shared_ptr<DBusMethodResponse<const GetAttestationKeyInfoReply&>>; 131566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn // A callback that fills the reply protobuf and sends it. 132566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn auto callback = [](const SharedResponsePointer& response, 133566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn const GetAttestationKeyInfoReply& reply) { 134566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn response->Return(reply); 135566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn }; 136566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn service_->GetAttestationKeyInfo( 137566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn request, 138566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn base::Bind(callback, SharedResponsePointer(std::move(response)))); 139566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn} 140566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn 1412e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahnvoid DBusService::HandleActivateAttestationKey( 1422e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn std::unique_ptr<DBusMethodResponse<const ActivateAttestationKeyReply&>> 1432e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn response, 1442e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn const ActivateAttestationKeyRequest& request) { 1452e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn VLOG(1) << __func__; 1462e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn // Convert |response| to a shared_ptr so |service_| can safely copy the 1472e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn // callback. 1484dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren Krahn using SharedResponsePointer = 1494dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren Krahn std::shared_ptr<DBusMethodResponse<const ActivateAttestationKeyReply&>>; 1502e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn // A callback that fills the reply protobuf and sends it. 1512e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn auto callback = [](const SharedResponsePointer& response, 1522e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn const ActivateAttestationKeyReply& reply) { 1532e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn response->Return(reply); 1542e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn }; 1552e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn service_->ActivateAttestationKey( 1562e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn request, 1572e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn base::Bind(callback, SharedResponsePointer(std::move(response)))); 1582e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn} 1592e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn 16062c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahnvoid DBusService::HandleCreateCertifiableKey( 16162c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn std::unique_ptr<DBusMethodResponse<const CreateCertifiableKeyReply&>> 16262c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn response, 16362c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn const CreateCertifiableKeyRequest& request) { 16462c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn VLOG(1) << __func__; 16562c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn // Convert |response| to a shared_ptr so |service_| can safely copy the 16662c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn // callback. 1674dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren Krahn using SharedResponsePointer = 1684dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren Krahn std::shared_ptr<DBusMethodResponse<const CreateCertifiableKeyReply&>>; 16962c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn // A callback that fills the reply protobuf and sends it. 17062c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn auto callback = [](const SharedResponsePointer& response, 17162c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn const CreateCertifiableKeyReply& reply) { 17262c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn response->Return(reply); 17362c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn }; 17462c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn service_->CreateCertifiableKey( 17562c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn request, 17662c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn base::Bind(callback, SharedResponsePointer(std::move(response)))); 17762c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn} 17862c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn 179bc0c74963418442991072b2c87baec839eec9c20Darren Krahnvoid DBusService::HandleDecrypt( 180bc0c74963418442991072b2c87baec839eec9c20Darren Krahn std::unique_ptr<DBusMethodResponse<const DecryptReply&>> response, 181bc0c74963418442991072b2c87baec839eec9c20Darren Krahn const DecryptRequest& request) { 182bc0c74963418442991072b2c87baec839eec9c20Darren Krahn VLOG(1) << __func__; 183bc0c74963418442991072b2c87baec839eec9c20Darren Krahn // Convert |response| to a shared_ptr so |service_| can safely copy the 184bc0c74963418442991072b2c87baec839eec9c20Darren Krahn // callback. 1854dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren Krahn using SharedResponsePointer = 1864dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren Krahn std::shared_ptr<DBusMethodResponse<const DecryptReply&>>; 187bc0c74963418442991072b2c87baec839eec9c20Darren Krahn // A callback that fills the reply protobuf and sends it. 188bc0c74963418442991072b2c87baec839eec9c20Darren Krahn auto callback = [](const SharedResponsePointer& response, 1894dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren Krahn const DecryptReply& reply) { response->Return(reply); }; 190bc0c74963418442991072b2c87baec839eec9c20Darren Krahn service_->Decrypt( 191bc0c74963418442991072b2c87baec839eec9c20Darren Krahn request, 192bc0c74963418442991072b2c87baec839eec9c20Darren Krahn base::Bind(callback, SharedResponsePointer(std::move(response)))); 193bc0c74963418442991072b2c87baec839eec9c20Darren Krahn} 194bc0c74963418442991072b2c87baec839eec9c20Darren Krahn 195ccf90703bb6989e659b12a6494e84fdb921008edDarren Krahnvoid DBusService::HandleSign( 196ccf90703bb6989e659b12a6494e84fdb921008edDarren Krahn std::unique_ptr<DBusMethodResponse<const SignReply&>> response, 197ccf90703bb6989e659b12a6494e84fdb921008edDarren Krahn const SignRequest& request) { 198ccf90703bb6989e659b12a6494e84fdb921008edDarren Krahn VLOG(1) << __func__; 199ccf90703bb6989e659b12a6494e84fdb921008edDarren Krahn // Convert |response| to a shared_ptr so |service_| can safely copy the 200ccf90703bb6989e659b12a6494e84fdb921008edDarren Krahn // callback. 2014dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren Krahn using SharedResponsePointer = 2024dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren Krahn std::shared_ptr<DBusMethodResponse<const SignReply&>>; 203ccf90703bb6989e659b12a6494e84fdb921008edDarren Krahn // A callback that fills the reply protobuf and sends it. 204ccf90703bb6989e659b12a6494e84fdb921008edDarren Krahn auto callback = [](const SharedResponsePointer& response, 2054dc4629c415e7ca90ff146d7bb75b5646ecd8b17Darren Krahn const SignReply& reply) { response->Return(reply); }; 206ccf90703bb6989e659b12a6494e84fdb921008edDarren Krahn service_->Sign( 207ccf90703bb6989e659b12a6494e84fdb921008edDarren Krahn request, 208ccf90703bb6989e659b12a6494e84fdb921008edDarren Krahn base::Bind(callback, SharedResponsePointer(std::move(response)))); 209ccf90703bb6989e659b12a6494e84fdb921008edDarren Krahn} 210ccf90703bb6989e659b12a6494e84fdb921008edDarren Krahn 211594849c7cf872d055575277b930f4f596bef1988Darren Krahnvoid DBusService::HandleRegisterKeyWithChapsToken( 212594849c7cf872d055575277b930f4f596bef1988Darren Krahn std::unique_ptr<DBusMethodResponse<const RegisterKeyWithChapsTokenReply&>> 213594849c7cf872d055575277b930f4f596bef1988Darren Krahn response, 214594849c7cf872d055575277b930f4f596bef1988Darren Krahn const RegisterKeyWithChapsTokenRequest& request) { 215594849c7cf872d055575277b930f4f596bef1988Darren Krahn VLOG(1) << __func__; 216594849c7cf872d055575277b930f4f596bef1988Darren Krahn // Convert |response| to a shared_ptr so |service_| can safely copy the 217594849c7cf872d055575277b930f4f596bef1988Darren Krahn // callback. 218594849c7cf872d055575277b930f4f596bef1988Darren Krahn using SharedResponsePointer = std::shared_ptr< 219594849c7cf872d055575277b930f4f596bef1988Darren Krahn DBusMethodResponse<const RegisterKeyWithChapsTokenReply&>>; 220594849c7cf872d055575277b930f4f596bef1988Darren Krahn // A callback that fills the reply protobuf and sends it. 221594849c7cf872d055575277b930f4f596bef1988Darren Krahn auto callback = [](const SharedResponsePointer& response, 222594849c7cf872d055575277b930f4f596bef1988Darren Krahn const RegisterKeyWithChapsTokenReply& reply) { 223594849c7cf872d055575277b930f4f596bef1988Darren Krahn response->Return(reply); 224594849c7cf872d055575277b930f4f596bef1988Darren Krahn }; 225594849c7cf872d055575277b930f4f596bef1988Darren Krahn service_->RegisterKeyWithChapsToken( 226594849c7cf872d055575277b930f4f596bef1988Darren Krahn request, 227594849c7cf872d055575277b930f4f596bef1988Darren Krahn base::Bind(callback, SharedResponsePointer(std::move(response)))); 228594849c7cf872d055575277b930f4f596bef1988Darren Krahn} 229594849c7cf872d055575277b930f4f596bef1988Darren Krahn 230b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn} // namespace attestation 231