From 1d13b5d87c6b261179d689f37a706b0308bb9313 Mon Sep 17 00:00:00 2001 From: Steffen Jaeckel Date: Wed, 29 Jul 2026 09:08:41 +0200 Subject: [PATCH] Check whether the TLS stack supports channel binding. Add a runtime check per TLS stack which returns whether channel binding is supported or not. This fixes #270 Signed-off-by: Steffen Jaeckel --- src/auth.c | 6 ++++-- src/tls.h | 1 + src/tls_dummy.c | 6 ++++++ src/tls_gnutls.c | 14 ++++++++++++++ src/tls_openssl.c | 16 ++++++++++++++++ src/tls_schannel.c | 6 ++++++ 6 files changed, 47 insertions(+), 2 deletions(-) diff --git a/src/auth.c b/src/auth.c index a1bc3b5..c0fbb5d 100644 --- a/src/auth.c +++ b/src/auth.c @@ -602,8 +602,10 @@ static int _make_scram_init_msg(struct scram_user_data *scram) l = strophe_snprintf(message, message_len, "p=%s,,n=%s,r=%s", binding_type, node, buf); } else { - l = strophe_snprintf(message, message_len, "%c,,n=%s,r=%s", - is_secured ? 'y' : 'n', node, buf); + l = strophe_snprintf( + message, message_len, "%c,,n=%s,r=%s", + is_secured && tls_supports_channel_binding(conn->tls) ? 'y' : 'n', + node, buf); } if (l < 0 || (size_t)l >= message_len) { goto err_msg; diff --git a/src/tls.h b/src/tls.h index 79f1e54..ea15b90 100644 --- a/src/tls.h +++ b/src/tls.h @@ -45,6 +45,7 @@ unsigned int tls_id_on_xmppaddr_num(xmpp_conn_t *conn); xmpp_tlscert_t *tls_peer_cert(xmpp_conn_t *conn); int tls_set_credentials(tls_t *tls, const char *cafilename); +int tls_supports_channel_binding(tls_t *tls); int tls_init_channel_binding(tls_t *tls, const char **binding_prefix, size_t *binding_prefix_len); diff --git a/src/tls_dummy.c b/src/tls_dummy.c index bb5e36d..418f9f9 100644 --- a/src/tls_dummy.c +++ b/src/tls_dummy.c @@ -75,6 +75,12 @@ int tls_set_credentials(tls_t *tls, const char *cafilename) return -1; } +int tls_supports_channel_binding(tls_t *tls) +{ + UNUSED(tls); + return 0; +} + int tls_init_channel_binding(tls_t *tls, const char **binding_prefix, size_t *binding_prefix_len) diff --git a/src/tls_gnutls.c b/src/tls_gnutls.c index 0aa7c28..9adff5f 100644 --- a/src/tls_gnutls.c +++ b/src/tls_gnutls.c @@ -577,6 +577,20 @@ int tls_set_credentials(tls_t *tls, const char *cafilename) return err == GNUTLS_E_SUCCESS; } +int tls_supports_channel_binding(tls_t *tls) +{ + switch (gnutls_protocol_get_version(tls->session)) { + case GNUTLS_SSL3: + case GNUTLS_TLS1_0: + case GNUTLS_TLS1_1: + case GNUTLS_TLS1_2: + case GNUTLS_TLS1_3: + return 1; + default: + return 0; + } +} + int tls_init_channel_binding(tls_t *tls, const char **binding_prefix, size_t *binding_prefix_len) diff --git a/src/tls_openssl.c b/src/tls_openssl.c index 67d2c8a..e23b4cc 100644 --- a/src/tls_openssl.c +++ b/src/tls_openssl.c @@ -793,6 +793,22 @@ int tls_set_credentials(tls_t *tls, const char *cafilename) return -1; } +int tls_supports_channel_binding(tls_t *tls) +{ + switch (SSL_version(tls->ssl)) { + case SSL3_VERSION: + case TLS1_VERSION: + case TLS1_1_VERSION: + case TLS1_2_VERSION: +#ifdef TLS1_3_VERSION + case TLS1_3_VERSION: +#endif + return 1; + default: + return 0; + } +} + int tls_init_channel_binding(tls_t *tls, const char **binding_prefix, size_t *binding_prefix_len) diff --git a/src/tls_schannel.c b/src/tls_schannel.c index f139085..67cc404 100644 --- a/src/tls_schannel.c +++ b/src/tls_schannel.c @@ -237,6 +237,12 @@ int tls_set_credentials(tls_t *tls, const char *cafilename) return -1; } +int tls_supports_channel_binding(tls_t *tls) +{ + UNUSED(tls); + return 0; +} + int tls_init_channel_binding(tls_t *tls, const char **binding_prefix, size_t *binding_prefix_len)