@@ -146,7 +146,8 @@ __contract__(
146146 * - x4-batched version of `rej_uniform()` from the
147147 * reference implementation, leveraging x4-batched Keccak-f1600. */
148148MLK_INTERNAL_API
149- void mlk_poly_rej_uniform_x4 (mlk_poly * vec ,
149+ void mlk_poly_rej_uniform_x4 (mlk_poly * vec0 , mlk_poly * vec1 , mlk_poly * vec2 ,
150+ mlk_poly * vec3 ,
150151 uint8_t seed [4 ][MLK_ALIGN_UP (MLKEM_SYMBYTES + 2 )])
151152{
152153 /* Temporary buffers for XOF output before rejection sampling */
@@ -167,10 +168,10 @@ void mlk_poly_rej_uniform_x4(mlk_poly *vec,
167168 */
168169 mlk_xof_x4_squeezeblocks (buf , MLKEM_GEN_MATRIX_NBLOCKS , & statex );
169170 buflen = MLKEM_GEN_MATRIX_NBLOCKS * MLK_XOF_RATE ;
170- ctr [0 ] = mlk_rej_uniform (vec [ 0 ]. coeffs , MLKEM_N , 0 , buf [0 ], buflen );
171- ctr [1 ] = mlk_rej_uniform (vec [ 1 ]. coeffs , MLKEM_N , 0 , buf [1 ], buflen );
172- ctr [2 ] = mlk_rej_uniform (vec [ 2 ]. coeffs , MLKEM_N , 0 , buf [2 ], buflen );
173- ctr [3 ] = mlk_rej_uniform (vec [ 3 ]. coeffs , MLKEM_N , 0 , buf [3 ], buflen );
171+ ctr [0 ] = mlk_rej_uniform (vec0 -> coeffs , MLKEM_N , 0 , buf [0 ], buflen );
172+ ctr [1 ] = mlk_rej_uniform (vec1 -> coeffs , MLKEM_N , 0 , buf [1 ], buflen );
173+ ctr [2 ] = mlk_rej_uniform (vec2 -> coeffs , MLKEM_N , 0 , buf [2 ], buflen );
174+ ctr [3 ] = mlk_rej_uniform (vec3 -> coeffs , MLKEM_N , 0 , buf [3 ], buflen );
174175
175176 /*
176177 * So long as not all matrix entries have been generated, squeeze
@@ -180,20 +181,27 @@ void mlk_poly_rej_uniform_x4(mlk_poly *vec,
180181 while (ctr [0 ] < MLKEM_N || ctr [1 ] < MLKEM_N || ctr [2 ] < MLKEM_N ||
181182 ctr [3 ] < MLKEM_N )
182183 __loop__ (
183- assigns (ctr , statex , memory_slice (vec , sizeof (mlk_poly ) * 4 ), object_whole (buf [0 ]),
184- object_whole (buf [1 ]), object_whole (buf [2 ]), object_whole (buf [3 ]))
184+ assigns (ctr , statex ,
185+ memory_slice (vec0 , sizeof (mlk_poly )),
186+ memory_slice (vec1 , sizeof (mlk_poly )),
187+ memory_slice (vec2 , sizeof (mlk_poly )),
188+ memory_slice (vec3 , sizeof (mlk_poly )),
189+ object_whole (buf [0 ]),
190+ object_whole (buf [1 ]),
191+ object_whole (buf [2 ]),
192+ object_whole (buf [3 ]))
185193 invariant (ctr [0 ] <= MLKEM_N && ctr [1 ] <= MLKEM_N )
186194 invariant (ctr [2 ] <= MLKEM_N && ctr [3 ] <= MLKEM_N )
187- invariant (array_bound (vec [ 0 ]. coeffs , 0 , ctr [0 ], 0 , MLKEM_Q ))
188- invariant (array_bound (vec [ 1 ]. coeffs , 0 , ctr [1 ], 0 , MLKEM_Q ))
189- invariant (array_bound (vec [ 2 ]. coeffs , 0 , ctr [2 ], 0 , MLKEM_Q ))
190- invariant (array_bound (vec [ 3 ]. coeffs , 0 , ctr [3 ], 0 , MLKEM_Q )))
195+ invariant (array_bound (vec0 -> coeffs , 0 , ctr [0 ], 0 , MLKEM_Q ))
196+ invariant (array_bound (vec1 -> coeffs , 0 , ctr [1 ], 0 , MLKEM_Q ))
197+ invariant (array_bound (vec2 -> coeffs , 0 , ctr [2 ], 0 , MLKEM_Q ))
198+ invariant (array_bound (vec3 -> coeffs , 0 , ctr [3 ], 0 , MLKEM_Q )))
191199 {
192200 mlk_xof_x4_squeezeblocks (buf , 1 , & statex );
193- ctr [0 ] = mlk_rej_uniform (vec [ 0 ]. coeffs , MLKEM_N , ctr [0 ], buf [0 ], buflen );
194- ctr [1 ] = mlk_rej_uniform (vec [ 1 ]. coeffs , MLKEM_N , ctr [1 ], buf [1 ], buflen );
195- ctr [2 ] = mlk_rej_uniform (vec [ 2 ]. coeffs , MLKEM_N , ctr [2 ], buf [2 ], buflen );
196- ctr [3 ] = mlk_rej_uniform (vec [ 3 ]. coeffs , MLKEM_N , ctr [3 ], buf [3 ], buflen );
201+ ctr [0 ] = mlk_rej_uniform (vec0 -> coeffs , MLKEM_N , ctr [0 ], buf [0 ], buflen );
202+ ctr [1 ] = mlk_rej_uniform (vec1 -> coeffs , MLKEM_N , ctr [1 ], buf [1 ], buflen );
203+ ctr [2 ] = mlk_rej_uniform (vec2 -> coeffs , MLKEM_N , ctr [2 ], buf [2 ], buflen );
204+ ctr [3 ] = mlk_rej_uniform (vec3 -> coeffs , MLKEM_N , ctr [3 ], buf [3 ], buflen );
197205 }
198206
199207 mlk_xof_x4_release (& statex );
0 commit comments