blob: 6fabbde9925ce28b2ecf73798b306ba0f6737aef [file] [log] [blame]
Janis Danisevskis0f35e5a2016-10-12 11:33:13 +01001/*
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@3.0-impl"
19
20#include "KeymasterDevice.h"
21
22#include <cutils/log.h>
23
Janis Danisevskis5a07ed42017-05-23 16:11:06 -070024#include <AndroidKeymaster3Device.h>
25#include <hardware/keymaster0.h>
26#include <hardware/keymaster1.h>
27#include <hardware/keymaster2.h>
Janis Danisevskis0f35e5a2016-10-12 11:33:13 +010028#include <hardware/keymaster_defs.h>
Janis Danisevskis0f35e5a2016-10-12 11:33:13 +010029
30namespace android {
31namespace hardware {
32namespace keymaster {
33namespace V3_0 {
34namespace implementation {
35
Janis Danisevskis5a07ed42017-05-23 16:11:06 -070036static int get_keymaster0_dev(keymaster0_device_t** dev, const hw_module_t* mod) {
37 int rc = keymaster0_open(mod, dev);
Janis Danisevskis0f35e5a2016-10-12 11:33:13 +010038 if (rc) {
39 ALOGE("Error opening keystore keymaster0 device.");
Janis Danisevskis5a07ed42017-05-23 16:11:06 -070040 *dev = nullptr;
41 return rc;
Janis Danisevskis0f35e5a2016-10-12 11:33:13 +010042 }
Janis Danisevskis0f35e5a2016-10-12 11:33:13 +010043 return 0;
Janis Danisevskis0f35e5a2016-10-12 11:33:13 +010044}
45
Janis Danisevskis5a07ed42017-05-23 16:11:06 -070046static int get_keymaster1_dev(keymaster1_device_t** dev, const hw_module_t* mod) {
47 int rc = keymaster1_open(mod, dev);
Janis Danisevskis0f35e5a2016-10-12 11:33:13 +010048 if (rc) {
49 ALOGE("Error %d opening keystore keymaster1 device", rc);
Janis Danisevskis5a07ed42017-05-23 16:11:06 -070050 if (*dev) {
51 (*dev)->common.close(&(*dev)->common);
52 *dev = nullptr;
53 }
Janis Danisevskis0f35e5a2016-10-12 11:33:13 +010054 }
Janis Danisevskis0f35e5a2016-10-12 11:33:13 +010055 return rc;
56}
57
Janis Danisevskis5a07ed42017-05-23 16:11:06 -070058static int get_keymaster2_dev(keymaster2_device_t** dev, const hw_module_t* mod) {
59 int rc = keymaster2_open(mod, dev);
Janis Danisevskis0f35e5a2016-10-12 11:33:13 +010060 if (rc) {
61 ALOGE("Error %d opening keystore keymaster2 device", rc);
Janis Danisevskis5a07ed42017-05-23 16:11:06 -070062 *dev = nullptr;
Janis Danisevskis0f35e5a2016-10-12 11:33:13 +010063 }
Janis Danisevskis0f35e5a2016-10-12 11:33:13 +010064 return rc;
65}
66
Janis Danisevskis5a07ed42017-05-23 16:11:06 -070067static IKeymasterDevice* createKeymaster3Device() {
68 const hw_module_t* mod = nullptr;
Janis Danisevskis0f35e5a2016-10-12 11:33:13 +010069
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()
Janis Danisevskis5a07ed42017-05-23 16:11:06 -070074 return ::keymaster::ng::CreateKeymasterDevice();
Janis Danisevskis0f35e5a2016-10-12 11:33:13 +010075 }
76
77 if (mod->module_api_version < KEYMASTER_MODULE_API_VERSION_1_0) {
Janis Danisevskis5a07ed42017-05-23 16:11:06 -070078 keymaster0_device_t* dev = nullptr;
79 if (get_keymaster0_dev(&dev, mod)) {
80 return nullptr;
Janis Danisevskis0f35e5a2016-10-12 11:33:13 +010081 }
Janis Danisevskis5a07ed42017-05-23 16:11:06 -070082 return ::keymaster::ng::CreateKeymasterDevice(dev);
Janis Danisevskis0f35e5a2016-10-12 11:33:13 +010083 } else if (mod->module_api_version == KEYMASTER_MODULE_API_VERSION_1_0) {
Janis Danisevskis5a07ed42017-05-23 16:11:06 -070084 keymaster1_device_t* dev = nullptr;
85 if (get_keymaster1_dev(&dev, mod)) {
86 return nullptr;
87 }
88 return ::keymaster::ng::CreateKeymasterDevice(dev);
Janis Danisevskis0f35e5a2016-10-12 11:33:13 +010089 } else {
Janis Danisevskis5a07ed42017-05-23 16:11:06 -070090 keymaster2_device_t* dev = nullptr;
91 if (get_keymaster2_dev(&dev, mod)) {
92 return nullptr;
Janis Danisevskis0f35e5a2016-10-12 11:33:13 +010093 }
Janis Danisevskis5a07ed42017-05-23 16:11:06 -070094 return ::keymaster::ng::CreateKeymasterDevice(dev);
Janis Danisevskis0f35e5a2016-10-12 11:33:13 +010095 }
Janis Danisevskis0f35e5a2016-10-12 11:33:13 +010096}
97
Shawn Willden63e15f02017-03-29 21:27:12 -060098IKeymasterDevice* HIDL_FETCH_IKeymasterDevice(const char* name) {
Shawn Willden63e15f02017-03-29 21:27:12 -060099 ALOGI("Fetching keymaster device name %s", name);
100
Shawn Willden63e15f02017-03-29 21:27:12 -0600101 if (name && strcmp(name, "softwareonly") == 0) {
Janis Danisevskis5a07ed42017-05-23 16:11:06 -0700102 return ::keymaster::ng::CreateKeymasterDevice();
Shawn Willden63e15f02017-03-29 21:27:12 -0600103 } else if (name && strcmp(name, "default") == 0) {
Janis Danisevskis5a07ed42017-05-23 16:11:06 -0700104 return createKeymaster3Device();
Shawn Willden63e15f02017-03-29 21:27:12 -0600105 }
Janis Danisevskis5a07ed42017-05-23 16:11:06 -0700106 return nullptr;
Janis Danisevskis0f35e5a2016-10-12 11:33:13 +0100107}
108
109} // namespace implementation
110} // namespace V3_0
111} // namespace keymaster
112} // namespace hardware
113} // namespace android