@@ -412,50 +412,6 @@ WC_RNG* wolfssl_make_rng(WC_RNG* rng, int* local)
412412
413413#include <wolfssl/wolfcrypt/hpke.h>
414414
415- #if defined(OPENSSL_EXTRA) && defined(HAVE_ECC)
416- const WOLF_EC_NIST_NAME kNistCurves[] = {
417- {XSTR_SIZEOF("P-192"), "P-192", NID_X9_62_prime192v1},
418- {XSTR_SIZEOF("P-256"), "P-256", NID_X9_62_prime256v1},
419- {XSTR_SIZEOF("P-112"), "P-112", NID_secp112r1},
420- {XSTR_SIZEOF("P-112-2"), "P-112-2", NID_secp112r2},
421- {XSTR_SIZEOF("P-128"), "P-128", NID_secp128r1},
422- {XSTR_SIZEOF("P-128-2"), "P-128-2", NID_secp128r2},
423- {XSTR_SIZEOF("P-160"), "P-160", NID_secp160r1},
424- {XSTR_SIZEOF("P-160-2"), "P-160-2", NID_secp160r2},
425- {XSTR_SIZEOF("P-224"), "P-224", NID_secp224r1},
426- {XSTR_SIZEOF("P-384"), "P-384", NID_secp384r1},
427- {XSTR_SIZEOF("P-521"), "P-521", NID_secp521r1},
428- {XSTR_SIZEOF("K-160"), "K-160", NID_secp160k1},
429- {XSTR_SIZEOF("K-192"), "K-192", NID_secp192k1},
430- {XSTR_SIZEOF("K-224"), "K-224", NID_secp224k1},
431- {XSTR_SIZEOF("K-256"), "K-256", NID_secp256k1},
432- {XSTR_SIZEOF("B-160"), "B-160", NID_brainpoolP160r1},
433- {XSTR_SIZEOF("B-192"), "B-192", NID_brainpoolP192r1},
434- {XSTR_SIZEOF("B-224"), "B-224", NID_brainpoolP224r1},
435- {XSTR_SIZEOF("B-256"), "B-256", NID_brainpoolP256r1},
436- {XSTR_SIZEOF("B-320"), "B-320", NID_brainpoolP320r1},
437- {XSTR_SIZEOF("B-384"), "B-384", NID_brainpoolP384r1},
438- {XSTR_SIZEOF("B-512"), "B-512", NID_brainpoolP512r1},
439- #ifdef HAVE_PQC
440- {XSTR_SIZEOF("KYBER_LEVEL1"), "KYBER_LEVEL1", WOLFSSL_KYBER_LEVEL1},
441- {XSTR_SIZEOF("KYBER_LEVEL3"), "KYBER_LEVEL3", WOLFSSL_KYBER_LEVEL3},
442- {XSTR_SIZEOF("KYBER_LEVEL5"), "KYBER_LEVEL5", WOLFSSL_KYBER_LEVEL5},
443- #ifdef HAVE_LIBOQS
444- {XSTR_SIZEOF("P256_KYBER_LEVEL1"), "P256_KYBER_LEVEL1",
445- WOLFSSL_P256_KYBER_LEVEL1},
446- {XSTR_SIZEOF("P384_KYBER_LEVEL3"), "P384_KYBER_LEVEL3",
447- WOLFSSL_P384_KYBER_LEVEL3},
448- {XSTR_SIZEOF("P521_KYBER_LEVEL5"), "P521_KYBER_LEVEL5",
449- WOLFSSL_P521_KYBER_LEVEL5},
450- #endif
451- #endif
452- #ifdef WOLFSSL_SM2
453- {XSTR_SIZEOF("SM2"), "SM2", NID_sm2},
454- #endif
455- {0, NULL, 0},
456- };
457- #endif
458-
459415#if defined(WOLFSSL_TLS13) && defined(HAVE_ECH)
460416/* create the hpke key and ech config to send to clients */
461417int wolfSSL_CTX_GenerateEchConfig(WOLFSSL_CTX* ctx, const char* publicName,
@@ -17599,80 +17555,22 @@ int wolfSSL_get_peer_signature_type_nid(const WOLFSSL* ssl, int* nid)
1759917555#ifdef HAVE_ECC
1760017556
1760117557#if defined(WOLFSSL_TLS13) && defined(HAVE_SUPPORTED_CURVES)
17602- static int populate_groups(int* groups, int max_count, const char *list)
17603- {
17604- const char *end;
17605- int count = 0;
17606- const WOLF_EC_NIST_NAME* nist_name;
17607-
17608- if (!groups || !list) {
17609- return -1;
17610- }
17611-
17612- for (end = list; ; list = ++end) {
17613- int len;
17614-
17615- if (count > max_count) {
17616- WOLFSSL_MSG("Too many curves in list");
17617- return -1;
17618- }
17619- while (*end != ':' && *end != '\0') end++;
17620- len = (int)(end - list); /* end points to char after end
17621- * of curve name so no need for -1 */
17622- if ((len < kNistCurves_MIN_NAME_LEN) ||
17623- (len > kNistCurves_MAX_NAME_LEN)) {
17624- WOLFSSL_MSG("Unrecognized curve name in list");
17625- return -1;
17626- }
17627- for (nist_name = kNistCurves; nist_name->name != NULL; nist_name++) {
17628- if (len == nist_name->name_len &&
17629- XSTRNCMP(list, nist_name->name, nist_name->name_len) == 0) {
17630- break;
17631- }
17632- }
17633- if (!nist_name->name) {
17634- WOLFSSL_MSG("Unrecognized curve name in list");
17635- return -1;
17636- }
17637- groups[count++] = nist_name->nid;
17638- if (*end == '\0') break;
17639- }
17640-
17641- return count;
17642- }
17643-
1764417558int wolfSSL_CTX_set1_groups_list(WOLFSSL_CTX *ctx, const char *list)
1764517559{
17646- int groups[WOLFSSL_MAX_GROUP_COUNT];
17647- int count = 0;
17648-
1764917560 if (!ctx || !list) {
1765017561 return WOLFSSL_FAILURE;
1765117562 }
1765217563
17653- if ((count = populate_groups(groups,
17654- WOLFSSL_MAX_GROUP_COUNT, list)) == -1) {
17655- return WOLFSSL_FAILURE;
17656- }
17657-
17658- return wolfSSL_CTX_set1_groups(ctx, groups, count);
17564+ return set_curves_list(NULL, ctx, list, 0);
1765917565}
1766017566
1766117567int wolfSSL_set1_groups_list(WOLFSSL *ssl, const char *list)
1766217568{
17663- int groups[WOLFSSL_MAX_GROUP_COUNT];
17664- int count = 0;
17665-
1766617569 if (!ssl || !list) {
1766717570 return WOLFSSL_FAILURE;
1766817571 }
1766917572
17670- if ((count = populate_groups(groups,
17671- WOLFSSL_MAX_GROUP_COUNT, list)) == -1) {
17672- return WOLFSSL_FAILURE;
17673- }
17674-
17675- return wolfSSL_set1_groups(ssl, groups, count);
17573+ return set_curves_list(ssl, NULL, list, 0);
1767617574}
1767717575#endif /* WOLFSSL_TLS13 */
1767817576
@@ -21388,7 +21286,55 @@ int wolfSSL_curve_is_disabled(const WOLFSSL* ssl, word16 curve_id)
2138821286
2138921287#if (defined(HAVE_ECC) || \
2139021288 defined(HAVE_CURVE25519) || defined(HAVE_CURVE448))
21391- static int set_curves_list(WOLFSSL* ssl, WOLFSSL_CTX *ctx, const char* names)
21289+ #define CURVE_NAME(c) XSTR_SIZEOF((c)), (c)
21290+
21291+ const WOLF_EC_NIST_NAME kNistCurves[] = {
21292+ {CURVE_NAME("P-160"), NID_secp160r1, WOLFSSL_ECC_SECP160R1},
21293+ {CURVE_NAME("P-160-2"), NID_secp160r2, WOLFSSL_ECC_SECP160R2},
21294+ {CURVE_NAME("P-192"), NID_X9_62_prime192v1, WOLFSSL_ECC_SECP192R1},
21295+ {CURVE_NAME("P-224"), NID_secp224r1, WOLFSSL_ECC_SECP224R1},
21296+ {CURVE_NAME("P-256"), NID_X9_62_prime256v1, WOLFSSL_ECC_SECP256R1},
21297+ {CURVE_NAME("P-384"), NID_secp384r1, WOLFSSL_ECC_SECP384R1},
21298+ {CURVE_NAME("P-521"), NID_secp521r1, WOLFSSL_ECC_SECP521R1},
21299+ {CURVE_NAME("K-160"), NID_secp160k1, WOLFSSL_ECC_SECP160K1},
21300+ {CURVE_NAME("K-192"), NID_secp192k1, WOLFSSL_ECC_SECP192K1},
21301+ {CURVE_NAME("K-224"), NID_secp224k1, WOLFSSL_ECC_SECP224R1},
21302+ {CURVE_NAME("K-256"), NID_secp256k1, WOLFSSL_ECC_SECP256K1},
21303+ {CURVE_NAME("B-256"), NID_brainpoolP256r1, WOLFSSL_ECC_BRAINPOOLP256R1},
21304+ {CURVE_NAME("B-384"), NID_brainpoolP384r1, WOLFSSL_ECC_BRAINPOOLP384R1},
21305+ {CURVE_NAME("B-512"), NID_brainpoolP512r1, WOLFSSL_ECC_BRAINPOOLP512R1},
21306+ #ifdef HAVE_CURVE25519
21307+ {CURVE_NAME("X25519"), NID_X25519, WOLFSSL_ECC_X25519},
21308+ #endif
21309+ #ifdef HAVE_CURVE448
21310+ {CURVE_NAME("X448"), NID_X448, WOLFSSL_ECC_X448},
21311+ #endif
21312+ #ifdef HAVE_PQC
21313+ {CURVE_NAME("KYBER_LEVEL1"), WOLFSSL_KYBER_LEVEL1, WOLFSSL_KYBER_LEVEL1},
21314+ {CURVE_NAME("KYBER_LEVEL3"), WOLFSSL_KYBER_LEVEL3, WOLFSSL_KYBER_LEVEL1},
21315+ {CURVE_NAME("KYBER_LEVEL5"), WOLFSSL_KYBER_LEVEL5, WOLFSSL_KYBER_LEVEL1},
21316+ #ifdef HAVE_LIBOQS
21317+ {CURVE_NAME("P256_KYBER_LEVEL1"), WOLFSSL_P256_KYBER_LEVEL1, WOLFSSL_P256_KYBER_LEVEL1},
21318+ {CURVE_NAME("P384_KYBER_LEVEL3"), WOLFSSL_P384_KYBER_LEVEL3, WOLFSSL_P256_KYBER_LEVEL1},
21319+ {CURVE_NAME("P521_KYBER_LEVEL5"), WOLFSSL_P521_KYBER_LEVEL5, WOLFSSL_P256_KYBER_LEVEL1},
21320+ #endif
21321+ #endif
21322+ #ifdef WOLFSSL_SM2
21323+ {CURVE_NAME("SM2"), NID_sm2, WOLFSSL_ECC_SM2P256V1},
21324+ #endif
21325+ /* Alternative curve names */
21326+ {CURVE_NAME("prime256v1"), NID_X9_62_prime256v1, WOLFSSL_ECC_SECP256R1},
21327+ {CURVE_NAME("secp256r1"), NID_X9_62_prime256v1, WOLFSSL_ECC_SECP256R1},
21328+ {CURVE_NAME("secp384r1"), NID_secp384r1, WOLFSSL_ECC_SECP384R1},
21329+ {CURVE_NAME("secp521r1"), NID_secp521r1, WOLFSSL_ECC_SECP521R1},
21330+ #ifdef WOLFSSL_SM2
21331+ {CURVE_NAME("sm2p256v1"), NID_sm2, WOLFSSL_ECC_SM2P256V1},
21332+ #endif
21333+ {0, NULL, 0, 0},
21334+ };
21335+
21336+ int set_curves_list(WOLFSSL* ssl, WOLFSSL_CTX *ctx, const char* names,
21337+ byte curves_only)
2139221338{
2139321339 int idx, start = 0, len, i, ret = WOLFSSL_FAILURE;
2139421340 word16 curve;
@@ -21401,6 +21347,7 @@ static int set_curves_list(WOLFSSL* ssl, WOLFSSL_CTX *ctx, const char* names)
2140121347#else
2140221348 int groups[WOLFSSL_MAX_GROUP_COUNT];
2140321349#endif
21350+ const WOLF_EC_NIST_NAME* nist_name;
2140421351
2140521352#ifdef WOLFSSL_SMALL_STACK
2140621353 groups = (int*)XMALLOC(sizeof(int)*WOLFSSL_MAX_GROUP_COUNT,
@@ -21420,45 +21367,18 @@ static int set_curves_list(WOLFSSL* ssl, WOLFSSL_CTX *ctx, const char* names)
2142021367 goto leave;
2142121368
2142221369 XMEMCPY(name, names + start, len);
21423- name[len++] = 0;
21370+ name[len] = 0;
21371+ curve = WOLFSSL_NAMED_GROUP_INVALID;
2142421372
21425- /* Use XSTRNCMP to avoid valgrind error. */
21426- if ((XSTRNCMP(name, "prime256v1", len) == 0) ||
21427- (XSTRNCMP(name, "secp256r1", len) == 0) ||
21428- (XSTRNCMP(name, "P-256", len) == 0))
21429- {
21430- curve = WOLFSSL_ECC_SECP256R1;
21431- }
21432- else if ((XSTRNCMP(name, "secp384r1", len) == 0) ||
21433- (XSTRNCMP(name, "P-384", len) == 0))
21434- {
21435- curve = WOLFSSL_ECC_SECP384R1;
21436- }
21437- else if ((XSTRNCMP(name, "secp521r1", len) == 0) ||
21438- (XSTRNCMP(name, "P-521", len) == 0))
21439- {
21440- curve = WOLFSSL_ECC_SECP521R1;
21441- }
21442- #ifdef WOLFSSL_SM2
21443- else if ((XSTRNCMP(name, "sm2p256v1", len) == 0) ||
21444- (XSTRNCMP(name, "SM2", len) == 0))
21445- {
21446- curve = WOLFSSL_ECC_SM2P256V1;
21447- }
21448- #endif
21449- #ifdef HAVE_CURVE25519
21450- else if (XSTRNCMP(name, "X25519", len) == 0)
21451- {
21452- curve = WOLFSSL_ECC_X25519;
21453- }
21454- #endif
21455- #ifdef HAVE_CURVE448
21456- else if (XSTRNCMP(name, "X448", len) == 0)
21457- {
21458- curve = WOLFSSL_ECC_X448;
21373+ for (nist_name = kNistCurves; nist_name->name != NULL; nist_name++) {
21374+ if (len == nist_name->name_len &&
21375+ XSTRNCMP(name, nist_name->name, len) == 0) {
21376+ curve = nist_name->curve;
21377+ break;
21378+ }
2145921379 }
21460- #endif
21461- else {
21380+
21381+ if (curve == WOLFSSL_NAMED_GROUP_INVALID) {
2146221382 #if !defined(HAVE_FIPS) && !defined(HAVE_SELFTEST) && defined(HAVE_ECC)
2146321383 int nret;
2146421384 const ecc_set_type *eccSet;
@@ -21482,7 +21402,8 @@ static int set_curves_list(WOLFSSL* ssl, WOLFSSL_CTX *ctx, const char* names)
2148221402 #endif
2148321403 }
2148421404
21485- if (curve >= WOLFSSL_ECC_MAX_AVAIL) {
21405+ if ((curves_only && curve >= WOLFSSL_ECC_MAX_AVAIL) ||
21406+ curve == WOLFSSL_NAMED_GROUP_INVALID) {
2148621407 WOLFSSL_MSG("curve value is not supported");
2148721408 goto leave;
2148821409 }
@@ -21564,7 +21485,7 @@ int wolfSSL_CTX_set1_curves_list(WOLFSSL_CTX* ctx, const char* names)
2156421485 WOLFSSL_MSG("ctx or names was NULL");
2156521486 return WOLFSSL_FAILURE;
2156621487 }
21567- return set_curves_list(NULL, ctx, names);
21488+ return set_curves_list(NULL, ctx, names, 1 );
2156821489}
2156921490
2157021491int wolfSSL_set1_curves_list(WOLFSSL* ssl, const char* names)
@@ -21574,7 +21495,7 @@ int wolfSSL_set1_curves_list(WOLFSSL* ssl, const char* names)
2157421495 WOLFSSL_MSG("ssl or names was NULL");
2157521496 return WOLFSSL_FAILURE;
2157621497 }
21577- return set_curves_list(ssl, NULL, names);
21498+ return set_curves_list(ssl, NULL, names, 1 );
2157821499}
2157921500#endif /* (HAVE_ECC || HAVE_CURVE25519 || HAVE_CURVE448) */
2158021501#endif /* OPENSSL_EXTRA || HAVE_CURL */
0 commit comments