// // Copyright (C) 2014 The Android Open Source Project // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // #include "attestation/server/dbus_service.h" #include <memory> #include <string> #include <brillo/bind_lambda.h> #include <dbus/bus.h> #include <dbus/object_path.h> #include "attestation/common/dbus_interface.h" using brillo::dbus_utils::DBusMethodResponse; namespace attestation { DBusService::DBusService(const scoped_refptr<dbus::Bus>& bus, AttestationInterface* service) : dbus_object_(nullptr, bus, dbus::ObjectPath(kAttestationServicePath)), service_(service) { } void DBusService::Register(const CompletionAction& callback) { brillo::dbus_utils::DBusInterface* dbus_interface = dbus_object_.AddOrGetInterface(kAttestationInterface); dbus_interface->AddMethodHandler(kCreateGoogleAttestedKey, base::Unretained(this), &DBusService::HandleCreateGoogleAttestedKey); dbus_interface->AddMethodHandler(kGetKeyInfo, base::Unretained(this), &DBusService::HandleGetKeyInfo); dbus_interface->AddMethodHandler(kGetEndorsementInfo, base::Unretained(this), &DBusService::HandleGetEndorsementInfo); dbus_interface->AddMethodHandler(kGetAttestationKeyInfo, base::Unretained(this), &DBusService::HandleGetAttestationKeyInfo); dbus_interface->AddMethodHandler(kActivateAttestationKey, base::Unretained(this), &DBusService::HandleActivateAttestationKey); dbus_interface->AddMethodHandler(kCreateCertifiableKey, base::Unretained(this), &DBusService::HandleCreateCertifiableKey); dbus_interface->AddMethodHandler(kDecrypt, base::Unretained(this), &DBusService::HandleDecrypt); dbus_interface->AddMethodHandler(kSign, base::Unretained(this), &DBusService::HandleSign); dbus_interface->AddMethodHandler( kRegisterKeyWithChapsToken, base::Unretained(this), &DBusService::HandleRegisterKeyWithChapsToken); dbus_object_.RegisterAsync(callback); } void DBusService::HandleCreateGoogleAttestedKey( std::unique_ptr<DBusMethodResponse<const CreateGoogleAttestedKeyReply&>> response, const CreateGoogleAttestedKeyRequest& request) { VLOG(1) << __func__; // Convert |response| to a shared_ptr so |service_| can safely copy the // callback. using SharedResponsePointer = std::shared_ptr< DBusMethodResponse<const CreateGoogleAttestedKeyReply&>>; // A callback that fills the reply protobuf and sends it. auto callback = [](const SharedResponsePointer& response, const CreateGoogleAttestedKeyReply& reply) { response->Return(reply); }; service_->CreateGoogleAttestedKey( request, base::Bind(callback, SharedResponsePointer(std::move(response)))); } void DBusService::HandleGetKeyInfo( std::unique_ptr<DBusMethodResponse<const GetKeyInfoReply&>> response, const GetKeyInfoRequest& request) { VLOG(1) << __func__; // Convert |response| to a shared_ptr so |service_| can safely copy the // callback. using SharedResponsePointer = std::shared_ptr< DBusMethodResponse<const GetKeyInfoReply&>>; // A callback that fills the reply protobuf and sends it. auto callback = [](const SharedResponsePointer& response, const GetKeyInfoReply& reply) { response->Return(reply); }; service_->GetKeyInfo( request, base::Bind(callback, SharedResponsePointer(std::move(response)))); } void DBusService::HandleGetEndorsementInfo( std::unique_ptr<DBusMethodResponse<const GetEndorsementInfoReply&>> response, const GetEndorsementInfoRequest& request) { VLOG(1) << __func__; // Convert |response| to a shared_ptr so |service_| can safely copy the // callback. using SharedResponsePointer = std::shared_ptr< DBusMethodResponse<const GetEndorsementInfoReply&>>; // A callback that fills the reply protobuf and sends it. auto callback = [](const SharedResponsePointer& response, const GetEndorsementInfoReply& reply) { response->Return(reply); }; service_->GetEndorsementInfo( request, base::Bind(callback, SharedResponsePointer(std::move(response)))); } void DBusService::HandleGetAttestationKeyInfo( std::unique_ptr<DBusMethodResponse<const GetAttestationKeyInfoReply&>> response, const GetAttestationKeyInfoRequest& request) { VLOG(1) << __func__; // Convert |response| to a shared_ptr so |service_| can safely copy the // callback. using SharedResponsePointer = std::shared_ptr< DBusMethodResponse<const GetAttestationKeyInfoReply&>>; // A callback that fills the reply protobuf and sends it. auto callback = [](const SharedResponsePointer& response, const GetAttestationKeyInfoReply& reply) { response->Return(reply); }; service_->GetAttestationKeyInfo( request, base::Bind(callback, SharedResponsePointer(std::move(response)))); } void DBusService::HandleActivateAttestationKey( std::unique_ptr<DBusMethodResponse<const ActivateAttestationKeyReply&>> response, const ActivateAttestationKeyRequest& request) { VLOG(1) << __func__; // Convert |response| to a shared_ptr so |service_| can safely copy the // callback. using SharedResponsePointer = std::shared_ptr< DBusMethodResponse<const ActivateAttestationKeyReply&>>; // A callback that fills the reply protobuf and sends it. auto callback = [](const SharedResponsePointer& response, const ActivateAttestationKeyReply& reply) { response->Return(reply); }; service_->ActivateAttestationKey( request, base::Bind(callback, SharedResponsePointer(std::move(response)))); } void DBusService::HandleCreateCertifiableKey( std::unique_ptr<DBusMethodResponse<const CreateCertifiableKeyReply&>> response, const CreateCertifiableKeyRequest& request) { VLOG(1) << __func__; // Convert |response| to a shared_ptr so |service_| can safely copy the // callback. using SharedResponsePointer = std::shared_ptr< DBusMethodResponse<const CreateCertifiableKeyReply&>>; // A callback that fills the reply protobuf and sends it. auto callback = [](const SharedResponsePointer& response, const CreateCertifiableKeyReply& reply) { response->Return(reply); }; service_->CreateCertifiableKey( request, base::Bind(callback, SharedResponsePointer(std::move(response)))); } void DBusService::HandleDecrypt( std::unique_ptr<DBusMethodResponse<const DecryptReply&>> response, const DecryptRequest& request) { VLOG(1) << __func__; // Convert |response| to a shared_ptr so |service_| can safely copy the // callback. using SharedResponsePointer = std::shared_ptr< DBusMethodResponse<const DecryptReply&>>; // A callback that fills the reply protobuf and sends it. auto callback = [](const SharedResponsePointer& response, const DecryptReply& reply) { response->Return(reply); }; service_->Decrypt( request, base::Bind(callback, SharedResponsePointer(std::move(response)))); } void DBusService::HandleSign( std::unique_ptr<DBusMethodResponse<const SignReply&>> response, const SignRequest& request) { VLOG(1) << __func__; // Convert |response| to a shared_ptr so |service_| can safely copy the // callback. using SharedResponsePointer = std::shared_ptr< DBusMethodResponse<const SignReply&>>; // A callback that fills the reply protobuf and sends it. auto callback = [](const SharedResponsePointer& response, const SignReply& reply) { response->Return(reply); }; service_->Sign( request, base::Bind(callback, SharedResponsePointer(std::move(response)))); } void DBusService::HandleRegisterKeyWithChapsToken( std::unique_ptr<DBusMethodResponse<const RegisterKeyWithChapsTokenReply&>> response, const RegisterKeyWithChapsTokenRequest& request) { VLOG(1) << __func__; // Convert |response| to a shared_ptr so |service_| can safely copy the // callback. using SharedResponsePointer = std::shared_ptr< DBusMethodResponse<const RegisterKeyWithChapsTokenReply&>>; // A callback that fills the reply protobuf and sends it. auto callback = [](const SharedResponsePointer& response, const RegisterKeyWithChapsTokenReply& reply) { response->Return(reply); }; service_->RegisterKeyWithChapsToken( request, base::Bind(callback, SharedResponsePointer(std::move(response)))); } } // namespace attestation