From f80e2c90e90e62c01fba0fbb42397f5cd5b53e8d Mon Sep 17 00:00:00 2001 From: Mark Puha Date: Fri, 15 Sep 2023 07:09:02 +0200 Subject: [PATCH] add windows new fields --- src/ipc-uapi-windows.h | 1 + src/ipc-windows.h | 82 ++++++++++++++++++++++++++++++++++++ src/uapi/windows/wireguard.h | 21 ++++++++- 3 files changed, 103 insertions(+), 1 deletion(-) diff --git a/src/ipc-uapi-windows.h b/src/ipc-uapi-windows.h index 8ea4f75..63c182a 100644 --- a/src/ipc-uapi-windows.h +++ b/src/ipc-uapi-windows.h @@ -54,6 +54,7 @@ static struct hashtable cached_interfaces; static bool userspace_has_wireguard_interface(const char *iface) { + printf("dafasdf\n"); char fname[MAX_PATH]; WIN32_FIND_DATA find_data; HANDLE find_handle; diff --git a/src/ipc-windows.h b/src/ipc-windows.h index d237fc9..7925cf0 100644 --- a/src/ipc-windows.h +++ b/src/ipc-windows.h @@ -263,6 +263,43 @@ static int kernel_get_device(struct wgdevice **device, const char *iface) dev->flags |= WGDEVICE_HAS_PRIVATE_KEY; } + if (wg_iface->Flags & WG_IOCTL_INTERFACE_JC) { + dev->junk_packet_count = wg_iface->JunkPacketCount; + dev->flags |= WGDEVICE_HAS_JC; + } + if (wg_iface->Flags & WG_IOCTL_INTERFACE_JMIN) { + dev->junk_packet_min_size = wg_iface->JunkPacketMinSize; + dev->flags |= WGDEVICE_HAS_JMIN; + } + if (wg_iface->Flags & WG_IOCTL_INTERFACE_JMAX) { + dev->junk_packet_max_size = wg_iface->JunkPacketMaxSize; + dev->flags |= WGDEVICE_HAS_JMAX; + } + if (wg_iface->Flags & WG_IOCTL_INTERFACE_S1) { + dev->init_packet_junk_size = wg_iface->InitPacketJunkSize; + dev->flags |= WGDEVICE_HAS_S1; + } + if (wg_iface->Flags & WG_IOCTL_INTERFACE_S2) { + dev->response_packet_junk_size = wg_iface->ResponsePacketJunkSize; + dev->flags |= WGDEVICE_HAS_S2; + } + if (wg_iface->Flags & WG_IOCTL_INTERFACE_H1) { + dev->init_packet_magic_header = wg_iface->InitPacketMagicHeader; + dev->flags |= WGDEVICE_HAS_H1; + } + if (wg_iface->Flags & WG_IOCTL_INTERFACE_H2) { + dev->response_packet_magic_header = wg_iface->ResponsePacketMagicHeader; + dev->flags |= WGDEVICE_HAS_H2; + } + if (wg_iface->Flags & WG_IOCTL_INTERFACE_H3) { + dev->underload_packet_magic_header = wg_iface->UnderloadPacketMagicHeader; + dev->flags |= WGDEVICE_HAS_H3; + } + if (wg_iface->Flags & WG_IOCTL_INTERFACE_H4) { + dev->transport_packet_magic_header = wg_iface->TransportPacketMagicHeader; + dev->flags |= WGDEVICE_HAS_H4; + } + wg_peer = buf + sizeof(WG_IOCTL_INTERFACE); for (ULONG i = 0; i < wg_iface->PeersCount; ++i) { peer = calloc(1, sizeof(*peer)); @@ -385,6 +422,51 @@ static int kernel_set_device(struct wgdevice *dev) if (dev->flags & WGDEVICE_REPLACE_PEERS) wg_iface->Flags |= WG_IOCTL_INTERFACE_REPLACE_PEERS; + if (dev->flags & WGDEVICE_HAS_JC) { + wg_iface->JunkPacketCount = dev->junk_packet_count; + wg_iface->Flags |= WG_IOCTL_INTERFACE_JC; + } + + if (dev->flags & WGDEVICE_HAS_JMIN) { + wg_iface->JunkPacketMinSize = dev->junk_packet_min_size; + wg_iface->Flags |= WG_IOCTL_INTERFACE_JMIN; + } + + if (dev->flags & WGDEVICE_HAS_JMAX) { + wg_iface->JunkPacketMaxSize = dev->junk_packet_max_size; + wg_iface->Flags |= WG_IOCTL_INTERFACE_JMAX; + } + + if (dev->flags & WGDEVICE_HAS_S1) { + wg_iface->InitPacketJunkSize = dev->init_packet_junk_size; + wg_iface->Flags |= WG_IOCTL_INTERFACE_S1; + } + + if (dev->flags & WGDEVICE_HAS_S2) { + wg_iface->ResponsePacketJunkSize = dev->response_packet_junk_size; + wg_iface->Flags |= WG_IOCTL_INTERFACE_S2; + } + + if (dev->flags & WGDEVICE_HAS_H1) { + wg_iface->InitPacketMagicHeader = dev->init_packet_magic_header; + wg_iface->Flags |= WG_IOCTL_INTERFACE_H1; + } + + if (dev->flags & WGDEVICE_HAS_H2) { + wg_iface->ResponsePacketMagicHeader = dev->response_packet_magic_header; + wg_iface->Flags |= WG_IOCTL_INTERFACE_H2; + } + + if (dev->flags & WGDEVICE_HAS_H3) { + wg_iface->UnderloadPacketMagicHeader = dev->underload_packet_magic_header; + wg_iface->Flags |= WG_IOCTL_INTERFACE_H3; + } + + if (dev->flags & WGDEVICE_HAS_H4) { + wg_iface->TransportPacketMagicHeader = dev->transport_packet_magic_header; + wg_iface->Flags |= WG_IOCTL_INTERFACE_H4; + } + peer_count = 0; wg_peer = (void *)wg_iface + sizeof(WG_IOCTL_INTERFACE); for_each_wgpeer(dev, peer) { diff --git a/src/uapi/windows/wireguard.h b/src/uapi/windows/wireguard.h index 5c5938e..917d785 100644 --- a/src/uapi/windows/wireguard.h +++ b/src/uapi/windows/wireguard.h @@ -56,7 +56,17 @@ typedef enum WG_IOCTL_INTERFACE_HAS_PUBLIC_KEY = 1 << 0, WG_IOCTL_INTERFACE_HAS_PRIVATE_KEY = 1 << 1, WG_IOCTL_INTERFACE_HAS_LISTEN_PORT = 1 << 2, - WG_IOCTL_INTERFACE_REPLACE_PEERS = 1 << 3 + WG_IOCTL_INTERFACE_REPLACE_PEERS = 1 << 3, + WG_IOCTL_INTERFACE_PEERS = 1 << 4, + WG_IOCTL_INTERFACE_JC = 1 << 5, + WG_IOCTL_INTERFACE_JMIN = 1 << 6, + WG_IOCTL_INTERFACE_JMAX = 1 << 7, + WG_IOCTL_INTERFACE_S1 = 1 << 8, + WG_IOCTL_INTERFACE_S2 = 1 << 9, + WG_IOCTL_INTERFACE_H1 = 1 << 10, + WG_IOCTL_INTERFACE_H2 = 1 << 11, + WG_IOCTL_INTERFACE_H3 = 1 << 12, + WG_IOCTL_INTERFACE_H4 = 1 << 13 } WG_IOCTL_INTERFACE_FLAG; typedef struct _WG_IOCTL_INTERFACE @@ -66,6 +76,15 @@ typedef struct _WG_IOCTL_INTERFACE UCHAR PrivateKey[WG_KEY_LEN]; UCHAR PublicKey[WG_KEY_LEN]; ULONG PeersCount; + USHORT JunkPacketCount; + USHORT JunkPacketMinSize; + USHORT JunkPacketMaxSize; + USHORT InitPacketJunkSize; + USHORT ResponsePacketJunkSize; + ULONG InitPacketMagicHeader; + ULONG ResponsePacketMagicHeader; + ULONG UnderloadPacketMagicHeader; + ULONG TransportPacketMagicHeader; } __attribute__((aligned(8))) WG_IOCTL_INTERFACE; #define WG_IOCTL_GET CTL_CODE(45208U, 321, METHOD_OUT_DIRECT, FILE_READ_DATA | FILE_WRITE_DATA)