def init(self, expect_initialized: Optional[bool] = True) -> bitbox02.BitBox02: if self.bb02 is not None: return self.bb02 for device_info in devices.get_any_bitbox02s(): if device_info["path"].decode() == self.device_path: bb02 = bitbox02.BitBox02( transport=self.transport, device_info=device_info, noise_config=self.noise_config, ) try: bb02.check_min_version() except FirmwareVersionOutdatedException as exc: sys.stderr.write("WARNING: {}\n".format(exc)) raise self.bb02 = bb02 is_initialized = bb02.device_info()["initialized"] if expect_initialized is not None: if expect_initialized: if not is_initialized: raise HWWError( "The BitBox02 must be initialized first.", DEVICE_NOT_INITIALIZED, ) elif is_initialized: raise UnavailableActionError( "The BitBox02 must be wiped before setup.") return bb02 raise Exception( "Could not find the hid device info for path {}".format( self.device_path))
def enumerate(password: str = "") -> List[Dict[str, object]]: """ Enumerate all BitBox02 devices. Bootloaders excluded. """ result = [] for device_info in devices.get_any_bitbox02s(): path = device_info["path"].decode() client = Bitbox02Client(path) client.set_noise_config(SilentNoiseConfig()) d_data: Dict[str, object] = {} bb02 = None with handle_errors(common_err_msgs["enumerate"], d_data): bb02 = client.init(expect_initialized=None) version, platform, edition, unlocked = bitbox02.BitBox02.get_info( client.transport ) if platform != Platform.BITBOX02: client.close() continue if edition not in (BitBox02Edition.MULTI, BitBox02Edition.BTCONLY): client.close() continue assert isinstance(edition, BitBox02Edition) d_data.update( { "type": "bitbox02", "path": path, "model": { BitBox02Edition.MULTI: "bitbox02_multi", BitBox02Edition.BTCONLY: "bitbox02_btconly", }[edition], "needs_pin_sent": False, "needs_passphrase_sent": False, } ) if bb02 is not None: with handle_errors(common_err_msgs["enumerate"], d_data): if not bb02.device_info()["initialized"]: raise DeviceNotReadyError( "BitBox02 is not initialized. Please initialize it using the BitBoxApp." ) elif not unlocked: raise DeviceNotReadyError( "Please load wallet to unlock." if _using_external_gui else "Please use any subcommand to unlock" ) d_data["fingerprint"] = client.get_master_fingerprint().hex() result.append(d_data) client.close() return result
def __init__(self, handler: Any, device: Device, config: SimpleConfig, *, plugin: HW_PluginBase): HardwareClientBase.__init__(self, plugin=plugin) self.bitbox02_device = None # type: Optional[bitbox02.BitBox02] self.handler = handler self.device_descriptor = device self.config = config self.bitbox_hid_info = None if self.config.get("bitbox02") is None: bitbox02_config: dict = { "remote_static_noise_keys": [], "noise_privkey": None, } self.config.set_key("bitbox02", bitbox02_config) bitboxes = devices.get_any_bitbox02s() for bitbox in bitboxes: if (bitbox["path"] == self.device_descriptor.path and bitbox["interface_number"] == self.device_descriptor.interface_number): self.bitbox_hid_info = bitbox if self.bitbox_hid_info is None: raise Exception("No BitBox02 detected")