Adopt "WiFi Veil" as the product name across all user-facing surfaces, keeping VEIL (Verifiable Emission-shaping for Identity-Leakage prevention) as the technical codename it's built on. Only prose, titles, descriptions, and the console UI change — no code identifiers, file names, crate/npm `name` fields, or the deterministic proof witness are touched, so `cargo test` and the C-core host test are unaffected. - Crate & research READMEs: title + defining line now "WiFi Veil (codename VEIL — …)". - Cargo.toml / package.json / plugin.json descriptions: "WiFi Veil …". - Console UI (veil-console.html): title, brand, and copy say "WiFi Veil". - Firmware tree (README, per-provider READMEs, BUILD/INTEGRATION/MEASUREMENT): "WiFi Veil protector/core/shield". - Harness manifest: recomputed SHA-256 digests for the four changed packaged files (README, package.json, CLAUDE.md, plugin.json) — all verified consistent. Co-Authored-By: claude-flow <ruv@ruv.net> Claude-Session: https://claude.ai/code/session_01WEXNqzs7UsfNFBcP5yW21p
7.1 KiB
WiFi Veil on ESP32 — feasibility and honest scope
Status: SYNTHETIC / L0 (build-only). Everything in this directory is an
ESP-IDF component skeleton. Nothing here has been flashed, run, or captured on
silicon. Hardware-touching paths are marked TODO(hw). Per CLAUDE.md, no
runtime or on-air claim is valid without a captured hardware log — none exists.
This is a defensive-security, compliance-only effort. Nothing here jams, transmits into a band to deny it, or amplifies energy. The ESP32 either observes the channel or toggles the control pins of a passive external surface.
The direct question: "can we use the ESP32 to scramble signals?"
Short answer: not the way you probably mean, and yes in three narrow supporting roles.
The ESP32 cannot shape its own transmitted 802.11 beamforming feedback. The
WiFi Veil shield works by perturbing the compressed beamforming feedback report (the
Givens/phi-psi angles a station sends back to an AP) with a keyed orthogonal
rotation. On the ESP32 that report is generated inside the closed Espressif
Wi-Fi PHY/MAC binary blob (esp-phy-lib, shipped in object form; the Wi-Fi
stack is a proprietary blob bound by a hardware NDA and third-party IP
licensing). There is no ESP-IDF API to intercept, replace, or rotate the
compressed-BF-report the PHY emits. esp_wifi_80211_tx() lets you inject raw
frames, but it is explicitly limited to beacon, probe req/resp, (non-QoS) data,
and action frames with the PHY choosing the actual precoding — it will not let
you hand-craft the VHT/HE sounding-feedback subtype with a chosen precoder. So
the ESP32 is not a beamforming-feedback protector.
Feasibility grade for "ESP32 as a self-protecting WiFi Veil node": F (infeasible). The one waveform we need to touch is behind a blob with no hook.
Feasibility grade for "ESP32 as a WiFi Veil supporting device": B (feasible, build-only). Three legitimate roles below, best-first.
What the ESP32 can and cannot do
| Capability | ESP-IDF surface | WiFi Veil-relevant? | Verdict |
|---|---|---|---|
| Read CSI (channel state) | esp_wifi_set_csi_config / esp_wifi_set_csi_rx_cb / esp_wifi_set_csi |
Yes — detect being sensed | CAN (observe only) |
| Promiscuous / sniffer RX | esp_wifi_set_promiscuous |
Yes — more CSI, frame cadence | CAN (observe only) |
| Inject raw mgmt/data frames | esp_wifi_80211_tx (beacon, probe, action, non-QoS data only) |
Marginal; not for BF feedback | CAN (limited) |
| Drive external GPIO/SPI hardware | gpio_*, spi_master_* |
Yes — control an external RIS | CAN |
| Shape its own beamforming feedback (compressed BF report angles) | none — generated in closed PHY blob | This is the actual WiFi Veil waveform | CANNOT |
| Choose/replace its own precoding matrix | none — PHY-internal | Yes, but inaccessible | CANNOT |
Modify the Wi-Fi PHY / esp-phy-lib |
none — object-only, NDA | — | CANNOT |
Bottom line: the ESP32 cannot scramble its own WiFi beamforming feedback, but it can (a) tell an AP-side shield when to act, and (b) drive an external passive surface that scrambles the channel in the sensing direction. The latter is the only honest sense in which an ESP32 "helps scramble" a signal, and it does so without the ESP32 emitting any RF of its own.
The three legitimate roles
1. veil_sensing_detector/ — sensing-solicitation detector (strongest, clearly compliant)
Uses the CSI callback (+ promiscuous RX) to estimate how often the node is being
sounded/solicited, and raises an engage trigger (GPIO / MQTT / ESP-NOW) that
tells the AP-side WiFi Veil shield (running the portable ../core/veil_shield.c) to
turn on. Pure observe-plus-control-signal; the ESP32 shapes nothing on air. This
is the role we would actually build first.
2. veil_ris_controller/ — external RIS driver (the honest "help scramble")
Drives a reconfigurable intelligent surface over GPIO/SPI. Following the
PrivISAC pattern, each surface element has two phase states designed offline so
the array response is ~identical in the communication direction (throughput
preserved) but differs sharply in the sensing direction (an eavesdropper's
channel is perturbed). The ESP32 is just a keyed pin-driver; the surface is
passive (re-reflects ambient energy, adds none), which is what keeps this on
the compliant side of the jamming line. The switching schedule is keyed via
the portable core's veil_rng (SplitMix64), so an authorized sensor holding the
key can reconstruct and tolerate the schedule while an eavesdropper cannot.
3. esp_wifi_80211_tx action-frame signaling (minor)
Not a separate component. The trigger in role 1 could ride an action frame via
esp_wifi_80211_tx instead of GPIO/MQTT/ESP-NOW. Useful only as a transport for
the control signal — it does not touch beamforming feedback.
Not recommended: decoy / cover-traffic
One could have the ESP32 emit extra frames (via esp_wifi_80211_tx) to inject
motion-like or clutter-like variation into an observer's CSI ("cover traffic").
We do not implement this and do not recommend it. It is (a) legally
sensitive — deliberately adding channel-occupying transmissions to degrade
another party's reception sits close to the jamming line and can violate
radio regulations depending on rate, power, and intent; and (b) low-value —
it costs airtime, harms your own network, and a determined observer can often
filter periodic decoys. It is documented here only so the option is explicitly
weighed and rejected in favor of the passive-RIS approach (role 2), which
perturbs the sensing direction without occupying spectrum.
Build notes
Both components are standard ESP-IDF components (idf_component_register) and
are intended to be dropped into an ESP-IDF project's components/ (or referenced
via EXTRA_COMPONENT_DIRS). veil_ris_controller compiles the portable core
(../core/veil_shield.c) directly to reuse veil_rng. They build as
skeletons; they do not run — every RF/GPIO/SPI/network path is a TODO(hw) stub.
Sources
- ESP-IDF Wi-Fi API (
esp_wifi_80211_txsupported frame types; CSI APIs): https://docs.espressif.com/projects/esp-idf/en/stable/esp32/api-reference/network/esp_wifi.html - ESP-IDF Wi-Fi CSI (Vendor Features —
esp_wifi_set_csi*, promiscuous CSI): https://docs.espressif.com/projects/esp-idf/en/stable/esp32/api-guides/wifi-driver/wifi-vendor-features.html - ESP32-C6 beamforming-feedback limitations (IDFGH-15163): https://github.com/espressif/esp-idf/issues/15839
- Closed Wi-Fi PHY blob (
esp-phy-lib, object-only, NDA): https://github.com/espressif/esp-phy-lib - ESP32 Wi-Fi binary-blob reverse-engineering context (why the PHY is not modifiable): https://esp32-open-mac.be/posts/0005-the-road-ahead/
- Raw 802.11 TX capability/limits reference (
esp32-80211-tx): https://github.com/Jeija/esp32-80211-tx - PrivISAC — RIS-based privacy-preserving ISAC (sensing vs. comm direction): https://arxiv.org/abs/2601.04488
- Wi-BFI — beamforming-feedback extraction (why unprotected BF reports leak): https://arxiv.org/pdf/2309.04408