diff --git a/configure.ac b/configure.ac index eb73ae170..5f6a226c9 100644 --- a/configure.ac +++ b/configure.ac @@ -4378,6 +4378,9 @@ then AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_BIND" AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_AES_DIRECT -DHAVE_AES_ECB -DWOLFSSL_DES_ECB" AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_SHA224 -DWOLFSSL_SHA384 -DWOLFSSL_SHA512" + ENABLED_SHA224="yes" + ENABLED_SHA384="yes" + ENABLED_SHA512="yes" fi if test "$ENABLED_OPENVPN" = "yes" diff --git a/src/ssl.c b/src/ssl.c index 30c95c840..f7e33db4a 100644 --- a/src/ssl.c +++ b/src/ssl.c @@ -30146,6 +30146,9 @@ int SetDhInternal(WOLFSSL_DH* dh) } #endif /* WOLFSSL_SMALL_STACK */ + /* Free so that mp_init's don't leak */ + wc_FreeDhKey((DhKey*)dh->internal); + #ifdef WOLFSSL_DH_EXTRA privSz = wolfSSL_BN_bn2bin(dh->priv_key, priv_key); pubSz = wolfSSL_BN_bn2bin(dh->pub_key, pub_key); @@ -43615,6 +43618,7 @@ int wolfSSL_DH_generate_parameters_ex(WOLFSSL_DH* dh, int prime_len, int generat WOLFSSL_ENTER("wolfSSL_DH_generate_parameters_ex"); (void)callback; + (void)generator; if (dh == NULL) { WOLFSSL_MSG("Bad parameter"); @@ -43626,23 +43630,21 @@ int wolfSSL_DH_generate_parameters_ex(WOLFSSL_DH* dh, int prime_len, int generat return WOLFSSL_FAILURE; } - if (dh->inSet == 0) { - if (SetDhInternal(dh) != WOLFSSL_SUCCESS) { - WOLFSSL_MSG("Unable to set internal DH structure"); - return WOLFSSL_FAILURE; - } - } + /* Don't need SetDhInternal call since we are generating + * parameters ourselves */ key = (DhKey*)dh->internal; - if (mp_set_int(&key->g, generator) != MP_OKAY) { - WOLFSSL_MSG("Unable to set generator"); - return WOLFSSL_FAILURE; - } + + /* Free so that mp_init's don't leak */ + wc_FreeDhKey(key); if (wc_DhGenerateParams(&globalRNG, prime_len, key) != 0) { WOLFSSL_MSG("wc_DhGenerateParams error"); return WOLFSSL_FAILURE; } + dh->inSet = 1; + + WOLFSSL_MSG("wolfSSL does not support using a custom generator."); if (SetDhExternal(dh) != WOLFSSL_SUCCESS) { WOLFSSL_MSG("SetDhExternal error"); @@ -52491,9 +52493,11 @@ void wolfSSL_DH_get0_key(const WOLFSSL_DH *dh, WOLFSSL_ENTER("wolfSSL_DH_get0_key"); if (dh != NULL) { - if (pub_key != NULL) + if (pub_key != NULL && dh->pub_key != NULL && + wolfSSL_BN_is_zero(dh->pub_key) != WOLFSSL_SUCCESS) *pub_key = dh->pub_key; - if (priv_key != NULL) + if (priv_key != NULL && dh->priv_key != NULL && + wolfSSL_BN_is_zero(dh->priv_key) != WOLFSSL_SUCCESS) *priv_key = dh->priv_key; } } diff --git a/tests/api.c b/tests/api.c index 0c545006a..c0f46ab35 100644 --- a/tests/api.c +++ b/tests/api.c @@ -2574,8 +2574,10 @@ static void test_EC_i2d(void) buf = NULL; AssertIntGT((len = i2o_ECPublicKey(key, &buf)), 0); - AssertNotNull(o2i_ECPublicKey(©, (const unsigned char **)&buf, len)); + tmp = buf; + AssertNotNull(o2i_ECPublicKey(©, &tmp, len)); AssertIntEQ(EC_KEY_check_key(key), 1); + XFREE(buf, NULL, DYNAMIC_TYPE_OPENSSL); EC_KEY_free(key); EC_KEY_free(copy); @@ -45900,7 +45902,7 @@ static void test_wolfSSL_DH(void) AssertNotNull(dh = d2i_DHparams(NULL, &pt, len)); AssertNotNull(dh->p); - AssertNotNull(dh->p); + AssertNotNull(dh->g); AssertTrue(pt != buf); AssertIntEQ(DH_generate_key(dh), WOLFSSL_SUCCESS); @@ -45920,6 +45922,9 @@ static void test_wolfSSL_DH(void) AssertPtrEq(priv, dh->priv_key); DH_free(dh); + + AssertNotNull(dh = DH_generate_parameters(2048, 2, NULL, NULL)); + DH_free(dh); #endif #endif printf(testingFmt, "test_wolfSSL_DH"); diff --git a/wolfcrypt/src/ecc.c b/wolfcrypt/src/ecc.c index 83256a893..3085ac91e 100644 --- a/wolfcrypt/src/ecc.c +++ b/wolfcrypt/src/ecc.c @@ -7390,6 +7390,11 @@ int wc_ecc_import_point_der_ex(const byte* in, word32 inLen, return ECC_BAD_ARG_E; } + /* clear if previously allocated */ + mp_clear(point->x); + mp_clear(point->y); + mp_clear(point->z); + /* init point */ #ifdef ALT_ECC_SIZE point->x = (mp_int*)&point->xyz[0]; diff --git a/wolfcrypt/src/evp.c b/wolfcrypt/src/evp.c index 8f4f9866b..96134c4d9 100644 --- a/wolfcrypt/src/evp.c +++ b/wolfcrypt/src/evp.c @@ -2345,8 +2345,8 @@ static enum wc_HashType wolfSSL_EVP_md2macType(const WOLFSSL_EVP_MD *md) const struct s_ent *ent ; if (md != NULL) { - for( ent = md_tbl; ent->name != NULL; ent++) { - if(XSTRNCMP((const char *)md, ent->name, XSTRLEN(ent->name)+1) == 0) { + for (ent = md_tbl; ent->name != NULL; ent++) { + if (XSTRNCMP((const char *)md, ent->name, XSTRLEN(ent->name)+1) == 0) { return ent->macType; } } @@ -2358,8 +2358,8 @@ static const WOLFSSL_EVP_MD* wolfSSL_macType2EVP_md(enum wc_HashType type) { const struct s_ent *ent ; - for( ent = md_tbl; ent->name != NULL; ent++) { - if(ent->macType == type) { + for (ent = md_tbl; ent->name != NULL; ent++) { + if (ent->macType == type) { return ent->name; } } diff --git a/wolfssl/openssl/crypto.h b/wolfssl/openssl/crypto.h index 13b4794a0..b9ee29fe7 100644 --- a/wolfssl/openssl/crypto.h +++ b/wolfssl/openssl/crypto.h @@ -33,11 +33,11 @@ typedef WOLFSSL_INIT_SETTINGS OPENSSL_INIT_SETTINGS; typedef struct WOLFSSL_CRYPTO_THREADID { int dummy; -}WOLFSSL_CRYPTO_THREADID; +} WOLFSSL_CRYPTO_THREADID; typedef struct crypto_threadid_st CRYPTO_THREADID; typedef struct CRYPTO_EX_DATA CRYPTO_EX_DATA; -typedef void (CRYPTO_free_func)(void*parent, void*ptr, CRYPTO_EX_DATA *ad, int idx, +typedef void (CRYPTO_free_func)(void* parent, void* ptr, CRYPTO_EX_DATA* ad, int idx, long argl, void* argp); #include