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)