qrtc quantum realtime communication GitHub

Vendored crates

qrtc builds on str0m, a sans-I/O WebRTC stack, and on dimpl, its DTLS library. Both are vendored under vendor/ with small patches, each listed in the crate's PATCHES.md and meant for upstream.

Why vendor

Only sources, manifests, licences and readmes are vendored. Upstream tests, examples and dev-dependencies are dropped, so the SBOM lists only what is built.

str0m 0.24.0 and str0m-rust-crypto 0.6.0

#ChangeWhy
1The VP8 packetizer writes a 15-bit PictureID in every payload descriptor, from a random start, as browsers doLiveKit's SFU does not forward VP8 without it
2SdpApi::apply_offer() returns an offer when nothing changedJSEP createOffer() always returns one; LiveKit and perfect negotiation rely on it
3The DTLS certificate (ECDSA P-256, random 128-bit serial, one year) is built with RustCrypto p256 and x509-certdimpl's rcgen feature enabled aws-lc-rs, compiling AWS-LC (C)
4Dev-dependencies removed from the vendored manifestsThe SBOM lists only built code
5provider_with_dtls builds the crypto provider with DtlsOptions: extra key exchange groups and a group preference listPost-quantum DTLS 1.3; the default provider is unchanged
6dimpl, is and str0m-proto are path dependenciesThe patched dimpl applies downstream without [patch]
7In str0m-proto and is: ICE credentials (Id::random, the source of ice-ufrag and ice-pwd), STUN transaction ids and the ICE tie-breaker come from the operating system through the new CryptographicRngUpstream used fastrand, a non-cryptographic generator seeded from the clock and the thread id. RFC 8445 section 5.3 requires unguessable credentials. Found in the 2026-10-10 security review

dimpl 0.7.4

The patches add post-quantum groups to DTLS 1.3 and change nothing for classical groups. Every changed spot is marked in the source.

#ChangeFiles
1Named groups: MLKEM512, MLKEM768, MLKEM1024, SECP256R1MLKEM768, X25519MLKEM768, and X25519MLKEM512_PRIVATE (0xfe5c). The supported list grows from 4 to 10, and group lists use that capacity, so a peer offering many groups is no longer rejected.src/types.rs
2SupportedKxGroup::server_exchange takes the client's share and returns the server's share and the secret. Its default runs the Diffie-Hellman steps.src/crypto/provider.rs, src/dtls13/server.rs
3SupportedKxGroup::dtls12() keeps KEM groups out of DTLS 1.2 offers, selection and key exchangesrc/dtls12/
4The provider self-test exchanges keys as a TLS 1.3 client and server, covering both kinds of groupsrc/crypto/validation/mod.rs
5A ClientHello with a hybrid share (about 1.4 kB) is split into MTU-sized records, per RFC 9147 section 5.5. The forked 1.2 or 1.3 handshake learns how many epoch-0 records it used.src/auto.rs, src/dtls12/client.rs, src/dtls13/client.rs, src/dtls13/engine.rs
6A ServerHello split over several records is DTLS 1.3, since a DTLS 1.2 ServerHello always fits one. The 1.3 client then reassembles it.src/auto.rs
7Downgrade sentinel (RFC 8446 section 4.1.3): the auto-sensing client fails the handshake when a DTLS 1.2 ServerHello random ends in DOWNGRD\x01, since it offered 1.3 and a 1.3-capable server saw a hello without it. The auto-sensing server sets the sentinel when it falls back to 1.2. Found in the 2026-10-10 security review.src/types.rs, src/error.rs, src/dtls12/client.rs, src/dtls12/server.rs, src/lib.rs

The patched crate passes its own unit tests: 252 in-tree tests with rust-crypto on the vendored copy (cargo test --manifest-path vendor/dimpl/Cargo.toml --no-default-features --features rust-crypto --lib), and 301 with the default features when run from a copy with the upstream dev-dependencies restored.

is 0.11.1 and str0m-proto 0.7.0

Vendored for the path wiring (str0m patch 6) and the randomness patch (str0m patch 7). Nothing else is changed.