Repository navigation
Conversation
P-521's sixteen entries of four-bit windows do not fit the working space past the tables of bits, so its windows take three bits (Impl/Ecdsa/PPC64LE/Window3.lean): a table of [e]P for e < 8, then for each of the 176 windows three Jacobian doublings and one complete addition of the entry selected by a constant-time scan. The proof is P-256's (Proof/Ecdsa/PPC64LE/P256/Window.lean) on P-521's field and nine-word layout. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01TKUFHH4GefHP3pmPRSL4N4
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01TKUFHH4GefHP3pmPRSL4N4
brainpoolP512r1's sixteen entries of four-bit windows (192 bytes each) do not fit the working space past the tables of bits, so its windows take three bits, as P-521's do (Window3.lean), with the complete addition and the Jacobian doubling for any a (rcb, dblJa), as brainpoolP384r1's four-bit windows do (WindowA.lean): Impl/Ecdsa/PPC64LE/Window3A.lean. The scalar's 512 bits are 170 windows and two bits above them: a 171st window from R = O would read a bit past the table of bits (the first bit of the table of p - 2's). So R starts at the entry of the top two bits (mul3top), and the 170 windows below them follow. The proof is P-521's on brainpoolP512r1's field and eight-word layout, with the doublings and the addition for any a. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01TKUFHFbSpgWBYWAsEnfUks
Regenerated with the full emitter on #4722. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01TKUFHFbSpgWBYWAsEnfUks
|
Rust: lints (library) (and the Lean emit check) fail here because of #4722, not this PR. #4722's Generated by Claude Code |
|
This pull request has conflicts with Posted by |
|
Replaced by the PR for Generated by Claude Code |
Part of #4141 (the PPC64LE audit, finding 1). Stacked on #4722 (P-521 ECDH, three-bit windows), so it stays a draft until #4722 merges. It replaces #4763 (and #4761 before it), restacked onto #4722's latest head (
5f5d77cc). That head takesZ^(p-2)by #4762's addition chain, so this PR'swin_mulPowOkdoes too, the same change #4722 made for P-521.Known red until #4722 is fixed: #4722's committed
ecdh_p521.rsstill declares P-521's internal field modules thatec_p521.rsalready declares since #4762. The full emitter on #4722's head regeneratesecdh_p521.rswithout them. I've left that file to #4722 and told its session. Any failure in that file or its clippy run is #4722's, not this PR's.vg_ecdh_brainpoolp512r1on PPC64LE computed[d]Pwith the Montgomery ladder. It now uses three-bit windows with the formulas for anya.Why three bits, and why start from the top two bits
R = Owould read bit 512 in its top window. That is one byte past the table of bits, the first entry of the next table (p − 2's bits, whichMulPowOkstill provides), which is 1. Instead,Rstarts at the table's entry for the top two bits (top2, then the usual masked scan, thenR = D), and the 170 windows below follow.What changes
Impl/Ecdsa/PPC64LE/Window3A.lean(new):build3,trip,step3andmul3top.a(rcbwithaatAPand3batB3P;dblJa).Window.Cfg.entry,select3andscanEntry.r3plus a constant (plus3 jfor a window's bits).Proof/Ecdsa/PPC64LE/BrainpoolP512r1/Window.lean(new):mul_ok, which provesR = [k]Pfor everyk < 2^512.asteps (InvJ.dblA',Rep.add).top2_okandtop2_eqfor the start, whereRholds[k >>> 510]Q, which is the windows' invariant atj = 170.Impl/Ecdh/BrainpoolP512r1/PPC64LE.lean:exchangeWithwithWindowA.Cfg.mul3top … B3P.Proof/Ecdh/PPC64LE/BrainpoolP512r1/Verified.lean:win_mulPowOk, as PPC64LE P-521 ECDH: [d]P by three-bit windows #4722's P-521 one:Z^(p-2)by the addition chain (chainPow_ok);3bfromFixed(F'.b3p);VerifiedthroughexchangeWith_ok, with constant time checked bytaint_decideon the new literal.No TCB, Spec or Rust change. The only crate change is
ecdh_brainpoolp512r1.rsand its assembly.Testing
lake buildandEmit.leanpass on PPC64LE P-521 ECDH: [d]P by three-bit windows #4722's head with this PR. The emitter's output forecdh_brainpoolp512r1is committed. The one other file it changes,ecdh_p521.rs, is left to PPC64LE P-521 ECDH: [d]P by three-bit windows #4722, as above.Benchmark
Benchmarks run 42529524175, on #4761's branch, the same windows before the addition chain. It used
arches=powerpc64,modules=ecdh_brainpoolp512r1, and basebd7184fc(mainwith the ladder and the old power):ecdh_brainpoolp512r1/64Generated by Claude Code