wai.live.e2ee: end-to-end encrypted rooms on MoQ secure objects and MLS keying (L10) #345
Loading…
Reference in a new issue
No description provided.
Delete branch "wai/e2ee"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
L10 of WAI's live and interactive work: end-to-end encrypted rooms. Every object a member publishes is sealed by its sender, so relays route, cache, meter and receipt only ciphertext, and only the room's current members open it. Group keys come from MLS (RFC 9420), and the group's membership follows the room's grants and lifecycle.
Documents (pinned)
draft-ietf-moq-secure-objects-01(6 July 2026),draft-jennings-moq-mocha-mls-keying-00(6 July 2026), RFC 9605 (SFrame), RFC 9420 (MLS), RFC 9750 (MLS architecture), ondraft-ietf-moq-transport-22.confidentiality.mdis rewritten onto these and no longer follows the expireddraft-jennings-moq-e2ee-mls. SPEC §5 and §6 withdraw the expired construction.What is in it
wai/extensions/confidentiality.mdregisterswai.live.e2eewith a signed confidentiality record (WRE1).joule-moq:secure_objects(featuresecure-objects), seal and open per the draft, with its vectors.joule-moq-mls(new crate): the room's MLS binding onopenmls=0.9.1,openmls_rust_crypto=0.6.0 andopenmls_traits=0.6.0, all pinned. It holds the membership model, the confidentiality record, the strict checks, real-MLS room tests, and the corpus generatorjoule_moq_e2ee_vectors.joule-moq-relay:tests/sealed_objects.rsshows sealed objects through the unchanged relay. No relay forwarding code changes.wai/live-conformance/e2ee/: sealed-object vectors with their keys, per-epoch exporter secrets and derived per-sender keys, a multi-sender room transcript with a removal, and negatives. Generated deterministically, with a README.e2ee_verify.py, standard library only, with a pure-Python AEAD for vectors only. It does not implement MLS: it takes each epoch's exporter secret from the corpus and checks everything after it. The spec states that boundary.joule-code-conformanceruns the secure-objects tests,joule-moq-mlsand the corpus's regeneration; the independent-verifiers job runse2ee_verify.py. Also SPEC §5/§6, REGISTRY, the regenerated export (wai.live.e2ee,WRE1,SECURE_OBJECT_KEY_ID,WAI_INNER_DIGEST), SECURITY.md and moq-streaming-format.Checks on the build host (rb, at
c3c777a0)Cargo.lockwithcargo metadata --locked --offlinejouledesk/…/vendor/libwebrtcis skipped, ascheck-lockfiles.shskips it)cargo test -p joule-moq --features secure-objects --lib secure_objectsand--test secure_objects_vectorscargo test -p joule-moq-mlsjoule_moq_e2ee_vectors verify ../../wai/live-conformance/e2eecargo test -p joule-moq-relay --test sealed_objectscargo check -p joule-moq --no-default-featurescargo clippy -p joule-moq-mls -p joule-moq --all-targetsjoule-moq-mlsfixed in this PR's last commit, none left in its codewai registry export --check,--lib codecs::registry, the header withcbindgen.tomltouchedinclude/wai.hunchangedpython3 -I live-conformance/e2ee_verify.py live-conformance/e2eeOut of scope
The slice was built by a builder that stopped at the account's weekly limit before writing its report. The final checks above, the clippy fixes and this PR were done after it stopped.
🤖 Generated with Claude Code