Skip to main content

wire_benchmark/
wire_benchmark.rs

1// Copyright Nixort <https://github.com/Nixort> 2026.
2//
3// License: GNU General Public License v3.0 only.
4// You can find the license file in the project root.
5//
6// Federated CFR Connect Protocol (FCP).
7
8//! Deterministic verified-wire decode benchmark for FCP.
9//!
10//! Run with `cargo run --release -p libfcp-core --example wire_benchmark`.
11//! This measures only local canonical parsing plus mandatory Ed25519 and ML-DSA-65 verification; it does
12//! not measure ICE, DTLS, SCTP, signaling, media, a WebRTC engine or network I/O.
13
14use std::hint::black_box;
15use std::time::Instant;
16
17use ed25519_dalek::SigningKey;
18use libfcp_core::{AttemptId, Body, Envelope, FederationId, SigningIdentity, WebRtcBinding};
19use ml_dsa::{MlDsa65, SigningKey as MlDsaSigningKey, B32};
20
21const SAMPLES: usize = 20_000;
22
23fn signed_wire(body: Body) -> Vec<u8> {
24    let signer = SigningIdentity::new(
25        SigningKey::from_bytes(&[41; 32]),
26        MlDsaSigningKey::<MlDsa65>::from_seed(&B32::from([41; 32])),
27    );
28    let recipient = SigningIdentity::new(
29        SigningKey::from_bytes(&[42; 32]),
30        MlDsaSigningKey::<MlDsa65>::from_seed(&B32::from([42; 32])),
31    );
32    Envelope::sign(
33        &signer,
34        FederationId::from_bytes([1; 32]),
35        AttemptId::from_bytes([2; 16]),
36        recipient.endpoint(),
37        body,
38    )
39    .expect("bounded test envelope")
40    .encode()
41    .expect("canonical wire")
42}
43
44fn measure(name: &str, wire: &[u8]) {
45    let samples = u32::try_from(SAMPLES).expect("fixed sample count fits u32");
46    let start = Instant::now();
47    let mut total = 0_u32;
48    for _ in 0..samples {
49        let envelope = Envelope::decode_verified(black_box(wire)).expect("verified fixture");
50        let encoded = envelope.encode().expect("canonical re-encode");
51        let bytes = u32::try_from(encoded.len()).expect("bounded envelope fits u32");
52        total = total
53            .checked_add(bytes)
54            .expect("fixed benchmark byte count fits u32");
55        black_box(envelope);
56    }
57    let seconds = start.elapsed().as_secs_f64();
58    let envelopes_per_second = f64::from(samples) / seconds;
59    let mebibytes_per_second = f64::from(total) / (1024.0 * 1024.0) / seconds;
60    println!(
61        "{name}\twire_bytes={}\tsamples={SAMPLES}\tenvelopes_per_second={envelopes_per_second:.0}\tMiB_per_second={mebibytes_per_second:.2}",
62        wire.len()
63    );
64}
65
66fn main() {
67    let offer = signed_wire(Body::Offer {
68        binding: WebRtcBinding::derive(b"deterministic-offer", b"fingerprint"),
69        description: vec![0xA5; 1024],
70    });
71    let cfr_control = signed_wire(Body::CfrControl {
72        payload: vec![0x5A; 4096],
73    });
74
75    println!("fcp_wire_benchmark\tversion=1\tmode=release_expected");
76    measure("verified_offer", &offer);
77    measure("verified_cfr_control", &cfr_control);
78}