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
- Post-quantum DTLS needs changes inside dimpl's handshake, which a wrapper cannot reach.
- Interoperability with LiveKit and perfect negotiation needs two behaviour changes in str0m.
- Keeping the build free of C means replacing the one path that pulled in AWS-LC.
- Path dependencies apply the patches to every project that depends on qrtc, with no
[patch]section on their side.
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
| # | Change | Why |
|---|---|---|
| 1 | The VP8 packetizer writes a 15-bit PictureID in every payload descriptor, from a random start, as browsers do | LiveKit's SFU does not forward VP8 without it |
| 2 | SdpApi::apply_offer() returns an offer when nothing changed | JSEP createOffer() always returns one; LiveKit and perfect negotiation rely on it |
| 3 | The DTLS certificate (ECDSA P-256, random 128-bit serial, one year) is built with RustCrypto p256 and x509-cert | dimpl's rcgen feature enabled aws-lc-rs, compiling AWS-LC (C) |
| 4 | Dev-dependencies removed from the vendored manifests | The SBOM lists only built code |
| 5 | provider_with_dtls builds the crypto provider with DtlsOptions: extra key exchange groups and a group preference list | Post-quantum DTLS 1.3; the default provider is unchanged |
| 6 | dimpl, is and str0m-proto are path dependencies | The patched dimpl applies downstream without [patch] |
| 7 | In 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 CryptographicRng | Upstream 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.
| # | Change | Files |
|---|---|---|
| 1 | Named 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 |
| 2 | SupportedKxGroup::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 |
| 3 | SupportedKxGroup::dtls12() keeps KEM groups out of DTLS 1.2 offers, selection and key exchange | src/dtls12/ |
| 4 | The provider self-test exchanges keys as a TLS 1.3 client and server, covering both kinds of group | src/crypto/validation/mod.rs |
| 5 | A 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 |
| 6 | A 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 |
| 7 | Downgrade 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.