From 0c8b25a684fa6797da338ff1fdb4786ef972823d Mon Sep 17 00:00:00 2001 From: Valerio Setti Date: Wed, 21 Jan 2026 15:24:03 +0100 Subject: [PATCH 01/18] library: ssl: add public function to retrieve the list of supported groups Signed-off-by: Valerio Setti --- include/mbedtls/ssl.h | 18 ++++++++++++++++++ library/ssl_tls.c | 5 +++++ 2 files changed, 23 insertions(+) diff --git a/include/mbedtls/ssl.h b/include/mbedtls/ssl.h index 4fb4584362..ec69c83f15 100644 --- a/include/mbedtls/ssl.h +++ b/include/mbedtls/ssl.h @@ -3660,6 +3660,24 @@ void mbedtls_ssl_conf_psk_cb(mbedtls_ssl_config *conf, #endif /* MBEDTLS_SSL_SRV_C */ #endif /* MBEDTLS_SSL_HANDSHAKE_WITH_PSK_ENABLED */ +/** + * \brief Return the list of supported groups (curves and finite fields). + * + * \note The returned list is ordered in ascending order of resource + * usage. This follows the same pattern of the default list being + * used when mbedtls_ssl_conf_groups() is not called. + * + * \note The returned list represents supported groups in the current build + * configuration, not the one set by mbedtls_ssl_conf_groups(). + * + * \note The returned list is static so the user doesn't need to worry + * about it being freed. + * + * \return The list made of IANA NamedGroups IDs (MBEDTLS_SSL_IANA_TLS_GROUP_xxx) + * with the last item always being MBEDTLS_SSL_IANA_TLS_GROUP_NONE. + */ +const uint16_t *mbedtls_ssl_get_supported_group_list(void); + /** * \brief Set the allowed groups in order of preference. * diff --git a/library/ssl_tls.c b/library/ssl_tls.c index be071defac..e8ebe7d922 100644 --- a/library/ssl_tls.c +++ b/library/ssl_tls.c @@ -2360,6 +2360,11 @@ void mbedtls_ssl_conf_sig_algs(mbedtls_ssl_config *conf, } #endif /* MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED */ +const uint16_t *mbedtls_ssl_get_supported_group_list(void) +{ + return ssl_preset_default_groups; +} + /* * Set the allowed groups */ From 1ab51732e2f3456457f31d012e529e1259eca494 Mon Sep 17 00:00:00 2001 From: Valerio Setti Date: Thu, 22 Jan 2026 05:41:00 +0100 Subject: [PATCH 02/18] library: ssl: improve documentation of mbedtls_ssl_conf_groups() Signed-off-by: Valerio Setti --- include/mbedtls/ssl.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/include/mbedtls/ssl.h b/include/mbedtls/ssl.h index ec69c83f15..b413dfba67 100644 --- a/include/mbedtls/ssl.h +++ b/include/mbedtls/ssl.h @@ -3703,6 +3703,10 @@ const uint16_t *mbedtls_ssl_get_supported_group_list(void); * keeping with the general principle of favoring the lowest * resource usage. * + * \note The list is not copied internally, only the reference to it + * is saved in \p conf. Do not free \p groups memory for the + * in which \p conf is being used. + * * \param conf SSL configuration * \param groups List of allowed groups ordered by preference, terminated by 0. * Must contain valid IANA NamedGroup IDs (provided via either an integer From 2707100ab7a66ec29183e9b7f7383450379a570c Mon Sep 17 00:00:00 2001 From: Valerio Setti Date: Wed, 21 Jan 2026 15:26:53 +0100 Subject: [PATCH 03/18] library: ssl: move location of ssl_preset_default_groups() Signed-off-by: Valerio Setti --- library/ssl_tls.c | 82 +++++++++++++++++++++++------------------------ 1 file changed, 41 insertions(+), 41 deletions(-) diff --git a/library/ssl_tls.c b/library/ssl_tls.c index e8ebe7d922..83916dcd3a 100644 --- a/library/ssl_tls.c +++ b/library/ssl_tls.c @@ -2360,6 +2360,47 @@ void mbedtls_ssl_conf_sig_algs(mbedtls_ssl_config *conf, } #endif /* MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED */ +/* The selection should be the same as mbedtls_x509_crt_profile_default in + * x509_crt.c, plus Montgomery curves for ECDHE. Here, the order matters: + * curves with a lower resource usage come first. + * See the documentation of mbedtls_ssl_conf_groups() for what we promise + * about this list. + */ +static const uint16_t ssl_preset_default_groups[] = { +#if defined(PSA_WANT_ECC_MONTGOMERY_255) + MBEDTLS_SSL_IANA_TLS_GROUP_X25519, +#endif +#if defined(PSA_WANT_ECC_SECP_R1_256) + MBEDTLS_SSL_IANA_TLS_GROUP_SECP256R1, +#endif +#if defined(PSA_WANT_ECC_SECP_R1_384) + MBEDTLS_SSL_IANA_TLS_GROUP_SECP384R1, +#endif +#if defined(PSA_WANT_ECC_MONTGOMERY_448) + MBEDTLS_SSL_IANA_TLS_GROUP_X448, +#endif +#if defined(PSA_WANT_ECC_SECP_R1_521) + MBEDTLS_SSL_IANA_TLS_GROUP_SECP521R1, +#endif +#if defined(PSA_WANT_ECC_BRAINPOOL_P_R1_256) + MBEDTLS_SSL_IANA_TLS_GROUP_BP256R1, +#endif +#if defined(PSA_WANT_ECC_BRAINPOOL_P_R1_384) + MBEDTLS_SSL_IANA_TLS_GROUP_BP384R1, +#endif +#if defined(PSA_WANT_ECC_BRAINPOOL_P_R1_512) + MBEDTLS_SSL_IANA_TLS_GROUP_BP512R1, +#endif +#if defined(PSA_WANT_ALG_FFDH) + MBEDTLS_SSL_IANA_TLS_GROUP_FFDHE2048, + MBEDTLS_SSL_IANA_TLS_GROUP_FFDHE3072, + MBEDTLS_SSL_IANA_TLS_GROUP_FFDHE4096, + MBEDTLS_SSL_IANA_TLS_GROUP_FFDHE6144, + MBEDTLS_SSL_IANA_TLS_GROUP_FFDHE8192, +#endif + MBEDTLS_SSL_IANA_TLS_GROUP_NONE +}; + const uint16_t *mbedtls_ssl_get_supported_group_list(void) { return ssl_preset_default_groups; @@ -5168,47 +5209,6 @@ void mbedtls_ssl_config_init(mbedtls_ssl_config *conf) memset(conf, 0, sizeof(mbedtls_ssl_config)); } -/* The selection should be the same as mbedtls_x509_crt_profile_default in - * x509_crt.c, plus Montgomery curves for ECDHE. Here, the order matters: - * curves with a lower resource usage come first. - * See the documentation of mbedtls_ssl_conf_groups() for what we promise - * about this list. - */ -static const uint16_t ssl_preset_default_groups[] = { -#if defined(PSA_WANT_ECC_MONTGOMERY_255) - MBEDTLS_SSL_IANA_TLS_GROUP_X25519, -#endif -#if defined(PSA_WANT_ECC_SECP_R1_256) - MBEDTLS_SSL_IANA_TLS_GROUP_SECP256R1, -#endif -#if defined(PSA_WANT_ECC_SECP_R1_384) - MBEDTLS_SSL_IANA_TLS_GROUP_SECP384R1, -#endif -#if defined(PSA_WANT_ECC_MONTGOMERY_448) - MBEDTLS_SSL_IANA_TLS_GROUP_X448, -#endif -#if defined(PSA_WANT_ECC_SECP_R1_521) - MBEDTLS_SSL_IANA_TLS_GROUP_SECP521R1, -#endif -#if defined(PSA_WANT_ECC_BRAINPOOL_P_R1_256) - MBEDTLS_SSL_IANA_TLS_GROUP_BP256R1, -#endif -#if defined(PSA_WANT_ECC_BRAINPOOL_P_R1_384) - MBEDTLS_SSL_IANA_TLS_GROUP_BP384R1, -#endif -#if defined(PSA_WANT_ECC_BRAINPOOL_P_R1_512) - MBEDTLS_SSL_IANA_TLS_GROUP_BP512R1, -#endif -#if defined(PSA_WANT_ALG_FFDH) - MBEDTLS_SSL_IANA_TLS_GROUP_FFDHE2048, - MBEDTLS_SSL_IANA_TLS_GROUP_FFDHE3072, - MBEDTLS_SSL_IANA_TLS_GROUP_FFDHE4096, - MBEDTLS_SSL_IANA_TLS_GROUP_FFDHE6144, - MBEDTLS_SSL_IANA_TLS_GROUP_FFDHE8192, -#endif - MBEDTLS_SSL_IANA_TLS_GROUP_NONE -}; - static const int ssl_preset_suiteb_ciphersuites[] = { MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256, MBEDTLS_TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384, From 67f30df5a1952a0090d11affaa8c1cb2a6f8ed67 Mon Sep 17 00:00:00 2001 From: Valerio Setti Date: Wed, 21 Jan 2026 15:29:22 +0100 Subject: [PATCH 04/18] library: ssl: use correct PSA_WANT for DH groups in ssl_preset_default_groups Use proper PSA_WANT_DH_RFC7919_xxx instead of PSA_WANT_ALG_FFDH. Signed-off-by: Valerio Setti --- library/ssl_tls.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/library/ssl_tls.c b/library/ssl_tls.c index 83916dcd3a..cadb3cbd32 100644 --- a/library/ssl_tls.c +++ b/library/ssl_tls.c @@ -2391,11 +2391,19 @@ static const uint16_t ssl_preset_default_groups[] = { #if defined(PSA_WANT_ECC_BRAINPOOL_P_R1_512) MBEDTLS_SSL_IANA_TLS_GROUP_BP512R1, #endif -#if defined(PSA_WANT_ALG_FFDH) +#if defined(PSA_WANT_DH_RFC7919_2048) MBEDTLS_SSL_IANA_TLS_GROUP_FFDHE2048, +#endif +#if defined(PSA_WANT_DH_RFC7919_3072) MBEDTLS_SSL_IANA_TLS_GROUP_FFDHE3072, +#endif +#if defined(PSA_WANT_DH_RFC7919_4096) MBEDTLS_SSL_IANA_TLS_GROUP_FFDHE4096, +#endif +#if defined(PSA_WANT_DH_RFC7919_6144) MBEDTLS_SSL_IANA_TLS_GROUP_FFDHE6144, +#endif +#if defined(PSA_WANT_DH_RFC7919_8192) MBEDTLS_SSL_IANA_TLS_GROUP_FFDHE8192, #endif MBEDTLS_SSL_IANA_TLS_GROUP_NONE From 335b1b6089cf811dcec4faa01a00ed5634f595f5 Mon Sep 17 00:00:00 2001 From: Valerio Setti Date: Wed, 21 Jan 2026 15:31:15 +0100 Subject: [PATCH 05/18] library: ssl: add missing secp256k1 to ssl_preset_default_groups Signed-off-by: Valerio Setti --- library/ssl_tls.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/library/ssl_tls.c b/library/ssl_tls.c index cadb3cbd32..f3a60669b7 100644 --- a/library/ssl_tls.c +++ b/library/ssl_tls.c @@ -2373,6 +2373,9 @@ static const uint16_t ssl_preset_default_groups[] = { #if defined(PSA_WANT_ECC_SECP_R1_256) MBEDTLS_SSL_IANA_TLS_GROUP_SECP256R1, #endif +#if defined(PSA_WANT_ECC_SECP_K1_256) + MBEDTLS_SSL_IANA_TLS_GROUP_SECP256K1, +#endif #if defined(PSA_WANT_ECC_SECP_R1_384) MBEDTLS_SSL_IANA_TLS_GROUP_SECP384R1, #endif From 8686ad1a9eff5d51b3a0d1062d9758f00a89674b Mon Sep 17 00:00:00 2001 From: Valerio Setti Date: Wed, 21 Jan 2026 16:07:55 +0100 Subject: [PATCH 06/18] tests: ssl: add testing for mbedtls_ssl_get_supported_group_list() Signed-off-by: Valerio Setti --- tests/suites/test_suite_ssl.data | 112 +++++++++++++++++++++++++++ tests/suites/test_suite_ssl.function | 19 +++++ 2 files changed, 131 insertions(+) diff --git a/tests/suites/test_suite_ssl.data b/tests/suites/test_suite_ssl.data index fa61b0f435..f05477fb0d 100644 --- a/tests/suites/test_suite_ssl.data +++ b/tests/suites/test_suite_ssl.data @@ -3031,6 +3031,118 @@ ssl_serialize_session_load_buf_size:0:"":MBEDTLS_SSL_IS_SERVER:MBEDTLS_SSL_VERSI Test configuration of EC groups through mbedtls_ssl_conf_groups() conf_group: +Get supported group list: x25519, positive +depends_on:PSA_WANT_ECC_MONTGOMERY_255 +test_mbedtls_ssl_get_supported_group_list:MBEDTLS_SSL_IANA_TLS_GROUP_X25519:1 + +Get supported group list: x25519, negative +depends_on:!PSA_WANT_ECC_MONTGOMERY_255 +test_mbedtls_ssl_get_supported_group_list:MBEDTLS_SSL_IANA_TLS_GROUP_X25519:0 + +Get supported group list: secp256r1, positive +depends_on:PSA_WANT_ECC_SECP_R1_256 +test_mbedtls_ssl_get_supported_group_list:MBEDTLS_SSL_IANA_TLS_GROUP_SECP256R1:1 + +Get supported group list: secp256r1, negative +depends_on:!PSA_WANT_ECC_SECP_R1_256 +test_mbedtls_ssl_get_supported_group_list:MBEDTLS_SSL_IANA_TLS_GROUP_SECP256R1:0 + +Get supported group list: secp256k1, positive +depends_on:PSA_WANT_ECC_SECP_K1_256 +test_mbedtls_ssl_get_supported_group_list:MBEDTLS_SSL_IANA_TLS_GROUP_SECP256K1:1 + +Get supported group list: secp256k1, negative +depends_on:!PSA_WANT_ECC_SECP_K1_256 +test_mbedtls_ssl_get_supported_group_list:MBEDTLS_SSL_IANA_TLS_GROUP_SECP256K1:0 + +Get supported group list: secp384r1, positive +depends_on:PSA_WANT_ECC_SECP_R1_384 +test_mbedtls_ssl_get_supported_group_list:MBEDTLS_SSL_IANA_TLS_GROUP_SECP384R1:1 + +Get supported group list: secp384r1, negative +depends_on:!PSA_WANT_ECC_SECP_R1_384 +test_mbedtls_ssl_get_supported_group_list:MBEDTLS_SSL_IANA_TLS_GROUP_SECP384R1:0 + +Get supported group list: x448, positive +depends_on:PSA_WANT_ECC_MONTGOMERY_448 +test_mbedtls_ssl_get_supported_group_list:MBEDTLS_SSL_IANA_TLS_GROUP_X448:1 + +Get supported group list: x448, negative +depends_on:!PSA_WANT_ECC_MONTGOMERY_448 +test_mbedtls_ssl_get_supported_group_list:MBEDTLS_SSL_IANA_TLS_GROUP_X448:0 + +Get supported group list: secp521r1, positive +depends_on:PSA_WANT_ECC_SECP_R1_521 +test_mbedtls_ssl_get_supported_group_list:MBEDTLS_SSL_IANA_TLS_GROUP_SECP521R1:1 + +Get supported group list: secp521r1, negative +depends_on:!PSA_WANT_ECC_SECP_R1_521 +test_mbedtls_ssl_get_supported_group_list:MBEDTLS_SSL_IANA_TLS_GROUP_SECP521R1:0 + +Get supported group list: brainpool256r1, positive +depends_on:PSA_WANT_ECC_BRAINPOOL_P_R1_256 +test_mbedtls_ssl_get_supported_group_list:MBEDTLS_SSL_IANA_TLS_GROUP_BP256R1:1 + +Get supported group list: brainpool256r1, negative +depends_on:!PSA_WANT_ECC_BRAINPOOL_P_R1_256 +test_mbedtls_ssl_get_supported_group_list:MBEDTLS_SSL_IANA_TLS_GROUP_BP256R1:0 + +Get supported group list: brainpool384r1, positive +depends_on:PSA_WANT_ECC_BRAINPOOL_P_R1_384 +test_mbedtls_ssl_get_supported_group_list:MBEDTLS_SSL_IANA_TLS_GROUP_BP384R1:1 + +Get supported group list: brainpool384r1, negative +depends_on:!PSA_WANT_ECC_BRAINPOOL_P_R1_384 +test_mbedtls_ssl_get_supported_group_list:MBEDTLS_SSL_IANA_TLS_GROUP_BP384R1:0 + +Get supported group list: brainpool512r1, positive +depends_on:PSA_WANT_ECC_BRAINPOOL_P_R1_512 +test_mbedtls_ssl_get_supported_group_list:MBEDTLS_SSL_IANA_TLS_GROUP_BP512R1:1 + +Get supported group list: brainpool512r1, negative +depends_on:!PSA_WANT_ECC_BRAINPOOL_P_R1_512 +test_mbedtls_ssl_get_supported_group_list:MBEDTLS_SSL_IANA_TLS_GROUP_BP512R1:0 + +Get supported group list: ffdhe2048, positive +depends_on:PSA_WANT_DH_RFC7919_2048 +test_mbedtls_ssl_get_supported_group_list:MBEDTLS_SSL_IANA_TLS_GROUP_FFDHE2048:1 + +Get supported group list: ffdhe2048, negative +depends_on:!PSA_WANT_DH_RFC7919_2048 +test_mbedtls_ssl_get_supported_group_list:MBEDTLS_SSL_IANA_TLS_GROUP_FFDHE2048:0 + +Get supported group list: ffdhe3072, positive +depends_on:PSA_WANT_DH_RFC7919_3072 +test_mbedtls_ssl_get_supported_group_list:MBEDTLS_SSL_IANA_TLS_GROUP_FFDHE3072:1 + +Get supported group list: ffdhe3072, negative +depends_on:!PSA_WANT_DH_RFC7919_3072 +test_mbedtls_ssl_get_supported_group_list:MBEDTLS_SSL_IANA_TLS_GROUP_FFDHE3072:0 + +Get supported group list: ffdhe4096, positive +depends_on:PSA_WANT_DH_RFC7919_4096 +test_mbedtls_ssl_get_supported_group_list:MBEDTLS_SSL_IANA_TLS_GROUP_FFDHE4096:1 + +Get supported group list: ffdhe4096, negative +depends_on:!PSA_WANT_DH_RFC7919_4096 +test_mbedtls_ssl_get_supported_group_list:MBEDTLS_SSL_IANA_TLS_GROUP_FFDHE4096:0 + +Get supported group list: ffdhe6144, positive +depends_on:PSA_WANT_DH_RFC7919_6144 +test_mbedtls_ssl_get_supported_group_list:MBEDTLS_SSL_IANA_TLS_GROUP_FFDHE6144:1 + +Get supported group list: ffdhe6144, negative +depends_on:!PSA_WANT_DH_RFC7919_6144 +test_mbedtls_ssl_get_supported_group_list:MBEDTLS_SSL_IANA_TLS_GROUP_FFDHE6144:0 + +Get supported group list: ffdhe8192, positive +depends_on:PSA_WANT_DH_RFC7919_8192 +test_mbedtls_ssl_get_supported_group_list:MBEDTLS_SSL_IANA_TLS_GROUP_FFDHE8192:1 + +Get supported group list: ffdhe8192, negative +depends_on:!PSA_WANT_DH_RFC7919_8192 +test_mbedtls_ssl_get_supported_group_list:MBEDTLS_SSL_IANA_TLS_GROUP_FFDHE8192:0 + Version config: valid client TLS 1.2 only depends_on:MBEDTLS_SSL_PROTO_TLS1_2 conf_version:MBEDTLS_SSL_IS_CLIENT:MBEDTLS_SSL_TRANSPORT_STREAM:MBEDTLS_SSL_VERSION_TLS1_2:MBEDTLS_SSL_VERSION_TLS1_2:0 diff --git a/tests/suites/test_suite_ssl.function b/tests/suites/test_suite_ssl.function index 5b6500898e..7a7771cb73 100644 --- a/tests/suites/test_suite_ssl.function +++ b/tests/suites/test_suite_ssl.function @@ -3574,6 +3574,25 @@ exit: } /* END_CASE */ +/* BEGIN_CASE */ +void test_mbedtls_ssl_get_supported_group_list(int iana_group_id, int is_available) +{ + const uint16_t *list = mbedtls_ssl_get_supported_group_list(); + int found = 0; + + for (int i = 0; list[i] != MBEDTLS_SSL_IANA_TLS_GROUP_NONE; i++) { + if (list[i] == iana_group_id) { + found = 1; + break; + } + } + + TEST_EQUAL(found, is_available); + +exit:; +} +/* END_CASE */ + /* BEGIN_CASE depends_on:MBEDTLS_SSL_SRV_C:MBEDTLS_SSL_CACHE_C:!MBEDTLS_SSL_PROTO_TLS1_3:MBEDTLS_DEBUG_C:MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED:MBEDTLS_RSA_C:PSA_WANT_ECC_SECP_R1_384:MBEDTLS_PKCS1_V15:PSA_WANT_ALG_SHA_256 */ void force_bad_session_id_len() { From 6c5a9f04dfaeb3ab95004859463adb43f147f406 Mon Sep 17 00:00:00 2001 From: Valerio Setti Date: Thu, 22 Jan 2026 16:52:11 +0100 Subject: [PATCH 07/18] library: ssl: improve/fix documentation of group related functions Signed-off-by: Valerio Setti --- include/mbedtls/ssl.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/include/mbedtls/ssl.h b/include/mbedtls/ssl.h index b413dfba67..c21c1b1ae7 100644 --- a/include/mbedtls/ssl.h +++ b/include/mbedtls/ssl.h @@ -3674,7 +3674,7 @@ void mbedtls_ssl_conf_psk_cb(mbedtls_ssl_config *conf, * about it being freed. * * \return The list made of IANA NamedGroups IDs (MBEDTLS_SSL_IANA_TLS_GROUP_xxx) - * with the last item always being MBEDTLS_SSL_IANA_TLS_GROUP_NONE. + * and is terminated by #MBEDTLS_SSL_IANA_TLS_GROUP_NONE. */ const uint16_t *mbedtls_ssl_get_supported_group_list(void); @@ -3704,7 +3704,7 @@ const uint16_t *mbedtls_ssl_get_supported_group_list(void); * resource usage. * * \note The list is not copied internally, only the reference to it - * is saved in \p conf. Do not free \p groups memory for the + * is saved in \p conf. Do not free \p groups memory for the time * in which \p conf is being used. * * \param conf SSL configuration From 2aecd2cd5fe0babe94fb971b6191d75c3ceacbf9 Mon Sep 17 00:00:00 2001 From: Valerio Setti Date: Thu, 22 Jan 2026 17:13:44 +0100 Subject: [PATCH 08/18] library|tests: ssl: remove secp256k1 from default groups Signed-off-by: Valerio Setti --- library/ssl_tls.c | 3 --- tests/suites/test_suite_ssl.data | 8 -------- 2 files changed, 11 deletions(-) diff --git a/library/ssl_tls.c b/library/ssl_tls.c index f3a60669b7..cadb3cbd32 100644 --- a/library/ssl_tls.c +++ b/library/ssl_tls.c @@ -2373,9 +2373,6 @@ static const uint16_t ssl_preset_default_groups[] = { #if defined(PSA_WANT_ECC_SECP_R1_256) MBEDTLS_SSL_IANA_TLS_GROUP_SECP256R1, #endif -#if defined(PSA_WANT_ECC_SECP_K1_256) - MBEDTLS_SSL_IANA_TLS_GROUP_SECP256K1, -#endif #if defined(PSA_WANT_ECC_SECP_R1_384) MBEDTLS_SSL_IANA_TLS_GROUP_SECP384R1, #endif diff --git a/tests/suites/test_suite_ssl.data b/tests/suites/test_suite_ssl.data index f05477fb0d..6bef4c6518 100644 --- a/tests/suites/test_suite_ssl.data +++ b/tests/suites/test_suite_ssl.data @@ -3047,14 +3047,6 @@ Get supported group list: secp256r1, negative depends_on:!PSA_WANT_ECC_SECP_R1_256 test_mbedtls_ssl_get_supported_group_list:MBEDTLS_SSL_IANA_TLS_GROUP_SECP256R1:0 -Get supported group list: secp256k1, positive -depends_on:PSA_WANT_ECC_SECP_K1_256 -test_mbedtls_ssl_get_supported_group_list:MBEDTLS_SSL_IANA_TLS_GROUP_SECP256K1:1 - -Get supported group list: secp256k1, negative -depends_on:!PSA_WANT_ECC_SECP_K1_256 -test_mbedtls_ssl_get_supported_group_list:MBEDTLS_SSL_IANA_TLS_GROUP_SECP256K1:0 - Get supported group list: secp384r1, positive depends_on:PSA_WANT_ECC_SECP_R1_384 test_mbedtls_ssl_get_supported_group_list:MBEDTLS_SSL_IANA_TLS_GROUP_SECP384R1:1 From 7ca3c602b7f474a12ba9ce9e0c715238682c43ce Mon Sep 17 00:00:00 2001 From: Valerio Setti Date: Mon, 26 Jan 2026 10:15:12 +0100 Subject: [PATCH 09/18] library: ssl: add macro for allocating a TLS-ID <-> group-name table Being a macro allow the table to be instatiated only when/if necessary by the consuming code. Signed-off-by: Valerio Setti --- include/mbedtls/ssl.h | 25 +++++++++++++++++++++++++ library/ssl_tls.c | 19 ++----------------- 2 files changed, 27 insertions(+), 17 deletions(-) diff --git a/include/mbedtls/ssl.h b/include/mbedtls/ssl.h index c21c1b1ae7..b9e725e99e 100644 --- a/include/mbedtls/ssl.h +++ b/include/mbedtls/ssl.h @@ -3660,6 +3660,31 @@ void mbedtls_ssl_conf_psk_cb(mbedtls_ssl_config *conf, #endif /* MBEDTLS_SSL_SRV_C */ #endif /* MBEDTLS_SSL_HANDSHAKE_WITH_PSK_ENABLED */ +/** + *\brief Define a TLS-ID <-> group-name table + */ +#define MBEDTLS_TLS_ID_GROUP_NAME_TABLE(table_name) \ + struct { \ + uint16_t tls_id; \ + const char *group_name; \ + } table_name[] = { \ + { MBEDTLS_SSL_IANA_TLS_GROUP_X25519, "x25519" }, \ + { MBEDTLS_SSL_IANA_TLS_GROUP_SECP256R1, "secp256r1" }, \ + { MBEDTLS_SSL_IANA_TLS_GROUP_SECP256K1, "secp256k1" }, \ + { MBEDTLS_SSL_IANA_TLS_GROUP_SECP384R1, "secp384r1" }, \ + { MBEDTLS_SSL_IANA_TLS_GROUP_X448, "x448" }, \ + { MBEDTLS_SSL_IANA_TLS_GROUP_SECP521R1, "secp521r1" }, \ + { MBEDTLS_SSL_IANA_TLS_GROUP_BP256R1, "brainpoolP256r1" }, \ + { MBEDTLS_SSL_IANA_TLS_GROUP_BP384R1, "brainpoolP384r1" }, \ + { MBEDTLS_SSL_IANA_TLS_GROUP_BP512R1, "brainpoolP512r1" }, \ + { MBEDTLS_SSL_IANA_TLS_GROUP_FFDHE2048, "ffdhe2048" }, \ + { MBEDTLS_SSL_IANA_TLS_GROUP_FFDHE3072, "ffdhe3072" }, \ + { MBEDTLS_SSL_IANA_TLS_GROUP_FFDHE4096, "ffdhe4096" }, \ + { MBEDTLS_SSL_IANA_TLS_GROUP_FFDHE6144, "ffdhe6144" }, \ + { MBEDTLS_SSL_IANA_TLS_GROUP_FFDHE8192, "ffdhe8192" }, \ + { MBEDTLS_SSL_IANA_TLS_GROUP_NONE, "" } \ + } + /** * \brief Return the list of supported groups (curves and finite fields). * diff --git a/library/ssl_tls.c b/library/ssl_tls.c index cadb3cbd32..207a69d7d5 100644 --- a/library/ssl_tls.c +++ b/library/ssl_tls.c @@ -5850,28 +5850,13 @@ uint16_t mbedtls_ssl_get_tls_id_from_ecp_group_id(mbedtls_ecp_group_id grp_id) } #if defined(MBEDTLS_DEBUG_C) -static const struct { - uint16_t tls_id; - const char *name; -} tls_id_curve_name_table[] = -{ - { MBEDTLS_SSL_IANA_TLS_GROUP_SECP521R1, "secp521r1" }, - { MBEDTLS_SSL_IANA_TLS_GROUP_BP512R1, "brainpoolP512r1" }, - { MBEDTLS_SSL_IANA_TLS_GROUP_SECP384R1, "secp384r1" }, - { MBEDTLS_SSL_IANA_TLS_GROUP_BP384R1, "brainpoolP384r1" }, - { MBEDTLS_SSL_IANA_TLS_GROUP_SECP256R1, "secp256r1" }, - { MBEDTLS_SSL_IANA_TLS_GROUP_SECP256K1, "secp256k1" }, - { MBEDTLS_SSL_IANA_TLS_GROUP_BP256R1, "brainpoolP256r1" }, - { MBEDTLS_SSL_IANA_TLS_GROUP_X25519, "x25519" }, - { MBEDTLS_SSL_IANA_TLS_GROUP_X448, "x448" }, - { 0, NULL }, -}; +static MBEDTLS_TLS_ID_GROUP_NAME_TABLE(tls_id_curve_name_table); const char *mbedtls_ssl_get_curve_name_from_tls_id(uint16_t tls_id) { for (int i = 0; tls_id_curve_name_table[i].tls_id != 0; i++) { if (tls_id_curve_name_table[i].tls_id == tls_id) { - return tls_id_curve_name_table[i].name; + return tls_id_curve_name_table[i].group_name; } } From c87adb64f2cb4f4d9e99798da0294e28a97a17bd Mon Sep 17 00:00:00 2001 From: Valerio Setti Date: Mon, 26 Jan 2026 11:09:20 +0100 Subject: [PATCH 10/18] tests: ssl: add test for TLS-ID <-> curve-name table Signed-off-by: Valerio Setti --- tests/suites/test_suite_ssl.data | 60 ++++++++++++++++++++++++++++ tests/suites/test_suite_ssl.function | 21 ++++++++++ 2 files changed, 81 insertions(+) diff --git a/tests/suites/test_suite_ssl.data b/tests/suites/test_suite_ssl.data index 6bef4c6518..7732870cba 100644 --- a/tests/suites/test_suite_ssl.data +++ b/tests/suites/test_suite_ssl.data @@ -3135,6 +3135,66 @@ Get supported group list: ffdhe8192, negative depends_on:!PSA_WANT_DH_RFC7919_8192 test_mbedtls_ssl_get_supported_group_list:MBEDTLS_SSL_IANA_TLS_GROUP_FFDHE8192:0 +TLS ID <-> group name: x25519 +depends_on:PSA_WANT_ECC_MONTGOMERY_255 +test_mbedtls_tls_id_group_name_table:MBEDTLS_SSL_IANA_TLS_GROUP_X25519:"x25519" + +TLS ID <-> group name: secp256r1 +depends_on:PSA_WANT_ECC_SECP_R1_256 +test_mbedtls_tls_id_group_name_table:MBEDTLS_SSL_IANA_TLS_GROUP_SECP256R1:"secp256r1" + +TLS ID <-> group name: secp256k1 +depends_on:PSA_WANT_ECC_SECP_K1_256 +test_mbedtls_tls_id_group_name_table:MBEDTLS_SSL_IANA_TLS_GROUP_SECP256K1:"secp256k1" + +TLS ID <-> group name: secp384r1 +depends_on:PSA_WANT_ECC_SECP_R1_384 +test_mbedtls_tls_id_group_name_table:MBEDTLS_SSL_IANA_TLS_GROUP_SECP384R1:"secp384r1" + +TLS ID <-> group name: x448 +depends_on:PSA_WANT_ECC_MONTGOMERY_448 +test_mbedtls_tls_id_group_name_table:MBEDTLS_SSL_IANA_TLS_GROUP_X448:"x448" + +TLS ID <-> group name: secp521r1 +depends_on:PSA_WANT_ECC_SECP_R1_521 +test_mbedtls_tls_id_group_name_table:MBEDTLS_SSL_IANA_TLS_GROUP_SECP521R1:"secp521r1" + +TLS ID <-> group name: brainpoolP256r1 +depends_on:PSA_WANT_ECC_BRAINPOOL_P_R1_256 +test_mbedtls_tls_id_group_name_table:MBEDTLS_SSL_IANA_TLS_GROUP_BP256R1:"brainpoolP256r1" + +TLS ID <-> group name: brainpoolP384r1 +depends_on:PSA_WANT_ECC_BRAINPOOL_P_R1_384 +test_mbedtls_tls_id_group_name_table:MBEDTLS_SSL_IANA_TLS_GROUP_BP384R1:"brainpoolP384r1" + +TLS ID <-> group name: brainpoolP512r1 +depends_on:PSA_WANT_ECC_BRAINPOOL_P_R1_512 +test_mbedtls_tls_id_group_name_table:MBEDTLS_SSL_IANA_TLS_GROUP_BP512R1:"brainpoolP512r1" + +TLS ID <-> group name: ffdhe2048 +depends_on:PSA_WANT_DH_RFC7919_2048 +test_mbedtls_tls_id_group_name_table:MBEDTLS_SSL_IANA_TLS_GROUP_FFDHE2048:"ffdhe2048" + +TLS ID <-> group name: ffdhe3072 +depends_on:PSA_WANT_DH_RFC7919_3072 +test_mbedtls_tls_id_group_name_table:MBEDTLS_SSL_IANA_TLS_GROUP_FFDHE3072:"ffdhe3072" + +TLS ID <-> group name: ffdhe4096 +depends_on:PSA_WANT_DH_RFC7919_4096 +test_mbedtls_tls_id_group_name_table:MBEDTLS_SSL_IANA_TLS_GROUP_FFDHE4096:"ffdhe4096" + +TLS ID <-> group name: ffdhe6144 +depends_on:PSA_WANT_DH_RFC7919_6144 +test_mbedtls_tls_id_group_name_table:MBEDTLS_SSL_IANA_TLS_GROUP_FFDHE6144:"ffdhe6144" + +TLS ID <-> group name: ffdhe8192 +depends_on:PSA_WANT_DH_RFC7919_8192 +test_mbedtls_tls_id_group_name_table:MBEDTLS_SSL_IANA_TLS_GROUP_FFDHE8192:"ffdhe8192" + +TLS ID <-> group name: [NONE] +test_mbedtls_tls_id_group_name_table:MBEDTLS_SSL_IANA_TLS_GROUP_NONE:"" + + Version config: valid client TLS 1.2 only depends_on:MBEDTLS_SSL_PROTO_TLS1_2 conf_version:MBEDTLS_SSL_IS_CLIENT:MBEDTLS_SSL_TRANSPORT_STREAM:MBEDTLS_SSL_VERSION_TLS1_2:MBEDTLS_SSL_VERSION_TLS1_2:0 diff --git a/tests/suites/test_suite_ssl.function b/tests/suites/test_suite_ssl.function index 7a7771cb73..33c1d44a37 100644 --- a/tests/suites/test_suite_ssl.function +++ b/tests/suites/test_suite_ssl.function @@ -3593,6 +3593,27 @@ exit:; } /* END_CASE */ +/* BEGIN_CASE */ +void test_mbedtls_tls_id_group_name_table(int group_id, char *group_name) +{ + MBEDTLS_TLS_ID_GROUP_NAME_TABLE(test_table); + const char *table_name = NULL; + size_t table_name_len = 0; + + for (size_t i = 0; i < ARRAY_LENGTH(test_table); i++) { + if (test_table[i].tls_id == group_id) { + table_name = test_table[i].group_name; + table_name_len = strlen(table_name); + } + } + + TEST_ASSERT(table_name != NULL); + TEST_MEMORY_COMPARE(table_name, table_name_len, group_name, strlen(group_name)); + +exit:; +} +/* END_CASE */ + /* BEGIN_CASE depends_on:MBEDTLS_SSL_SRV_C:MBEDTLS_SSL_CACHE_C:!MBEDTLS_SSL_PROTO_TLS1_3:MBEDTLS_DEBUG_C:MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED:MBEDTLS_RSA_C:PSA_WANT_ECC_SECP_R1_384:MBEDTLS_PKCS1_V15:PSA_WANT_ALG_SHA_256 */ void force_bad_session_id_len() { From fb317afa9fd13c228a04a94f017301d18fc031b2 Mon Sep 17 00:00:00 2001 From: Valerio Setti Date: Tue, 27 Jan 2026 00:36:17 +0100 Subject: [PATCH 11/18] library: ssl: rework macro to define known TLS ID <-> group name list - let the macro be an initializer for the array of known TLS IDs, not a variable declarator; - last item's group name is NULL, not an empty string - change then name of the macro from MBEDTLS_TLS_ID_GROUP_NAME_TABLE to MBEDTLS_SSL_IANA_TLS_GROUPS_INFO - define a new public structure "mbedtls_ssl_iana_tls_group_info_t" to hold each element of the table and that can be used the go over the list from user code. Signed-off-by: Valerio Setti --- include/mbedtls/ssl.h | 26 ++++++++++++++++++-------- library/ssl_tls.c | 3 ++- tests/suites/test_suite_ssl.function | 12 ++++++++---- 3 files changed, 28 insertions(+), 13 deletions(-) diff --git a/include/mbedtls/ssl.h b/include/mbedtls/ssl.h index b9e725e99e..aeb499586f 100644 --- a/include/mbedtls/ssl.h +++ b/include/mbedtls/ssl.h @@ -3660,14 +3660,24 @@ void mbedtls_ssl_conf_psk_cb(mbedtls_ssl_config *conf, #endif /* MBEDTLS_SSL_SRV_C */ #endif /* MBEDTLS_SSL_HANDSHAKE_WITH_PSK_ENABLED */ -/** - *\brief Define a TLS-ID <-> group-name table +/* + * This structure defines the correpondence between IANA's TLS-ID and its + * corresponding group name. + * This is used in macro #MBEDTLS_SSL_IANA_TLS_GROUPS_INFO to define the list + * of known TLS IDs and corresponding group names. */ -#define MBEDTLS_TLS_ID_GROUP_NAME_TABLE(table_name) \ - struct { \ - uint16_t tls_id; \ - const char *group_name; \ - } table_name[] = { \ +typedef struct { + uint16_t tls_id; + const char *group_name; +} mbedtls_ssl_iana_tls_group_info_t; + +/* + * Initializer for a list of known "TLS ID" <-> "group name". + * Each entry is a structure of type mbedtls_ssl_iana_tls_group_info_t. + * The last entry has 'tls_id = 0' and 'group_name = NULL'. + */ +#define MBEDTLS_SSL_IANA_TLS_GROUPS_INFO \ + { \ { MBEDTLS_SSL_IANA_TLS_GROUP_X25519, "x25519" }, \ { MBEDTLS_SSL_IANA_TLS_GROUP_SECP256R1, "secp256r1" }, \ { MBEDTLS_SSL_IANA_TLS_GROUP_SECP256K1, "secp256k1" }, \ @@ -3682,7 +3692,7 @@ void mbedtls_ssl_conf_psk_cb(mbedtls_ssl_config *conf, { MBEDTLS_SSL_IANA_TLS_GROUP_FFDHE4096, "ffdhe4096" }, \ { MBEDTLS_SSL_IANA_TLS_GROUP_FFDHE6144, "ffdhe6144" }, \ { MBEDTLS_SSL_IANA_TLS_GROUP_FFDHE8192, "ffdhe8192" }, \ - { MBEDTLS_SSL_IANA_TLS_GROUP_NONE, "" } \ + { MBEDTLS_SSL_IANA_TLS_GROUP_NONE, NULL } \ } /** diff --git a/library/ssl_tls.c b/library/ssl_tls.c index 207a69d7d5..f6199195cb 100644 --- a/library/ssl_tls.c +++ b/library/ssl_tls.c @@ -5850,7 +5850,8 @@ uint16_t mbedtls_ssl_get_tls_id_from_ecp_group_id(mbedtls_ecp_group_id grp_id) } #if defined(MBEDTLS_DEBUG_C) -static MBEDTLS_TLS_ID_GROUP_NAME_TABLE(tls_id_curve_name_table); +static +mbedtls_ssl_iana_tls_group_info_t tls_id_curve_name_table[] = MBEDTLS_SSL_IANA_TLS_GROUPS_INFO; const char *mbedtls_ssl_get_curve_name_from_tls_id(uint16_t tls_id) { diff --git a/tests/suites/test_suite_ssl.function b/tests/suites/test_suite_ssl.function index 33c1d44a37..40f49a894b 100644 --- a/tests/suites/test_suite_ssl.function +++ b/tests/suites/test_suite_ssl.function @@ -3596,13 +3596,17 @@ exit:; /* BEGIN_CASE */ void test_mbedtls_tls_id_group_name_table(int group_id, char *group_name) { - MBEDTLS_TLS_ID_GROUP_NAME_TABLE(test_table); + mbedtls_ssl_iana_tls_group_info_t test_table[] = MBEDTLS_SSL_IANA_TLS_GROUPS_INFO; + mbedtls_ssl_iana_tls_group_info_t *item; const char *table_name = NULL; size_t table_name_len = 0; - for (size_t i = 0; i < ARRAY_LENGTH(test_table); i++) { - if (test_table[i].tls_id == group_id) { - table_name = test_table[i].group_name; + /* Ensure that the list includes at least 1 valid entry. */ + TEST_ASSERT(test_table[0].tls_id != MBEDTLS_SSL_IANA_TLS_GROUP_NONE); + + for (item = &test_table[0]; item->tls_id != MBEDTLS_SSL_IANA_TLS_GROUP_NONE; item++) { + if (item->tls_id == group_id) { + table_name = item->group_name; table_name_len = strlen(table_name); } } From bb4f58487602b18cda8713f65b1a27768404834a Mon Sep 17 00:00:00 2001 From: Valerio Setti Date: Tue, 27 Jan 2026 00:44:56 +0100 Subject: [PATCH 12/18] tests: ssl: improve test_mbedtls_tls_id_group_name_table() Check provided group_name also against the value returned from mbedtls_ssl_get_curve_name_from_tls_id(). Signed-off-by: Valerio Setti --- tests/suites/test_suite_ssl.function | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/tests/suites/test_suite_ssl.function b/tests/suites/test_suite_ssl.function index 40f49a894b..9d2e56dd38 100644 --- a/tests/suites/test_suite_ssl.function +++ b/tests/suites/test_suite_ssl.function @@ -3599,7 +3599,6 @@ void test_mbedtls_tls_id_group_name_table(int group_id, char *group_name) mbedtls_ssl_iana_tls_group_info_t test_table[] = MBEDTLS_SSL_IANA_TLS_GROUPS_INFO; mbedtls_ssl_iana_tls_group_info_t *item; const char *table_name = NULL; - size_t table_name_len = 0; /* Ensure that the list includes at least 1 valid entry. */ TEST_ASSERT(test_table[0].tls_id != MBEDTLS_SSL_IANA_TLS_GROUP_NONE); @@ -3607,12 +3606,16 @@ void test_mbedtls_tls_id_group_name_table(int group_id, char *group_name) for (item = &test_table[0]; item->tls_id != MBEDTLS_SSL_IANA_TLS_GROUP_NONE; item++) { if (item->tls_id == group_id) { table_name = item->group_name; - table_name_len = strlen(table_name); } } TEST_ASSERT(table_name != NULL); - TEST_MEMORY_COMPARE(table_name, table_name_len, group_name, strlen(group_name)); + TEST_MEMORY_COMPARE(table_name, strlen(table_name), group_name, strlen(group_name)); + +#if defined(MBEDTLS_DEBUG_C) + const char *builtin_table_name = mbedtls_ssl_get_curve_name_from_tls_id(group_id); + TEST_MEMORY_COMPARE(builtin_table_name, strlen(builtin_table_name), group_name, strlen(group_name)); +#endif /* MBEDTLS_DEBUG_C */ exit:; } From 4f1e4fba80d13738b85a60329b9ef4165a64990c Mon Sep 17 00:00:00 2001 From: Valerio Setti Date: Tue, 27 Jan 2026 00:51:35 +0100 Subject: [PATCH 13/18] library: ssl: make the list of "TLS ID" <-> "group name" public when possible This is only done when MBEDTLS_DEBUG_C is declared in order not to inflate the library size. Signed-off-by: Valerio Setti --- include/mbedtls/ssl.h | 8 ++++++++ library/ssl_tls.c | 10 +++++----- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/include/mbedtls/ssl.h b/include/mbedtls/ssl.h index aeb499586f..225736fce7 100644 --- a/include/mbedtls/ssl.h +++ b/include/mbedtls/ssl.h @@ -3695,6 +3695,14 @@ typedef struct { { MBEDTLS_SSL_IANA_TLS_GROUP_NONE, NULL } \ } +#if defined(MBEDTLS_DEBUG_C) +/* + * List of known "TLS ID" <-> "group name". + * #MBEDTLS_SSL_IANA_TLS_GROUPS_INFO is used to initialized the list. + */ +extern mbedtls_ssl_iana_tls_group_info_t mbedtls_ssl_iana_tls_group_info[]; +#endif /* MBEDTLS_DEBUG_C */ + /** * \brief Return the list of supported groups (curves and finite fields). * diff --git a/library/ssl_tls.c b/library/ssl_tls.c index f6199195cb..5c03917719 100644 --- a/library/ssl_tls.c +++ b/library/ssl_tls.c @@ -5850,14 +5850,14 @@ uint16_t mbedtls_ssl_get_tls_id_from_ecp_group_id(mbedtls_ecp_group_id grp_id) } #if defined(MBEDTLS_DEBUG_C) -static -mbedtls_ssl_iana_tls_group_info_t tls_id_curve_name_table[] = MBEDTLS_SSL_IANA_TLS_GROUPS_INFO; +mbedtls_ssl_iana_tls_group_info_t mbedtls_ssl_iana_tls_group_info[] = + MBEDTLS_SSL_IANA_TLS_GROUPS_INFO; const char *mbedtls_ssl_get_curve_name_from_tls_id(uint16_t tls_id) { - for (int i = 0; tls_id_curve_name_table[i].tls_id != 0; i++) { - if (tls_id_curve_name_table[i].tls_id == tls_id) { - return tls_id_curve_name_table[i].group_name; + for (int i = 0; mbedtls_ssl_iana_tls_group_info[i].tls_id != 0; i++) { + if (mbedtls_ssl_iana_tls_group_info[i].tls_id == tls_id) { + return mbedtls_ssl_iana_tls_group_info[i].group_name; } } From d658f3d41ec6eda187cbf768cce381bacf42481f Mon Sep 17 00:00:00 2001 From: Valerio Setti Date: Tue, 27 Jan 2026 11:42:59 +0100 Subject: [PATCH 14/18] tests: ssl: skip testing of MBEDTLS_SSL_IANA_TLS_GROUP_NONE This is already indirectly checked in 'test_mbedtls_tls_id_group_name_table' because it's the last item of the list. Signed-off-by: Valerio Setti --- tests/suites/test_suite_ssl.data | 4 ---- tests/suites/test_suite_ssl.function | 3 ++- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/tests/suites/test_suite_ssl.data b/tests/suites/test_suite_ssl.data index 7732870cba..231c4b05f3 100644 --- a/tests/suites/test_suite_ssl.data +++ b/tests/suites/test_suite_ssl.data @@ -3191,10 +3191,6 @@ TLS ID <-> group name: ffdhe8192 depends_on:PSA_WANT_DH_RFC7919_8192 test_mbedtls_tls_id_group_name_table:MBEDTLS_SSL_IANA_TLS_GROUP_FFDHE8192:"ffdhe8192" -TLS ID <-> group name: [NONE] -test_mbedtls_tls_id_group_name_table:MBEDTLS_SSL_IANA_TLS_GROUP_NONE:"" - - Version config: valid client TLS 1.2 only depends_on:MBEDTLS_SSL_PROTO_TLS1_2 conf_version:MBEDTLS_SSL_IS_CLIENT:MBEDTLS_SSL_TRANSPORT_STREAM:MBEDTLS_SSL_VERSION_TLS1_2:MBEDTLS_SSL_VERSION_TLS1_2:0 diff --git a/tests/suites/test_suite_ssl.function b/tests/suites/test_suite_ssl.function index 9d2e56dd38..c63ad65bd2 100644 --- a/tests/suites/test_suite_ssl.function +++ b/tests/suites/test_suite_ssl.function @@ -3614,7 +3614,8 @@ void test_mbedtls_tls_id_group_name_table(int group_id, char *group_name) #if defined(MBEDTLS_DEBUG_C) const char *builtin_table_name = mbedtls_ssl_get_curve_name_from_tls_id(group_id); - TEST_MEMORY_COMPARE(builtin_table_name, strlen(builtin_table_name), group_name, strlen(group_name)); + TEST_MEMORY_COMPARE(builtin_table_name, strlen(builtin_table_name), group_name, + strlen(group_name)); #endif /* MBEDTLS_DEBUG_C */ exit:; From 9b49d5dbdedc4b7758be9f7ecb3c42c29e556c5d Mon Sep 17 00:00:00 2001 From: Valerio Setti Date: Tue, 27 Jan 2026 17:56:34 +0100 Subject: [PATCH 15/18] library: ssl: fix documentation of IANA TLS group info Signed-off-by: Valerio Setti --- include/mbedtls/ssl.h | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/include/mbedtls/ssl.h b/include/mbedtls/ssl.h index 225736fce7..baf889ba62 100644 --- a/include/mbedtls/ssl.h +++ b/include/mbedtls/ssl.h @@ -3660,21 +3660,25 @@ void mbedtls_ssl_conf_psk_cb(mbedtls_ssl_config *conf, #endif /* MBEDTLS_SSL_SRV_C */ #endif /* MBEDTLS_SSL_HANDSHAKE_WITH_PSK_ENABLED */ -/* +/** * This structure defines the correpondence between IANA's TLS-ID and its * corresponding group name. * This is used in macro #MBEDTLS_SSL_IANA_TLS_GROUPS_INFO to define the list * of known TLS IDs and corresponding group names. + * + * Future versions of the library might add new fields to this structure. */ typedef struct { uint16_t tls_id; const char *group_name; } mbedtls_ssl_iana_tls_group_info_t; -/* - * Initializer for a list of known "TLS ID" <-> "group name". - * Each entry is a structure of type mbedtls_ssl_iana_tls_group_info_t. - * The last entry has 'tls_id = 0' and 'group_name = NULL'. +/** + * Initializer for a list of known TLS 1.2 named elliptic curves and + * TLS 1.3 groups, with their names. + * + * Each entry is a structure of type #mbedtls_ssl_iana_tls_group_info_t. + * The last entry has `tls_id = 0` and `group_name = NULL`. */ #define MBEDTLS_SSL_IANA_TLS_GROUPS_INFO \ { \ @@ -3696,7 +3700,7 @@ typedef struct { } #if defined(MBEDTLS_DEBUG_C) -/* +/** * List of known "TLS ID" <-> "group name". * #MBEDTLS_SSL_IANA_TLS_GROUPS_INFO is used to initialized the list. */ From 476a2edea7c068b2b58ddf33009a456591350779 Mon Sep 17 00:00:00 2001 From: Valerio Setti Date: Tue, 27 Jan 2026 23:37:50 +0100 Subject: [PATCH 16/18] library: extend mbedtls_ssl_iana_tls_group_info_t structure Add new field that tells if the corresponding group is supported or not in the current build. Test function "test_mbedtls_ssl_get_supported_group_list" is extended to verify this new feature. Signed-off-by: Valerio Setti --- include/mbedtls/ssl.h | 119 ++++++++++++++++++++++----- tests/suites/test_suite_ssl.function | 13 ++- 2 files changed, 109 insertions(+), 23 deletions(-) diff --git a/include/mbedtls/ssl.h b/include/mbedtls/ssl.h index baf889ba62..95f3c3e22c 100644 --- a/include/mbedtls/ssl.h +++ b/include/mbedtls/ssl.h @@ -3661,18 +3661,93 @@ void mbedtls_ssl_conf_psk_cb(mbedtls_ssl_config *conf, #endif /* MBEDTLS_SSL_HANDSHAKE_WITH_PSK_ENABLED */ /** - * This structure defines the correpondence between IANA's TLS-ID and its - * corresponding group name. - * This is used in macro #MBEDTLS_SSL_IANA_TLS_GROUPS_INFO to define the list - * of known TLS IDs and corresponding group names. + * This structure defines each entry of the macro #MBEDTLS_SSL_IANA_TLS_GROUPS_INFO. * - * Future versions of the library might add new fields to this structure. + * \note Future versions of the library might add new fields to this structure. */ typedef struct { + /** TLS-ID */ uint16_t tls_id; + + /** Group name */ const char *group_name; + + /** 1 if the group is supported; 0 otherwise */ + uint8_t is_supported; } mbedtls_ssl_iana_tls_group_info_t; +/* Helpers to check which PSA_WANT_xxx symbols are defined for groups. */ +#if defined(PSA_WANT_ECC_MONTGOMERY_255) +#define MBEDTLS_SSL_HAVE_GROUP_X25519 1 +#else +#define MBEDTLS_SSL_HAVE_GROUP_X25519 0 +#endif +#if defined(PSA_WANT_ECC_SECP_R1_256) +#define MBEDTLS_SSL_HAVE_GROUP_SECP256R1 1 +#else +#define MBEDTLS_SSL_HAVE_GROUP_SECP256R1 0 +#endif +#if defined(PSA_WANT_ECC_SECP_K1_256) +#define MBEDTLS_SSL_HAVE_GROUP_SECP256K1 1 +#else +#define MBEDTLS_SSL_HAVE_GROUP_SECP256K1 0 +#endif +#if defined(PSA_WANT_ECC_SECP_R1_384) +#define MBEDTLS_SSL_HAVE_GROUP_SECP384R1 1 +#else +#define MBEDTLS_SSL_HAVE_GROUP_SECP384R1 0 +#endif +#if defined(PSA_WANT_ECC_MONTGOMERY_448) +#define MBEDTLS_SSL_HAVE_GROUP_X448 1 +#else +#define MBEDTLS_SSL_HAVE_GROUP_X448 0 +#endif +#if defined(PSA_WANT_ECC_SECP_R1_521) +#define MBEDTLS_SSL_HAVE_GROUP_SECP521R1 1 +#else +#define MBEDTLS_SSL_HAVE_GROUP_SECP521R1 0 +#endif +#if defined(PSA_WANT_ECC_BRAINPOOL_P_R1_256) +#define MBEDTLS_SSL_HAVE_GROUP_BP256R1 1 +#else +#define MBEDTLS_SSL_HAVE_GROUP_BP256R1 0 +#endif +#if defined(PSA_WANT_ECC_BRAINPOOL_P_R1_384) +#define MBEDTLS_SSL_HAVE_GROUP_BP384R1 1 +#else +#define MBEDTLS_SSL_HAVE_GROUP_BP384R1 0 +#endif +#if defined(PSA_WANT_ECC_BRAINPOOL_P_R1_512) +#define MBEDTLS_SSL_HAVE_GROUP_BP512R1 1 +#else +#define MBEDTLS_SSL_HAVE_GROUP_BP512R1 0 +#endif +#if defined(PSA_WANT_DH_RFC7919_2048) +#define MBEDTLS_SSL_HAVE_GROUP_FFDHE2048 1 +#else +#define MBEDTLS_SSL_HAVE_GROUP_FFDHE2048 0 +#endif +#if defined(PSA_WANT_DH_RFC7919_3072) +#define MBEDTLS_SSL_HAVE_GROUP_FFDHE3072 1 +#else +#define MBEDTLS_SSL_HAVE_GROUP_FFDHE3072 0 +#endif +#if defined(PSA_WANT_DH_RFC7919_4096) +#define MBEDTLS_SSL_HAVE_GROUP_FFDHE4096 1 +#else +#define MBEDTLS_SSL_HAVE_GROUP_FFDHE4096 0 +#endif +#if defined(PSA_WANT_DH_RFC7919_6144) +#define MBEDTLS_SSL_HAVE_GROUP_FFDHE6144 1 +#else +#define MBEDTLS_SSL_HAVE_GROUP_FFDHE6144 0 +#endif +#if defined(PSA_WANT_DH_RFC7919_8192) +#define MBEDTLS_SSL_HAVE_GROUP_FFDHE8192 1 +#else +#define MBEDTLS_SSL_HAVE_GROUP_FFDHE8192 0 +#endif + /** * Initializer for a list of known TLS 1.2 named elliptic curves and * TLS 1.3 groups, with their names. @@ -3680,23 +3755,23 @@ typedef struct { * Each entry is a structure of type #mbedtls_ssl_iana_tls_group_info_t. * The last entry has `tls_id = 0` and `group_name = NULL`. */ -#define MBEDTLS_SSL_IANA_TLS_GROUPS_INFO \ - { \ - { MBEDTLS_SSL_IANA_TLS_GROUP_X25519, "x25519" }, \ - { MBEDTLS_SSL_IANA_TLS_GROUP_SECP256R1, "secp256r1" }, \ - { MBEDTLS_SSL_IANA_TLS_GROUP_SECP256K1, "secp256k1" }, \ - { MBEDTLS_SSL_IANA_TLS_GROUP_SECP384R1, "secp384r1" }, \ - { MBEDTLS_SSL_IANA_TLS_GROUP_X448, "x448" }, \ - { MBEDTLS_SSL_IANA_TLS_GROUP_SECP521R1, "secp521r1" }, \ - { MBEDTLS_SSL_IANA_TLS_GROUP_BP256R1, "brainpoolP256r1" }, \ - { MBEDTLS_SSL_IANA_TLS_GROUP_BP384R1, "brainpoolP384r1" }, \ - { MBEDTLS_SSL_IANA_TLS_GROUP_BP512R1, "brainpoolP512r1" }, \ - { MBEDTLS_SSL_IANA_TLS_GROUP_FFDHE2048, "ffdhe2048" }, \ - { MBEDTLS_SSL_IANA_TLS_GROUP_FFDHE3072, "ffdhe3072" }, \ - { MBEDTLS_SSL_IANA_TLS_GROUP_FFDHE4096, "ffdhe4096" }, \ - { MBEDTLS_SSL_IANA_TLS_GROUP_FFDHE6144, "ffdhe6144" }, \ - { MBEDTLS_SSL_IANA_TLS_GROUP_FFDHE8192, "ffdhe8192" }, \ - { MBEDTLS_SSL_IANA_TLS_GROUP_NONE, NULL } \ +#define MBEDTLS_SSL_IANA_TLS_GROUPS_INFO \ + { \ + { MBEDTLS_SSL_IANA_TLS_GROUP_X25519, "x25519", MBEDTLS_SSL_HAVE_GROUP_X25519 }, \ + { MBEDTLS_SSL_IANA_TLS_GROUP_SECP256R1, "secp256r1", MBEDTLS_SSL_HAVE_GROUP_SECP256R1 }, \ + { MBEDTLS_SSL_IANA_TLS_GROUP_SECP256K1, "secp256k1", MBEDTLS_SSL_HAVE_GROUP_SECP256K1 }, \ + { MBEDTLS_SSL_IANA_TLS_GROUP_SECP384R1, "secp384r1", MBEDTLS_SSL_HAVE_GROUP_SECP384R1 }, \ + { MBEDTLS_SSL_IANA_TLS_GROUP_X448, "x448", MBEDTLS_SSL_HAVE_GROUP_X448 }, \ + { MBEDTLS_SSL_IANA_TLS_GROUP_SECP521R1, "secp521r1", MBEDTLS_SSL_HAVE_GROUP_SECP521R1 }, \ + { MBEDTLS_SSL_IANA_TLS_GROUP_BP256R1, "brainpoolP256r1", MBEDTLS_SSL_HAVE_GROUP_BP256R1 }, \ + { MBEDTLS_SSL_IANA_TLS_GROUP_BP384R1, "brainpoolP384r1", MBEDTLS_SSL_HAVE_GROUP_BP384R1 }, \ + { MBEDTLS_SSL_IANA_TLS_GROUP_BP512R1, "brainpoolP512r1", MBEDTLS_SSL_HAVE_GROUP_BP512R1 }, \ + { MBEDTLS_SSL_IANA_TLS_GROUP_FFDHE2048, "ffdhe2048", MBEDTLS_SSL_HAVE_GROUP_FFDHE2048 }, \ + { MBEDTLS_SSL_IANA_TLS_GROUP_FFDHE3072, "ffdhe3072", MBEDTLS_SSL_HAVE_GROUP_FFDHE3072 }, \ + { MBEDTLS_SSL_IANA_TLS_GROUP_FFDHE4096, "ffdhe4096", MBEDTLS_SSL_HAVE_GROUP_FFDHE4096 }, \ + { MBEDTLS_SSL_IANA_TLS_GROUP_FFDHE6144, "ffdhe6144", MBEDTLS_SSL_HAVE_GROUP_FFDHE6144 }, \ + { MBEDTLS_SSL_IANA_TLS_GROUP_FFDHE8192, "ffdhe8192", MBEDTLS_SSL_HAVE_GROUP_FFDHE8192 }, \ + { MBEDTLS_SSL_IANA_TLS_GROUP_NONE, NULL, 1 } \ } #if defined(MBEDTLS_DEBUG_C) diff --git a/tests/suites/test_suite_ssl.function b/tests/suites/test_suite_ssl.function index c63ad65bd2..55f9965542 100644 --- a/tests/suites/test_suite_ssl.function +++ b/tests/suites/test_suite_ssl.function @@ -3580,15 +3580,26 @@ void test_mbedtls_ssl_get_supported_group_list(int iana_group_id, int is_availab const uint16_t *list = mbedtls_ssl_get_supported_group_list(); int found = 0; + /* First: go through the list returned by mbedtls_ssl_get_supported_group_list() and + * check that the specified group ID is supported/unsupported as expected. */ for (int i = 0; list[i] != MBEDTLS_SSL_IANA_TLS_GROUP_NONE; i++) { if (list[i] == iana_group_id) { found = 1; break; } } - TEST_EQUAL(found, is_available); + /* Second: check that supported/unsupported property for the specified group is also + * correctly set in the array initialized by MBEDTLS_SSL_IANA_TLS_GROUP_NONE. */ + mbedtls_ssl_iana_tls_group_info_t group_info_table[] = MBEDTLS_SSL_IANA_TLS_GROUPS_INFO; + mbedtls_ssl_iana_tls_group_info_t *ptr; + for (ptr = &group_info_table[0]; ptr->tls_id != MBEDTLS_SSL_IANA_TLS_GROUP_NONE; ptr++) { + if (ptr->tls_id == iana_group_id) { + TEST_EQUAL(ptr->is_supported, is_available); + } + } + exit:; } /* END_CASE */ From c3f585b8ee9c6239a2dcee8affdb70be83ebd043 Mon Sep 17 00:00:00 2001 From: Valerio Setti Date: Fri, 30 Jan 2026 22:02:08 +0100 Subject: [PATCH 17/18] tests: ssl: fix typo in comment in test_mbedtls_ssl_get_supported_group_list Signed-off-by: Valerio Setti --- tests/suites/test_suite_ssl.function | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/suites/test_suite_ssl.function b/tests/suites/test_suite_ssl.function index 55f9965542..a12acfe83e 100644 --- a/tests/suites/test_suite_ssl.function +++ b/tests/suites/test_suite_ssl.function @@ -3591,7 +3591,7 @@ void test_mbedtls_ssl_get_supported_group_list(int iana_group_id, int is_availab TEST_EQUAL(found, is_available); /* Second: check that supported/unsupported property for the specified group is also - * correctly set in the array initialized by MBEDTLS_SSL_IANA_TLS_GROUP_NONE. */ + * correctly set in the array initialized by MBEDTLS_SSL_IANA_TLS_GROUP_INFO. */ mbedtls_ssl_iana_tls_group_info_t group_info_table[] = MBEDTLS_SSL_IANA_TLS_GROUPS_INFO; mbedtls_ssl_iana_tls_group_info_t *ptr; for (ptr = &group_info_table[0]; ptr->tls_id != MBEDTLS_SSL_IANA_TLS_GROUP_NONE; ptr++) { From 318e4314dfc7e591e265903f57acdf20a13a3371 Mon Sep 17 00:00:00 2001 From: Valerio Setti Date: Mon, 2 Feb 2026 13:38:03 +0100 Subject: [PATCH 18/18] changelog: add notes about helpers added to get list of known/supported TLS groups Signed-off-by: Valerio Setti --- ChangeLog.d/issue10349.txt | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 ChangeLog.d/issue10349.txt diff --git a/ChangeLog.d/issue10349.txt b/ChangeLog.d/issue10349.txt new file mode 100644 index 0000000000..ab47659ed8 --- /dev/null +++ b/ChangeLog.d/issue10349.txt @@ -0,0 +1,8 @@ +Features + * Function mbedtls_ssl_get_supported_group_list() is added to return the list + of supported groups IDs (curves and finite fields). + * MBEDTLS_SSL_IANA_TLS_GROUPS_INFO is added to allow defining the list of + mbedtls_ssl_iana_tls_group_info_t items which represent known TLS groups + with corresponding informations. + If MBEDTLS_DEBUG_C is also enabled then mbedtls_ssl_iana_tls_group_info is + also available as implementation of such list.