Skip to content

Commit 46dc00d

Browse files
committed
Added function invalidateByFingerprintEnrollment()
1 parent 72a29c3 commit 46dc00d

File tree

3 files changed

+59
-7
lines changed

3 files changed

+59
-7
lines changed

fingerprint-auth/build.gradle

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,11 @@ plugins {
55
}
66

77
android {
8-
compileSdk 32
8+
compileSdk 33
99

1010
defaultConfig {
1111
minSdk 23
12-
targetSdk 32
12+
targetSdk 33
1313

1414
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
1515
consumerProguardFiles "consumer-rules.pro"
@@ -50,7 +50,7 @@ afterEvaluate {
5050

5151
groupId = 'com.github.pisalcoding'
5252
artifactId = 'android-fingerprint-auth'
53-
version = '1.0.0'
53+
version = '1.1.0'
5454
}
5555
}
5656
}

fingerprint-auth/src/main/java/me/pisal/fingerprint/auth/FingerprintAuth.kt

Lines changed: 52 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,19 @@ import android.content.Context
55
import android.os.Bundle
66
import android.os.Handler
77
import android.security.keystore.KeyGenParameterSpec
8-
import android.security.keystore.KeyProperties.*
8+
import android.security.keystore.KeyProperties.BLOCK_MODE_GCM
9+
import android.security.keystore.KeyProperties.ENCRYPTION_PADDING_NONE
10+
import android.security.keystore.KeyProperties.KEY_ALGORITHM_AES
11+
import android.security.keystore.KeyProperties.PURPOSE_DECRYPT
12+
import android.security.keystore.KeyProperties.PURPOSE_ENCRYPT
913
import android.view.LayoutInflater
1014
import android.view.View
1115
import android.view.ViewGroup
1216
import androidx.annotation.LayoutRes
1317
import androidx.core.hardware.fingerprint.FingerprintManagerCompat
14-
import androidx.core.hardware.fingerprint.FingerprintManagerCompat.*
18+
import androidx.core.hardware.fingerprint.FingerprintManagerCompat.AuthenticationCallback
19+
import androidx.core.hardware.fingerprint.FingerprintManagerCompat.AuthenticationResult
20+
import androidx.core.hardware.fingerprint.FingerprintManagerCompat.CryptoObject
1521
import androidx.core.os.CancellationSignal
1622
import androidx.fragment.app.FragmentActivity
1723
import com.google.android.material.bottomsheet.BottomSheetDialogFragment
@@ -37,7 +43,6 @@ class FingerprintAuth private constructor(private val mHostActivity: FragmentAct
3743
*/
3844
fun withDialogView(fragment: BaseFingerprintDialogFragment): FingerprintAuth {
3945
mDialogFragment = fragment
40-
mFingerprintManager = FingerprintManagerCompat.from(mHostActivity)
4146
return this
4247
}
4348

@@ -57,6 +62,24 @@ class FingerprintAuth private constructor(private val mHostActivity: FragmentAct
5762
validityDuration = duration
5863
}
5964

65+
/**
66+
* Sets whether this key should be invalidated on biometric enrollment.
67+
*
68+
* <p>By default, {@code invalidateKey} is {@code true}, so keys that are valid for
69+
* biometric authentication only are <em>irreversibly invalidated</em> when a new
70+
* biometric is enrolled, or when all existing biometrics are deleted. That may be
71+
* changed by calling this method with {@code invalidateKey} set to {@code false}.
72+
*
73+
* <p>Invalidating keys on enrollment of a new biometric or unenrollment of all biometrics
74+
* improves security by ensuring that an unauthorized person who obtains the password can't
75+
* gain the use of biometric-authenticated keys by enrolling their own biometric. However,
76+
* invalidating keys makes key-dependent operations impossible, requiring some fallback
77+
* procedure to authenticate the user and set up a new key.
78+
*/
79+
fun invalidateByFingerprintEnrollment(invalidateKey: Boolean) {
80+
invalidateByFingerprintEnrollment = invalidateKey
81+
}
82+
6083
/**
6184
* After fingerprint scan is successful, you can access [CredentialsKeeper] safely
6285
* and without SecurityExceptions
@@ -66,23 +89,45 @@ class FingerprintAuth private constructor(private val mHostActivity: FragmentAct
6689
return this
6790
}
6891

92+
/**
93+
* Error callback when the Fingerprint authentication fails.
94+
*/
6995
fun doOnFailure(block: BiometricFailureBlock): FingerprintAuth {
7096
mFailureBlock = block
7197
return this
7298
}
7399

100+
/**
101+
* Return whether the keyguard is secured by a PIN, pattern or password or a SIM card
102+
* is currently locked.
103+
* @return {@code true} if a PIN, pattern or password is set or a SIM card is locked.
104+
*/
74105
fun deviceHasSecureLock(): Boolean {
75106
return isKeyguardSecure(mHostActivity)
76107
}
77108

109+
/**
110+
* Determine if fingerprint hardware is present and functional.
111+
*
112+
* @return true if hardware is present and functional, false otherwise.
113+
*/
78114
fun deviceHasFingerprintSensor(): Boolean {
79115
return mFingerprintManager.isHardwareDetected
80116
}
81117

118+
/**
119+
* Determine if there is at least one fingerprint enrolled.
120+
*
121+
* @return true if at least one fingerprint is enrolled, false otherwise
122+
*/
82123
fun deviceHasFingerprintsEnrolled(): Boolean {
83124
return mFingerprintManager.hasEnrolledFingerprints()
84125
}
85126

127+
/**
128+
* @return true if the device has met all conditions to start using Fingerprint authentication.
129+
* { 1. deviceHasSecureLock(), 2. deviceHasFingerprintSensor(), 3. deviceHasFingerprintsEnrolled }
130+
*/
86131
fun isDeviceEligible(): Boolean {
87132
return deviceHasSecureLock() &&
88133
deviceHasFingerprintSensor() &&
@@ -234,10 +279,13 @@ class FingerprintAuth private constructor(private val mHostActivity: FragmentAct
234279
private const val DUMMY_KEY_ALIAS = "pZZA27l28r97"
235280

236281
fun from(hostActivity: FragmentActivity): FingerprintAuth {
237-
return FingerprintAuth(hostActivity)
282+
return FingerprintAuth(hostActivity).apply {
283+
this.mFingerprintManager = FingerprintManagerCompat.from(mHostActivity)
284+
}
238285
}
239286

240287
var validityDuration: Int = DEFAULT_VALIDITY_DURATION
288+
var invalidateByFingerprintEnrollment: Boolean = true
241289
var aesKeySize: Int = DEFAULT_AES_KEY_SIZE
242290
}
243291
}

fingerprint-auth/src/main/java/me/pisal/fingerprint/auth/credentialskeeper/CredentialsKeeper.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,10 @@ class CredentialsKeeper(private val context: Context) {
4646
setUserAuthenticationRequired(true)
4747
setKeySize(256)
4848

49+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
50+
setInvalidatedByBiometricEnrollment(FingerprintAuth.invalidateByFingerprintEnrollment)
51+
}
52+
4953
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
5054
setUserAuthenticationParameters(
5155
FingerprintAuth.validityDuration,

0 commit comments

Comments
 (0)