open-standards/joule-code/joule-code-rs/crates/joule-moq-mls/Cargo.toml
Transaction Science 67e36498ca joule-moq-mls: a member behind an ordering carrier — stages its create and commit, follows the group before its Welcome; feature js for wasm32
A room service that carries the room's messages in one order (confidentiality §5.1) is
how a browser member is reached. A member that applied its own commit before the carrier
ordered it could fork from a commit another member made for the same epoch, so:

- stage_create / stage_commit hold the member's GroupInfo or commit until the carrier
  returns it (receive applies it then, checked as every member checks it); another's
  first, or a refusal, withdraws it. create and commit still apply at once.
- before its Welcome a principal follows the group from its public handshake messages,
  as the clock does (the code is now shared), so its model knows whether a group exists
  and who is in it; a Welcome for another and a GroupInfo of a group it holds are ignored.
- feature js: openmls's js (getrandom 0.4 wasm_js, web-time) and getrandom 0.2's js for
  the crypto provider's generator; the crate builds for wasm32-unknown-unknown.

Tests: a room carried in one order (create, follow, commit, Welcome, removal), two
commits for one epoch where the carrier's first wins, a commit overtaken by another, and
a staged create the carrier refuses.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-10-20 08:28:19 -04:00

37 lines
1.9 KiB
TOML

[package]
name = "joule-moq-mls"
version = "0.1.0"
description = "End-to-end encrypted WAI live rooms: one MLS group (RFC 9420) per room, its membership driven by the room's grants and lifecycle, the room's clock as the group's external sender and a committer every member computes alike, and each epoch's per-sender keys for joule-moq's sealed objects (draft-ietf-moq-secure-objects-01). With the room's confidentiality record and the corpus generator of WAI live-conformance/e2ee."
edition = "2024"
rust-version = "1.97"
license = "Apache-2.0"
repository = "https://git.transaction.science/Transaction-Science/open-standards"
[[bin]]
name = "joule_moq_e2ee_vectors"
path = "src/bin/joule_moq_e2ee_vectors.rs"
[dependencies]
joule-moq = { path = "../joule-moq", default-features = false, features = ["secure-objects"] }
# MLS (RFC 9420), MIT, pinned exactly: the group, its key schedule and exporter, external
# proposals, and the public view of a group a non-member keeps.
openmls = "=0.9.1"
openmls_rust_crypto = "=0.6.0"
openmls_traits = "=0.6.0"
tls_codec = "0.5"
ed25519-dalek = "2"
sha2 = "0.10"
blake3 = "1"
hex = "0.4"
serde = { version = "1", features = ["derive"] }
serde_json = "1"
# For wasm32-unknown-unknown (feature `js`): getrandom 0.2's browser backend, which the
# crypto provider's own generator draws from (openmls's `js` gives getrandom 0.4 its own).
getrandom_02 = { package = "getrandom", version = "0.2", features = ["js"], optional = true }
[features]
# A member in a browser: secure randomness and the clock from the page's JavaScript APIs
# (openmls's `js`: getrandom 0.4's `wasm_js` backend and `web-time`), and the same for the
# crypto provider's generator. Nothing else changes, and the crate builds for
# wasm32-unknown-unknown with it.
js = ["openmls/js", "dep:getrandom_02"]