blob: eb28e4626a242db3a74910f8030005e4793a826a [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
28namespace android {
29namespace hardware {
30namespace biometrics {
31namespace fingerprint {
32namespace V2_1 {
33namespace implementation {
34
Jim Miller902de512016-12-15 19:42:19 -080035// Supported fingerprint HAL version
36static const uint16_t kVersion = HARDWARE_MODULE_API_VERSION(2, 1);
37
Sasha Levitskiy52640ee2016-11-10 14:15:33 -080038using RequestStatus =
39 android::hardware::biometrics::fingerprint::V2_1::RequestStatus;
40
Sasha Levitskiy965bd322016-10-21 10:55:25 -070041sp<IBiometricsFingerprintClientCallback>
42 BiometricsFingerprint::mClientCallback = nullptr;
43
Jim Miller902de512016-12-15 19:42:19 -080044// TODO: This is here because HAL 2.1 doesn't have a way to propagate a
45// unique token for its driver. Subsequent versions should send a unique
46// token for each call to notify(). This is fine as long as there's only
47// one fingerprint device on the platform.
48fingerprint_device_t *BiometricsFingerprint::sDevice = nullptr;
49
Sasha Levitskiy965bd322016-10-21 10:55:25 -070050BiometricsFingerprint::BiometricsFingerprint(fingerprint_device_t *device)
Jim Miller902de512016-12-15 19:42:19 -080051 : mDevice(device) {
52 sDevice = mDevice; // keep track of the most recent instance
53}
Sasha Levitskiy965bd322016-10-21 10:55:25 -070054
55BiometricsFingerprint::~BiometricsFingerprint() {
56 ALOG(LOG_VERBOSE, LOG_TAG, "nativeCloseHal()\n");
57 if (mDevice == NULL) {
58 ALOGE("No valid device");
59 return;
60 }
61 int err;
62 if (0 != (err = mDevice->common.close(
63 reinterpret_cast<hw_device_t*>(mDevice)))) {
64 ALOGE("Can't close fingerprint module, error: %d", err);
65 return;
66 }
67 mDevice = NULL;
68}
69
Sasha Levitskiy52640ee2016-11-10 14:15:33 -080070Return<RequestStatus> BiometricsFingerprint::ErrorFilter(int32_t error) {
71 switch(error) {
72 case 0: return RequestStatus::SYS_OK;
73 case -2: return RequestStatus::SYS_ENOENT;
74 case -4: return RequestStatus::SYS_EINTR;
75 case -5: return RequestStatus::SYS_EIO;
76 case -11: return RequestStatus::SYS_EAGAIN;
77 case -12: return RequestStatus::SYS_ENOMEM;
78 case -13: return RequestStatus::SYS_EACCES;
79 case -14: return RequestStatus::SYS_EFAULT;
80 case -16: return RequestStatus::SYS_EBUSY;
81 case -22: return RequestStatus::SYS_EINVAL;
82 case -28: return RequestStatus::SYS_ENOSPC;
83 case -110: return RequestStatus::SYS_ETIMEDOUT;
84 default:
85 ALOGE("An unknown error returned from fingerprint vendor library");
86 return RequestStatus::SYS_UNKNOWN;
87 }
88}
89
Jim Miller902de512016-12-15 19:42:19 -080090// Translate from errors returned by traditional HAL (see fingerprint.h) to
91// HIDL-compliant FingerprintError.
92FingerprintError BiometricsFingerprint::VendorErrorFilter(int32_t error,
93 int32_t* vendorCode) {
94 *vendorCode = 0;
95 switch(error) {
96 case FINGERPRINT_ERROR_HW_UNAVAILABLE:
97 return FingerprintError::ERROR_HW_UNAVAILABLE;
98 case FINGERPRINT_ERROR_UNABLE_TO_PROCESS:
99 return FingerprintError::ERROR_UNABLE_TO_PROCESS;
100 case FINGERPRINT_ERROR_TIMEOUT:
101 return FingerprintError::ERROR_TIMEOUT;
102 case FINGERPRINT_ERROR_NO_SPACE:
103 return FingerprintError::ERROR_NO_SPACE;
104 case FINGERPRINT_ERROR_CANCELED:
105 return FingerprintError::ERROR_CANCELED;
106 case FINGERPRINT_ERROR_UNABLE_TO_REMOVE:
107 return FingerprintError::ERROR_UNABLE_TO_REMOVE;
108 default:
109 if (error >= FINGERPRINT_ERROR_VENDOR_BASE) {
110 // vendor specific code.
111 *vendorCode = error - FINGERPRINT_ERROR_VENDOR_BASE;
112 return FingerprintError::ERROR_VENDOR;
113 }
114 }
115 ALOGE("Unknown error from fingerprint vendor library");
116 return FingerprintError::ERROR_UNABLE_TO_PROCESS;
117}
118
119// Translate acquired messages returned by traditional HAL (see fingerprint.h)
120// to HIDL-compliant FingerprintAcquiredInfo.
121FingerprintAcquiredInfo BiometricsFingerprint::VendorAcquiredFilter(
122 int32_t info, int32_t* vendorCode) {
123 *vendorCode = 0;
124 switch(info) {
125 case FINGERPRINT_ACQUIRED_GOOD:
126 return FingerprintAcquiredInfo::ACQUIRED_GOOD;
127 case FINGERPRINT_ACQUIRED_PARTIAL:
128 return FingerprintAcquiredInfo::ACQUIRED_PARTIAL;
129 case FINGERPRINT_ACQUIRED_INSUFFICIENT:
130 return FingerprintAcquiredInfo::ACQUIRED_INSUFFICIENT;
131 case FINGERPRINT_ACQUIRED_IMAGER_DIRTY:
132 return FingerprintAcquiredInfo::ACQUIRED_IMAGER_DIRTY;
133 case FINGERPRINT_ACQUIRED_TOO_SLOW:
134 return FingerprintAcquiredInfo::ACQUIRED_TOO_SLOW;
135 case FINGERPRINT_ACQUIRED_TOO_FAST:
136 return FingerprintAcquiredInfo::ACQUIRED_TOO_FAST;
137 default:
138 if (info >= FINGERPRINT_ACQUIRED_VENDOR_BASE) {
139 // vendor specific code.
140 *vendorCode = info - FINGERPRINT_ACQUIRED_VENDOR_BASE;
141 return FingerprintAcquiredInfo::ACQUIRED_VENDOR;
142 }
143 }
144 ALOGE("Unknown acquiredmsg from fingerprint vendor library");
145 return FingerprintAcquiredInfo::ACQUIRED_INSUFFICIENT;
146}
147
148Return<uint64_t> BiometricsFingerprint::setNotify(
Sasha Levitskiy52640ee2016-11-10 14:15:33 -0800149 const sp<IBiometricsFingerprintClientCallback>& clientCallback) {
Sasha Levitskiy965bd322016-10-21 10:55:25 -0700150 mClientCallback = clientCallback;
Jim Miller902de512016-12-15 19:42:19 -0800151 return reinterpret_cast<uint64_t>(mDevice);
Sasha Levitskiy965bd322016-10-21 10:55:25 -0700152}
153
154Return<uint64_t> BiometricsFingerprint::preEnroll() {
155 return mDevice->pre_enroll(mDevice);
156}
157
Sasha Levitskiy52640ee2016-11-10 14:15:33 -0800158Return<RequestStatus> BiometricsFingerprint::enroll(const hidl_array<uint8_t, 69>& hat,
159 uint32_t gid, uint32_t timeoutSec) {
Sasha Levitskiy965bd322016-10-21 10:55:25 -0700160 const hw_auth_token_t* authToken =
Sasha Levitskiy52640ee2016-11-10 14:15:33 -0800161 reinterpret_cast<const hw_auth_token_t*>(hat.data());
162 return ErrorFilter(mDevice->enroll(mDevice, authToken, gid, timeoutSec));
Sasha Levitskiy965bd322016-10-21 10:55:25 -0700163}
164
Sasha Levitskiy52640ee2016-11-10 14:15:33 -0800165Return<RequestStatus> BiometricsFingerprint::postEnroll() {
166 return ErrorFilter(mDevice->post_enroll(mDevice));
Sasha Levitskiy965bd322016-10-21 10:55:25 -0700167}
168
169Return<uint64_t> BiometricsFingerprint::getAuthenticatorId() {
170 return mDevice->get_authenticator_id(mDevice);
171}
172
Sasha Levitskiy52640ee2016-11-10 14:15:33 -0800173Return<RequestStatus> BiometricsFingerprint::cancel() {
174 return ErrorFilter(mDevice->cancel(mDevice));
Sasha Levitskiy965bd322016-10-21 10:55:25 -0700175}
176
Sasha Levitskiy52640ee2016-11-10 14:15:33 -0800177Return<RequestStatus> BiometricsFingerprint::enumerate() {
178 return ErrorFilter(mDevice->enumerate(mDevice));
Sasha Levitskiy965bd322016-10-21 10:55:25 -0700179}
180
Sasha Levitskiy52640ee2016-11-10 14:15:33 -0800181Return<RequestStatus> BiometricsFingerprint::remove(uint32_t gid, uint32_t fid) {
182 return ErrorFilter(mDevice->remove(mDevice, gid, fid));
Sasha Levitskiy965bd322016-10-21 10:55:25 -0700183}
184
Sasha Levitskiy52640ee2016-11-10 14:15:33 -0800185Return<RequestStatus> BiometricsFingerprint::setActiveGroup(uint32_t gid,
186 const hidl_string& storePath) {
Sasha Levitskiy965bd322016-10-21 10:55:25 -0700187 if (storePath.size() >= PATH_MAX || storePath.size() <= 0) {
188 ALOGE("Bad path length: %zd", storePath.size());
189 }
Sasha Levitskiy52640ee2016-11-10 14:15:33 -0800190 return ErrorFilter(mDevice->set_active_group(mDevice, gid,
191 storePath.c_str()));
Sasha Levitskiy965bd322016-10-21 10:55:25 -0700192}
193
Sasha Levitskiy52640ee2016-11-10 14:15:33 -0800194Return<RequestStatus> BiometricsFingerprint::authenticate(uint64_t operationId,
195 uint32_t gid) {
196 return ErrorFilter(mDevice->authenticate(mDevice, operationId, gid));
Sasha Levitskiy965bd322016-10-21 10:55:25 -0700197}
198
Jim Miller902de512016-12-15 19:42:19 -0800199IBiometricsFingerprint* BiometricsFingerprint::getInstance() {
Sasha Levitskiy965bd322016-10-21 10:55:25 -0700200 int err;
201 const hw_module_t *hw_mdl = NULL;
Sasha Levitskiy52640ee2016-11-10 14:15:33 -0800202 ALOGE("Opening fingerprint hal library...");
Sasha Levitskiy965bd322016-10-21 10:55:25 -0700203 if (0 != (err = hw_get_module(FINGERPRINT_HARDWARE_MODULE_ID, &hw_mdl))) {
204 ALOGE("Can't open fingerprint HW Module, error: %d", err);
205 return nullptr;
206 }
Jim Miller902de512016-12-15 19:42:19 -0800207
Sasha Levitskiy965bd322016-10-21 10:55:25 -0700208 if (hw_mdl == NULL) {
209 ALOGE("No valid fingerprint module");
210 return nullptr;
211 }
212
213 fingerprint_module_t const *module =
214 reinterpret_cast<const fingerprint_module_t*>(hw_mdl);
215 if (module->common.methods->open == NULL) {
216 ALOGE("No valid open method");
217 return nullptr;
218 }
219
220 hw_device_t *device = NULL;
221
222 if (0 != (err = module->common.methods->open(hw_mdl, NULL, &device))) {
223 ALOGE("Can't open fingerprint methods, error: %d", err);
224 return nullptr;
225 }
226
Jim Miller902de512016-12-15 19:42:19 -0800227 if (kVersion != device->version) {
228 ALOGE("Wrong fp version. Expected %d, got %d", kVersion, device->version);
229 return 0; // enforce this on new devices because of HIDL translation layer
230 }
231
Sasha Levitskiy52640ee2016-11-10 14:15:33 -0800232 fingerprint_device_t* fp_device =
233 reinterpret_cast<fingerprint_device_t*>(device);
234
235 if (0 != (err =
236 fp_device->set_notify(fp_device, BiometricsFingerprint::notify))) {
237 ALOGE("Can't register fingerprint module callback, error: %d", err);
238 return nullptr;
239 }
240
241 return new BiometricsFingerprint(fp_device);
Sasha Levitskiy965bd322016-10-21 10:55:25 -0700242}
243
Jim Miller7f7eb472017-01-18 21:03:45 -0800244void BiometricsFingerprint::notifyKeystore(const uint8_t *auth_token, const size_t auth_token_length) {
245 if (auth_token != nullptr && auth_token_length > 0) {
246 // TODO: cache service?
247 sp<IServiceManager> sm = android::defaultServiceManager();
248 sp<IBinder> binder = sm->getService(String16("android.security.keystore"));
249 sp<IKeystoreService> service = interface_cast<IKeystoreService>(binder);
250 if (service != nullptr) {
251 status_t ret = service->addAuthToken(auth_token, auth_token_length);
252 if (ret != ResponseCode::NO_ERROR) {
253 ALOGE("Falure sending auth token to KeyStore: %d", ret);
254 }
255 } else {
256 ALOGE("Unable to communicate with KeyStore");
257 }
258 }
259}
260
Sasha Levitskiy965bd322016-10-21 10:55:25 -0700261} // namespace implementation
262} // namespace V2_1
263} // namespace fingerprint
264} // namespace biometrics
265} // namespace hardware
266} // namespace android