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