Skip to content

Commit

Permalink
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
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 <simon@rozman.si>
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
@@ -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
}

0 comments on commit 653c9de

Please sign in to comment.