A timing side-channel was discovered in the Decompose algorithm which is used during ML-DSA signing to generate hints for the signature.
The analysis was performed using a constant-time analyzer that examines compiled assembly code for instructions with data-dependent timing behavior. The analyzer flags:
The decompose function used a hardware division instruction to compute r1.0 / TwoGamma2::U32. This function is called during signing through high_bits() and low_bits(), which process values derived from secret key components:
(&w - &cs2).low_bits() where cs2 is derived from secret key component s2Hint::new() calls high_bits() on values derived from secret key component t0Original Code:
fn decompose<TwoGamma2: Unsigned>(self) -> (Elem, Elem) {
// ...
let mut r1 = r_plus - r0;
r1.0 /= TwoGamma2::U32; // Variable-time division on secret-derived data
(r1, r0)
}
The dividend (r1.0) is derived from secret key material. An attacker with precise timing measurements could extract information about the signing key by observing timing variations in the division operation.
Integer division was replaced with a constant-time Barrett reduction.
{
"license": "CC-BY-4.0"
}