Skip to content

Commit

Permalink
wintun: make remaining HWID comparisons case insensitive
Browse files Browse the repository at this point in the history
c85e4a4 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 <[email protected]>
  • Loading branch information
rozmansi authored and zx2c4 committed May 2, 2020
1 parent ef334e9 commit 653c9de
Showing 1 changed file with 19 additions and 2 deletions.
21 changes: 19 additions & 2 deletions tun/wintun/wintun_windows.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
}

Expand Down Expand Up @@ -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
}

Expand Down Expand Up @@ -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
}

0 comments on commit 653c9de

Please sign in to comment.