Skip to content

docs: confirm U64E comb 48 MHz point at n=6 — 18.39 s median - #64

Merged
JC-000 merged 1 commit into
masterfrom
bench/u64e-comb48-n6
Jul 26, 2026
Merged

docs: confirm U64E comb 48 MHz point at n=6 — 18.39 s median#64
JC-000 merged 1 commit into
masterfrom
bench/u64e-comb48-n6

Conversation

@JC-000

@JC-000JC-000 commented Jul 26, 2026

Copy link
Copy Markdown
Owner

Summary

Follow-up to #63, resolving the flagged caveat on the comb-profile 48 MHz point. Reran bench_ecdsa_u64e.py on the U64E (comb build at HEAD, boot-at-48, ECDSA_REPEATS=6): 20 runs, all correctness-PASS.

  • Median 18.39 s, spread 18.31–18.45 s (±0.4%), consistent across all three positive vectors — the original n=2 value of 18.4 s was accurate.
  • The +12% delta vs the C64U's recorded 16.5 s at 48 MHz is therefore not U64E-side noise. CLAUDE.md caveat updated: the remaining uncertainty is the C64U's 16.5 s, itself an n=2 measurement.

Also: P-384 doc-drift correction (second commit)

While closing stale issues #32/#45 it emerged that CLAUDE.md's three P-384 references still described the v0.3.0-era failure (unresolved ec_base384_x/y at link). Verified at the v0.6.0 pin: both make p384-overlay and make BACKEND=uci USE_OVERLAY_P384_EMBED=1 now fail earlier, at the ar65 staging step in tools/integration/build_nistcurves_p384.sh (upstream layout drift). The Crypto ABI paragraph, Known-issues entry, and P-384 wall-clock section now describe the current failure chain, record the #32/#45 closures, and mark the P-384 wall-clock as unmeasurable until the build is fixed.

Test plan

  • 20 hardware runs on U64E (DeviceLock-queued), 18 positive + 2 tampered, all returned expected verify results
  • Both P-384 build targets exercised at HEAD to confirm the documented failure mode

🤖 Generated with Claude Code

Rerun of the flagged single-point measurement from the 2026-07-25
U64E sweep: comb profile, 48 MHz only, n=6 per positive vector
(20 runs total, all correctness-PASS). Median 18.39 s, spread
18.31-18.45 s (±0.4%) across all three positive vectors — the U64E
number is solid, so the +12%-vs-C64U delta at 48 MHz is not U64E
measurement noise. Residual uncertainty moves to the C64U's 16.5 s
(itself n=2).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@JC-000
JC-000 merged commit 1c0ebaf into masterJul 26, 2026
JC-000 added a commit that referenced this pull request Aug 13, 2026
…roup
tools/test_x25519.py reported "RESULTS: 71/71 passed, 0/71 failed" while
skipping both RFC 7748 scalarmult vectors. Those two are the only
end-to-end x25519_scalarmult coverage in the file — everything else in
the 71 is field arithmetic — so the default invocation certified a clean
pass without ever multiplying a scalar. Skipped groups were never added
to test_groups, so they left the denominator entirely and the counters
could not express the gap. Same skip-as-pass shape as audit finding F3
(credit: Lane C confirmed the mechanism independently).
The gate's justification was a "~100 min each" comment. Measured under
VICE warp on the in-tree ip65 build:
full suite with both vectors 37.9 s
full suite without them 4.8 s
~16.5 s per vector — the comment was off by a factor of ~360, and the
gate was buying 33 seconds while hiding the only test that matters.
So both halves:
- The vectors now run BY DEFAULT. `--fast` skips them; `--slow` is
kept as an accepted no-op so existing invocations don't break.
- Any skipped group is recorded and named in the verdict:
RESULTS: 71/71 passed, 0/71 failed -- 2 group(s) SKIPPED: \
x25519 RFC 7748 vector 1, x25519 RFC 7748 vector 2
WARNING: end-to-end x25519_scalarmult coverage did NOT run; \
this run does not certify X25519.
An unqualified clean pass is no longer printable over a group that
did not run.
Exit code is unchanged (0 iff nothing failed): unlike F3's missing-label
case, `--fast` is an explicit operator choice, so it is not an error —
but it can no longer be a silent one.
run_tests now returns (passed, failed, skipped_groups).
tools/run_all_tests.py is the only in-tree importer; it unpacks the third
value and raises if it is ever non-empty, so a future gate cannot quietly
drop coverage from the aggregate verdict. That run gains the vectors too:
x25519 72/72 -> 73/73, aggregate 255/255, +34.8 s for the suite.
Also corrected in passing: the vectors were labelled "RFC 7748 Section
6.1" but are the §5.2 scalarmult vectors (§6.1 is the Alice/Bob DH pair),
and U_2 ends 0x93 — bit 255 set — which makes vector 2 the
decodeUCoordinate MSB regression test that catches upstream c64-x25519
#64, the bug live in our pinned libs/x25519 v0.6.0. Noted at the vectors
so nobody drops it as redundant.
Verified:
default -> 73/73, both vectors PASS, 38.2 s
--fast -> 71/71 + both groups named + warning
--slow -> 73/73 (back-compat no-op)
run_all_tests.py --skip-slow -> x25519 73/73, TOTAL 255/255
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@JC-000