Skip to content

fix(fiat-shamir): rejection-sample in sample_in_range to remove truncation bias#257

Open
lau90eth wants to merge 1 commit into
leanEthereum:mainfrom
lau90eth:fix/184-sample-in-range-bias
Open

fix(fiat-shamir): rejection-sample in sample_in_range to remove truncation bias#257
lau90eth wants to merge 1 commit into
leanEthereum:mainfrom
lau90eth:fix/184-sample-in-range-bias

Conversation

@lau90eth

@lau90eth lau90eth commented Jul 5, 2026

Copy link
Copy Markdown

Description

sample_in_range() truncated field elements via bitmask, which biases the output whenever the field modulus is not an exact multiple of 2^bits (as already noted in the function's own doc comment).

This replaces truncation with rejection sampling: field elements landing in the partial overflow block above the largest multiple of 2^bits are dropped and resampled, giving an exactly uniform distribution over [0, 2^bits) regardless of the modulus.

Related Issues

Closes #184

Testing

Added a statistical regression test (sample_in_range_is_not_biased_toward_low_residues) verifying the low bits of accepted samples are close to uniform across 200k samples.

Sign up for free to 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.

Biased sampling by truncation may weaken soundness security

1 participant