huddle-protocol 2.1.1

The Huddle wire protocol and pure cryptographic constructions — the runtime-free core that both the huddle client and relay speak.
Documentation
[package]
name = "huddle-protocol"
version.workspace = true
edition.workspace = true
license.workspace = true
repository.workspace = true
homepage.workspace = true
description = "The Huddle wire protocol and pure cryptographic constructions — the runtime-free core that both the huddle client and relay speak."
readme = "README.md"
keywords = ["chat", "protocol", "encryption", "post-quantum", "wire-format"]
categories = ["cryptography", "network-programming"]

# huddle 2.0.4 (WS1.1): this crate is deliberately runtime-free. It must pull
# ONLY RustCrypto-family + serde crates — NO tokio / libp2p / rusqlite /
# vodozemac / arti. A `cargo tree -p huddle-protocol` invariant test guards
# this so the boundary can't silently regress.
[dependencies]
serde = { version = "1", features = ["derive"] }
serde_json = "1"
thiserror = "2"
ed25519-dalek = { version = "2", features = ["rand_core"] }
x25519-dalek = { version = "2", features = ["static_secrets"] }
ml-kem = { version = "0.3.2", features = ["zeroize"] }
# huddle 2.0.6 (WS2-a): ML-DSA-65 (FIPS 204) for hybrid post-quantum
# authentication — a composite Ed25519 + ML-DSA signature on identity/authority
# envelopes. Pure-Rust RustCrypto crate; deterministic keygen from the identity
# seed (no new on-disk material), same as ml-kem.
ml-dsa = "0.1.1"
sha2 = "0.11"
hkdf = "0.13"
hex = "0.4"
rand = "0.8"
argon2 = "0.5"
chacha20poly1305 = "0.10"
base64 = "0.22"
zeroize = { version = "1", features = ["derive"] }
bip39 = "2"