--- id: "0157" title: "matrix-client-android E2EE rust-sdk: cross-signing, SAS, recovery" status: pending priority: critical created: 2026-05-24 related_flows: ["0011"] related_issues: ["0156", "0158"] dependencies: ["0156"] tags: [matrix, android, e2ee, rust-sdk, cross-signing, sas, security] --- ## Objetivo Encriptacion end-to-end con `matrix-rust-sdk` Kotlin bindings (mejor impl Olm/Megolm disponible). Cross-signing keys, SAS verification con emoji, recovery passphrase, key backup server-side. UI para verificar otros usuarios + manejar devices propios. ## Tareas 1. ViewModel: - `SecurityViewModel(matrixClient)`: - `bootstrapCrossSigning(passphrase)`. - `recoverFromPassphrase(passphrase)`. - `startVerification(userId, deviceId) -> VerificationSession`. - `verifyEmoji(sessionId, accepted)`. - `listOwnDevices() -> Flow>`. - `backupMegolmKeys()`. 2. Compose: - `OnboardingE2EEScreen` — wizard 3 pasos: generar passphrase, backup, verify primer device. - `SettingsSecurityScreen`: - Lista devices propios con badge verified/unverified. - Dialog SAS con emoji grid 7x1 cuando hay verificacion en curso. - Boton "Reset cross-signing" (destructive, requiere typing "RESET"). - Boton "Restore from passphrase". - `EventBubble` con icono shield (green/amber/red). - Banner room con "X devices not verified" si aplica. 3. Crypto store: - `matrix-rust-sdk` gestiona internamente. Solo asegurar que `applicationContext.filesDir` es persistente entre upgrades. - Backup local del store (export encriptado) antes de uninstall: feature opcional via "Export to file" en settings. 4. Tests: - Instrumented `BootstrapCrossSigningTest`. - Instrumented `VerificationSASTest` con mock peer. - Instrumented `RecoveryFromPassphraseTest`. - E2E manual con Element Web: enviar/recibir msg E2EE, verificar device cross-platform. ## Funciones del registry a crear - `matrix_e2ee_kotlin_infra` — wrapper rust-sdk encryption module. - `passphrase_derive_key_kotlin_core` — PBKDF2 wrapper. - `VerificationDialog_kotlin_ui` — Compose emoji grid SAS. - `OnboardingE2EEScreen_kotlin_ui` — wizard. - `SettingsSecurityScreen_kotlin_ui` — devices + verification UI. ## Acceptance - [ ] Bootstrap crea cross-signing keys + sube cifradas. - [ ] Msg enviado en room E2EE se descifra en Element Web + cliente PC Wails (y al reves). - [ ] SAS verification con emoji grid vs Element Web: ambos 7 emojis iguales, accept funciona. - [ ] Login device nuevo + restore passphrase recupera msgs historicos. - [ ] Device no verificado dispara shield amber en EventBubble. - [ ] Decryption failure muestra shield rojo + boton "Request key". ## Notas **Anti-criterios:** - NO marcar done si E2EE silent-falla (mensaje no descifrado pero sin warning visible). - NO marcar done si passphrase queda en plain text en disco. - NO marcar done si cross-signing no funciona contra cliente PC Wails (interop critica). **Decisiones:** - `matrix-rust-sdk` >> matrix-android-sdk2 (deprecated). Olm/Megolm en Rust = mejor perf + sin memory leaks. - Passphrase format igual que cliente PC (4 palabras Diceware o 12-byte base32). **Gotchas:** - Key rotation Megolm: rust-sdk lo gestiona, pero monitorizar logs en primera semana de uso real. - Olm sessions max: rust-sdk auto-rotate, no accion manual. - Devices nuevos sin passphrase: msgs pre-existentes NO se descifran. UI debe ser clara.