a3f75d61ec
Reorganizacion de dev/issues en subcarpetas (completed/, cpp/, gamedev/, kanban/, trading/, imagegen/, matrix/) y cambios acumulados en cmd/fn/pyrunner, .claude/commands y settings. Trabajo de otro LLM/sesion, commiteado a peticion del usuario para desbloquear el working tree. Excluido logs/ardour_mcp_server.log (ruido).
77 lines
3.4 KiB
Markdown
77 lines
3.4 KiB
Markdown
---
|
|
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.
|