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