dbus_service.cc revision 594849c7cf872d055575277b930f4f596bef1988
1b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn// Copyright 2014 The Chromium OS Authors. All rights reserved. 2b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn// Use of this source code is governed by a BSD-style license that can be 3b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn// found in the LICENSE file. 4b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn 5b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn#include "attestation/server/dbus_service.h" 6b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn 739f82d968e22cd3de567df5ddb2d00a923c0bb74Darren Krahn#include <memory> 8b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn#include <string> 9b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn 100752bd25ba9f45c07bc989d42bf5272133a85afaDarren Krahn#include <chromeos/bind_lambda.h> 11b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn#include <dbus/bus.h> 12b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn#include <dbus/object_path.h> 13b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn 14b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn#include "attestation/common/dbus_interface.h" 15b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn 160752bd25ba9f45c07bc989d42bf5272133a85afaDarren Krahnusing chromeos::dbus_utils::DBusMethodResponse; 170752bd25ba9f45c07bc989d42bf5272133a85afaDarren Krahn 18b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahnnamespace attestation { 19b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn 20b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren KrahnDBusService::DBusService(const scoped_refptr<dbus::Bus>& bus, 21b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn AttestationInterface* service) 22b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn : dbus_object_(nullptr, bus, dbus::ObjectPath(kAttestationServicePath)), 23b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn service_(service) { 24b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn} 25b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn 26b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahnvoid DBusService::Register(const CompletionAction& callback) { 27b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn chromeos::dbus_utils::DBusInterface* dbus_interface = 28b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn dbus_object_.AddOrGetInterface(kAttestationInterface); 29b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn 30bc0c74963418442991072b2c87baec839eec9c20Darren Krahn dbus_interface->AddMethodHandler(kCreateGoogleAttestedKey, 31bc0c74963418442991072b2c87baec839eec9c20Darren Krahn base::Unretained(this), 32bc0c74963418442991072b2c87baec839eec9c20Darren Krahn &DBusService::HandleCreateGoogleAttestedKey); 33bc0c74963418442991072b2c87baec839eec9c20Darren Krahn dbus_interface->AddMethodHandler(kGetKeyInfo, 34bc0c74963418442991072b2c87baec839eec9c20Darren Krahn base::Unretained(this), 35bc0c74963418442991072b2c87baec839eec9c20Darren Krahn &DBusService::HandleGetKeyInfo); 36bc0c74963418442991072b2c87baec839eec9c20Darren Krahn dbus_interface->AddMethodHandler(kGetEndorsementInfo, 37bc0c74963418442991072b2c87baec839eec9c20Darren Krahn base::Unretained(this), 38bc0c74963418442991072b2c87baec839eec9c20Darren Krahn &DBusService::HandleGetEndorsementInfo); 39bc0c74963418442991072b2c87baec839eec9c20Darren Krahn dbus_interface->AddMethodHandler(kGetAttestationKeyInfo, 40bc0c74963418442991072b2c87baec839eec9c20Darren Krahn base::Unretained(this), 41bc0c74963418442991072b2c87baec839eec9c20Darren Krahn &DBusService::HandleGetAttestationKeyInfo); 42bc0c74963418442991072b2c87baec839eec9c20Darren Krahn dbus_interface->AddMethodHandler(kActivateAttestationKey, 43bc0c74963418442991072b2c87baec839eec9c20Darren Krahn base::Unretained(this), 44bc0c74963418442991072b2c87baec839eec9c20Darren Krahn &DBusService::HandleActivateAttestationKey); 45bc0c74963418442991072b2c87baec839eec9c20Darren Krahn dbus_interface->AddMethodHandler(kCreateCertifiableKey, 46bc0c74963418442991072b2c87baec839eec9c20Darren Krahn base::Unretained(this), 47bc0c74963418442991072b2c87baec839eec9c20Darren Krahn &DBusService::HandleCreateCertifiableKey); 48bc0c74963418442991072b2c87baec839eec9c20Darren Krahn dbus_interface->AddMethodHandler(kDecrypt, 49bc0c74963418442991072b2c87baec839eec9c20Darren Krahn base::Unretained(this), 50bc0c74963418442991072b2c87baec839eec9c20Darren Krahn &DBusService::HandleDecrypt); 51ccf90703bb6989e659b12a6494e84fdb921008edDarren Krahn dbus_interface->AddMethodHandler(kSign, 52ccf90703bb6989e659b12a6494e84fdb921008edDarren Krahn base::Unretained(this), 53ccf90703bb6989e659b12a6494e84fdb921008edDarren Krahn &DBusService::HandleSign); 54594849c7cf872d055575277b930f4f596bef1988Darren Krahn dbus_interface->AddMethodHandler( 55594849c7cf872d055575277b930f4f596bef1988Darren Krahn kRegisterKeyWithChapsToken, 56594849c7cf872d055575277b930f4f596bef1988Darren Krahn base::Unretained(this), 57594849c7cf872d055575277b930f4f596bef1988Darren Krahn &DBusService::HandleRegisterKeyWithChapsToken); 58b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn 59b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn dbus_object_.RegisterAsync(callback); 60b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn} 61b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn 620752bd25ba9f45c07bc989d42bf5272133a85afaDarren Krahnvoid DBusService::HandleCreateGoogleAttestedKey( 639bb29b0861b022a9c89bff02401efbdfa884edd9Alex Vakulenko std::unique_ptr<DBusMethodResponse<const CreateGoogleAttestedKeyReply&>> 640752bd25ba9f45c07bc989d42bf5272133a85afaDarren Krahn response, 650752bd25ba9f45c07bc989d42bf5272133a85afaDarren Krahn const CreateGoogleAttestedKeyRequest& request) { 66b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn VLOG(1) << __func__; 6739f82d968e22cd3de567df5ddb2d00a923c0bb74Darren Krahn // Convert |response| to a shared_ptr so |service_| can safely copy the 6839f82d968e22cd3de567df5ddb2d00a923c0bb74Darren Krahn // callback. 6939f82d968e22cd3de567df5ddb2d00a923c0bb74Darren Krahn using SharedResponsePointer = std::shared_ptr< 7039f82d968e22cd3de567df5ddb2d00a923c0bb74Darren Krahn DBusMethodResponse<const CreateGoogleAttestedKeyReply&>>; 710752bd25ba9f45c07bc989d42bf5272133a85afaDarren Krahn // A callback that fills the reply protobuf and sends it. 7239f82d968e22cd3de567df5ddb2d00a923c0bb74Darren Krahn auto callback = [](const SharedResponsePointer& response, 73b48a50fc394b9c8a1059463c9eaba4c8d1985b9bDarren Krahn const CreateGoogleAttestedKeyReply& reply) { 740752bd25ba9f45c07bc989d42bf5272133a85afaDarren Krahn response->Return(reply); 750752bd25ba9f45c07bc989d42bf5272133a85afaDarren Krahn }; 7639f82d968e22cd3de567df5ddb2d00a923c0bb74Darren Krahn service_->CreateGoogleAttestedKey( 77b48a50fc394b9c8a1059463c9eaba4c8d1985b9bDarren Krahn request, 786222defa52eb13c0d90673f642f2647f7753478bDarren Krahn base::Bind(callback, SharedResponsePointer(std::move(response)))); 796222defa52eb13c0d90673f642f2647f7753478bDarren Krahn} 806222defa52eb13c0d90673f642f2647f7753478bDarren Krahn 816222defa52eb13c0d90673f642f2647f7753478bDarren Krahnvoid DBusService::HandleGetKeyInfo( 826222defa52eb13c0d90673f642f2647f7753478bDarren Krahn std::unique_ptr<DBusMethodResponse<const GetKeyInfoReply&>> response, 836222defa52eb13c0d90673f642f2647f7753478bDarren Krahn const GetKeyInfoRequest& request) { 846222defa52eb13c0d90673f642f2647f7753478bDarren Krahn VLOG(1) << __func__; 856222defa52eb13c0d90673f642f2647f7753478bDarren Krahn // Convert |response| to a shared_ptr so |service_| can safely copy the 866222defa52eb13c0d90673f642f2647f7753478bDarren Krahn // callback. 876222defa52eb13c0d90673f642f2647f7753478bDarren Krahn using SharedResponsePointer = std::shared_ptr< 886222defa52eb13c0d90673f642f2647f7753478bDarren Krahn DBusMethodResponse<const GetKeyInfoReply&>>; 896222defa52eb13c0d90673f642f2647f7753478bDarren Krahn // A callback that fills the reply protobuf and sends it. 906222defa52eb13c0d90673f642f2647f7753478bDarren Krahn auto callback = [](const SharedResponsePointer& response, 916222defa52eb13c0d90673f642f2647f7753478bDarren Krahn const GetKeyInfoReply& reply) { 926222defa52eb13c0d90673f642f2647f7753478bDarren Krahn response->Return(reply); 936222defa52eb13c0d90673f642f2647f7753478bDarren Krahn }; 946222defa52eb13c0d90673f642f2647f7753478bDarren Krahn service_->GetKeyInfo( 956222defa52eb13c0d90673f642f2647f7753478bDarren Krahn request, 966222defa52eb13c0d90673f642f2647f7753478bDarren Krahn base::Bind(callback, SharedResponsePointer(std::move(response)))); 97b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn} 98b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn 99cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahnvoid DBusService::HandleGetEndorsementInfo( 100cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn std::unique_ptr<DBusMethodResponse<const GetEndorsementInfoReply&>> 101cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn response, 102cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn const GetEndorsementInfoRequest& request) { 103cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn VLOG(1) << __func__; 104cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn // Convert |response| to a shared_ptr so |service_| can safely copy the 105cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn // callback. 106cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn using SharedResponsePointer = std::shared_ptr< 107cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn DBusMethodResponse<const GetEndorsementInfoReply&>>; 108cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn // A callback that fills the reply protobuf and sends it. 109cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn auto callback = [](const SharedResponsePointer& response, 110cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn const GetEndorsementInfoReply& reply) { 111cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn response->Return(reply); 112cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn }; 113cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn service_->GetEndorsementInfo( 114cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn request, 115cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn base::Bind(callback, SharedResponsePointer(std::move(response)))); 116cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn} 117cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn 118566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahnvoid DBusService::HandleGetAttestationKeyInfo( 119566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn std::unique_ptr<DBusMethodResponse<const GetAttestationKeyInfoReply&>> 120566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn response, 121566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn const GetAttestationKeyInfoRequest& request) { 122566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn VLOG(1) << __func__; 123566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn // Convert |response| to a shared_ptr so |service_| can safely copy the 124566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn // callback. 125566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn using SharedResponsePointer = std::shared_ptr< 126566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn DBusMethodResponse<const GetAttestationKeyInfoReply&>>; 127566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn // A callback that fills the reply protobuf and sends it. 128566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn auto callback = [](const SharedResponsePointer& response, 129566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn const GetAttestationKeyInfoReply& reply) { 130566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn response->Return(reply); 131566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn }; 132566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn service_->GetAttestationKeyInfo( 133566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn request, 134566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn base::Bind(callback, SharedResponsePointer(std::move(response)))); 135566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn} 136566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn 1372e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahnvoid DBusService::HandleActivateAttestationKey( 1382e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn std::unique_ptr<DBusMethodResponse<const ActivateAttestationKeyReply&>> 1392e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn response, 1402e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn const ActivateAttestationKeyRequest& request) { 1412e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn VLOG(1) << __func__; 1422e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn // Convert |response| to a shared_ptr so |service_| can safely copy the 1432e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn // callback. 1442e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn using SharedResponsePointer = std::shared_ptr< 1452e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn DBusMethodResponse<const ActivateAttestationKeyReply&>>; 1462e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn // A callback that fills the reply protobuf and sends it. 1472e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn auto callback = [](const SharedResponsePointer& response, 1482e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn const ActivateAttestationKeyReply& reply) { 1492e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn response->Return(reply); 1502e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn }; 1512e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn service_->ActivateAttestationKey( 1522e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn request, 1532e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn base::Bind(callback, SharedResponsePointer(std::move(response)))); 1542e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn} 1552e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn 15662c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahnvoid DBusService::HandleCreateCertifiableKey( 15762c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn std::unique_ptr<DBusMethodResponse<const CreateCertifiableKeyReply&>> 15862c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn response, 15962c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn const CreateCertifiableKeyRequest& request) { 16062c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn VLOG(1) << __func__; 16162c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn // Convert |response| to a shared_ptr so |service_| can safely copy the 16262c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn // callback. 16362c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn using SharedResponsePointer = std::shared_ptr< 16462c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn DBusMethodResponse<const CreateCertifiableKeyReply&>>; 16562c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn // A callback that fills the reply protobuf and sends it. 16662c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn auto callback = [](const SharedResponsePointer& response, 16762c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn const CreateCertifiableKeyReply& reply) { 16862c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn response->Return(reply); 16962c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn }; 17062c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn service_->CreateCertifiableKey( 17162c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn request, 17262c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn base::Bind(callback, SharedResponsePointer(std::move(response)))); 17362c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn} 17462c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn 175bc0c74963418442991072b2c87baec839eec9c20Darren Krahnvoid DBusService::HandleDecrypt( 176bc0c74963418442991072b2c87baec839eec9c20Darren Krahn std::unique_ptr<DBusMethodResponse<const DecryptReply&>> response, 177bc0c74963418442991072b2c87baec839eec9c20Darren Krahn const DecryptRequest& request) { 178bc0c74963418442991072b2c87baec839eec9c20Darren Krahn VLOG(1) << __func__; 179bc0c74963418442991072b2c87baec839eec9c20Darren Krahn // Convert |response| to a shared_ptr so |service_| can safely copy the 180bc0c74963418442991072b2c87baec839eec9c20Darren Krahn // callback. 181bc0c74963418442991072b2c87baec839eec9c20Darren Krahn using SharedResponsePointer = std::shared_ptr< 182bc0c74963418442991072b2c87baec839eec9c20Darren Krahn DBusMethodResponse<const DecryptReply&>>; 183bc0c74963418442991072b2c87baec839eec9c20Darren Krahn // A callback that fills the reply protobuf and sends it. 184bc0c74963418442991072b2c87baec839eec9c20Darren Krahn auto callback = [](const SharedResponsePointer& response, 185bc0c74963418442991072b2c87baec839eec9c20Darren Krahn const DecryptReply& reply) { 186bc0c74963418442991072b2c87baec839eec9c20Darren Krahn response->Return(reply); 187bc0c74963418442991072b2c87baec839eec9c20Darren Krahn }; 188bc0c74963418442991072b2c87baec839eec9c20Darren Krahn service_->Decrypt( 189bc0c74963418442991072b2c87baec839eec9c20Darren Krahn request, 190bc0c74963418442991072b2c87baec839eec9c20Darren Krahn base::Bind(callback, SharedResponsePointer(std::move(response)))); 191bc0c74963418442991072b2c87baec839eec9c20Darren Krahn} 192bc0c74963418442991072b2c87baec839eec9c20Darren Krahn 193ccf90703bb6989e659b12a6494e84fdb921008edDarren Krahnvoid DBusService::HandleSign( 194ccf90703bb6989e659b12a6494e84fdb921008edDarren Krahn std::unique_ptr<DBusMethodResponse<const SignReply&>> response, 195ccf90703bb6989e659b12a6494e84fdb921008edDarren Krahn const SignRequest& request) { 196ccf90703bb6989e659b12a6494e84fdb921008edDarren Krahn VLOG(1) << __func__; 197ccf90703bb6989e659b12a6494e84fdb921008edDarren Krahn // Convert |response| to a shared_ptr so |service_| can safely copy the 198ccf90703bb6989e659b12a6494e84fdb921008edDarren Krahn // callback. 199ccf90703bb6989e659b12a6494e84fdb921008edDarren Krahn using SharedResponsePointer = std::shared_ptr< 200ccf90703bb6989e659b12a6494e84fdb921008edDarren Krahn DBusMethodResponse<const SignReply&>>; 201ccf90703bb6989e659b12a6494e84fdb921008edDarren Krahn // A callback that fills the reply protobuf and sends it. 202ccf90703bb6989e659b12a6494e84fdb921008edDarren Krahn auto callback = [](const SharedResponsePointer& response, 203ccf90703bb6989e659b12a6494e84fdb921008edDarren Krahn const SignReply& reply) { 204ccf90703bb6989e659b12a6494e84fdb921008edDarren Krahn response->Return(reply); 205ccf90703bb6989e659b12a6494e84fdb921008edDarren Krahn }; 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