Skip to content

Commit 982d5c7

Browse files
Merge pull request #561 from Foundation-Devices/SFT-3834-sign-message-with-microsd
SFT-3834: added microsd message signing
2 parents 457e740 + 4d0ebb0 commit 982d5c7

File tree

4 files changed

+37
-11
lines changed

4 files changed

+37
-11
lines changed

ports/stm32/boards/Passport/modules/flows/health_check_common_flow.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,18 +9,19 @@
99

1010

1111
class HealthCheckCommonFlow(Flow):
12-
def __init__(self, lines):
12+
def __init__(self, lines, normal_signing=False):
1313
super().__init__(initial_state=self.validate_lines, name='HealthCheckCommonFlow')
1414
self.lines = lines
1515
self.text = None
1616
self.subpath = None
1717
self.addr_type = AF_CLASSIC
18+
self.normal_signing = normal_signing
1819

1920
async def validate_lines(self):
2021
from pages import ErrorPage
2122
from utils import validate_sign_text
2223
if len(self.lines) not in [2, 3]:
23-
await ErrorPage('Health check format is invalid.').show()
24+
await ErrorPage('{} format is invalid.'.format('Message' if self.normal_signing else 'Health check')).show()
2425
self.set_result(None)
2526
return
2627

@@ -47,7 +48,8 @@ async def sign_health_check(self):
4748
from pages import ErrorPage
4849
from tasks import sign_text_file_task
4950
from utils import spinner_task
50-
(signature, address, error) = await spinner_task('Performing Health Check', sign_text_file_task,
51+
text = 'Signing message' if self.normal_signing else 'Performing health check'
52+
(signature, address, error) = await spinner_task(text, sign_text_file_task,
5153
args=[self.text, self.subpath, self.addr_type])
5254
if error is None:
5355
self.signature = signature

ports/stm32/boards/Passport/modules/flows/health_check_microsd_flow.py

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,21 +14,33 @@ def is_health_check(filename, path=None):
1414

1515
if '-hc' in filename:
1616
return True
17+
1718
return False
1819

1920

21+
def is_signable(filename, path=None):
22+
filename = filename.lower()
23+
24+
if '-signed' in filename:
25+
return False
26+
27+
return True
28+
29+
2030
class HealthCheckMicrosdFlow(Flow):
21-
def __init__(self, context=None):
31+
def __init__(self, context=None, normal_signing=False):
2232
super().__init__(initial_state=self.choose_file, name='HealthCheckMicrosdFlow')
2333
self.file_path = None
2434
self.lines = None
2535
self.signed_message = None
2636
self.service_name = context
37+
self.normal_signing = normal_signing
2738

2839
async def choose_file(self):
2940
from flows import FilePickerFlow
3041

31-
result = await FilePickerFlow(show_folders=True, filter_fn=is_health_check).run()
42+
result = await FilePickerFlow(show_folders=True,
43+
filter_fn=(is_signable if self.normal_signing else is_health_check)).run()
3244
if result is None:
3345
self.set_result(False)
3446
return
@@ -53,7 +65,7 @@ async def parse_message(self):
5365
async def common_flow(self):
5466
from flows import HealthCheckCommonFlow
5567

56-
self.signed_message = await HealthCheckCommonFlow(self.lines).run()
68+
self.signed_message = await HealthCheckCommonFlow(self.lines, normal_signing=self.normal_signing).run()
5769
if self.signed_message is None:
5870
self.set_result(False)
5971
return
@@ -65,8 +77,9 @@ async def write_signed_file(self):
6577
orig_path, basename = self.file_path.rsplit('/', 1)
6678
base, ext = basename.rsplit('.', 1)
6779
filename = base + '-signed' + '.' + ext
80+
success_text = "signed message" if self.normal_signing else "updated health check"
6881
result = await SaveToMicroSDFlow(filename=filename,
6982
data=self.signed_message,
70-
success_text="updated health check",
83+
success_text=success_text,
7184
path=orig_path).run()
7285
self.set_result(result)

ports/stm32/boards/Passport/modules/flows/sign_electrum_message_flow.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ def __init__(self):
2020
self.message = None
2121
self.address = None
2222
self.signature = None
23-
super().__init__(initial_state=self.scan_message, name='Sign Electrum Message Flow')
23+
super().__init__(initial_state=self.scan_message, name='SignElectrumMessageFlow')
2424

2525
async def scan_message(self):
2626
result = await ScanQRFlow(qr_types=[QRType.QR],
@@ -81,7 +81,7 @@ async def show_message(self):
8181
self.goto(self.do_sign)
8282

8383
async def do_sign(self):
84-
(sig, address, error) = await spinner_task('Signing Message', sign_text_file_task,
84+
(sig, address, error) = await spinner_task('Signing message', sign_text_file_task,
8585
args=[self.message, self.subpath, self.addr_format])
8686
if error is None:
8787
self.signature = sig

ports/stm32/boards/Passport/modules/menus.py

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,12 +43,23 @@ def manage_account_menu():
4343
]
4444

4545

46+
def sign_message_submenu():
47+
from flows import SignElectrumMessageFlow, HealthCheckMicrosdFlow
48+
49+
return [
50+
{'icon': 'ICON_SCAN_QR', 'label': 'Sign with QR Code', 'flow': SignElectrumMessageFlow,
51+
'statusbar': {'title': 'SIGN MESSAGE'}},
52+
{'icon': 'ICON_MICROSD', 'label': 'Sign with microSD', 'flow': HealthCheckMicrosdFlow,
53+
'statusbar': {'title': 'SIGN MESSAGE'}, 'args': {'normal_signing': True}},
54+
]
55+
56+
4657
def account_tools():
47-
from flows import VerifyAddressFlow, SignElectrumMessageFlow, AddressExplorerFlow
58+
from flows import VerifyAddressFlow, AddressExplorerFlow
4859

4960
return [
5061
{'icon': 'ICON_VERIFY_ADDRESS', 'label': 'Verify Address', 'flow': VerifyAddressFlow},
51-
{'icon': 'ICON_SCAN_QR', 'label': 'Sign a Message', 'flow': SignElectrumMessageFlow,
62+
{'icon': 'ICON_SIGN', 'label': 'Sign a Message', 'submenu': sign_message_submenu,
5263
'statusbar': {'title': 'SIGN MESSAGE'}},
5364
{'icon': 'ICON_VERIFY_ADDRESS', 'label': 'Explore Addresses', 'flow': AddressExplorerFlow,
5465
'statusbar': {'title': 'LIST ADDRESSES'}},

0 commit comments

Comments
 (0)