From ee7e5ba6986f933b85c29e6cdb2c64ce4357bfbf Mon Sep 17 00:00:00 2001 From: Enginex0 Date: Tue, 19 May 2026 03:22:42 +0100 Subject: [PATCH] fix(interception): drop delete marker on key regen Regenerated keys were being filtered as deleted because the deletion marker in Keystore2Interceptor.deletedSoftwareKeys survived past the regen call. Clear the marker at both software and TEE generation paths so the next getKeyEntry returns the fresh key instead of NOT_FOUND. --- .../interception/keystore/Keystore2Interceptor.kt | 6 ++++++ .../keystore/shim/KeyMintSecurityLevelInterceptor.kt | 3 +++ 2 files changed, 9 insertions(+) diff --git a/app/src/main/java/org/matrix/TEESimulator/interception/keystore/Keystore2Interceptor.kt b/app/src/main/java/org/matrix/TEESimulator/interception/keystore/Keystore2Interceptor.kt index a8405c0..30a8b00 100644 --- a/app/src/main/java/org/matrix/TEESimulator/interception/keystore/Keystore2Interceptor.kt +++ b/app/src/main/java/org/matrix/TEESimulator/interception/keystore/Keystore2Interceptor.kt @@ -62,6 +62,12 @@ object Keystore2Interceptor : AbstractKeystoreInterceptor() { private val deletedSoftwareKeys: MutableSet = ConcurrentHashMap.newKeySet() private val userUpdatedKeys = ConcurrentHashMap.newKeySet() + fun forgetDeletedKey(keyId: KeyIdentifier) { + if (deletedSoftwareKeys.remove(keyId)) { + SystemLogger.debug("Cleared deletion marker for ${keyId.alias}") + } + } + override val serviceName = "android.system.keystore2.IKeystoreService/default" override val processName = "keystore2" override val injectionCommand = "exec ./inject `pidof keystore2` libTEESimulator.so entry" diff --git a/app/src/main/java/org/matrix/TEESimulator/interception/keystore/shim/KeyMintSecurityLevelInterceptor.kt b/app/src/main/java/org/matrix/TEESimulator/interception/keystore/shim/KeyMintSecurityLevelInterceptor.kt index 40243be..a1117f3 100644 --- a/app/src/main/java/org/matrix/TEESimulator/interception/keystore/shim/KeyMintSecurityLevelInterceptor.kt +++ b/app/src/main/java/org/matrix/TEESimulator/interception/keystore/shim/KeyMintSecurityLevelInterceptor.kt @@ -36,6 +36,7 @@ import org.matrix.TEESimulator.config.ConfigurationManager import org.matrix.TEESimulator.interception.core.BinderInterceptor import org.matrix.TEESimulator.interception.keystore.InterceptorUtils import org.matrix.TEESimulator.interception.keystore.KeyIdentifier +import org.matrix.TEESimulator.interception.keystore.Keystore2Interceptor import org.matrix.TEESimulator.logging.SystemLogger import org.matrix.TEESimulator.pki.CertGenConfig import org.matrix.TEESimulator.pki.CertificateGenerator @@ -562,6 +563,7 @@ class KeyMintSecurityLevelInterceptor( iSecurityLevel = original } generatedKeys[keyId] = GeneratedKeyInfo(null, secretKey, keyDescriptor.nspace, response, parsedParams) + Keystore2Interceptor.forgetDeletedKey(keyId) if (securityLevel == SecurityLevel.STRONGBOX) { val delayMs = STRONGBOX_KEYGEN_LATENCY_FLOOR_MS - (System.nanoTime() - genStartNanos) / 1_000_000 @@ -586,6 +588,7 @@ class KeyMintSecurityLevelInterceptor( val response = buildKeyEntryResponse(callingUid, keyData.second, parsedParams, keyDescriptor) generatedKeys[keyId] = GeneratedKeyInfo(keyData.first, null, keyDescriptor.nspace, response, parsedParams) + Keystore2Interceptor.forgetDeletedKey(keyId) if (isAttestKeyRequest) attestationKeys.add(keyId) if (SystemLogger.isDebugBuild) {