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 Jun 27, 2024
1 parent 65a70e0 commit ecfaeee
Show file tree
Hide file tree
Showing 4 changed files with 41 additions and 13 deletions.
2 changes: 2 additions & 0 deletions src/ragger/backend/interface.py
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,8 @@ 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"
self.api_level: int = 0

if log_apdu_file:
set_apdu_logger_file(log_apdu_file=log_apdu_file)
Expand Down
10 changes: 10 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,16 @@ def __init__(self,
speculos_args.extend(args)
kwargs[self._ARGS_KEY] = speculos_args

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

self.logger.info("Speculos binary: '%s'", application)
self.logger.info(" SDK Library: '%s'", self.graphics)
self.logger.info(" API_LEVEL: '%d'", self.api_level)
self.logger.info("Speculos options: '%s'", " ".join(kwargs[self._ARGS_KEY]))
self._client: SpeculosClient = SpeculosClient(app=str(application),
api_url=self.url,
Expand Down
36 changes: 23 additions & 13 deletions src/ragger/navigator/navigation_scenario.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,17 +16,21 @@ 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, api_level: int, 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:
self.navigation = NavInsID.USE_CASE_REVIEW_TAP
else:
elif firmware in [Firmware.STAX, Firmware.FLEX]:
# swipe is introduced for Stax from API_LEVEL_21
if firmware == Firmware.FLEX or (firmware == Firmware.STAX and api_level >= 21):
self.navigation = NavInsID.SWIPE_CENTER_TO_LEFT
else:
self.navigation = NavInsID.USE_CASE_REVIEW_TAP

if use_case == UseCase.ADDRESS_CONFIRMATION:
if approve:
Expand All @@ -51,17 +55,19 @@ 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")


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()
self.api_level = navigator.get_sdk_api_level()

def _navigate_with_scenario(self,
scenario: NavigationScenarioData,
Expand Down Expand Up @@ -89,29 +95,33 @@ 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, self.api_level,
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, self.api_level,
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, self.api_level,
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, self.api_level,
UseCase.ADDRESS_CONFIRMATION, False)
self._navigate_with_scenario(scenario, path, test_name, custom_screen_text, do_comparison)
6 changes: 6 additions & 0 deletions src/ragger/navigator/navigator.py
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,12 @@ def __init__(self,
self._callbacks = callbacks
self._golden_run = golden_run

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

def get_sdk_api_level(self) -> int:
return self._backend.api_level

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 ecfaeee

Please sign in to comment.