@@ -11169,10 +11169,14 @@ int TLSX_KeyShare_Empty(WOLFSSL* ssl)
1116911169 return ret;
1117011170}
1117111171
11172+ /* Compile-time gating must stay aligned with TLSX_PopulateSupportedGroups().
11173+ * Runtime-only conditions in that function (TLS 1.3 version check, FFDHE
11174+ * key-size bounds, session-resumption short-circuit, downgrade-aware
11175+ * Brainpool TLS 1.2 selection) are intentionally not represented here. */
1117211176static const word16 preferredGroup[] = {
1117311177 /* Sort by strength, but prefer non-experimental PQ/T hybrid groups */
11174- #if defined(WOLFSSL_HAVE_MLKEM ) && ! defined(WOLFSSL_NO_ML_KEM ) && \
11175- defined(WOLFSSL_PQC_HYBRIDS)
11178+ #if defined(WOLFSSL_TLS13 ) && defined(WOLFSSL_HAVE_MLKEM ) && \
11179+ !defined(WOLFSSL_NO_ML_KEM) && defined(WOLFSSL_PQC_HYBRIDS)
1117611180 #if !defined(WOLFSSL_NO_ML_KEM_768) && defined(HAVE_CURVE25519) && \
1117711181 ECC_MIN_KEY_SZ <= 256
1117811182 WOLFSSL_X25519MLKEM768,
@@ -11187,50 +11191,96 @@ static const word16 preferredGroup[] = {
1118711191 ECC_MIN_KEY_SZ <= 256
1118811192 WOLFSSL_SECP256R1MLKEM768,
1118911193 #endif
11190- #endif /* WOLFSSL_HAVE_MLKEM && !WOLFSSL_NO_ML_KEM && WOLFSSL_PQC_HYBRIDS */
11191- #if defined(WOLFSSL_HAVE_MLKEM) && !defined(WOLFSSL_NO_ML_KEM) && \
11192- !defined(WOLFSSL_NO_ML_KEM_1024) && !defined(WOLFSSL_TLS_NO_MLKEM_STANDALONE)
11194+ #endif /* WOLFSSL_TLS13 && WOLFSSL_HAVE_MLKEM && !WOLFSSL_NO_ML_KEM &&
11195+ * WOLFSSL_PQC_HYBRIDS */
11196+ #if defined(WOLFSSL_TLS13) && defined(WOLFSSL_HAVE_MLKEM) && \
11197+ !defined(WOLFSSL_NO_ML_KEM) && !defined(WOLFSSL_NO_ML_KEM_1024) && \
11198+ !defined(WOLFSSL_TLS_NO_MLKEM_STANDALONE)
1119311199 WOLFSSL_ML_KEM_1024,
1119411200#endif
11195- #if defined(HAVE_ECC) && (! defined(NO_ECC521 ) || \
11196- defined(HAVE_ALL_CURVES)) && !defined(NO_ECC_SECP) && ECC_MIN_KEY_SZ <= 521
11201+ #if defined(HAVE_ECC) && (defined(HAVE_ECC521 ) || defined(HAVE_ALL_CURVES)) && \
11202+ !defined(NO_ECC_SECP) && ECC_MIN_KEY_SZ <= 521
1119711203 WOLFSSL_ECC_SECP521R1,
1119811204#endif
11199- #if defined(HAVE_ECC) && defined(HAVE_ECC512) && \
11205+ #if defined(HAVE_ECC) && ( defined(HAVE_ECC512) || defined(HAVE_ALL_CURVES) ) && \
1120011206 defined(HAVE_ECC_BRAINPOOL) && ECC_MIN_KEY_SZ <= 512
1120111207 WOLFSSL_ECC_BRAINPOOLP512R1TLS13,
11208+ WOLFSSL_ECC_BRAINPOOLP512R1,
1120211209#endif
11203- #if defined(WOLFSSL_HAVE_MLKEM) && !defined(WOLFSSL_NO_ML_KEM) && \
11204- !defined(WOLFSSL_NO_ML_KEM_768) && !defined(WOLFSSL_TLS_NO_MLKEM_STANDALONE)
11210+ #if defined(WOLFSSL_TLS13) && defined(WOLFSSL_HAVE_MLKEM) && \
11211+ !defined(WOLFSSL_NO_ML_KEM) && !defined(WOLFSSL_NO_ML_KEM_768) && \
11212+ !defined(WOLFSSL_TLS_NO_MLKEM_STANDALONE)
1120511213 WOLFSSL_ML_KEM_768,
1120611214#endif
11207- #if defined(HAVE_ECC) && (!defined(NO_ECC384) || \
11208- defined(HAVE_ALL_CURVES)) && !defined(NO_ECC_SECP) && ECC_MIN_KEY_SZ <= 384
11215+ #if defined(HAVE_ECC) && (defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES)) && \
11216+ ECC_MIN_KEY_SZ <= 384
11217+ #ifndef NO_ECC_SECP
1120911218 WOLFSSL_ECC_SECP384R1,
11210- #if defined(HAVE_ECC_BRAINPOOL)
11219+ #endif
11220+ #ifdef HAVE_ECC_BRAINPOOL
1121111221 WOLFSSL_ECC_BRAINPOOLP384R1TLS13,
11222+ WOLFSSL_ECC_BRAINPOOLP384R1,
11223+ #endif
1121211224#endif
11213- #endif
11214- #if defined(HAVE_CURVE448) && ECC_MIN_KEY_SZ <= 448
11225+ #if !defined(HAVE_FIPS) && defined(HAVE_CURVE448) && ECC_MIN_KEY_SZ <= 448
1121511226 WOLFSSL_ECC_X448,
1121611227#endif
11217- #if defined(WOLFSSL_HAVE_MLKEM) && !defined(WOLFSSL_NO_ML_KEM) && \
11218- !defined(WOLFSSL_NO_ML_KEM_512) && !defined(WOLFSSL_TLS_NO_MLKEM_STANDALONE)
11228+ #if defined(WOLFSSL_TLS13) && defined(WOLFSSL_HAVE_MLKEM) && \
11229+ !defined(WOLFSSL_NO_ML_KEM) && !defined(WOLFSSL_NO_ML_KEM_512) && \
11230+ !defined(WOLFSSL_TLS_NO_MLKEM_STANDALONE)
1121911231 WOLFSSL_ML_KEM_512,
1122011232#endif
11221- #if defined(HAVE_ECC) && (!defined(NO_ECC256) || \
11222- defined(HAVE_ALL_CURVES)) && !defined(NO_ECC_SECP) && ECC_MIN_KEY_SZ <= 256
11233+ #if defined(HAVE_ECC) && (!defined(NO_ECC256) || defined(HAVE_ALL_CURVES)) && \
11234+ ECC_MIN_KEY_SZ <= 256
11235+ #ifndef NO_ECC_SECP
1122311236 WOLFSSL_ECC_SECP256R1,
11224- #if !defined(HAVE_FIPS) && defined(WOLFSSL_SM2)
11225- WOLFSSL_ECC_SM2P256V1,
11226- #endif
11227- #if defined(HAVE_ECC_BRAINPOOL)
11237+ #endif
11238+ #ifdef HAVE_ECC_KOBLITZ
11239+ WOLFSSL_ECC_SECP256K1,
11240+ #endif
11241+ #ifdef HAVE_ECC_BRAINPOOL
1122811242 WOLFSSL_ECC_BRAINPOOLP256R1TLS13,
11243+ WOLFSSL_ECC_BRAINPOOLP256R1,
11244+ #endif
11245+ #if !defined(HAVE_FIPS) && defined(WOLFSSL_SM2)
11246+ WOLFSSL_ECC_SM2P256V1,
11247+ #endif
1122911248#endif
11230- #endif
11231- #if defined(HAVE_CURVE25519) && ECC_MIN_KEY_SZ <= 256
11249+ #if !defined(HAVE_FIPS) && defined(HAVE_CURVE25519) && ECC_MIN_KEY_SZ <= 256
1123211250 WOLFSSL_ECC_X25519,
1123311251#endif
11252+ #if defined(HAVE_ECC) && (defined(HAVE_ECC224) || defined(HAVE_ALL_CURVES)) && \
11253+ ECC_MIN_KEY_SZ <= 224
11254+ #ifndef NO_ECC_SECP
11255+ WOLFSSL_ECC_SECP224R1,
11256+ #endif
11257+ #ifdef HAVE_ECC_KOBLITZ
11258+ WOLFSSL_ECC_SECP224K1,
11259+ #endif
11260+ #endif
11261+ #if !defined(HAVE_FIPS) && defined(HAVE_ECC)
11262+ #if (defined(HAVE_ECC192) || defined(HAVE_ALL_CURVES)) && \
11263+ ECC_MIN_KEY_SZ <= 192
11264+ #ifndef NO_ECC_SECP
11265+ WOLFSSL_ECC_SECP192R1,
11266+ #endif
11267+ #ifdef HAVE_ECC_KOBLITZ
11268+ WOLFSSL_ECC_SECP192K1,
11269+ #endif
11270+ #endif
11271+ #if (defined(HAVE_ECC160) || defined(HAVE_ALL_CURVES)) && \
11272+ ECC_MIN_KEY_SZ <= 160
11273+ #ifndef NO_ECC_SECP
11274+ WOLFSSL_ECC_SECP160R1,
11275+ #endif
11276+ #ifdef HAVE_ECC_SECPR2
11277+ WOLFSSL_ECC_SECP160R2,
11278+ #endif
11279+ #ifdef HAVE_ECC_KOBLITZ
11280+ WOLFSSL_ECC_SECP160K1,
11281+ #endif
11282+ #endif
11283+ #endif /* !HAVE_FIPS && HAVE_ECC */
1123411284#if defined(HAVE_FFDHE_8192)
1123511285 WOLFSSL_FFDHE_8192,
1123611286#endif
@@ -11246,35 +11296,52 @@ static const word16 preferredGroup[] = {
1124611296#if defined(HAVE_FFDHE_2048)
1124711297 WOLFSSL_FFDHE_2048,
1124811298#endif
11249- #ifndef WOLFSSL_NO_ML_KEM
11250- #if !defined(WOLFSSL_NO_ML_KEM_1024) && \
11251- defined(WOLFSSL_EXTRA_PQC_HYBRIDS)
11299+ #if defined(WOLFSSL_TLS13) && defined(WOLFSSL_HAVE_MLKEM) && \
11300+ !defined(WOLFSSL_NO_ML_KEM) && defined(WOLFSSL_EXTRA_PQC_HYBRIDS)
11301+ #if !defined(WOLFSSL_NO_ML_KEM_1024) && defined(HAVE_ECC) && \
11302+ (defined(HAVE_ECC521) || defined(HAVE_ALL_CURVES)) && \
11303+ ECC_MIN_KEY_SZ <= 521
1125211304 WOLFSSL_SECP521R1MLKEM1024,
1125311305 #endif
11254- #if !defined(WOLFSSL_NO_ML_KEM_768) && \
11255- defined(WOLFSSL_EXTRA_PQC_HYBRIDS)
11306+ #if !defined(WOLFSSL_NO_ML_KEM_768) && defined(HAVE_ECC) && \
11307+ (defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES)) && \
11308+ ECC_MIN_KEY_SZ <= 384
1125611309 WOLFSSL_SECP384R1MLKEM768,
11257- #if defined(HAVE_CURVE448) && ECC_MIN_KEY_SZ <= 448
11310+ #endif
11311+ #if !defined(WOLFSSL_NO_ML_KEM_768) && defined(HAVE_CURVE448) && \
11312+ ECC_MIN_KEY_SZ <= 448
1125811313 WOLFSSL_X448MLKEM768,
11259- #endif /* HAVE_CURVE448 */
1126011314 #endif
11261- #if !defined(WOLFSSL_NO_ML_KEM_512) && \
11262- defined(WOLFSSL_EXTRA_PQC_HYBRIDS)
11315+ #if !defined(WOLFSSL_NO_ML_KEM_512) && defined(HAVE_ECC) && \
11316+ (!defined(NO_ECC256) || defined(HAVE_ALL_CURVES)) && \
11317+ ECC_MIN_KEY_SZ <= 256
1126311318 WOLFSSL_SECP256R1MLKEM512,
11264- #if defined(HAVE_CURVE25519) && ECC_MIN_KEY_SZ <= 256
11319+ #endif
11320+ #if !defined(WOLFSSL_NO_ML_KEM_512) && defined(HAVE_CURVE25519) && \
11321+ ECC_MIN_KEY_SZ <= 256
1126511322 WOLFSSL_X25519MLKEM512,
11266- #endif /* HAVE_CURVE25519 */
1126711323 #endif
11268- #endif /* !WOLFSSL_NO_ML_KEM */
11269- #ifdef WOLFSSL_MLKEM_KYBER
11324+ #endif /* WOLFSSL_TLS13 && WOLFSSL_HAVE_MLKEM && !WOLFSSL_NO_ML_KEM &&
11325+ * WOLFSSL_EXTRA_PQC_HYBRIDS */
11326+ #if defined(WOLFSSL_TLS13) && defined(WOLFSSL_HAVE_MLKEM) && \
11327+ defined(WOLFSSL_MLKEM_KYBER)
1127011328 #ifdef WOLFSSL_KYBER1024
1127111329 WOLFSSL_KYBER_LEVEL5,
11330+ #if defined(HAVE_ECC) && (defined(HAVE_ECC521) || \
11331+ defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 521
1127211332 WOLFSSL_P521_KYBER_LEVEL5,
1127311333 #endif
11334+ #endif
1127411335 #ifdef WOLFSSL_KYBER768
1127511336 WOLFSSL_KYBER_LEVEL3,
11337+ #if defined(HAVE_ECC) && (defined(HAVE_ECC384) || \
11338+ defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 384
1127611339 WOLFSSL_P384_KYBER_LEVEL3,
11340+ #endif
11341+ #if defined(HAVE_ECC) && (!defined(NO_ECC256) || \
11342+ defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 256
1127711343 WOLFSSL_P256_KYBER_LEVEL3,
11344+ #endif
1127811345 #if defined(HAVE_CURVE25519) && ECC_MIN_KEY_SZ <= 256
1127911346 WOLFSSL_X25519_KYBER_LEVEL3,
1128011347 #endif
@@ -11284,19 +11351,80 @@ static const word16 preferredGroup[] = {
1128411351 #endif
1128511352 #ifdef WOLFSSL_KYBER512
1128611353 WOLFSSL_KYBER_LEVEL1,
11354+ #if defined(HAVE_ECC) && (!defined(NO_ECC256) || \
11355+ defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 256
1128711356 WOLFSSL_P256_KYBER_LEVEL1,
11357+ #endif
1128811358 #if defined(HAVE_CURVE25519) && ECC_MIN_KEY_SZ <= 256
1128911359 WOLFSSL_X25519_KYBER_LEVEL1,
1129011360 #endif
1129111361 #endif
11292- #endif /* WOLFSSL_MLKEM_KYBER */
11362+ #endif /* WOLFSSL_TLS13 && WOLFSSL_HAVE_MLKEM && WOLFSSL_MLKEM_KYBER */
1129311363 WOLFSSL_NAMED_GROUP_INVALID
1129411364};
1129511365
1129611366#define PREFERRED_GROUP_SZ \
1129711367 ((sizeof(preferredGroup)/sizeof(*preferredGroup)) - 1)
1129811368 /* -1 for the invalid group */
1129911369
11370+ /* WOLFSSL_KEY_SHARE_DEFAULT_GROUP - group used for the speculative key share
11371+ * in ClientHello messages when the application has not selected one via
11372+ * wolfSSL_CTX_set_groups() / wolfSSL_set_groups() or wolfSSL_UseKeyShare().
11373+ *
11374+ * The default is optimized for the likelihood that the server will accept the
11375+ * speculative key share without forcing a HelloRetryRequest. It therefore
11376+ * differs from preferredGroup[] (which is sorted by strength): we pick the
11377+ * most widely deployed group at each tier rather than the strongest.
11378+ *
11379+ * Selection order when not user-defined:
11380+ * 1. A standardized PQ/T hybrid using X25519 or SECP256R1, if available.
11381+ * 2. SECP256R1, then X25519, then SECP384R1.
11382+ * 3. FFDHE 2048 or 3072, for DH-only TLS 1.3 builds.
11383+ * 4. preferredGroup[0] as a final fallback for any other configuration.
11384+ *
11385+ * Users can override the default by defining WOLFSSL_KEY_SHARE_DEFAULT_GROUP
11386+ * in user_settings.h to any of the WOLFSSL_* group identifiers from
11387+ * wolfssl/ssl.h (or the numeric IANA code point). The macro is substituted
11388+ * directly into an assignment, so wrap non-trivial expressions in parentheses.
11389+ */
11390+ #ifndef WOLFSSL_KEY_SHARE_DEFAULT_GROUP
11391+ #if defined(WOLFSSL_TLS13) && defined(WOLFSSL_HAVE_MLKEM) && \
11392+ !defined(WOLFSSL_NO_ML_KEM) && defined(WOLFSSL_PQC_HYBRIDS) && \
11393+ !defined(WOLFSSL_NO_ML_KEM_768) && defined(HAVE_CURVE25519) && \
11394+ ECC_MIN_KEY_SZ <= 256
11395+ #define WOLFSSL_KEY_SHARE_DEFAULT_GROUP WOLFSSL_X25519MLKEM768
11396+ #elif defined(WOLFSSL_TLS13) && defined(WOLFSSL_HAVE_MLKEM) && \
11397+ !defined(WOLFSSL_NO_ML_KEM) && defined(WOLFSSL_PQC_HYBRIDS) && \
11398+ !defined(WOLFSSL_NO_ML_KEM_768) && defined(HAVE_ECC) && \
11399+ (!defined(NO_ECC256) || defined(HAVE_ALL_CURVES)) && \
11400+ ECC_MIN_KEY_SZ <= 256
11401+ #define WOLFSSL_KEY_SHARE_DEFAULT_GROUP WOLFSSL_SECP256R1MLKEM768
11402+ #elif defined(WOLFSSL_TLS13) && defined(WOLFSSL_HAVE_MLKEM) && \
11403+ !defined(WOLFSSL_NO_ML_KEM) && defined(WOLFSSL_PQC_HYBRIDS) && \
11404+ !defined(WOLFSSL_NO_ML_KEM_1024) && defined(HAVE_ECC) && \
11405+ (defined(HAVE_ECC384) || defined(HAVE_ALL_CURVES)) && \
11406+ ECC_MIN_KEY_SZ <= 384
11407+ #define WOLFSSL_KEY_SHARE_DEFAULT_GROUP WOLFSSL_SECP384R1MLKEM1024
11408+ #elif defined(HAVE_ECC) && (!defined(NO_ECC256) || \
11409+ defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 256 && \
11410+ !defined(NO_ECC_SECP)
11411+ #define WOLFSSL_KEY_SHARE_DEFAULT_GROUP WOLFSSL_ECC_SECP256R1
11412+ #elif !defined(HAVE_FIPS) && defined(HAVE_CURVE25519) && ECC_MIN_KEY_SZ <= 256
11413+ #define WOLFSSL_KEY_SHARE_DEFAULT_GROUP WOLFSSL_ECC_X25519
11414+ #elif defined(HAVE_ECC) && (defined(HAVE_ECC384) || \
11415+ defined(HAVE_ALL_CURVES)) && ECC_MIN_KEY_SZ <= 384 && \
11416+ !defined(NO_ECC_SECP)
11417+ #define WOLFSSL_KEY_SHARE_DEFAULT_GROUP WOLFSSL_ECC_SECP384R1
11418+ #elif defined(HAVE_FFDHE_2048)
11419+ #define WOLFSSL_KEY_SHARE_DEFAULT_GROUP WOLFSSL_FFDHE_2048
11420+ #elif defined(HAVE_FFDHE_3072)
11421+ #define WOLFSSL_KEY_SHARE_DEFAULT_GROUP WOLFSSL_FFDHE_3072
11422+ #else
11423+ /* Fall back to whatever preferredGroup[] starts with. */
11424+ #define WOLFSSL_KEY_SHARE_DEFAULT_GROUP (preferredGroup[0])
11425+ #endif
11426+ #endif /* !WOLFSSL_KEY_SHARE_DEFAULT_GROUP */
11427+
1130011428/* Examines the application specified group ranking and returns the rank of the
1130111429 * group.
1130211430 * If no group ranking set then all groups are rank 0 (highest).
@@ -15654,7 +15782,7 @@ static int TLSX_PopulateSupportedGroups(WOLFSSL* ssl, TLSX** extensions)
1565415782 if (ret != WOLFSSL_SUCCESS) return ret;
1565515783 }
1565615784 #endif
15657- #ifdef WOLFSSL_SM2
15785+ #if !defined(HAVE_FIPS) && defined( WOLFSSL_SM2)
1565815786 ret = TLSX_UseSupportedCurve(extensions,
1565915787 WOLFSSL_ECC_SM2P256V1, ssl->heap);
1566015788 if (ret != WOLFSSL_SUCCESS) return ret;
@@ -15904,8 +16032,7 @@ int TLSX_PopulateExtensions(WOLFSSL* ssl, byte isServer)
1590416032 }
1590516033#endif
1590616034
15907- #if (defined(HAVE_ECC) || defined(HAVE_CURVE25519) || \
15908- defined(HAVE_CURVE448)) && defined(HAVE_SUPPORTED_CURVES)
16035+ #if defined(HAVE_SUPPORTED_CURVES)
1590916036 if (!ssl->options.userCurves && !ssl->ctx->userCurves) {
1591016037 if (TLSX_Find(ssl->ctx->extensions,
1591116038 TLSX_SUPPORTED_GROUPS) == NULL) {
@@ -15914,15 +16041,17 @@ int TLSX_PopulateExtensions(WOLFSSL* ssl, byte isServer)
1591416041 return ret;
1591516042 }
1591616043 }
16044+ #if defined(HAVE_ECC) || defined(HAVE_CURVE25519) || defined(HAVE_CURVE448)
1591716045 if ((!IsAtLeastTLSv1_3(ssl->version) || ssl->options.downgrade) &&
1591816046 TLSX_Find(ssl->ctx->extensions, TLSX_EC_POINT_FORMATS) == NULL &&
1591916047 TLSX_Find(ssl->extensions, TLSX_EC_POINT_FORMATS) == NULL) {
15920- ret = TLSX_UsePointFormat(&ssl->extensions,
16048+ ret = TLSX_UsePointFormat(&ssl->extensions,
1592116049 WOLFSSL_EC_PF_UNCOMPRESSED, ssl->heap);
15922- if (ret != WOLFSSL_SUCCESS)
15923- return ret;
16050+ if (ret != WOLFSSL_SUCCESS)
16051+ return ret;
1592416052 }
15925- #endif /* (HAVE_ECC || CURVE25519 || CURVE448) && HAVE_SUPPORTED_CURVES */
16053+ #endif
16054+ #endif /* HAVE_SUPPORTED_CURVES */
1592616055
1592716056#ifdef WOLFSSL_SRTP
1592816057 if (ssl->options.dtls && ssl->dtlsSrtpProfiles != 0) {
@@ -15971,20 +16100,6 @@ int TLSX_PopulateExtensions(WOLFSSL* ssl, byte isServer)
1597116100 return ret;
1597216101 }
1597316102
15974- #if !defined(HAVE_ECC) && !defined(HAVE_CURVE25519) && \
15975- !defined(HAVE_CURVE448) && defined(HAVE_SUPPORTED_CURVES)
15976- if (TLSX_Find(ssl->ctx->extensions, TLSX_SUPPORTED_GROUPS) == NULL) {
15977- /* Put in DH groups for TLS 1.3 only. */
15978- ret = TLSX_PopulateSupportedGroups(ssl, &ssl->extensions);
15979- if (ret != WOLFSSL_SUCCESS)
15980- return ret;
15981- /* ret value will be overwritten in !NO_PSK case */
15982- #ifdef NO_PSK
15983- ret = 0;
15984- #endif
15985- }
15986- #endif /* !(HAVE_ECC || CURVE25519 || CURVE448) && HAVE_SUPPORTED_CURVES */
15987-
1598816103 #if !defined(NO_CERTS) && !defined(WOLFSSL_NO_SIGALG)
1598916104 if (ssl->certHashSigAlgoSz > 0) {
1599016105 WOLFSSL_MSG("Adding signature algorithms cert extension");
@@ -16007,10 +16122,11 @@ int TLSX_PopulateExtensions(WOLFSSL* ssl, byte isServer)
1600716122 int set = 0;
1600816123 int i, j;
1600916124
16010- /* try to find the highest element in ssl->group[]
16011- * that is contained in preferredGroup[].
16012- */
16013- namedGroup = preferredGroup[0];
16125+ /* Find the first element of ssl->group[] that is also
16126+ * present in preferredGroup[]. The user's ranking wins;
16127+ * if nothing intersects, send no key share and let the
16128+ * server drive group selection via HRR. */
16129+ namedGroup = WOLFSSL_NAMED_GROUP_INVALID;
1601416130 for (i = 0; i < ssl->numGroups && !set; i++) {
1601516131 for (j = 0; preferredGroup[j] != WOLFSSL_NAMED_GROUP_INVALID; j++) {
1601616132 if (preferredGroup[j] == ssl->group[i]) {
@@ -16020,12 +16136,10 @@ int TLSX_PopulateExtensions(WOLFSSL* ssl, byte isServer)
1602016136 }
1602116137 }
1602216138 }
16023- if (!set)
16024- namedGroup = WOLFSSL_NAMED_GROUP_INVALID;
1602516139 }
1602616140 else {
1602716141 /* Choose the most preferred group. */
16028- namedGroup = preferredGroup[0] ;
16142+ namedGroup = WOLFSSL_KEY_SHARE_DEFAULT_GROUP ;
1602916143 }
1603016144 }
1603116145 else {
@@ -16036,9 +16150,15 @@ int TLSX_PopulateExtensions(WOLFSSL* ssl, byte isServer)
1603616150 if (namedGroup != WOLFSSL_NAMED_GROUP_INVALID) {
1603716151 ret = TLSX_KeyShare_Use(ssl, namedGroup, 0, NULL, NULL,
1603816152 &ssl->extensions);
16039- if (ret != 0)
16040- return ret;
1604116153 }
16154+ else {
16155+ /* No suitable key share group found, send no key share to
16156+ * trigger a HRR with the server's preferred group. */
16157+ WOLFSSL_MSG("Sending no key share to trigger HRR");
16158+ ret = TLSX_KeyShare_Empty(ssl);
16159+ }
16160+ if (ret != 0)
16161+ return ret;
1604216162 #endif /* HAVE_SUPPORTED_CURVES */
1604316163
1604416164 #if defined(HAVE_SESSION_TICKET) || !defined(NO_PSK)
0 commit comments