diff --git a/source/shared/sdk/shared/src/androidMain/kotlin/com/stytch/sdk/biometrics/BiometricsProvider.android.kt b/source/shared/sdk/shared/src/androidMain/kotlin/com/stytch/sdk/biometrics/BiometricsProvider.android.kt index ed40e048..43fa436e 100644 --- a/source/shared/sdk/shared/src/androidMain/kotlin/com/stytch/sdk/biometrics/BiometricsProvider.android.kt +++ b/source/shared/sdk/shared/src/androidMain/kotlin/com/stytch/sdk/biometrics/BiometricsProvider.android.kt @@ -2,8 +2,8 @@ package com.stytch.sdk.biometrics import android.os.Build import android.security.keystore.KeyGenParameterSpec -import android.security.keystore.KeyPermanentlyInvalidatedException import android.security.keystore.KeyProperties +import android.security.keystore.UserNotAuthenticatedException import androidx.biometric.BiometricManager import androidx.biometric.BiometricManager.Authenticators.BIOMETRIC_STRONG import androidx.biometric.BiometricManager.Authenticators.DEVICE_CREDENTIAL @@ -17,6 +17,7 @@ import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.suspendCancellableCoroutine import kotlinx.coroutines.withContext import java.security.InvalidAlgorithmParameterException +import java.security.InvalidKeyException import java.security.KeyStore import java.util.concurrent.Executors import javax.crypto.Cipher @@ -37,7 +38,10 @@ public actual class BiometricsProvider( var errorEncounteredWhenGeneratingKey = false try { ensureSecretKeyIsAvailable(allowedAuthenticators) - } catch (_: KeyPermanentlyInvalidatedException) { + } catch (_: UserNotAuthenticatedException) { + // This is a type of `InvalidKeyException`, but doesn't require the registration to be revoked, just for the user to re-auth + return BiometricsAvailability.UserAuthenticationRequired + } catch (_: InvalidKeyException) { removeRegistration() return BiometricsAvailability.RegistrationRevoked } catch (_: IllegalStateException) { diff --git a/source/shared/sdk/shared/src/commonMain/kotlin/com/stytch/sdk/biometrics/BiometricsAvailability.kt b/source/shared/sdk/shared/src/commonMain/kotlin/com/stytch/sdk/biometrics/BiometricsAvailability.kt index 08b3dd42..14e53dbf 100644 --- a/source/shared/sdk/shared/src/commonMain/kotlin/com/stytch/sdk/biometrics/BiometricsAvailability.kt +++ b/source/shared/sdk/shared/src/commonMain/kotlin/com/stytch/sdk/biometrics/BiometricsAvailability.kt @@ -12,6 +12,8 @@ public sealed class BiometricsAvailability { @Serializable public data object RegistrationRevoked : BiometricsAvailability() + @Serializable public data object UserAuthenticationRequired : BiometricsAvailability() + @Serializable public data class Unavailable( public val reason: String?, public val code: Int? = null,