lowram: Per-row t0/t1 computation in keygen #1030
Open
mkannwischer wants to merge 3 commits intomainfrom
Open
Conversation
Replace the row-level matrix buffer (mld_polyvecl) with a single-poly buffer in REDUCE_RAM mode. In the lazy path, matrix elements A[k][l] are sampled on demand one at a time, and the matrix-vector product accumulates element-by-element instead of row-by-row. Restructure polymat into eager/lazy variants following the same pattern as s1hat/s2hat/t0hat: - mld_polymat_eager: stores full K x L matrix - mld_polymat_lazy: stores rho + single poly_buffer + tmp - mld_polyvec_matrix_expand_eager/_lazy: separate implementations - mld_polyvec_matrix_pointwise_montgomery_eager/_lazy: separate implementations with CBMC contracts only on the eager variants Move all polymat-related code from polyvec.h/polyvec.c into polyvec_lazy.h/polyvec_lazy.c. Signed-off-by: Matthias J. Kannwischer <matthias@zerorisc.com>
Reuse t0 as the accumulator in mld_compute_t0_t1_tr_from_sk_components, and have the caller provide s1 already in NTT form, removing two allocations (s1hat and t) from the helper. In mld_sign_keypair_internal, share the s1 and t1 buffers via a union since s1hat is consumed before t1 is produced. Pack s1 into the secret key before the in-place NTT so the original coefficients are preserved. Split mld_pack_sk into mld_pack_sk_s1 and mld_pack_sk_rho_key_tr_s2_t0 to support packing s1 independently before the NTT. Signed-off-by: Matthias J. Kannwischer <matthias@zerorisc.com>
6d4e630 to
62a104b
Compare
Replace mld_compute_t0_t1_tr_from_sk_components with the per-row mld_compute_t0k_t1k. Both keygen and pk_from_sk now process one row at a time, packing t1[k] into pk and t0[k] into sk immediately, which eliminates the full polyveck allocations for t0 and t1. To express this cleanly, refactor mld_polyvecl_pointwise_acc_montgomery to take (mat, k, v) instead of (u, v) and move it into polyvec_lazy with eager and lazy variants. Add per-row pack helpers mld_pack_sk_t0 / mld_pack_pk_t1, and split mld_pack_sk_rho_key_tr_s2_t0 to drop the t0 packing. Drop now-dead mld_polyveck_add, mld_polyveck_pack_t0, mld_polyveck_power2round and mld_pack_pk along with their CBMC proofs. Update the affected CBMC proofs. Signed-off-by: Matthias J. Kannwischer <matthias@zerorisc.com>
62a104b to
c9509d5
Compare
Contributor
CBMC Results (ML-DSA-44)
Full Results (182 proofs)
|
Contributor
CBMC Results (ML-DSA-87)
Full Results (182 proofs)
|
Contributor
CBMC Results (ML-DSA-65)
Full Results (182 proofs)
|
Contributor
Author
|
CBMC proof performance will still need investigation, but I'll do that after the other PRs have been merged. |
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.
Replace mld_compute_t0_t1_tr_from_sk_components with the per-row
mld_compute_t0k_t1k. Both keygen and pk_from_sk now process one
row at a time, packing t1[k] into pk and t0[k] into sk immediately,
which eliminates the full polyveck allocations for t0 and t1.
To express this cleanly, refactor mld_polyvecl_pointwise_acc_montgomery
to take (mat, k, v) instead of (u, v) and move it into polyvec_lazy
with eager and lazy variants. Add per-row pack helpers
mld_pack_sk_t0 / mld_pack_pk_t1, and split mld_pack_sk_rho_key_tr_s2_t0
to drop the t0 packing.
Drop now-dead mld_polyveck_add, mld_polyveck_pack_t0,
mld_polyveck_power2round and mld_pack_pk along with their CBMC proofs.
Update the affected CBMC proofs.