blob: 516cd00df5112340b07ff4daf9130837ebd80ff6 [file] [log] [blame]
Sasha Levitskiy965bd322016-10-21 10:55:25 -07001/*
2 * Copyright (C) 2016 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 */
Jim Miller902de512016-12-15 19:42:19 -080016#define LOG_TAG "android.hardware.biometrics.fingerprint@2.1-service"
Sasha Levitskiy965bd322016-10-21 10:55:25 -070017
Jim Miller7f7eb472017-01-18 21:03:45 -080018// For communication with Keystore binder interface
19#include <binder/IServiceManager.h>
20#include <keystore/IKeystoreService.h>
21#include <keystore/keystore.h> // for error codes
22#include <hardware/hw_auth_token.h>
23
Sasha Levitskiy965bd322016-10-21 10:55:25 -070024#include <hardware/hardware.h>
25#include <hardware/fingerprint.h>
26#include "BiometricsFingerprint.h"
27
Janis Danisevskisa47afa92017-01-20 13:50:10 +000028#include <inttypes.h>
29
Sasha Levitskiy965bd322016-10-21 10:55:25 -070030namespace android {
31namespace hardware {
32namespace biometrics {
33namespace fingerprint {
34namespace V2_1 {
35namespace implementation {
36
Jim Miller902de512016-12-15 19:42:19 -080037// Supported fingerprint HAL version
38static const uint16_t kVersion = HARDWARE_MODULE_API_VERSION(2, 1);
39
Sasha Levitskiy52640ee2016-11-10 14:15:33 -080040using RequestStatus =
41 android::hardware::biometrics::fingerprint::V2_1::RequestStatus;
42
Sasha Levitskiy965bd322016-10-21 10:55:25 -070043sp<IBiometricsFingerprintClientCallback>
44 BiometricsFingerprint::mClientCallback = nullptr;
45
Jim Miller902de512016-12-15 19:42:19 -080046// TODO: This is here because HAL 2.1 doesn't have a way to propagate a
47// unique token for its driver. Subsequent versions should send a unique
48// token for each call to notify(). This is fine as long as there's only
49// one fingerprint device on the platform.
50fingerprint_device_t *BiometricsFingerprint::sDevice = nullptr;
51
Sasha Levitskiy965bd322016-10-21 10:55:25 -070052BiometricsFingerprint::BiometricsFingerprint(fingerprint_device_t *device)
Jim Miller902de512016-12-15 19:42:19 -080053 : mDevice(device) {
54 sDevice = mDevice; // keep track of the most recent instance
55}
Sasha Levitskiy965bd322016-10-21 10:55:25 -070056
57BiometricsFingerprint::~BiometricsFingerprint() {
58 ALOG(LOG_VERBOSE, LOG_TAG, "nativeCloseHal()\n");
59 if (mDevice == NULL) {
60 ALOGE("No valid device");
61 return;
62 }
63 int err;
64 if (0 != (err = mDevice->common.close(
65 reinterpret_cast<hw_device_t*>(mDevice)))) {
66 ALOGE("Can't close fingerprint module, error: %d", err);
67 return;
68 }
69 mDevice = NULL;
70}
71
Sasha Levitskiy52640ee2016-11-10 14:15:33 -080072Return<RequestStatus> BiometricsFingerprint::ErrorFilter(int32_t error) {
73 switch(error) {
74 case 0: return RequestStatus::SYS_OK;
75 case -2: return RequestStatus::SYS_ENOENT;
76 case -4: return RequestStatus::SYS_EINTR;
77 case -5: return RequestStatus::SYS_EIO;
78 case -11: return RequestStatus::SYS_EAGAIN;
79 case -12: return RequestStatus::SYS_ENOMEM;
80 case -13: return RequestStatus::SYS_EACCES;
81 case -14: return RequestStatus::SYS_EFAULT;
82 case -16: return RequestStatus::SYS_EBUSY;
83 case -22: return RequestStatus::SYS_EINVAL;
84 case -28: return RequestStatus::SYS_ENOSPC;
85 case -110: return RequestStatus::SYS_ETIMEDOUT;
86 default:
87 ALOGE("An unknown error returned from fingerprint vendor library");
88 return RequestStatus::SYS_UNKNOWN;
89 }
90}
91
Jim Miller902de512016-12-15 19:42:19 -080092// Translate from errors returned by traditional HAL (see fingerprint.h) to
93// HIDL-compliant FingerprintError.
94FingerprintError BiometricsFingerprint::VendorErrorFilter(int32_t error,
95 int32_t* vendorCode) {
96 *vendorCode = 0;
97 switch(error) {
98 case FINGERPRINT_ERROR_HW_UNAVAILABLE:
99 return FingerprintError::ERROR_HW_UNAVAILABLE;
100 case FINGERPRINT_ERROR_UNABLE_TO_PROCESS:
101 return FingerprintError::ERROR_UNABLE_TO_PROCESS;
102 case FINGERPRINT_ERROR_TIMEOUT:
103 return FingerprintError::ERROR_TIMEOUT;
104 case FINGERPRINT_ERROR_NO_SPACE:
105 return FingerprintError::ERROR_NO_SPACE;
106 case FINGERPRINT_ERROR_CANCELED:
107 return FingerprintError::ERROR_CANCELED;
108 case FINGERPRINT_ERROR_UNABLE_TO_REMOVE:
109 return FingerprintError::ERROR_UNABLE_TO_REMOVE;
110 default:
111 if (error >= FINGERPRINT_ERROR_VENDOR_BASE) {
112 // vendor specific code.
113 *vendorCode = error - FINGERPRINT_ERROR_VENDOR_BASE;
114 return FingerprintError::ERROR_VENDOR;
115 }
116 }
117 ALOGE("Unknown error from fingerprint vendor library");
118 return FingerprintError::ERROR_UNABLE_TO_PROCESS;
119}
120
121// Translate acquired messages returned by traditional HAL (see fingerprint.h)
122// to HIDL-compliant FingerprintAcquiredInfo.
123FingerprintAcquiredInfo BiometricsFingerprint::VendorAcquiredFilter(
124 int32_t info, int32_t* vendorCode) {
125 *vendorCode = 0;
126 switch(info) {
127 case FINGERPRINT_ACQUIRED_GOOD:
128 return FingerprintAcquiredInfo::ACQUIRED_GOOD;
129 case FINGERPRINT_ACQUIRED_PARTIAL:
130 return FingerprintAcquiredInfo::ACQUIRED_PARTIAL;
131 case FINGERPRINT_ACQUIRED_INSUFFICIENT:
132 return FingerprintAcquiredInfo::ACQUIRED_INSUFFICIENT;
133 case FINGERPRINT_ACQUIRED_IMAGER_DIRTY:
134 return FingerprintAcquiredInfo::ACQUIRED_IMAGER_DIRTY;
135 case FINGERPRINT_ACQUIRED_TOO_SLOW:
136 return FingerprintAcquiredInfo::ACQUIRED_TOO_SLOW;
137 case FINGERPRINT_ACQUIRED_TOO_FAST:
138 return FingerprintAcquiredInfo::ACQUIRED_TOO_FAST;
139 default:
140 if (info >= FINGERPRINT_ACQUIRED_VENDOR_BASE) {
141 // vendor specific code.
142 *vendorCode = info - FINGERPRINT_ACQUIRED_VENDOR_BASE;
143 return FingerprintAcquiredInfo::ACQUIRED_VENDOR;
144 }
145 }
146 ALOGE("Unknown acquiredmsg from fingerprint vendor library");
147 return FingerprintAcquiredInfo::ACQUIRED_INSUFFICIENT;
148}
149
150Return<uint64_t> BiometricsFingerprint::setNotify(
Sasha Levitskiy52640ee2016-11-10 14:15:33 -0800151 const sp<IBiometricsFingerprintClientCallback>& clientCallback) {
Sasha Levitskiy965bd322016-10-21 10:55:25 -0700152 mClientCallback = clientCallback;
Jim Miller902de512016-12-15 19:42:19 -0800153 return reinterpret_cast<uint64_t>(mDevice);
Sasha Levitskiy965bd322016-10-21 10:55:25 -0700154}
155
156Return<uint64_t> BiometricsFingerprint::preEnroll() {
157 return mDevice->pre_enroll(mDevice);
158}
159
Sasha Levitskiy52640ee2016-11-10 14:15:33 -0800160Return<RequestStatus> BiometricsFingerprint::enroll(const hidl_array<uint8_t, 69>& hat,
161 uint32_t gid, uint32_t timeoutSec) {
Sasha Levitskiy965bd322016-10-21 10:55:25 -0700162 const hw_auth_token_t* authToken =
Sasha Levitskiy52640ee2016-11-10 14:15:33 -0800163 reinterpret_cast<const hw_auth_token_t*>(hat.data());
164 return ErrorFilter(mDevice->enroll(mDevice, authToken, gid, timeoutSec));
Sasha Levitskiy965bd322016-10-21 10:55:25 -0700165}
166
Sasha Levitskiy52640ee2016-11-10 14:15:33 -0800167Return<RequestStatus> BiometricsFingerprint::postEnroll() {
168 return ErrorFilter(mDevice->post_enroll(mDevice));
Sasha Levitskiy965bd322016-10-21 10:55:25 -0700169}
170
171Return<uint64_t> BiometricsFingerprint::getAuthenticatorId() {
172 return mDevice->get_authenticator_id(mDevice);
173}
174
Sasha Levitskiy52640ee2016-11-10 14:15:33 -0800175Return<RequestStatus> BiometricsFingerprint::cancel() {
176 return ErrorFilter(mDevice->cancel(mDevice));
Sasha Levitskiy965bd322016-10-21 10:55:25 -0700177}
178
Sasha Levitskiy52640ee2016-11-10 14:15:33 -0800179Return<RequestStatus> BiometricsFingerprint::enumerate() {
180 return ErrorFilter(mDevice->enumerate(mDevice));
Sasha Levitskiy965bd322016-10-21 10:55:25 -0700181}
182
Sasha Levitskiy52640ee2016-11-10 14:15:33 -0800183Return<RequestStatus> BiometricsFingerprint::remove(uint32_t gid, uint32_t fid) {
184 return ErrorFilter(mDevice->remove(mDevice, gid, fid));
Sasha Levitskiy965bd322016-10-21 10:55:25 -0700185}
186
Sasha Levitskiy52640ee2016-11-10 14:15:33 -0800187Return<RequestStatus> BiometricsFingerprint::setActiveGroup(uint32_t gid,
188 const hidl_string& storePath) {
Sasha Levitskiy965bd322016-10-21 10:55:25 -0700189 if (storePath.size() >= PATH_MAX || storePath.size() <= 0) {
190 ALOGE("Bad path length: %zd", storePath.size());
191 }
Sasha Levitskiy52640ee2016-11-10 14:15:33 -0800192 return ErrorFilter(mDevice->set_active_group(mDevice, gid,
193 storePath.c_str()));
Sasha Levitskiy965bd322016-10-21 10:55:25 -0700194}
195
Sasha Levitskiy52640ee2016-11-10 14:15:33 -0800196Return<RequestStatus> BiometricsFingerprint::authenticate(uint64_t operationId,
197 uint32_t gid) {
198 return ErrorFilter(mDevice->authenticate(mDevice, operationId, gid));
Sasha Levitskiy965bd322016-10-21 10:55:25 -0700199}
200
Jim Miller902de512016-12-15 19:42:19 -0800201IBiometricsFingerprint* BiometricsFingerprint::getInstance() {
Sasha Levitskiy965bd322016-10-21 10:55:25 -0700202 int err;
203 const hw_module_t *hw_mdl = NULL;
Sasha Levitskiy52640ee2016-11-10 14:15:33 -0800204 ALOGE("Opening fingerprint hal library...");
Sasha Levitskiy965bd322016-10-21 10:55:25 -0700205 if (0 != (err = hw_get_module(FINGERPRINT_HARDWARE_MODULE_ID, &hw_mdl))) {
206 ALOGE("Can't open fingerprint HW Module, error: %d", err);
207 return nullptr;
208 }
Jim Miller902de512016-12-15 19:42:19 -0800209
Sasha Levitskiy965bd322016-10-21 10:55:25 -0700210 if (hw_mdl == NULL) {
211 ALOGE("No valid fingerprint module");
212 return nullptr;
213 }
214
215 fingerprint_module_t const *module =
216 reinterpret_cast<const fingerprint_module_t*>(hw_mdl);
217 if (module->common.methods->open == NULL) {
218 ALOGE("No valid open method");
219 return nullptr;
220 }
221
222 hw_device_t *device = NULL;
223
224 if (0 != (err = module->common.methods->open(hw_mdl, NULL, &device))) {
225 ALOGE("Can't open fingerprint methods, error: %d", err);
226 return nullptr;
227 }
228
Jim Miller902de512016-12-15 19:42:19 -0800229 if (kVersion != device->version) {
230 ALOGE("Wrong fp version. Expected %d, got %d", kVersion, device->version);
231 return 0; // enforce this on new devices because of HIDL translation layer
232 }
233
Sasha Levitskiy52640ee2016-11-10 14:15:33 -0800234 fingerprint_device_t* fp_device =
235 reinterpret_cast<fingerprint_device_t*>(device);
236
237 if (0 != (err =
238 fp_device->set_notify(fp_device, BiometricsFingerprint::notify))) {
239 ALOGE("Can't register fingerprint module callback, error: %d", err);
240 return nullptr;
241 }
242
243 return new BiometricsFingerprint(fp_device);
Sasha Levitskiy965bd322016-10-21 10:55:25 -0700244}
245
Jim Miller7f7eb472017-01-18 21:03:45 -0800246void BiometricsFingerprint::notifyKeystore(const uint8_t *auth_token, const size_t auth_token_length) {
247 if (auth_token != nullptr && auth_token_length > 0) {
248 // TODO: cache service?
249 sp<IServiceManager> sm = android::defaultServiceManager();
Janis Danisevskisa47afa92017-01-20 13:50:10 +0000250 sp<::android::IBinder> binder = sm->getService(String16("android.security.keystore"));
Jim Miller7f7eb472017-01-18 21:03:45 -0800251 sp<IKeystoreService> service = interface_cast<IKeystoreService>(binder);
252 if (service != nullptr) {
Janis Danisevskisa47afa92017-01-20 13:50:10 +0000253 auto ret = service->addAuthToken(auth_token, auth_token_length);
254 if (!ret.isOk()) {
255 ALOGE("Failure sending auth token to KeyStore: %" PRId32, int32_t(ret));
Jim Miller7f7eb472017-01-18 21:03:45 -0800256 }
257 } else {
258 ALOGE("Unable to communicate with KeyStore");
259 }
260 }
261}
262
Sasha Levitskiy965bd322016-10-21 10:55:25 -0700263} // namespace implementation
264} // namespace V2_1
265} // namespace fingerprint
266} // namespace biometrics
267} // namespace hardware
268} // namespace android