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