EVP_PKEY_get1/set1_EC_KEY: modify for EC_KEY_up_ref support

This commit is contained in:
Chris Conlon
2022-03-04 17:00:51 -07:00
parent 76014260f6
commit 8e0f5f9289

View File

@@ -6941,42 +6941,46 @@ 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* wolfSSL_EVP_PKEY_get1_EC_KEY(WOLFSSL_EVP_PKEY* key)
{ {
WOLFSSL_EC_KEY* local; WOLFSSL_EC_KEY* local = NULL;
WOLFSSL_ENTER("wolfSSL_EVP_PKEY_get1_EC_KEY"); WOLFSSL_ENTER("wolfSSL_EVP_PKEY_get1_EC_KEY");
if (key == NULL) { if (key == NULL) {
return NULL; return NULL;
} }
if (key->type == EVP_PKEY_EC) {
if (key->ecc != NULL) {
if (wolfSSL_EC_KEY_up_ref(key->ecc) != WOLFSSL_SUCCESS) {
return NULL;
}
local = key->ecc;
}
else {
local = wolfSSL_EC_KEY_new(); local = wolfSSL_EC_KEY_new();
if (local == NULL) { if (local == NULL) {
WOLFSSL_MSG("Error creating a new WOLFSSL_EC_KEY structure"); WOLFSSL_MSG("Error creating a new WOLFSSL_EC_KEY structure");
return NULL; return NULL;
} }
if (key->type == EVP_PKEY_EC) { if (wolfSSL_EC_KEY_LoadDer(local,
if (wolfSSL_EC_KEY_LoadDer(local, (const unsigned char*)key->pkey.ptr, (const unsigned char*)key->pkey.ptr,
key->pkey_sz) != WOLFSSL_SUCCESS) { key->pkey_sz) != WOLFSSL_SUCCESS) {
/* now try public key */ /* now try public key */
if (wolfSSL_EC_KEY_LoadDer_ex(local, if (wolfSSL_EC_KEY_LoadDer_ex(local,
(const unsigned char*)key->pkey.ptr, (const unsigned char*)key->pkey.ptr, key->pkey_sz,
key->pkey_sz, WOLFSSL_EC_KEY_LOAD_PUBLIC) != WOLFSSL_SUCCESS) { WOLFSSL_EC_KEY_LOAD_PUBLIC) != WOLFSSL_SUCCESS) {
wolfSSL_EC_KEY_free(local); wolfSSL_EC_KEY_free(local);
local = NULL; local = NULL;
} }
} }
} }
}
else { else {
WOLFSSL_MSG("WOLFSSL_EVP_PKEY does not hold an EC key"); WOLFSSL_MSG("WOLFSSL_EVP_PKEY does not hold an EC key");
wolfSSL_EC_KEY_free(local); wolfSSL_EC_KEY_free(local);
local = NULL; local = NULL;
} }
#ifdef OPENSSL_ALL
if (!local && key->ecc) {
local = wolfSSL_EC_KEY_dup(key->ecc);
}
#endif
return local; return local;
} }
#endif /* HAVE_ECC */ #endif /* HAVE_ECC */
@@ -7225,8 +7229,11 @@ static int ECC_populate_EVP_PKEY(EVP_PKEY* pkey, WOLFSSL_EC_KEY *key)
int wolfSSL_EVP_PKEY_set1_EC_KEY(WOLFSSL_EVP_PKEY *pkey, WOLFSSL_EC_KEY *key) int wolfSSL_EVP_PKEY_set1_EC_KEY(WOLFSSL_EVP_PKEY *pkey, WOLFSSL_EC_KEY *key)
{ {
#ifdef HAVE_ECC #ifdef HAVE_ECC
if((pkey == NULL) || (key ==NULL))return WOLFSSL_FAILURE;
WOLFSSL_ENTER("wolfSSL_EVP_PKEY_set1_EC_KEY"); WOLFSSL_ENTER("wolfSSL_EVP_PKEY_set1_EC_KEY");
if (pkey == NULL || key == NULL) {
return WOLFSSL_FAILURE;
}
#ifndef NO_RSA #ifndef NO_RSA
if (pkey->rsa != NULL && pkey->ownRsa == 1) { if (pkey->rsa != NULL && pkey->ownRsa == 1) {
wolfSSL_RSA_free(pkey->rsa); wolfSSL_RSA_free(pkey->rsa);
@@ -7245,18 +7252,24 @@ int wolfSSL_EVP_PKEY_set1_EC_KEY(WOLFSSL_EVP_PKEY *pkey, WOLFSSL_EC_KEY *key)
} }
pkey->ownDh = 0; pkey->ownDh = 0;
#endif #endif
if (wolfSSL_EC_KEY_up_ref(key) != WOLFSSL_SUCCESS) {
WOLFSSL_MSG("wolfSSL_EC_KEY_up_ref failed");
return WOLFSSL_FAILURE;
}
if (pkey->ecc != NULL && pkey->ownEcc == 1) { if (pkey->ecc != NULL && pkey->ownEcc == 1) {
wolfSSL_EC_KEY_free(pkey->ecc); wolfSSL_EC_KEY_free(pkey->ecc);
} }
pkey->ecc = key; pkey->ecc = key;
pkey->ownEcc = 0; /* pkey does not own EC key */ pkey->ownEcc = 1; /* doesn't own EC_KEY but needs to call free on it */
pkey->type = EVP_PKEY_EC; pkey->type = EVP_PKEY_EC;
return ECC_populate_EVP_PKEY(pkey, key); return ECC_populate_EVP_PKEY(pkey, key);
#else #else
(void)pkey; (void)pkey;
(void)key; (void)key;
return WOLFSSL_FAILURE; return WOLFSSL_FAILURE;
#endif #endif /* HAVE_ECC */
} }
void* wolfSSL_EVP_X_STATE(const WOLFSSL_EVP_CIPHER_CTX* ctx) void* wolfSSL_EVP_X_STATE(const WOLFSSL_EVP_CIPHER_CTX* ctx)