def activate(self, new_file): # user approved the HSM activation, so apply it. from main import pa, dis import main assert not main.hsm_active main.hsm_active = self self.start_time = utime.ticks_ms() if new_file: dis.fullscreen("Saving...") # save config for next run with open(POLICY_FNAME, 'w+t') as f: ujson.dump(self.save(), f) # that changes the flash, so need to update # the hash stored in SE pa.greenlight_firmware() dis.show() if self.set_sl: self.save_storage_locker() self.reset_period() if self.boot_to_hsm and not new_file: # In boot-to-HSM mode, we cant be sure PIN holder has authority # to spend, so maybe they are rebooting to reset the period. # Assume period has already been used up (conservative model) for r in self.rules: if r.per_period: self.record_spend(r, r.per_period)
async def bless_flash(*a): # make green LED turn on from main import pa, dis if pa.is_secondary: await needs_primary() return # do it pa.greenlight_firmware() dis.show()
async def ship_wo_bag(*a): # Factory command: for dev and test units that have no bag number, and never will. ok = await ux_confirm('''Not recommended! DO NOT USE for units going to paying customers.''') if not ok: return import callgate from main import dis, pa, is_devmode failed = callgate.set_bag_number(b'NOT BAGGED') # 32 chars max if failed: await ux_dramatic_pause('FAILED', 30) else: # lock the bootrom firmware forever callgate.set_rdp_level(2 if not is_devmode else 0) # bag number affects green light status (as does RDP level) pa.greenlight_firmware() dis.fullscreen('No Bag. DONE') callgate.show_logout(1)
def set_genuine(): # PIN must be blank for this to work # - or logged in already as main from main import pa if pa.is_secondary: return if not pa.is_successful(): # assume blank pin during factory selftest pa.setup(b'') assert not pa.is_delay_needed() # "PIN failures?" if not pa.is_successful(): pa.login() assert pa.is_successful() # "PIN not blank?" # do verify step pa.greenlight_firmware() dis.show()
def handle_bag_number(self, bag_num): import version, callgate from main import dis, pa, is_devmode, settings if version.is_factory_mode() and bag_num: # check state first assert settings.get('tested', False) assert pa.is_blank() assert bag_num[0:2] == b'C0' and len(bag_num) == 8 # do the change failed = callgate.set_bag_number(bag_num) assert not failed callgate.set_rdp_level(2 if not is_devmode else 0) pa.greenlight_firmware() dis.fullscreen(bytes(bag_num).decode()) self.call_after(callgate.show_logout, 1) # always report the existing/new value val = callgate.get_bag_number() or b'' return b'asci' + val
async def start_login_sequence(): # Boot up login sequence here. # from main import pa, settings, dis, loop, numpad import version if pa.is_blank(): # Blank devices, with no PIN set all, can continue w/o login # Do green-light set immediately after firmware upgrade if version.is_fresh_version(): pa.greenlight_firmware() dis.show() goto_top_menu() return # Allow impatient devs and crazy people to skip the PIN guess = settings.get('_skip_pin', None) if guess is not None: try: dis.fullscreen("(Skip PIN)") pa.setup(guess) pa.login() except: pass # if that didn't work, or no skip defined, force # them to login succefully. while not pa.is_successful(): # always get a PIN and login first await block_until_login() # Must read settings after login settings.set_key() settings.load() # Restore a login preference or two numpad.sensitivity = settings.get('sens', numpad.sensitivity) # Do green-light set immediately after firmware upgrade if not pa.is_secondary: if version.is_fresh_version(): pa.greenlight_firmware() dis.show() # Populate xfp/xpub values, if missing. # - can happen for first-time login of duress wallet # - may indicate lost settings, which we can easily recover from # - these values are important to USB protocol if not (settings.get('xfp', 0) and settings.get('xpub', 0)) and not pa.is_secret_blank(): try: import stash # Recalculate xfp/xpub values (depends both on secret and chain) with stash.SensitiveValues() as sv: sv.capture_xpub() except Exception as exc: # just in case, keep going; we're not useless and this # is early in boot process print("XFP save failed: %s" % exc) # Allow USB protocol, now that we are auth'ed from usb import enable_usb enable_usb(loop, False) goto_top_menu()
async def start_login_sequence(): # Boot up login sequence here. # from main import pa, settings, dis, loop, numpad from ux import idle_logout if pa.is_blank(): # Blank devices, with no PIN set all, can continue w/o login # Do green-light set immediately after firmware upgrade if version.is_fresh_version(): pa.greenlight_firmware() dis.show() goto_top_menu() return # maybe show a nickname before we do anything nickname = settings.get('nick', None) if nickname: try: await show_nickname(nickname) except: pass # Allow impatient devs and crazy people to skip the PIN guess = settings.get('_skip_pin', None) if guess is not None: try: dis.fullscreen("(Skip PIN)") pa.setup(guess) pa.login() except: pass # if that didn't work, or no skip defined, force # them to login succefully. while not pa.is_successful(): # always get a PIN and login first await block_until_login() # Must re-read settings after login settings.set_key() settings.load() # implement "login countdown" feature delay = settings.get('lgto', 0) if delay: pa.reset() await login_countdown(delay) await block_until_login() # implement idle timeout now that we are logged-in loop.create_task(idle_logout()) # Do green-light set immediately after firmware upgrade if not pa.is_secondary: if version.is_fresh_version(): pa.greenlight_firmware() dis.show() # Populate xfp/xpub values, if missing. # - can happen for first-time login of duress wallet # - may indicate lost settings, which we can easily recover from # - these values are important to USB protocol if not (settings.get('xfp', 0) and settings.get('xpub', 0)) and not pa.is_secret_blank(): try: import stash # Recalculate xfp/xpub values (depends both on secret and chain) with stash.SensitiveValues() as sv: sv.capture_xpub() except Exception as exc: # just in case, keep going; we're not useless and this # is early in boot process print("XFP save failed: %s" % exc) # If HSM policy file is available, offer to start that, # **before** the USB is even enabled. if version.has_fatram: try: import hsm, hsm_ux if hsm.hsm_policy_available(): ar = await hsm_ux.start_hsm_approval(usb_mode=False, startup_mode=True) if ar: await ar.interact() except: pass # Allow USB protocol, now that we are auth'ed from usb import enable_usb enable_usb(loop, False) goto_top_menu()