diff --git a/src/ssl.c b/src/ssl.c index 46ef8ab7c..d5865cdbe 100644 --- a/src/ssl.c +++ b/src/ssl.c @@ -33113,11 +33113,9 @@ WOLFSSL_DH *wolfSSL_PEM_read_bio_DHparams(WOLFSSL_BIO *bio, WOLFSSL_DH **x, if (x != NULL) localDh = *x; if (localDh == NULL) { - localDh = (WOLFSSL_DH*)XMALLOC(sizeof(WOLFSSL_DH), NULL, - DYNAMIC_TYPE_OPENSSL); + localDh = wolfSSL_DH_new(); if (localDh == NULL) goto end; - XMEMSET(localDh, 0, sizeof(WOLFSSL_DH)); } /* Load data in manually */ @@ -33155,6 +33153,14 @@ WOLFSSL_DH *wolfSSL_PEM_read_bio_DHparams(WOLFSSL_BIO *bio, WOLFSSL_DH **x, localDh = NULL; } + if (localDh != NULL && localDh->inSet == 0) { + if (SetDhInternal(localDh) != WOLFSSL_SUCCESS) { + WOLFSSL_MSG("Unable to set internal DH structure"); + wolfSSL_DH_free(localDh); + localDh = NULL; + } + } + end: if (memAlloced) XFREE(mem, NULL, DYNAMIC_TYPE_PEM); if (der != NULL) FreeDer(&der); @@ -33185,11 +33191,12 @@ int wolfSSL_PEM_write_DHparams(XFILE fp, WOLFSSL_DH* dh) return WOLFSSL_FAILURE; } -#if 0 - if (dh->inSet != 1) { - ret = SetDhInternal(dh); + if (dh->inSet == 0) { + if (SetDhInternal(dh) != WOLFSSL_SUCCESS) { + WOLFSSL_MSG("Unable to set internal DH structure"); + return WOLFSSL_FAILURE; + } } -#endif key = (DhKey*)dh->internal; ret = wc_DhParamsToDer(key, NULL, &derSz); if (ret != LENGTH_ONLY_E) { diff --git a/tests/api.c b/tests/api.c index 88816eceb..c4cf99574 100644 --- a/tests/api.c +++ b/tests/api.c @@ -21912,11 +21912,10 @@ static void test_wolfSSL_PEM_write_DHparams(void) { #if defined(OPENSSL_EXTRA) && !defined(NO_DH) && !defined(NO_FILESYSTEM) DH* dh; + BIO* bio; XFILE fp; byte pem[2048]; int pemSz; - DerBuffer *der = NULL; - word32 idx = 0; const char expected[] = "-----BEGIN DH PARAMETERS-----\n\ MIIBCAKCAQEAsKEIBpwIE7pZBjy8MNX1AMFPRKfW70rGJScc6NKWUwpckd2iwpSE\n\ @@ -21929,15 +21928,13 @@ tgZl96bcAGdru8OpQYP7x/rI4h5+rwA/kwIBAg==\n\ printf(testingFmt, "wolfSSL_PEM_write_DHparams()"); AssertNotNull(fp = XFOPEN(dhParamFile, "rb")); - AssertIntGT((pemSz = XFREAD(pem, 1, sizeof(pem), fp)), 0); + AssertIntGT((pemSz = (int)XFREAD(pem, 1, sizeof(pem), fp)), 0); XFCLOSE(fp); - wc_PemToDer(pem, pemSz, DH_PARAM_TYPE, &der, NULL, NULL, NULL); - AssertNotNull(dh = DH_new()); - printf("derSz = %d idx = %d\n", der->length, idx); - AssertIntEQ(wc_DhKeyDecode(der->buffer, &idx, (DhKey*)dh->internal, - der->length), 0); - wc_FreeDer(&der); + AssertNotNull(bio = BIO_new(BIO_s_mem())); + AssertIntEQ(BIO_write(bio, pem, pemSz), pemSz); + AssertNotNull(dh = PEM_read_bio_DHparams(bio, NULL, NULL, NULL)); + BIO_free(bio); AssertNotNull(fp = XFOPEN("./test-write-dhparams.pem", "wb")); AssertIntEQ(PEM_write_DHparams(fp, dh), WOLFSSL_SUCCESS); @@ -21948,7 +21945,7 @@ tgZl96bcAGdru8OpQYP7x/rI4h5+rwA/kwIBAg==\n\ /* check results */ XMEMSET(pem, 0, sizeof(pem)); AssertNotNull(fp = XFOPEN("./test-write-dhparams.pem", "rb")); - AssertIntGT((pemSz = XFREAD(pem, 1, sizeof(pem), fp)), 0); + AssertIntGT((pemSz = (int)XFREAD(pem, 1, sizeof(pem), fp)), 0); AssertIntEQ(XMEMCMP(pem, expected, pemSz), 0); XFCLOSE(fp); diff --git a/wolfssl/wolfcrypt/asn_public.h b/wolfssl/wolfcrypt/asn_public.h index 5261a6c6e..d35ec6f03 100644 --- a/wolfssl/wolfcrypt/asn_public.h +++ b/wolfssl/wolfcrypt/asn_public.h @@ -45,6 +45,10 @@ typedef struct RsaKey RsaKey; #define WC_RSAKEY_TYPE_DEFINED #endif +#ifndef WC_DHKEY_TYPE_DEFINED + typedef struct DhKey DhKey; + #define WC_DHKEY_TYPE_DEFINED +#endif #ifndef WC_RNG_TYPE_DEFINED typedef struct WC_RNG WC_RNG; #define WC_RNG_TYPE_DEFINED @@ -480,6 +484,10 @@ WOLFSSL_API void wc_FreeDer(DerBuffer** pDer); word32 inLen, int with_AlgCurve); #endif +#ifndef NO_DH + WOLFSSL_API int wc_DhParamsToDer(DhKey* key, byte* out, word32* outSz); +#endif + #ifdef HAVE_ED25519 /* private key helpers */ WOLFSSL_API int wc_Ed25519PrivateKeyDecode(const byte*, word32*, diff --git a/wolfssl/wolfcrypt/dh.h b/wolfssl/wolfcrypt/dh.h index 07b6f5af6..2aa317714 100644 --- a/wolfssl/wolfcrypt/dh.h +++ b/wolfssl/wolfcrypt/dh.h @@ -57,13 +57,17 @@ typedef struct DhParams { } DhParams; /* Diffie-Hellman Key */ -typedef struct DhKey { +struct DhKey { mp_int p, g, q; /* group parameters */ void* heap; #ifdef WOLFSSL_ASYNC_CRYPT WC_ASYNC_DEV asyncDev; #endif -} DhKey; +}; +#ifndef WC_DHKEY_TYPE_DEFINED + typedef struct DhKey DhKey; + #define WC_DHKEY_TYPE_DEFINED +#endif #ifdef HAVE_FFDHE_2048 @@ -116,7 +120,6 @@ WOLFSSL_API int wc_DhCheckKeyPair(DhKey* key, const byte* pub, word32 pubSz, WOLFSSL_API int wc_DhGenerateParams(WC_RNG *rng, int modSz, DhKey *dh); WOLFSSL_API int wc_DhExportParamsRaw(DhKey* dh, byte* p, word32* pSz, byte* q, word32* qSz, byte* g, word32* gSz); -WOLFSSL_API int wc_DhParamsToDer(DhKey* key, byte* out, word32* outSz); #ifdef __cplusplus