blob: 526d5797cc10971497f6f7d80c1e6552fad61206 [file] [log] [blame]
Ilya Matyukhina9a3c852020-08-18 03:09:41 -07001/*
2 * Copyright (C) 2020 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 */
16
17#pragma once
18
19#include <aidl/android/hardware/biometrics/fingerprint/BnSession.h>
20#include <aidl/android/hardware/biometrics/fingerprint/ISessionCallback.h>
21
Ilya Matyukhin48ff8962021-02-22 13:13:13 -080022#include "FakeFingerprintEngine.h"
Joshua McCloskeyc8c0bad2022-05-10 05:17:44 +000023#include "thread/WorkerThread.h"
Ilya Matyukhin48ff8962021-02-22 13:13:13 -080024
Ilya Matyukhina9a3c852020-08-18 03:09:41 -070025namespace aidl::android::hardware::biometrics::fingerprint {
26
Kevin Chyne33abd62020-09-18 10:31:50 -070027namespace common = aidl::android::hardware::biometrics::common;
28namespace keymaster = aidl::android::hardware::keymaster;
Ilya Matyukhina9a3c852020-08-18 03:09:41 -070029
Ilya Matyukhinaea213b2021-03-23 19:01:42 -070030enum class SessionState {
31 IDLING,
32 CLOSED,
33 GENERATING_CHALLENGE,
34 REVOKING_CHALLENGE,
35 ENROLLING,
36 AUTHENTICATING,
37 DETECTING_INTERACTION,
38 ENUMERATING_ENROLLMENTS,
39 REMOVING_ENROLLMENTS,
40 GETTING_AUTHENTICATOR_ID,
41 INVALIDATING_AUTHENTICATOR_ID,
42 RESETTING_LOCKOUT,
43};
44
Jeff Pu87e9f2b2023-05-03 17:59:21 +000045void onClientDeath(void* cookie);
46
Ilya Matyukhina9a3c852020-08-18 03:09:41 -070047class Session : public BnSession {
48 public:
Ilya Matyukhin48ff8962021-02-22 13:13:13 -080049 Session(int sensorId, int userId, std::shared_ptr<ISessionCallback> cb,
50 FakeFingerprintEngine* engine, WorkerThread* worker);
Ilya Matyukhina9a3c852020-08-18 03:09:41 -070051
Ilya Matyukhinaea213b2021-03-23 19:01:42 -070052 ndk::ScopedAStatus generateChallenge() override;
Ilya Matyukhin3d54f452020-10-15 17:32:09 -070053
Ilya Matyukhinaea213b2021-03-23 19:01:42 -070054 ndk::ScopedAStatus revokeChallenge(int64_t challenge) override;
Ilya Matyukhin3d54f452020-10-15 17:32:09 -070055
Ilya Matyukhinaea213b2021-03-23 19:01:42 -070056 ndk::ScopedAStatus enroll(const keymaster::HardwareAuthToken& hat,
Ilya Matyukhin124e70a2021-02-12 13:00:15 -080057 std::shared_ptr<common::ICancellationSignal>* out) override;
Ilya Matyukhina9a3c852020-08-18 03:09:41 -070058
Ilya Matyukhinaea213b2021-03-23 19:01:42 -070059 ndk::ScopedAStatus authenticate(int64_t operationId,
Ilya Matyukhin124e70a2021-02-12 13:00:15 -080060 std::shared_ptr<common::ICancellationSignal>* out) override;
Ilya Matyukhina9a3c852020-08-18 03:09:41 -070061
Ilya Matyukhin3d54f452020-10-15 17:32:09 -070062 ndk::ScopedAStatus detectInteraction(
Ilya Matyukhinaea213b2021-03-23 19:01:42 -070063 std::shared_ptr<common::ICancellationSignal>* out) override;
Ilya Matyukhina9a3c852020-08-18 03:09:41 -070064
Ilya Matyukhinaea213b2021-03-23 19:01:42 -070065 ndk::ScopedAStatus enumerateEnrollments() override;
Ilya Matyukhina9a3c852020-08-18 03:09:41 -070066
Ilya Matyukhinaea213b2021-03-23 19:01:42 -070067 ndk::ScopedAStatus removeEnrollments(const std::vector<int32_t>& enrollmentIds) override;
Ilya Matyukhina9a3c852020-08-18 03:09:41 -070068
Ilya Matyukhinaea213b2021-03-23 19:01:42 -070069 ndk::ScopedAStatus getAuthenticatorId() override;
Ilya Matyukhina9a3c852020-08-18 03:09:41 -070070
Ilya Matyukhinaea213b2021-03-23 19:01:42 -070071 ndk::ScopedAStatus invalidateAuthenticatorId() override;
Kevin Chyn6e862c32020-09-16 18:27:37 -070072
Ilya Matyukhinaea213b2021-03-23 19:01:42 -070073 ndk::ScopedAStatus resetLockout(const keymaster::HardwareAuthToken& hat) override;
Ilya Matyukhina9a3c852020-08-18 03:09:41 -070074
Ilya Matyukhinaea213b2021-03-23 19:01:42 -070075 ndk::ScopedAStatus close() override;
Ilya Matyukhin71005c52021-02-17 12:44:14 -080076
Ilya Matyukhina9a3c852020-08-18 03:09:41 -070077 ndk::ScopedAStatus onPointerDown(int32_t pointerId, int32_t x, int32_t y, float minor,
78 float major) override;
79
80 ndk::ScopedAStatus onPointerUp(int32_t pointerId) override;
81
82 ndk::ScopedAStatus onUiReady() override;
83
Joe Bolinger13cb0fb2021-12-03 12:45:48 -080084 ndk::ScopedAStatus authenticateWithContext(
85 int64_t operationId, const common::OperationContext& context,
86 std::shared_ptr<common::ICancellationSignal>* out) override;
87
88 ndk::ScopedAStatus enrollWithContext(
89 const keymaster::HardwareAuthToken& hat, const common::OperationContext& context,
90 std::shared_ptr<common::ICancellationSignal>* out) override;
91
92 ndk::ScopedAStatus detectInteractionWithContext(
93 const common::OperationContext& context,
94 std::shared_ptr<common::ICancellationSignal>* out) override;
95
96 ndk::ScopedAStatus onPointerDownWithContext(const PointerContext& context) override;
97
98 ndk::ScopedAStatus onPointerUpWithContext(const PointerContext& context) override;
99
Joe Bolinger25e98232022-01-24 18:56:23 +0000100 ndk::ScopedAStatus onContextChanged(const common::OperationContext& context) override;
101
Austin Delgado88ded642023-02-16 11:34:50 -0800102 ndk::ScopedAStatus onPointerCancelWithContext(const PointerContext& context) override;
103
104 ndk::ScopedAStatus setIgnoreDisplayTouches(bool shouldIgnore) override;
105
Jeff Pu87e9f2b2023-05-03 17:59:21 +0000106 binder_status_t linkToDeath(AIBinder* binder);
107
Ilya Matyukhin48ff8962021-02-22 13:13:13 -0800108 bool isClosed();
109
Ilya Matyukhina9a3c852020-08-18 03:09:41 -0700110 private:
Ilya Matyukhin48ff8962021-02-22 13:13:13 -0800111 // Crashes the HAL if it's not currently idling because that would be an invalid state machine
112 // transition. Otherwise, sets the scheduled state to the given state.
113 void scheduleStateOrCrash(SessionState state);
114
115 // Crashes the HAL if the provided state doesn't match the previously scheduled state.
116 // Otherwise, transitions into the provided state, clears the scheduled state, and notifies
117 // the client about the transition by calling ISessionCallback#onStateChanged.
Ilya Matyukhinaea213b2021-03-23 19:01:42 -0700118 void enterStateOrCrash(SessionState state);
Ilya Matyukhin48ff8962021-02-22 13:13:13 -0800119
120 // Sets the current state to SessionState::IDLING and notifies the client about the transition
121 // by calling ISessionCallback#onStateChanged.
Ilya Matyukhinaea213b2021-03-23 19:01:42 -0700122 void enterIdling();
Ilya Matyukhin48ff8962021-02-22 13:13:13 -0800123
f48dc9fc2021-03-10 04:40:58 +0000124 // The sensor and user IDs for which this session was created.
Ilya Matyukhin48ff8962021-02-22 13:13:13 -0800125 int32_t mSensorId;
126 int32_t mUserId;
f48dc9fc2021-03-10 04:40:58 +0000127
128 // Callback for talking to the framework. This callback must only be called from non-binder
129 // threads to prevent nested binder calls and consequently a binder thread exhaustion.
130 // Practically, it means that this callback should always be called from the worker thread.
Ilya Matyukhin124e70a2021-02-12 13:00:15 -0800131 std::shared_ptr<ISessionCallback> mCb;
f48dc9fc2021-03-10 04:40:58 +0000132
133 // Module that communicates to the actual fingerprint hardware, keystore, TEE, etc. In real
134 // life such modules typically consume a lot of memory and are slow to initialize. This is here
135 // to showcase how such a module can be used within a Session without incurring the high
136 // initialization costs every time a Session is constructed.
Ilya Matyukhin48ff8962021-02-22 13:13:13 -0800137 FakeFingerprintEngine* mEngine;
f48dc9fc2021-03-10 04:40:58 +0000138
139 // Worker thread that allows to schedule tasks for asynchronous execution.
Ilya Matyukhin48ff8962021-02-22 13:13:13 -0800140 WorkerThread* mWorker;
f48dc9fc2021-03-10 04:40:58 +0000141
142 // Simple representation of the session's state machine. These are atomic because they can be
143 // modified from both the main and the worker threads.
144 std::atomic<SessionState> mScheduledState;
145 std::atomic<SessionState> mCurrentState;
Jeff Pu87e9f2b2023-05-03 17:59:21 +0000146
147 // Binder death handler.
148 AIBinder_DeathRecipient* mDeathRecipient;
Ilya Matyukhina9a3c852020-08-18 03:09:41 -0700149};
150
151} // namespace aidl::android::hardware::biometrics::fingerprint