1*4d7e907cSAndroid Build Coastguard Worker /* 2*4d7e907cSAndroid Build Coastguard Worker * Copyright (C) 2022 The Android Open Source Project 3*4d7e907cSAndroid Build Coastguard Worker * 4*4d7e907cSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*4d7e907cSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*4d7e907cSAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*4d7e907cSAndroid Build Coastguard Worker * 8*4d7e907cSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*4d7e907cSAndroid Build Coastguard Worker * 10*4d7e907cSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*4d7e907cSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*4d7e907cSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*4d7e907cSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*4d7e907cSAndroid Build Coastguard Worker * limitations under the License. 15*4d7e907cSAndroid Build Coastguard Worker */ 16*4d7e907cSAndroid Build Coastguard Worker 17*4d7e907cSAndroid Build Coastguard Worker #include "FakeLockoutTracker.h" 18*4d7e907cSAndroid Build Coastguard Worker #include <fingerprint.sysprop.h> 19*4d7e907cSAndroid Build Coastguard Worker #include "Fingerprint.h" 20*4d7e907cSAndroid Build Coastguard Worker #include "util/Util.h" 21*4d7e907cSAndroid Build Coastguard Worker 22*4d7e907cSAndroid Build Coastguard Worker using namespace ::android::fingerprint::virt; 23*4d7e907cSAndroid Build Coastguard Worker 24*4d7e907cSAndroid Build Coastguard Worker namespace aidl::android::hardware::biometrics::fingerprint { 25*4d7e907cSAndroid Build Coastguard Worker reset(bool dueToTimeout)26*4d7e907cSAndroid Build Coastguard Workervoid FakeLockoutTracker::reset(bool dueToTimeout) { 27*4d7e907cSAndroid Build Coastguard Worker if (!dueToTimeout) { 28*4d7e907cSAndroid Build Coastguard Worker mFailedCount = 0; 29*4d7e907cSAndroid Build Coastguard Worker } 30*4d7e907cSAndroid Build Coastguard Worker mFailedCountTimed = 0; 31*4d7e907cSAndroid Build Coastguard Worker mLockoutTimedStart = 0; 32*4d7e907cSAndroid Build Coastguard Worker mCurrentMode = LockoutMode::kNone; 33*4d7e907cSAndroid Build Coastguard Worker } 34*4d7e907cSAndroid Build Coastguard Worker addFailedAttempt()35*4d7e907cSAndroid Build Coastguard Workervoid FakeLockoutTracker::addFailedAttempt() { 36*4d7e907cSAndroid Build Coastguard Worker bool enabled = Fingerprint::cfg().get<bool>("lockout_enable"); 37*4d7e907cSAndroid Build Coastguard Worker if (enabled) { 38*4d7e907cSAndroid Build Coastguard Worker mFailedCount++; 39*4d7e907cSAndroid Build Coastguard Worker mFailedCountTimed++; 40*4d7e907cSAndroid Build Coastguard Worker int32_t lockoutTimedThreshold = 41*4d7e907cSAndroid Build Coastguard Worker Fingerprint::cfg().get<std::int32_t>("lockout_timed_threshold"); 42*4d7e907cSAndroid Build Coastguard Worker int32_t lockoutPermanetThreshold = 43*4d7e907cSAndroid Build Coastguard Worker Fingerprint::cfg().get<std::int32_t>("lockout_permanent_threshold"); 44*4d7e907cSAndroid Build Coastguard Worker if (mFailedCount >= lockoutPermanetThreshold) { 45*4d7e907cSAndroid Build Coastguard Worker mCurrentMode = LockoutMode::kPermanent; 46*4d7e907cSAndroid Build Coastguard Worker Fingerprint::cfg().set<bool>("lockout", true); 47*4d7e907cSAndroid Build Coastguard Worker } else if (mFailedCountTimed >= lockoutTimedThreshold) { 48*4d7e907cSAndroid Build Coastguard Worker if (mCurrentMode == LockoutMode::kNone) { 49*4d7e907cSAndroid Build Coastguard Worker mCurrentMode = LockoutMode::kTimed; 50*4d7e907cSAndroid Build Coastguard Worker mLockoutTimedStart = Util::getSystemNanoTime(); 51*4d7e907cSAndroid Build Coastguard Worker } 52*4d7e907cSAndroid Build Coastguard Worker } 53*4d7e907cSAndroid Build Coastguard Worker } else { 54*4d7e907cSAndroid Build Coastguard Worker reset(); 55*4d7e907cSAndroid Build Coastguard Worker } 56*4d7e907cSAndroid Build Coastguard Worker } 57*4d7e907cSAndroid Build Coastguard Worker getMode()58*4d7e907cSAndroid Build Coastguard WorkerFakeLockoutTracker::LockoutMode FakeLockoutTracker::getMode() { 59*4d7e907cSAndroid Build Coastguard Worker if (mCurrentMode == LockoutMode::kTimed) { 60*4d7e907cSAndroid Build Coastguard Worker int32_t lockoutTimedDuration = 61*4d7e907cSAndroid Build Coastguard Worker Fingerprint::cfg().get<std::int32_t>("lockout_timed_duration"); 62*4d7e907cSAndroid Build Coastguard Worker if (Util::hasElapsed(mLockoutTimedStart, lockoutTimedDuration)) { 63*4d7e907cSAndroid Build Coastguard Worker mCurrentMode = LockoutMode::kNone; 64*4d7e907cSAndroid Build Coastguard Worker mLockoutTimedStart = 0; 65*4d7e907cSAndroid Build Coastguard Worker } 66*4d7e907cSAndroid Build Coastguard Worker } 67*4d7e907cSAndroid Build Coastguard Worker 68*4d7e907cSAndroid Build Coastguard Worker return mCurrentMode; 69*4d7e907cSAndroid Build Coastguard Worker } 70*4d7e907cSAndroid Build Coastguard Worker getLockoutTimeLeft()71*4d7e907cSAndroid Build Coastguard Workerint64_t FakeLockoutTracker::getLockoutTimeLeft() { 72*4d7e907cSAndroid Build Coastguard Worker int64_t res = 0; 73*4d7e907cSAndroid Build Coastguard Worker 74*4d7e907cSAndroid Build Coastguard Worker if (mLockoutTimedStart > 0) { 75*4d7e907cSAndroid Build Coastguard Worker int32_t lockoutTimedDuration = 76*4d7e907cSAndroid Build Coastguard Worker Fingerprint::cfg().get<std::int32_t>("lockout_timed_duration"); 77*4d7e907cSAndroid Build Coastguard Worker auto now = Util::getSystemNanoTime(); 78*4d7e907cSAndroid Build Coastguard Worker auto elapsed = (now - mLockoutTimedStart) / 1000000LL; 79*4d7e907cSAndroid Build Coastguard Worker res = lockoutTimedDuration - elapsed; 80*4d7e907cSAndroid Build Coastguard Worker LOG(INFO) << "elapsed=" << elapsed << " now = " << now 81*4d7e907cSAndroid Build Coastguard Worker << " mLockoutTimedStart=" << mLockoutTimedStart << " res=" << res; 82*4d7e907cSAndroid Build Coastguard Worker } 83*4d7e907cSAndroid Build Coastguard Worker 84*4d7e907cSAndroid Build Coastguard Worker return res; 85*4d7e907cSAndroid Build Coastguard Worker } 86*4d7e907cSAndroid Build Coastguard Worker } // namespace aidl::android::hardware::biometrics::fingerprint 87