Skip to content

Commit

Permalink
Navigation scenario depends on elf metadata
Browse files Browse the repository at this point in the history
  • Loading branch information
cedelavergne-ledger committed Jul 12, 2024
1 parent f173fff commit ad21ea9
Show file tree
Hide file tree
Showing 4 changed files with 25 additions and 11 deletions.
1 change: 1 addition & 0 deletions src/ragger/backend/interface.py
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@ def __init__(self,
self._firmware = firmware
self._last_async_response: Optional[RAPDU] = None
self.raise_policy = RaisePolicy.RAISE_ALL_BUT_0x9000
self.graphics: str = "Unknown"

if log_apdu_file:
set_apdu_logger_file(log_apdu_file=log_apdu_file)
Expand Down
7 changes: 7 additions & 0 deletions src/ragger/backend/speculos.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@
from time import time, sleep
from re import match

from ledgered import binary
from speculos.client import SpeculosClient, screenshot_equal, ApduResponse, ApduException
from speculos.mcu.seproxyhal import TICKER_DELAY

Expand Down Expand Up @@ -103,7 +104,13 @@ def __init__(self,
speculos_args.extend(args)
kwargs[self._ARGS_KEY] = speculos_args

self.graphics: str = "Unknown"
if Path(application).is_file():
bin_data = binary.LedgerBinaryApp(application)
self.graphics = bin_data.sections.sdk_graphics

self.logger.info("Speculos binary: '%s'", application)
self.logger.info(" SDK Library: '%s'", self.graphics)
self.logger.info("Speculos options: '%s'", " ".join(kwargs[self._ARGS_KEY]))
self._client: SpeculosClient = SpeculosClient(app=str(application),
api_url=self.url,
Expand Down
25 changes: 14 additions & 11 deletions src/ragger/navigator/navigation_scenario.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,14 +16,16 @@ class NavigationScenarioData:
validation: Sequence[InstructionType]
pattern: str

def __init__(self, device: Firmware, use_case: UseCase, approve: bool):
if device.is_nano:
def __init__(self, firmware: Firmware, sdk_graphic: str, use_case: UseCase, approve: bool):
if firmware.is_nano:
self.navigation = NavInsID.RIGHT_CLICK
self.validation = [NavInsID.BOTH_CLICK]
if sdk_graphic == "nbgl":
self.validation.append(NavInsID.BOTH_CLICK)
self.pattern = "^Approve$" if approve else "^Reject$"

elif device in [Firmware.STAX, Firmware.FLEX]:
if device == Firmware.STAX:
else:
if firmware == Firmware.STAX:
self.navigation = NavInsID.USE_CASE_REVIEW_TAP
else:
self.navigation = NavInsID.SWIPE_CENTER_TO_LEFT
Expand Down Expand Up @@ -51,17 +53,18 @@ def __init__(self, device: Firmware, use_case: UseCase, approve: bool):
self.validation += [NavInsID.USE_CASE_STATUS_DISMISS]

else:
raise NotImplementedError("Unknown device")
raise NotImplementedError("Unknown firmware")

Check failure

Code scanning / CodeQL

Syntax error Error

Syntax Error (in Python 3).


class NavigateWithScenario:

def __init__(self, navigator: Navigator, device: Firmware, test_name: str,
def __init__(self, navigator: Navigator, firmware: Firmware, test_name: str,
screenshot_path: Path):
self.navigator = navigator
self.device = device
self.firmware = firmware
self.test_name = test_name
self.screenshot_path = screenshot_path
self.sdk_graphic = navigator.get_sdk_graphic()

def _navigate_with_scenario(self,
scenario: NavigationScenarioData,
Expand Down Expand Up @@ -89,29 +92,29 @@ def review_approve(self,
test_name: Optional[str] = None,
custom_screen_text: Optional[str] = None,
do_comparison: bool = True):
scenario = NavigationScenarioData(self.device, UseCase.TX_REVIEW, approve=True)
scenario = NavigationScenarioData(self.firmware, self.sdk_graphic, UseCase.TX_REVIEW, True)
self._navigate_with_scenario(scenario, path, test_name, custom_screen_text, do_comparison)

def review_reject(self,
path: Optional[Path] = None,
test_name: Optional[str] = None,
custom_screen_text: Optional[str] = None,
do_comparison: bool = True):
scenario = NavigationScenarioData(self.device, UseCase.TX_REVIEW, approve=False)
scenario = NavigationScenarioData(self.firmware, self.sdk_graphic, UseCase.TX_REVIEW, False)
self._navigate_with_scenario(scenario, path, test_name, custom_screen_text, do_comparison)

def address_review_approve(self,
path: Optional[Path] = None,
test_name: Optional[str] = None,
custom_screen_text: Optional[str] = None,
do_comparison: bool = True):
scenario = NavigationScenarioData(self.device, UseCase.ADDRESS_CONFIRMATION, approve=True)
scenario = NavigationScenarioData(self.firmware, self.sdk_graphic, UseCase.ADDRESS_CONFIRMATION, True)
self._navigate_with_scenario(scenario, path, test_name, custom_screen_text, do_comparison)

def address_review_reject(self,
path: Optional[Path] = None,
test_name: Optional[str] = None,
custom_screen_text: Optional[str] = None,
do_comparison: bool = True):
scenario = NavigationScenarioData(self.device, UseCase.ADDRESS_CONFIRMATION, approve=False)
scenario = NavigationScenarioData(self.firmware, self.sdk_graphic, UseCase.ADDRESS_CONFIRMATION, False)
self._navigate_with_scenario(scenario, path, test_name, custom_screen_text, do_comparison)
3 changes: 3 additions & 0 deletions src/ragger/navigator/navigator.py
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,9 @@ def __init__(self,
self._callbacks = callbacks
self._golden_run = golden_run

def get_sdk_graphic(self) -> str:
return self._backend.graphics

def _get_snaps_dir_path(self, path: Path, test_case_name: Union[Path, str],
is_golden: bool) -> Path:
if is_golden:
Expand Down

0 comments on commit ad21ea9

Please sign in to comment.