Rename all project references from quicproquo/qpq to quicprochat/qpc across documentation, Docker configuration, CI workflows, packaging scripts, operational configs, and build tooling. - Docker: crate paths, binary names, user/group, data dirs, env vars - CI: workflow crate references, binary names, artifact names - Docs: all markdown files under docs/, SDK READMEs, book.toml - Packaging: OpenWrt Makefile, init script, UCI config (file renames) - Scripts: justfile, dev-shell, screenshot, cross-compile, ai_team - Operations: Prometheus config, alert rules, Grafana dashboard - Config: .env.example (QPQ_* → QPC_*), CODEOWNERS paths - Top-level: README, CONTRIBUTING, ROADMAP, CLAUDE.md
7.3 KiB
Introduction
quicprochat is a research-oriented, end-to-end encrypted group messaging system written in Rust. It layers the Messaging Layer Security protocol (MLS, RFC 9420) on top of QUIC + TLS 1.3 transport (via quinn and rustls), with all service RPCs framed using a compact binary Protocol Buffers format over a custom framing layer. The project exists to explore how modern transport encryption (QUIC), a formally specified group key agreement protocol (MLS), and post-quantum hybrid key encapsulation compose in practice -- and to provide a readable, auditable reference implementation for security researchers, protocol designers, and Rust developers who want to study or extend the design.
Protocol stack
+---------------------------------------------+
| Application / MLS ciphertext | <- group key ratchet (RFC 9420)
+---------------------------------------------+
| Protobuf framing (custom binary header) | <- typed, length-prefixed framing
+---------------------------------------------+
| QUIC + TLS 1.3 (quinn/rustls) | <- mutual auth + transport secrecy
+---------------------------------------------+
Each layer addresses a distinct concern:
-
QUIC + TLS 1.3 provides authenticated, confidential transport with 0-RTT connection establishment and multiplexed streams. The server presents a TLS 1.3 certificate (self-signed by default); the client verifies it against a local trust anchor. ALPN negotiation uses the token
qpc. -
Protobuf framing defines the wire format for all service operations across 44 RPC methods. Each request carries a
[method_id: u16][request_id: u32][payload_len: u32]header followed by a Protobuf-encoded payload. Server-to-client push events use a separate frame type on QUIC uni-streams. Message definitions live inproto/qpc/v1/*.protoand are compiled to Rust withprostat build time. -
MLS (RFC 9420) provides the group key agreement layer. Each participant holds an Ed25519 identity keypair and generates single-use HPKE KeyPackages. The MLS epoch ratchet delivers forward secrecy and post-compromise security: compromising a member's state at epoch n does not reveal plaintext from epochs < n (forward secrecy) or > n+1 (post-compromise security, once the compromised member updates).
Security properties
| Property | Mechanism |
|---|---|
| Transport confidentiality | TLS 1.3 over QUIC (rustls with TLS13 only) |
| Transport authentication | TLS 1.3 server certificate (self-signed, SANs: localhost, 127.0.0.1, ::1) |
| Group key agreement | MLS_128_DHKEMX25519_AES128GCM_SHA256_Ed25519 |
| Post-compromise security (PCS) | MLS epoch ratchet -- each Commit advances the key schedule |
| Post-quantum readiness | X25519 + ML-KEM-768 hybrid KEM envelope |
| Identity | Ed25519 (ed25519-dalek); public key used as MLS BasicCredential |
| Password auth | OPAQUE (password never sent to server) |
| Metadata protection | Sealed sender + message padding |
| Local storage | SQLCipher + Argon2id + ChaCha20-Poly1305 |
| Framing | Protobuf (prost) with custom binary header (method_id, request_id, length) |
For a deeper discussion of the cryptographic guarantees, threat model, and known gaps, see:
Who is this for?
Security researchers studying how MLS composes with QUIC transport and post-quantum hybrid KEM. The codebase spans 9 workspace crates with clear cryptographic boundaries for auditability.
Protocol designers evaluating MLS deployment patterns. quicprochat implements a concrete Authentication Service (AS) and Delivery Service (DS) pair, demonstrating single-use KeyPackage lifecycle, Welcome routing, and epoch advancement in a live system.
Application developers building on the platform via the Rust SDK:
quicprochat-sdk--QpqClientwith async event streams and aConversationStore- C FFI -- cross-language integration via
quicprochat-plugin-api
Rust developers looking for a working example of:
quinn+rustlsserver/client setup with self-signed certificates- Custom binary framing over QUIC bidirectional streams
openmlsgroup creation, member addition, and application message encryptionzeroize-on-drop key material handling
Quick links
| Section | What you will find |
|---|---|
| Comparison with Classical Protocols | Why quicprochat? IRC+SSL, XMPP, Telegram vs. our design |
| Prerequisites | Toolchain and system dependencies |
| Building from Source | cargo build, Protobuf codegen, troubleshooting |
| Running the Server | Server startup, configuration, TLS cert generation |
| Running the Client | All CLI subcommands with examples |
| Demo Walkthrough | Step-by-step Alice-and-Bob narrative with sequence diagram |
| Architecture Overview | Crate boundaries, service architecture, data flow |
| Protocol Layers | Deep dives into QUIC/TLS, Protobuf framing, MLS, Hybrid KEM |
| Wire Format Reference | Protobuf schema documentation and method ID table |
| Cryptography | Identity keys, key lifecycle, forward secrecy, PCS, threat model |
| Design Rationale | ADRs and protocol design decisions |
| Roadmap | Milestone tracker and future research directions |
Current status
quicprochat is a research project with production-grade features. It has not been audited by a third party. The test suite covers 301 tests across core, server, client, E2E, and P2P modules.
What works today:
- OPAQUE password authentication (register + login, 4-method handshake)
- 44 Protobuf RPC methods across 14 proto files and 9 workspace crates
- MLS group creation, member add, message encryption, and epoch advancement
- Hybrid X25519 + ML-KEM-768 key encapsulation for post-quantum readiness
- SQLCipher-backed local storage with Argon2id key derivation
- Key transparency (REVOKE, CHECK_REVOCATION, AUDIT)
- Multi-device management and push notification registration
- Blob storage (upload/download)
- Federation relay for cross-server message delivery
- Content moderation (report, ban, unban)
- Account recovery bundle store
Known limitations:
- MLS credentials use
CredentialType::Basic(raw public key). A production system would bind credentials to a certificate authority or use X.509 certificates. - The hybrid KEM envelope is implemented and tested, but not yet integrated into the OpenMLS CryptoProvider for full post-quantum MLS (planned for a future milestone).
- Browser connectivity requires a WebSocket-to-Protobuf bridge proxy (not yet included).
For the full milestone tracker, see Milestones.
License
quicprochat is released under the MIT license. See LICENSE in the repository root.