dbus_service.cc revision e270d8c69ab46b2ad2973d5b9395aae7c1f52bf6
151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski// 251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski// Copyright (C) 2014 The Android Open Source Project 351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski// 451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski// Licensed under the Apache License, Version 2.0 (the "License"); 551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski// you may not use this file except in compliance with the License. 651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski// You may obtain a copy of the License at 751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski// 851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski// http://www.apache.org/licenses/LICENSE-2.0 951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski// 1051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski// Unless required by applicable law or agreed to in writing, software 1151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski// distributed under the License is distributed on an "AS IS" BASIS, 1251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski// See the License for the specific language governing permissions and 1451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski// limitations under the License. 1551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski// 1651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 1751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski#include "attestation/server/dbus_service.h" 1851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 1951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski#include <memory> 2051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski#include <string> 2151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 2251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski#include <brillo/bind_lambda.h> 2351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski#include <dbus/bus.h> 2451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski#include <dbus/object_path.h> 2551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 2651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski#include "attestation/common/dbus_interface.h" 2751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 2851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiusing brillo::dbus_utils::DBusMethodResponse; 2951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 3051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskinamespace attestation { 3151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 3251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr JastrzebskiDBusService::DBusService(const scoped_refptr<dbus::Bus>& bus, 33cab01ac294bb8ded259851673baa4c6ca226f828Steven Moreland AttestationInterface* service) 343d43823e17818b3c5f45831f830884917b181454Piotr Jastrzebski : dbus_object_(nullptr, bus, dbus::ObjectPath(kAttestationServicePath)), 35519adb2f61bb2bfa6cc993b1ca15cf7022b96697Shubham Ajmera service_(service) { 36519adb2f61bb2bfa6cc993b1ca15cf7022b96697Shubham Ajmera} 37519adb2f61bb2bfa6cc993b1ca15cf7022b96697Shubham Ajmera 38a2e7c4048abe3b72c0a5bfa42e46764708d3c741Przemyslaw Szczepaniakvoid DBusService::Register(const CompletionAction& callback) { 39a2e7c4048abe3b72c0a5bfa42e46764708d3c741Przemyslaw Szczepaniak brillo::dbus_utils::DBusInterface* dbus_interface = 40519adb2f61bb2bfa6cc993b1ca15cf7022b96697Shubham Ajmera dbus_object_.AddOrGetInterface(kAttestationInterface); 41a2e7c4048abe3b72c0a5bfa42e46764708d3c741Przemyslaw Szczepaniak 42519adb2f61bb2bfa6cc993b1ca15cf7022b96697Shubham Ajmera dbus_interface->AddMethodHandler(kCreateGoogleAttestedKey, 43519adb2f61bb2bfa6cc993b1ca15cf7022b96697Shubham Ajmera base::Unretained(this), 44519adb2f61bb2bfa6cc993b1ca15cf7022b96697Shubham Ajmera &DBusService::HandleCreateGoogleAttestedKey); 45519adb2f61bb2bfa6cc993b1ca15cf7022b96697Shubham Ajmera dbus_interface->AddMethodHandler(kGetKeyInfo, 46519adb2f61bb2bfa6cc993b1ca15cf7022b96697Shubham Ajmera base::Unretained(this), 47519adb2f61bb2bfa6cc993b1ca15cf7022b96697Shubham Ajmera &DBusService::HandleGetKeyInfo); 48519adb2f61bb2bfa6cc993b1ca15cf7022b96697Shubham Ajmera dbus_interface->AddMethodHandler(kGetEndorsementInfo, 49519adb2f61bb2bfa6cc993b1ca15cf7022b96697Shubham Ajmera base::Unretained(this), 50519adb2f61bb2bfa6cc993b1ca15cf7022b96697Shubham Ajmera &DBusService::HandleGetEndorsementInfo); 51519adb2f61bb2bfa6cc993b1ca15cf7022b96697Shubham Ajmera dbus_interface->AddMethodHandler(kGetAttestationKeyInfo, 52519adb2f61bb2bfa6cc993b1ca15cf7022b96697Shubham Ajmera base::Unretained(this), 53519adb2f61bb2bfa6cc993b1ca15cf7022b96697Shubham Ajmera &DBusService::HandleGetAttestationKeyInfo); 54519adb2f61bb2bfa6cc993b1ca15cf7022b96697Shubham Ajmera dbus_interface->AddMethodHandler(kActivateAttestationKey, 553d43823e17818b3c5f45831f830884917b181454Piotr Jastrzebski base::Unretained(this), 563d43823e17818b3c5f45831f830884917b181454Piotr Jastrzebski &DBusService::HandleActivateAttestationKey); 5751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski dbus_interface->AddMethodHandler(kCreateCertifiableKey, 5851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski base::Unretained(this), 5951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski &DBusService::HandleCreateCertifiableKey); 6051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski dbus_interface->AddMethodHandler(kDecrypt, 6151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski base::Unretained(this), 6251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski &DBusService::HandleDecrypt); 634ef72d32afd6f6b81306b2664a6f3f30f6103ebfPrzemyslaw Szczepaniak dbus_interface->AddMethodHandler(kSign, 6451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski base::Unretained(this), 6551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski &DBusService::HandleSign); 6651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski dbus_interface->AddMethodHandler( 6751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski kRegisterKeyWithChapsToken, 6851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski base::Unretained(this), 6951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski &DBusService::HandleRegisterKeyWithChapsToken); 7051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 7151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski dbus_object_.RegisterAsync(callback); 7251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski} 7351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 7451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskivoid DBusService::HandleCreateGoogleAttestedKey( 7551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski std::unique_ptr<DBusMethodResponse<const CreateGoogleAttestedKeyReply&>> 7651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski response, 7751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski const CreateGoogleAttestedKeyRequest& request) { 7851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski VLOG(1) << __func__; 7951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // Convert |response| to a shared_ptr so |service_| can safely copy the 8051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // callback. 8151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski using SharedResponsePointer = std::shared_ptr< 823d43823e17818b3c5f45831f830884917b181454Piotr Jastrzebski DBusMethodResponse<const CreateGoogleAttestedKeyReply&>>; 8351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // A callback that fills the reply protobuf and sends it. 84519adb2f61bb2bfa6cc993b1ca15cf7022b96697Shubham Ajmera auto callback = [](const SharedResponsePointer& response, 85519adb2f61bb2bfa6cc993b1ca15cf7022b96697Shubham Ajmera const CreateGoogleAttestedKeyReply& reply) { 86519adb2f61bb2bfa6cc993b1ca15cf7022b96697Shubham Ajmera response->Return(reply); 87519adb2f61bb2bfa6cc993b1ca15cf7022b96697Shubham Ajmera }; 88519adb2f61bb2bfa6cc993b1ca15cf7022b96697Shubham Ajmera service_->CreateGoogleAttestedKey( 8951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski request, 9051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski base::Bind(callback, SharedResponsePointer(std::move(response)))); 9151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski} 923d43823e17818b3c5f45831f830884917b181454Piotr Jastrzebski 9351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskivoid DBusService::HandleGetKeyInfo( 94519adb2f61bb2bfa6cc993b1ca15cf7022b96697Shubham Ajmera std::unique_ptr<DBusMethodResponse<const GetKeyInfoReply&>> response, 95519adb2f61bb2bfa6cc993b1ca15cf7022b96697Shubham Ajmera const GetKeyInfoRequest& request) { 96519adb2f61bb2bfa6cc993b1ca15cf7022b96697Shubham Ajmera VLOG(1) << __func__; 97519adb2f61bb2bfa6cc993b1ca15cf7022b96697Shubham Ajmera // Convert |response| to a shared_ptr so |service_| can safely copy the 98519adb2f61bb2bfa6cc993b1ca15cf7022b96697Shubham Ajmera // callback. 99519adb2f61bb2bfa6cc993b1ca15cf7022b96697Shubham Ajmera using SharedResponsePointer = std::shared_ptr< 100519adb2f61bb2bfa6cc993b1ca15cf7022b96697Shubham Ajmera DBusMethodResponse<const GetKeyInfoReply&>>; 10151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // A callback that fills the reply protobuf and sends it. 1023d43823e17818b3c5f45831f830884917b181454Piotr Jastrzebski auto callback = [](const SharedResponsePointer& response, 1033d43823e17818b3c5f45831f830884917b181454Piotr Jastrzebski const GetKeyInfoReply& reply) { 1043d43823e17818b3c5f45831f830884917b181454Piotr Jastrzebski response->Return(reply); 1053d43823e17818b3c5f45831f830884917b181454Piotr Jastrzebski }; 1063d43823e17818b3c5f45831f830884917b181454Piotr Jastrzebski service_->GetKeyInfo( 1073d43823e17818b3c5f45831f830884917b181454Piotr Jastrzebski request, 1083d43823e17818b3c5f45831f830884917b181454Piotr Jastrzebski base::Bind(callback, SharedResponsePointer(std::move(response)))); 1093d43823e17818b3c5f45831f830884917b181454Piotr Jastrzebski} 11009f993b04651359387d5e089b076994bb6cccc5fNarayan Kamath 1114ef72d32afd6f6b81306b2664a6f3f30f6103ebfPrzemyslaw Szczepaniakvoid DBusService::HandleGetEndorsementInfo( 11251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski std::unique_ptr<DBusMethodResponse<const GetEndorsementInfoReply&>> 113 response, 114 const GetEndorsementInfoRequest& request) { 115 VLOG(1) << __func__; 116 // Convert |response| to a shared_ptr so |service_| can safely copy the 117 // callback. 118 using SharedResponsePointer = std::shared_ptr< 119 DBusMethodResponse<const GetEndorsementInfoReply&>>; 120 // A callback that fills the reply protobuf and sends it. 121 auto callback = [](const SharedResponsePointer& response, 122 const GetEndorsementInfoReply& reply) { 123 response->Return(reply); 124 }; 125 service_->GetEndorsementInfo( 126 request, 127 base::Bind(callback, SharedResponsePointer(std::move(response)))); 128} 129 130void DBusService::HandleGetAttestationKeyInfo( 131 std::unique_ptr<DBusMethodResponse<const GetAttestationKeyInfoReply&>> 132 response, 133 const GetAttestationKeyInfoRequest& request) { 134 VLOG(1) << __func__; 135 // Convert |response| to a shared_ptr so |service_| can safely copy the 136 // callback. 137 using SharedResponsePointer = std::shared_ptr< 138 DBusMethodResponse<const GetAttestationKeyInfoReply&>>; 139 // A callback that fills the reply protobuf and sends it. 140 auto callback = [](const SharedResponsePointer& response, 141 const GetAttestationKeyInfoReply& reply) { 142 response->Return(reply); 143 }; 144 service_->GetAttestationKeyInfo( 145 request, 146 base::Bind(callback, SharedResponsePointer(std::move(response)))); 147} 148 149void DBusService::HandleActivateAttestationKey( 150 std::unique_ptr<DBusMethodResponse<const ActivateAttestationKeyReply&>> 151 response, 152 const ActivateAttestationKeyRequest& request) { 153 VLOG(1) << __func__; 154 // Convert |response| to a shared_ptr so |service_| can safely copy the 155 // callback. 156 using SharedResponsePointer = std::shared_ptr< 157 DBusMethodResponse<const ActivateAttestationKeyReply&>>; 158 // A callback that fills the reply protobuf and sends it. 159 auto callback = [](const SharedResponsePointer& response, 160 const ActivateAttestationKeyReply& reply) { 161 response->Return(reply); 162 }; 163 service_->ActivateAttestationKey( 164 request, 165 base::Bind(callback, SharedResponsePointer(std::move(response)))); 166} 167 168void DBusService::HandleCreateCertifiableKey( 169 std::unique_ptr<DBusMethodResponse<const CreateCertifiableKeyReply&>> 170 response, 171 const CreateCertifiableKeyRequest& request) { 172 VLOG(1) << __func__; 173 // Convert |response| to a shared_ptr so |service_| can safely copy the 174 // callback. 175 using SharedResponsePointer = std::shared_ptr< 176 DBusMethodResponse<const CreateCertifiableKeyReply&>>; 177 // A callback that fills the reply protobuf and sends it. 178 auto callback = [](const SharedResponsePointer& response, 179 const CreateCertifiableKeyReply& reply) { 180 response->Return(reply); 181 }; 182 service_->CreateCertifiableKey( 183 request, 184 base::Bind(callback, SharedResponsePointer(std::move(response)))); 185} 186 187void DBusService::HandleDecrypt( 188 std::unique_ptr<DBusMethodResponse<const DecryptReply&>> response, 189 const DecryptRequest& request) { 190 VLOG(1) << __func__; 191 // Convert |response| to a shared_ptr so |service_| can safely copy the 192 // callback. 193 using SharedResponsePointer = std::shared_ptr< 194 DBusMethodResponse<const DecryptReply&>>; 195 // A callback that fills the reply protobuf and sends it. 196 auto callback = [](const SharedResponsePointer& response, 197 const DecryptReply& reply) { 198 response->Return(reply); 199 }; 200 service_->Decrypt( 201 request, 202 base::Bind(callback, SharedResponsePointer(std::move(response)))); 203} 204 205void DBusService::HandleSign( 206 std::unique_ptr<DBusMethodResponse<const SignReply&>> response, 207 const SignRequest& request) { 208 VLOG(1) << __func__; 209 // Convert |response| to a shared_ptr so |service_| can safely copy the 210 // callback. 211 using SharedResponsePointer = std::shared_ptr< 212 DBusMethodResponse<const SignReply&>>; 213 // A callback that fills the reply protobuf and sends it. 214 auto callback = [](const SharedResponsePointer& response, 215 const SignReply& reply) { 216 response->Return(reply); 217 }; 218 service_->Sign( 219 request, 220 base::Bind(callback, SharedResponsePointer(std::move(response)))); 221} 222 223void DBusService::HandleRegisterKeyWithChapsToken( 224 std::unique_ptr<DBusMethodResponse<const RegisterKeyWithChapsTokenReply&>> 225 response, 226 const RegisterKeyWithChapsTokenRequest& request) { 227 VLOG(1) << __func__; 228 // Convert |response| to a shared_ptr so |service_| can safely copy the 229 // callback. 230 using SharedResponsePointer = std::shared_ptr< 231 DBusMethodResponse<const RegisterKeyWithChapsTokenReply&>>; 232 // A callback that fills the reply protobuf and sends it. 233 auto callback = [](const SharedResponsePointer& response, 234 const RegisterKeyWithChapsTokenReply& reply) { 235 response->Return(reply); 236 }; 237 service_->RegisterKeyWithChapsToken( 238 request, 239 base::Bind(callback, SharedResponsePointer(std::move(response)))); 240} 241 242} // namespace attestation 243