summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFrantisek Krenzelok <krenzelok.frantisek@gmail.com>2022-10-31 12:17:43 +0100
committerFrantisek Krenzelok <krenzelok.frantisek@gmail.com>2022-11-30 11:22:07 +0100
commit7eee718718ca72edb778d35eba52949b197dd9ad (patch)
tree07a4e04c03848a3936381df86fe1dcbf22158a4e
parentd4c1e95e2ad73a2db005a5a75b953d2120c3172b (diff)
downloadgnutls-fix/ktls_fallback.tar.gz
KTLS: Invalidate session on ktls errorfix/ktls_fallback
We invalidate the session if an KTLS related error occurs after it was initialized i.e. keys were set on the interfaces. As of now this only affects key_update() which should be fixed via a kernel patch. Thus future fallback mechanism implementation is not likely as that would require yet another kernel patch. Signed-off-by: Frantisek Krenzelok <krenzelok.frantisek@gmail.com>
-rw-r--r--lib/handshake.c1
-rw-r--r--lib/tls13/key_update.c17
2 files changed, 12 insertions, 6 deletions
diff --git a/lib/handshake.c b/lib/handshake.c
index 14bcdea56a..044b70e2a8 100644
--- a/lib/handshake.c
+++ b/lib/handshake.c
@@ -2926,6 +2926,7 @@ int gnutls_handshake(gnutls_session_t session)
if (IS_KTLS_ENABLED(session, GNUTLS_KTLS_DUPLEX)) {
ret = _gnutls_ktls_set_keys(session, GNUTLS_KTLS_DUPLEX);
if (ret < 0) {
+ /* no need to invalidate the session as keys were not set */
session->internals.ktls_enabled = 0;
_gnutls_audit_log(session,
"disabling KTLS: failed to set keys\n");
diff --git a/lib/tls13/key_update.c b/lib/tls13/key_update.c
index acfda41290..e366093887 100644
--- a/lib/tls13/key_update.c
+++ b/lib/tls13/key_update.c
@@ -38,13 +38,15 @@
* because KTLS most likely doesn't support key update.
*/
#define SET_KTLS_KEYS(session, interface)\
-{\
- if(_gnutls_ktls_set_keys(session, interface) < 0) {\
+if(_gnutls_ktls_set_keys(session, interface) < 0) {\
session->internals.ktls_enabled = 0;\
- _gnutls_audit_log(session, \
- "disabling KTLS: couldn't update keys\n");\
- }\
-}
+ session->internals.invalid_connection = true;\
+ _gnutls_audit_log(session,\
+ "disabling KTLS: couldn't update keys\n");\
+ _gnutls_audit_log(session,\
+ "invalidating session: No ktls fallback mechanism\n");\
+ ret = GNUTLS_E_INTERNAL_ERROR;\
+}\
static int update_keys(gnutls_session_t session, hs_stage_t stage)
{
@@ -64,6 +66,9 @@ static int update_keys(gnutls_session_t session, hs_stage_t stage)
* write keys */
if (session->internals.recv_state == RECV_STATE_EARLY_START) {
ret = _tls13_write_connection_state_init(session, stage);
+ if (ret < 0)
+ return gnutls_assert_val(ret);
+
if (IS_KTLS_ENABLED(session, GNUTLS_KTLS_SEND))
SET_KTLS_KEYS(session, GNUTLS_KTLS_SEND)
} else {