def start(self): self.emulator_log = open('trezor-{}-emulator.stdout'.format(self.model), 'a') # Start the Trezor emulator self.emulator_proc = subprocess.Popen(['./' + os.path.basename(self.emulator_path)], cwd=os.path.dirname(self.emulator_path), stdout=self.emulator_log, env={'SDL_VIDEODRIVER': 'dummy', 'PYOPT': '0'}, shell=True, preexec_fn=os.setsid) # Wait for emulator to be up # From https://github.com/trezor/trezor-firmware/blob/master/legacy/script/wait_for_emulator.py sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) sock.connect(('127.0.0.1', 21324)) sock.settimeout(0) while True: try: sock.sendall(b"PINGPING") r = sock.recv(8) if r == b"PONGPONG": break except Exception: time.sleep(0.05) # Setup the emulator for dev in enumerate_devices(): # Find the udp transport, that's the emulator if isinstance(dev, UdpTransport): wirelink = dev break client = TrezorClientDebugLink(wirelink) client.init_device() device.wipe(client) load_device_by_mnemonic(client=client, mnemonic='alcohol woman abuse must during monitor noble actual mixed trade anger aisle', pin='', passphrase_protection=False, label='test') # From Trezor device tests atexit.register(self.stop) return client
def start(self): # Start the Keepkey emulator self.emulator_proc = subprocess.Popen(['./' + os.path.basename(self.emulator_path)], cwd=os.path.dirname(self.emulator_path), stdout=subprocess.DEVNULL) # Wait for emulator to be up # From https://github.com/trezor/trezor-mcu/blob/master/script/wait_for_emulator.py sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) sock.connect(('127.0.0.1', 21324)) sock.settimeout(0) while True: try: sock.sendall(b"PINGPING") r = sock.recv(8) if r == b"PONGPONG": break except Exception: time.sleep(0.05) # Setup the emulator for dev in enumerate_devices(): # Find the udp transport, that's the emulator if isinstance(dev, UdpTransport): wirelink = dev break client = TrezorClientDebugLink(wirelink) client.init_device() device.wipe(client) load_device_by_mnemonic(client=client, mnemonic='alcohol woman abuse must during monitor noble actual mixed trade anger aisle', pin='', passphrase_protection=False, label='test') # From Trezor device tests return client
def enumerate(password=""): results = [] for dev in enumerate_devices(): # enumerate_devices filters to Trezors and Keepkeys. # Only allow Trezors and unknowns. Unknown devices will reach the check for vendor later if dev.get_usb_vendor_id() not in TREZOR_VENDOR_IDS | {-1}: continue d_data = {} d_data["type"] = "trezor" d_data["path"] = dev.get_path() client = None with handle_errors(common_err_msgs["enumerate"], d_data): client = TrezorClient(d_data["path"], password) client.client.init_device() if "trezor" not in client.client.features.vendor: continue d_data["model"] = "trezor_" + client.client.features.model.lower() if d_data["path"] == "udp:127.0.0.1:21324": d_data["model"] += "_simulator" d_data["needs_pin_sent"] = (client.client.features.pin_protection and not client.client.features.pin_cached) if client.client.features.model == "1": d_data["needs_passphrase_sent"] = ( client.client.features.passphrase_protection ) # always need the passphrase sent for Trezor One if it has passphrase protection enabled else: d_data["needs_passphrase_sent"] = False if d_data["needs_pin_sent"]: raise DeviceNotReadyError( "Trezor is locked. Unlock by using 'promptpin' and then 'sendpin'." ) if d_data["needs_passphrase_sent"] and not password: raise DeviceNotReadyError( "Passphrase needs to be specified before the fingerprint information can be retrieved" ) if client.client.features.initialized: d_data["fingerprint"] = client.get_master_fingerprint_hex() # Passphrase is always needed for the above to have worked, # so it's already sent d_data["needs_passphrase_sent"] = False else: d_data["error"] = "Not initialized" d_data["code"] = DEVICE_NOT_INITIALIZED if client: client.close() results.append(d_data) return results
def enumerate(password=''): results = [] for dev in enumerate_devices(): # enumerate_devices filters to Trezors and Keepkeys. # Only allow Trezors and unknowns. Unknown devices will reach the check for vendor later if dev.get_usb_vendor_id() not in TREZOR_VENDOR_IDS | {-1}: continue d_data = {} d_data['type'] = 'trezor' d_data['path'] = dev.get_path() client = None with handle_errors(common_err_msgs["enumerate"], d_data): client = TrezorClient(d_data['path'], password) client.client.init_device() if 'trezor' not in client.client.features.vendor: continue d_data['model'] = 'trezor_' + client.client.features.model.lower() if d_data['path'] == 'udp:127.0.0.1:21324': d_data['model'] += '_simulator' d_data[ 'needs_pin_sent'] = client.client.features.pin_protection and not client.client.features.pin_cached if client.client.features.model == '1': d_data[ 'needs_passphrase_sent'] = client.client.features.passphrase_protection # always need the passphrase sent for Trezor One if it has passphrase protection enabled else: d_data['needs_passphrase_sent'] = False if d_data['needs_pin_sent']: raise DeviceNotReadyError( 'Trezor is locked. Unlock by using \'promptpin\' and then \'sendpin\'.' ) if d_data['needs_passphrase_sent'] and not password: raise DeviceNotReadyError( "Passphrase needs to be specified before the fingerprint information can be retrieved" ) if client.client.features.initialized: d_data['fingerprint'] = client.get_master_fingerprint_hex() d_data[ 'needs_passphrase_sent'] = False # Passphrase is always needed for the above to have worked, so it's already sent else: d_data['error'] = 'Not initialized' d_data['code'] = DEVICE_NOT_INITIALIZED if client: client.close() results.append(d_data) return results