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
This commit is contained in:
Jeff Pu
2024-08-06 10:59:21 -04:00
parent 68f5aa2ee4
commit b00dade599
5 changed files with 15 additions and 10 deletions

View File

@@ -389,10 +389,10 @@ void FakeFingerprintEngine::resetLockoutImpl(ISessionCallback* cb,
if (isLockoutTimerStarted) isLockoutTimerAborted = true; if (isLockoutTimerStarted) isLockoutTimerAborted = true;
} }
void FakeFingerprintEngine::clearLockout(ISessionCallback* cb) { void FakeFingerprintEngine::clearLockout(ISessionCallback* cb, bool dueToTimeout) {
Fingerprint::cfg().set<bool>("lockout", false); Fingerprint::cfg().set<bool>("lockout", false);
cb->onLockoutCleared(); cb->onLockoutCleared();
mLockoutTracker.reset(); mLockoutTracker.reset(dueToTimeout);
} }
ndk::ScopedAStatus FakeFingerprintEngine::onPointerDownImpl(int32_t /*pointerId*/, int32_t /*x*/, 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) { void FakeFingerprintEngine::lockoutTimerExpired(ISessionCallback* cb) {
BEGIN_OP(0); BEGIN_OP(0);
if (!isLockoutTimerAborted) { if (!isLockoutTimerAborted) {
clearLockout(cb); clearLockout(cb, true);
} }
isLockoutTimerStarted = false; isLockoutTimerStarted = false;
isLockoutTimerAborted = false; isLockoutTimerAborted = false;

View File

@@ -23,8 +23,11 @@ using namespace ::android::fingerprint::virt;
namespace aidl::android::hardware::biometrics::fingerprint { namespace aidl::android::hardware::biometrics::fingerprint {
void FakeLockoutTracker::reset() { void FakeLockoutTracker::reset(bool dueToTimeout) {
mFailedCount = 0; if (!dueToTimeout) {
mFailedCount = 0;
}
mFailedCountTimed = 0;
mLockoutTimedStart = 0; mLockoutTimedStart = 0;
mCurrentMode = LockoutMode::kNone; mCurrentMode = LockoutMode::kNone;
} }
@@ -33,6 +36,7 @@ void FakeLockoutTracker::addFailedAttempt() {
bool enabled = Fingerprint::cfg().get<bool>("lockout_enable"); bool enabled = Fingerprint::cfg().get<bool>("lockout_enable");
if (enabled) { if (enabled) {
mFailedCount++; mFailedCount++;
mFailedCountTimed++;
int32_t lockoutTimedThreshold = int32_t lockoutTimedThreshold =
Fingerprint::cfg().get<std::int32_t>("lockout_timed_threshold"); Fingerprint::cfg().get<std::int32_t>("lockout_timed_threshold");
int32_t lockoutPermanetThreshold = int32_t lockoutPermanetThreshold =
@@ -40,7 +44,7 @@ void FakeLockoutTracker::addFailedAttempt() {
if (mFailedCount >= lockoutPermanetThreshold) { if (mFailedCount >= lockoutPermanetThreshold) {
mCurrentMode = LockoutMode::kPermanent; mCurrentMode = LockoutMode::kPermanent;
Fingerprint::cfg().set<bool>("lockout", true); Fingerprint::cfg().set<bool>("lockout", true);
} else if (mFailedCount >= lockoutTimedThreshold) { } else if (mFailedCountTimed >= lockoutTimedThreshold) {
if (mCurrentMode == LockoutMode::kNone) { if (mCurrentMode == LockoutMode::kNone) {
mCurrentMode = LockoutMode::kTimed; mCurrentMode = LockoutMode::kTimed;
mLockoutTimedStart = Util::getSystemNanoTime(); mLockoutTimedStart = Util::getSystemNanoTime();

View File

@@ -110,7 +110,7 @@ class FakeFingerprintEngine {
std::pair<Error, int32_t> convertError(int32_t code); std::pair<Error, int32_t> convertError(int32_t code);
int32_t getRandomInRange(int32_t bound1, int32_t bound2); int32_t getRandomInRange(int32_t bound1, int32_t bound2);
bool checkSensorLockout(ISessionCallback*); bool checkSensorLockout(ISessionCallback*);
void clearLockout(ISessionCallback* cb); void clearLockout(ISessionCallback* cb, bool dueToTimeout = false);
void waitForFingerDown(ISessionCallback* cb, const std::future<void>& cancel); void waitForFingerDown(ISessionCallback* cb, const std::future<void>& cancel);
FakeLockoutTracker mLockoutTracker; FakeLockoutTracker mLockoutTracker;

View File

@@ -24,12 +24,12 @@ namespace aidl::android::hardware::biometrics::fingerprint {
class FakeLockoutTracker { class FakeLockoutTracker {
public: public:
FakeLockoutTracker() : mFailedCount(0) {} FakeLockoutTracker() : mFailedCount(0), mFailedCountTimed(0) {}
~FakeLockoutTracker() {} ~FakeLockoutTracker() {}
enum class LockoutMode : int8_t { kNone = 0, kTimed, kPermanent }; enum class LockoutMode : int8_t { kNone = 0, kTimed, kPermanent };
void reset(); void reset(bool dueToTimeout = false);
LockoutMode getMode(); LockoutMode getMode();
void addFailedAttempt(); void addFailedAttempt();
int64_t getLockoutTimeLeft(); int64_t getLockoutTimeLeft();
@@ -44,6 +44,7 @@ class FakeLockoutTracker {
private: private:
int32_t mFailedCount; int32_t mFailedCount;
int32_t mFailedCountTimed;
int64_t mLockoutTimedStart; int64_t mLockoutTimedStart;
LockoutMode mCurrentMode; LockoutMode mCurrentMode;
}; };

View File

@@ -75,7 +75,7 @@ TEST_F(FakeLockoutTrackerTest, addFailedAttemptLockoutTimed) {
prevTimeLeft = currTimeLeft; prevTimeLeft = currTimeLeft;
} }
ASSERT_EQ(mLockoutTracker.getMode(), FakeLockoutTracker::LockoutMode::kNone); ASSERT_EQ(mLockoutTracker.getMode(), FakeLockoutTracker::LockoutMode::kNone);
mLockoutTracker.reset(); mLockoutTracker.reset(true);
} }
TEST_F(FakeLockoutTrackerTest, addFailedAttemptPermanent) { TEST_F(FakeLockoutTrackerTest, addFailedAttemptPermanent) {