diff --git a/warzone/crates/warzone-server/src/routes/web.rs b/warzone/crates/warzone-server/src/routes/web.rs index fbc7ffc..042637d 100644 --- a/warzone/crates/warzone-server/src/routes/web.rs +++ b/warzone/crates/warzone-server/src/routes/web.rs @@ -1724,6 +1724,7 @@ async function startGroupCall() { }).catch(() => {}); addSys('Group call started in #' + gname + ' \u2014 waiting for others to join'); + addSys('\u{26A0}\u{FE0F} Group calls are transport-encrypted (QUIC), not E2E encrypted'); await joinGroupCallAudio(); } diff --git a/warzone/docs/TASK_PLAN.md b/warzone/docs/TASK_PLAN.md index 499e612..2db56d4 100644 --- a/warzone/docs/TASK_PLAN.md +++ b/warzone/docs/TASK_PLAN.md @@ -134,7 +134,7 @@ ## FC-P5: Major Features -**Goal:** Core differentiators — physical delivery, federation, identity provider. +**Goal:** Core differentiators — physical delivery, federation, identity provider, E2E group calls. | ID | Task | Effort | Dep | Status | |----|------|--------|-----|--------| @@ -142,6 +142,28 @@ | FC-P5-T2 | DNS federation (server discovery + relay) | 2-3w | P4-T2 | TODO | | FC-P5-T3 | OIDC identity provider | 1-2w | P1-T1 | TODO | | FC-P5-T4 | Smart contract access control | 3-4w | P5-T3 | TODO | +| FC-P5-T5 | MLS group call E2E encryption (RFC 9420) | 4-6w | — | TODO | + +### FC-P5-T5: MLS for Group Call E2E (RFC 9420) + +**Current state:** Group calls use transport encryption only (QUIC). Audio is encrypted on the wire but the WZP relay can see it. Direct 1:1 calls are E2E encrypted via existing Double Ratchet. + +**Goal:** E2E encrypt group call audio using MLS (Messaging Layer Security, RFC 9420). + +**Why MLS over alternatives:** +- **Sender Keys** (Signal/WhatsApp): simpler but O(n) key distribution, no forward secrecy on member change +- **MLS/TreeKEM**: O(log n) key updates, forward secrecy on every member change, designed for groups +- **RFC 9420** is an IETF standard with multiple implementations (OpenMLS in Rust) + +**Approach:** +1. Integrate `openmls` crate for key agreement +2. Each group call creates an MLS group (epoch 0) +3. Members join via Welcome messages distributed through existing E2E channels +4. Audio frames encrypted with the group's current epoch key (AES-GCM) +5. Member leave triggers Commit + UpdatePath (O(log n) key rotation) +6. WZP relay sees only ciphertext + +**Dependencies:** OpenMLS crate, WASM compatibility for browser side --- @@ -152,12 +174,12 @@ | ID | Task | Effort | Dep | Status | |----|------|--------|-----|--------| | FC-P6-T1 | Message search (local history) | 1d | — | TODO | -| FC-P6-T2 | Read receipts (viewport tracking) | 0.5d | — | TODO | +| FC-P6-T2 | Read receipts (viewport tracking) | 0.5d | — | DONE (v0.0.41) | | FC-P6-T3 | Typing indicators | 0.5d | — | TODO | | FC-P6-T4 | Message reactions (emoji) | 1d | P4-T2 | TODO | | FC-P6-T5 | Voice messages as attachments | 1d | — | TODO | -| FC-P6-T6 | Message wrapping for long text | 0.5d | — | TODO | -| FC-P6-T7 | Tab completion for commands/aliases | 0.5d | — | TODO | +| FC-P6-T6 | Message wrapping for long text | 0.5d | — | DONE (v0.0.39) | +| FC-P6-T7 | Tab completion for commands/aliases | 0.5d | — | DONE (v0.0.39) | | FC-P6-T8 | File transfer progress gauge | 0.5d | — | TODO | ---