@@ -419,6 +419,7 @@ static MLK_ALWAYS_INLINE
419419#endif
420420int mlk_indcpa_enc_u (uint8_t ct_u [MLKEM_POLYVECCOMPRESSEDBYTES_DU ],
421421 mlk_polyvec * sp , mlk_poly * epp ,
422+ mlk_polyvec_mulcache * sp_cache ,
422423 const uint8_t seed [MLKEM_SYMBYTES ],
423424 const uint8_t coins [MLKEM_SYMBYTES ],
424425 MLK_CONFIG_CONTEXT_PARAMETER_TYPE context )
@@ -427,9 +428,8 @@ int mlk_indcpa_enc_u(uint8_t ct_u[MLKEM_POLYVECCOMPRESSEDBYTES_DU],
427428 MLK_ALLOC (at , mlk_polymat , 1 , context );
428429 MLK_ALLOC (ep , mlk_polyvec , 1 , context );
429430 MLK_ALLOC (b , mlk_polyvec , 1 , context );
430- MLK_ALLOC (sp_cache , mlk_polyvec_mulcache , 1 , context );
431431
432- if (at == NULL || ep == NULL || b == NULL || sp_cache == NULL )
432+ if (at == NULL || ep == NULL || b == NULL )
433433 {
434434 ret = MLK_ERR_OUT_OF_MEMORY ;
435435 goto cleanup ;
@@ -482,7 +482,6 @@ int mlk_indcpa_enc_u(uint8_t ct_u[MLKEM_POLYVECCOMPRESSEDBYTES_DU],
482482cleanup :
483483 /* Specification: Partially implements
484484 * @[FIPS203, Section 3.3, Destruction of intermediate values] */
485- MLK_FREE (sp_cache , mlk_polyvec_mulcache , 1 , context );
486485 MLK_FREE (b , mlk_polyvec , 1 , context );
487486 MLK_FREE (ep , mlk_polyvec , 1 , context );
488487 MLK_FREE (at , mlk_polymat , 1 , context );
@@ -496,6 +495,7 @@ static MLK_ALWAYS_INLINE
496495#endif
497496int mlk_indcpa_enc_v (uint8_t ct_v [MLKEM_POLYCOMPRESSEDBYTES_DV ],
498497 const mlk_polyvec * sp , const mlk_poly * epp ,
498+ const mlk_polyvec_mulcache * sp_cache ,
499499 const uint8_t m [MLKEM_INDCPA_MSGBYTES ],
500500 const uint8_t ek_vector [MLKEM_POLYVECBYTES ],
501501 MLK_CONFIG_CONTEXT_PARAMETER_TYPE context )
@@ -504,9 +504,8 @@ int mlk_indcpa_enc_v(uint8_t ct_v[MLKEM_POLYCOMPRESSEDBYTES_DV],
504504 MLK_ALLOC (pkpv , mlk_polyvec , 1 , context );
505505 MLK_ALLOC (v , mlk_poly , 1 , context );
506506 MLK_ALLOC (k , mlk_poly , 1 , context );
507- MLK_ALLOC (sp_cache , mlk_polyvec_mulcache , 1 , context );
508507
509- if (pkpv == NULL || v == NULL || k == NULL || sp_cache == NULL )
508+ if (pkpv == NULL || v == NULL || k == NULL )
510509 {
511510 ret = MLK_ERR_OUT_OF_MEMORY ;
512511 goto cleanup ;
@@ -515,7 +514,6 @@ int mlk_indcpa_enc_v(uint8_t ct_v[MLKEM_POLYCOMPRESSEDBYTES_DV],
515514 mlk_polyvec_frombytes (pkpv , ek_vector );
516515 mlk_poly_frommsg (k , m );
517516
518- mlk_polyvec_mulcache_compute (sp_cache , sp );
519517 mlk_polyvec_basemul_acc_montgomery_cached (v , pkpv , sp , sp_cache );
520518
521519 mlk_poly_invntt_tomont (v );
@@ -529,7 +527,6 @@ int mlk_indcpa_enc_v(uint8_t ct_v[MLKEM_POLYCOMPRESSEDBYTES_DV],
529527cleanup :
530528 /* Specification: Partially implements
531529 * @[FIPS203, Section 3.3, Destruction of intermediate values] */
532- MLK_FREE (sp_cache , mlk_polyvec_mulcache , 1 , context );
533530 MLK_FREE (k , mlk_poly , 1 , context );
534531 MLK_FREE (v , mlk_poly , 1 , context );
535532 MLK_FREE (pkpv , mlk_polyvec , 1 , context );
@@ -550,27 +547,30 @@ int mlk_indcpa_enc(uint8_t c[MLKEM_INDCPA_BYTES],
550547 int ret = 0 ;
551548 MLK_ALLOC (sp , mlk_polyvec , 1 , context );
552549 MLK_ALLOC (epp , mlk_poly , 1 , context );
550+ MLK_ALLOC (sp_cache , mlk_polyvec_mulcache , 1 , context );
553551
554- if (sp == NULL || epp == NULL )
552+ if (sp == NULL || epp == NULL || sp_cache == NULL )
555553 {
556554 ret = MLK_ERR_OUT_OF_MEMORY ;
557555 goto cleanup ;
558556 }
559557
560- /* Phase 1: compute ct_u and intermediate state (sp, epp) */
561- ret = mlk_indcpa_enc_u (c , sp , epp , pk + MLKEM_POLYVECBYTES , coins , context );
558+ /* Phase 1: compute ct_u and intermediate state (sp, epp, sp_cache) */
559+ ret = mlk_indcpa_enc_u (c , sp , epp , sp_cache , pk + MLKEM_POLYVECBYTES , coins ,
560+ context );
562561 if (ret != 0 )
563562 {
564563 goto cleanup ;
565564 }
566565
567566 /* Phase 2: compute ct_v using intermediate state */
568- ret = mlk_indcpa_enc_v (c + MLKEM_POLYVECCOMPRESSEDBYTES_DU , sp , epp , m , pk ,
569- context );
567+ ret = mlk_indcpa_enc_v (c + MLKEM_POLYVECCOMPRESSEDBYTES_DU , sp , epp , sp_cache ,
568+ m , pk , context );
570569
571570cleanup :
572571 /* Specification: Partially implements
573572 * @[FIPS203, Section 3.3, Destruction of intermediate values] */
573+ MLK_FREE (sp_cache , mlk_polyvec_mulcache , 1 , context );
574574 MLK_FREE (epp , mlk_poly , 1 , context );
575575 MLK_FREE (sp , mlk_polyvec , 1 , context );
576576 return ret ;
0 commit comments