From 22a57205e93cf6b9f4d3278b3e38a2e95f4ae4b4 Mon Sep 17 00:00:00 2001 From: Kevin Chyn Date: Wed, 2 Dec 2020 17:39:53 -0800 Subject: [PATCH] Add example IBiometricsFingerprint@2.2 HAL The exisitng 2.1 default implementation assumes that the device has a pre-HIDL HAL. Keep this implementation intact for vendors with legacy implementations. This change adds a new example 2.2 HAL that does not assume the existance of a pre-HIDL HAL, which can be used by cuttlefish and CTS. Bug: 172957689 Test: make -j android.hardware.biometrics.fingerprint@2.2-service.example Test: atest CtsBiometricsTestCases Test: m vts -j && vts-tradefed run commandAndExit vts -m VtsHalBiometricsFingerprintV2_1Target Test: m vts -j && vts-tradefed run commandAndExit vts -m VtsHalBiometricsFingerprintV2_2Target Change-Id: I4d87028d70fdb5c03759080e53e69751cf5e4307 --- biometrics/fingerprint/2.1/default/README.md | 6 + biometrics/fingerprint/2.2/default/Android.bp | 22 ++++ .../2.2/default/BiometricsFingerprint.cpp | 114 ++++++++++++++++++ .../2.2/default/BiometricsFingerprint.h | 73 +++++++++++ ...ware.biometrics.fingerprint@2.2-service.rc | 4 + ...are.biometrics.fingerprint@2.2-service.xml | 27 +++++ .../fingerprint/2.2/default/service.cpp | 44 +++++++ 7 files changed, 290 insertions(+) create mode 100644 biometrics/fingerprint/2.1/default/README.md create mode 100644 biometrics/fingerprint/2.2/default/Android.bp create mode 100644 biometrics/fingerprint/2.2/default/BiometricsFingerprint.cpp create mode 100644 biometrics/fingerprint/2.2/default/BiometricsFingerprint.h create mode 100644 biometrics/fingerprint/2.2/default/android.hardware.biometrics.fingerprint@2.2-service.rc create mode 100644 biometrics/fingerprint/2.2/default/android.hardware.biometrics.fingerprint@2.2-service.xml create mode 100644 biometrics/fingerprint/2.2/default/service.cpp diff --git a/biometrics/fingerprint/2.1/default/README.md b/biometrics/fingerprint/2.1/default/README.md new file mode 100644 index 0000000000..c41664e0fc --- /dev/null +++ b/biometrics/fingerprint/2.1/default/README.md @@ -0,0 +1,6 @@ +## Default IBiometricsFingerprint@2.1 HAL ## +--- + +## Overview: ## + +Provides a default implementation that loads pre-HIDL HALs and exposes it to the framework. \ No newline at end of file diff --git a/biometrics/fingerprint/2.2/default/Android.bp b/biometrics/fingerprint/2.2/default/Android.bp new file mode 100644 index 0000000000..8931308936 --- /dev/null +++ b/biometrics/fingerprint/2.2/default/Android.bp @@ -0,0 +1,22 @@ +cc_binary { + name: "android.hardware.biometrics.fingerprint@2.2-service.example", + defaults: ["hidl_defaults"], + init_rc: ["android.hardware.biometrics.fingerprint@2.2-service.rc"], + vintf_fragments: ["android.hardware.biometrics.fingerprint@2.2-service.xml"], + vendor: true, + relative_install_path: "hw", + srcs: [ + "BiometricsFingerprint.cpp", + "service.cpp", + ], + + shared_libs: [ + "libcutils", + "liblog", + "libhidlbase", + "libhardware", + "libutils", + "android.hardware.biometrics.fingerprint@2.2", + ], + +} diff --git a/biometrics/fingerprint/2.2/default/BiometricsFingerprint.cpp b/biometrics/fingerprint/2.2/default/BiometricsFingerprint.cpp new file mode 100644 index 0000000000..b07a17ce07 --- /dev/null +++ b/biometrics/fingerprint/2.2/default/BiometricsFingerprint.cpp @@ -0,0 +1,114 @@ +/* + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#define LOG_TAG "android.hardware.biometrics.fingerprint@2.2-service" +#define LOG_VERBOSE "android.hardware.biometrics.fingerprint@2.2-service" + +#include + +#include +#include +#include +#include "BiometricsFingerprint.h" + +#include +#include +#include +#include + +namespace android { +namespace hardware { +namespace biometrics { +namespace fingerprint { +namespace V2_2 { +namespace implementation { + +using RequestStatus = android::hardware::biometrics::fingerprint::V2_1::RequestStatus; +using FingerprintError = android::hardware::biometrics::fingerprint::V2_1::FingerprintError; + +constexpr uint64_t kDeviceId = 1; + +BiometricsFingerprint::BiometricsFingerprint() { + +} + +BiometricsFingerprint::~BiometricsFingerprint() { + +} + +Return BiometricsFingerprint::setNotify( + const sp& clientCallback) { + mClientCallback = clientCallback; + return kDeviceId; +} + +Return BiometricsFingerprint::preEnroll() { + // On a real implementation, this must be generated and stored in the TEE or its equivalent. + return rand(); +} + +Return BiometricsFingerprint::enroll(const hidl_array& /* hat */, + uint32_t /* gid */, uint32_t /* timeoutSec */) { + // On a real implementation, the HAT must be checked in the TEE or its equivalent. + mClientCallback->onError(kDeviceId, FingerprintError::ERROR_UNABLE_TO_PROCESS, + 0 /* vendorCode */); + return RequestStatus::SYS_OK; +} + +Return BiometricsFingerprint::postEnroll() { + return RequestStatus::SYS_OK; +} + +Return BiometricsFingerprint::getAuthenticatorId() { + return 1; +} + +Return BiometricsFingerprint::cancel() { + mClientCallback->onError(kDeviceId, FingerprintError::ERROR_CANCELED, 0 /* vendorCode */); + return RequestStatus::SYS_OK; +} + +Return BiometricsFingerprint::enumerate() { + mClientCallback->onEnumerate(kDeviceId, 0 /* fingerId */, 0 /* groupId */, + 0 /* remaining */); + return RequestStatus::SYS_OK; +} + +Return BiometricsFingerprint::remove(uint32_t gid, uint32_t fid) { + mClientCallback->onRemoved(kDeviceId, fid, gid, 0 /* remaining */); + return RequestStatus::SYS_OK; +} + +Return BiometricsFingerprint::setActiveGroup(uint32_t /* gid */, + const hidl_string& storePath) { + // Return invalid for paths that the HAL is unable to write to. + std::string path = storePath.c_str(); + if (path.compare("") == 0 || path.compare("/") == 0) { + return RequestStatus::SYS_EINVAL; + } + return RequestStatus::SYS_OK; +} + +Return BiometricsFingerprint::authenticate(uint64_t /* operationId */, + uint32_t /* gid */) { + return RequestStatus::SYS_OK; +} + +} // namespace implementation +} // namespace V2_2 +} // namespace fingerprint +} // namespace biometrics +} // namespace hardware +} // namespace android diff --git a/biometrics/fingerprint/2.2/default/BiometricsFingerprint.h b/biometrics/fingerprint/2.2/default/BiometricsFingerprint.h new file mode 100644 index 0000000000..a6861b32ba --- /dev/null +++ b/biometrics/fingerprint/2.2/default/BiometricsFingerprint.h @@ -0,0 +1,73 @@ +/* + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef ANDROID_HARDWARE_BIOMETRICS_FINGERPRINT_V2_2_BIOMETRICSFINGERPRINT_H +#define ANDROID_HARDWARE_BIOMETRICS_FINGERPRINT_V2_2_BIOMETRICSFINGERPRINT_H + +#include +#include +#include +#include +#include +#include +#include + +namespace android { +namespace hardware { +namespace biometrics { +namespace fingerprint { +namespace V2_2 { +namespace implementation { + +using ::android::hardware::biometrics::fingerprint::V2_2::IBiometricsFingerprint; +using ::android::hardware::biometrics::fingerprint::V2_1::IBiometricsFingerprintClientCallback; +using ::android::hardware::biometrics::fingerprint::V2_1::RequestStatus; +using ::android::hardware::Return; +using ::android::hardware::Void; +using ::android::hardware::hidl_vec; +using ::android::hardware::hidl_string; +using ::android::sp; + +struct BiometricsFingerprint : public IBiometricsFingerprint { +public: + BiometricsFingerprint(); + ~BiometricsFingerprint(); + + // Methods from ::android::hardware::biometrics::fingerprint::V2_2::IBiometricsFingerprint follow. + Return setNotify(const sp& clientCallback) override; + Return preEnroll() override; + Return enroll(const hidl_array& hat, uint32_t gid, uint32_t timeoutSec) override; + Return postEnroll() override; + Return getAuthenticatorId() override; + Return cancel() override; + Return enumerate() override; + Return remove(uint32_t gid, uint32_t fid) override; + Return setActiveGroup(uint32_t gid, const hidl_string& storePath) override; + Return authenticate(uint64_t operationId, uint32_t gid) override; + +private: + sp mClientCallback; + +}; + +} // namespace implementation +} // namespace V2_2 +} // namespace fingerprint +} // namespace biometrics +} // namespace hardware +} // namespace android + +#endif // ANDROID_HARDWARE_BIOMETRICS_FINGERPRINT_V2_2_BIOMETRICSFINGERPRINT_H diff --git a/biometrics/fingerprint/2.2/default/android.hardware.biometrics.fingerprint@2.2-service.rc b/biometrics/fingerprint/2.2/default/android.hardware.biometrics.fingerprint@2.2-service.rc new file mode 100644 index 0000000000..1b406b08d0 --- /dev/null +++ b/biometrics/fingerprint/2.2/default/android.hardware.biometrics.fingerprint@2.2-service.rc @@ -0,0 +1,4 @@ +service vendor.fps_hal /vendor/bin/hw/android.hardware.biometrics.fingerprint@2.2-service.example + class hal + user nobody + group nobody diff --git a/biometrics/fingerprint/2.2/default/android.hardware.biometrics.fingerprint@2.2-service.xml b/biometrics/fingerprint/2.2/default/android.hardware.biometrics.fingerprint@2.2-service.xml new file mode 100644 index 0000000000..5e69a1ee5d --- /dev/null +++ b/biometrics/fingerprint/2.2/default/android.hardware.biometrics.fingerprint@2.2-service.xml @@ -0,0 +1,27 @@ + + + + + android.hardware.biometrics.fingerprint + hwbinder + 2.2 + + IBiometricsFingerprint + default + + + diff --git a/biometrics/fingerprint/2.2/default/service.cpp b/biometrics/fingerprint/2.2/default/service.cpp new file mode 100644 index 0000000000..5bc69a0719 --- /dev/null +++ b/biometrics/fingerprint/2.2/default/service.cpp @@ -0,0 +1,44 @@ +/* + * Copyright (C) 2020 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#define LOG_TAG "android.hardware.biometrics.fingerprint@2.2-service" + +#include +#include +#include +#include +#include +#include "BiometricsFingerprint.h" + +using android::hardware::biometrics::fingerprint::V2_2::IBiometricsFingerprint; +using android::hardware::biometrics::fingerprint::V2_2::implementation::BiometricsFingerprint; +using android::hardware::configureRpcThreadpool; +using android::hardware::joinRpcThreadpool; +using android::sp; + +int main() { + android::sp bio = new BiometricsFingerprint(); + + configureRpcThreadpool(1, true /*callerWillJoin*/); + + if (::android::OK != bio->registerAsService()) { + return 1; + } + + joinRpcThreadpool(); + + return 0; // should never get here +}