diff options
Diffstat (limited to 'daemon/kmd/wallet/driver/ledger_hid.go')
-rw-r--r-- | daemon/kmd/wallet/driver/ledger_hid.go | 13 |
1 files changed, 12 insertions, 1 deletions
diff --git a/daemon/kmd/wallet/driver/ledger_hid.go b/daemon/kmd/wallet/driver/ledger_hid.go index 22a8e05ac..8094df50b 100644 --- a/daemon/kmd/wallet/driver/ledger_hid.go +++ b/daemon/kmd/wallet/driver/ledger_hid.go @@ -25,6 +25,7 @@ import ( ) const ledgerVendorID = 0x2c97 +const ledgerUsagePage = 0xffa0 // LedgerUSB is a wrapper around a Ledger USB HID device, used to implement // the protocol used for sending messages to the application running on the @@ -82,7 +83,11 @@ func (l *LedgerUSB) WritePackets(msg []byte) error { if err != nil { return err } - if cc != len(packet) { + // on Windows: + // The usb library adds one extra byte to the input passed to the USB device + // so the written bytes are larger than what we've send + // https://github.com/karalabe/hid/blob/9c14560f9ee858c43f40b5cd01392b167aacf4e8/hid_enabled.go#L167 + if cc < len(packet) { return fmt.Errorf("WritePackets: short write: %d != %d", cc, len(packet)) } @@ -202,7 +207,13 @@ func LedgerEnumerate() ([]hid.DeviceInfo, error) { } var infos []hid.DeviceInfo + // The enumeration process is based on: + // https://github.com/LedgerHQ/blue-loader-python/blob/master/ledgerblue/comm.py#L212 + // we search for the Ledger Vendor id and igonre devices that don't have specific usagepage or interface for _, info := range hid.Enumerate(ledgerVendorID, 0) { + if info.UsagePage != ledgerUsagePage && info.Interface != 0 { + continue + } infos = append(infos, info) } |