diff --git a/pynitrokey/fido2/client.py b/pynitrokey/fido2/client.py index 485e8659..80d200bf 100644 --- a/pynitrokey/fido2/client.py +++ b/pynitrokey/fido2/client.py @@ -8,12 +8,12 @@ import sys import tempfile import time -from typing import Optional, Tuple, Union +from typing import Callable, Optional, Tuple, Union from fido2.ctap import CtapError from fido2.ctap1 import Ctap1 from fido2.ctap2.base import Ctap2 -from fido2.hid import CTAPHID, CtapHidDevice, open_device +from fido2.hid import CTAPHID, CtapHidDevice, HidDescriptor, list_descriptors, open_connection, open_device from intelhex import IntelHex import pynitrokey.exceptions @@ -21,20 +21,23 @@ from pynitrokey.fido2.commands import SoloBootloader, SoloExtension from pynitrokey.helpers import local_critical +VIDPID = [(0x0483, 0xA2CA), # + (0x20A0, 0x42B3), # ... + (0x20A0, 0x42B1) # NK FIDO2 +] -def list_ctaphid_devices() -> list[CtapHidDevice]: - hid_devices = list(CtapHidDevice.list_devices()) +def list_ctaphid_descriptors() -> list[HidDescriptor]: return [ - d - for d in hid_devices - if (d.descriptor.vid, d.descriptor.pid) - in [ - (0x0483, 0xA2CA), # - (0x20A0, 0x42B3), # ... - (0x20A0, 0x42B1), # NK FIDO2 - ] + desc + for desc in list_descriptors() + if (desc.vid, desc.pid) in VIDPID ] +def list_ctaphid_devices() -> list[CtapHidDevice]: + return [ + CtapHidDevice(desc, open_connection(desc)) + for desc in list_ctaphid_descriptors() + ] class NKFido2Client: def __init__(self) -> None: @@ -69,8 +72,11 @@ def find_device( solo_serial = solo_serial.split("=")[1] found_dev = open_device(solo_serial) else: - devices = list_ctaphid_devices() - devices = [d for d in devices if d.descriptor.serial_number == solo_serial] + devices = [ + CtapHidDevice(desc, open_connection(desc)) + for desc in list_ctaphid_descriptors() + if desc.serial_number == solo_serial + ] else: devices = list_ctaphid_devices() if len(devices) > 1: