1 /* 2 * Copyright 2020, The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 #define LOG_TAG "android.hardware.security.keymint-service" 18 19 #include <android-base/logging.h> 20 #include <android/binder_manager.h> 21 #include <android/binder_process.h> 22 23 #include <AndroidKeyMintDevice.h> 24 #include <AndroidRemotelyProvisionedComponentDevice.h> 25 #include <AndroidSecureClock.h> 26 #include <AndroidSharedSecret.h> 27 #include <keymaster/soft_keymaster_logger.h> 28 29 using aidl::android::hardware::security::keymint::AndroidKeyMintDevice; 30 using aidl::android::hardware::security::keymint::AndroidRemotelyProvisionedComponentDevice; 31 using aidl::android::hardware::security::keymint::SecurityLevel; 32 using aidl::android::hardware::security::secureclock::AndroidSecureClock; 33 using aidl::android::hardware::security::sharedsecret::AndroidSharedSecret; 34 35 template <typename T, class... Args> addService(Args &&...args)36std::shared_ptr<T> addService(Args&&... args) { 37 std::shared_ptr<T> ser = ndk::SharedRefBase::make<T>(std::forward<Args>(args)...); 38 auto instanceName = std::string(T::descriptor) + "/default"; 39 LOG(INFO) << "adding keymint service instance: " << instanceName; 40 binder_status_t status = 41 AServiceManager_addService(ser->asBinder().get(), instanceName.c_str()); 42 CHECK(status == STATUS_OK); 43 return ser; 44 } 45 main()46int main() { 47 // Zero threads seems like a useless pool, but below we'll join this thread to it, increasing 48 // the pool size to 1. 49 ABinderProcess_setThreadPoolMaxThreadCount(0); 50 // Add Keymint Service 51 std::shared_ptr<AndroidKeyMintDevice> keyMint = 52 addService<AndroidKeyMintDevice>(SecurityLevel::SOFTWARE); 53 // Add Secure Clock Service 54 addService<AndroidSecureClock>(keyMint); 55 // Add Shared Secret Service 56 addService<AndroidSharedSecret>(keyMint); 57 // Add Remotely Provisioned Component Service 58 addService<AndroidRemotelyProvisionedComponentDevice>(keyMint); 59 ABinderProcess_joinThreadPool(); 60 return EXIT_FAILURE; // should not reach 61 } 62