@@ -43,6 +43,7 @@ void mld_poly_pointwise_montgomery_c(mld_poly *c, const mld_poly *a,
4343 const mld_poly * b );
4444void mld_polyvecl_pointwise_acc_montgomery_c (mld_poly * w , const mld_polyvecl * u ,
4545 const mld_polyvecl * v );
46+ void mld_polyz_unpack_c (mld_poly * r , const uint8_t a [MLDSA_POLYZ_PACKEDBYTES ]);
4647#if defined(MLD_USE_NATIVE_NTT ) || defined(MLD_USE_NATIVE_INTT ) || \
4748 defined(MLD_USE_NATIVE_POLY_DECOMPOSE_32 ) || \
4849 defined(MLD_USE_NATIVE_POLY_DECOMPOSE_88 ) || \
@@ -53,7 +54,9 @@ void mld_polyvecl_pointwise_acc_montgomery_c(mld_poly *w, const mld_polyvecl *u,
5354 defined(MLD_USE_NATIVE_POINTWISE_MONTGOMERY ) || \
5455 defined(MLD_USE_NATIVE_POLYVECL_POINTWISE_ACC_MONTGOMERY_L4 ) || \
5556 defined(MLD_USE_NATIVE_POLYVECL_POINTWISE_ACC_MONTGOMERY_L5 ) || \
56- defined(MLD_USE_NATIVE_POLYVECL_POINTWISE_ACC_MONTGOMERY_L7 )
57+ defined(MLD_USE_NATIVE_POLYVECL_POINTWISE_ACC_MONTGOMERY_L7 ) || \
58+ defined(MLD_USE_NATIVE_POLYZ_UNPACK_17 ) || \
59+ defined(MLD_USE_NATIVE_POLYZ_UNPACK_19 )
5760/* Backend unit test helper functions */
5861static void print_i32_array (const char * label , const int32_t * array , size_t len )
5962{
@@ -481,6 +484,41 @@ static int test_native_polyvecl_pointwise_acc_montgomery(void)
481484 MLD_USE_NATIVE_POLYVECL_POINTWISE_ACC_MONTGOMERY_L7 */
482485
483486
487+ #if defined(MLD_USE_NATIVE_POLYZ_UNPACK_17 ) || \
488+ defined(MLD_USE_NATIVE_POLYZ_UNPACK_19 )
489+ static int test_mld_polyz_unpack_core (const uint8_t * input ,
490+ const char * test_name )
491+ {
492+ mld_poly test_poly , ref_poly ;
493+
494+ mld_polyz_unpack (& test_poly , input );
495+ mld_polyz_unpack_c (& ref_poly , input );
496+
497+ CHECK (compare_i32_arrays (test_poly .coeffs , ref_poly .coeffs , MLDSA_N ,
498+ test_name , NULL ));
499+ return 0 ;
500+ }
501+
502+ static int test_native_polyz_unpack (void )
503+ {
504+ uint8_t test_bytes [MLDSA_POLYZ_PACKEDBYTES ];
505+ int i ;
506+
507+ memset (test_bytes , 0 , MLDSA_POLYZ_PACKEDBYTES );
508+ CHECK (test_mld_polyz_unpack_core (test_bytes , "polyz_unpack_zeros" ) == 0 );
509+
510+
511+ for (i = 0 ; i < NUM_RANDOM_TESTS ; i ++ )
512+ {
513+ randombytes (test_bytes , MLDSA_POLYZ_PACKEDBYTES );
514+ CHECK (test_mld_polyz_unpack_core (test_bytes , "polyz_unpack_random" ) == 0 );
515+ }
516+
517+ return 0 ;
518+ }
519+ #endif /* MLD_USE_NATIVE_POLYZ_UNPACK_17 || MLD_USE_NATIVE_POLYZ_UNPACK_19 */
520+
521+
484522static int test_backend_units (void )
485523{
486524 /* Set fixed seed for reproducible tests */
@@ -523,6 +561,11 @@ static int test_backend_units(void)
523561 CHECK (test_native_polyvecl_pointwise_acc_montgomery () == 0 );
524562#endif
525563
564+ #if defined(MLD_USE_NATIVE_POLYZ_UNPACK_17 ) || \
565+ defined(MLD_USE_NATIVE_POLYZ_UNPACK_19 )
566+ CHECK (test_native_polyz_unpack () == 0 );
567+ #endif
568+
526569 return 0 ;
527570}
528571#endif /* MLD_USE_NATIVE_NTT || MLD_USE_NATIVE_INTT || \
@@ -532,7 +575,8 @@ static int test_backend_units(void)
532575 MLD_USE_NATIVE_POINTWISE_MONTGOMERY || \
533576 MLD_USE_NATIVE_POLYVECL_POINTWISE_ACC_MONTGOMERY_L4 || \
534577 MLD_USE_NATIVE_POLYVECL_POINTWISE_ACC_MONTGOMERY_L5 || \
535- MLD_USE_NATIVE_POLYVECL_POINTWISE_ACC_MONTGOMERY_L7 */
578+ MLD_USE_NATIVE_POLYVECL_POINTWISE_ACC_MONTGOMERY_L7 || \
579+ MLD_USE_NATIVE_POLYZ_UNPACK_17 || MLD_USE_NATIVE_POLYZ_UNPACK_19 */
536580
537581int main (void )
538582{
@@ -551,7 +595,9 @@ int main(void)
551595 defined(MLD_USE_NATIVE_POINTWISE_MONTGOMERY ) || \
552596 defined(MLD_USE_NATIVE_POLYVECL_POINTWISE_ACC_MONTGOMERY_L4 ) || \
553597 defined(MLD_USE_NATIVE_POLYVECL_POINTWISE_ACC_MONTGOMERY_L5 ) || \
554- defined(MLD_USE_NATIVE_POLYVECL_POINTWISE_ACC_MONTGOMERY_L7 )
598+ defined(MLD_USE_NATIVE_POLYVECL_POINTWISE_ACC_MONTGOMERY_L7 ) || \
599+ defined(MLD_USE_NATIVE_POLYZ_UNPACK_17 ) || \
600+ defined(MLD_USE_NATIVE_POLYZ_UNPACK_19 )
555601 CHECK (test_backend_units () == 0 );
556602#endif /* MLD_USE_NATIVE_NTT || MLD_USE_NATIVE_INTT || \
557603 MLD_USE_NATIVE_POLY_DECOMPOSE_32 || MLD_USE_NATIVE_POLY_DECOMPOSE_88 \
@@ -560,7 +606,8 @@ int main(void)
560606 MLD_USE_NATIVE_POINTWISE_MONTGOMERY || \
561607 MLD_USE_NATIVE_POLYVECL_POINTWISE_ACC_MONTGOMERY_L4 || \
562608 MLD_USE_NATIVE_POLYVECL_POINTWISE_ACC_MONTGOMERY_L5 || \
563- MLD_USE_NATIVE_POLYVECL_POINTWISE_ACC_MONTGOMERY_L7 */
609+ MLD_USE_NATIVE_POLYVECL_POINTWISE_ACC_MONTGOMERY_L7 || \
610+ MLD_USE_NATIVE_POLYZ_UNPACK_17 || MLD_USE_NATIVE_POLYZ_UNPACK_19 */
564611
565612
566613 return 0 ;
0 commit comments