diff --git a/tests/ragger/app/client.py b/tests/ragger/app/client.py index dad04f6..9732c81 100644 --- a/tests/ragger/app/client.py +++ b/tests/ragger/app/client.py @@ -19,6 +19,16 @@ ROOT_SCREENSHOT_PATH = Path(__file__).parent.parent WEI_IN_ETH = 1e+18 +class StatusWord(IntEnum): + OK = 0x9000 + ERROR_NO_INFO = 0x6a00 + INVALID_DATA = 0x6a80 + INSUFFICIENT_MEMORY = 0x6a84 + INVALID_INS = 0x6d00 + INVALID_P1_P2 = 0x6b00 + CONDITION_NOT_SATISFIED = 0x6985 + REF_DATA_NOT_FOUND = 0x6a88 + class DOMAIN_NAME_TAG(IntEnum): STRUCTURE_TYPE = 0x01 STRUCTURE_VERSION = 0x02 diff --git a/tests/ragger/snapshots/nanosp b/tests/ragger/snapshots/nanosp new file mode 120000 index 0000000..da13a6a --- /dev/null +++ b/tests/ragger/snapshots/nanosp @@ -0,0 +1 @@ +nanox/ \ No newline at end of file diff --git a/tests/ragger/snapshots/nanox/domain_name_non_mainnet/00000.png b/tests/ragger/snapshots/nanox/domain_name_non_mainnet/00000.png new file mode 100644 index 0000000..487ea10 Binary files /dev/null and b/tests/ragger/snapshots/nanox/domain_name_non_mainnet/00000.png differ diff --git a/tests/ragger/snapshots/nanox/domain_name_non_mainnet/00001.png b/tests/ragger/snapshots/nanox/domain_name_non_mainnet/00001.png new file mode 100644 index 0000000..f9840e3 Binary files /dev/null and b/tests/ragger/snapshots/nanox/domain_name_non_mainnet/00001.png differ diff --git a/tests/ragger/snapshots/nanox/domain_name_non_mainnet/00002.png b/tests/ragger/snapshots/nanox/domain_name_non_mainnet/00002.png new file mode 100644 index 0000000..6a5a9d6 Binary files /dev/null and b/tests/ragger/snapshots/nanox/domain_name_non_mainnet/00002.png differ diff --git a/tests/ragger/snapshots/nanox/domain_name_non_mainnet/00003.png b/tests/ragger/snapshots/nanox/domain_name_non_mainnet/00003.png new file mode 100644 index 0000000..93112b3 Binary files /dev/null and b/tests/ragger/snapshots/nanox/domain_name_non_mainnet/00003.png differ diff --git a/tests/ragger/snapshots/nanox/domain_name_non_mainnet/00004.png b/tests/ragger/snapshots/nanox/domain_name_non_mainnet/00004.png new file mode 100644 index 0000000..70c1b9a Binary files /dev/null and b/tests/ragger/snapshots/nanox/domain_name_non_mainnet/00004.png differ diff --git a/tests/ragger/snapshots/nanox/domain_name_non_mainnet/00005.png b/tests/ragger/snapshots/nanox/domain_name_non_mainnet/00005.png new file mode 100644 index 0000000..570ce28 Binary files /dev/null and b/tests/ragger/snapshots/nanox/domain_name_non_mainnet/00005.png differ diff --git a/tests/ragger/snapshots/nanox/domain_name_non_mainnet/00006.png b/tests/ragger/snapshots/nanox/domain_name_non_mainnet/00006.png new file mode 100644 index 0000000..a58590b Binary files /dev/null and b/tests/ragger/snapshots/nanox/domain_name_non_mainnet/00006.png differ diff --git a/tests/ragger/snapshots/nanox/domain_name_verbose_False/00000.png b/tests/ragger/snapshots/nanox/domain_name_verbose_False/00000.png new file mode 100644 index 0000000..487ea10 Binary files /dev/null and b/tests/ragger/snapshots/nanox/domain_name_verbose_False/00000.png differ diff --git a/tests/ragger/snapshots/nanox/domain_name_verbose_False/00001.png b/tests/ragger/snapshots/nanox/domain_name_verbose_False/00001.png new file mode 100644 index 0000000..f9840e3 Binary files /dev/null and b/tests/ragger/snapshots/nanox/domain_name_verbose_False/00001.png differ diff --git a/tests/ragger/snapshots/nanox/domain_name_verbose_False/00002.png b/tests/ragger/snapshots/nanox/domain_name_verbose_False/00002.png new file mode 100644 index 0000000..6af0ec5 Binary files /dev/null and b/tests/ragger/snapshots/nanox/domain_name_verbose_False/00002.png differ diff --git a/tests/ragger/snapshots/nanox/domain_name_verbose_False/00003.png b/tests/ragger/snapshots/nanox/domain_name_verbose_False/00003.png new file mode 100644 index 0000000..70c1b9a Binary files /dev/null and b/tests/ragger/snapshots/nanox/domain_name_verbose_False/00003.png differ diff --git a/tests/ragger/snapshots/nanox/domain_name_verbose_False/00004.png b/tests/ragger/snapshots/nanox/domain_name_verbose_False/00004.png new file mode 100644 index 0000000..570ce28 Binary files /dev/null and b/tests/ragger/snapshots/nanox/domain_name_verbose_False/00004.png differ diff --git a/tests/ragger/snapshots/nanox/domain_name_verbose_False/00005.png b/tests/ragger/snapshots/nanox/domain_name_verbose_False/00005.png new file mode 100644 index 0000000..a58590b Binary files /dev/null and b/tests/ragger/snapshots/nanox/domain_name_verbose_False/00005.png differ diff --git a/tests/ragger/snapshots/nanox/domain_name_verbose_True/00000.png b/tests/ragger/snapshots/nanox/domain_name_verbose_True/00000.png new file mode 100644 index 0000000..487ea10 Binary files /dev/null and b/tests/ragger/snapshots/nanox/domain_name_verbose_True/00000.png differ diff --git a/tests/ragger/snapshots/nanox/domain_name_verbose_True/00001.png b/tests/ragger/snapshots/nanox/domain_name_verbose_True/00001.png new file mode 100644 index 0000000..f9840e3 Binary files /dev/null and b/tests/ragger/snapshots/nanox/domain_name_verbose_True/00001.png differ diff --git a/tests/ragger/snapshots/nanox/domain_name_verbose_True/00002.png b/tests/ragger/snapshots/nanox/domain_name_verbose_True/00002.png new file mode 100644 index 0000000..6af0ec5 Binary files /dev/null and b/tests/ragger/snapshots/nanox/domain_name_verbose_True/00002.png differ diff --git a/tests/ragger/snapshots/nanox/domain_name_verbose_True/00003.png b/tests/ragger/snapshots/nanox/domain_name_verbose_True/00003.png new file mode 100644 index 0000000..6a5a9d6 Binary files /dev/null and b/tests/ragger/snapshots/nanox/domain_name_verbose_True/00003.png differ diff --git a/tests/ragger/snapshots/nanox/domain_name_verbose_True/00004.png b/tests/ragger/snapshots/nanox/domain_name_verbose_True/00004.png new file mode 100644 index 0000000..70c1b9a Binary files /dev/null and b/tests/ragger/snapshots/nanox/domain_name_verbose_True/00004.png differ diff --git a/tests/ragger/snapshots/nanox/domain_name_verbose_True/00005.png b/tests/ragger/snapshots/nanox/domain_name_verbose_True/00005.png new file mode 100644 index 0000000..570ce28 Binary files /dev/null and b/tests/ragger/snapshots/nanox/domain_name_verbose_True/00005.png differ diff --git a/tests/ragger/snapshots/nanox/domain_name_verbose_True/00006.png b/tests/ragger/snapshots/nanox/domain_name_verbose_True/00006.png new file mode 100644 index 0000000..a58590b Binary files /dev/null and b/tests/ragger/snapshots/nanox/domain_name_verbose_True/00006.png differ diff --git a/tests/ragger/snapshots/nanox/domain_name_wrong_addr/00000.png b/tests/ragger/snapshots/nanox/domain_name_wrong_addr/00000.png new file mode 100644 index 0000000..487ea10 Binary files /dev/null and b/tests/ragger/snapshots/nanox/domain_name_wrong_addr/00000.png differ diff --git a/tests/ragger/snapshots/nanox/domain_name_wrong_addr/00001.png b/tests/ragger/snapshots/nanox/domain_name_wrong_addr/00001.png new file mode 100644 index 0000000..f9840e3 Binary files /dev/null and b/tests/ragger/snapshots/nanox/domain_name_wrong_addr/00001.png differ diff --git a/tests/ragger/snapshots/nanox/domain_name_wrong_addr/00002.png b/tests/ragger/snapshots/nanox/domain_name_wrong_addr/00002.png new file mode 100644 index 0000000..639e421 Binary files /dev/null and b/tests/ragger/snapshots/nanox/domain_name_wrong_addr/00002.png differ diff --git a/tests/ragger/snapshots/nanox/domain_name_wrong_addr/00003.png b/tests/ragger/snapshots/nanox/domain_name_wrong_addr/00003.png new file mode 100644 index 0000000..70c1b9a Binary files /dev/null and b/tests/ragger/snapshots/nanox/domain_name_wrong_addr/00003.png differ diff --git a/tests/ragger/snapshots/nanox/domain_name_wrong_addr/00004.png b/tests/ragger/snapshots/nanox/domain_name_wrong_addr/00004.png new file mode 100644 index 0000000..570ce28 Binary files /dev/null and b/tests/ragger/snapshots/nanox/domain_name_wrong_addr/00004.png differ diff --git a/tests/ragger/snapshots/nanox/domain_name_wrong_addr/00005.png b/tests/ragger/snapshots/nanox/domain_name_wrong_addr/00005.png new file mode 100644 index 0000000..a58590b Binary files /dev/null and b/tests/ragger/snapshots/nanox/domain_name_wrong_addr/00005.png differ diff --git a/tests/ragger/test_domain_name.py b/tests/ragger/test_domain_name.py new file mode 100644 index 0000000..317f72d --- /dev/null +++ b/tests/ragger/test_domain_name.py @@ -0,0 +1,128 @@ +import pytest +from ragger.error import ExceptionRAPDU +from app.client import EthereumClient, StatusWord +from app.setting import SettingType +import struct + +# Values used across all tests +CHAIN_ID = 1 +NAME = "ledger.eth" +ADDR = bytes.fromhex("0011223344556677889900112233445566778899") +KEY_ID = 1 +ALGO_ID = 1 +BIP32_PATH = "m/44'/60'/0'/0/0" +NONCE = 21 +GAS_PRICE = 13000000000 +GAS_LIMIT = 21000 +AMOUNT = 1.22 + +@pytest.fixture(params=[False, True]) +def verbose(request) -> bool: + return request.param + +def common(app_client: EthereumClient) -> int: + if app_client._client.firmware.device == "nanos": + pytest.skip("Not supported on LNS") + return app_client.get_challenge() + + +def test_send_fund(app_client: EthereumClient, verbose: bool): + challenge = common(app_client) + + if verbose: + app_client.settings_set({ + SettingType.VERBOSE_ENS: True + }) + + app_client.provide_domain_name(challenge, NAME, ADDR) + + app_client.send_fund(BIP32_PATH, + NONCE, + GAS_PRICE, + GAS_LIMIT, + ADDR, + AMOUNT, + CHAIN_ID, + "domain_name_verbose_" + str(verbose)) + +def test_send_fund_wrong_challenge(app_client: EthereumClient): + caught = False + challenge = common(app_client) + + try: + app_client.provide_domain_name(~challenge & 0xffffffff, NAME, ADDR) + except ExceptionRAPDU as e: + assert e.status == StatusWord.INVALID_DATA + else: + assert False # An exception should have been raised + +def test_send_fund_wrong_addr(app_client: EthereumClient): + challenge = common(app_client) + + app_client.provide_domain_name(challenge, NAME, ADDR) + + addr = bytearray(ADDR) + addr.reverse() + + app_client.send_fund(BIP32_PATH, + NONCE, + GAS_PRICE, + GAS_LIMIT, + addr, + AMOUNT, + CHAIN_ID, + "domain_name_wrong_addr") + +def test_send_fund_non_mainnet(app_client: EthereumClient): + challenge = common(app_client) + + app_client.provide_domain_name(challenge, NAME, ADDR) + + app_client.send_fund(BIP32_PATH, + NONCE, + GAS_PRICE, + GAS_LIMIT, + ADDR, + AMOUNT, + 5, + "domain_name_non_mainnet") + +def test_send_fund_domain_too_long(app_client: EthereumClient): + challenge = common(app_client) + + try: + app_client.provide_domain_name(challenge, "ledger" + "0"*25 + ".eth", ADDR) + except ExceptionRAPDU as e: + assert e.status == StatusWord.INVALID_DATA + else: + assert False # An exception should have been raised + +def test_send_fund_domain_invalid_character(app_client: EthereumClient): + challenge = common(app_client) + + try: + app_client.provide_domain_name(challenge, "l\xe8dger.eth", ADDR) + except ExceptionRAPDU as e: + assert e.status == StatusWord.INVALID_DATA + else: + assert False # An exception should have been raised + +def test_send_fund_uppercase(app_client: EthereumClient): + challenge = common(app_client) + + try: + app_client.provide_domain_name(challenge, NAME.upper(), ADDR) + except ExceptionRAPDU as e: + assert e.status == StatusWord.INVALID_DATA + else: + assert False # An exception should have been raised + +def test_send_fund_domain_non_ens(app_client: EthereumClient): + challenge = common(app_client) + + try: + app_client.provide_domain_name(challenge, "ledger.hte", ADDR) + except ExceptionRAPDU as e: + assert e.status == StatusWord.INVALID_DATA + else: + assert False # An exception should have been raised