Ragger tests - Refactored the handling of the app settings
This commit is contained in:
@@ -1,7 +1,6 @@
|
|||||||
from contextlib import contextmanager
|
from contextlib import contextmanager
|
||||||
from typing import Generator
|
|
||||||
from enum import IntEnum, auto
|
from enum import IntEnum, auto
|
||||||
from typing import Iterator
|
from typing import Iterator, Dict, List
|
||||||
from ragger.backend import BackendInterface
|
from ragger.backend import BackendInterface
|
||||||
from ragger.utils import RAPDU
|
from ragger.utils import RAPDU
|
||||||
import signal
|
import signal
|
||||||
@@ -33,6 +32,19 @@ class EIP712FieldType(IntEnum):
|
|||||||
FIX_BYTES = auto()
|
FIX_BYTES = auto()
|
||||||
DYN_BYTES = auto()
|
DYN_BYTES = auto()
|
||||||
|
|
||||||
|
class SettingType(IntEnum):
|
||||||
|
BLIND_SIGNING = 0,
|
||||||
|
DEBUG_DATA = auto()
|
||||||
|
NONCE = auto()
|
||||||
|
VERBOSE_EIP712 = auto()
|
||||||
|
|
||||||
|
class Setting:
|
||||||
|
devices: List[str]
|
||||||
|
value: bool
|
||||||
|
|
||||||
|
def __init__(self, d: List[str]):
|
||||||
|
self.devices = d
|
||||||
|
|
||||||
|
|
||||||
class EthereumClientCmdBuilder:
|
class EthereumClientCmdBuilder:
|
||||||
_CLA: int = 0xE0
|
_CLA: int = 0xE0
|
||||||
@@ -168,15 +180,30 @@ class EthereumResponseParser:
|
|||||||
return v, r, s
|
return v, r, s
|
||||||
|
|
||||||
class EthereumClient:
|
class EthereumClient:
|
||||||
_verbose_eip712 = False
|
_settings: Dict[SettingType, Setting] = {
|
||||||
|
SettingType.BLIND_SIGNING: Setting(
|
||||||
|
[ "nanos", "nanox", "nanosp" ]
|
||||||
|
),
|
||||||
|
SettingType.DEBUG_DATA: Setting(
|
||||||
|
[ "nanos", "nanox", "nanosp" ]
|
||||||
|
),
|
||||||
|
SettingType.NONCE: Setting(
|
||||||
|
[ "nanos", "nanox", "nanosp" ]
|
||||||
|
),
|
||||||
|
SettingType.VERBOSE_EIP712: Setting(
|
||||||
|
[ "nanox", "nanosp" ]
|
||||||
|
)
|
||||||
|
}
|
||||||
|
_click_delay = 1/4
|
||||||
|
|
||||||
def __init__(self, client: BackendInterface, debug: bool = False):
|
def __init__(self, client: BackendInterface, debug: bool = False):
|
||||||
self._client = client
|
self._client = client
|
||||||
self._debug = debug
|
self._debug = debug
|
||||||
self._cmd_builder = EthereumClientCmdBuilder()
|
self._cmd_builder = EthereumClientCmdBuilder()
|
||||||
self._resp_parser = EthereumResponseParser()
|
self._resp_parser = EthereumResponseParser()
|
||||||
self._click_delay = 1/4
|
|
||||||
signal.signal(signal.SIGALRM, self._click_signal_timeout)
|
signal.signal(signal.SIGALRM, self._click_signal_timeout)
|
||||||
|
for setting in self._settings.values():
|
||||||
|
setting.value = False
|
||||||
|
|
||||||
def _send(self, payload: bytearray):
|
def _send(self, payload: bytearray):
|
||||||
return self._client.exchange_async_raw(payload)
|
return self._client.exchange_async_raw(payload)
|
||||||
@@ -235,7 +262,7 @@ class EthereumClient:
|
|||||||
|
|
||||||
def eip712_sign_new(self, bip32):
|
def eip712_sign_new(self, bip32):
|
||||||
with self._send(self._cmd_builder.eip712_sign_new(bip32)):
|
with self._send(self._cmd_builder.eip712_sign_new(bip32)):
|
||||||
if not self._verbose_eip712: # need to skip the message hash
|
if not self._settings[SettingType.VERBOSE_EIP712].value: # need to skip the message hash
|
||||||
self._client.right_click()
|
self._client.right_click()
|
||||||
self._client.right_click()
|
self._client.right_click()
|
||||||
self._client.both_click() # approve signature
|
self._client.both_click() # approve signature
|
||||||
@@ -265,18 +292,17 @@ class EthereumClient:
|
|||||||
assert resp.status == 0x9000
|
assert resp.status == 0x9000
|
||||||
return self._resp_parser.sign(resp.data)
|
return self._resp_parser.sign(resp.data)
|
||||||
|
|
||||||
def setting_toggle_verbose_eip712(self):
|
def settings_set(self, new_values: Dict[SettingType, bool]):
|
||||||
# Go to settings
|
# Go to settings
|
||||||
self._client.right_click()
|
for _ in range(2):
|
||||||
self._client.right_click()
|
self._client.right_click()
|
||||||
self._client.both_click()
|
|
||||||
# Go to verbose eip712
|
|
||||||
self._client.right_click()
|
|
||||||
self._client.right_click()
|
|
||||||
self._client.right_click()
|
|
||||||
self._client.both_click()
|
|
||||||
# Go back
|
|
||||||
self._client.right_click()
|
|
||||||
self._client.both_click()
|
self._client.both_click()
|
||||||
|
|
||||||
self._verbose_eip712 = not self._verbose_eip712
|
for enum in self._settings.keys():
|
||||||
|
if self._client.firmware.device in self._settings[enum].devices:
|
||||||
|
if enum in new_values.keys():
|
||||||
|
if new_values[enum] != self._settings[enum].value:
|
||||||
|
self._client.both_click()
|
||||||
|
self._settings[enum].value = new_values[enum]
|
||||||
|
self._client.right_click()
|
||||||
|
self._client.both_click()
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ import pytest
|
|||||||
import os
|
import os
|
||||||
import fnmatch
|
import fnmatch
|
||||||
from typing import List
|
from typing import List
|
||||||
from ethereum_client import EthereumClient
|
from ethereum_client import EthereumClient, SettingType
|
||||||
from eip712 import InputData
|
from eip712 import InputData
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
from configparser import ConfigParser
|
from configparser import ConfigParser
|
||||||
@@ -44,9 +44,9 @@ def test_eip712_legacy(app_client: EthereumClient):
|
|||||||
assert s == bytes.fromhex("52d8ba9153de9255da220ffd36762c0b027701a3b5110f0a765f94b16a9dfb55")
|
assert s == bytes.fromhex("52d8ba9153de9255da220ffd36762c0b027701a3b5110f0a765f94b16a9dfb55")
|
||||||
|
|
||||||
|
|
||||||
def test_eip712_new(app_client: EthereumClient, input_file: Path, verbose):
|
def test_eip712_new(app_client: EthereumClient, input_file: Path, verbose: bool, filtering: bool):
|
||||||
if app_client._client.firmware.device != "nanos": # not supported
|
print("=====> %s" % (input_file))
|
||||||
print("=====> %s" % (input_file))
|
if app_client._client.firmware.device != "nanos":
|
||||||
test_path = "%s/%s" % (input_file.parent, "-".join(input_file.stem.split("-")[:-1]))
|
test_path = "%s/%s" % (input_file.parent, "-".join(input_file.stem.split("-")[:-1]))
|
||||||
conf_file = "%s.ini" % (test_path)
|
conf_file = "%s.ini" % (test_path)
|
||||||
|
|
||||||
@@ -60,10 +60,15 @@ def test_eip712_new(app_client: EthereumClient, input_file: Path, verbose):
|
|||||||
assert "s" in config["signature"]
|
assert "s" in config["signature"]
|
||||||
|
|
||||||
if verbose:
|
if verbose:
|
||||||
app_client.setting_toggle_verbose_eip712()
|
app_client.settings_set({
|
||||||
|
SettingType.VERBOSE_EIP712: True
|
||||||
|
})
|
||||||
|
|
||||||
InputData.process_file(app_client, input_file, False)
|
InputData.process_file(app_client, input_file, False)
|
||||||
v, r, s = app_client.eip712_sign_new(bip32)
|
v, r, s = app_client.eip712_sign_new(bip32)
|
||||||
|
|
||||||
assert v == bytes.fromhex(config["signature"]["v"])
|
assert v == bytes.fromhex(config["signature"]["v"])
|
||||||
assert r == bytes.fromhex(config["signature"]["r"])
|
assert r == bytes.fromhex(config["signature"]["r"])
|
||||||
assert s == bytes.fromhex(config["signature"]["s"])
|
assert s == bytes.fromhex(config["signature"]["s"])
|
||||||
|
else:
|
||||||
|
print("Not supported by LNS")
|
||||||
|
|||||||
Reference in New Issue
Block a user