@@ -5,13 +5,19 @@ import android.content.Context
55import android.os.Bundle
66import android.os.Handler
77import 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
913import android.view.LayoutInflater
1014import android.view.View
1115import android.view.ViewGroup
1216import androidx.annotation.LayoutRes
1317import 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
1521import androidx.core.os.CancellationSignal
1622import androidx.fragment.app.FragmentActivity
1723import 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}
0 commit comments