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>
29 lines
683 B
TOML
29 lines
683 B
TOML
[package]
|
|
name = "warzone-client"
|
|
version.workspace = true
|
|
edition.workspace = true
|
|
|
|
[dependencies]
|
|
warzone-protocol = { path = "../warzone-protocol" }
|
|
tokio.workspace = true
|
|
reqwest.workspace = true
|
|
sled.workspace = true
|
|
clap.workspace = true
|
|
ratatui.workspace = true
|
|
crossterm.workspace = true
|
|
serde.workspace = true
|
|
serde_json.workspace = true
|
|
tracing.workspace = true
|
|
tracing-subscriber.workspace = true
|
|
anyhow.workspace = true
|
|
argon2.workspace = true
|
|
chacha20poly1305.workspace = true
|
|
rand.workspace = true
|
|
zeroize.workspace = true
|
|
hex.workspace = true
|
|
base64.workspace = true
|
|
x25519-dalek.workspace = true
|
|
bincode.workspace = true
|
|
uuid.workspace = true
|
|
chrono.workspace = true
|