From b00dade599e003c608b1f23caa47bb22ef89da7a Mon Sep 17 00:00:00 2001 From: Jeff Pu Date: Tue, 6 Aug 2024 10:59:21 -0400 Subject: [PATCH] Fix fingerprint vhal permanent lockout Separate timed lockout failure count from permanent one, so it can be reset independently Bug: 357671325 Test: atest android.hardware.biometrics.fingerprint.* -c Change-Id: I08a8283a8eb464201b0f06c9c9bb7ba7635a54ac --- .../fingerprint/aidl/default/FakeFingerprintEngine.cpp | 6 +++--- .../fingerprint/aidl/default/FakeLockoutTracker.cpp | 10 +++++++--- .../aidl/default/include/FakeFingerprintEngine.h | 2 +- .../aidl/default/include/FakeLockoutTracker.h | 5 +++-- .../aidl/default/tests/FakeLockoutTrackerTest.cpp | 2 +- 5 files changed, 15 insertions(+), 10 deletions(-) diff --git a/biometrics/fingerprint/aidl/default/FakeFingerprintEngine.cpp b/biometrics/fingerprint/aidl/default/FakeFingerprintEngine.cpp index 67eb8378cb..7a43d7b319 100644 --- a/biometrics/fingerprint/aidl/default/FakeFingerprintEngine.cpp +++ b/biometrics/fingerprint/aidl/default/FakeFingerprintEngine.cpp @@ -389,10 +389,10 @@ void FakeFingerprintEngine::resetLockoutImpl(ISessionCallback* cb, if (isLockoutTimerStarted) isLockoutTimerAborted = true; } -void FakeFingerprintEngine::clearLockout(ISessionCallback* cb) { +void FakeFingerprintEngine::clearLockout(ISessionCallback* cb, bool dueToTimeout) { Fingerprint::cfg().set("lockout", false); cb->onLockoutCleared(); - mLockoutTracker.reset(); + mLockoutTracker.reset(dueToTimeout); } ndk::ScopedAStatus FakeFingerprintEngine::onPointerDownImpl(int32_t /*pointerId*/, int32_t /*x*/, @@ -536,7 +536,7 @@ void FakeFingerprintEngine::startLockoutTimer(int64_t timeout, ISessionCallback* void FakeFingerprintEngine::lockoutTimerExpired(ISessionCallback* cb) { BEGIN_OP(0); if (!isLockoutTimerAborted) { - clearLockout(cb); + clearLockout(cb, true); } isLockoutTimerStarted = false; isLockoutTimerAborted = false; diff --git a/biometrics/fingerprint/aidl/default/FakeLockoutTracker.cpp b/biometrics/fingerprint/aidl/default/FakeLockoutTracker.cpp index a056db50d0..7d468452c3 100644 --- a/biometrics/fingerprint/aidl/default/FakeLockoutTracker.cpp +++ b/biometrics/fingerprint/aidl/default/FakeLockoutTracker.cpp @@ -23,8 +23,11 @@ using namespace ::android::fingerprint::virt; namespace aidl::android::hardware::biometrics::fingerprint { -void FakeLockoutTracker::reset() { - mFailedCount = 0; +void FakeLockoutTracker::reset(bool dueToTimeout) { + if (!dueToTimeout) { + mFailedCount = 0; + } + mFailedCountTimed = 0; mLockoutTimedStart = 0; mCurrentMode = LockoutMode::kNone; } @@ -33,6 +36,7 @@ void FakeLockoutTracker::addFailedAttempt() { bool enabled = Fingerprint::cfg().get("lockout_enable"); if (enabled) { mFailedCount++; + mFailedCountTimed++; int32_t lockoutTimedThreshold = Fingerprint::cfg().get("lockout_timed_threshold"); int32_t lockoutPermanetThreshold = @@ -40,7 +44,7 @@ void FakeLockoutTracker::addFailedAttempt() { if (mFailedCount >= lockoutPermanetThreshold) { mCurrentMode = LockoutMode::kPermanent; Fingerprint::cfg().set("lockout", true); - } else if (mFailedCount >= lockoutTimedThreshold) { + } else if (mFailedCountTimed >= lockoutTimedThreshold) { if (mCurrentMode == LockoutMode::kNone) { mCurrentMode = LockoutMode::kTimed; mLockoutTimedStart = Util::getSystemNanoTime(); diff --git a/biometrics/fingerprint/aidl/default/include/FakeFingerprintEngine.h b/biometrics/fingerprint/aidl/default/include/FakeFingerprintEngine.h index 0d5357529d..362d0df3c8 100644 --- a/biometrics/fingerprint/aidl/default/include/FakeFingerprintEngine.h +++ b/biometrics/fingerprint/aidl/default/include/FakeFingerprintEngine.h @@ -110,7 +110,7 @@ class FakeFingerprintEngine { std::pair convertError(int32_t code); int32_t getRandomInRange(int32_t bound1, int32_t bound2); bool checkSensorLockout(ISessionCallback*); - void clearLockout(ISessionCallback* cb); + void clearLockout(ISessionCallback* cb, bool dueToTimeout = false); void waitForFingerDown(ISessionCallback* cb, const std::future& cancel); FakeLockoutTracker mLockoutTracker; diff --git a/biometrics/fingerprint/aidl/default/include/FakeLockoutTracker.h b/biometrics/fingerprint/aidl/default/include/FakeLockoutTracker.h index a1b6128a9e..a7f2f8e294 100644 --- a/biometrics/fingerprint/aidl/default/include/FakeLockoutTracker.h +++ b/biometrics/fingerprint/aidl/default/include/FakeLockoutTracker.h @@ -24,12 +24,12 @@ namespace aidl::android::hardware::biometrics::fingerprint { class FakeLockoutTracker { public: - FakeLockoutTracker() : mFailedCount(0) {} + FakeLockoutTracker() : mFailedCount(0), mFailedCountTimed(0) {} ~FakeLockoutTracker() {} enum class LockoutMode : int8_t { kNone = 0, kTimed, kPermanent }; - void reset(); + void reset(bool dueToTimeout = false); LockoutMode getMode(); void addFailedAttempt(); int64_t getLockoutTimeLeft(); @@ -44,6 +44,7 @@ class FakeLockoutTracker { private: int32_t mFailedCount; + int32_t mFailedCountTimed; int64_t mLockoutTimedStart; LockoutMode mCurrentMode; }; diff --git a/biometrics/fingerprint/aidl/default/tests/FakeLockoutTrackerTest.cpp b/biometrics/fingerprint/aidl/default/tests/FakeLockoutTrackerTest.cpp index 3c12b6d97f..4c1277b5cb 100644 --- a/biometrics/fingerprint/aidl/default/tests/FakeLockoutTrackerTest.cpp +++ b/biometrics/fingerprint/aidl/default/tests/FakeLockoutTrackerTest.cpp @@ -75,7 +75,7 @@ TEST_F(FakeLockoutTrackerTest, addFailedAttemptLockoutTimed) { prevTimeLeft = currTimeLeft; } ASSERT_EQ(mLockoutTracker.getMode(), FakeLockoutTracker::LockoutMode::kNone); - mLockoutTracker.reset(); + mLockoutTracker.reset(true); } TEST_F(FakeLockoutTrackerTest, addFailedAttemptPermanent) {