예제 #1
0
    def create_client(self, device, handler):
        from trezorlib.transport.hid import HidTransport
        try:
            self.print_error("connecting to device at", device.path)
            if device.path is None:
                devices = HidTransport.enumerate()
                if not devices:
                    raise Exception("No OCTO device found") from None
                d = devices[0]
                transport = Device(d.get_path(), -1, d.get_path(), 'OCTO', 0)
            else:
                # if not device.path.startswith('hid'):
                #    raise Exception("Unknown path prefix '%s'" % device.path)
                transport = HidTransport.find_by_path(device.path)
        except BaseException as e:
            self.print_error("cannot connect at", device.path, str(e))
            return None

        if not transport:
            self.print_error("cannot connect at", device.path)
            return

        print("connected to device at {}".format(device.path), flush=True)
        client = self.client_class(transport, handler, self)

        # Try a ping for device sanity
        try:
            client.ping('t')
        except BaseException as e:
            self.print_error("ping failed", str(e))
            return None

        return client
예제 #2
0
 def enumerate(self):
     devices = self.transport_handler.enumerate_devices()
     return [Device(path=d.get_path(),
                    interface_number=-1,
                    id_=d.get_path(),
                    product_key='Safe-T mini',
                    usage_page=0,
                    transport_ui_string=d.get_path())
             for d in devices]
예제 #3
0
    def detect_simulator(self):
        # if there is a simulator running on this machine,
        # return details about it so it's offered as a pairing choice
        fn = CKCC_SIMULATOR_PATH

        if os.path.exists(fn):
            return [Device(fn, -1, fn, (COINKITE_VID, CKCC_SIMULATED_PID), 0)]

        return []
 def enumerate(self):
     devices = trezorlib.transport.enumerate_devices()
     return [Device(path=d.get_path(),
                    interface_number=-1,
                    id_=d.get_path(),
                    product_key=TREZOR_PRODUCT_KEY,
                    usage_page=0,
                    transport_ui_string=d.get_path())
             for d in devices]
예제 #5
0
 def enumerate(self):
     from keepkeylib.transport_webusb import WebUsbTransport
     results = []
     for dev in WebUsbTransport.enumerate():
         path = self._dev_to_str(dev)
         results.append(Device(path=path,
                               interface_number=-1,
                               id_=path,
                               product_key=(dev.getVendorID(), dev.getProductID()),
                               usage_page=0,
                               transport_ui_string=f"webusb:{path}"))
     return results
예제 #6
0
    def enumerate_serial(self):
        # Jade is not really an HID device, it shows as a serial/com port device.
        # Scan com ports looking for the relevant vid and pid, and use 'path' to
        # hold the path to the serial port device, eg. /dev/ttyUSB0
        devices = []
        for devinfo in list_ports.comports():
            device_product_key = (devinfo.vid, devinfo.pid)
            if device_product_key in self.DEVICE_IDS:
                device = Device(path=devinfo.device,
                                interface_number=-1,
                                id_=devinfo.serial_number,
                                product_key=device_product_key,
                                usage_page=-1,
                                transport_ui_string=devinfo.device)
                devices.append(device)

        # Maybe look for Jade Qemu simulator if the vars are set (experimental)
        if self.SIMULATOR_PATH is not None and self.SIMULATOR_TEST_SEED is not None:
            try:
                # If we can connect to a simulator and poke a seed in, add that too
                client = Jade_Client(self.SIMULATOR_PATH, plugin=self)
                device = Device(path=self.SIMULATOR_PATH,
                                interface_number=-1,
                                id_='Jade Qemu Simulator',
                                product_key=self.DEVICE_IDS[0],
                                usage_page=-1,
                                transport_ui_string='simulator')
                if client.jade.set_seed(self.SIMULATOR_TEST_SEED):
                    devices.append(device)
                client.close()
            except Exception as e:
                # If we get any sort of error do not add the simulator
                _logger.debug(
                    "Failed to connect to Jade simulator at {}".format(
                        self.SIMULATOR_PATH))
                _logger.debug(e)

        return devices
예제 #7
0
    def detect_simulator(self):
        # if there is a simulator running on this machine,
        # return details about it so it's offered as a pairing choice
        fn = CKCC_SIMULATOR_PATH

        if os.path.exists(fn):
            return [Device(path=fn,
                           interface_number=-1,
                           id_=fn,
                           product_key=(COINKITE_VID, CKCC_SIMULATED_PID),
                           usage_page=0,
                           transport_ui_string='simulator')]

        return []
예제 #8
0
 def create_device_from_hid_enumeration(self, d: dict, *, product_key) -> 'Device':
     # Older versions of hid don't provide interface_number
     interface_number = d.get('interface_number', -1)
     usage_page = d['usage_page']
     id_ = d['serial_number']
     if len(id_) == 0:
         id_ = str(d['path'])
     id_ += str(interface_number) + str(usage_page)
     device = Device(path=d['path'],
                     interface_number=interface_number,
                     id_=id_,
                     product_key=product_key,
                     usage_page=usage_page,
                     transport_ui_string='hid')
     return device
예제 #9
0
 def enumerate(self):
     # If there is a bridge, prefer that.
     # On Windows, the bridge runs as Admin (and Electrum usually does not),
     # so the bridge has better chances of finding devices. see #5420
     # This also avoids duplicate entries.
     if self.is_bridge_available():
         devices = BridgeTransport.enumerate()
     else:
         devices = trezorlib.transport.enumerate_devices()
     return [Device(path=d.get_path(),
                    interface_number=-1,
                    id_=d.get_path(),
                    product_key=TREZOR_PRODUCT_KEY,
                    usage_page=0,
                    transport_ui_string=d.get_path())
             for d in devices]
예제 #10
0
 def create_device_from_hid_enumeration(self, d: dict, *,
                                        product_key) -> Optional['Device']:
     # note: id_ needs to be unique between simultaneously connected devices,
     #       and ideally unchanged while a device is connected.
     # Older versions of hid don't provide interface_number
     interface_number = d.get('interface_number', -1)
     usage_page = d['usage_page']
     # id_=str(d['path']) in itself might be sufficient, but this had to be touched
     # a number of times already, so let's just go for the overkill approach:
     id_ = f"{d['path']},{d['serial_number']},{interface_number},{usage_page}"
     device = Device(path=d['path'],
                     interface_number=interface_number,
                     id_=id_,
                     product_key=product_key,
                     usage_page=usage_page,
                     transport_ui_string='hid')
     return device
예제 #11
0
 def enumerate(self):
     devices = self.transport_handler.enumerate_devices()
     return [
         Device(d.get_path(), -1, d.get_path(), 'TREZOR', 0)
         for d in devices
     ]
예제 #12
0
 def enumerate(self):
     from trezorlib.transport.hid import HidTransport
     devices = HidTransport.enumerate()
     return [
         Device(d.get_path(), -1, d.get_path(), 'OCTO', 0) for d in devices
     ]