From 3ab4cb0a506015c6a170d2ec0da82f8017809410 Mon Sep 17 00:00:00 2001 From: Jordan Haven Date: Tue, 7 Apr 2026 11:57:50 -0400 Subject: [PATCH 1/2] Port biometric fix from stytch-android@0.65.0 --- .../stytch/sdk/biometrics/BiometricsProvider.android.kt | 7 ++++++- .../com/stytch/sdk/biometrics/BiometricsAvailability.kt | 2 ++ 2 files changed, 8 insertions(+), 1 deletion(-) 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..af3c7407 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 @@ -4,6 +4,7 @@ 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 +18,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 +39,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, From bb809d7d8cf14a1b1c47d1ec219afa1241a5fb4a Mon Sep 17 00:00:00 2001 From: Jordan Haven Date: Tue, 7 Apr 2026 12:08:25 -0400 Subject: [PATCH 2/2] Lint --- .../com/stytch/sdk/biometrics/BiometricsProvider.android.kt | 1 - 1 file changed, 1 deletion(-) 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 af3c7407..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,7 +2,6 @@ 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