From 96a2d5a124c4bdbd1d66b978d03aad315e728fde Mon Sep 17 00:00:00 2001 From: Davide Beatrici Date: Fri, 17 Jul 2020 01:59:22 +0200 Subject: [PATCH] src/Cedar: pass client hostname and cipher to Init() function in PROTO_IMPL The SSTP implementation must be aware of the cipher in order to be able to report it to the server's internals (i.e. IPC). --- src/Cedar/Proto.c | 4 ++-- src/Cedar/Proto.h | 2 +- src/Cedar/Proto_OpenVPN.c | 4 +++- src/Cedar/Proto_OpenVPN.h | 2 +- 4 files changed, 7 insertions(+), 5 deletions(-) diff --git a/src/Cedar/Proto.c b/src/Cedar/Proto.c index 596e14a4..865bf19b 100644 --- a/src/Cedar/Proto.c +++ b/src/Cedar/Proto.c @@ -220,7 +220,7 @@ PROTO_SESSION *ProtoNewSession(PROTO *proto, PROTO_IMPL *impl, const IP *src_ip, session->SockEvent = NewSockEvent(); session->InterruptManager = NewInterruptManager(); - if (impl->Init != NULL && impl->Init(&session->Param, proto->Cedar, session->InterruptManager, session->SockEvent) == false) + if (impl->Init != NULL && impl->Init(&session->Param, proto->Cedar, session->InterruptManager, session->SockEvent, NULL, NULL) == false) { Debug("ProtoNewSession(): failed to initialize %s\n", impl->Name()); @@ -357,7 +357,7 @@ bool ProtoHandleConnection(PROTO *proto, SOCK *sock, const char *protocol) im = NewInterruptManager(); se = NewSockEvent(); - if (impl->Init != NULL && impl->Init(&impl_data, proto->Cedar, im, se) == false) + if (impl->Init != NULL && impl->Init(&impl_data, proto->Cedar, im, se, sock->CipherName, sock->RemoteHostname) == false) { Debug("ProtoHandleConnection(): failed to initialize %s\n", impl->Name()); FreeInterruptManager(im); diff --git a/src/Cedar/Proto.h b/src/Cedar/Proto.h index 35477b58..d932f5ea 100644 --- a/src/Cedar/Proto.h +++ b/src/Cedar/Proto.h @@ -24,7 +24,7 @@ typedef struct PROTO typedef struct PROTO_IMPL { - bool (*Init)(void **param, CEDAR *cedar, INTERRUPT_MANAGER *im, SOCK_EVENT *se); + bool (*Init)(void **param, CEDAR *cedar, INTERRUPT_MANAGER *im, SOCK_EVENT *se, const char *cipher, const char *hostname); void (*Free)(void *param); char *(*Name)(); bool (*IsPacketForMe)(const PROTO_MODE mode, const UCHAR *data, const UINT size); diff --git a/src/Cedar/Proto_OpenVPN.c b/src/Cedar/Proto_OpenVPN.c index 3058b9cc..cfcba6a5 100644 --- a/src/Cedar/Proto_OpenVPN.c +++ b/src/Cedar/Proto_OpenVPN.c @@ -29,13 +29,15 @@ PROTO_IMPL *OvsGetProtoImpl() return &impl; } -bool OvsInit(void **param, CEDAR *cedar, INTERRUPT_MANAGER *im, SOCK_EVENT *se) +bool OvsInit(void **param, CEDAR *cedar, INTERRUPT_MANAGER *im, SOCK_EVENT *se, const char *cipher, const char *hostname) { if (param == NULL || cedar == NULL || im == NULL || se == NULL) { return false; } + Debug("OvsInit(): cipher: %s, hostname: %s\n", cipher, hostname); + *param = NewOpenVpnServer(cedar, im, se); return true; diff --git a/src/Cedar/Proto_OpenVPN.h b/src/Cedar/Proto_OpenVPN.h index 44cdbd33..20fa3e23 100644 --- a/src/Cedar/Proto_OpenVPN.h +++ b/src/Cedar/Proto_OpenVPN.h @@ -209,7 +209,7 @@ struct OPENVPN_SERVER //// Function prototype PROTO_IMPL *OvsGetProtoImpl(); -bool OvsInit(void **param, CEDAR *cedar, INTERRUPT_MANAGER *im, SOCK_EVENT *se); +bool OvsInit(void **param, CEDAR *cedar, INTERRUPT_MANAGER *im, SOCK_EVENT *se, const char *cipher, const char *hostname); void OvsFree(void *param); char *OvsName(); bool OvsIsPacketForMe(const PROTO_MODE mode, const UCHAR *data, const UINT size);