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
This commit is contained in:
Kevin Chyn
2020-12-02 17:39:53 -08:00
parent 09fc704624
commit 22a57205e9
7 changed files with 290 additions and 0 deletions

View File

@@ -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.

View File

@@ -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",
],
}

View File

@@ -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 <hardware/hw_auth_token.h>
#include <android/log.h>
#include <hardware/hardware.h>
#include <hardware/fingerprint.h>
#include "BiometricsFingerprint.h"
#include <inttypes.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
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<uint64_t> BiometricsFingerprint::setNotify(
const sp<IBiometricsFingerprintClientCallback>& clientCallback) {
mClientCallback = clientCallback;
return kDeviceId;
}
Return<uint64_t> BiometricsFingerprint::preEnroll() {
// On a real implementation, this must be generated and stored in the TEE or its equivalent.
return rand();
}
Return<RequestStatus> BiometricsFingerprint::enroll(const hidl_array<uint8_t, 69>& /* 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<RequestStatus> BiometricsFingerprint::postEnroll() {
return RequestStatus::SYS_OK;
}
Return<uint64_t> BiometricsFingerprint::getAuthenticatorId() {
return 1;
}
Return<RequestStatus> BiometricsFingerprint::cancel() {
mClientCallback->onError(kDeviceId, FingerprintError::ERROR_CANCELED, 0 /* vendorCode */);
return RequestStatus::SYS_OK;
}
Return<RequestStatus> BiometricsFingerprint::enumerate() {
mClientCallback->onEnumerate(kDeviceId, 0 /* fingerId */, 0 /* groupId */,
0 /* remaining */);
return RequestStatus::SYS_OK;
}
Return<RequestStatus> BiometricsFingerprint::remove(uint32_t gid, uint32_t fid) {
mClientCallback->onRemoved(kDeviceId, fid, gid, 0 /* remaining */);
return RequestStatus::SYS_OK;
}
Return<RequestStatus> 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<RequestStatus> 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

View File

@@ -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 <log/log.h>
#include <android/log.h>
#include <hardware/hardware.h>
#include <hardware/fingerprint.h>
#include <hidl/MQDescriptor.h>
#include <hidl/Status.h>
#include <android/hardware/biometrics/fingerprint/2.2/IBiometricsFingerprint.h>
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<uint64_t> setNotify(const sp<IBiometricsFingerprintClientCallback>& clientCallback) override;
Return<uint64_t> preEnroll() override;
Return<RequestStatus> enroll(const hidl_array<uint8_t, 69>& hat, uint32_t gid, uint32_t timeoutSec) override;
Return<RequestStatus> postEnroll() override;
Return<uint64_t> getAuthenticatorId() override;
Return<RequestStatus> cancel() override;
Return<RequestStatus> enumerate() override;
Return<RequestStatus> remove(uint32_t gid, uint32_t fid) override;
Return<RequestStatus> setActiveGroup(uint32_t gid, const hidl_string& storePath) override;
Return<RequestStatus> authenticate(uint64_t operationId, uint32_t gid) override;
private:
sp<IBiometricsFingerprintClientCallback> mClientCallback;
};
} // namespace implementation
} // namespace V2_2
} // namespace fingerprint
} // namespace biometrics
} // namespace hardware
} // namespace android
#endif // ANDROID_HARDWARE_BIOMETRICS_FINGERPRINT_V2_2_BIOMETRICSFINGERPRINT_H

View File

@@ -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

View File

@@ -0,0 +1,27 @@
<!--
~ 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.
-->
<manifest version="1.0" type="device">
<hal format="hidl">
<name>android.hardware.biometrics.fingerprint</name>
<transport>hwbinder</transport>
<version>2.2</version>
<interface>
<name>IBiometricsFingerprint</name>
<instance>default</instance>
</interface>
</hal>
</manifest>

View File

@@ -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 <android/log.h>
#include <hidl/HidlSupport.h>
#include <hidl/HidlTransportSupport.h>
#include <android/hardware/biometrics/fingerprint/2.2/IBiometricsFingerprint.h>
#include <android/hardware/biometrics/fingerprint/2.2/types.h>
#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<IBiometricsFingerprint> bio = new BiometricsFingerprint();
configureRpcThreadpool(1, true /*callerWillJoin*/);
if (::android::OK != bio->registerAsService()) {
return 1;
}
joinRpcThreadpool();
return 0; // should never get here
}