Home | History | Annotate | Download | only in default
      1 /*
      2  **
      3  ** Copyright 2016, The Android Open Source Project
      4  **
      5  ** Licensed under the Apache License, Version 2.0 (the "License");
      6  ** you may not use this file except in compliance with the License.
      7  ** You may obtain a copy of the License at
      8  **
      9  **     http://www.apache.org/licenses/LICENSE-2.0
     10  **
     11  ** Unless required by applicable law or agreed to in writing, software
     12  ** distributed under the License is distributed on an "AS IS" BASIS,
     13  ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     14  ** See the License for the specific language governing permissions and
     15  ** limitations under the License.
     16  */
     17 
     18 #define LOG_TAG "android.hardware.keymaster (at) 3.0-impl"
     19 
     20 #include "KeymasterDevice.h"
     21 
     22 #include <log/log.h>
     23 
     24 #include <AndroidKeymaster3Device.h>
     25 #include <hardware/keymaster0.h>
     26 #include <hardware/keymaster1.h>
     27 #include <hardware/keymaster2.h>
     28 #include <hardware/keymaster_defs.h>
     29 
     30 namespace android {
     31 namespace hardware {
     32 namespace keymaster {
     33 namespace V3_0 {
     34 namespace implementation {
     35 
     36 static int get_keymaster0_dev(keymaster0_device_t** dev, const hw_module_t* mod) {
     37     int rc = keymaster0_open(mod, dev);
     38     if (rc) {
     39         ALOGE("Error opening keystore keymaster0 device.");
     40         *dev = nullptr;
     41         return rc;
     42     }
     43     return 0;
     44 }
     45 
     46 static int get_keymaster1_dev(keymaster1_device_t** dev, const hw_module_t* mod) {
     47     int rc = keymaster1_open(mod, dev);
     48     if (rc) {
     49         ALOGE("Error %d opening keystore keymaster1 device", rc);
     50         if (*dev) {
     51             (*dev)->common.close(&(*dev)->common);
     52             *dev = nullptr;
     53         }
     54     }
     55     return rc;
     56 }
     57 
     58 static int get_keymaster2_dev(keymaster2_device_t** dev, const hw_module_t* mod) {
     59     int rc = keymaster2_open(mod, dev);
     60     if (rc) {
     61         ALOGE("Error %d opening keystore keymaster2 device", rc);
     62         *dev = nullptr;
     63     }
     64     return rc;
     65 }
     66 
     67 static IKeymasterDevice* createKeymaster3Device() {
     68     const hw_module_t* mod = nullptr;
     69 
     70     int rc = hw_get_module_by_class(KEYSTORE_HARDWARE_MODULE_ID, NULL, &mod);
     71     if (rc) {
     72         ALOGI("Could not find any keystore module, using software-only implementation.");
     73         // SoftKeymasterDevice will be deleted by keymaster_device_release()
     74         return ::keymaster::ng::CreateKeymasterDevice();
     75     }
     76 
     77     if (mod->module_api_version < KEYMASTER_MODULE_API_VERSION_1_0) {
     78         keymaster0_device_t* dev = nullptr;
     79         if (get_keymaster0_dev(&dev, mod)) {
     80             return nullptr;
     81         }
     82         return ::keymaster::ng::CreateKeymasterDevice(dev);
     83     } else if (mod->module_api_version == KEYMASTER_MODULE_API_VERSION_1_0) {
     84         keymaster1_device_t* dev = nullptr;
     85         if (get_keymaster1_dev(&dev, mod)) {
     86             return nullptr;
     87         }
     88         return ::keymaster::ng::CreateKeymasterDevice(dev);
     89     } else {
     90         keymaster2_device_t* dev = nullptr;
     91         if (get_keymaster2_dev(&dev, mod)) {
     92             return nullptr;
     93         }
     94         return ::keymaster::ng::CreateKeymasterDevice(dev);
     95     }
     96 }
     97 
     98 IKeymasterDevice* HIDL_FETCH_IKeymasterDevice(const char* name) {
     99     ALOGI("Fetching keymaster device name %s", name);
    100 
    101     if (name && strcmp(name, "softwareonly") == 0) {
    102         return ::keymaster::ng::CreateKeymasterDevice();
    103     } else if (name && strcmp(name, "default") == 0) {
    104         return createKeymaster3Device();
    105     }
    106     return nullptr;
    107 }
    108 
    109 }  // namespace implementation
    110 }  // namespace V3_0
    111 }  // namespace keymaster
    112 }  // namespace hardware
    113 }  // namespace android
    114