Skip to content

Commit 32618fe

Browse files
committed
Add Firefox wasm runtime smoke evidence
1 parent a27829e commit 32618fe

16 files changed

Lines changed: 376 additions & 27 deletions

CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,9 @@
1313
trips.
1414
- Added Chromium-family browser runtime smoke evidence for the same admitted
1515
wasm `simd128` profile.
16+
- Added Firefox/SpiderMonkey WebDriver runtime smoke evidence through
17+
`geckodriver` and an optional Safari/WebKit WebDriver smoke script for
18+
macOS evidence gathering.
1619
- Added a fail-closed wasm encode scalar-verification step: fixed-block wasm
1720
encode output is staged, compared against scalar output, wiped, and only then
1821
copied to caller output.

README.md

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -49,8 +49,8 @@ binary is compiled with `target-feature=+simd128`, the `simd` feature, and the
4949
explicit `allow-wasm32-best-effort-wipe` feature.
5050

5151
The latest patch in this line is `1.3.3`, which admits narrow wasm `simd128`
52-
runtime dispatch with Node/V8, Wasmtime, and Chromium-family browser smoke
53-
evidence, keeps the wasm cleanup caveat fail-closed by default, and adds
52+
runtime dispatch with Node/V8, Wasmtime, Chromium-family browser, and
53+
Firefox/SpiderMonkey smoke evidence, keeps the wasm cleanup caveat fail-closed by default, and adds
5454
wrapped-profile helper ergonomics. The workspace crate family stays
5555
version-aligned at `1.3.3`.
5656

@@ -109,8 +109,12 @@ Implemented on this branch now:
109109
decode for Standard and URL-safe alphabets when built for `wasm32` with
110110
`target-feature=+simd128`, `simd`, and
111111
`allow-wasm32-best-effort-wipe`. The admission is backed by Node/V8,
112-
Wasmtime, and Chromium-family browser runtime smoke evidence; unsupported
112+
Wasmtime, Chromium-family browser, and Firefox/SpiderMonkey runtime smoke evidence; unsupported
113113
wasm builds stay scalar by compiling without `+simd128`.
114+
A Safari/WebKit WebDriver smoke script is included for macOS evidence
115+
gathering once Safari remote automation is enabled, but Safari is not part
116+
of the admitted release claim until its output is captured for a release
117+
candidate.
114118
- Optional `base64-ng-sanitization` companion crate for applications that
115119
already admit `sanitization` and want direct CT decode helpers into
116120
clear-on-drop secret containers.

docs/CRATE_VERSION_MATRIX.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@ sets.
99

1010
The `1.3.3` release keeps the workspace crate family synchronized. The main
1111
crate carries the narrow wasm `simd128` runtime-dispatch admission, Node/V8,
12-
Wasmtime, and Chromium-family browser smoke evidence, release-gated wasm
13-
codegen evidence, and wrapped-profile helper ergonomics. Companion crates
12+
Wasmtime, Chromium-family browser, and Firefox/SpiderMonkey smoke evidence,
13+
release-gated wasm codegen evidence, and wrapped-profile helper ergonomics. Companion crates
1414
receive synchronized package metadata so downstream users see one coherent
1515
crate-family version.
1616

docs/PLAN.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1062,6 +1062,10 @@ inside the `1.3.x` line if they remain evidence-gated and do not weaken the
10621062
- Add `scripts/check_wasm_browser_dispatch.sh` to execute the same smoke module
10631063
in a Chromium-family browser when available, without turning the admission
10641064
into a browser-wide claim.
1065+
- Add `scripts/check_wasm_browser_firefox_dispatch.sh` for
1066+
Firefox/SpiderMonkey WebDriver smoke evidence and
1067+
`scripts/check_wasm_browser_safari_dispatch.sh` as optional macOS
1068+
Safari/WebKit evidence tooling.
10651069
- Keep wasm wipe behavior fail-closed unless callers explicitly enable
10661070
`allow-wasm32-best-effort-wipe`.
10671071
- Document JIT, runtime, timing, and zeroization caveats without implying

docs/RELEASE_EVIDENCE.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,13 @@ The release gate runs:
7878
`scripts/check_wasm_browser_dispatch.sh`, which executes the same wasm32
7979
smoke module in a Chromium-family browser when installed or when
8080
`BASE64_NG_BROWSER` points to a compatible browser binary
81+
- wasm simd128 Firefox/SpiderMonkey smoke evidence through
82+
`scripts/check_wasm_browser_firefox_dispatch.sh`, which executes the same
83+
wasm32 smoke module through `geckodriver` when Firefox is installed
84+
- optional Safari/WebKit WebDriver smoke evidence through
85+
`scripts/check_wasm_browser_safari_dispatch.sh`; this is a manual
86+
evidence-gathering script until a release candidate records its output and
87+
broadens the admitted browser claim
8188
- fail-closed unsupported-native wipe policy documented through
8289
`allow-compiler-fence-only-wipe` for architectures without an implemented
8390
hardware wipe barrier

docs/SIMD.md

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -193,8 +193,9 @@ runtime behavior for that line.
193193
whole-input scalar validation. Custom alphabets remain scalar because
194194
portable wasm SIMD does not provide a direct 64-byte alphabet lookup.
195195
Wasm encode stages vector output and compares it against scalar output before
196-
copying to caller output. Node/V8, Wasmtime, and Chromium-family browser runtime smoke evidence proves active backend reporting, deterministic length
197-
sweeps, independent scalar reference encode checks, malformed-input
196+
copying to caller output. Node/V8, Wasmtime, Chromium-family browser, and
197+
Firefox/SpiderMonkey runtime smoke evidence proves active backend reporting,
198+
deterministic length sweeps, independent scalar reference encode checks, malformed-input
198199
rejection, and round trips for the admitted profile; this is not a
199200
browser-wide timing, register-retention, or cleanup guarantee. The
200201
release-facing decision is
@@ -279,8 +280,11 @@ compiles under `no_std` when the corresponding Rust targets are installed. For
279280
wasm `simd128`, it also builds the wasm test binaries with `simd128` enabled so
280281
the admitted fixed-block wasm code is checked; runtime execution is covered by
281282
`scripts/check_wasm_runtime_dispatch.sh` when Node/V8 and Wasmtime are
282-
installed, and by `scripts/check_wasm_browser_dispatch.sh` when a
283-
Chromium-family browser is installed.
283+
installed, by `scripts/check_wasm_browser_dispatch.sh` when a Chromium-family
284+
browser is installed, and by `scripts/check_wasm_browser_firefox_dispatch.sh`
285+
when Firefox plus `geckodriver` are installed. Safari/WebKit evidence can be
286+
gathered separately with `scripts/check_wasm_browser_safari_dispatch.sh` on
287+
macOS with Safari remote automation enabled.
284288

285289
Capture local backend and prototype evidence:
286290

docs/SIMD_ADMISSION.md

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -67,8 +67,8 @@ side-channel evidence package.
6767
For the `1.3.3` line, wasm `simd128` is admitted for runtime dispatch when the
6868
binary is compiled for `wasm32` with `target-feature=+simd128`, the `simd`
6969
feature, and the explicit `allow-wasm32-best-effort-wipe` feature. The
70-
admitted runtime profile is backed by Node/V8, Wasmtime, and Chromium-family
71-
browser runtime smoke evidence.
70+
admitted runtime profile is backed by Node/V8, Wasmtime, Chromium-family
71+
browser, and Firefox/SpiderMonkey runtime smoke evidence.
7272

7373
This is a narrow admission, not a browser-wide or runtime-universal claim.
7474
Wasm execution passes through runtime/JIT engines outside the crate's control,
@@ -77,6 +77,10 @@ limited to the evidence named in this release. Broader browser claims remain
7777
out of scope until separately evidenced. The wasm32 wipe policy remains
7878
fail-closed unless callers explicitly enable `allow-wasm32-best-effort-wipe`.
7979

80+
An optional Safari WebKit smoke script is available at
81+
`scripts/check_wasm_browser_safari_dispatch.sh`, but Safari is not part of the
82+
admitted release claim until its output is captured for a release candidate.
83+
8084
The detailed runtime decision is tracked in
8185
[WASM_SIMD128_RUNTIME_REVIEW.md](WASM_SIMD128_RUNTIME_REVIEW.md).
8286

@@ -124,7 +128,7 @@ State labels are intentionally strict:
124128
| AVX2 | admitted backend | `avx2` | std x86/x86_64 runtime-dispatched encode and strict decode for Standard and URL-safe alphabet families; encode uses fixed 24-byte input blocks, and decode uses fixed 32-byte encoded blocks only after whole-input scalar validation preserves public error shape; shorter inputs fall back to SSSE3/SSE4.1 or scalar, tails use scalar, and unsupported alphabets, in-place encode/decode, wrapped decode, legacy decode, CT secret decode, line-ending insertion, and `no_std` use scalar fallback |
125129
| SSSE3/SSE4.1 | admitted backend | `ssse3`, `sse4.1` | std x86/x86_64 runtime-dispatched encode and strict decode for Standard and URL-safe alphabet families; encode uses fixed 12-byte input blocks, and decode uses fixed 16-byte encoded blocks only after whole-input scalar validation preserves public error shape; shorter inputs, tails, unsupported alphabets, in-place encode/decode, wrapped decode, legacy decode, CT secret decode, line-ending insertion, and `no_std` use scalar fallback |
126130
| NEON | admitted backend | `neon` | little-endian std aarch64 runtime-dispatched encode and strict decode for Standard and URL-safe alphabet families; encode uses fixed 12-byte input blocks, and decode uses fixed 16-byte encoded blocks only after whole-input scalar validation preserves public error shape; shorter inputs, tails, unsupported alphabets, big-endian AArch64, 32-bit ARM, in-place encode/decode, wrapped decode, legacy decode, CT secret decode, line-ending insertion, and `no_std` use scalar fallback |
127-
| wasm `simd128` | admitted backend | `simd128` | wasm32 runtime-dispatched encode and strict decode for Standard and URL-safe alphabet families when compiled with `target-feature=+simd128`, the `simd` feature, and `allow-wasm32-best-effort-wipe`; wasm encode stages vector output and compares it against scalar output before copying to caller output; Node/V8, Wasmtime, and Chromium-family browser runtime smoke evidence proves active encode/decode reporting, a deterministic length sweep, independent scalar reference encode checks, malformed-input rejection, and round trips; shorter inputs, tails, unsupported alphabets, in-place encode/decode, wrapped decode, legacy decode, CT secret decode, line-ending insertion, and broader browser-specific claims remain scalar, out of scope, or separately reviewed |
131+
| wasm `simd128` | admitted backend | `simd128` | wasm32 runtime-dispatched encode and strict decode for Standard and URL-safe alphabet families when compiled with `target-feature=+simd128`, the `simd` feature, and `allow-wasm32-best-effort-wipe`; wasm encode stages vector output and compares it against scalar output before copying to caller output; Node/V8, Wasmtime, Chromium-family browser, and Firefox/SpiderMonkey runtime smoke evidence proves active encode/decode reporting, a deterministic length sweep, independent scalar reference encode checks, malformed-input rejection, and round trips; shorter inputs, tails, unsupported alphabets, in-place encode/decode, wrapped decode, legacy decode, CT secret decode, line-ending insertion, Safari/WebKit, and broader browser-specific claims remain scalar, out of scope, or separately reviewed |
128132

129133
## Encode Surface Review
130134

docs/UNSAFE.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1241,7 +1241,7 @@ Limitations:
12411241

12421242
- Wasm engines include a runtime/JIT optimization layer outside Rust's compiler
12431243
boundary. This admission is backed by Node/V8, Wasmtime, and
1244-
Chromium-family browser runtime smoke evidence for correctness and dispatch
1244+
Chromium-family browser and Firefox/SpiderMonkey runtime smoke evidence for correctness and dispatch
12451245
reporting, but it does not claim runtime timing, register-retention, or JIT
12461246
zeroization guarantees.
12471247

docs/WASM_SIMD128_RUNTIME_REVIEW.md

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,8 @@ The admitted runtime profile is intentionally narrow:
1717
- full fixed blocks use `simd128`; tails and unsupported surfaces use scalar
1818
- no line-wrapped decode, legacy whitespace decode, custom alphabets,
1919
bcrypt-style profiles, in-place decode, or `ct` secret decode
20-
- runtime smoke evidence is required for Node/V8, Wasmtime, and at least one
21-
Chromium-family browser
20+
- runtime smoke evidence is required for Node/V8, Wasmtime, at least one
21+
Chromium-family browser, and Firefox/SpiderMonkey
2222

2323
When compiled with `simd128`, active encode and decode backends are `wasm-simd128`
2424
on `wasm32`.
@@ -33,6 +33,11 @@ The admission is backed by:
3333
- `scripts/check_wasm_browser_dispatch.sh`, which executes the same smoke
3434
module in a Chromium-family browser through synchronous browser
3535
`WebAssembly.Module` instantiation.
36+
- `scripts/check_wasm_browser_firefox_dispatch.sh`, which executes the same
37+
smoke module in Firefox/SpiderMonkey through `geckodriver`.
38+
- `scripts/check_wasm_browser_safari_dispatch.sh`, which is an optional
39+
operator-run WebDriver evidence script for Safari WebKit. This script is not
40+
release-gated until its output is captured for a release candidate.
3641
- The smoke checks `runtime::backend_report()` and requires candidate, active
3742
encode, and active decode backend reporting to be `wasm-simd128`.
3843
- The smoke runs a deterministic length sweep from 0 through 200 bytes with
@@ -53,7 +58,8 @@ Wasm execution still includes a runtime or JIT layer outside the Rust compiler
5358
and outside this crate's control. This admission proves correctness and
5459
dispatch behavior for the named runtime smoke profile; it does not claim:
5560

56-
- browser-wide behavior beyond the named Chromium-family smoke runtime
61+
- browser-wide behavior beyond the named Chromium-family and
62+
Firefox/SpiderMonkey smoke runtimes
5763
- runtime/JIT timing behavior for every V8, SpiderMonkey, Wasmtime, Wasmer, or
5864
edge-compute deployment
5965
- hardware register-retention cleanup guarantees after the wasm runtime lowers
@@ -92,6 +98,13 @@ provide:
9298
- `scripts/check_wasm_browser_dispatch.sh` executes the same runtime smoke in
9399
a Chromium-family browser when Chrome/Chromium is installed or
94100
`BASE64_NG_BROWSER` points to a compatible browser binary.
101+
- `scripts/check_wasm_browser_firefox_dispatch.sh` executes the same runtime
102+
smoke through `geckodriver` when Firefox evidence is requested locally or in
103+
CI.
104+
- `scripts/check_wasm_browser_safari_dispatch.sh` executes the same runtime
105+
smoke through `safaridriver` when Safari remote automation is enabled on
106+
macOS. Safari remains optional evidence until captured for a release
107+
candidate.
95108
- `scripts/check_simd_feature_bundles.sh` keeps compile/test-binary evidence
96109
for `wasm32-unknown-unknown` with `target-feature=+simd128` when the target
97110
is installed.

release-notes/RELEASE_NOTES_1.3.3.md

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,11 @@ wasm `simd128` runtime-dispatch profile with explicit runtime smoke evidence.
1515
encode checks, malformed-input rejection, and public API round trips.
1616
- Added Chromium-family browser runtime smoke evidence for the same admitted
1717
wasm `simd128` profile.
18+
- Added Firefox/SpiderMonkey WebDriver runtime smoke evidence through
19+
`geckodriver` for the same admitted wasm `simd128` profile.
20+
- Added an optional Safari/WebKit WebDriver smoke script for macOS evidence
21+
gathering; Safari remains outside the admitted claim until its output is
22+
captured for a release candidate.
1823
- Added fail-closed scalar verification for wasm fixed-block encode before
1924
copying staged SIMD output to caller output.
2025
- Added release-gated wasm SIMD codegen evidence through
@@ -28,10 +33,11 @@ wasm `simd128` runtime-dispatch profile with explicit runtime smoke evidence.
2833

2934
## Security Notes
3035

31-
- Wasm `simd128` is admitted only for the named Node/V8, Wasmtime, and
32-
Chromium-family browser smoke profiles and the narrow Standard/URL-safe
33-
encode plus strict-decode surface.
34-
- Browser-wide behavior beyond the named Chromium-family runtime,
36+
- Wasm `simd128` is admitted only for the named Node/V8, Wasmtime,
37+
Chromium-family browser, and Firefox/SpiderMonkey smoke profiles and the
38+
narrow Standard/URL-safe encode plus strict-decode surface.
39+
- Browser-wide behavior beyond the named Chromium-family and
40+
Firefox/SpiderMonkey runtimes,
3541
runtime/JIT timing behavior, and performance claims remain out of scope
3642
until separately evidenced.
3743
- The default wasm cleanup policy remains fail-closed unless

0 commit comments

Comments
 (0)