diff options
| author | Odd Stranne <odd@mullvad.net> | 2020-02-06 11:20:45 +0100 |
|---|---|---|
| committer | Odd Stranne <odd@mullvad.net> | 2020-02-13 11:29:23 +0100 |
| commit | 75bd2e1e8ebd1ae33f63fd18fb05acb160b6d96e (patch) | |
| tree | df2ed2353c6423544b7033d5ed0a5e7ee9004e52 /wireguard | |
| parent | 63ce03b3ce8de46c39fd8a4ef5e4d49156623dae (diff) | |
| download | mullvadvpn-75bd2e1e8ebd1ae33f63fd18fb05acb160b6d96e.tar.xz mullvadvpn-75bd2e1e8ebd1ae33f63fd18fb05acb160b6d96e.zip | |
Consolidate various libwg implementations
Diffstat (limited to 'wireguard')
20 files changed, 584 insertions, 891 deletions
diff --git a/wireguard/build-wireguard-go.sh b/wireguard/build-wireguard-go.sh index f30397e81c..bdfe98d6c5 100755 --- a/wireguard/build-wireguard-go.sh +++ b/wireguard/build-wireguard-go.sh @@ -25,7 +25,7 @@ function win_deduce_lib_executable_path { } function win_gather_export_symbols { - grep -Eo "\/\/export \w+" libwg.go | cut -d' ' -f2 + grep -Eo "\/\/export \w+" libwg.go libwg_windows.go | cut -d' ' -f2 } function win_create_lib_file { @@ -46,7 +46,7 @@ function win_create_lib_file { function build_windows { echo "Building wireguard-go for Windows" - pushd wireguard-go-windows + pushd libwg go build -v -o libwg.dll -buildmode c-shared win_create_lib_file @@ -71,7 +71,7 @@ function unix_target_triple { function build_unix { echo "Building wireguard-go for $1" - pushd wireguard-go + pushd libwg target_triple_dir="../../build/lib/$(unix_target_triple)" mkdir -p $target_triple_dir go build -v -o $target_triple_dir/libwg.a -buildmode c-archive @@ -84,7 +84,7 @@ function build_android { docker run --rm \ -v "$(pwd)/../":/workspace \ - --entrypoint "/workspace/wireguard/wireguard-go/build-android.sh" \ + --entrypoint "/workspace/wireguard/libwg/build-android.sh" \ mullvadvpn/mullvad-android-app-build@sha256:$docker_image_hash } diff --git a/wireguard/wireguard-go/Android.mk b/wireguard/libwg/Android.mk index 6b31ffeb80..6b31ffeb80 100644 --- a/wireguard/wireguard-go/Android.mk +++ b/wireguard/libwg/Android.mk diff --git a/wireguard/wireguard-go/build-android.sh b/wireguard/libwg/build-android.sh index 4f1849aa75..4f1849aa75 100755..100644 --- a/wireguard/wireguard-go/build-android.sh +++ b/wireguard/libwg/build-android.sh diff --git a/wireguard/libwg/go.mod b/wireguard/libwg/go.mod new file mode 100644 index 0000000000..02a170a9b5 --- /dev/null +++ b/wireguard/libwg/go.mod @@ -0,0 +1,9 @@ +module github.com/mullvad/mullvadvpn-app/wireguard/libwg + +go 1.13 + +require ( + golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5 + golang.zx2c4.com/wireguard v0.0.20200121 + golang.zx2c4.com/wireguard/windows v0.0.38 +) diff --git a/wireguard/libwg/go.sum b/wireguard/libwg/go.sum new file mode 100644 index 0000000000..ee390a307c --- /dev/null +++ b/wireguard/libwg/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 h1:c0o/qxkaO2LF5t6fQrT4b5hzyggAkLLlCUjqfRxd8Q4= +golang.org/x/crypto v0.0.0-20191002192127-34f69633bfdc/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20191227163750-53104e6ec876 h1:sKJQZMuxjOAR/Uo2LBfU90onWEf1dF4C+0hPJCc9Mpc= +golang.org/x/crypto v0.0.0-20191227163750-53104e6ec876/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 h1:Ypyv6BNJh07T1pUSrehkLemqPKXhus2MkfktJ91kRh4= +golang.org/x/net v0.0.0-20191003171128-d98b1b443823/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553 h1:efeOvDhwQ29Dj3SdAV/MJf8oukgn+8D8WgaCaRMchF8= +golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/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-20200107162124-548cf772de50/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5 h1:LfCXLvNmTYH9kEmVgqbnsWfruoXZIrh4YBgqVHtDvw0= +golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.zx2c4.com/wireguard v0.0.20191013-0.20200107164045-4fa2ea6a2dab/go.mod h1:P2HsVp8SKwZEufsnezXZA4GRX/T49/HlU7DGuelXsU4= +golang.zx2c4.com/wireguard v0.0.20200121 h1:vcswa5Q6f+sylDfjqyrVNNrjsFUUbPsgAQTBCAg/Qf8= +golang.zx2c4.com/wireguard v0.0.20200121/go.mod h1:P2HsVp8SKwZEufsnezXZA4GRX/T49/HlU7DGuelXsU4= +golang.zx2c4.com/wireguard/windows v0.0.38 h1:RIXfYUYDCBk5+tsxrnNBRXxIvgnXJc544MrDMFFXj4I= +golang.zx2c4.com/wireguard/windows v0.0.38/go.mod h1:bVbqKzpu4jLrEA2nVNn/WdWyyXGZARZNqkoGHd61DuM= diff --git a/wireguard/wireguard-go/goruntime-boottime-over-monotonic.diff b/wireguard/libwg/goruntime-boottime-over-monotonic.diff index e5c668bde1..e5c668bde1 100644 --- a/wireguard/wireguard-go/goruntime-boottime-over-monotonic.diff +++ b/wireguard/libwg/goruntime-boottime-over-monotonic.diff diff --git a/wireguard/wireguard-go-windows/interfacewatcher.go b/wireguard/libwg/interfacewatcher/interfacewatcher_windows.go index d1a2a008bf..8242ab0ff5 100644 --- a/wireguard/wireguard-go-windows/interfacewatcher.go +++ b/wireguard/libwg/interfacewatcher/interfacewatcher_windows.go @@ -1,10 +1,10 @@ /* SPDX-License-Identifier: MIT * * Copyright (C) 2019 WireGuard LLC. All Rights Reserved. - * Copyright (C) 2019 Amagicom AB. All Rights Reserved. + * Copyright (C) 2020 Mullvad VPN AB. All Rights Reserved. */ -package main +package interfacewatcher import ( "sync" @@ -13,21 +13,21 @@ import ( "golang.zx2c4.com/wireguard/windows/tunnel/winipcfg" ) -type interfaceWatcherEvent struct { - luid winipcfg.LUID - family winipcfg.AddressFamily +type Event struct { + Luid winipcfg.LUID + Family winipcfg.AddressFamily } type interfaceWatcher struct { ready chan bool processingMutex sync.Mutex interfaceChangeCallback *winipcfg.InterfaceChangeCallback - seenEvents []interfaceWatcherEvent - wantedEvents []interfaceWatcherEvent + seenEvents []Event + wantedEvents []Event expired bool } -func watchInterfaces() (*interfaceWatcher, error) { +func NewWatcher() (*interfaceWatcher, error) { iw := &interfaceWatcher{ ready: make(chan bool, 1), expired: false, @@ -45,7 +45,7 @@ func watchInterfaces() (*interfaceWatcher, error) { return } - iw.seenEvents = append(iw.seenEvents, interfaceWatcherEvent{iface.InterfaceLUID, iface.Family}) + iw.seenEvents = append(iw.seenEvents, Event{iface.InterfaceLUID, iface.Family}) if len(iw.wantedEvents) != 0 { iw.evaluateEvents() @@ -79,7 +79,7 @@ func (iw *interfaceWatcher) evaluateEvents() { } // You can only join() once after which the watcher becomes expired. -func (iw *interfaceWatcher) join(wantedEvents []interfaceWatcherEvent, timeoutSeconds int) bool { +func (iw *interfaceWatcher) Join(wantedEvents []Event, timeoutSeconds int) bool { { iw.processingMutex.Lock() @@ -115,7 +115,7 @@ func (iw *interfaceWatcher) join(wantedEvents []interfaceWatcherEvent, timeoutSe return result } -func (iw *interfaceWatcher) destroy() { +func (iw *interfaceWatcher) Destroy() { if iw.interfaceChangeCallback != nil { iw.interfaceChangeCallback.Unregister() iw.interfaceChangeCallback = nil diff --git a/wireguard/libwg/libwg.go b/wireguard/libwg/libwg.go new file mode 100644 index 0000000000..773ce45f08 --- /dev/null +++ b/wireguard/libwg/libwg.go @@ -0,0 +1,69 @@ +/* SPDX-License-Identifier: Apache-2.0 + * + * Copyright (C) 2017-2019 Jason A. Donenfeld <Jason@zx2c4.com>. All Rights Reserved. + * Copyright (C) 2020 Mullvad VPN AB. All Rights Reserved. + */ + +package main + +// #include <stdlib.h> +import "C" + +import ( + "bufio" + "bytes" + "runtime" + "unsafe" + + "golang.zx2c4.com/wireguard/device" + "github.com/mullvad/mullvadvpn-app/wireguard/libwg/tunnelcontainer" +) + +var tunnels tunnelcontainer.Container + +func init() { + device.RoamingDisabled = true + tunnels = tunnelcontainer.New() +} + +//export wgTurnOff +func wgTurnOff(tunnelHandle int32) { + { + tunnel, err := tunnels.Remove(tunnelHandle) + if err != nil { + return + } + tunnel.Device.Close() + } + // Calling twice convinces the GC to release NOW. + runtime.GC() + runtime.GC() +} + +//export wgGetConfig +func wgGetConfig(tunnelHandle int32) *C.char { + tunnel, err := tunnels.Get(tunnelHandle) + if err != nil { + return nil + } + settings := new(bytes.Buffer) + writer := bufio.NewWriter(settings) + if err := tunnel.Device.IpcGetOperation(writer); err != nil { + tunnel.Logger.Error.Println("Failed to get config for tunnel: ", err) + return nil + } + writer.Flush() + return C.CString(settings.String()) +} + +//export wgFreePtr +func wgFreePtr(ptr unsafe.Pointer) { + C.free(ptr) +} + +//export wgVersion +func wgVersion() *C.char { + return C.CString(device.WireGuardGoVersion) +} + +func main() {} diff --git a/wireguard/libwg/libwg_android.go b/wireguard/libwg/libwg_android.go new file mode 100644 index 0000000000..fe9a951289 --- /dev/null +++ b/wireguard/libwg/libwg_android.go @@ -0,0 +1,104 @@ +/* SPDX-License-Identifier: Apache-2.0 + * + * Copyright (C) 2017-2019 Jason A. Donenfeld <Jason@zx2c4.com>. All Rights Reserved. + * Copyright (C) 2020 Mullvad VPN AB. All Rights Reserved. + */ + +package main + +import ( + "C" + "bufio" + "strings" + "unsafe" + + "golang.org/x/sys/unix" + + "golang.zx2c4.com/wireguard/device" + "golang.zx2c4.com/wireguard/tun" + + "github.com/mullvad/mullvadvpn-app/wireguard/libwg/logging" + "github.com/mullvad/mullvadvpn-app/wireguard/libwg/tunnelcontainer" +) + +// Redefined here because otherwise the compiler doesn't realize it's a type alias for a type that's safe to export. +// Taken from the contained logging package. +type LogSink = unsafe.Pointer +type LogContext = unsafe.Pointer + +const ( + ERROR_GENERAL_FAILURE = -1 + ERROR_INTERMITTENT_FAILURE = -2 +) + +//export wgTurnOn +func wgTurnOn(cSettings *C.char, fd int, logSink LogSink, logContext LogContext) int32 { + logger := logging.NewLogger(logSink, logContext) + + if cSettings == nil { + logger.Error.Println("cSettings is null") + return ERROR_GENERAL_FAILURE + } + settings := C.GoString(cSettings) + + tunDevice, _, err := tun.CreateUnmonitoredTUNFromFD(fd) + if err != nil { + logger.Error.Println(err) + unix.Close(fd) + if err.Error() == "bad file descriptor" { + return ERROR_INTERMITTENT_FAILURE + } + return ERROR_GENERAL_FAILURE + } + + device := device.NewDevice(tunDevice, logger) + + err = device.IpcSetOperation(bufio.NewReader(strings.NewReader(settings))) + if err != nil { + logger.Error.Println(err) + device.Close() + return ERROR_INTERMITTENT_FAILURE + } + + device.Up() + + context := tunnelcontainer.Context { + Device: device, + Logger: logger, + } + + handle, err := tunnels.Insert(context) + if err != nil { + logger.Error.Println(err) + device.Close() + return ERROR_GENERAL_FAILURE + } + + return handle +} + +//export wgGetSocketV4 +func wgGetSocketV4(tunnelHandle int32) int32 { + tunnel, err := tunnels.Get(tunnelHandle) + if err != nil { + return -1 + } + fd, err := tunnel.Device.PeekLookAtSocketFd4() + if err != nil { + return -1 + } + return int32(fd) +} + +//export wgGetSocketV6 +func wgGetSocketV6(tunnelHandle int32) int32 { + tunnel, err := tunnels.Get(tunnelHandle) + if err != nil { + return -1 + } + fd, err := tunnel.Device.PeekLookAtSocketFd6() + if err != nil { + return -1 + } + return int32(fd) +} diff --git a/wireguard/libwg/libwg_default.go b/wireguard/libwg/libwg_default.go new file mode 100644 index 0000000000..81f5232f9c --- /dev/null +++ b/wireguard/libwg/libwg_default.go @@ -0,0 +1,76 @@ +// +build darwin linux +// +build !android + +/* SPDX-License-Identifier: Apache-2.0 + * + * Copyright (C) 2017-2019 Jason A. Donenfeld <Jason@zx2c4.com>. All Rights Reserved. + * Copyright (C) 2020 Mullvad VPN AB. All Rights Reserved. + */ + +package main + +// #include <stdlib.h> +import "C" +import ( + "bufio" + "os" + "strings" + "unsafe" + + "golang.zx2c4.com/wireguard/device" + "golang.zx2c4.com/wireguard/tun" + + "github.com/mullvad/mullvadvpn-app/wireguard/libwg/logging" + "github.com/mullvad/mullvadvpn-app/wireguard/libwg/tunnelcontainer" +) + +// Redefined here because otherwise the compiler doesn't realize it's a type alias for a type that's safe to export. +// Taken from the contained logging package. +type LogSink = unsafe.Pointer +type LogContext = unsafe.Pointer + +//export wgTurnOn +func wgTurnOn(mtu int, cSettings *C.char, fd int, logSink LogSink, logContext LogContext) int32 { + logger := logging.NewLogger(logSink, logContext) + + if cSettings == nil { + logger.Error.Println("cSettings is null") + return -1 + } + settings := C.GoString(cSettings) + + file := os.NewFile(uintptr(fd), "") + tunDevice, err := tun.CreateTUNFromFile(file, mtu) + if err != nil { + logger.Error.Println(err) + if err.Error() == "bad file descriptor" { + return -2 + } + return -1 + } + + device := device.NewDevice(tunDevice, logger) + + err = device.IpcSetOperation(bufio.NewReader(strings.NewReader(settings))) + if err != nil { + logger.Error.Println(err) + device.Close() + return -2 + } + + device.Up() + + context := tunnelcontainer.Context { + Device: device, + Logger: logger, + } + + handle, err := tunnels.Insert(context) + if err != nil { + logger.Error.Println(err) + device.Close() + return -1 + } + + return handle +} diff --git a/wireguard/libwg/libwg_windows.go b/wireguard/libwg/libwg_windows.go new file mode 100644 index 0000000000..c27285b6d1 --- /dev/null +++ b/wireguard/libwg/libwg_windows.go @@ -0,0 +1,148 @@ +/* SPDX-License-Identifier: Apache-2.0 + * + * Copyright (C) 2017-2019 Jason A. Donenfeld <Jason@zx2c4.com>. All Rights Reserved. + * Copyright (C) 2020 Mullvad VPN AB. All Rights Reserved. + */ + +package main + +import ( + "C" + "bufio" + "unsafe" + "strings" + + "golang.org/x/sys/windows" + + "golang.zx2c4.com/wireguard/device" + "golang.zx2c4.com/wireguard/tun" + "golang.zx2c4.com/wireguard/windows/tunnel/winipcfg" + + "github.com/mullvad/mullvadvpn-app/wireguard/libwg/interfacewatcher" + "github.com/mullvad/mullvadvpn-app/wireguard/libwg/logging" + "github.com/mullvad/mullvadvpn-app/wireguard/libwg/tunnelcontainer" +) + +// Redefined here because otherwise the compiler doesn't realize it's a type alias for a type that's safe to export. +// Taken from the contained logging package. +type LogSink = unsafe.Pointer +type LogContext = unsafe.Pointer + +//export wgTurnOn +func wgTurnOn(cIfaceName *C.char, mtu int, cSettings *C.char, logSink LogSink, logContext LogContext) int32 { + logger := logging.NewLogger(logSink, logContext) + + if cIfaceName == nil { + logger.Error.Println("cIfaceName is null") + return -1 + } + + if cSettings == nil { + logger.Error.Println("cSettings is null") + return -1 + } + + settings := C.GoString(cSettings) + ifaceName := C.GoString(cIfaceName) + + // {AFE43773-E1F8-4EBB-8536-576AB86AFE9A} + networkId := windows.GUID { 0xafe43773, 0xe1f8, 0x4ebb, [8]byte{ 0x85, 0x36, 0x57, 0x6a, 0xb8, 0x6a, 0xfe, 0x9a } } + + watcher, err := interfacewatcher.NewWatcher() + if err != nil { + logger.Error.Println(err) + return -1 + } + defer watcher.Destroy() + + wintun, err := tun.CreateTUNWithRequestedGUID(ifaceName, &networkId, mtu) + if err != nil { + logger.Error.Println("Failed to create tunnel") + logger.Error.Println(err) + return -1 + } + + nativeTun := wintun.(*tun.NativeTun) + + actualInterfaceName, err := nativeTun.Name() + if err != nil { + nativeTun.Close() + logger.Error.Println("Failed to determine name of wintun adapter") + return -1 + } + + if actualInterfaceName != ifaceName { + // WireGuard picked a different name for the adapter than the one we expected. + // This indicates there is already an adapter with the name we intended to use. + nativeTun.Close() + logger.Error.Println("Failed to create adapter with specific name") + return -1 + } + + device := device.NewDevice(wintun, logger) + + setError := device.IpcSetOperation(bufio.NewReader(strings.NewReader(settings))) + if setError != nil { + logger.Error.Println("Failed to set device configuration") + logger.Error.Println(setError) + device.Close() + return -1 + } + + device.Up() + + interfaces := []interfacewatcher.Event{ + { + Luid: winipcfg.LUID(nativeTun.LUID()), + Family: windows.AF_INET, + }, + { + Luid: winipcfg.LUID(nativeTun.LUID()), + Family: windows.AF_INET6, + }, + } + + logger.Debug.Println("Waiting for interfaces to attach") + + if !watcher.Join(interfaces, 5) { + logger.Error.Println("Failed to wait for IP interfaces to become available") + device.Close() + return -1 + } + + logger.Debug.Println("Interfaces OK") + + context := tunnelcontainer.Context { + Device: device, + Logger: logger, + } + + handle, err := tunnels.Insert(context) + if err != nil { + logger.Error.Println(err) + device.Close() + return -1 + } + + return handle +} + +//export wgRebindTunnelSocket +func wgRebindTunnelSocket(family uint16, interfaceIndex uint32) { + tunnels.ForEach(func(tunnel tunnelcontainer.Context) { + blackhole := (interfaceIndex == 0) + if family == windows.AF_INET { + tunnel.Logger.Info.Printf("Binding v4 socket to interface %d (blackhole=%v)", interfaceIndex, blackhole) + err := tunnel.Device.BindSocketToInterface4(interfaceIndex, blackhole) + if err != nil { + tunnel.Logger.Info.Println(err) + } + } else if family == windows.AF_INET6 { + tunnel.Logger.Info.Printf("Binding v6 socket to interface %d (blackhole=%v)", interfaceIndex, blackhole) + err := tunnel.Device.BindSocketToInterface6(interfaceIndex, blackhole) + if err != nil { + tunnel.Logger.Info.Println(err) + } + } + }) +} diff --git a/wireguard/libwg/logging/logging.go b/wireguard/libwg/logging/logging.go new file mode 100644 index 0000000000..643419bb46 --- /dev/null +++ b/wireguard/libwg/logging/logging.go @@ -0,0 +1,65 @@ +/* SPDX-License-Identifier: Apache-2.0 + * + * Copyright (C) 2017-2019 Jason A. Donenfeld <Jason@zx2c4.com>. All Rights Reserved. + * Copyright (C) 2020 Mullvad VPN AB. All Rights Reserved. + */ + +package logging + +// #include <stdlib.h> +// #include <sys/types.h> +// #ifndef WIN32 +// #define __stdcall +// #endif +// typedef void (__stdcall *LogSink)(unsigned int, const char *, void *); +// static void callLogSink(void *logSink, int level, const char *message, void *context) +// { +// ((LogSink)logSink)((unsigned int)level, message, context); +// } +import "C" + +import ( + "log" + "unsafe" + + "golang.zx2c4.com/wireguard/device" +) + +// Define type aliases. +type LogSink = unsafe.Pointer +type LogContext = unsafe.Pointer + +type Logger struct { + sink LogSink + context LogContext + level C.int +} + +func (l *Logger) Write(message []byte) (int, error) { + msg := C.CString(string(message)) + C.callLogSink(l.sink, l.level, msg, l.context) + C.free(unsafe.Pointer(msg)) + return len(message), nil +} + +func NewLogger(logSink LogSink, logContext LogContext) *device.Logger { + logger := new(device.Logger) + + logger.Debug = log.New( + &Logger{sink: logSink, context: logContext, level: device.LogLevelDebug}, + "", + 0, + ) + logger.Info = log.New( + &Logger{sink: logSink, context: logContext, level: device.LogLevelInfo}, + "", + 0, + ) + logger.Error = log.New( + &Logger{sink: logSink, context: logContext, level: device.LogLevelError}, + "", + 0, + ) + + return logger +} diff --git a/wireguard/libwg/tunnelcontainer/tunnelcontainer.go b/wireguard/libwg/tunnelcontainer/tunnelcontainer.go new file mode 100644 index 0000000000..91291dcf4b --- /dev/null +++ b/wireguard/libwg/tunnelcontainer/tunnelcontainer.go @@ -0,0 +1,70 @@ +/* SPDX-License-Identifier: Apache-2.0 + * + * Copyright (C) 2017-2019 Jason A. Donenfeld <Jason@zx2c4.com>. All Rights Reserved. + * Copyright (C) 2020 Mullvad VPN AB. All Rights Reserved. + */ + +package tunnelcontainer + +import ( + "net" + "math" + "errors" + + "golang.zx2c4.com/wireguard/device" +) + +type Context struct { + Device *device.Device + Uapi net.Listener + Logger *device.Logger +} + +type Container struct { + tunnels map[int32]Context +} + +func New() Container { + return Container{ + tunnels: make(map[int32]Context), + } +} + +func (tc *Container) Insert(context Context) (int32, error) { + var i int32 + for i = 0; i < math.MaxInt32; i++ { + if _, exists := tc.tunnels[i]; !exists { + break + } + } + + if i == math.MaxInt32 { + return 0, errors.New("Container is full") + } + + tc.tunnels[i] = context + return i, nil +} + +func (tc *Container) Get(handle int32) (Context, error){ + context, ok := tc.tunnels[handle] + if !ok { + return Context{}, errors.New("Invalid context handle") + } + return context, nil +} + +func (tc *Container) Remove(handle int32) (Context, error){ + context, ok := tc.tunnels[handle] + if !ok { + return Context{}, errors.New("Invalid context handle") + } + delete(tc.tunnels, handle) + return context, nil +} + +func (tc *Container) ForEach(callback func(Context)) { + for _, tunnel := range tc.tunnels { + callback(tunnel) + } +} diff --git a/wireguard/wireguard-go-windows/go.mod b/wireguard/wireguard-go-windows/go.mod deleted file mode 100644 index 35b78ec484..0000000000 --- a/wireguard/wireguard-go-windows/go.mod +++ /dev/null @@ -1,21 +0,0 @@ -module github.com/mullvad/mullvadvpn-app/wireguard-go-windows - -go 1.12 - -require ( - github.com/Microsoft/go-winio v0.4.14 // indirect - github.com/konsorten/go-windows-terminal-sequences v1.0.2 // indirect - github.com/sirupsen/logrus v1.4.2 // indirect - github.com/stretchr/objx v0.2.0 // indirect - github.com/stretchr/testify v1.4.0 // indirect - golang.org/x/crypto v0.0.0-20200108215511-5d647ca15757 // indirect - golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e // indirect - golang.org/x/sys v0.0.0-20200107162124-548cf772de50 - golang.org/x/tools v0.0.0-20200108203644-89082a384178 // indirect - golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 // indirect - golang.zx2c4.com/wireguard v0.0.20200121 - golang.zx2c4.com/wireguard/windows v0.0.38 - gopkg.in/Knetic/govaluate.v3 v3.0.0 // indirect - gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 // indirect - gopkg.in/yaml.v2 v2.2.7 // indirect -) diff --git a/wireguard/wireguard-go-windows/go.sum b/wireguard/wireguard-go-windows/go.sum deleted file mode 100644 index 9ed4c430b6..0000000000 --- a/wireguard/wireguard-go-windows/go.sum +++ /dev/null @@ -1,166 +0,0 @@ -github.com/Microsoft/go-winio v0.4.12 h1:xAfWHN1IrQ0NJ9TBC0KBZoqLjzDTr1ML+4MywiUOryc= -github.com/Microsoft/go-winio v0.4.12/go.mod h1:VhR8bwka0BXejwEJY73c50VrPtXAaKcyvVC4A4RozmA= -github.com/Microsoft/go-winio v0.4.14/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA= -github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/lxn/walk v0.0.0-20190923074432-2011aca68435/go.mod h1:E23UucZGqpuUANJooIbHWCufXvOcT6E7Stq81gU+CSQ= -github.com/lxn/walk v0.0.0-20191024083542-9936f81d38c5/go.mod h1:E23UucZGqpuUANJooIbHWCufXvOcT6E7Stq81gU+CSQ= -github.com/lxn/walk v0.0.0-20191024161928-0ee7d2cded97 h1:3zBUhgnxeLyaImKEtPfKWipiHyI5zYp/V2NN967zPFo= -github.com/lxn/walk v0.0.0-20191024161928-0ee7d2cded97/go.mod h1:E23UucZGqpuUANJooIbHWCufXvOcT6E7Stq81gU+CSQ= -github.com/lxn/walk v0.0.0-20191128110447-55ccb3a9f5c1/go.mod h1:E23UucZGqpuUANJooIbHWCufXvOcT6E7Stq81gU+CSQ= -github.com/lxn/win v0.0.0-20190919090605-24c5960b03d8/go.mod h1:ouWl4wViUNh8tPSIwxTVMuS014WakR1hqvBc2I0bMoA= -github.com/lxn/win v0.0.0-20191024092953-c0107e6cbbfb/go.mod h1:ouWl4wViUNh8tPSIwxTVMuS014WakR1hqvBc2I0bMoA= -github.com/lxn/win v0.0.0-20191024121223-cc00c7492fe1 h1:h0wbuSK8xUNmMwDdCxZx2OLdkVck6Bb31zj4CxCN5I4= -github.com/lxn/win v0.0.0-20191024121223-cc00c7492fe1/go.mod h1:ouWl4wViUNh8tPSIwxTVMuS014WakR1hqvBc2I0bMoA= -github.com/lxn/win v0.0.0-20191128105842-2da648fda5b4/go.mod h1:ouWl4wViUNh8tPSIwxTVMuS014WakR1hqvBc2I0bMoA= -github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= -github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= -github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190426145343-a29dc8fdc734 h1:p/H982KKEjUnLJkM3tt/LemDnOc1GiZL5FCVlORJ5zo= -golang.org/x/crypto v0.0.0-20190426145343-a29dc8fdc734/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190617133340-57b3e21c3d56/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586 h1:7KByu05hhLed2MO29w7p1XfZvZ13m8mub3shuVftRs0= -golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190829043050-9756ffdc2472 h1:Gv7RPwsi3eZ2Fgewe3CBsuOebPwO27PoXzRpJPsvSSM= -golang.org/x/crypto v0.0.0-20190829043050-9756ffdc2472/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190911031432-227b76d455e7 h1:0hQKqeLdqlt5iIwVOBErRisrHJAN57yOiPRQItI20fU= -golang.org/x/crypto v0.0.0-20190911031432-227b76d455e7/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392 h1:ACG4HJsFiNMf47Y4PeRoebLNy/2lXT9EtprMuTFWt1M= -golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY= -golang.org/x/crypto v0.0.0-20191002192127-34f69633bfdc/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550 h1:ObdrDkeb4kJdCP557AjRjq69pTHfNouLtWZG7j9rPN8= -golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20191029031824-8986dd9e96cf h1:fnPsqIDRbCSgumaMCRpoIoF2s4qxv0xSSS0BVZUE/ss= -golang.org/x/crypto v0.0.0-20191029031824-8986dd9e96cf/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20191119213627-4f8c1d86b1ba h1:9bFeDpN3gTqNanMVqNcoR/pJQuP5uroC3t1D7eXozTE= -golang.org/x/crypto v0.0.0-20191119213627-4f8c1d86b1ba/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20191227163750-53104e6ec876/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200108215511-5d647ca15757 h1:pJ9H8lzdBh301qPX4VpwJ8TRpLt1IhNK1PxVOICyP54= -golang.org/x/crypto v0.0.0-20200108215511-5d647ca15757/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190502183928-7f726cade0ab h1:9RfW3ktsOZxgo9YNbBAjq1FWzc/igwEcUzZz8IXgSbk= -golang.org/x/net v0.0.0-20190502183928-7f726cade0ab/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7 h1:fHDIZ2oxGnUZRN6WgWFCbYBjH9uqVPRCUVUDhs0wnbA= -golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297 h1:k7pJ2yAPLPgbskkFdhRCsA77k2fySZ1zf2zCjvQCiIM= -golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190909003024-a7b16738d86b h1:XfVGCX+0T4WOStkaOsJRllbsiImhB2jgVBGc9L0lPGc= -golang.org/x/net v0.0.0-20190909003024-a7b16738d86b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190912160710-24e19bdeb0f2 h1:4dVFTC832rPn4pomLSz1vA+are2+dU19w1H8OngV7nc= -golang.org/x/net v0.0.0-20190912160710-24e19bdeb0f2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190916140828-c8589233b77d h1:mCMDWKhNO37A7GAhOpHPbIw1cjd0V86kX1/WA9c7FZ8= -golang.org/x/net v0.0.0-20190916140828-c8589233b77d/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190921015927-1a5e07d1ff72/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190923162816-aa69164e4478 h1:l5EDrHhldLYb3ZRHDUhXF7Om7MvYXnkV9/iQNo1lX6g= -golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191003171128-d98b1b443823/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191021144547-ec77196f6094 h1:5O4U9trLjNpuhpynaDsqwCk+Tw6seqJz1EbqbnzHrc8= -golang.org/x/net v0.0.0-20191021144547-ec77196f6094/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191101175033-0deb6923b6d9 h1:DPz9iiH3YoKiKhX/ijjoZvT0VFwK2c6CWYWQ7Zyr8TU= -golang.org/x/net v0.0.0-20191101175033-0deb6923b6d9/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191119073136-fc4aabc6c914 h1:MlY3mEfbnWGmUi4rtHOtNnnnN4UJRGSyLPx+DXA5Sq4= -golang.org/x/net v0.0.0-20191119073136-fc4aabc6c914/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553 h1:efeOvDhwQ29Dj3SdAV/MJf8oukgn+8D8WgaCaRMchF8= -golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -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-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190502175342-a43fa875dd82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190531175056-4c3a928424d2 h1:T5DasATyLQfmbTpfEXx/IOL9vfjzW6up+ZDkmHvIf2s= -golang.org/x/sys v0.0.0-20190531175056-4c3a928424d2/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190618155005-516e3c20635f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a h1:aYOabOQFp6Vj6W1F80affTUvO9UxmJRx8K0gsfABByQ= -golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190830023255-19e00faab6ad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190830142957-1e83adbbebd0 h1:7z820YPX9pxWR59qM7BE5+fglp4D/mKqAwCvGt11b+8= -golang.org/x/sys v0.0.0-20190830142957-1e83adbbebd0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190911201528-7ad0cfa0b7b5 h1:SW/0nsKCUaozCUtZTakri5laocGx/5bkDSSLrFUsa5s= -golang.org/x/sys v0.0.0-20190911201528-7ad0cfa0b7b5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190913121621-c3b328c6e5a7 h1:wYqz/tQaWUgGKyx+B/rssSE6wkIKdY5Ee6ryOmzarIg= -golang.org/x/sys v0.0.0-20190913121621-c3b328c6e5a7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3 h1:7TYNF4UdlohbFwpNH04CoPMp1cHUZgO1Ebq5r2hIjfo= -golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190924062700-2aa67d56cdd7 h1:9Vs0Vm0p/0tnWLBWn79aav6fpcxKjBZbd21Lhxzit4k= -golang.org/x/sys v0.0.0-20190924062700-2aa67d56cdd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191003212358-c178f38b412c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191024073052-e66fe6eb8e0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191025021431-6c3a3bfe00ae h1:QoJmnb9uyPCrH8GIg9uRLn4Ta45yhcQtpymCd0AavO8= -golang.org/x/sys v0.0.0-20191025021431-6c3a3bfe00ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191025090151-53bf42e6b339/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191104094858-e8c54fb511f6 h1:ZJUmhYTp8GbGC0ViZRc2U+MIYQ8xx9MscsdXnclfIhw= -golang.org/x/sys v0.0.0-20191104094858-e8c54fb511f6/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e h1:N7DeIrjYszNmSW409R3frPPwglRwMkXSBzwVbkOjLLA= -golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200107162124-548cf772de50 h1:YvQ10rzcqWXLlJZ3XCUoO25savxmscf4+SC+ZqiCHhA= -golang.org/x/sys v0.0.0-20200107162124-548cf772de50/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= -golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= -golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190822000311-fc82fb2afd64/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190823093517-aa644d2adf2a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190830223141-573d9926052a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190911230505-6bfd74cf029c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190916130336-e45ffcd953cc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190917144518-6c790d64586a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190924052046-3ac2a5bbd98a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191025023517-2077df36852e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20200108203644-89082a384178/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.zx2c4.com/wireguard v0.0.20190517 h1:FQ539AeNmsDek0BvWlaQId62Qe1bJsTwY/hse7SPRus= -golang.zx2c4.com/wireguard v0.0.20190517/go.mod h1:+Ks6M+8QvlG7Er8n35VNd/G5QnUQsypmpxIdPiAg48A= -golang.zx2c4.com/wireguard v0.0.20190805 h1:qPzediAzPEswzRxx2GzzPzNqnwqBZUUxEKTnC+7vjng= -golang.zx2c4.com/wireguard v0.0.20190805/go.mod h1:NFs2tkQT6xXo9kzqGJxObM2MzHhraJi7ZQUmwIqT+tE= -golang.zx2c4.com/wireguard v0.0.20190908 h1:SUoXDdwSMtomLdvke+zz83/u9tNvl4hHmcTIWp38tow= -golang.zx2c4.com/wireguard v0.0.20190908/go.mod h1:LhfXh5z6bLC2lW2ve6BzYZFwnnsXK3OQjySR0Yh2dO8= -golang.zx2c4.com/wireguard v0.0.20190909-0.20190917013833-70f6c42556af h1:0Z1CA9P1u7JLb7ixHREM/XH8wFkM+9t9LrQDeoJkBik= -golang.zx2c4.com/wireguard v0.0.20190909-0.20190917013833-70f6c42556af/go.mod h1:LhfXh5z6bLC2lW2ve6BzYZFwnnsXK3OQjySR0Yh2dO8= -golang.zx2c4.com/wireguard v0.0.20190909-0.20190917053916-01f8ef4e84a0 h1:BVNh+sWik8qlOqQ8Ef64s8bYxv7ka+MkPA7AT+Gk0M8= -golang.zx2c4.com/wireguard v0.0.20190909-0.20190917053916-01f8ef4e84a0/go.mod h1:LhfXh5z6bLC2lW2ve6BzYZFwnnsXK3OQjySR0Yh2dO8= -golang.zx2c4.com/wireguard v0.0.20190909-0.20190922100135-5774e6be91d3 h1:kpi3yed7t47yI5s7u8Z3AXqC0FfMxrCfwIsITux2VrA= -golang.zx2c4.com/wireguard v0.0.20190909-0.20190922100135-5774e6be91d3/go.mod h1:kknHs/HWB+cZKvHHzBldTe9HL6GEOpFswULW8LBwL4I= -golang.zx2c4.com/wireguard v0.0.20191012/go.mod h1:P2HsVp8SKwZEufsnezXZA4GRX/T49/HlU7DGuelXsU4= -golang.zx2c4.com/wireguard v0.0.20191013-0.20191022095125-f7d0edd2ecf5 h1:tijV0YMbg6JbCA9TNaNVjAK2+6KefpNwF4coc6UkNkQ= -golang.zx2c4.com/wireguard v0.0.20191013-0.20191022095125-f7d0edd2ecf5/go.mod h1:P2HsVp8SKwZEufsnezXZA4GRX/T49/HlU7DGuelXsU4= -golang.zx2c4.com/wireguard v0.0.20191013-0.20191121140156-3d0bb4c07f85 h1:5N1BJDaQnQAfcqY7MT1QoAAkPOj4gGs4/MC3TsxI12E= -golang.zx2c4.com/wireguard v0.0.20191013-0.20191121140156-3d0bb4c07f85/go.mod h1:P2HsVp8SKwZEufsnezXZA4GRX/T49/HlU7DGuelXsU4= -golang.zx2c4.com/wireguard v0.0.20191013-0.20200107164045-4fa2ea6a2dab h1:HVdRO4CGjul3Pj1BD1K5uThcFtrwXEF+F5qI+//V0mw= -golang.zx2c4.com/wireguard v0.0.20191013-0.20200107164045-4fa2ea6a2dab/go.mod h1:P2HsVp8SKwZEufsnezXZA4GRX/T49/HlU7DGuelXsU4= -golang.zx2c4.com/wireguard v0.0.20200121 h1:vcswa5Q6f+sylDfjqyrVNNrjsFUUbPsgAQTBCAg/Qf8= -golang.zx2c4.com/wireguard v0.0.20200121/go.mod h1:P2HsVp8SKwZEufsnezXZA4GRX/T49/HlU7DGuelXsU4= -golang.zx2c4.com/wireguard/windows v0.0.27 h1:mWNJM+ljcCkHY6tl/yrgaYnzl8GDXkBw/lwVAULZPUQ= -golang.zx2c4.com/wireguard/windows v0.0.27/go.mod h1:52MuSjwe0l0Hiv3wyu3Fq2dRkFXwbooym2zfmItvPGY= -golang.zx2c4.com/wireguard/windows v0.0.34 h1:u/r6uDRXVLZMISJoIMsOvih5hVwR3CIW5c8ZzeNMk6U= -golang.zx2c4.com/wireguard/windows v0.0.34/go.mod h1:dOEC5Ypgn5LE/VR+Fhcs2nDz3BzMYquODzA3JjurnnE= -golang.zx2c4.com/wireguard/windows v0.0.35 h1:egyV5IRbpKr78b+9gkB8AMQ32TtCo0NO//rfh10OSDg= -golang.zx2c4.com/wireguard/windows v0.0.35/go.mod h1:A3MmRXpatlao+Zty3Zxe2nqZ/sQCGYvnMVZ4z7TQY2w= -golang.zx2c4.com/wireguard/windows v0.0.38 h1:RIXfYUYDCBk5+tsxrnNBRXxIvgnXJc544MrDMFFXj4I= -golang.zx2c4.com/wireguard/windows v0.0.38/go.mod h1:bVbqKzpu4jLrEA2nVNn/WdWyyXGZARZNqkoGHd61DuM= -gopkg.in/Knetic/govaluate.v3 v3.0.0 h1:18mUyIt4ZlRlFZAAfVetz4/rzlJs9yhN+U02F4u1AOc= -gopkg.in/Knetic/govaluate.v3 v3.0.0/go.mod h1:csKLBORsPbafmSCGTEh3U7Ozmsuq8ZSIlKk1bcqph0E= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.7/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= diff --git a/wireguard/wireguard-go-windows/libwg.go b/wireguard/wireguard-go-windows/libwg.go deleted file mode 100644 index a8a5fe50fd..0000000000 --- a/wireguard/wireguard-go-windows/libwg.go +++ /dev/null @@ -1,290 +0,0 @@ -/* SPDX-License-Identifier: Apache-2.0 - * - * Copyright (C) 2017-2019 Jason A. Donenfeld <Jason@zx2c4.com>. All Rights Reserved. - * Copyright (C) 2019 Amagicom AB. All Rights Reserved. - */ - -package main - -// #include <stdlib.h> -// #include <sys/types.h> -// typedef void (__stdcall *LogSink)(unsigned int, const char *, void *); -// static void callLogSink(void *logSink, int level, const char *message, void *context) -// { -// ((LogSink)logSink)((unsigned int)level, message, context); -// } -import "C" - -import ( - "bufio" - "bytes" - "errors" - "log" - "math" - "net" - "runtime" - "strings" - "unsafe" - - "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" -) - -// Define type aliases. -type LogSink = unsafe.Pointer -type LogContext = unsafe.Pointer - -type Logger struct { - sink LogSink - context LogContext - level C.int -} - -func (l *Logger) Write(message []byte) (int, error) { - msg := C.CString(string(message)) - C.callLogSink(l.sink, l.level, msg, l.context) - C.free(unsafe.Pointer(msg)) - return len(message), nil -} - -type TunnelContext struct { - device *device.Device - uapi net.Listener - logger *device.Logger -} - -var tunnels map[int32]TunnelContext - -func init() { - device.RoamingDisabled = true - tunnels = make(map[int32]TunnelContext) -} - -func newLogger(logSink LogSink, logContext LogContext) *device.Logger { - logger := new(device.Logger) - - logger.Debug = log.New( - &Logger{sink: logSink, context: logContext, level: device.LogLevelDebug}, - "", - 0, - ) - logger.Info = log.New( - &Logger{sink: logSink, context: logContext, level: device.LogLevelInfo}, - "", - 0, - ) - logger.Error = log.New( - &Logger{sink: logSink, context: logContext, level: device.LogLevelError}, - "", - 0, - ) - - return logger -} - -// Find next free context slot -func getContextHandle() (int32, error) { - var i int32 - for i = 0; i < math.MaxInt32; i++ { - if _, exists := tunnels[i]; !exists { - break - } - } - - if i == math.MaxInt32 { - return 0, errors.New("Handle table is full") - } - - return i, nil -} - -//export wgTurnOn -func wgTurnOn(cIfaceName *C.char, mtu int, cSettings *C.char, logSink LogSink, logContext LogContext) int32 { - logger := newLogger(logSink, logContext) - - if cIfaceName == nil { - logger.Error.Println("cIfaceName is null") - return -1 - } - - if cSettings == nil { - logger.Error.Println("cSettings is null") - return -1 - } - - contextHandle, err := getContextHandle() - if err != nil { - logger.Error.Println(err) - return -1 - } - - settings := C.GoString(cSettings) - ifaceName := C.GoString(cIfaceName) - - // {AFE43773-E1F8-4EBB-8536-576AB86AFE9A} - networkId := windows.GUID { 0xafe43773, 0xe1f8, 0x4ebb, [8]byte{ 0x85, 0x36, 0x57, 0x6a, 0xb8, 0x6a, 0xfe, 0x9a } } - - watcher, err := watchInterfaces() - if err != nil { - logger.Error.Println(err) - return -1 - } - defer watcher.destroy() - - wintun, err := tun.CreateTUNWithRequestedGUID(ifaceName, &networkId, mtu) - if err != nil { - logger.Error.Println("Failed to create tunnel") - logger.Error.Println(err) - return -1 - } - - nativeTun := wintun.(*tun.NativeTun) - - actualInterfaceName, err := nativeTun.Name() - if err != nil { - nativeTun.Close() - logger.Error.Println("Failed to determine name of wintun adapter") - return -1 - } - - if actualInterfaceName != ifaceName { - // WireGuard picked a different name for the adapter than the one we expected. - // This indicates there is already an adapter with the name we intended to use. - nativeTun.Close() - logger.Error.Println("Failed to create adapter with specific name") - return -1 - } - - device := device.NewDevice(wintun, logger) - - uapi, err := ipc.UAPIListen(ifaceName) - if err != nil { - logger.Error.Println("Failed to start UAPI") - logger.Error.Println(err) - device.Close() - return -1 - } - - setError := device.IpcSetOperation(bufio.NewReader(strings.NewReader(settings))) - if setError != nil { - logger.Error.Println("Failed to set device configuration") - logger.Error.Println(setError) - uapi.Close() - device.Close() - return -1 - } - - device.Up() - - interfaces := []interfaceWatcherEvent{ - { - luid: winipcfg.LUID(nativeTun.LUID()), - family: windows.AF_INET, - }, - { - luid: winipcfg.LUID(nativeTun.LUID()), - family: windows.AF_INET6, - }, - } - - logger.Debug.Println("Waiting for interfaces to attach") - - if !watcher.join(interfaces, 5) { - logger.Error.Println("Failed to wait for IP interfaces to become available") - uapi.Close() - device.Close() - return -1 - } - - logger.Debug.Println("Interfaces OK") - - // Service UAPI. - go func() { - for { - conn, err := uapi.Accept() - if err != nil { - logger.Info.Println("UAPI Accept() failed") - logger.Info.Println(err) - return - } - go device.IpcHandle(conn) - } - }() - - tunnels[contextHandle] = TunnelContext{ - device: device, - uapi: uapi, - logger: logger, - } - - return contextHandle -} - -//export wgTurnOff -func wgTurnOff(contextHandle int32) { - { - context, ok := tunnels[contextHandle] - if !ok { - return - } - delete(tunnels, contextHandle) - context.uapi.Close() - context.device.Close() - } - // Calling twice convinces the GC to release NOW. - runtime.GC() - runtime.GC() -} - -//export wgRebindTunnelSocket -func wgRebindTunnelSocket(family uint16, interfaceIndex uint32) { - for _, tunnel := range tunnels { - blackhole := (interfaceIndex == 0) - if family == windows.AF_INET { - tunnel.logger.Info.Printf("Binding v4 socket to interface %d (blackhole=%v)", interfaceIndex, blackhole) - err := tunnel.device.BindSocketToInterface4(interfaceIndex, blackhole) - if err != nil { - tunnel.logger.Info.Println(err) - } - } else if family == windows.AF_INET6 { - tunnel.logger.Info.Printf("Binding v6 socket to interface %d (blackhole=%v)", interfaceIndex, blackhole) - err := tunnel.device.BindSocketToInterface6(interfaceIndex, blackhole) - if err != nil { - tunnel.logger.Info.Println(err) - } - } - } -} - -//export wgVersion -func wgVersion() *C.char { - return C.CString(device.WireGuardGoVersion) -} - -//export wgGetConfig -func wgGetConfig(tunnelHandle int32) *C.char { - tunnel, ok := tunnels[tunnelHandle] - if !ok { - return nil - } - - settings := new(bytes.Buffer) - writer := bufio.NewWriter(settings) - if err := tunnel.device.IpcGetOperation(writer); err != nil { - tunnel.logger.Error.Println("Failed to get config for tunnel: ", err) - return nil - } - writer.Flush() - return C.CString(settings.String()) -} - -//export wgFreePtr -func wgFreePtr(ptr unsafe.Pointer) { - C.free(ptr) -} - -func main() {} diff --git a/wireguard/wireguard-go/go.mod b/wireguard/wireguard-go/go.mod deleted file mode 100644 index 7827c2848e..0000000000 --- a/wireguard/wireguard-go/go.mod +++ /dev/null @@ -1,8 +0,0 @@ -module github.com/mullvad/mullvadvpn-app/wireguard-go - -go 1.12 - -require ( - golang.org/x/sys v0.0.0-20191003212358-c178f38b412c - golang.zx2c4.com/wireguard v0.0.20200121 -) diff --git a/wireguard/wireguard-go/go.sum b/wireguard/wireguard-go/go.sum deleted file mode 100644 index 20a3d834b5..0000000000 --- a/wireguard/wireguard-go/go.sum +++ /dev/null @@ -1,38 +0,0 @@ -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190513172903-22d7a77e9e5f h1:R423Cnkcp5JABoeemiGEPlt9tHXFfw5kvc0yqlxRPWo= -golang.org/x/crypto v0.0.0-20190513172903-22d7a77e9e5f/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190617133340-57b3e21c3d56 h1:ZpKuNIejY8P0ExLOVyKhb0WsgG8UdvHXe6TWjY7eL6k= -golang.org/x/crypto v0.0.0-20190617133340-57b3e21c3d56/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20191002192127-34f69633bfdc h1:c0o/qxkaO2LF5t6fQrT4b5hzyggAkLLlCUjqfRxd8Q4= -golang.org/x/crypto v0.0.0-20191002192127-34f69633bfdc/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190522155817-f3200d17e092 h1:4QSRKanuywn15aTZvI/mIDEgPQpswuFndXpOj3rKEco= -golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20190613194153-d28f0bde5980 h1:dfGZHvZk057jK2MCeWus/TowKpJ8y4AmooUzdBSR9GU= -golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191003171128-d98b1b443823 h1:Ypyv6BNJh07T1pUSrehkLemqPKXhus2MkfktJ91kRh4= -golang.org/x/net v0.0.0-20191003171128-d98b1b443823/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-20190522044717-8097e1b27ff5 h1:f005F/Jl5JLP036x7QIvUVhNTqxvSYwFIiyOh2q12iU= -golang.org/x/sys v0.0.0-20190522044717-8097e1b27ff5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190618155005-516e3c20635f h1:dHNZYIYdq2QuU6w73vZ/DzesPbVlZVYZTtTZmrnsbQ8= -golang.org/x/sys v0.0.0-20190618155005-516e3c20635f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191003212358-c178f38b412c h1:6Zx7DRlKXf79yfxuQ/7GqV3w2y7aDsk6bGg0MzF5RVU= -golang.org/x/sys v0.0.0-20191003212358-c178f38b412c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs= -golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= -golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.zx2c4.com/wireguard v0.0.20190518-0.20190605110920-108c37a05639 h1:AoX5+g0OBk+KqTTMVl4YPFZ9ioU2tPW1YwtzaVWdORA= -golang.zx2c4.com/wireguard v0.0.20190518-0.20190605110920-108c37a05639/go.mod h1:8X7vp4RrsvM83bde6vQ94DsL4ZpjUViVUym8aa8zGhs= -golang.zx2c4.com/wireguard v0.0.20190805-0.20190805190438-a6aae7b14166 h1:T9pj0ZaaF8Fjy9HraORGjgpY/NxmIFYYc607yVzAsIw= -golang.zx2c4.com/wireguard v0.0.20190805-0.20190805190438-a6aae7b14166/go.mod h1:NFs2tkQT6xXo9kzqGJxObM2MzHhraJi7ZQUmwIqT+tE= -golang.zx2c4.com/wireguard v0.0.20190805-0.20190805190438-b16dba4 h1:vb+nILAYnYsLWs942XZIbSbhHzjezHRl3p7Hqzkx8yE= -golang.zx2c4.com/wireguard v0.0.20190805-0.20190805190438-b16dba4/go.mod h1:NFs2tkQT6xXo9kzqGJxObM2MzHhraJi7ZQUmwIqT+tE= -golang.zx2c4.com/wireguard v0.0.20191012 h1:sdX+y3hrHkW8KJkjY7ZgzpT5Tqo8XnBkH55U1klphko= -golang.zx2c4.com/wireguard v0.0.20191012/go.mod h1:P2HsVp8SKwZEufsnezXZA4GRX/T49/HlU7DGuelXsU4= -golang.zx2c4.com/wireguard v0.0.20191013-0.20191017134306-ae492d1b3599 h1:fHOjo1GyHRI2q/LcFB9NiFTqXB7WRiu2idShqqTwrZ4= -golang.zx2c4.com/wireguard v0.0.20191013-0.20191017134306-ae492d1b3599/go.mod h1:P2HsVp8SKwZEufsnezXZA4GRX/T49/HlU7DGuelXsU4= -golang.zx2c4.com/wireguard v0.0.20200121 h1:vcswa5Q6f+sylDfjqyrVNNrjsFUUbPsgAQTBCAg/Qf8= -golang.zx2c4.com/wireguard v0.0.20200121/go.mod h1:P2HsVp8SKwZEufsnezXZA4GRX/T49/HlU7DGuelXsU4= diff --git a/wireguard/wireguard-go/libwg.go b/wireguard/wireguard-go/libwg.go deleted file mode 100644 index 5f2366c523..0000000000 --- a/wireguard/wireguard-go/libwg.go +++ /dev/null @@ -1,239 +0,0 @@ -/* SPDX-License-Identifier: Apache-2.0 - * - * Copyright (C) 2017-2019 Jason A. Donenfeld <Jason@zx2c4.com>. All Rights Reserved. - * Copyright (C) 2019 Amagicom AB. All Rights Reserved. - */ - -package main - -// #include <stdlib.h> -import "C" -import ( - "bufio" - "bytes" - "fmt" - "io/ioutil" - "log" - "math" - "net" - "os" - "os/signal" - "runtime" - "strings" - "sync" - "unsafe" - - "golang.org/x/sys/unix" - - "golang.zx2c4.com/wireguard/device" - "golang.zx2c4.com/wireguard/ipc" - "golang.zx2c4.com/wireguard/tun" -) - -var ( - logFile *os.File - logFilePath *string - logFileLock sync.RWMutex -) - -type FileLogger struct{} - -func (logger FileLogger) Write(buffer []byte) (int, error) { - logFileLock.RLock() - defer logFileLock.RUnlock() - - return logFile.Write(buffer) -} - -type TunnelHandle struct { - device *device.Device - uapi net.Listener -} - -var tunnelHandles map[int32]TunnelHandle - -func init() { - device.RoamingDisabled = true - tunnelHandles = make(map[int32]TunnelHandle) - signals := make(chan os.Signal) - signal.Notify(signals, unix.SIGUSR2) - go func() { - buf := make([]byte, os.Getpagesize()) - for { - select { - case <-signals: - n := runtime.Stack(buf, true) - buf[n] = 0 - log.Println("WireGuard/GoBackend/StackTrace - ", buf) - } - } - }() -} - -func newLogger(newLogFilePath string, level int) *device.Logger { - openLogFile(newLogFilePath) - - logger := &device.Logger{ - Debug: newLogForLevel(device.LogLevelDebug, level), - Info: newLogForLevel(device.LogLevelInfo, level), - Error: newLogForLevel(device.LogLevelError, level), - } - - return logger -} - -func openLogFile(newLogFilePath string) { - logFileLock.Lock() - defer logFileLock.Unlock() - - if logFilePath == nil || *logFilePath != newLogFilePath { - if logFile != nil { - logFile.Close() - } - - logFilePath = &newLogFilePath - backupLogFile(newLogFilePath) - logFile, _ = os.Create(newLogFilePath) - } -} - -func backupLogFile(path string) { - backupPath := fmt.Sprintf("%s.old.log", strings.TrimSuffix(path, ".log")) - - os.Rename(path, backupPath) -} - -func newLogForLevel(level int, maxLevel int) *log.Logger { - if level > maxLevel { - return log.New(ioutil.Discard, "", log.Ldate|log.Ltime) - } - - logger := &FileLogger{} - - prefix := "" - switch level { - case device.LogLevelDebug: - prefix = "DEBUG: " - case device.LogLevelInfo: - prefix = "INFO: " - case device.LogLevelError: - prefix = "ERROR: " - } - - return log.New(logger, prefix, log.Ldate|log.Ltime) -} - -//export wgTurnOnWithFd -func wgTurnOnWithFd(cIfaceName *C.char, mtu int, cSettings *C.char, fd int, logFilePath *C.char, level int) int32 { - - logger := newLogger(C.GoString(logFilePath), level) - if cIfaceName == nil { - logger.Error.Println("cIfaceName is null") - return -1 - } - - if cSettings == nil { - logger.Error.Println("cSettings is null") - return -1 - } - settings := C.GoString(cSettings) - ifaceName := C.GoString(cIfaceName) - - file := os.NewFile(uintptr(fd), "") - tunDevice, err := tun.CreateTUNFromFile(file, mtu) - if err != nil { - logger.Error.Println(err) - if err.Error() == "bad file descriptor" { - return -2 - } - return -1 - } - - device := device.NewDevice(tunDevice, logger) - - var uapi net.Listener - - uapiFile, err := ipc.UAPIOpen(ifaceName) - if err != nil { - logger.Error.Println(err) - } else { - uapi, err = ipc.UAPIListen(ifaceName, uapiFile) - if err != nil { - logger.Error.Println("Failed to start the UAPI") - logger.Error.Println(err) - uapiFile.Close() - } else { - go func() { - for { - conn, err := uapi.Accept() - if err != nil { - return - } - go device.IpcHandle(conn) - } - }() - } - } - - setError := device.IpcSetOperation(bufio.NewReader(strings.NewReader(settings))) - if setError != nil { - logger.Error.Println(setError) - device.Close() - return -2 - } - var i int32 - for i = 0; i < math.MaxInt32; i++ { - if _, exists := tunnelHandles[i]; !exists { - break - } - } - if i == math.MaxInt32 { - device.Close() - return -1 - } - tunnelHandles[i] = TunnelHandle{device: device, uapi: uapi} - device.Up() - return i -} - -//export wgGetConfig -func wgGetConfig(index int32) *C.char { - handle, ok := tunnelHandles[index] - if !ok { - return nil - } - - settings := new(bytes.Buffer) - writer := bufio.NewWriter(settings) - if err := handle.device.IpcGetOperation(writer); err != nil { - return nil - } - writer.Flush() - return C.CString(settings.String()) -} - -//export wgFreePtr -func wgFreePtr(ptr unsafe.Pointer) { - C.free(ptr) -} - - -//export wgTurnOff -func wgTurnOff(tunnelHandle int32) { - handle, ok := tunnelHandles[tunnelHandle] - if !ok { - return - } - delete(tunnelHandles, tunnelHandle) - if handle.uapi != nil { - handle.uapi.Close() - } - handle.device.Close() -} - -//export wgVersion -func wgVersion() *C.char { - return C.CString(device.WireGuardGoVersion) -} - -func main() {} diff --git a/wireguard/wireguard-go/libwg_android.go b/wireguard/wireguard-go/libwg_android.go deleted file mode 100644 index 778bd59055..0000000000 --- a/wireguard/wireguard-go/libwg_android.go +++ /dev/null @@ -1,114 +0,0 @@ -// +build android -package main - -import ( - "C" - "bufio" - "math" - "net" - "strings" - - "golang.org/x/sys/unix" - - "golang.zx2c4.com/wireguard/device" - "golang.zx2c4.com/wireguard/ipc" - "golang.zx2c4.com/wireguard/tun" -) - -//export wgGetSocketV4 -func wgGetSocketV4(tunnelHandle int32) int32 { - handle, ok := tunnelHandles[tunnelHandle] - if !ok { - return -1 - } - fd, err := handle.device.PeekLookAtSocketFd4() - if err != nil { - return -1 - } - return int32(fd) -} - -//export wgGetSocketV6 -func wgGetSocketV6(tunnelHandle int32) int32 { - handle, ok := tunnelHandles[tunnelHandle] - if !ok { - return -1 - } - fd, err := handle.device.PeekLookAtSocketFd6() - if err != nil { - return -1 - } - return int32(fd) -} - -//export wgTurnOnWithFdAndroid -func wgTurnOnWithFdAndroid(cIfaceName *C.char, mtu int, cSettings *C.char, fd int, logFilePath *C.char, level int) int32 { - - logger := newLogger(C.GoString(logFilePath), level) - if cIfaceName == nil { - logger.Error.Println("cIfaceName is null") - return -1 - } - - if cSettings == nil { - logger.Error.Println("cSettings is null") - return -1 - } - settings := C.GoString(cSettings) - ifaceName := C.GoString(cIfaceName) - - tunDevice, ifaceName, err := tun.CreateUnmonitoredTUNFromFD(fd) - if err != nil { - logger.Error.Println(err) - unix.Close(fd) - if err.Error() == "bad file descriptor" { - return -2 - } - return -1 - } - device := device.NewDevice(tunDevice, logger) - - var uapi net.Listener - - uapiFile, err := ipc.UAPIOpen(ifaceName) - if err != nil { - logger.Error.Println(err) - } else { - uapi, err = ipc.UAPIListen(ifaceName, uapiFile) - if err != nil { - logger.Error.Println("Failed to start the UAPI") - logger.Error.Println(err) - uapiFile.Close() - } else { - go func() { - for { - conn, err := uapi.Accept() - if err != nil { - return - } - go device.IpcHandle(conn) - } - }() - } - } - - setError := device.IpcSetOperation(bufio.NewReader(strings.NewReader(settings))) - if setError != nil { - logger.Error.Println(setError) - device.Close() - return -2 - } - var i int32 - for i = 0; i < math.MaxInt32; i++ { - if _, exists := tunnelHandles[i]; !exists { - break - } - } - if i == math.MaxInt32 { - device.Close() - return -1 - } - tunnelHandles[i] = TunnelHandle{device: device, uapi: uapi} - device.Up() - return i -} |
