Confidence: medium · Effort: medium (1-3 d)
Problem
The KPA pre-filter macros KPA_PREFILTER_A/B (bruteforce.cu:213-246) call kpa_silence_check_dev once per d_const_silence_idx entry. Each check internally does a fresh rc4_ksa9_dev + full rc4_discard_dev(256) for every candidate key — even when multiple silence indices fall inside the same superframe and could share one KSA setup.
Files: src/bruteforce.cu:213-246 (macros), src/bruteforce.cu:865-880 (caller — ILP-2 kernel superframe loop)
Suggested fix
When d_const_n_silence > 1, group silence indices by their superframe (idx / 6) so a single KSA + discard serves all silence checks within the same superframe. Could be done by sorting silence_idx[] at upload time and amortizing inside kpa_silence_check_dev.
Why it matters
KPA pre-filter is on the hot path before any wrong-key rejection. Each saved KSA is ~256 S-box swaps × N silence indices × N keys.
Confidence: medium · Effort: medium (1-3 d)
Problem
The KPA pre-filter macros
KPA_PREFILTER_A/B(bruteforce.cu:213-246) callkpa_silence_check_devonce perd_const_silence_idxentry. Each check internally does a freshrc4_ksa9_dev+ fullrc4_discard_dev(256)for every candidate key — even when multiple silence indices fall inside the same superframe and could share one KSA setup.Files:
src/bruteforce.cu:213-246(macros),src/bruteforce.cu:865-880(caller — ILP-2 kernel superframe loop)Suggested fix
When
d_const_n_silence > 1, group silence indices by their superframe (idx / 6) so a single KSA + discard serves all silence checks within the same superframe. Could be done by sortingsilence_idx[]at upload time and amortizing insidekpa_silence_check_dev.Why it matters
KPA pre-filter is on the hot path before any wrong-key rejection. Each saved KSA is ~256 S-box swaps × N silence indices × N keys.