@@ -4034,3 +4034,54 @@ int test_wc_mlkem_decap_fo_reject(void)
40344034 return EXPECT_RESULT ();
40354035} /* END test_wc_mlkem_decap_fo_reject */
40364036
4037+ int test_wc_mlkem_decode_privkey_bad_pubhash (void )
4038+ {
4039+ EXPECT_DECLS ;
4040+ #if defined(WOLFSSL_HAVE_MLKEM ) && \
4041+ !defined(WOLFSSL_NO_ML_KEM ) && !defined(WOLFSSL_MLKEM_NO_MAKE_KEY )
4042+ MlKemKey * key = NULL ;
4043+ WC_RNG rng ;
4044+ byte priv [WC_ML_KEM_MAX_PRIVATE_KEY_SIZE ];
4045+ word32 privLen = 0 ;
4046+ #ifndef WOLFSSL_NO_ML_KEM_768
4047+ const int mlkemType = WC_ML_KEM_768 ;
4048+ #elif !defined(WOLFSSL_NO_ML_KEM_512 )
4049+ const int mlkemType = WC_ML_KEM_512 ;
4050+ #else
4051+ const int mlkemType = WC_ML_KEM_1024 ;
4052+ #endif
4053+
4054+ XMEMSET (& rng , 0 , sizeof (rng ));
4055+ XMEMSET (priv , 0 , sizeof (priv ));
4056+
4057+ key = (MlKemKey * )XMALLOC (sizeof (* key ), NULL , DYNAMIC_TYPE_TMP_BUFFER );
4058+ ExpectNotNull (key );
4059+ ExpectIntEQ (wc_InitRng (& rng ), 0 );
4060+
4061+ ExpectIntEQ (wc_MlKemKey_Init (key , mlkemType , NULL , INVALID_DEVID ), 0 );
4062+ ExpectIntEQ (wc_MlKemKey_MakeKey (key , & rng ), 0 );
4063+ ExpectIntEQ (wc_MlKemKey_PrivateKeySize (key , & privLen ), 0 );
4064+ ExpectTrue (privLen > (word32 )(2 * WC_ML_KEM_SYM_SZ ));
4065+ ExpectIntEQ (wc_MlKemKey_EncodePrivateKey (key , priv , privLen ), 0 );
4066+
4067+ wc_MlKemKey_Free (key );
4068+ ExpectIntEQ (wc_MlKemKey_Init (key , mlkemType , NULL , INVALID_DEVID ), 0 );
4069+ ExpectIntEQ (wc_MlKemKey_DecodePrivateKey (key , priv , privLen ), 0 );
4070+ wc_MlKemKey_Free (key );
4071+
4072+ /* Tamper H(ek) (32 bytes before z). */
4073+ if (privLen > (word32 )(2 * WC_ML_KEM_SYM_SZ )) {
4074+ priv [privLen - 2 * WC_ML_KEM_SYM_SZ ] ^= 0x01 ;
4075+ }
4076+
4077+ ExpectIntEQ (wc_MlKemKey_Init (key , mlkemType , NULL , INVALID_DEVID ), 0 );
4078+ ExpectIntEQ (wc_MlKemKey_DecodePrivateKey (key , priv , privLen ),
4079+ WC_NO_ERR_TRACE (MLKEM_PUB_HASH_E ));
4080+ wc_MlKemKey_Free (key );
4081+
4082+ DoExpectIntEQ (wc_FreeRng (& rng ), 0 );
4083+ XFREE (key , NULL , DYNAMIC_TYPE_TMP_BUFFER );
4084+ #endif
4085+ return EXPECT_RESULT ();
4086+ } /* END test_wc_mlkem_decode_privkey_bad_pubhash */
4087+
0 commit comments