dbus_service.cc revision 39f82d968e22cd3de567df5ddb2d00a923c0bb74
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
300752bd25ba9f45c07bc989d42bf5272133a85afaDarren Krahn  dbus_interface->AddMethodHandler(
31b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn      kCreateGoogleAttestedKey,
32b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn      base::Unretained(this),
33b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn      &DBusService::HandleCreateGoogleAttestedKey);
34b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn
35b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn  dbus_object_.RegisterAsync(callback);
36b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn}
37b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn
380752bd25ba9f45c07bc989d42bf5272133a85afaDarren Krahnvoid DBusService::HandleCreateGoogleAttestedKey(
390752bd25ba9f45c07bc989d42bf5272133a85afaDarren Krahn    scoped_ptr<DBusMethodResponse<const CreateGoogleAttestedKeyReply&>>
400752bd25ba9f45c07bc989d42bf5272133a85afaDarren Krahn        response,
410752bd25ba9f45c07bc989d42bf5272133a85afaDarren Krahn    const CreateGoogleAttestedKeyRequest& request) {
42b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn  VLOG(1) << __func__;
4339f82d968e22cd3de567df5ddb2d00a923c0bb74Darren Krahn  // Convert |response| to a shared_ptr so |service_| can safely copy the
4439f82d968e22cd3de567df5ddb2d00a923c0bb74Darren Krahn  // callback.
4539f82d968e22cd3de567df5ddb2d00a923c0bb74Darren Krahn  using SharedResponsePointer = std::shared_ptr<
4639f82d968e22cd3de567df5ddb2d00a923c0bb74Darren Krahn      DBusMethodResponse<const CreateGoogleAttestedKeyReply&>>;
470752bd25ba9f45c07bc989d42bf5272133a85afaDarren Krahn  // A callback that fills the reply protobuf and sends it.
4839f82d968e22cd3de567df5ddb2d00a923c0bb74Darren Krahn  auto callback = [](const SharedResponsePointer& response,
4939f82d968e22cd3de567df5ddb2d00a923c0bb74Darren Krahn                     AttestationStatus status,
5039f82d968e22cd3de567df5ddb2d00a923c0bb74Darren Krahn                     const std::string& certificate_chain,
5139f82d968e22cd3de567df5ddb2d00a923c0bb74Darren Krahn                     const std::string& server_error_details) {
520752bd25ba9f45c07bc989d42bf5272133a85afaDarren Krahn    CreateGoogleAttestedKeyReply reply;
530752bd25ba9f45c07bc989d42bf5272133a85afaDarren Krahn    reply.set_status(status);
540752bd25ba9f45c07bc989d42bf5272133a85afaDarren Krahn    if (status == SUCCESS) {
550752bd25ba9f45c07bc989d42bf5272133a85afaDarren Krahn      reply.set_certificate_chain(certificate_chain);
560752bd25ba9f45c07bc989d42bf5272133a85afaDarren Krahn    } else if (status == REQUEST_DENIED_BY_CA) {
570752bd25ba9f45c07bc989d42bf5272133a85afaDarren Krahn      reply.set_server_error(server_error_details);
580752bd25ba9f45c07bc989d42bf5272133a85afaDarren Krahn    }
590752bd25ba9f45c07bc989d42bf5272133a85afaDarren Krahn    response->Return(reply);
600752bd25ba9f45c07bc989d42bf5272133a85afaDarren Krahn  };
6139f82d968e22cd3de567df5ddb2d00a923c0bb74Darren Krahn  service_->CreateGoogleAttestedKey(
6239f82d968e22cd3de567df5ddb2d00a923c0bb74Darren Krahn      request.key_label(),
6339f82d968e22cd3de567df5ddb2d00a923c0bb74Darren Krahn      request.key_type(),
6439f82d968e22cd3de567df5ddb2d00a923c0bb74Darren Krahn      request.key_usage(),
6539f82d968e22cd3de567df5ddb2d00a923c0bb74Darren Krahn      request.certificate_profile(),
6639f82d968e22cd3de567df5ddb2d00a923c0bb74Darren Krahn      base::Bind(callback, SharedResponsePointer(response.release())));
67b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn}
68b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn
69b91fd4923f411705be97fbc5c0ada37481c0cd8dDarren Krahn}  // namespace attestation
70