dbus_service.cc revision bc0c74963418442991072b2c87baec839eec9c20
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);
51b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn
52b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn  dbus_object_.RegisterAsync(callback);
53b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn}
54b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn
550752bd25ba9f45c07bc989d42bf5272133a85afaDarren Krahnvoid DBusService::HandleCreateGoogleAttestedKey(
569bb29b0861b022a9c89bff02401efbdfa884edd9Alex Vakulenko    std::unique_ptr<DBusMethodResponse<const CreateGoogleAttestedKeyReply&>>
570752bd25ba9f45c07bc989d42bf5272133a85afaDarren Krahn        response,
580752bd25ba9f45c07bc989d42bf5272133a85afaDarren Krahn    const CreateGoogleAttestedKeyRequest& request) {
59b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn  VLOG(1) << __func__;
6039f82d968e22cd3de567df5ddb2d00a923c0bb74Darren Krahn  // Convert |response| to a shared_ptr so |service_| can safely copy the
6139f82d968e22cd3de567df5ddb2d00a923c0bb74Darren Krahn  // callback.
6239f82d968e22cd3de567df5ddb2d00a923c0bb74Darren Krahn  using SharedResponsePointer = std::shared_ptr<
6339f82d968e22cd3de567df5ddb2d00a923c0bb74Darren Krahn      DBusMethodResponse<const CreateGoogleAttestedKeyReply&>>;
640752bd25ba9f45c07bc989d42bf5272133a85afaDarren Krahn  // A callback that fills the reply protobuf and sends it.
6539f82d968e22cd3de567df5ddb2d00a923c0bb74Darren Krahn  auto callback = [](const SharedResponsePointer& response,
66b48a50fc394b9c8a1059463c9eaba4c8d1985b9bDarren Krahn                     const CreateGoogleAttestedKeyReply& reply) {
670752bd25ba9f45c07bc989d42bf5272133a85afaDarren Krahn    response->Return(reply);
680752bd25ba9f45c07bc989d42bf5272133a85afaDarren Krahn  };
6939f82d968e22cd3de567df5ddb2d00a923c0bb74Darren Krahn  service_->CreateGoogleAttestedKey(
70b48a50fc394b9c8a1059463c9eaba4c8d1985b9bDarren Krahn      request,
716222defa52eb13c0d90673f642f2647f7753478bDarren Krahn      base::Bind(callback, SharedResponsePointer(std::move(response))));
726222defa52eb13c0d90673f642f2647f7753478bDarren Krahn}
736222defa52eb13c0d90673f642f2647f7753478bDarren Krahn
746222defa52eb13c0d90673f642f2647f7753478bDarren Krahnvoid DBusService::HandleGetKeyInfo(
756222defa52eb13c0d90673f642f2647f7753478bDarren Krahn    std::unique_ptr<DBusMethodResponse<const GetKeyInfoReply&>> response,
766222defa52eb13c0d90673f642f2647f7753478bDarren Krahn    const GetKeyInfoRequest& request) {
776222defa52eb13c0d90673f642f2647f7753478bDarren Krahn  VLOG(1) << __func__;
786222defa52eb13c0d90673f642f2647f7753478bDarren Krahn  // Convert |response| to a shared_ptr so |service_| can safely copy the
796222defa52eb13c0d90673f642f2647f7753478bDarren Krahn  // callback.
806222defa52eb13c0d90673f642f2647f7753478bDarren Krahn  using SharedResponsePointer = std::shared_ptr<
816222defa52eb13c0d90673f642f2647f7753478bDarren Krahn      DBusMethodResponse<const GetKeyInfoReply&>>;
826222defa52eb13c0d90673f642f2647f7753478bDarren Krahn  // A callback that fills the reply protobuf and sends it.
836222defa52eb13c0d90673f642f2647f7753478bDarren Krahn  auto callback = [](const SharedResponsePointer& response,
846222defa52eb13c0d90673f642f2647f7753478bDarren Krahn                     const GetKeyInfoReply& reply) {
856222defa52eb13c0d90673f642f2647f7753478bDarren Krahn    response->Return(reply);
866222defa52eb13c0d90673f642f2647f7753478bDarren Krahn  };
876222defa52eb13c0d90673f642f2647f7753478bDarren Krahn  service_->GetKeyInfo(
886222defa52eb13c0d90673f642f2647f7753478bDarren Krahn      request,
896222defa52eb13c0d90673f642f2647f7753478bDarren Krahn      base::Bind(callback, SharedResponsePointer(std::move(response))));
90b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn}
91b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn
92cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahnvoid DBusService::HandleGetEndorsementInfo(
93cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn    std::unique_ptr<DBusMethodResponse<const GetEndorsementInfoReply&>>
94cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn        response,
95cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn    const GetEndorsementInfoRequest& request) {
96cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn  VLOG(1) << __func__;
97cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn  // Convert |response| to a shared_ptr so |service_| can safely copy the
98cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn  // callback.
99cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn  using SharedResponsePointer = std::shared_ptr<
100cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn      DBusMethodResponse<const GetEndorsementInfoReply&>>;
101cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn  // A callback that fills the reply protobuf and sends it.
102cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn  auto callback = [](const SharedResponsePointer& response,
103cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn                     const GetEndorsementInfoReply& reply) {
104cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn    response->Return(reply);
105cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn  };
106cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn  service_->GetEndorsementInfo(
107cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn      request,
108cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn      base::Bind(callback, SharedResponsePointer(std::move(response))));
109cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn}
110cd5486df897619718b68223ebefc1322a1f5ab29Darren Krahn
111566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahnvoid DBusService::HandleGetAttestationKeyInfo(
112566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn    std::unique_ptr<DBusMethodResponse<const GetAttestationKeyInfoReply&>>
113566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn        response,
114566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn    const GetAttestationKeyInfoRequest& request) {
115566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn  VLOG(1) << __func__;
116566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn  // Convert |response| to a shared_ptr so |service_| can safely copy the
117566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn  // callback.
118566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn  using SharedResponsePointer = std::shared_ptr<
119566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn      DBusMethodResponse<const GetAttestationKeyInfoReply&>>;
120566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn  // A callback that fills the reply protobuf and sends it.
121566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn  auto callback = [](const SharedResponsePointer& response,
122566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn                     const GetAttestationKeyInfoReply& reply) {
123566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn    response->Return(reply);
124566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn  };
125566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn  service_->GetAttestationKeyInfo(
126566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn      request,
127566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn      base::Bind(callback, SharedResponsePointer(std::move(response))));
128566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn}
129566c836c403212d5c13428b02ed65e5ff6e49a6bDarren Krahn
1302e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahnvoid DBusService::HandleActivateAttestationKey(
1312e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn    std::unique_ptr<DBusMethodResponse<const ActivateAttestationKeyReply&>>
1322e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn        response,
1332e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn    const ActivateAttestationKeyRequest& request) {
1342e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn  VLOG(1) << __func__;
1352e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn  // Convert |response| to a shared_ptr so |service_| can safely copy the
1362e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn  // callback.
1372e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn  using SharedResponsePointer = std::shared_ptr<
1382e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn      DBusMethodResponse<const ActivateAttestationKeyReply&>>;
1392e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn  // A callback that fills the reply protobuf and sends it.
1402e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn  auto callback = [](const SharedResponsePointer& response,
1412e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn                     const ActivateAttestationKeyReply& reply) {
1422e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn    response->Return(reply);
1432e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn  };
1442e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn  service_->ActivateAttestationKey(
1452e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn      request,
1462e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn      base::Bind(callback, SharedResponsePointer(std::move(response))));
1472e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn}
1482e89ba764046e015ae90a1668f7cb3eb29cf509dDarren Krahn
14962c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahnvoid DBusService::HandleCreateCertifiableKey(
15062c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn    std::unique_ptr<DBusMethodResponse<const CreateCertifiableKeyReply&>>
15162c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn        response,
15262c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn    const CreateCertifiableKeyRequest& request) {
15362c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn  VLOG(1) << __func__;
15462c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn  // Convert |response| to a shared_ptr so |service_| can safely copy the
15562c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn  // callback.
15662c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn  using SharedResponsePointer = std::shared_ptr<
15762c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn      DBusMethodResponse<const CreateCertifiableKeyReply&>>;
15862c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn  // A callback that fills the reply protobuf and sends it.
15962c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn  auto callback = [](const SharedResponsePointer& response,
16062c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn                     const CreateCertifiableKeyReply& reply) {
16162c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn    response->Return(reply);
16262c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn  };
16362c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn  service_->CreateCertifiableKey(
16462c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn      request,
16562c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn      base::Bind(callback, SharedResponsePointer(std::move(response))));
16662c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn}
16762c73fa5a343fbbf6a0b0176dd789352b85c44e5Darren Krahn
168bc0c74963418442991072b2c87baec839eec9c20Darren Krahnvoid DBusService::HandleDecrypt(
169bc0c74963418442991072b2c87baec839eec9c20Darren Krahn    std::unique_ptr<DBusMethodResponse<const DecryptReply&>> response,
170bc0c74963418442991072b2c87baec839eec9c20Darren Krahn    const DecryptRequest& request) {
171bc0c74963418442991072b2c87baec839eec9c20Darren Krahn  VLOG(1) << __func__;
172bc0c74963418442991072b2c87baec839eec9c20Darren Krahn  // Convert |response| to a shared_ptr so |service_| can safely copy the
173bc0c74963418442991072b2c87baec839eec9c20Darren Krahn  // callback.
174bc0c74963418442991072b2c87baec839eec9c20Darren Krahn  using SharedResponsePointer = std::shared_ptr<
175bc0c74963418442991072b2c87baec839eec9c20Darren Krahn      DBusMethodResponse<const DecryptReply&>>;
176bc0c74963418442991072b2c87baec839eec9c20Darren Krahn  // A callback that fills the reply protobuf and sends it.
177bc0c74963418442991072b2c87baec839eec9c20Darren Krahn  auto callback = [](const SharedResponsePointer& response,
178bc0c74963418442991072b2c87baec839eec9c20Darren Krahn                     const DecryptReply& reply) {
179bc0c74963418442991072b2c87baec839eec9c20Darren Krahn    response->Return(reply);
180bc0c74963418442991072b2c87baec839eec9c20Darren Krahn  };
181bc0c74963418442991072b2c87baec839eec9c20Darren Krahn  service_->Decrypt(
182bc0c74963418442991072b2c87baec839eec9c20Darren Krahn      request,
183bc0c74963418442991072b2c87baec839eec9c20Darren Krahn      base::Bind(callback, SharedResponsePointer(std::move(response))));
184bc0c74963418442991072b2c87baec839eec9c20Darren Krahn}
185bc0c74963418442991072b2c87baec839eec9c20Darren Krahn
186b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn}  // namespace attestation
187