Compare commits

...

3 Commits

Author SHA1 Message Date
Paulo Santos
ffcce24f4c
Merge 34a8ce1e85e1901b35ee15976ca677ec94145705 into 03e1438089654fb884ac48e0f3cd0049cfe2c102 2026-10-27 18:42:00 +00:00
Paulo Santos
34a8ce1e85
ssl: size the ECDH premaster secret by PSA alone
_pms_ecdh and _pms_ecdhe_psk are sized by
PSA_RAW_KEY_AGREEMENT_OUTPUT_MAX_SIZE, with no MBEDTLS_ECP_MAX_BYTES
fallback and no new public macro. The ChangeLog entry describes the
user-visible failure.

Signed-off-by: Paulo Santos <paulo.santos-ext@hexagon.com>
2026-10-27 15:41:52 -03:00
Paulo Santos
cf6d40a92d
ssl: size _pms_ecdh against PSA_RAW_KEY_AGREEMENT_OUTPUT_MAX_SIZE
In PSA-client-only builds (MBEDTLS_PSA_CRYPTO_C disabled, e.g. NS-side
mbedtls dispatching to a secure PSA service like TF-M), the local
ECP_LIGHT cascade does not run and MBEDTLS_ECP_MAX_BYTES collapses to 1.
The `_pms_ecdh` and `_pms_ecdhe_psk` members of `union
mbedtls_ssl_premaster_secret` then declare 1-byte arrays. In builds
where only ECDHE-RSA / ECDHE-ECDSA is enabled (no PSK, no ECJPAKE), the
whole union ends up that small, and psa_raw_key_agreement() returns
PSA_ERROR_BUFFER_TOO_SMALL during the TLS 1.2 ECDHE handshake. The
handshake aborts as MBEDTLS_ERR_SSL_HW_ACCEL_FAILED with no path to
success in this configuration.

Introduce MBEDTLS_SSL_PMS_ECDH_SIZE as
max(PSA_RAW_KEY_AGREEMENT_OUTPUT_MAX_SIZE, MBEDTLS_ECP_MAX_BYTES) so
both legacy ECP and PSA-client builds get a sufficient buffer.
PSA_RAW_KEY_AGREEMENT_OUTPUT_MAX_SIZE is always defined, sized by the
enabled PSA_WANT_ECC_* curves.

Signed-off-by: Paulo Santos <paulo.santos-ext@hexagon.com>
2026-05-20 14:39:00 -03:00
2 changed files with 9 additions and 2 deletions

View File

@ -0,0 +1,7 @@
Bugfix
* Fix TLS 1.2 ECDHE handshakes failing in PSA-client-only
(MBEDTLS_PSA_CRYPTO_C disabled) builds when PSK
and ECJPAKE key-exchanges were disabled.
In this scenario ECDHE key agreement failed returning
PSA_ERROR_BUFFER_TOO_SMALL.
Fixes #10757.

View File

@ -653,13 +653,13 @@ union mbedtls_ssl_premaster_secret {
unsigned char dummy; /* Make the union non-empty even with SSL disabled */
#if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_RSA_ENABLED) || \
defined(MBEDTLS_KEY_EXCHANGE_ECDHE_ECDSA_ENABLED)
unsigned char _pms_ecdh[MBEDTLS_ECP_MAX_BYTES]; /* RFC 4492 5.10 */
unsigned char _pms_ecdh[PSA_RAW_KEY_AGREEMENT_OUTPUT_MAX_SIZE]; /* RFC 4492 5.10 */
#endif
#if defined(MBEDTLS_KEY_EXCHANGE_PSK_ENABLED)
unsigned char _pms_psk[4 + 2 * MBEDTLS_PSK_MAX_LEN]; /* RFC 4279 2 */
#endif
#if defined(MBEDTLS_KEY_EXCHANGE_ECDHE_PSK_ENABLED)
unsigned char _pms_ecdhe_psk[4 + MBEDTLS_ECP_MAX_BYTES
unsigned char _pms_ecdhe_psk[4 + PSA_RAW_KEY_AGREEMENT_OUTPUT_MAX_SIZE
+ MBEDTLS_PSK_MAX_LEN]; /* RFC 5489 2 */
#endif
#if defined(MBEDTLS_KEY_EXCHANGE_ECJPAKE_ENABLED)