F-15036: pass qSz and a q buffer to wc_DhExportParamsRaw() in Dh.exportParams() so keys without q export p and g

pull/299/head
Chris Conlon 2026-10-15 16:58:03 -06:00
parent e39642407e
commit e7751897a6
2 changed files with 25 additions and 14 deletions

View File

@ -1060,6 +1060,7 @@ Java_com_wolfssl_wolfcrypt_Dh_wc_1DhExportParams(
byte* p = NULL;
byte* g = NULL;
byte* q = NULL;
byte qDummy = 0;
word32 pSz = 0, gSz = 0, qSz = 0;
jbyteArray pArray = NULL;
jbyteArray gArray = NULL;
@ -1077,20 +1078,13 @@ Java_com_wolfssl_wolfcrypt_Dh_wc_1DhExportParams(
return NULL;
}
/* Get sizes - try with q first */
/* Get sizes for p, q and g */
ret = wc_DhExportParamsRaw(key, NULL, &pSz, NULL, &qSz, NULL, &gSz);
if (ret != LENGTH_ONLY_E && ret != 0) {
/* Try without q */
ret = wc_DhExportParamsRaw(key, NULL, &pSz, NULL, NULL, NULL, &gSz);
if (ret != LENGTH_ONLY_E && ret != 0) {
throwWolfCryptExceptionFromError(env, ret);
return NULL;
}
hasQ = 0;
}
else {
hasQ = (qSz > 0);
if (ret != LENGTH_ONLY_E) {
throwWolfCryptExceptionFromError(env, ret);
return NULL;
}
hasQ = (qSz > 0);
/* Allocate buffers */
p = (byte*)XMALLOC(pSz, NULL, DYNAMIC_TYPE_TMP_BUFFER);
@ -1119,8 +1113,9 @@ Java_com_wolfssl_wolfcrypt_Dh_wc_1DhExportParams(
XMEMSET(q, 0, qSz);
}
/* Export parameters */
ret = wc_DhExportParamsRaw(key, p, &pSz, q, hasQ ? &qSz : NULL, g, &gSz);
/* Native requires a q buffer even when the key has no q */
ret = wc_DhExportParamsRaw(key, p, &pSz, hasQ ? q : &qDummy, &qSz,
g, &gSz);
if (ret == 0) {
/* Create byte arrays */

View File

@ -269,6 +269,22 @@ public class DhTest {
}
}
@Test
public void exportParamsShouldReturnPAndGWhenKeyHasNoQ() {
byte[] p = Util.h2b(DH_P_2048_HEX);
byte[] g = Util.h2b("02");
Dh dh = new Dh(p, g);
try {
byte[][] params = dh.exportParams();
assertEquals(2, params.length);
assertArrayEquals(p, params[0]);
assertArrayEquals(g, params[1]);
} finally {
dh.releaseNativeStruct();
}
}
/**
* checkPublicKey() must reject an out of range public key value. This
* is the same validation wc_DhAgree applies to a peer public key, so a