diff --git a/src/ssl.c b/src/ssl.c index 1dea38ac8..1df36dcea 100644 --- a/src/ssl.c +++ b/src/ssl.c @@ -38981,7 +38981,6 @@ void wolfSSL_EC_KEY_free(WOLFSSL_EC_KEY *key) WOLFSSL_ENTER("wolfSSL_EC_KEY_free"); if (key != NULL) { - int doFree = 0; void* heap = key->heap; #ifndef SINGLE_THREADED @@ -39008,30 +39007,14 @@ void wolfSSL_EC_KEY_free(WOLFSSL_EC_KEY *key) wc_ecc_free((ecc_key*)key->internal); XFREE(key->internal, heap, DYNAMIC_TYPE_ECC); } -#endif - /* only free if all references to it are done */ - key->refCount--; - if (key->refCount == 0) { - doFree = 1; - } -#ifndef SINGLE_THREADED - wc_UnLockMutex(&key->refMutex); -#endif + wolfSSL_BN_free(key->priv_key); + wolfSSL_EC_POINT_free(key->pub_key); + wolfSSL_EC_GROUP_free(key->group); + InitwolfSSL_ECKey(key); /* set back to NULLs for safety */ - if (doFree) { - if (key->internal != NULL) { - wc_ecc_free((ecc_key*)key->internal); - XFREE(key->internal, heap, DYNAMIC_TYPE_ECC); - } - wolfSSL_BN_free(key->priv_key); - wolfSSL_EC_POINT_free(key->pub_key); - wolfSSL_EC_GROUP_free(key->group); - InitwolfSSL_ECKey(key); /* set back to NULLs for safety */ - - XFREE(key, heap, DYNAMIC_TYPE_ECC); - (void)heap; - /* key = NULL, don't try to access or double free it */ - } + XFREE(key, heap, DYNAMIC_TYPE_ECC); + (void)heap; + /* key = NULL, don't try to access or double free it */ } } diff --git a/wolfcrypt/src/evp.c b/wolfcrypt/src/evp.c index 39d306d09..d910a2f3b 100644 --- a/wolfcrypt/src/evp.c +++ b/wolfcrypt/src/evp.c @@ -7061,6 +7061,7 @@ WOLFSSL_EC_KEY *wolfSSL_EVP_PKEY_get0_EC_KEY(WOLFSSL_EVP_PKEY *pkey) WOLFSSL_EC_KEY* wolfSSL_EVP_PKEY_get1_EC_KEY(WOLFSSL_EVP_PKEY* key) { + WOLFSSL_EC_KEY* local = NULL; WOLFSSL_ENTER("wolfSSL_EVP_PKEY_get1_EC_KEY"); if (key == NULL || key->type != EVP_PKEY_EC) { @@ -7074,18 +7075,30 @@ WOLFSSL_EC_KEY* wolfSSL_EVP_PKEY_get1_EC_KEY(WOLFSSL_EVP_PKEY* key) local = key->ecc; } else { - local = wolfSSL_EC_KEY_new(); + key->ecc = local = wolfSSL_EC_KEY_new(); if (local == NULL) { WOLFSSL_MSG("Error creating a new WOLFSSL_EC_KEY structure"); return NULL; } + if (wolfSSL_EC_KEY_LoadDer(local, + (const unsigned char*)key->pkey.ptr, + key->pkey_sz) != WOLFSSL_SUCCESS) { + /* now try public key */ + if (wolfSSL_EC_KEY_LoadDer_ex(local, + (const unsigned char*)key->pkey.ptr, key->pkey_sz, + WOLFSSL_EC_KEY_LOAD_PUBLIC) != WOLFSSL_SUCCESS) { - if (wolfSSL_EC_KEY_up_ref(key->ecc) != WOLFSSL_SUCCESS) { - WOLFSSL_MSG("wolfSSL_EC_KEY_up_ref error"); - return NULL; + wolfSSL_EC_KEY_free(local); + local = NULL; + } + } + } + } + else { + WOLFSSL_MSG("WOLFSSL_EVP_PKEY does not hold an EC key"); } - return key->ecc; + return local; } #endif /* HAVE_ECC */ @@ -7112,6 +7125,11 @@ int wolfSSL_EVP_PKEY_set1_DH(WOLFSSL_EVP_PKEY *pkey, WOLFSSL_DH *key) clearEVPPkeyKeys(pkey); + if (wolfSSL_DH_up_ref(key) != WOLFSSL_SUCCESS) { + WOLFSSL_MSG("Failed to increase dh key ref count"); + return WOLFSSL_FAILURE; + } + pkey->dh = key; pkey->ownDh = 1; /* pkey does not own DH but needs to call free on it */ pkey->type = EVP_PKEY_DH; @@ -7347,6 +7365,8 @@ int wolfSSL_EVP_PKEY_set1_EC_KEY(WOLFSSL_EVP_PKEY *pkey, WOLFSSL_EC_KEY *key) { #ifdef HAVE_ECC WOLFSSL_ENTER("wolfSSL_EVP_PKEY_set1_EC_KEY"); + if (pkey == NULL || key == NULL) + return WOLFSSL_FAILURE; clearEVPPkeyKeys(pkey); if (wolfSSL_EC_KEY_up_ref(key) != WOLFSSL_SUCCESS) { WOLFSSL_MSG("wolfSSL_EC_KEY_up_ref failed"); diff --git a/wolfssl/openssl/ec.h b/wolfssl/openssl/ec.h index 6c57fc7c6..4b8aaac64 100644 --- a/wolfssl/openssl/ec.h +++ b/wolfssl/openssl/ec.h @@ -119,10 +119,6 @@ struct WOLFSSL_EC_KEY { char form; /* Either POINT_CONVERSION_UNCOMPRESSED or * POINT_CONVERSION_COMPRESSED */ word16 pkcs8HeaderSz; -#ifndef SINGLE_THREADED - wolfSSL_Mutex refMutex; /* ref count mutex */ -#endif - int refCount; /* reference count */ /* option bits */ byte inSet:1; /* internal set from external ? */ @@ -214,8 +210,6 @@ WOLFSSL_EC_KEY *wolfSSL_EC_KEY_new_ex(void* heap, int devId); WOLFSSL_API WOLFSSL_EC_KEY *wolfSSL_EC_KEY_new(void); WOLFSSL_API -int wolfSSL_EC_KEY_up_ref(WOLFSSL_EC_KEY* key); -WOLFSSL_API int wolfSSL_EC_KEY_set_group(WOLFSSL_EC_KEY *key, WOLFSSL_EC_GROUP *group); WOLFSSL_API int wolfSSL_EC_KEY_generate_key(WOLFSSL_EC_KEY *key); @@ -321,7 +315,6 @@ typedef WOLFSSL_EC_BUILTIN_CURVE EC_builtin_curve; #define EC_KEY_free wolfSSL_EC_KEY_free #define EC_KEY_up_ref wolfSSL_EC_KEY_up_ref #define EC_KEY_dup wolfSSL_EC_KEY_dup -#define EC_KEY_up_ref wolfSSL_EC_KEY_up_ref #define EC_KEY_get0_public_key wolfSSL_EC_KEY_get0_public_key #define EC_KEY_get0_group wolfSSL_EC_KEY_get0_group #define EC_KEY_set_private_key wolfSSL_EC_KEY_set_private_key