From 76e03922e1616c130b05460aede141a6c05f899e Mon Sep 17 00:00:00 2001 From: Charles-Edouard de la Vergne Date: Thu, 27 Jun 2024 16:40:28 +0200 Subject: [PATCH] Navigation scenario depends on elf metadata --- src/ragger/backend/interface.py | 1 + src/ragger/backend/speculos.py | 7 ++++++ src/ragger/navigator/navigation_scenario.py | 26 ++++++++++----------- src/ragger/navigator/navigator.py | 3 +++ 4 files changed, 24 insertions(+), 13 deletions(-) diff --git a/src/ragger/backend/interface.py b/src/ragger/backend/interface.py index b92dc4d3..065f649a 100644 --- a/src/ragger/backend/interface.py +++ b/src/ragger/backend/interface.py @@ -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) diff --git a/src/ragger/backend/speculos.py b/src/ragger/backend/speculos.py index 0318a5d0..7e675b8e 100644 --- a/src/ragger/backend/speculos.py +++ b/src/ragger/backend/speculos.py @@ -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 @@ -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, diff --git a/src/ragger/navigator/navigation_scenario.py b/src/ragger/navigator/navigation_scenario.py index c2d76322..6284d9d9 100644 --- a/src/ragger/navigator/navigation_scenario.py +++ b/src/ragger/navigator/navigation_scenario.py @@ -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 @@ -50,18 +52,16 @@ def __init__(self, device: Firmware, use_case: UseCase, approve: bool): # Dismiss the result modal in all cases self.validation += [NavInsID.USE_CASE_STATUS_DISMISS] - else: - raise NotImplementedError("Unknown device") - 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, @@ -89,7 +89,7 @@ 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, @@ -97,7 +97,7 @@ def review_reject(self, 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, @@ -105,7 +105,7 @@ def address_review_approve(self, 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, @@ -113,5 +113,5 @@ def address_review_reject(self, 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) diff --git a/src/ragger/navigator/navigator.py b/src/ragger/navigator/navigator.py index 1a847712..b70d5bb8 100644 --- a/src/ragger/navigator/navigator.py +++ b/src/ragger/navigator/navigator.py @@ -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: