---
id: "0157"
title: "matrix-client-android E2EE rust-sdk: cross-signing, SAS, recovery"
status: pendiente
priority: alta
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<List<Device>>`.
     - `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.
