@@ -30552,6 +30552,9 @@ static wc_test_ret_t dh_check_priv_key_test(DhKey* key, const byte* priv,
3055230552{
3055330553 wc_test_ret_t ret;
3055430554 word32 pSz, qSz, gSz;
30555+ byte pBuf[DH_TEST_BUF_SIZE];
30556+ byte qBuf[DH_TEST_BUF_SIZE];
30557+ byte gBuf[DH_TEST_BUF_SIZE];
3055530558
3055630559 ret = wc_DhCheckPrivKey(NULL, NULL, 0);
3055730560 if (ret != WC_NO_ERR_TRACE(BAD_FUNC_ARG))
@@ -30569,6 +30572,22 @@ static wc_test_ret_t dh_check_priv_key_test(DhKey* key, const byte* priv,
3056930572 if (ret != WC_NO_ERR_TRACE(LENGTH_ONLY_E))
3057030573 ERROR_OUT(WC_TEST_RET_ENC_EC(ret), exit_dh_check_priv);
3057130574
30575+ /* Regression: the explicit prime argument to wc_DhCheckPrivKey_ex must be
30576+ * honored and not overwritten by key->q. This key is set with p and g
30577+ * only, so key->q is empty; supplying the modulus p as a generous bound
30578+ * must accept any valid priv (priv < p). The prior defect clobbered the
30579+ * loaded bound with the empty key->q and rejected a valid key. */
30580+ if (pSz <= (word32)sizeof(pBuf) && qSz <= (word32)sizeof(qBuf) &&
30581+ gSz <= (word32)sizeof(gBuf)) {
30582+ ret = wc_DhExportParamsRaw(key, pBuf, &pSz, qBuf, &qSz, gBuf, &gSz);
30583+ if (ret != 0)
30584+ ERROR_OUT(WC_TEST_RET_ENC_EC(ret), exit_dh_check_priv);
30585+
30586+ ret = wc_DhCheckPrivKey_ex(key, priv, privSz, pBuf, pSz);
30587+ if (ret != 0)
30588+ ERROR_OUT(WC_TEST_RET_ENC_EC(ret), exit_dh_check_priv);
30589+ }
30590+
3057230591 ret = 0;
3057330592
3057430593exit_dh_check_priv:
0 commit comments