Files
fn_registry/dev/issues/0157-matrix-client-android-e2ee.md
egutierrez daef7ea190 feat(matrix): MAS migration helpers + 2 flows + 15 issues + capability group
Helper functions (matrix-mas capability group):
- mas_client_register_bash_infra: register/sync OAuth clients via mas-cli
- mas_syn2mas_migration_bash_infra: dry-run + apply user migration to MAS
- synapse_msc3861_enable_go_infra: edit homeserver.yaml MSC3861 block (with diff)
- wellknown_oidc_patch_go_infra: patch well-known JSON with msc2965.authentication
- synapse_login_flows_check_go_infra: health-check post-migration login flows

Flows + issues for custom Matrix clients (PC + Android):
- 0010 matrix-client-pc: Wails + React+Mantine (issues 0147-0153)
- 0011 matrix-client-android: Kotlin + Compose (issues 0154-0161)
- 0162 enable MAS as auth provider (Synapse delegate) — EXECUTED on VPS
- 0163 custom admin panel propio (sustituye synapse-admin)

Production state (organic-machine.com):
- Synapse migrated SQLite -> Postgres
- MSC3861 active, password_config disabled
- 21 users + 41 access_tokens migrated via syn2mas
- 4 MAS clients registered (element, matrix_pc, matrix_android, admin_panel)
- synapse-admin container removed + Coolify route deleted
- well-known patched with org.matrix.msc2965.authentication

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-24 22:53:33 +02:00

3.4 KiB

id, title, status, priority, created, related_flows, related_issues, dependencies, tags
id title status priority created related_flows related_issues dependencies tags
0157 matrix-client-android E2EE rust-sdk: cross-signing, SAS, recovery pending critical 2026-05-24
0011
0156
0158
0156
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.