diff --git a/src/ssl.c b/src/ssl.c index a0c791c45..2d926d131 100644 --- a/src/ssl.c +++ b/src/ssl.c @@ -36387,8 +36387,8 @@ WOLFSSL_EC_KEY *wolfSSL_EC_KEY_new(void) goto error; } - /* curve group */ - external->group = wolfSSL_EC_GROUP_new_by_curve_name(ECC_CURVE_DEF); + /* Group unknown at creation */ + external->group = wolfSSL_EC_GROUP_new_by_curve_name(NID_undef); if (external->group == NULL) { WOLFSSL_MSG("wolfSSL_EC_KEY_new malloc WOLFSSL_EC_GROUP failure"); goto error; @@ -36433,18 +36433,28 @@ void wolfSSL_EC_KEY_free(WOLFSSL_EC_KEY *key) } } -#ifndef NO_WOLFSSL_STUB + +/* set the group in WOLFSSL_EC_KEY and return WOLFSSL_SUCCESS on success */ int wolfSSL_EC_KEY_set_group(WOLFSSL_EC_KEY *key, WOLFSSL_EC_GROUP *group) { - (void)key; - (void)group; + if (key == NULL || group == NULL) + return WOLFSSL_FAILURE; WOLFSSL_ENTER("wolfSSL_EC_KEY_set_group"); - WOLFSSL_STUB("EC_KEY_set_group"); - return -1; + if (key->group != NULL) { + /* free the current group */ + wolfSSL_EC_GROUP_free(key->group); + } + + key->group = wolfSSL_EC_GROUP_dup(group); + if (key->group == NULL) { + return WOLFSSL_FAILURE; + } + + return WOLFSSL_SUCCESS; } -#endif + int wolfSSL_EC_KEY_generate_key(WOLFSSL_EC_KEY *key) { diff --git a/tests/api.c b/tests/api.c index 7430b1f25..fbd130e93 100644 --- a/tests/api.c +++ b/tests/api.c @@ -36901,6 +36901,28 @@ static void test_wolfSSL_NCONF(void) } #endif /* OPENSSL_ALL */ +static void test_wolfSSL_EC_KEY_set_group(void) +{ +#if defined(HAVE_ECC) && !defined(NO_ECC256) && !defined(NO_ECC_SECP) && \ + defined(OPENSSL_EXTRA) + EC_KEY *key = NULL; + EC_GROUP *group = NULL; + const EC_GROUP *group2 = NULL; + + printf(testingFmt, "wolfSSL_EC_KEY_dup()"); + + AssertNotNull(group = EC_GROUP_new_by_curve_name(NID_X9_62_prime256v1)); + AssertNotNull(key = EC_KEY_new()); + AssertIntEQ(EC_KEY_set_group(key, group), WOLFSSL_SUCCESS); + AssertNotNull(group2 = EC_KEY_get0_group(key)); + AssertIntEQ(EC_GROUP_cmp(group2, group, NULL), 0); + + EC_GROUP_free(group); + EC_KEY_free(key); + + printf(resultFmt, passed); +#endif +} static void test_wolfSSL_X509V3_EXT_get(void) { #if !defined(NO_FILESYSTEM) && defined (OPENSSL_ALL) @@ -42433,6 +42455,7 @@ void ApiTest(void) test_CRYPTO_THREADID_xxx(); test_ENGINE_cleanup(); + test_wolfSSL_EC_KEY_set_group(); #if defined(OPENSSL_ALL) test_wolfSSL_X509_PUBKEY_get(); test_wolfSSL_sk_CIPHER_description();