From 437516ea3a4f8484dba96594ba1161d8ff804b91 Mon Sep 17 00:00:00 2001 From: Jeff Pu Date: Wed, 28 Jun 2023 15:21:21 +0000 Subject: [PATCH] Inform framework of lockout right when the failed attempts reaches threshold Bug: b/277780293 Test: atest FakeLockoutTrackerTest Change-Id: Iefe88f3ab492773844b18c525ddbf37218227256 --- .../aidl/default/FakeFingerprintEngine.cpp | 26 ++++++++++++------- .../aidl/default/FakeLockoutTracker.cpp | 8 ++++-- .../default/include/FakeFingerprintEngine.h | 1 + .../tests/FakeFingerprintEngineTest.cpp | 4 +-- .../default/tests/FakeLockoutTrackerTest.cpp | 4 +-- 5 files changed, 26 insertions(+), 17 deletions(-) diff --git a/biometrics/fingerprint/aidl/default/FakeFingerprintEngine.cpp b/biometrics/fingerprint/aidl/default/FakeFingerprintEngine.cpp index b496a6abbe..5f5455af61 100644 --- a/biometrics/fingerprint/aidl/default/FakeFingerprintEngine.cpp +++ b/biometrics/fingerprint/aidl/default/FakeFingerprintEngine.cpp @@ -195,16 +195,7 @@ void FakeFingerprintEngine::onAuthenticateFingerDown(ISessionCallback* cb, } // got lockout? - FakeLockoutTracker::LockoutMode lockoutMode = mLockoutTracker.getMode(); - if (lockoutMode == FakeLockoutTracker::LockoutMode::kPermanent) { - LOG(ERROR) << "Fail: lockout permanent"; - cb->onLockoutPermanent(); - return; - } else if (lockoutMode == FakeLockoutTracker::LockoutMode::kTimed) { - int64_t timeLeft = mLockoutTracker.getLockoutTimeLeft(); - LOG(ERROR) << "Fail: lockout timed " << timeLeft; - cb->onLockoutTimed(timeLeft); - } + if (checkSensorLockout(cb)) return; int i = 0; do { @@ -256,6 +247,7 @@ void FakeFingerprintEngine::onAuthenticateFingerDown(ISessionCallback* cb, LOG(ERROR) << "Fail: fingerprint not enrolled"; cb->onAuthenticationFailed(); mLockoutTracker.addFailedAttempt(); + checkSensorLockout(cb); } } @@ -563,4 +555,18 @@ int32_t FakeFingerprintEngine::getRandomInRange(int32_t bound1, int32_t bound2) return dist(mRandom); } +bool FakeFingerprintEngine::checkSensorLockout(ISessionCallback* cb) { + FakeLockoutTracker::LockoutMode lockoutMode = mLockoutTracker.getMode(); + if (lockoutMode == FakeLockoutTracker::LockoutMode::kPermanent) { + LOG(ERROR) << "Fail: lockout permanent"; + cb->onLockoutPermanent(); + return true; + } else if (lockoutMode == FakeLockoutTracker::LockoutMode::kTimed) { + int64_t timeLeft = mLockoutTracker.getLockoutTimeLeft(); + LOG(ERROR) << "Fail: lockout timed " << timeLeft; + cb->onLockoutTimed(timeLeft); + return true; + } + return false; +} } // namespace aidl::android::hardware::biometrics::fingerprint diff --git a/biometrics/fingerprint/aidl/default/FakeLockoutTracker.cpp b/biometrics/fingerprint/aidl/default/FakeLockoutTracker.cpp index 5996406fd0..b0163ee246 100644 --- a/biometrics/fingerprint/aidl/default/FakeLockoutTracker.cpp +++ b/biometrics/fingerprint/aidl/default/FakeLockoutTracker.cpp @@ -67,9 +67,13 @@ int64_t FakeLockoutTracker::getLockoutTimeLeft() { int64_t res = 0; if (mLockoutTimedStart > 0) { + int32_t lockoutTimedDuration = + FingerprintHalProperties::lockout_timed_duration().value_or(10 * 100); auto now = Util::getSystemNanoTime(); - auto left = now - mLockoutTimedStart; - res = (left > 0) ? (left / 1000000LL) : 0; + auto elapsed = (now - mLockoutTimedStart) / 1000000LL; + res = lockoutTimedDuration - elapsed; + LOG(INFO) << "xxxxxx: elapsed=" << elapsed << " now = " << now + << " mLockoutTimedStart=" << mLockoutTimedStart << " res=" << res; } return res; diff --git a/biometrics/fingerprint/aidl/default/include/FakeFingerprintEngine.h b/biometrics/fingerprint/aidl/default/include/FakeFingerprintEngine.h index f9d02a72fa..8ac7a955e4 100644 --- a/biometrics/fingerprint/aidl/default/include/FakeFingerprintEngine.h +++ b/biometrics/fingerprint/aidl/default/include/FakeFingerprintEngine.h @@ -113,6 +113,7 @@ class FakeFingerprintEngine { bool parseEnrollmentCaptureSingle(const std::string& str, std::vector>& res); int32_t getRandomInRange(int32_t bound1, int32_t bound2); + bool checkSensorLockout(ISessionCallback*); FakeLockoutTracker mLockoutTracker; }; diff --git a/biometrics/fingerprint/aidl/default/tests/FakeFingerprintEngineTest.cpp b/biometrics/fingerprint/aidl/default/tests/FakeFingerprintEngineTest.cpp index c34f5d7c15..86207a5c7d 100644 --- a/biometrics/fingerprint/aidl/default/tests/FakeFingerprintEngineTest.cpp +++ b/biometrics/fingerprint/aidl/default/tests/FakeFingerprintEngineTest.cpp @@ -375,9 +375,7 @@ TEST_F(FakeFingerprintEngineTest, InteractionDetectAcquired) { TEST_F(FakeFingerprintEngineTest, EnumerateEnrolled) { FingerprintHalProperties::enrollments({2, 4, 8}); mEngine.enumerateEnrollmentsImpl(mCallback.get()); - ASSERT_EQ( - 4, - mCallback->mLastEnrollmentEnumerated.size()); // Due to workaround. TODO (b/243129174) + ASSERT_EQ(3, mCallback->mLastEnrollmentEnumerated.size()); for (auto id : FingerprintHalProperties::enrollments()) { ASSERT_TRUE(std::find(mCallback->mLastEnrollmentEnumerated.begin(), mCallback->mLastEnrollmentEnumerated.end(), diff --git a/biometrics/fingerprint/aidl/default/tests/FakeLockoutTrackerTest.cpp b/biometrics/fingerprint/aidl/default/tests/FakeLockoutTrackerTest.cpp index 1b071eecd2..93c6f844ed 100644 --- a/biometrics/fingerprint/aidl/default/tests/FakeLockoutTrackerTest.cpp +++ b/biometrics/fingerprint/aidl/default/tests/FakeLockoutTrackerTest.cpp @@ -65,11 +65,11 @@ TEST_F(FakeLockoutTrackerTest, addFailedAttemptLockoutTimed) { ASSERT_EQ(mLockoutTracker.getMode(), FakeLockoutTracker::LockoutMode::kTimed); // time left int N = 5; - int64_t prevTimeLeft = INT_MIN; + int64_t prevTimeLeft = INT_MAX; for (int i = 0; i < N; i++) { SLEEP_MS(LOCKOUT_TIMED_DURATION / N + 1); int64_t currTimeLeft = mLockoutTracker.getLockoutTimeLeft(); - ASSERT_TRUE(currTimeLeft > prevTimeLeft); + ASSERT_TRUE(currTimeLeft < prevTimeLeft); prevTimeLeft = currTimeLeft; } ASSERT_EQ(mLockoutTracker.getMode(), FakeLockoutTracker::LockoutMode::kNone);