Wire E2E messaging: send, recv, session persistence, auto-registration
CLI client (warzone):
- `warzone init` now generates pre-key bundle (1 SPK + 10 OTPKs),
stores secrets in local sled DB, saves bundle for server registration
- `warzone register -s <url>` registers bundle with server
- `warzone send <fp> <msg> -s <url>` full E2E flow:
- Auto-registers bundle on first use
- Fetches recipient's pre-key bundle
- Performs X3DH key exchange (first message) or uses existing session
- Encrypts with Double Ratchet
- Sends WireMessage envelope to server
- `warzone recv -s <url>` polls and decrypts:
- Handles KeyExchange messages (X3DH respond + ratchet init as Bob)
- Handles Message (decrypt with existing ratchet session)
- Saves session state after each decrypt
Wire protocol (WireMessage enum):
- KeyExchange variant: sender identity, ephemeral key, OTPK id, ratchet msg
- Message variant: sender fingerprint + ratchet message
Session persistence:
- Ratchet state serialized with bincode, stored in sled (~/.warzone/db)
- Pre-key secrets stored in sled, OTPKs consumed on use
- Sessions keyed by peer fingerprint
Networking (net.rs):
- register_bundle, fetch_bundle, send_message, poll_messages
- JSON API over HTTP, bundles serialized with bincode + base64
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>