Rust workspace with 7 crates implementing a custom VoIP protocol designed for extremely lossy connections (5-70% loss, 100-500kbps, 300-800ms RTT). 89 tests passing across all crates. Crates: - wzp-proto: Wire format, traits, adaptive quality controller, jitter buffer, session FSM - wzp-codec: Opus encoder/decoder (audiopus), Codec2 stubs, adaptive switching, resampling - wzp-fec: RaptorQ fountain codes, interleaving, block management (proven 30-70% loss recovery) - wzp-crypto: X25519+ChaCha20-Poly1305, Warzone identity compatible, anti-replay, rekeying - wzp-transport: QUIC via quinn with DATAGRAM frames, path monitoring, signaling streams - wzp-relay: Integration stub (Phase 2) - wzp-client: Integration stub (Phase 2) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2.5 KiB
2.5 KiB
FeatherChat: Voice/Video Calling Integration with Warzone Messenger
Overview
Voice/video calling system designed to integrate with the existing E2E encrypted Warzone messenger. Reuses the same identity, addressing, and key exchange infrastructure.
Identity Model (reuse, not duplicate)
- Identity: 32-byte seed derives both keypairs via HKDF:
- Ed25519 (signing)
- X25519 (encryption)
- Fingerprint:
SHA-256(Ed25519 public key)[:16], displayed asxxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx - Backup: BIP39 mnemonic (24 words) for seed recovery
- Storage: Seed encrypted at rest with Argon2id + ChaCha20-Poly1305
- Future: Ethereum address as fingerprint (secp256k1 derived from same BIP39 seed)
Addressing (reuse)
| Method | Format | Resolution |
|---|---|---|
| Local alias | @manwe |
Server resolves to fingerprint |
| Federated | @manwe.b1.example.com |
DNS TXT record → fingerprint + server endpoint |
| ENS | @manwe.eth |
Ethereum address → fingerprint (Phase 2-3) |
| Raw fingerprint | xxxx:xxxx:... |
Direct lookup (always works as fallback) |
Key Exchange (can extend)
- X3DH for session establishment:
- Ed25519 identity key
- X25519 ephemeral key
- Signed pre-keys
- Double Ratchet for forward secrecy on data channels
- Pre-key bundles stored on server, fetched by callers
Server Infrastructure
- Stack: Rust (axum), sled DB, WebSocket for real-time
- Trust model: Server is untrusted relay — never sees plaintext
- Groups: Named, auto-created, per-member encryption
- Federation: Via DNS TXT records (Phase 3)
Calling System Requirements
- Signaling: Reuse existing WebSocket connection and identity
- Key derivation: SRTP/DTLS keys derived from existing X3DH shared secret (or new ephemeral exchange per call)
- Call initiation:
WireMessage::CallOffer,CallAnswer,CallIceCandidatevariants - NAT traversal: STUN/TURN server integration
- Group calls: SFU (Selective Forwarding Unit) vs mesh topology for up to 50 users
- Codecs: Opus for audio, VP8/VP9/AV1 for video
- E2E media encryption: Insertable streams API (WebRTC) or custom SRTP
- Unified addressing: A user calls
@manwethe same way they message@manwe
Degradation Strategy
Calls should degrade gracefully under unreliable/warzone network conditions:
Video (full) → Video (low res) → Audio (high quality) → Audio (low bitrate)
- Support opportunistic cooperation
- Fall back to TURN/TCP through the existing WebSocket when UDP is blocked