qrtc quantum realtime communication GitHub

Testing and CI

Unit tests run two engines against each other in one process. Interop tests put qrtc against Chromium and OpenSSL. The full browser, SFU and Matrix matrix runs in tauri-plugin-webrtc, where a real page drives the engine.

Unit tests

cargo test --lib
AreaTests
JSEPSection parsing, direction and msid rewrites, codec preference filtering, accepted fmtp edits, refused structural edits, glare rollback of the polite offer, explicit rollback, re-offer of an unchanged session
Data channelsLoopback between two engines
MediaVideo both ways with msid; DTMF between engines
AudioOpus round trip keeps a tone; unprocessed capture keeps its level; the echo canceller removes echo and does not inject the far end
STUN and TURNMessage integrity and fingerprint, XOR addresses, ChannelData, stream framing with padding, ICE server URLs
Post-quantumDTLS between engines for every policy pair; every group agrees; malformed shares are refused; moduletto and RustCrypto ML-KEM decapsulate each other's output

Interop tests

Chromium

cargo build --example stdio_peer
cd tests && npm ci && npx playwright-core install chromium && cd ..
node tests/chromium-interop.mjs

Headless Chromium and the stdio_peer example open data channels both ways. Each case also checks the DTLS group each side agreed:

CaseChromiumqrtcExpected
classicalDefaultpreferDTLS 1.2, no post-quantum group
pqDTLS 1.3 and post-quantum field trialspreferX25519MLKEM768, both offer directions
pq-requireSamerequireX25519MLKEM768
require-failDefaultrequireNo connection

OpenSSL

node tests/pq-tls-interop.mjs pq-moduletto
node tests/pq-tls-interop.mjs pq-hybrid

The engine's TURN over TLS client connects to an OpenSSL 3.5 server (Node's TLS) that accepts only X25519MLKEM768.

CI

.github/workflows/ci.yml runs on every push and pull request, and weekly. Actions are pinned by commit.

JobWhat it checks
lintrustfmt; clippy with warnings as errors on every feature set; rustdoc warnings
testUnit tests and examples on x86_64 Linux, aarch64 Linux (moduletto's NEON path) and aarch64 macOS, each with the default, pure Rust and classical feature sets
windowsUnit tests on Windows; reported, not blocking, until verified
msrvBuilds with Rust 1.91
pure-rustThe pure Rust build contains no crate that compiles C: no cc, cmake, bindgen, pkg-config, vcpkg, ring, aws-lc or openssl-sys
supply-chaincargo-deny: RustSec advisories, licences, sources, bans
sbomsbom/qrtc.cdx.json matches Cargo.lock
interop-opensslPost-quantum TURN over TLS against OpenSSL 3.5, both ML-KEM backends
interop-chromiumThe four Chromium cases above

Releases

.github/workflows/release.yml runs on a v* tag. It checks that the tag matches the crate version, runs the tests, and builds the SBOM, the source archive and SHA-256 sums. It attests build provenance for them and attaches them to a GitHub release. Tags and commits are signed.

Consumer tests

tauri-plugin-webrtc runs qrtc inside WebKitGTK against Chromium, LiveKit with end-to-end encryption, matrix-js-sdk voice and video calls, and coturn over UDP, TCP and TLS. Its testing page lists those suites.