@@ -4018,3 +4018,54 @@ int test_wc_mlkem_decap_fo_reject(void)
40184018 return EXPECT_RESULT ();
40194019} /* END test_wc_mlkem_decap_fo_reject */
40204020
4021+ int test_wc_mlkem_decode_privkey_bad_pubhash (void )
4022+ {
4023+ EXPECT_DECLS ;
4024+ #if defined(WOLFSSL_HAVE_MLKEM ) && defined(WOLFSSL_WC_MLKEM ) && \
4025+ !defined(WOLFSSL_NO_ML_KEM ) && !defined(WOLFSSL_MLKEM_NO_MAKE_KEY )
4026+ MlKemKey * key = NULL ;
4027+ WC_RNG rng ;
4028+ byte priv [WC_ML_KEM_MAX_PRIVATE_KEY_SIZE ];
4029+ word32 privLen = 0 ;
4030+ #ifndef WOLFSSL_NO_ML_KEM_768
4031+ const int mlkemType = WC_ML_KEM_768 ;
4032+ #elif !defined(WOLFSSL_NO_ML_KEM_512 )
4033+ const int mlkemType = WC_ML_KEM_512 ;
4034+ #else
4035+ const int mlkemType = WC_ML_KEM_1024 ;
4036+ #endif
4037+
4038+ XMEMSET (& rng , 0 , sizeof (rng ));
4039+ XMEMSET (priv , 0 , sizeof (priv ));
4040+
4041+ key = (MlKemKey * )XMALLOC (sizeof (* key ), NULL , DYNAMIC_TYPE_TMP_BUFFER );
4042+ ExpectNotNull (key );
4043+ ExpectIntEQ (wc_InitRng (& rng ), 0 );
4044+
4045+ ExpectIntEQ (wc_MlKemKey_Init (key , mlkemType , NULL , INVALID_DEVID ), 0 );
4046+ ExpectIntEQ (wc_MlKemKey_MakeKey (key , & rng ), 0 );
4047+ ExpectIntEQ (wc_MlKemKey_PrivateKeySize (key , & privLen ), 0 );
4048+ ExpectTrue (privLen > (word32 )(2 * WC_ML_KEM_SYM_SZ ));
4049+ ExpectIntEQ (wc_MlKemKey_EncodePrivateKey (key , priv , privLen ), 0 );
4050+
4051+ wc_MlKemKey_Free (key );
4052+ ExpectIntEQ (wc_MlKemKey_Init (key , mlkemType , NULL , INVALID_DEVID ), 0 );
4053+ ExpectIntEQ (wc_MlKemKey_DecodePrivateKey (key , priv , privLen ), 0 );
4054+ wc_MlKemKey_Free (key );
4055+
4056+ /* Tamper H(ek) (32 bytes before z). */
4057+ if (privLen > (word32 )(2 * WC_ML_KEM_SYM_SZ )) {
4058+ priv [privLen - 2 * WC_ML_KEM_SYM_SZ ] ^= 0x01 ;
4059+ }
4060+
4061+ ExpectIntEQ (wc_MlKemKey_Init (key , mlkemType , NULL , INVALID_DEVID ), 0 );
4062+ ExpectIntEQ (wc_MlKemKey_DecodePrivateKey (key , priv , privLen ),
4063+ WC_NO_ERR_TRACE (MLKEM_PUB_HASH_E ));
4064+ wc_MlKemKey_Free (key );
4065+
4066+ DoExpectIntEQ (wc_FreeRng (& rng ), 0 );
4067+ XFREE (key , NULL , DYNAMIC_TYPE_TMP_BUFFER );
4068+ #endif
4069+ return EXPECT_RESULT ();
4070+ } /* END test_wc_mlkem_decode_privkey_bad_pubhash */
4071+
0 commit comments