Merge pull request #10847 from valeriosetti/remove-ecp-deps-backport4.1

[4.1] Reduce dependencies on private `ecp.h` header
This commit is contained in:
Gilles Peskine
2026-08-04 13:43:23 +00:00
committed by GitHub
7 changed files with 100 additions and 100 deletions
+2 -4
View File
@@ -255,8 +255,7 @@ static int ssl_write_supported_groups_ext(mbedtls_ssl_context *ssl,
if (flags & SSL_WRITE_SUPPORTED_GROUPS_EXT_TLS1_3_FLAG) {
#if defined(PSA_WANT_ALG_ECDH)
if (mbedtls_ssl_tls13_named_group_is_ecdhe(*group_list) &&
mbedtls_ssl_get_psa_curve_info_from_tls_id(
*group_list, NULL, NULL) == PSA_SUCCESS) {
(mbedtls_ssl_is_tls_id_supported(*group_list))) {
propose_group = 1;
}
#endif
@@ -271,8 +270,7 @@ static int ssl_write_supported_groups_ext(mbedtls_ssl_context *ssl,
#if defined(MBEDTLS_SSL_TLS1_2_SOME_ECC)
if ((flags & SSL_WRITE_SUPPORTED_GROUPS_EXT_TLS1_2_FLAG) &&
mbedtls_ssl_tls12_named_group_is_ecdhe(*group_list) &&
(mbedtls_ssl_get_ecp_group_id_from_tls_id(*group_list) !=
MBEDTLS_ECP_DP_NONE)) {
(mbedtls_ssl_is_tls_id_supported(*group_list))) {
propose_group = 1;
}
#endif /* MBEDTLS_SSL_TLS1_2_SOME_ECC */
+19 -15
View File
@@ -1502,10 +1502,6 @@ int mbedtls_ssl_set_calc_verify_md(mbedtls_ssl_context *ssl, int md);
MBEDTLS_CHECK_RETURN_CRITICAL
int mbedtls_ssl_check_curve_tls_id(const mbedtls_ssl_context *ssl, uint16_t tls_id);
#if defined(PSA_WANT_KEY_TYPE_ECC_PUBLIC_KEY)
MBEDTLS_CHECK_RETURN_CRITICAL
int mbedtls_ssl_check_curve(const mbedtls_ssl_context *ssl, mbedtls_ecp_group_id grp_id);
#endif /* PSA_WANT_KEY_TYPE_ECC_PUBLIC_KEY */
/**
* \brief Return PSA EC info for the specified TLS ID.
@@ -1528,22 +1524,31 @@ int mbedtls_ssl_get_psa_curve_info_from_tls_id(uint16_t tls_id,
size_t *bits);
/**
* \brief Return \c mbedtls_ecp_group_id for the specified TLS ID.
* \brief Tell if a TLS group ID is supported or not.
*
* \param tls_id The TLS ID to look for
* \return Proper \c mbedtls_ecp_group_id if the TLS ID is supported,
* or MBEDTLS_ECP_DP_NONE otherwise
* \param tls_id The TLS ID to look for.
* \return 1 if specified TLS ID is supported, 0 otherwise.
*/
mbedtls_ecp_group_id mbedtls_ssl_get_ecp_group_id_from_tls_id(uint16_t tls_id);
int mbedtls_ssl_is_tls_id_supported(uint16_t tls_id);
/**
* \brief Return TLS ID for the specified \c mbedtls_ecp_group_id.
* \brief Return TLS ID for the specified curve.
*
* \param grp_id The \c mbedtls_ecp_group_id ID to look for
* \return Proper TLS ID if the \c mbedtls_ecp_group_id is supported,
* \param family The \c psa_ecc_family_t for the TLS ID to look for.
* \param bits The bit size for the TLS ID to look for.
* \return Proper TLS ID if the specified EC group is supported,
* or 0 otherwise
*/
uint16_t mbedtls_ssl_get_tls_id_from_ecp_group_id(mbedtls_ecp_group_id grp_id);
uint16_t mbedtls_ssl_get_tls_id_from_curve_info(psa_ecc_family_t family, size_t bits);
/**
* \brief Return the number of supported TLS group IDs + 1.
*
* \return Number of supported TLS group IDs in \c tls_id_match_table + 1.
* In other words the returned value concides with the array length
* of \c tls_id_match_table.
*/
size_t mbedtls_ssl_get_supported_tls_id_count(void);
#if defined(MBEDTLS_DEBUG_C)
/**
@@ -2249,8 +2254,7 @@ static inline int mbedtls_ssl_named_group_is_supported(uint16_t named_group)
{
#if defined(PSA_WANT_ALG_ECDH)
if (mbedtls_ssl_tls13_named_group_is_ecdhe(named_group)) {
if (mbedtls_ssl_get_ecp_group_id_from_tls_id(named_group) !=
MBEDTLS_ECP_DP_NONE) {
if (mbedtls_ssl_is_tls_id_supported(named_group)) {
return 1;
}
}
+29 -36
View File
@@ -5796,57 +5796,40 @@ int mbedtls_ssl_check_curve_tls_id(const mbedtls_ssl_context *ssl, uint16_t tls_
return -1;
}
#if defined(PSA_WANT_KEY_TYPE_ECC_PUBLIC_KEY)
/*
* Same as mbedtls_ssl_check_curve_tls_id() but with a mbedtls_ecp_group_id.
*/
int mbedtls_ssl_check_curve(const mbedtls_ssl_context *ssl, mbedtls_ecp_group_id grp_id)
{
uint16_t tls_id = mbedtls_ssl_get_tls_id_from_ecp_group_id(grp_id);
if (tls_id == 0) {
return -1;
}
return mbedtls_ssl_check_curve_tls_id(ssl, tls_id);
}
#endif /* PSA_WANT_KEY_TYPE_ECC_PUBLIC_KEY */
static const struct {
uint16_t tls_id;
mbedtls_ecp_group_id ecp_group_id;
psa_ecc_family_t psa_family;
uint16_t bits;
} tls_id_match_table[] =
{
#if defined(PSA_WANT_ECC_SECP_R1_521)
{ 25, MBEDTLS_ECP_DP_SECP521R1, PSA_ECC_FAMILY_SECP_R1, 521 },
{ 25, PSA_ECC_FAMILY_SECP_R1, 521 },
#endif
#if defined(PSA_WANT_ECC_BRAINPOOL_P_R1_512)
{ 28, MBEDTLS_ECP_DP_BP512R1, PSA_ECC_FAMILY_BRAINPOOL_P_R1, 512 },
{ 28, PSA_ECC_FAMILY_BRAINPOOL_P_R1, 512 },
#endif
#if defined(PSA_WANT_ECC_SECP_R1_384)
{ 24, MBEDTLS_ECP_DP_SECP384R1, PSA_ECC_FAMILY_SECP_R1, 384 },
{ 24, PSA_ECC_FAMILY_SECP_R1, 384 },
#endif
#if defined(PSA_WANT_ECC_BRAINPOOL_P_R1_384)
{ 27, MBEDTLS_ECP_DP_BP384R1, PSA_ECC_FAMILY_BRAINPOOL_P_R1, 384 },
{ 27, PSA_ECC_FAMILY_BRAINPOOL_P_R1, 384 },
#endif
#if defined(PSA_WANT_ECC_SECP_R1_256)
{ 23, MBEDTLS_ECP_DP_SECP256R1, PSA_ECC_FAMILY_SECP_R1, 256 },
{ 23, PSA_ECC_FAMILY_SECP_R1, 256 },
#endif
#if defined(PSA_WANT_ECC_SECP_K1_256)
{ 22, MBEDTLS_ECP_DP_SECP256K1, PSA_ECC_FAMILY_SECP_K1, 256 },
{ 22, PSA_ECC_FAMILY_SECP_K1, 256 },
#endif
#if defined(PSA_WANT_ECC_BRAINPOOL_P_R1_256)
{ 26, MBEDTLS_ECP_DP_BP256R1, PSA_ECC_FAMILY_BRAINPOOL_P_R1, 256 },
{ 26, PSA_ECC_FAMILY_BRAINPOOL_P_R1, 256 },
#endif
#if defined(PSA_WANT_ECC_MONTGOMERY_255)
{ 29, MBEDTLS_ECP_DP_CURVE25519, PSA_ECC_FAMILY_MONTGOMERY, 255 },
{ 29, PSA_ECC_FAMILY_MONTGOMERY, 255 },
#endif
#if defined(PSA_WANT_ECC_MONTGOMERY_448)
{ 30, MBEDTLS_ECP_DP_CURVE448, PSA_ECC_FAMILY_MONTGOMERY, 448 },
{ 30, PSA_ECC_FAMILY_MONTGOMERY, 448 },
#endif
{ 0, MBEDTLS_ECP_DP_NONE, 0, 0 },
{ 0, 0, 0 },
};
int mbedtls_ssl_get_psa_curve_info_from_tls_id(uint16_t tls_id,
@@ -5868,22 +5851,22 @@ int mbedtls_ssl_get_psa_curve_info_from_tls_id(uint16_t tls_id,
return PSA_ERROR_NOT_SUPPORTED;
}
mbedtls_ecp_group_id mbedtls_ssl_get_ecp_group_id_from_tls_id(uint16_t tls_id)
int mbedtls_ssl_is_tls_id_supported(uint16_t tls_id)
{
for (int i = 0; tls_id_match_table[i].tls_id != 0; i++) {
if (tls_id_match_table[i].tls_id == tls_id) {
return tls_id_match_table[i].ecp_group_id;
return 1;
}
}
return MBEDTLS_ECP_DP_NONE;
return 0;
}
uint16_t mbedtls_ssl_get_tls_id_from_ecp_group_id(mbedtls_ecp_group_id grp_id)
uint16_t mbedtls_ssl_get_tls_id_from_curve_info(psa_ecc_family_t family, size_t bits)
{
for (int i = 0; tls_id_match_table[i].ecp_group_id != MBEDTLS_ECP_DP_NONE;
i++) {
if (tls_id_match_table[i].ecp_group_id == grp_id) {
for (int i = 0; tls_id_match_table[i].tls_id != 0; i++) {
if ((tls_id_match_table[i].psa_family == family) &&
(tls_id_match_table[i].bits == bits)) {
return tls_id_match_table[i].tls_id;
}
}
@@ -5891,6 +5874,11 @@ uint16_t mbedtls_ssl_get_tls_id_from_ecp_group_id(mbedtls_ecp_group_id grp_id)
return 0;
}
size_t mbedtls_ssl_get_supported_tls_id_count(void)
{
return ARRAY_LENGTH(tls_id_match_table);
}
#if defined(MBEDTLS_DEBUG_C)
mbedtls_ssl_iana_tls_group_info_t mbedtls_ssl_iana_tls_group_info[] =
MBEDTLS_SSL_IANA_TLS_GROUPS_INFO;
@@ -8830,8 +8818,13 @@ int mbedtls_ssl_verify_certificate(mbedtls_ssl_context *ssl,
#if defined(MBEDTLS_SSL_PROTO_TLS1_2) && \
defined(PSA_WANT_KEY_TYPE_ECC_PUBLIC_KEY)
if (ssl->tls_version == MBEDTLS_SSL_VERSION_TLS1_2 &&
PSA_KEY_TYPE_IS_ECC(mbedtls_pk_get_type(&chain->pk))) {
if (mbedtls_ssl_check_curve(ssl, mbedtls_pk_get_ec_group_id(&chain->pk)) != 0) {
PSA_KEY_TYPE_IS_ECC(mbedtls_pk_get_key_type(&chain->pk))) {
psa_key_type_t key_type = mbedtls_pk_get_key_type(&chain->pk);
psa_ecc_family_t ec_family = PSA_KEY_TYPE_ECC_GET_FAMILY(key_type);
size_t bits = mbedtls_pk_get_bitlen(&chain->pk);
int tls_id = mbedtls_ssl_get_tls_id_from_curve_info(ec_family, bits);
if (mbedtls_ssl_check_curve_tls_id(ssl, tls_id) != 0) {
MBEDTLS_SSL_DEBUG_MSG(1, ("bad certificate (EC key curve)"));
ssl->session_negotiate->verify_result |= MBEDTLS_X509_BADCERT_BAD_KEY;
if (ret == 0) {
+1 -2
View File
@@ -1934,8 +1934,7 @@ start_processing:
MBEDTLS_SSL_CHK_BUF_READ_PTR(p, end, 3);
uint16_t read_tls_id = MBEDTLS_GET_UINT16_BE(p, 1);
uint16_t exp_tls_id = mbedtls_ssl_get_tls_id_from_ecp_group_id(
MBEDTLS_ECP_DP_SECP256R1);
uint16_t exp_tls_id = mbedtls_ssl_get_tls_id_from_curve_info(PSA_ECC_FAMILY_SECP_R1, 256);
if (exp_tls_id == 0) {
return MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
+20 -10
View File
@@ -202,8 +202,8 @@ static int ssl_parse_supported_groups_ext(mbedtls_ssl_context *ssl,
/* Don't allow our peer to make us allocate too much memory,
* and leave room for a final 0 */
our_size = list_size / 2 + 1;
if (our_size > MBEDTLS_ECP_DP_MAX) {
our_size = MBEDTLS_ECP_DP_MAX;
if (our_size > mbedtls_ssl_get_supported_tls_id_count()) {
our_size = mbedtls_ssl_get_supported_tls_id_count();
}
if ((curves_tls_id = mbedtls_calloc(our_size,
@@ -219,8 +219,7 @@ static int ssl_parse_supported_groups_ext(mbedtls_ssl_context *ssl,
while (list_size > 0 && our_size > 1) {
uint16_t curr_tls_id = MBEDTLS_GET_UINT16_BE(p, 0);
if (mbedtls_ssl_get_ecp_group_id_from_tls_id(curr_tls_id) !=
MBEDTLS_ECP_DP_NONE) {
if (mbedtls_ssl_is_tls_id_supported(curr_tls_id)) {
*curves_tls_id++ = curr_tls_id;
our_size--;
}
@@ -630,12 +629,24 @@ static int ssl_check_key_curve(mbedtls_pk_context *pk,
uint16_t *curves_tls_id)
{
uint16_t *curr_tls_id = curves_tls_id;
mbedtls_ecp_group_id grp_id = mbedtls_pk_get_ec_group_id(pk);
mbedtls_ecp_group_id curr_grp_id;
psa_key_type_t key_type = mbedtls_pk_get_key_type(pk);
size_t key_bits = mbedtls_pk_get_bitlen(pk);
psa_key_type_t curr_key_type;
size_t curr_key_bits;
psa_status_t status;
while (*curr_tls_id != 0) {
curr_grp_id = mbedtls_ssl_get_ecp_group_id_from_tls_id(*curr_tls_id);
if (curr_grp_id == grp_id) {
status = mbedtls_ssl_get_psa_curve_info_from_tls_id(*curr_tls_id,
&curr_key_type, &curr_key_bits);
if (status != PSA_SUCCESS) {
/* This TLS group ID is not supported. Move to the next one. */
curr_tls_id++;
continue;
}
/* Check if EC family type and key bits for the current TLS group ID are the
* same as the ones in the provided PK context. */
if ((PSA_KEY_TYPE_ECC_GET_FAMILY(key_type) == PSA_KEY_TYPE_ECC_GET_FAMILY(curr_key_type)) &&
(key_bits == curr_key_bits)) {
return 0;
}
curr_tls_id++;
@@ -2486,8 +2497,7 @@ static int ssl_prepare_server_key_exchange(mbedtls_ssl_context *ssl,
* However since we only support secp256r1 for now, we hardcode its
* TLS ID here
*/
uint16_t tls_id = mbedtls_ssl_get_tls_id_from_ecp_group_id(
MBEDTLS_ECP_DP_SECP256R1);
uint16_t tls_id = mbedtls_ssl_get_tls_id_from_curve_info(PSA_ECC_FAMILY_SECP_R1, 256);
if (tls_id == 0) {
return MBEDTLS_ERR_SSL_FEATURE_UNAVAILABLE;
}
+11 -15
View File
@@ -727,23 +727,19 @@ int mbedtls_test_get_tls13_ticket(
mbedtls_ssl_set_hs_ecjpake_password(&ssl, pwd_string, pwd_len); \
TEST_EQUAL(ret, exp_ret_val)
#define TEST_AVAILABLE_ECC(tls_id_, group_id_, psa_family_, psa_bits_) \
TEST_EQUAL(mbedtls_ssl_get_ecp_group_id_from_tls_id(tls_id_), \
group_id_); \
TEST_EQUAL(mbedtls_ssl_get_tls_id_from_ecp_group_id(group_id_), \
tls_id_); \
TEST_EQUAL(mbedtls_ssl_get_psa_curve_info_from_tls_id(tls_id_, \
&psa_type, &psa_bits), PSA_SUCCESS); \
TEST_EQUAL(psa_family_, PSA_KEY_TYPE_ECC_GET_FAMILY(psa_type)); \
#define TEST_AVAILABLE_ECC(tls_id_, psa_family_, psa_bits_) \
TEST_EQUAL(mbedtls_ssl_is_tls_id_supported(tls_id_), 1); \
TEST_EQUAL(mbedtls_ssl_get_tls_id_from_curve_info(psa_family_, psa_bits_), tls_id_); \
TEST_EQUAL(mbedtls_ssl_get_psa_curve_info_from_tls_id(tls_id_, \
&psa_type, &psa_bits), PSA_SUCCESS); \
TEST_EQUAL(psa_family_, PSA_KEY_TYPE_ECC_GET_FAMILY(psa_type)); \
TEST_EQUAL(psa_bits_, psa_bits);
#define TEST_UNAVAILABLE_ECC(tls_id_, group_id_, psa_family_, psa_bits_) \
TEST_EQUAL(mbedtls_ssl_get_ecp_group_id_from_tls_id(tls_id_), \
MBEDTLS_ECP_DP_NONE); \
TEST_EQUAL(mbedtls_ssl_get_tls_id_from_ecp_group_id(group_id_), \
0); \
TEST_EQUAL(mbedtls_ssl_get_psa_curve_info_from_tls_id(tls_id_, \
&psa_type, &psa_bits), \
#define TEST_UNAVAILABLE_ECC(tls_id_, psa_family_, psa_bits_) \
TEST_EQUAL(mbedtls_ssl_is_tls_id_supported(tls_id_), 0); \
TEST_EQUAL(mbedtls_ssl_get_tls_id_from_curve_info(psa_family_, psa_bits_), 0); \
TEST_EQUAL(mbedtls_ssl_get_psa_curve_info_from_tls_id(tls_id_, \
&psa_type, &psa_bits), \
PSA_ERROR_NOT_SUPPORTED);
/**
+18 -18
View File
@@ -4616,49 +4616,49 @@ void elliptic_curve_get_properties()
MD_OR_USE_PSA_INIT();
#if defined(PSA_WANT_ECC_SECP_R1_521)
TEST_AVAILABLE_ECC(25, MBEDTLS_ECP_DP_SECP521R1, PSA_ECC_FAMILY_SECP_R1, 521);
TEST_AVAILABLE_ECC(25, PSA_ECC_FAMILY_SECP_R1, 521);
#else
TEST_UNAVAILABLE_ECC(25, MBEDTLS_ECP_DP_SECP521R1, PSA_ECC_FAMILY_SECP_R1, 521);
TEST_UNAVAILABLE_ECC(25, PSA_ECC_FAMILY_SECP_R1, 521);
#endif
#if defined(PSA_WANT_ECC_BRAINPOOL_P_R1_512)
TEST_AVAILABLE_ECC(28, MBEDTLS_ECP_DP_BP512R1, PSA_ECC_FAMILY_BRAINPOOL_P_R1, 512);
TEST_AVAILABLE_ECC(28, PSA_ECC_FAMILY_BRAINPOOL_P_R1, 512);
#else
TEST_UNAVAILABLE_ECC(28, MBEDTLS_ECP_DP_BP512R1, PSA_ECC_FAMILY_BRAINPOOL_P_R1, 512);
TEST_UNAVAILABLE_ECC(28, PSA_ECC_FAMILY_BRAINPOOL_P_R1, 512);
#endif
#if defined(PSA_WANT_ECC_SECP_R1_384)
TEST_AVAILABLE_ECC(24, MBEDTLS_ECP_DP_SECP384R1, PSA_ECC_FAMILY_SECP_R1, 384);
TEST_AVAILABLE_ECC(24, PSA_ECC_FAMILY_SECP_R1, 384);
#else
TEST_UNAVAILABLE_ECC(24, MBEDTLS_ECP_DP_SECP384R1, PSA_ECC_FAMILY_SECP_R1, 384);
TEST_UNAVAILABLE_ECC(24, PSA_ECC_FAMILY_SECP_R1, 384);
#endif
#if defined(PSA_WANT_ECC_BRAINPOOL_P_R1_384)
TEST_AVAILABLE_ECC(27, MBEDTLS_ECP_DP_BP384R1, PSA_ECC_FAMILY_BRAINPOOL_P_R1, 384);
TEST_AVAILABLE_ECC(27, PSA_ECC_FAMILY_BRAINPOOL_P_R1, 384);
#else
TEST_UNAVAILABLE_ECC(27, MBEDTLS_ECP_DP_BP384R1, PSA_ECC_FAMILY_BRAINPOOL_P_R1, 384);
TEST_UNAVAILABLE_ECC(27, PSA_ECC_FAMILY_BRAINPOOL_P_R1, 384);
#endif
#if defined(PSA_WANT_ECC_SECP_R1_256)
TEST_AVAILABLE_ECC(23, MBEDTLS_ECP_DP_SECP256R1, PSA_ECC_FAMILY_SECP_R1, 256);
TEST_AVAILABLE_ECC(23, PSA_ECC_FAMILY_SECP_R1, 256);
#else
TEST_UNAVAILABLE_ECC(23, MBEDTLS_ECP_DP_SECP256R1, PSA_ECC_FAMILY_SECP_R1, 256);
TEST_UNAVAILABLE_ECC(23, PSA_ECC_FAMILY_SECP_R1, 256);
#endif
#if defined(PSA_WANT_ECC_SECP_K1_256)
TEST_AVAILABLE_ECC(22, MBEDTLS_ECP_DP_SECP256K1, PSA_ECC_FAMILY_SECP_K1, 256);
TEST_AVAILABLE_ECC(22, PSA_ECC_FAMILY_SECP_K1, 256);
#else
TEST_UNAVAILABLE_ECC(22, MBEDTLS_ECP_DP_SECP256K1, PSA_ECC_FAMILY_SECP_K1, 256);
TEST_UNAVAILABLE_ECC(22, PSA_ECC_FAMILY_SECP_K1, 256);
#endif
#if defined(PSA_WANT_ECC_BRAINPOOL_P_R1_256)
TEST_AVAILABLE_ECC(26, MBEDTLS_ECP_DP_BP256R1, PSA_ECC_FAMILY_BRAINPOOL_P_R1, 256);
TEST_AVAILABLE_ECC(26, PSA_ECC_FAMILY_BRAINPOOL_P_R1, 256);
#else
TEST_UNAVAILABLE_ECC(26, MBEDTLS_ECP_DP_BP256R1, PSA_ECC_FAMILY_BRAINPOOL_P_R1, 256);
TEST_UNAVAILABLE_ECC(26, PSA_ECC_FAMILY_BRAINPOOL_P_R1, 256);
#endif
#if defined(PSA_WANT_ECC_MONTGOMERY_255)
TEST_AVAILABLE_ECC(29, MBEDTLS_ECP_DP_CURVE25519, PSA_ECC_FAMILY_MONTGOMERY, 255);
TEST_AVAILABLE_ECC(29, PSA_ECC_FAMILY_MONTGOMERY, 255);
#else
TEST_UNAVAILABLE_ECC(29, MBEDTLS_ECP_DP_CURVE25519, PSA_ECC_FAMILY_MONTGOMERY, 255);
TEST_UNAVAILABLE_ECC(29, PSA_ECC_FAMILY_MONTGOMERY, 255);
#endif
#if defined(PSA_WANT_ECC_MONTGOMERY_448)
TEST_AVAILABLE_ECC(30, MBEDTLS_ECP_DP_CURVE448, PSA_ECC_FAMILY_MONTGOMERY, 448);
TEST_AVAILABLE_ECC(30, PSA_ECC_FAMILY_MONTGOMERY, 448);
#else
TEST_UNAVAILABLE_ECC(30, MBEDTLS_ECP_DP_CURVE448, PSA_ECC_FAMILY_MONTGOMERY, 448);
TEST_UNAVAILABLE_ECC(30, PSA_ECC_FAMILY_MONTGOMERY, 448);
#endif
goto exit;
exit: