Overview
Arti 1.8.0 adds experimental circuit padding support via the maybenot library to resist traffic fingerprinting attacks.
Parent issue: #49
Investigation Findings
WASM Compatibility: [PASS]
maybenot is WASM-compatible:
- Pure Rust library, no native/OS bindings
- Dependencies (
rand, flate2, serde, etc.) all work on wasm32
- Runtime-agnostic design (consumes events, returns actions - no I/O or threads)
- Used by Mullvad VPN in production
Architecture in tor-proto
Circuit padding is behind feature flags:
circ-padding - Core maybenot integration
circ-padding-manual - Manual machine configuration API
Key types:
PaddingController - Reports traffic events to padding machines
PaddingEventStream - Produces padding/blocking actions
CircuitPadderConfig - Machine configuration (optional)
Current state:
- webtor-rs uses vendored tor-proto WITHOUT
circ-padding
- Uses
no_padding.rs (no-op implementation)
- Circuit reactor already has the API wiring in place
Recommended Approach
Stage 0: Receive-only Tolerance (Minimal, Low Risk)
Effort: S (<1h)
Modify no_padding.rs to drop unexpected padding cells instead of erroring:
pub(crate) fn decrypted_padding(&self, _hop: HopNum) -> Result<(), crate::Error> {
// Treat unexpected padding as ignorable instead of fatal
Ok(())
}
Benefits:
- No new dependencies
- No bandwidth overhead
- Compatible with future Tor padding behavior
- Zero risk
Stage 1: Full maybenot Integration (Opt-in)
Effort: M (1-3h)
- Add feature flag to webtor:
[features]
circ-padding = ["tor-proto/circ-padding"]
-
Keep disabled by default (bandwidth concerns for WASM)
-
Use upstream default CircuitPadderConfig (no custom tuning)
-
Test on wasm32-unknown-unknown + browser
Performance/Bandwidth Implications
CPU/Memory
- Minor overhead (small state machines)
- Per-circuit state: few KB
- Well within existing Tor crypto budget
Bandwidth (Main Concern for WASM)
- Extra Tor cells + possible delays
- Users often on metered/mobile connections
- Web sockets incur overhead per frame
- This is why full padding should be opt-in
Decision: Recommended Path
-
Default for webtor-rs: Receive-only tolerance (Stage 0)
- Minimal change to
no_padding.rs
- Compatible with future Tor behavior
- No bandwidth impact
-
Optional advanced mode: Full padding (Stage 1)
- Behind feature flag, disabled by default
- For privacy-focused users who accept bandwidth cost
- Measure overhead before promoting to default
Tasks
Stage 0 (Recommended)
Stage 1 (Optional, Future)
Related Files
vendor/arti/crates/tor-proto/Cargo.toml - Feature flags
vendor/arti/crates/tor-proto/src/client/circuit/padding/no_padding.rs - Stage 0 change
vendor/arti/crates/tor-proto/src/client/circuit/padding/maybenot_padding.rs - Full impl
webtor/src/circuit.rs - Circuit management
Overview
Arti 1.8.0 adds experimental circuit padding support via the
maybenotlibrary to resist traffic fingerprinting attacks.Parent issue: #49
Investigation Findings
WASM Compatibility: [PASS]
maybenotis WASM-compatible:rand,flate2,serde, etc.) all work on wasm32Architecture in tor-proto
Circuit padding is behind feature flags:
circ-padding- Core maybenot integrationcirc-padding-manual- Manual machine configuration APIKey types:
PaddingController- Reports traffic events to padding machinesPaddingEventStream- Produces padding/blocking actionsCircuitPadderConfig- Machine configuration (optional)Current state:
circ-paddingno_padding.rs(no-op implementation)Recommended Approach
Stage 0: Receive-only Tolerance (Minimal, Low Risk)
Effort: S (<1h)
Modify
no_padding.rsto drop unexpected padding cells instead of erroring:Benefits:
Stage 1: Full maybenot Integration (Opt-in)
Effort: M (1-3h)
Keep disabled by default (bandwidth concerns for WASM)
Use upstream default
CircuitPadderConfig(no custom tuning)Test on wasm32-unknown-unknown + browser
Performance/Bandwidth Implications
CPU/Memory
Bandwidth (Main Concern for WASM)
Decision: Recommended Path
Default for webtor-rs: Receive-only tolerance (Stage 0)
no_padding.rsOptional advanced mode: Full padding (Stage 1)
Tasks
Stage 0 (Recommended)
vendor/arti/crates/tor-proto/src/client/circuit/padding/no_padding.rsdecrypted_paddingto returnOk(())instead of errorStage 1 (Optional, Future)
circ-paddingfeature flag to webtortor-proto/circ-paddingbehind the flagRelated Files
vendor/arti/crates/tor-proto/Cargo.toml- Feature flagsvendor/arti/crates/tor-proto/src/client/circuit/padding/no_padding.rs- Stage 0 changevendor/arti/crates/tor-proto/src/client/circuit/padding/maybenot_padding.rs- Full implwebtor/src/circuit.rs- Circuit management