diff --git a/wintun-testing/go.mod b/wintun-testing/go.mod new file mode 100644 index 00000000..4388ec43 --- /dev/null +++ b/wintun-testing/go.mod @@ -0,0 +1,9 @@ +module wintun-testing + +go 1.14 + +require ( + golang.org/x/sys v0.0.0-20200406113430-c6e801f48ba2 + golang.zx2c4.com/wireguard v0.0.20200320 + golang.zx2c4.com/wireguard/windows v0.1.0 +) diff --git a/wintun-testing/go.sum b/wintun-testing/go.sum new file mode 100644 index 00000000..5ed8cdb5 --- /dev/null +++ b/wintun-testing/go.sum @@ -0,0 +1,28 @@ +github.com/lxn/walk v0.0.0-20191128110447-55ccb3a9f5c1/go.mod h1:E23UucZGqpuUANJooIbHWCufXvOcT6E7Stq81gU+CSQ= +github.com/lxn/win v0.0.0-20191128105842-2da648fda5b4/go.mod h1:ouWl4wViUNh8tPSIwxTVMuS014WakR1hqvBc2I0bMoA= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20191002192127-34f69633bfdc/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200221231518-2aa609cf4a9d h1:1ZiEyfaQIg3Qh0EoqpwAakHVhecoE5wlSg5GjnafJGw= +golang.org/x/crypto v0.0.0-20200221231518-2aa609cf4a9d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20191003171128-d98b1b443823/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200301022130-244492dfa37a h1:GuSPYbZzB5/dcLNCwLQLsg3obCJtX9IJhpXkvY7kzk0= +golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191003212358-c178f38b412c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200301040627-c5d0d7b4ec88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200406113430-c6e801f48ba2 h1:Z9pPywZscwuw0ijrLEbTzW9lppFgBY4HDgbvoDnreQs= +golang.org/x/sys v0.0.0-20200406113430-c6e801f48ba2/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/text v0.3.3-0.20191230102452-929e72ca90de h1:aYKJLPSrddB2N7/6OKyFqJ337SXpo61bBuvO5p1+7iY= +golang.org/x/text v0.3.3-0.20191230102452-929e72ca90de/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.zx2c4.com/wireguard v0.0.20200122-0.20200214175355-9cbcff10dd3e/go.mod h1:P2HsVp8SKwZEufsnezXZA4GRX/T49/HlU7DGuelXsU4= +golang.zx2c4.com/wireguard v0.0.20200320 h1:1vE6zVeO7fix9cJX1Z9ZQ+ikPIIx7vIyU0o0tLDD88g= +golang.zx2c4.com/wireguard v0.0.20200320/go.mod h1:lDian4Sw4poJ04SgHh35nzMVwGSYlPumkdnHcucAQoY= +golang.zx2c4.com/wireguard/windows v0.1.0 h1:742izt2DAJBpIQT+DvrzN58P9p7fO4BUFOgMzY9qVhw= +golang.zx2c4.com/wireguard/windows v0.1.0/go.mod h1:EK7CxrFnicmYJ0ZCF6crBh2/EMMeSxMlqgLlwN0Kv9s= diff --git a/wintun-testing/main.go b/wintun-testing/main.go new file mode 100644 index 00000000..2a189743 --- /dev/null +++ b/wintun-testing/main.go @@ -0,0 +1,126 @@ +package main + +import ( + "fmt" + "golang.org/x/sys/windows" + "golang.zx2c4.com/wireguard/device" + "golang.zx2c4.com/wireguard/ipc" + "golang.zx2c4.com/wireguard/tun" + "golang.zx2c4.com/wireguard/windows/tunnel/winipcfg" + "net" + "os" + "os/signal" + user2 "os/user" + "syscall" +) + +const ( + ExitSetupSuccess = 0 + ExitSetupFailed = 1 +) + +func main(){ + + + user,err := user2.Current() + + fmt.Printf("Hi there: %v", user) + + if len(os.Args) != 2 { + os.Exit(ExitSetupFailed) + } + interfaceName := os.Args[1] + + fmt.Fprintln(os.Stderr, "Warning: this is a test program for Windows, mainly used for debugging this Go package. For a real WireGuard for Windows client, the repo you want is , which includes this code as a module.") + + logger := device.NewLogger( + device.LogLevelDebug, + fmt.Sprintf("(%s) ", interfaceName), + ) + logger.Info.Println("Starting wireguard-go version", device.WireGuardGoVersion) + logger.Debug.Println("Debug log enabled") + + tunDevice, err := tun.CreateTUN(interfaceName, 0) + //defer tunDevice.Close() _note_ the device.close() seems to be closing the tun so this is not needed + if err == nil { + realInterfaceName, err2 := tunDevice.Name() + if err2 == nil { + interfaceName = realInterfaceName + } + } else { + logger.Error.Println("Failed to create TUN device:", err) + os.Exit(ExitSetupFailed) + } + + + nativeTunDevice := tunDevice.(*tun.NativeTun) + luid := winipcfg.LUID(nativeTunDevice.LUID()) + //xxx ip, ipnet, _ := net.ParseCIDR("10.82.31.4/24") + ip, ipnet, _ := net.ParseCIDR("169.254.100.200/32") + err = luid.SetIPAddresses([]net.IPNet{{ip, ipnet.Mask}}) + if err != nil { + fatal(err) + } + err = luid.SetRoutes([]*winipcfg.RouteData{{*ipnet, ipnet.IP, 0}}) + if err != nil { + fatal(err) + } + + + + + + + + + + + device := device.NewDevice(tunDevice, logger) + defer device.Close() + device.Up() + logger.Info.Println("Device started") + + uapi, err := ipc.UAPIListen(interfaceName) + if err != nil { + logger.Error.Println("Failed to listen on uapi socket:", err) + os.Exit(ExitSetupFailed) + } + defer uapi.Close() + + errs := make(chan error) + term := make(chan os.Signal, 1) + + go func() { + for { + conn, err := uapi.Accept() + if err != nil { + errs <- err + return + } + go device.IpcHandle(conn) + } + }() + logger.Info.Println("UAPI listener started") + + // wait for program to terminate + + signal.Notify(term, os.Interrupt) + signal.Notify(term, os.Kill) + signal.Notify(term, syscall.SIGTERM) + + select { + case <-term: + case <-errs: + case <-device.Wait(): + } + + // clean up + + logger.Info.Println("Shutting down") +} + + + +func fatal(v ...interface{}) { + panic(windows.StringToUTF16Ptr(fmt.Sprint(v...))) +}