From d58985461192866894f9e15be41928682bdd7104 Mon Sep 17 00:00:00 2001 From: Nico Geyso Date: Tue, 18 Nov 2025 10:33:36 +0100 Subject: [PATCH 01/11] mbedtls_ssl_get_alert(): getter for fatal alerts Even though the TLS RFCs do not mandate libraries to expose *Error Alerts* (as defined in RFC8446 6.2 for TLS 1.3 and in RFC5246 7.2.2 for TLS 1.2) to the user, there are use cases when it is handy to get the actual last received fatal error instead of a generic one. For instance this enables the user to differ between received fatal errors in case `mbedtls_ssl_handshake()`, `mbedtls_ssl_handshake_step()` or `mbedtls_ssl_read()` returned `MBEDTLS_ERR_SSL_FATAL_ALERT_MESSAGE`. This changesets stores the last incoming fatal alert in `mbedtls_ssl_context` and provides `mbedtls_ssl_get_alert()` as a getter for retrieving it. Another option would be to provide a callback mechanisms for all kinds of alerts (not only fatals) but for simplicity I discarded this option. Signed-off-by: Nico Geyso --- ChangeLog.d/alert-getter.txt | 6 ++++ include/mbedtls/ssl.h | 23 +++++++++++++++ library/ssl_msg.c | 10 +++++++ library/ssl_tls.c | 2 ++ tests/suites/test_suite_ssl.data | 3 ++ tests/suites/test_suite_ssl.function | 42 ++++++++++++++++++++++++++++ 6 files changed, 86 insertions(+) create mode 100644 ChangeLog.d/alert-getter.txt diff --git a/ChangeLog.d/alert-getter.txt b/ChangeLog.d/alert-getter.txt new file mode 100644 index 0000000000..2b6afd225d --- /dev/null +++ b/ChangeLog.d/alert-getter.txt @@ -0,0 +1,6 @@ +Features + * Add the function mbedtls_ssl_get_alert() which returns the + last received fatal error alert type for a more generic + MBEDTLS_ERR_SSL_FATAL_ALERT_MESSAGE return value from + mbedtls_ssl_handshake(), mbedtls_ssl_handshake_step() or + mbedtls_ssl_read(). diff --git a/include/mbedtls/ssl.h b/include/mbedtls/ssl.h index 6c86c57345..33d9fcf844 100644 --- a/include/mbedtls/ssl.h +++ b/include/mbedtls/ssl.h @@ -1715,6 +1715,13 @@ struct mbedtls_ssl_context { int MBEDTLS_PRIVATE(keep_current_message); /*!< drop or reuse current message on next call to record layer? */ + unsigned char MBEDTLS_PRIVATE(in_alert_recv); /*!< Determines if a fatal alert has + been received. Values: + - \c 0 , no fatal alert received. + - \c 1 , a fatal alert has been received */ + unsigned char MBEDTLS_PRIVATE(in_alert_type); /*!< Type of fatal alert if in_alert_recv + != 0 */ + /* The following three variables indicate if and, if yes, * what kind of alert is pending to be sent. */ @@ -4911,6 +4918,22 @@ int mbedtls_ssl_write(mbedtls_ssl_context *ssl, const unsigned char *buf, size_t int mbedtls_ssl_send_alert_message(mbedtls_ssl_context *ssl, unsigned char level, unsigned char message); + +/** + * \brief Get the received fatal alert + * + * \param ssl SSL context + * + * \return The alert description type (MBEDTLS_SSL_ALERT_MSG_*) if a fatal + * alert has been received or MBEDTLS_ERR_SSL_BAD_INPUT_DATA + * + * \note This function can be used in case mbedtls_ssl_handshake(), + * mbedtls_ssl_handshake_step() or mbedtls_ssl_read() returned + * MBEDTLS_ERR_SSL_FATAL_ALERT_MESSAGE to get the actual alert + * description type. + */ +int mbedtls_ssl_get_alert(mbedtls_ssl_context *ssl); + /** * \brief Notify the peer that the connection is being closed * diff --git a/library/ssl_msg.c b/library/ssl_msg.c index d4b915aa74..70b69436c4 100644 --- a/library/ssl_msg.c +++ b/library/ssl_msg.c @@ -4931,6 +4931,8 @@ int mbedtls_ssl_handle_message_type(mbedtls_ssl_context *ssl) if (ssl->in_msg[0] == MBEDTLS_SSL_ALERT_LEVEL_FATAL) { MBEDTLS_SSL_DEBUG_MSG(1, ("is a fatal alert message (msg %d)", ssl->in_msg[1])); + ssl->in_alert_recv = 1; + ssl->in_alert_type = ssl->in_msg[1]; return MBEDTLS_ERR_SSL_FATAL_ALERT_MESSAGE; } @@ -5015,6 +5017,14 @@ int mbedtls_ssl_send_alert_message(mbedtls_ssl_context *ssl, return 0; } +int mbedtls_ssl_get_alert(mbedtls_ssl_context *ssl) +{ + if (ssl == NULL || ssl->in_alert_recv != 1) { + return MBEDTLS_ERR_SSL_BAD_INPUT_DATA; + } + return ssl->in_alert_type; +} + int mbedtls_ssl_write_change_cipher_spec(mbedtls_ssl_context *ssl) { int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; diff --git a/library/ssl_tls.c b/library/ssl_tls.c index be071defac..f19f249cb0 100644 --- a/library/ssl_tls.c +++ b/library/ssl_tls.c @@ -1296,6 +1296,8 @@ void mbedtls_ssl_session_reset_msg_layer(mbedtls_ssl_context *ssl, memset(ssl->in_buf, 0, in_buf_len); } + ssl->in_alert_recv = 0; + ssl->send_alert = 0; /* Reset outgoing message writing */ diff --git a/tests/suites/test_suite_ssl.data b/tests/suites/test_suite_ssl.data index fa61b0f435..b05de38509 100644 --- a/tests/suites/test_suite_ssl.data +++ b/tests/suites/test_suite_ssl.data @@ -3364,3 +3364,6 @@ ssl_tls_exporter_rejects_bad_parameters:MBEDTLS_SSL_VERSION_TLS1_3:24:250:10 TLS 1.3 Keying Material Exporter: Handshake not done depends_on:MBEDTLS_SSL_PROTO_TLS1_3:MBEDTLS_TEST_AT_LEAST_ONE_TLS1_3_CIPHERSUITE:MBEDTLS_SSL_TLS1_3_KEY_EXCHANGE_MODE_EPHEMERAL_ENABLED:PSA_WANT_ALG_RSA_PKCS1V15_SIGN:MBEDTLS_X509_RSASSA_PSS_SUPPORT ssl_tls_exporter_too_early:MBEDTLS_SSL_VERSION_TLS1_3:1:MBEDTLS_SSL_SERVER_CERTIFICATE + +TLS fatal alert getter +ssl_get_alert_after_fatal diff --git a/tests/suites/test_suite_ssl.function b/tests/suites/test_suite_ssl.function index 5b6500898e..f3f3c1976a 100644 --- a/tests/suites/test_suite_ssl.function +++ b/tests/suites/test_suite_ssl.function @@ -5936,3 +5936,45 @@ exit: MD_OR_USE_PSA_DONE(); } /* END_CASE */ + +/* BEGIN_CASE depends_on:MBEDTLS_SSL_HANDSHAKE_WITH_CERT_ENABLED */ +void ssl_get_alert_after_fatal(void) +{ + mbedtls_ssl_context ssl; + mbedtls_ssl_config conf; + + /* prepapre ssl context to test on*/ + mbedtls_ssl_init(&ssl); + mbedtls_ssl_config_init(&conf); + TEST_EQUAL(mbedtls_ssl_config_defaults(&conf, + MBEDTLS_SSL_IS_CLIENT, + MBEDTLS_SSL_TRANSPORT_STREAM, + MBEDTLS_SSL_PRESET_DEFAULT), 0); + + mbedtls_ssl_conf_rng(&conf, mbedtls_test_random, NULL); + MD_OR_USE_PSA_INIT(); + TEST_ASSERT(mbedtls_ssl_setup(&ssl, &conf) == 0); + + /* No alert has been received yet */ + TEST_ASSERT(mbedtls_ssl_get_alert(&ssl) == MBEDTLS_ERR_SSL_BAD_INPUT_DATA); + + // prepare input message buffer with fatal alert + ssl.in_msglen = 2; + ssl.in_msgtype = MBEDTLS_SSL_MSG_ALERT; + ssl.in_msg[0] = MBEDTLS_SSL_ALERT_LEVEL_FATAL; + ssl.in_msg[1] = MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE; + + /* import prepared fatal alert and test getter */ + TEST_ASSERT(mbedtls_ssl_handle_message_type(&ssl) == MBEDTLS_ERR_SSL_FATAL_ALERT_MESSAGE ); + TEST_ASSERT(mbedtls_ssl_get_alert(&ssl) == MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE); + + /* Reset the session and check that no alert is present*/ + mbedtls_ssl_session_reset_msg_layer( &ssl, 0 ); + TEST_ASSERT(mbedtls_ssl_get_alert(&ssl) == MBEDTLS_ERR_SSL_BAD_INPUT_DATA); + +exit: + mbedtls_ssl_free(&ssl); + mbedtls_ssl_config_free(&conf); + USE_PSA_DONE(); +} +/* END_CASE */ From 0841ceadf7fbd2639cc05a036607a7fb5e858d27 Mon Sep 17 00:00:00 2001 From: Nico Geyso Date: Wed, 19 Nov 2025 18:17:46 +0100 Subject: [PATCH 02/11] test ssl_get_alert_after_fatal - remove mbedtls_ssl_conf_rng Signed-off-by: Nico Geyso --- tests/suites/test_suite_ssl.function | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/suites/test_suite_ssl.function b/tests/suites/test_suite_ssl.function index f3f3c1976a..1a0d091b28 100644 --- a/tests/suites/test_suite_ssl.function +++ b/tests/suites/test_suite_ssl.function @@ -5946,13 +5946,13 @@ void ssl_get_alert_after_fatal(void) /* prepapre ssl context to test on*/ mbedtls_ssl_init(&ssl); mbedtls_ssl_config_init(&conf); + MD_OR_USE_PSA_INIT(); + TEST_EQUAL(mbedtls_ssl_config_defaults(&conf, MBEDTLS_SSL_IS_CLIENT, MBEDTLS_SSL_TRANSPORT_STREAM, MBEDTLS_SSL_PRESET_DEFAULT), 0); - mbedtls_ssl_conf_rng(&conf, mbedtls_test_random, NULL); - MD_OR_USE_PSA_INIT(); TEST_ASSERT(mbedtls_ssl_setup(&ssl, &conf) == 0); /* No alert has been received yet */ From f9a734f2b7de9a8e2fd39e76191a7d7a49262131 Mon Sep 17 00:00:00 2001 From: Nico Geyso Date: Wed, 19 Nov 2025 19:10:11 +0100 Subject: [PATCH 03/11] Fix C code style issues Signed-off-by: Nico Geyso --- include/mbedtls/ssl.h | 4 ++-- tests/suites/test_suite_ssl.function | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/include/mbedtls/ssl.h b/include/mbedtls/ssl.h index 33d9fcf844..2eb8d85dc9 100644 --- a/include/mbedtls/ssl.h +++ b/include/mbedtls/ssl.h @@ -1717,8 +1717,8 @@ struct mbedtls_ssl_context { unsigned char MBEDTLS_PRIVATE(in_alert_recv); /*!< Determines if a fatal alert has been received. Values: - - \c 0 , no fatal alert received. - - \c 1 , a fatal alert has been received */ + - \c 0 , no fatal alert received. + - \c 1 , a fatal alert has been received */ unsigned char MBEDTLS_PRIVATE(in_alert_type); /*!< Type of fatal alert if in_alert_recv != 0 */ diff --git a/tests/suites/test_suite_ssl.function b/tests/suites/test_suite_ssl.function index 1a0d091b28..d4eeb760f8 100644 --- a/tests/suites/test_suite_ssl.function +++ b/tests/suites/test_suite_ssl.function @@ -5965,11 +5965,11 @@ void ssl_get_alert_after_fatal(void) ssl.in_msg[1] = MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE; /* import prepared fatal alert and test getter */ - TEST_ASSERT(mbedtls_ssl_handle_message_type(&ssl) == MBEDTLS_ERR_SSL_FATAL_ALERT_MESSAGE ); + TEST_ASSERT(mbedtls_ssl_handle_message_type(&ssl) == MBEDTLS_ERR_SSL_FATAL_ALERT_MESSAGE); TEST_ASSERT(mbedtls_ssl_get_alert(&ssl) == MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE); /* Reset the session and check that no alert is present*/ - mbedtls_ssl_session_reset_msg_layer( &ssl, 0 ); + mbedtls_ssl_session_reset_msg_layer( &ssl, 0); TEST_ASSERT(mbedtls_ssl_get_alert(&ssl) == MBEDTLS_ERR_SSL_BAD_INPUT_DATA); exit: From 13200ab116bb98669a43ccba2b98df0f29c5a28b Mon Sep 17 00:00:00 2001 From: Nico Geyso Date: Wed, 19 Nov 2025 23:09:11 +0100 Subject: [PATCH 04/11] Fix more C code style issues Signed-off-by: Nico Geyso --- include/mbedtls/ssl.h | 4 ++-- tests/suites/test_suite_ssl.function | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/include/mbedtls/ssl.h b/include/mbedtls/ssl.h index 2eb8d85dc9..655143c106 100644 --- a/include/mbedtls/ssl.h +++ b/include/mbedtls/ssl.h @@ -1716,11 +1716,11 @@ struct mbedtls_ssl_context { on next call to record layer? */ unsigned char MBEDTLS_PRIVATE(in_alert_recv); /*!< Determines if a fatal alert has - been received. Values: + been received. Values: - \c 0 , no fatal alert received. - \c 1 , a fatal alert has been received */ unsigned char MBEDTLS_PRIVATE(in_alert_type); /*!< Type of fatal alert if in_alert_recv - != 0 */ + != 0 */ /* The following three variables indicate if and, if yes, * what kind of alert is pending to be sent. diff --git a/tests/suites/test_suite_ssl.function b/tests/suites/test_suite_ssl.function index d4eeb760f8..d4ff7fea57 100644 --- a/tests/suites/test_suite_ssl.function +++ b/tests/suites/test_suite_ssl.function @@ -5969,7 +5969,7 @@ void ssl_get_alert_after_fatal(void) TEST_ASSERT(mbedtls_ssl_get_alert(&ssl) == MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE); /* Reset the session and check that no alert is present*/ - mbedtls_ssl_session_reset_msg_layer( &ssl, 0); + mbedtls_ssl_session_reset_msg_layer(&ssl, 0); TEST_ASSERT(mbedtls_ssl_get_alert(&ssl) == MBEDTLS_ERR_SSL_BAD_INPUT_DATA); exit: From 33bd8f8f7f56aed78605863f481a6b0034d8cad9 Mon Sep 17 00:00:00 2001 From: Nico Geyso Date: Wed, 10 Dec 2025 19:41:03 +0100 Subject: [PATCH 05/11] ssl - reset alert type for session reset reset indicator (in_alert_recv) and type (in_alert_type) in mbedtls_ssl_session_reset_msg_layer Signed-off-by: Nico Geyso --- library/ssl_tls.c | 1 + 1 file changed, 1 insertion(+) diff --git a/library/ssl_tls.c b/library/ssl_tls.c index f19f249cb0..23ec7b40c7 100644 --- a/library/ssl_tls.c +++ b/library/ssl_tls.c @@ -1297,6 +1297,7 @@ void mbedtls_ssl_session_reset_msg_layer(mbedtls_ssl_context *ssl, } ssl->in_alert_recv = 0; + ssl->in_alert_type = 0; ssl->send_alert = 0; From 6140cfb438fedc88a791f176b7d17b28a6db5e65 Mon Sep 17 00:00:00 2001 From: Nico Geyso Date: Wed, 10 Dec 2025 23:01:49 +0100 Subject: [PATCH 06/11] tests/ssl_get_alert_after_fatal - add invalid param case Signed-off-by: Nico Geyso --- tests/suites/test_suite_ssl.function | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tests/suites/test_suite_ssl.function b/tests/suites/test_suite_ssl.function index d4ff7fea57..79881b9834 100644 --- a/tests/suites/test_suite_ssl.function +++ b/tests/suites/test_suite_ssl.function @@ -5955,6 +5955,9 @@ void ssl_get_alert_after_fatal(void) TEST_ASSERT(mbedtls_ssl_setup(&ssl, &conf) == 0); + /* Invalid ssl context */ + TEST_ASSERT(mbedtls_ssl_get_alert(NULL) == MBEDTLS_ERR_SSL_BAD_INPUT_DATA); + /* No alert has been received yet */ TEST_ASSERT(mbedtls_ssl_get_alert(&ssl) == MBEDTLS_ERR_SSL_BAD_INPUT_DATA); From 15c68993cbdf4eda6bd58191c0fbf56326fb3952 Mon Sep 17 00:00:00 2001 From: ng-gsmk Date: Mon, 26 Jan 2026 13:07:26 +0100 Subject: [PATCH 07/11] Apply suggestions from code review Co-authored-by: Ronald Cron Signed-off-by: ng-gsmk --- include/mbedtls/ssl.h | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/include/mbedtls/ssl.h b/include/mbedtls/ssl.h index 655143c106..e5f1b64285 100644 --- a/include/mbedtls/ssl.h +++ b/include/mbedtls/ssl.h @@ -1715,11 +1715,11 @@ struct mbedtls_ssl_context { int MBEDTLS_PRIVATE(keep_current_message); /*!< drop or reuse current message on next call to record layer? */ - unsigned char MBEDTLS_PRIVATE(in_alert_recv); /*!< Determines if a fatal alert has + unsigned char MBEDTLS_PRIVATE(in_fatal_alert_recv); /*!< Determines if a fatal alert has been received. Values: - \c 0 , no fatal alert received. - \c 1 , a fatal alert has been received */ - unsigned char MBEDTLS_PRIVATE(in_alert_type); /*!< Type of fatal alert if in_alert_recv + unsigned char MBEDTLS_PRIVATE(in_fatal_alert_type); /*!< Type of fatal alert if in_alert_recv != 0 */ /* The following three variables indicate if and, if yes, @@ -4920,19 +4920,19 @@ int mbedtls_ssl_send_alert_message(mbedtls_ssl_context *ssl, unsigned char message); /** - * \brief Get the received fatal alert + * \brief Get the last received fatal alert * * \param ssl SSL context * * \return The alert description type (MBEDTLS_SSL_ALERT_MSG_*) if a fatal - * alert has been received or MBEDTLS_ERR_SSL_BAD_INPUT_DATA + * alert has been received, MBEDTLS_ERR_SSL_BAD_INPUT_DATA otherwise. * * \note This function can be used in case mbedtls_ssl_handshake(), * mbedtls_ssl_handshake_step() or mbedtls_ssl_read() returned * MBEDTLS_ERR_SSL_FATAL_ALERT_MESSAGE to get the actual alert * description type. */ -int mbedtls_ssl_get_alert(mbedtls_ssl_context *ssl); +int mbedtls_ssl_get_fatal_alert(const mbedtls_ssl_context *ssl); /** * \brief Notify the peer that the connection is being closed From 4f83ebedd1a19119a4ea1f776092e51eb25675b6 Mon Sep 17 00:00:00 2001 From: Nico Geyso Date: Mon, 26 Jan 2026 13:15:07 +0100 Subject: [PATCH 08/11] Fix outstanding code review issues - adjust function name to mbedtls_ssl_get_fatal_alert - fix missing property name changes for mbedtls_ssl_context Signed-off-by: Nico Geyso --- library/ssl_msg.c | 10 +++++----- library/ssl_tls.c | 4 ++-- tests/suites/test_suite_ssl.function | 8 ++++---- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/library/ssl_msg.c b/library/ssl_msg.c index 70b69436c4..87598366d7 100644 --- a/library/ssl_msg.c +++ b/library/ssl_msg.c @@ -4931,8 +4931,8 @@ int mbedtls_ssl_handle_message_type(mbedtls_ssl_context *ssl) if (ssl->in_msg[0] == MBEDTLS_SSL_ALERT_LEVEL_FATAL) { MBEDTLS_SSL_DEBUG_MSG(1, ("is a fatal alert message (msg %d)", ssl->in_msg[1])); - ssl->in_alert_recv = 1; - ssl->in_alert_type = ssl->in_msg[1]; + ssl->in_fatal_alert_recv = 1; + ssl->in_fatal_alert_type = ssl->in_msg[1]; return MBEDTLS_ERR_SSL_FATAL_ALERT_MESSAGE; } @@ -5017,12 +5017,12 @@ int mbedtls_ssl_send_alert_message(mbedtls_ssl_context *ssl, return 0; } -int mbedtls_ssl_get_alert(mbedtls_ssl_context *ssl) +int mbedtls_ssl_get_fatal_alert(const mbedtls_ssl_context *ssl) { - if (ssl == NULL || ssl->in_alert_recv != 1) { + if (ssl == NULL || ssl->in_fatal_alert_recv != 1) { return MBEDTLS_ERR_SSL_BAD_INPUT_DATA; } - return ssl->in_alert_type; + return ssl->in_fatal_alert_type; } int mbedtls_ssl_write_change_cipher_spec(mbedtls_ssl_context *ssl) diff --git a/library/ssl_tls.c b/library/ssl_tls.c index 23ec7b40c7..102de743b2 100644 --- a/library/ssl_tls.c +++ b/library/ssl_tls.c @@ -1296,8 +1296,8 @@ void mbedtls_ssl_session_reset_msg_layer(mbedtls_ssl_context *ssl, memset(ssl->in_buf, 0, in_buf_len); } - ssl->in_alert_recv = 0; - ssl->in_alert_type = 0; + ssl->in_fatal_alert_recv = 0; + ssl->in_fatal_alert_type = 0; ssl->send_alert = 0; diff --git a/tests/suites/test_suite_ssl.function b/tests/suites/test_suite_ssl.function index 79881b9834..628a183853 100644 --- a/tests/suites/test_suite_ssl.function +++ b/tests/suites/test_suite_ssl.function @@ -5956,10 +5956,10 @@ void ssl_get_alert_after_fatal(void) TEST_ASSERT(mbedtls_ssl_setup(&ssl, &conf) == 0); /* Invalid ssl context */ - TEST_ASSERT(mbedtls_ssl_get_alert(NULL) == MBEDTLS_ERR_SSL_BAD_INPUT_DATA); + TEST_ASSERT(mbedtls_ssl_get_fatal_alert(NULL) == MBEDTLS_ERR_SSL_BAD_INPUT_DATA); /* No alert has been received yet */ - TEST_ASSERT(mbedtls_ssl_get_alert(&ssl) == MBEDTLS_ERR_SSL_BAD_INPUT_DATA); + TEST_ASSERT(mbedtls_ssl_get_fatal_alert(&ssl) == MBEDTLS_ERR_SSL_BAD_INPUT_DATA); // prepare input message buffer with fatal alert ssl.in_msglen = 2; @@ -5969,11 +5969,11 @@ void ssl_get_alert_after_fatal(void) /* import prepared fatal alert and test getter */ TEST_ASSERT(mbedtls_ssl_handle_message_type(&ssl) == MBEDTLS_ERR_SSL_FATAL_ALERT_MESSAGE); - TEST_ASSERT(mbedtls_ssl_get_alert(&ssl) == MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE); + TEST_ASSERT(mbedtls_ssl_get_fatal_alert(&ssl) == MBEDTLS_SSL_ALERT_MSG_HANDSHAKE_FAILURE); /* Reset the session and check that no alert is present*/ mbedtls_ssl_session_reset_msg_layer(&ssl, 0); - TEST_ASSERT(mbedtls_ssl_get_alert(&ssl) == MBEDTLS_ERR_SSL_BAD_INPUT_DATA); + TEST_ASSERT(mbedtls_ssl_get_fatal_alert(&ssl) == MBEDTLS_ERR_SSL_BAD_INPUT_DATA); exit: mbedtls_ssl_free(&ssl); From 6afd8367b953a9a42290c5b3014ebe09c1335c24 Mon Sep 17 00:00:00 2001 From: Nico Geyso Date: Mon, 26 Jan 2026 13:22:40 +0100 Subject: [PATCH 09/11] remove whitespace in mbedtls_ssl_session_msg_layer to comply with coding style, remove blank new line for alert reset Signed-off-by: Nico Geyso --- library/ssl_tls.c | 1 - 1 file changed, 1 deletion(-) diff --git a/library/ssl_tls.c b/library/ssl_tls.c index 102de743b2..bc65b0e1d7 100644 --- a/library/ssl_tls.c +++ b/library/ssl_tls.c @@ -1298,7 +1298,6 @@ void mbedtls_ssl_session_reset_msg_layer(mbedtls_ssl_context *ssl, ssl->in_fatal_alert_recv = 0; ssl->in_fatal_alert_type = 0; - ssl->send_alert = 0; /* Reset outgoing message writing */ From 8a3bcb143495760326e4a0b6c3c36349b01b1eca Mon Sep 17 00:00:00 2001 From: Nico Geyso Date: Mon, 26 Jan 2026 14:39:17 +0100 Subject: [PATCH 10/11] Fix coding style conventions for mbedtls_ssl_context Signed-off-by: Nico Geyso --- include/mbedtls/ssl.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/include/mbedtls/ssl.h b/include/mbedtls/ssl.h index e5f1b64285..ef8c5d3583 100644 --- a/include/mbedtls/ssl.h +++ b/include/mbedtls/ssl.h @@ -1716,11 +1716,11 @@ struct mbedtls_ssl_context { on next call to record layer? */ unsigned char MBEDTLS_PRIVATE(in_fatal_alert_recv); /*!< Determines if a fatal alert has - been received. Values: - - \c 0 , no fatal alert received. - - \c 1 , a fatal alert has been received */ + been received. Values: + - \c 0 , no fatal alert received. + - \c 1 , a fatal alert has been received */ unsigned char MBEDTLS_PRIVATE(in_fatal_alert_type); /*!< Type of fatal alert if in_alert_recv - != 0 */ + != 0 */ /* The following three variables indicate if and, if yes, * what kind of alert is pending to be sent. From cc53b069d91bd41e63bf21396e847284be2e43dc Mon Sep 17 00:00:00 2001 From: Nico Geyso Date: Tue, 27 Jan 2026 10:48:31 +0100 Subject: [PATCH 11/11] Improve changelog for alert getter Integrate suggestions by @ronald-cron-arm for changelog for alert getter. Signed-off-by: Nico Geyso --- ChangeLog.d/alert-getter.txt | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/ChangeLog.d/alert-getter.txt b/ChangeLog.d/alert-getter.txt index 2b6afd225d..da90cf31d7 100644 --- a/ChangeLog.d/alert-getter.txt +++ b/ChangeLog.d/alert-getter.txt @@ -1,6 +1,6 @@ Features - * Add the function mbedtls_ssl_get_alert() which returns the - last received fatal error alert type for a more generic - MBEDTLS_ERR_SSL_FATAL_ALERT_MESSAGE return value from - mbedtls_ssl_handshake(), mbedtls_ssl_handshake_step() or - mbedtls_ssl_read(). + * Add the function mbedtls_ssl_get_fatal_alert(), which returns the type of + the last received fatal alert. This allows callers to retrieve more + detailed information when mbedtls_ssl_handshake(), + mbedtls_ssl_handshake_step(), or mbedtls_ssl_read() returns the generic + MBEDTLS_ERR_SSL_FATAL_ALERT_MESSAGE error code.