Fix ML-KEM constant-time validation regression https://boringssl-review.googlesource.com/c/boringssl/+/92828 declassified the result of (s0 | s1) >= kPrime, but that is not the same as s0 >= kPrime || s1 >= kPrime. Instead, just write this more straightforwardly. Change-Id: I68e12a38d074db754daf46d60bb061d80a95f2da Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/98108 Auto-Submit: David Benjamin <davidben@google.com> Commit-Queue: Xiangfei Ding <xfding@google.com> Presubmit-BoringSSL-Verified: boringssl-scoped@luci-project-accounts.iam.gserviceaccount.com <boringssl-scoped@luci-project-accounts.iam.gserviceaccount.com> Reviewed-by: Xiangfei Ding <xfding@google.com>
diff --git a/crypto/fipsmodule/mlkem/mlkem.cc.inc b/crypto/fipsmodule/mlkem/mlkem.cc.inc index a73d5d9..6c84160 100644 --- a/crypto/fipsmodule/mlkem/mlkem.cc.inc +++ b/crypto/fipsmodule/mlkem/mlkem.cc.inc
@@ -741,10 +741,11 @@ for (int i = 0; i < DEGREE; i += 2) { uint16_t s0 = (uint16_t)(in[0] | ((in[1] & 0x0f) << 8)); uint16_t s1 = (uint16_t)((in[1] >> 4) | (in[2] << 4)); - if (constant_time_declassify_int((s0 | s1) >= kPrime)) { - if (s0 >= kPrime || s1 >= kPrime) { - return 0; - } + // This is only used with secret input when parsing the test-only + // semi-expanded format. Leaking information about invalid inputs is OK. + if (constant_time_declassify_int(s0 >= kPrime) || + constant_time_declassify_int(s1 >= kPrime)) { + return 0; } out->c[i] = s0; out->c[i + 1] = s1;