Skip to content

Commit df425b3

Browse files
committed
Fix #7391
1 parent 86c120a commit df425b3

4 files changed

Lines changed: 85 additions & 157 deletions

File tree

src/ssl.c

Lines changed: 66 additions & 145 deletions
Original file line numberDiff line numberDiff line change
@@ -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 */
461417
int 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-
1764417558
int 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

1766117567
int 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

2157021491
int 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 */

tests/api.c

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -55214,15 +55214,21 @@ static int test_tls13_apis(void)
5521455214
#endif
5521555215
#if defined(OPENSSL_EXTRA) && defined(HAVE_ECC)
5521655216
char groupList[] =
55217+
#ifdef HAVE_CURVE25519
55218+
"X25519:"
55219+
#endif
55220+
#ifdef HAVE_CURVE448
55221+
"X448:"
55222+
#endif
5521755223
#ifndef NO_ECC_SECP
5521855224
#if (defined(HAVE_ECC521) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 521
55219-
"P-521:"
55225+
"P-521:secp521r1:"
5522055226
#endif
5522155227
#if (defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 384
55222-
"P-384:"
55228+
"P-384:secp384r1:"
5522355229
#endif
5522455230
#if (!defined(NO_ECC256) || defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 256
55225-
"P-256"
55231+
"P-256:secp256r1"
5522655232
#if defined(HAVE_PQC) && defined(HAVE_LIBOQS)
5522755233
":P256_KYBER_LEVEL1"
5522855234
#endif

wolfssl/internal.h

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1768,7 +1768,7 @@ enum Misc {
17681768
ECDHE_SIZE = 32, /* ECDHE server size defaults to 256 bit */
17691769
#endif
17701770
MAX_EXPORT_ECC_SZ = 256, /* Export ANSI X9.62 max future size */
1771-
MAX_CURVE_NAME_SZ = 16, /* Maximum size of curve name string */
1771+
MAX_CURVE_NAME_SZ = 18, /* Maximum size of curve name string */
17721772

17731773
NEW_SA_MAJOR = 8, /* Most significant byte used with new sig algos */
17741774
ED25519_SA_MAJOR = 8, /* Most significant byte for ED25519 */
@@ -6117,16 +6117,11 @@ typedef struct {
61176117
int name_len;
61186118
const char *name;
61196119
int nid;
6120+
word16 curve;
61206121
} WOLF_EC_NIST_NAME;
61216122
extern const WOLF_EC_NIST_NAME kNistCurves[];
6122-
/* This is the longest and shortest curve name in the kNistCurves list. Note we
6123-
* also have quantum-safe group names as well. */
6124-
#define kNistCurves_MIN_NAME_LEN 5
6125-
#ifdef HAVE_PQC
6126-
#define kNistCurves_MAX_NAME_LEN 32
6127-
#else
6128-
#define kNistCurves_MAX_NAME_LEN 7
6129-
#endif
6123+
WOLFSSL_LOCAL int set_curves_list(WOLFSSL* ssl, WOLFSSL_CTX *ctx,
6124+
const char* names, byte curves_only);
61306125
#endif /* OPENSSL_EXTRA || WOLFSSL_WPAS_SMALL */
61316126

61326127
/* internal functions */

wolfssl/openssl/ec.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,9 +74,15 @@ enum {
7474
#ifdef HAVE_ED448
7575
NID_ED448 = ED448k,
7676
#endif
77+
#ifdef HAVE_CURVE448
78+
NID_X448 = X448k,
79+
#endif
7780
#ifdef HAVE_ED25519
7881
NID_ED25519 = ED25519k,
7982
#endif
83+
#ifdef HAVE_CURVE25519
84+
NID_X25519 = X25519k,
85+
#endif
8086

8187
OPENSSL_EC_EXPLICIT_CURVE = 0x000,
8288
OPENSSL_EC_NAMED_CURVE = 0x001,

0 commit comments

Comments
 (0)