Hans Leidekker : secur32: Add support for setting DTLS MTU.
Alexandre Julliard
julliard at winehq.org
Wed Mar 10 14:58:47 CST 2021
Module: wine
Branch: master
Commit: a114ce67db2357740eb58fbda0102e582e79c11c
URL: https://source.winehq.org/git/wine.git/?a=commit;h=a114ce67db2357740eb58fbda0102e582e79c11c
Author: Hans Leidekker <hans at codeweavers.com>
Date: Wed Mar 10 15:50:27 2021 +0100
secur32: Add support for setting DTLS MTU.
Signed-off-by: Hans Leidekker <hans at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/secur32/schannel.c | 7 +++++++
dlls/secur32/schannel_gnutls.c | 20 ++++++++++++++++++++
dlls/secur32/schannel_macosx.c | 6 ++++++
dlls/secur32/secur32_priv.h | 1 +
4 files changed, 34 insertions(+)
diff --git a/dlls/secur32/schannel.c b/dlls/secur32/schannel.c
index 9a1dfd42152..e7673a7f814 100644
--- a/dlls/secur32/schannel.c
+++ b/dlls/secur32/schannel.c
@@ -879,6 +879,13 @@ static SECURITY_STATUS SEC_ENTRY schan_InitializeSecurityContextW(
schan_imp_set_application_protocols(ctx->session, buffer->pvBuffer, buffer->cbBuffer);
}
+ if (pInput && (idx = schan_find_sec_buffer_idx(pInput, 0, SECBUFFER_DTLS_MTU)) != -1)
+ {
+ buffer = &pInput->pBuffers[idx];
+ if (buffer->cbBuffer >= sizeof(WORD)) schan_imp_set_dtls_mtu(ctx->session, *(WORD *)buffer->pvBuffer);
+ else WARN("invalid buffer size %u\n", buffer->cbBuffer);
+ }
+
phNewContext->dwLower = handle;
phNewContext->dwUpper = 0;
}
diff --git a/dlls/secur32/schannel_gnutls.c b/dlls/secur32/schannel_gnutls.c
index fbf9277a39c..785430ddf58 100644
--- a/dlls/secur32/schannel_gnutls.c
+++ b/dlls/secur32/schannel_gnutls.c
@@ -53,6 +53,7 @@ static int (*pgnutls_cipher_get_block_size)(gnutls_cipher_algorithm_t);
/* Not present in gnutls version < 3.0. */
static void (*pgnutls_transport_set_pull_timeout_function)(gnutls_session_t,
int (*)(gnutls_transport_ptr_t, unsigned int));
+static void (*pgnutls_dtls_set_mtu)(gnutls_session_t, unsigned int);
/* Not present in gnutls version < 3.2.0. */
static int (*pgnutls_alpn_get_selected_protocol)(gnutls_session_t, gnutls_datum_t *);
@@ -186,6 +187,11 @@ static int compat_gnutls_alpn_set_protocols(gnutls_session_t session, const gnut
return GNUTLS_E_INVALID_REQUEST;
}
+static void compat_gnutls_dtls_set_mtu(gnutls_session_t session, unsigned int mtu)
+{
+ FIXME("\n");
+}
+
static ssize_t schan_pull_adapter(gnutls_transport_ptr_t transport,
void *buff, size_t buff_len)
{
@@ -767,6 +773,15 @@ SECURITY_STATUS schan_imp_get_application_protocol(schan_imp_session session,
return SEC_E_OK;
}
+SECURITY_STATUS schan_imp_set_dtls_mtu(schan_imp_session session, unsigned int mtu)
+{
+ gnutls_session_t s = (gnutls_session_t)session;
+
+ pgnutls_dtls_set_mtu(s, mtu);
+ TRACE("MTU set to %u\n", mtu);
+ return SEC_E_OK;
+}
+
static WCHAR *get_key_container_path(const CERT_CONTEXT *ctx)
{
static const WCHAR rsabaseW[] =
@@ -1130,6 +1145,11 @@ BOOL schan_imp_init(void)
WARN("gnutls_alpn_get_selected_protocol not found\n");
pgnutls_alpn_get_selected_protocol = compat_gnutls_alpn_get_selected_protocol;
}
+ if (!(pgnutls_dtls_set_mtu = dlsym(libgnutls_handle, "gnutls_dtls_set_mtu")))
+ {
+ WARN("gnutls_dtls_set_mtu not found\n");
+ pgnutls_dtls_set_mtu = compat_gnutls_dtls_set_mtu;
+ }
if (!(pgnutls_privkey_export_x509 = dlsym(libgnutls_handle, "gnutls_privkey_export_x509")))
{
WARN("gnutls_privkey_export_x509 not found\n");
diff --git a/dlls/secur32/schannel_macosx.c b/dlls/secur32/schannel_macosx.c
index 6e6296722cc..ab97615014d 100644
--- a/dlls/secur32/schannel_macosx.c
+++ b/dlls/secur32/schannel_macosx.c
@@ -1213,6 +1213,12 @@ SECURITY_STATUS schan_imp_get_application_protocol(schan_imp_session session,
return SEC_E_UNSUPPORTED_FUNCTION;
}
+SECURITY_STATUS schan_imp_set_dtls_mtu(schan_imp_session session, unsigned int mtu)
+{
+ FIXME("no support for setting dtls mtu on this platform\n");
+ return SEC_E_UNSUPPORTED_FUNCTION;
+}
+
BOOL schan_imp_init(void)
{
TRACE("()\n");
diff --git a/dlls/secur32/secur32_priv.h b/dlls/secur32/secur32_priv.h
index ce8d55d1eb6..ca0062056d6 100644
--- a/dlls/secur32/secur32_priv.h
+++ b/dlls/secur32/secur32_priv.h
@@ -253,5 +253,6 @@ extern void schan_imp_deinit(void) DECLSPEC_HIDDEN;
extern void schan_imp_set_application_protocols(schan_imp_session, unsigned char *, unsigned int) DECLSPEC_HIDDEN;
extern SECURITY_STATUS schan_imp_get_application_protocol(schan_imp_session,
SecPkgContext_ApplicationProtocol *) DECLSPEC_HIDDEN;
+extern SECURITY_STATUS schan_imp_set_dtls_mtu(schan_imp_session, unsigned int) DECLSPEC_HIDDEN;
#endif /* ndef __SECUR32_PRIV_H__ */
More information about the wine-cvs
mailing list