@@ -146,7 +146,8 @@ __contract__(
146
146
* - x4-batched version of `rej_uniform()` from the
147
147
* reference implementation, leveraging x4-batched Keccak-f1600. */
148
148
MLK_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 ,
150
151
uint8_t seed [4 ][MLK_ALIGN_UP (MLKEM_SYMBYTES + 2 )])
151
152
{
152
153
/* Temporary buffers for XOF output before rejection sampling */
@@ -167,10 +168,10 @@ void mlk_poly_rej_uniform_x4(mlk_poly *vec,
167
168
*/
168
169
mlk_xof_x4_squeezeblocks (buf , MLKEM_GEN_MATRIX_NBLOCKS , & statex );
169
170
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 );
174
175
175
176
/*
176
177
* So long as not all matrix entries have been generated, squeeze
@@ -180,20 +181,27 @@ void mlk_poly_rej_uniform_x4(mlk_poly *vec,
180
181
while (ctr [0 ] < MLKEM_N || ctr [1 ] < MLKEM_N || ctr [2 ] < MLKEM_N ||
181
182
ctr [3 ] < MLKEM_N )
182
183
__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 ]))
185
193
invariant (ctr [0 ] <= MLKEM_N && ctr [1 ] <= MLKEM_N )
186
194
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 )))
191
199
{
192
200
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 );
197
205
}
198
206
199
207
mlk_xof_x4_release (& statex );
0 commit comments