summaryrefslogtreecommitdiffhomepage
path: root/tun/wintun
diff options
context:
space:
mode:
authorSimon Rozman <simon@rozman.si>2020-05-02 08:49:35 +0200
committerJason A. Donenfeld <Jason@zx2c4.com>2020-05-02 01:50:47 -0600
commitfdba6c183aa8d4c19680f436517624038a6f3be5 (patch)
tree07a8a32a00d3c751bd88d98ee8448539bb95d74e /tun/wintun
parent250b9795f3670981f5e276773307e9638ec0aee2 (diff)
wintun: make remaining HWID comparisons case insensitive
c85e4a410f27986a2967a49c0155633c716bf3ca introduced preliminary HWID checking to speed up Wintun adapter enumeration. However, all HWID are case insensitive by Windows convention. Furthermore, a device might have multiple HWIDs. When DevInfo's DeviceRegistryProperty(SPDRP_HARDWAREID) method returns []string, all strings returned should be checked against given hardware ID. This issue was discovered when researching Wintun and wireguard-go on Windows 10 ARM64. The Wintun adapter was created using devcon.exe utility with "wintun" hardware ID, causing wireguard-go fail to enumerate the adapter properly. Signed-off-by: Simon Rozman <simon@rozman.si>
Diffstat (limited to 'tun/wintun')
-rw-r--r--tun/wintun/wintun_windows.go21
1 files changed, 19 insertions, 2 deletions
diff --git a/tun/wintun/wintun_windows.go b/tun/wintun/wintun_windows.go
index 4c12d97..3aada08 100644
--- a/tun/wintun/wintun_windows.go
+++ b/tun/wintun/wintun_windows.go
@@ -136,7 +136,7 @@ func (pool Pool) GetInterface(ifname string) (*Interface, error) {
if err != nil {
continue
}
- if hwids, ok := property.([]string); ok && len(hwids) > 0 && hwids[0] != hardwareID {
+ if !isOurHardwareID(property) {
continue
}
@@ -508,7 +508,7 @@ func (pool Pool) DeleteMatchingInterfaces(matches func(wintun *Interface) bool)
if err != nil {
continue
}
- if hwids, ok := property.([]string); ok && len(hwids) > 0 && hwids[0] != hardwareID {
+ if !isOurHardwareID(property) {
continue
}
@@ -801,3 +801,20 @@ func (wintun *Interface) GUID() windows.GUID {
func (wintun *Interface) LUID() uint64 {
return ((uint64(wintun.luidIndex) & ((1 << 24) - 1)) << 24) | ((uint64(wintun.ifType) & ((1 << 16) - 1)) << 48)
}
+
+func isOurHardwareID(property interface{}) bool {
+ hwidLC := strings.ToLower(hardwareID)
+
+ if hwids, ok := property.([]string); ok && len(hwids) > 0 {
+ for i := range hwids {
+ if strings.ToLower(hwids[i]) == hwidLC {
+ return true
+ }
+ }
+ }
+ if hwid, ok := property.(string); ok && strings.ToLower(hwid) == hwidLC {
+ return true
+ }
+
+ return false
+}