Ilya Matyukhin | a9a3c85 | 2020-08-18 03:09:41 -0700 | [diff] [blame] | 1 | /* |
| 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 Matyukhin | 48ff896 | 2021-02-22 13:13:13 -0800 | [diff] [blame] | 22 | #include "FakeFingerprintEngine.h" |
Joshua McCloskey | c8c0bad | 2022-05-10 05:17:44 +0000 | [diff] [blame] | 23 | #include "thread/WorkerThread.h" |
Ilya Matyukhin | 48ff896 | 2021-02-22 13:13:13 -0800 | [diff] [blame] | 24 | |
Ilya Matyukhin | a9a3c85 | 2020-08-18 03:09:41 -0700 | [diff] [blame] | 25 | namespace aidl::android::hardware::biometrics::fingerprint { |
| 26 | |
Kevin Chyn | e33abd6 | 2020-09-18 10:31:50 -0700 | [diff] [blame] | 27 | namespace common = aidl::android::hardware::biometrics::common; |
| 28 | namespace keymaster = aidl::android::hardware::keymaster; |
Ilya Matyukhin | a9a3c85 | 2020-08-18 03:09:41 -0700 | [diff] [blame] | 29 | |
Ilya Matyukhin | aea213b | 2021-03-23 19:01:42 -0700 | [diff] [blame] | 30 | enum 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 Pu | 87e9f2b | 2023-05-03 17:59:21 +0000 | [diff] [blame] | 45 | void onClientDeath(void* cookie); |
| 46 | |
Ilya Matyukhin | a9a3c85 | 2020-08-18 03:09:41 -0700 | [diff] [blame] | 47 | class Session : public BnSession { |
| 48 | public: |
Ilya Matyukhin | 48ff896 | 2021-02-22 13:13:13 -0800 | [diff] [blame] | 49 | Session(int sensorId, int userId, std::shared_ptr<ISessionCallback> cb, |
| 50 | FakeFingerprintEngine* engine, WorkerThread* worker); |
Ilya Matyukhin | a9a3c85 | 2020-08-18 03:09:41 -0700 | [diff] [blame] | 51 | |
Ilya Matyukhin | aea213b | 2021-03-23 19:01:42 -0700 | [diff] [blame] | 52 | ndk::ScopedAStatus generateChallenge() override; |
Ilya Matyukhin | 3d54f45 | 2020-10-15 17:32:09 -0700 | [diff] [blame] | 53 | |
Ilya Matyukhin | aea213b | 2021-03-23 19:01:42 -0700 | [diff] [blame] | 54 | ndk::ScopedAStatus revokeChallenge(int64_t challenge) override; |
Ilya Matyukhin | 3d54f45 | 2020-10-15 17:32:09 -0700 | [diff] [blame] | 55 | |
Ilya Matyukhin | aea213b | 2021-03-23 19:01:42 -0700 | [diff] [blame] | 56 | ndk::ScopedAStatus enroll(const keymaster::HardwareAuthToken& hat, |
Ilya Matyukhin | 124e70a | 2021-02-12 13:00:15 -0800 | [diff] [blame] | 57 | std::shared_ptr<common::ICancellationSignal>* out) override; |
Ilya Matyukhin | a9a3c85 | 2020-08-18 03:09:41 -0700 | [diff] [blame] | 58 | |
Ilya Matyukhin | aea213b | 2021-03-23 19:01:42 -0700 | [diff] [blame] | 59 | ndk::ScopedAStatus authenticate(int64_t operationId, |
Ilya Matyukhin | 124e70a | 2021-02-12 13:00:15 -0800 | [diff] [blame] | 60 | std::shared_ptr<common::ICancellationSignal>* out) override; |
Ilya Matyukhin | a9a3c85 | 2020-08-18 03:09:41 -0700 | [diff] [blame] | 61 | |
Ilya Matyukhin | 3d54f45 | 2020-10-15 17:32:09 -0700 | [diff] [blame] | 62 | ndk::ScopedAStatus detectInteraction( |
Ilya Matyukhin | aea213b | 2021-03-23 19:01:42 -0700 | [diff] [blame] | 63 | std::shared_ptr<common::ICancellationSignal>* out) override; |
Ilya Matyukhin | a9a3c85 | 2020-08-18 03:09:41 -0700 | [diff] [blame] | 64 | |
Ilya Matyukhin | aea213b | 2021-03-23 19:01:42 -0700 | [diff] [blame] | 65 | ndk::ScopedAStatus enumerateEnrollments() override; |
Ilya Matyukhin | a9a3c85 | 2020-08-18 03:09:41 -0700 | [diff] [blame] | 66 | |
Ilya Matyukhin | aea213b | 2021-03-23 19:01:42 -0700 | [diff] [blame] | 67 | ndk::ScopedAStatus removeEnrollments(const std::vector<int32_t>& enrollmentIds) override; |
Ilya Matyukhin | a9a3c85 | 2020-08-18 03:09:41 -0700 | [diff] [blame] | 68 | |
Ilya Matyukhin | aea213b | 2021-03-23 19:01:42 -0700 | [diff] [blame] | 69 | ndk::ScopedAStatus getAuthenticatorId() override; |
Ilya Matyukhin | a9a3c85 | 2020-08-18 03:09:41 -0700 | [diff] [blame] | 70 | |
Ilya Matyukhin | aea213b | 2021-03-23 19:01:42 -0700 | [diff] [blame] | 71 | ndk::ScopedAStatus invalidateAuthenticatorId() override; |
Kevin Chyn | 6e862c3 | 2020-09-16 18:27:37 -0700 | [diff] [blame] | 72 | |
Ilya Matyukhin | aea213b | 2021-03-23 19:01:42 -0700 | [diff] [blame] | 73 | ndk::ScopedAStatus resetLockout(const keymaster::HardwareAuthToken& hat) override; |
Ilya Matyukhin | a9a3c85 | 2020-08-18 03:09:41 -0700 | [diff] [blame] | 74 | |
Ilya Matyukhin | aea213b | 2021-03-23 19:01:42 -0700 | [diff] [blame] | 75 | ndk::ScopedAStatus close() override; |
Ilya Matyukhin | 71005c5 | 2021-02-17 12:44:14 -0800 | [diff] [blame] | 76 | |
Ilya Matyukhin | a9a3c85 | 2020-08-18 03:09:41 -0700 | [diff] [blame] | 77 | 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 Bolinger | 13cb0fb | 2021-12-03 12:45:48 -0800 | [diff] [blame] | 84 | 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 Bolinger | 25e9823 | 2022-01-24 18:56:23 +0000 | [diff] [blame] | 100 | ndk::ScopedAStatus onContextChanged(const common::OperationContext& context) override; |
| 101 | |
Austin Delgado | 88ded64 | 2023-02-16 11:34:50 -0800 | [diff] [blame] | 102 | ndk::ScopedAStatus onPointerCancelWithContext(const PointerContext& context) override; |
| 103 | |
| 104 | ndk::ScopedAStatus setIgnoreDisplayTouches(bool shouldIgnore) override; |
| 105 | |
Jeff Pu | 87e9f2b | 2023-05-03 17:59:21 +0000 | [diff] [blame] | 106 | binder_status_t linkToDeath(AIBinder* binder); |
| 107 | |
Ilya Matyukhin | 48ff896 | 2021-02-22 13:13:13 -0800 | [diff] [blame] | 108 | bool isClosed(); |
| 109 | |
Ilya Matyukhin | a9a3c85 | 2020-08-18 03:09:41 -0700 | [diff] [blame] | 110 | private: |
Ilya Matyukhin | 48ff896 | 2021-02-22 13:13:13 -0800 | [diff] [blame] | 111 | // 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 Matyukhin | aea213b | 2021-03-23 19:01:42 -0700 | [diff] [blame] | 118 | void enterStateOrCrash(SessionState state); |
Ilya Matyukhin | 48ff896 | 2021-02-22 13:13:13 -0800 | [diff] [blame] | 119 | |
| 120 | // Sets the current state to SessionState::IDLING and notifies the client about the transition |
| 121 | // by calling ISessionCallback#onStateChanged. |
Ilya Matyukhin | aea213b | 2021-03-23 19:01:42 -0700 | [diff] [blame] | 122 | void enterIdling(); |
Ilya Matyukhin | 48ff896 | 2021-02-22 13:13:13 -0800 | [diff] [blame] | 123 | |
f | 48dc9fc | 2021-03-10 04:40:58 +0000 | [diff] [blame] | 124 | // The sensor and user IDs for which this session was created. |
Ilya Matyukhin | 48ff896 | 2021-02-22 13:13:13 -0800 | [diff] [blame] | 125 | int32_t mSensorId; |
| 126 | int32_t mUserId; |
f | 48dc9fc | 2021-03-10 04:40:58 +0000 | [diff] [blame] | 127 | |
| 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 Matyukhin | 124e70a | 2021-02-12 13:00:15 -0800 | [diff] [blame] | 131 | std::shared_ptr<ISessionCallback> mCb; |
f | 48dc9fc | 2021-03-10 04:40:58 +0000 | [diff] [blame] | 132 | |
| 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 Matyukhin | 48ff896 | 2021-02-22 13:13:13 -0800 | [diff] [blame] | 137 | FakeFingerprintEngine* mEngine; |
f | 48dc9fc | 2021-03-10 04:40:58 +0000 | [diff] [blame] | 138 | |
| 139 | // Worker thread that allows to schedule tasks for asynchronous execution. |
Ilya Matyukhin | 48ff896 | 2021-02-22 13:13:13 -0800 | [diff] [blame] | 140 | WorkerThread* mWorker; |
f | 48dc9fc | 2021-03-10 04:40:58 +0000 | [diff] [blame] | 141 | |
| 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 Pu | 87e9f2b | 2023-05-03 17:59:21 +0000 | [diff] [blame] | 146 | |
| 147 | // Binder death handler. |
| 148 | AIBinder_DeathRecipient* mDeathRecipient; |
Ilya Matyukhin | a9a3c85 | 2020-08-18 03:09:41 -0700 | [diff] [blame] | 149 | }; |
| 150 | |
| 151 | } // namespace aidl::android::hardware::biometrics::fingerprint |