@@ -30504,6 +30504,9 @@ static wc_test_ret_t dh_check_priv_key_test(DhKey* key, const byte* priv,
3050430504{
3050530505 wc_test_ret_t ret;
3050630506 word32 pSz, qSz, gSz;
30507+ byte pBuf[DH_TEST_BUF_SIZE];
30508+ byte qBuf[DH_TEST_BUF_SIZE];
30509+ byte gBuf[DH_TEST_BUF_SIZE];
3050730510
3050830511 ret = wc_DhCheckPrivKey(NULL, NULL, 0);
3050930512 if (ret != WC_NO_ERR_TRACE(BAD_FUNC_ARG))
@@ -30521,6 +30524,22 @@ static wc_test_ret_t dh_check_priv_key_test(DhKey* key, const byte* priv,
3052130524 if (ret != WC_NO_ERR_TRACE(LENGTH_ONLY_E))
3052230525 ERROR_OUT(WC_TEST_RET_ENC_EC(ret), exit_dh_check_priv);
3052330526
30527+ /* Regression: the explicit prime argument to wc_DhCheckPrivKey_ex must be
30528+ * honored and not overwritten by key->q. This key is set with p and g
30529+ * only, so key->q is empty; supplying the modulus p as a generous bound
30530+ * must accept any valid priv (priv < p). The prior defect clobbered the
30531+ * loaded bound with the empty key->q and rejected a valid key. */
30532+ if (pSz <= (word32)sizeof(pBuf) && qSz <= (word32)sizeof(qBuf) &&
30533+ gSz <= (word32)sizeof(gBuf)) {
30534+ ret = wc_DhExportParamsRaw(key, pBuf, &pSz, qBuf, &qSz, gBuf, &gSz);
30535+ if (ret != 0)
30536+ ERROR_OUT(WC_TEST_RET_ENC_EC(ret), exit_dh_check_priv);
30537+
30538+ ret = wc_DhCheckPrivKey_ex(key, priv, privSz, pBuf, pSz);
30539+ if (ret != 0)
30540+ ERROR_OUT(WC_TEST_RET_ENC_EC(ret), exit_dh_check_priv);
30541+ }
30542+
3052430543 ret = 0;
3052530544
3052630545exit_dh_check_priv:
0 commit comments