Skip to content

Commit

Permalink
SFT-1728: importing temporary seed working
Browse files Browse the repository at this point in the history
  • Loading branch information
mjg-foundation committed Apr 5, 2024
1 parent 6bed559 commit 8a5fb27
Show file tree
Hide file tree
Showing 6 changed files with 62 additions and 32 deletions.
23 changes: 13 additions & 10 deletions ports/stm32/boards/Passport/modules/ext_settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -211,7 +211,7 @@ def load(self):

def get(self, kn, default=None):
if self.in_overrides(kn):
return self.get_from_overrides(kn)
return self.get_from_overrides(kn, default)
else:
# Special case for xfp and xpub -- make sure they exist and create if not
if not self.in_current(kn):
Expand All @@ -233,7 +233,7 @@ def get(self, kn, default=None):
finally:
# system.hide_busy_bar()
# These are overrides, so return them from there
return self.get_from_overrides(kn)
return self.get_from_overrides(kn, default)

return self.get_from_current(kn, default)

Expand All @@ -244,9 +244,10 @@ def changed(self):

def set(self, kn, v):
# print('set({}, {}'.format(kn, v))
if self.temporary_mode and kn not in DEVICE_SETTINGS:
if self.temporary_mode:
self.temporary_settings[kn] = v
return
if kn not in DEVICE_SETTINGS:
return

self.current[kn] = v
self.changed()
Expand All @@ -256,7 +257,7 @@ def get_from_current(self, kn, default):
return self.temporary_settings.get(kn, default)
return self.current.get(kn, default)

def get_from_overrides(kn, default):
def get_from_overrides(self, kn, default):
if self.temporary_mode:
return self.temporary_overrides.get(kn, default)
return self.overrides.get(kn, default)
Expand Down Expand Up @@ -342,7 +343,7 @@ async def write_out(self):
# Was sometimes running low on memory in this area: recover
try:
gc.collect()
self.save()
self.internal_save()
except MemoryError:
call_later_ms(250, self.write_out())

Expand Down Expand Up @@ -392,14 +393,16 @@ def erase_all(self):
self.erase_cache_entry(pos)
self.blank()

def save(self):
if self.temporary_mode:
return

def internal_save(self):
# Make two saves in case one is corrupted
self.do_save(erase_old_pos=True)
self.do_save(erase_old_pos=False)

def save(self):
if self.temporary_mode:
return
self.internal_save()

def do_save(self, erase_old_pos=True):
# print('do_save({})'.format(erase_old_pos))
# render as JSON, encrypt and write it.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,21 +5,25 @@

import lvgl as lv
from flows import Flow
from common import settings


class InitialSeedSetupFlow(Flow):
def __init__(self, allow_backtrack=True):
def __init__(self, allow_backtrack=True, temporary=False):
super().__init__(initial_state=self.show_intro, name='InitialSeedSetupFlow')
self.statusbar = {'title': 'CREATE SEED', 'icon': 'ICON_SEED'}
self.allow_backtrack = allow_backtrack
self.temporary = temporary
if temporary:
settings.enter_temporary_mode()

async def show_intro(self):
from pages import InfoPage
from utils import has_seed
import microns

# Pass silently if seed already exists
if has_seed():
if has_seed() and not self.temporary:
self.set_result(True)
return

Expand All @@ -35,17 +39,28 @@ async def show_intro(self):
if result:
self.goto(self.show_seed_setup_menu)
else:
if self.temporary:
settings.exit_temporary_mode()
self.set_result(None)

async def show_seed_setup_menu(self):
from pages import ChooserPage
from flows import NewSeedFlow, RestoreSeedFlow, RestoreBackupFlow
import microns

options = [{'label': 'Create New Seed',
'value': lambda: NewSeedFlow(full_backup=True)},
{'label': 'Import Seed', 'value': lambda: RestoreSeedFlow(full_backup=True)},
{'label': 'Restore Backup', 'value': lambda: RestoreBackupFlow(full_backup=True)}]
options = []

if not self.temporary:
options.append({'label': 'Create New Seed',
'value': lambda: NewSeedFlow(full_backup=True)})

options.extend([{'label': 'Import Seed', 'value': lambda: RestoreSeedFlow(full_backup=True)},
{'label': 'Restore Backup', 'value': lambda: RestoreBackupFlow(full_backup=True)}])

if not self.temporary:
options.append({'label': 'Temporary Seed',
'value': lambda: InitialSeedSetupFlow(allow_backtrack=self.allow_backtrack,
temporary=True)})

flow = await ChooserPage(
text=None,
Expand Down
20 changes: 13 additions & 7 deletions ports/stm32/boards/Passport/modules/stash.py
Original file line number Diff line number Diff line change
Expand Up @@ -130,17 +130,23 @@ class SensitiveValues:
# be a context manager, and holder to secrets in-memory

def __init__(self, secret=None, for_backup=False):
from common import system
from common import system, settings

if secret is None:
# fetch the secret from bootloader/atecc508a
from common import pa
if settings.temporary_mode:
if settings.get('temporary_seed', None) is None:
raise ValueError('no temporary secrets yet')
self.secret = settings.get('temporary_seed', None)
self.spots = []
else:
# fetch the secret from bootloader/atecc508a
from common import pa

if pa.is_secret_blank():
raise ValueError('no secrets yet')
if pa.is_secret_blank():
raise ValueError('no secrets yet')

self.secret = pa.fetch()
self.spots = [self.secret]
self.secret = pa.fetch()
self.spots = [self.secret]
else:
# sometimes we already know it
# assert set(secret) != {0}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,4 +19,4 @@ async def get_seed_words_task(on_done):
except Exception as e:
# print('get_seed_words_task(): Exception: {}'.format(e))
# Unable to read seed!
await on_done(None, None, '{}'.format(e))
await on_done(None, '{}'.format(e))
17 changes: 10 additions & 7 deletions ports/stm32/boards/Passport/modules/tasks/save_seed_task.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,20 +13,23 @@


async def save_seed_task(on_done, seed_bits):
from common import pa
from common import pa, settings
import stash

try:
secret = SecretStash.encode(seed_bits=seed_bits)

pa.change(new_secret=secret)
if settings.temporary_mode:
settings.set_volatile('temporary_seed', secret)
else:
pa.change(new_secret=secret)

# Recapture XFP, etc. for new secret
await pa.new_main_secret(secret)
# Recapture XFP, etc. for new secret
await pa.new_main_secret(secret)

# Check and reload secret
pa.reset()
pa.login()
# Check and reload secret
pa.reset()
pa.login()

with stash.SensitiveValues() as sv:
sv.capture_xpub(save=True)
Expand Down
5 changes: 4 additions & 1 deletion ports/stm32/boards/Passport/modules/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -1140,7 +1140,10 @@ def set_list(lst, index, value):


def has_seed():
from common import pa
from common import pa, settings

if settings.temporary_mode:
return settings.get('temporary_seed', None) is not None

# pa.is_secret_blank() function returns True before we are logged in, which is not right.
if not is_logged_in():
Expand Down

0 comments on commit 8a5fb27

Please sign in to comment.