go-ethereum
go-ethereum copied to clipboard
Investigation of USB wallets, linux / mac / windows
This ticket is meant to soup up the information gathered when investigating https://github.com/ethereum/go-ethereum/pull/28516.
Linux
On linux
, it enumerates three devices. NB: the ledger udev-rules must be applied for any of this to work.
-
usb.DeviceInfo{Path:"2c97:4015:01", VendorID:0x2c97, ProductID:0x4015, Release:0x0, Serial:"", Manufacturer:"", Product:"", UsagePage:0x0, Usage:0x0, Interface:2, rawDevice:(*usb._Ctype_struct_libusb_device)(0x7c09bc009590), rawPort:(*uint8)(0xc0007ac050), rawReader:(*uint8)(0xc0007ac040), rawWriter:(*uint8)(0xc0007ac041)}
-
usb.DeviceInfo{Path:"0001:0005:00", VendorID:0x2c97, ProductID:0x4015, Release:0x201, Serial:"0001", Manufacturer:"Ledger", Product:"Nano X", UsagePage:0x0, Usage:0x0, Interface:0, rawDevice:interface {}(nil), rawPort:(*uint8)(nil), rawReader:(*uint8)(nil), rawWriter:(*uint8)(nil)}
-
usb.DeviceInfo{Path:"0001:0005:01", VendorID:0x2c97, ProductID:0x4015, Release:0x201, Serial:"0001", Manufacturer:"Ledger", Product:"Nano X", UsagePage:0x0, Usage:0x0, Interface:1, rawDevice:interface {}(nil), rawPort:(*uint8)(nil), rawReader:(*uint8)(nil), rawWriter:(*uint8)(nil)}
The enumeration covers both raw
and hid
, and the first device is a raw
.
The selection process will select device number 1
(the hid device "0001:0005:00"
),
-
ProductID
0x4015
is matched on all -
hub.UsageID(0xffa0)
==device.UsagePage(0x0)
(not matched on any) -
info.Interface
2
,0
,1
is matched tohub.endpointID=0
on device1
.
However, both devices 0
and 1
works fine, only the second HID does not work (derive accounts)
Device zero:
INFO [12-20|08:21:15.246] New wallet appeared url=ledger://2c97:4015:01 status="Ethereum app v1.9.19 online"
Device one:
INFO [12-20|08:22:26.688] New wallet appeared url=ledger://0001:0002:00 status="Ethereum app v1.9.19 online"
Mac
On mac
, it also enumerates three devices, the first being a raw
and latter two are hid
.
-
usb.DeviceInfo{Path:"2c97:4015:01", VendorID:0x2c97, ProductID:0x4015, Release:0x0, Serial:"", Manufacturer:"", Product:"", UsagePage:0x0, Usage:0x0, Interface:2, rawDevice:(*usb._Ctype_struct_libusb_device)(0x6000003cc3c0), rawPort:(*uint8)(0x140002e84a8), rawReader:(*uint8)(0x140002e8498), rawWriter:(*uint8)(0x140002e8499)}
-
usb.DeviceInfo{Path:"", VendorID:0x2c97, ProductID:0x4015, Release:0x201, Serial:"0001", Manufacturer:"Ledger", Product:"Nano X", UsagePage:0xffa0, Usage:0x1, Interface:-1, rawDevice:interface {}(nil), rawPort:(*uint8)(nil), rawReader:(*uint8)(nil), rawWriter:(*uint8)(nil)}
-
usb.DeviceInfo{Path:"", VendorID:0x2c97, ProductID:0x4015, Release:0x201, Serial:"0001", Manufacturer:"Ledger", Product:"Nano X", UsagePage:0xf1d0, Usage:0x1, Interface:-1, rawDevice:interface {}(nil), rawPort:(*uint8)(nil), rawReader:(*uint8)(nil), rawWriter:(*uint8)(nil)}
The selection process will select device 1
:
-
ProductID
0x4015
is matched on all -
hub.UsageID(0xffa0)
==device.UsagePage
matched on device1
. -
hub.endpointID=0
==info.Interface
is not matched on any (2
,-1
,-1
).
@lightclient didn't you get the result that none were matched? Please help amend this.
On mac, only device 0
, the raw
device, works properly (open + derive addresses).
Curious, I tested the https://github.com/todbot/hidapitester (based on hidapi), with the same Nano X plugged in
$ ./hidapitester --list-detail
2C97/4015: Ledger - Nano X
vendorId: 0x2C97
productId: 0x4015
usagePage: 0xFFA0
usage: 0x0001
serial_number: 0001
interface: 0
path: /dev/hidraw0
2C97/4015: Ledger - Nano X
vendorId: 0x2C97
productId: 0x4015
usagePage: 0xF1D0
usage: 0x0001
serial_number: 0001
interface: 1
path: /dev/hidraw1
It lists only the raw
device, and also it obtains a UsagePage
of 0xF1D0
, which our lib does not.
According to @lightclient , this PR https://github.com/karalabe/usb/pull/43 which contains an updated hid-library, fixes the problems on macosx14.
To be clear, a short-term work around for someone needing this fixed immediately is https://github.com/ethereum/go-ethereum/pull/28516
However the correct solution is to fix karalabe/usb
upstream.