Repository navigation
Release v0.6.0: post-quantum hybrid key exchange on the UCI products - #316
Merged
Merged
Conversation
…est text, README) Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…e notes draft Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…UIRE_KEX in decide_exit, SHA256SUMS script Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…PQ_DUMP tolerates classic images Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…, sums script checks M3 files and is executable, kex message, notes) Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
JC-000
marked this pull request as ready for review
October 18, 2026 05:06
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Stacked on #315 (base =
feat/pqc-p5-hybrid-keyschedule; retarget to master after #315 merges). Not tagged, no GitHub release created. Release notes draft:docs/release-notes-v0.6.0.md(the evidence below is in it too).What changes
tools/package/_common.sh:PQ_HYBRID=1inuci-onchipanduci-comb; guidance text;build_prgs.sh,write_manifest.sh(incl. the demo-only/not-secure note next to the hybrid, and the corrected block arithmetic: 186+186+202 = 574 fits one disk, the split is deliberate), README (version, product table, make args, architecture/key-exchange/memory-map/checklist/related-projects now describe 11EC then 001D, c64-mlkem, the PQ memory layout; a plain "what the hybrid protects" paragraph: key exchange only, authentication still classical P-256 + TOFU, weak-DRBG caveat, no "quantum-safe" wording).tools/package/write_release_sums.sh: generates the top-levelSHA256SUMSfrom dist/ + the M3 assets (refuses a missing file, verifies its own output).tools/uci/rig_https_banner.py+tools/http_body_checks.py:REQUIRE_KEXis now part ofdecide_exit(newcheck_kex_groupverdict,parse_require_kexvalidated before the device is touched, the report line and the final verdict agree, an unreadable group is a FAIL not a skip, a failedtls_kex_groupread is non-fatal until then); hardware-free red cases intest_http_body_checks_unit.py(21/21);tools/mutate_http_body_checks.py95/95 caught (5 new mutants, 2 anchors updated). The boot-wait message says "comb boot precompute" only on comb images.rig_https_local.py: PQ_DUMP tolerates classic images; diag prints.PQ_HYBRID=1and that no classic UCI image ships.Release PRGs (
make packagerc=0;make package-verify14/14 RELEASE ARTIFACTS VERIFIED;test_package_verify41/41,test_trust_release_guard24/24, bare pytest 511 passed)TRUST_RELEASE=1)BACKEND=ip65 USE_NISTCURVES_ONCHIP=1e69bfce7b552e765df02cb253b4ff12cecaca3e978669376b7af5ffad9343dceBACKEND=uci USE_NISTCURVES_ONCHIP=1 TRUST_STORE=1 PQ_HYBRID=13b4dd718cbdc296f2083c90ce4d89a25e1fbd032e849c66f25227ef4d0ac4d5aBACKEND=uci USE_NISTCURVES_ONCHIP_COMB=1 TRUST_STORE=1 PQ_HYBRID=141202de9fa6b9da769fce87a3223e7d1c74630f873b4b64a940afacddb7cbeb630c5ba3974eed49a248e0041c1bf1e3e2e9584d772c710b086f50dc18a840e3870356cd1a7334c009ac37641d6cc7f4954550fa9d530e0ab913dda7a2b5d2302293883c77a30364674425a17b3121a1adab08d21d4e2f7f8c72362e494916faaae2cc5b7d40190ddfc911cb40e7a7d62e406c134f304b3fe9e2f04ea540ff498write_release_sums.shover dist/ + the v0.5.1 M3 assets: 13 assets verified. Margins at the release builds: uci-onchip LOADER 157 / NET_CODE 105 / CRYPTO_OVERLAY 372 / CRYPTO_HOT 196; uci-comb LOADER 342 / NET_CODE 134 / CRYPTO_OVERLAY 55 / CRYPTO_HOT 379.ip65-onchip is NOT the v0.5.1 binary (disclosed in the notes)
v0.5.1
810f1158…->1c377d34…at #311 (link order) ->e69bfce7…from #312 (rebuilt at ded2247, f08ddd9, 7b1ed07, 10ccf25, 4e45a9b, same release args). #312 added the HRR check to the ip65 ServerHello parser and changed the shared ClientHello builder. VICE e2e PASS (2026-10-18):tests/rig_vice_https_macos.py,E2E_PROFILE=onchip E2E_NO_WARP=1, patched pcap VICE 3.10 x64sc, feth/pcap rig, honest 1 MHz: handshake + GET in 2,328 s wall,http_status=200, bodyTLS13 OK FROM C64 TEST(22 B). Image:make BACKEND=ip65 USE_NISTCURVES_ONCHIP=1 TRUST_RELEASE=1 HTTPS_PORT=24530=9b1ef4b1582242ef0820a33499c60f1f6a69db803f45de6431451fe34a4c7463, which differs from the release PRGe69bfce7…in exactly 4 bytes (the two HTTPS_PORT words, 443 vs 24530, each stored twice). Phases afterG: TCP connected +3 s, CH +475 s, SH +931 s, PROC +950 s, last flight record +2,266 s, Finished +2,269 s, request +2,287 s, closed +2,293 s. Not covered: real RR-Net silicon, name validation (none on ip65), speeds above 1 MHz. The 3 PRG + 3 d64 release hashes are unchanged (e69bfce7…,3b4dd718…,41202de9…;30c5ba39…,70356cd1…,293883c7…).Cost of PQ, measured properly (U64E 48 MHz, local OpenSSL listener, release args + HTTPS_SNI, SYS trigger to client Finished, 0.5 s poll, n=3)
The earlier "+1.7 s" compared hybrid vs X25519 on the SAME PQ image (both pay KeyGen); withdrawn everywhere.
PQ_HYBRIDoff)PQ_DUMPread PQ-only labels, since fixed; CFIN and the sentinel were reached.)Wikipedia on hardware, exact release PRGs (
rig_https_banner.py,REQUIRE_KEX=EC, real/USB1/TRUST.A|B, no key-change prompt)set_reu(False), restored to Enabled/16 MB afterwards)BACKEND=uci USE_NISTCURVES_ONCHIP_COMB=1 TRUST_STORE=1 TRUST_RELEASE=1on this tree,PQ_HYBRIDoff (fee4d5b1)Other validation
boot_check.pyPASS on both release PRGs.rig_https_local.pyvs OpenSSL 3.6.5 (release args +HTTPS_SNI=www.foo.invalid, since the rig dials an IP): onchip and comb,-groups X25519MLKEM768PASS ($EC, oracle MATCH),-groups X25519PASS ($1D).TRUST_STORE_DIR=/USB1/c64https-test HTTPS_PORT=24520(onchipa0d26e3d…, combe8adb55d…):rig_trust_store.pyexit 0 on both (24 / 25 checks, 0 failures);rig_trust_policy.py(first-use record, matching key, changed-key prompt, accept-on-retry, UNPINNED override) exit 0 on both, 30 passed, 0 failed each. Real/USB1/TRUST.A|B(80 B / 144 B) unchanged afterwards. The policy rig's Python listener can only pick X25519 (0x001D); live mode needs the REU demo (does not link with PQ), not run.BACKEND=uci run_all_tests.py455/455 with 2 accounted skips — that aggregate is the non-PQ REU profile; no VICE suite runs the release images (covered by package-verify's boot, the hardware runs, and the PQ suites).916d4162…byte for byte;build_m3_demo.shnot used, no provenance re-written).Review round 2 nits (docs/tooling only; the 3 PRG and 3 .d64 hashes above rebuilt identical)
CLAUDE.md live-server wording (onchip has Wikipedia runs); README diagram border (box restored, a sentence under it names ML-KEM-768); MANIFEST has one demo-only/not-secure disclaimer at the top; the notes' cost table states the differing server
-groups;write_release_sums.shheader matches the code, also verifies the M3 PRG/.d64/README against the M3 checksum file (a corrupted M3 PRG makes it exit 1), and is mode 100755; notes intro lists #303 and #310 once;pq_keylog_check.pyprintsn/ainstead of$:on classic images (new test, 12/12); the banner rig comment says REQUIRE_KEX is adecide_exitverdict. The notes also disclose that first-use / changed-key trust paths ran on the PQ images with X25519 fetches only (KeyGen and the dk in the ring still ran); with 11EC only the known-key path has run. Bare pytest 512 passed,test_package_verify41/41.Review round 1 items addressed
SF1 README PQ sections; SF2 cost re-measured; SF3 "nothing differs" removed, classic UCI build instructions added; SF4 what PQ protects; SF5 ip65 disclosure; SF6 trust store rigs; SF7 d64 hashes, full asset list, rename-README instruction, SHA256SUMS script; SF8 REQUIRE_KEX in
decide_exit; SF9 #211 closed; SF10 C64U findings carried forward. NITs: block-count text, demo-only note, control relabelled, #311-#315 listed, single-record SH symptom (tls_sh_err=$0E, not on screen) and Cloudflare/BoringSSL out of scope, CLAUDE.md packaging list, REU-disabled onchip run, non-fatal kex read, boot-message fix.🤖 Generated with Claude Code