From a265711a99a31846c36d73bc8bdcb01262199c69 Mon Sep 17 00:00:00 2001 From: Sarah Gliner <105934250+sgliner-ledger@users.noreply.github.com> Date: Wed, 29 Nov 2023 11:47:56 +0100 Subject: [PATCH 01/67] [auto]: add PR template --- .github/PULL_REQUEST_TEMPLATE.md | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 .github/PULL_REQUEST_TEMPLATE.md diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 0000000..98b720f --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,8 @@ +# Checklist + +- [ ] App update process has been followed +- [ ] Target branch is `develop` +- [ ] Application version has been bumped + + From 0cc9ca5f89292ebe1c6e0eaf533c6aacc7a6b43e Mon Sep 17 00:00:00 2001 From: Sarah GLINER Date: Wed, 13 Mar 2024 11:55:15 +0100 Subject: [PATCH 02/67] [auto] Add manifest --- ledger_app.toml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 ledger_app.toml diff --git a/ledger_app.toml b/ledger_app.toml new file mode 100644 index 0000000..8f4c403 --- /dev/null +++ b/ledger_app.toml @@ -0,0 +1,4 @@ +[app] +build_directory = "./" +sdk = "C" +devices = ["nanos", "nanox", "nanos+"] From 430ac3a8b9d54349646ff14d97f06510026525ee Mon Sep 17 00:00:00 2001 From: Sarah GLINER Date: Wed, 13 Mar 2024 14:19:26 +0100 Subject: [PATCH 03/67] [auto] Add guideline enforcer --- .github/workflows/guidelines_enforcer.yml | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 .github/workflows/guidelines_enforcer.yml diff --git a/.github/workflows/guidelines_enforcer.yml b/.github/workflows/guidelines_enforcer.yml new file mode 100644 index 0000000..fdaf9f2 --- /dev/null +++ b/.github/workflows/guidelines_enforcer.yml @@ -0,0 +1,23 @@ +name: Ensure compliance with Ledger guidelines + +# This workflow is mandatory in all applications +# It calls a reusable workflow guidelines_enforcer developed by Ledger's internal developer team. +# The successful completion of the reusable workflow is a mandatory step for an app to be available on the Ledger +# application store. +# +# More information on the guidelines can be found in the repository: +# LedgerHQ/ledger-app-workflows/ + +on: + workflow_dispatch: + push: + branches: + - master + - main + - develop + pull_request: + +jobs: + guidelines_enforcer: + name: Call Ledger guidelines_enforcer + uses: LedgerHQ/ledger-app-workflows/.github/workflows/reusable_guidelines_enforcer.yml@v1 From cd582373acc96dcd30945846ec6459989c0b3ef3 Mon Sep 17 00:00:00 2001 From: keiff3r Date: Thu, 13 Feb 2025 14:18:20 +0100 Subject: [PATCH 04/67] chore: update gitignore --- .gitignore | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitignore b/.gitignore index d0ea37a..10a7c4e 100644 --- a/.gitignore +++ b/.gitignore @@ -16,3 +16,6 @@ dist *.DS_Store client/target fuzz/cmake-build-fuzz + +__pycache__ +snapshots-tmp \ No newline at end of file From 10f5e6dfbaf7a653e4b79e5937bf11cc8fa00dca Mon Sep 17 00:00:00 2001 From: keiff3r Date: Thu, 13 Feb 2025 14:19:48 +0100 Subject: [PATCH 05/67] ops: update ci workflows --- .github/PULL_REQUEST_TEMPLATE.md | 8 ++ .github/workflows/build-workflow.yml | 34 ------- .../workflows/build_and_functional_tests.yml | 43 ++++++++ .github/workflows/ci-workflow.yml | 97 ------------------- .github/workflows/codeql_checks.yml | 45 +++++++++ .github/workflows/coding_style_checks.yml | 25 +++++ .github/workflows/guidelines_enforcer.yml | 23 +++++ .github/workflows/misspellings_checks.yml | 28 ++++++ .github/workflows/python_client_checks.yml | 41 ++++++++ 9 files changed, 213 insertions(+), 131 deletions(-) create mode 100644 .github/PULL_REQUEST_TEMPLATE.md delete mode 100644 .github/workflows/build-workflow.yml create mode 100644 .github/workflows/build_and_functional_tests.yml delete mode 100644 .github/workflows/ci-workflow.yml create mode 100644 .github/workflows/codeql_checks.yml create mode 100644 .github/workflows/coding_style_checks.yml create mode 100644 .github/workflows/guidelines_enforcer.yml create mode 100644 .github/workflows/misspellings_checks.yml create mode 100644 .github/workflows/python_client_checks.yml diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 0000000..98b720f --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,8 @@ +# Checklist + +- [ ] App update process has been followed +- [ ] Target branch is `develop` +- [ ] Application version has been bumped + + diff --git a/.github/workflows/build-workflow.yml b/.github/workflows/build-workflow.yml deleted file mode 100644 index 5ee747a..0000000 --- a/.github/workflows/build-workflow.yml +++ /dev/null @@ -1,34 +0,0 @@ -name: Compilation - -on: - push: - branches: - - master - pull_request: - branches: - - master - - develop - workflow_dispatch: - -jobs: - nano_release_build: - name: Build release application for NanoS, X and S+ - strategy: - matrix: - sdk: ["$NANOS_SDK", "$NANOX_SDK", "$NANOSP_SDK"] - runs-on: ubuntu-latest - container: - image: ghcr.io/ledgerhq/ledger-app-builder/ledger-app-builder-lite:latest - - steps: - - name: Clone - uses: actions/checkout@v3 - - - name: Build Everscale - run: | - make -j BOLOS_SDK=${{ matrix.sdk }} - - - name: Build Venom - run: | - make clean - make -j BOLOS_SDK=${{ matrix.sdk }} CHAIN=venom diff --git a/.github/workflows/build_and_functional_tests.yml b/.github/workflows/build_and_functional_tests.yml new file mode 100644 index 0000000..696f27c --- /dev/null +++ b/.github/workflows/build_and_functional_tests.yml @@ -0,0 +1,43 @@ +name: Build and run functional tests using ragger through reusable workflow + +# This workflow will build the app and then run functional tests using the Ragger framework upon Speculos emulation. +# It calls a reusable workflow developed by Ledger's internal developer team to build the application and upload the +# resulting binaries. +# It then calls another reusable workflow to run the Ragger tests on the compiled application binary. +# +# The build part of this workflow is mandatory, this ensures that the app will be deployable in the Ledger App Store. +# While the test part of this workflow is optional, having functional testing on your application is mandatory and this workflow and +# tooling environment is meant to be easy to use and adapt after forking your application + +on: + workflow_dispatch: + inputs: + golden_run: + type: choice + required: true + default: 'Raise an error (default)' + description: CI behavior if the test snapshots are different than expected. + options: + - 'Raise an error (default)' + - 'Open a PR' + push: + branches: + - master + - main + - develop + pull_request: + +jobs: + build_application: + name: Build application using the reusable workflow + uses: LedgerHQ/ledger-app-workflows/.github/workflows/reusable_build.yml@v1 + with: + upload_app_binaries_artifact: "compiled_app_binaries" + + ragger_tests: + name: Run ragger tests using the reusable workflow + needs: build_application + uses: LedgerHQ/ledger-app-workflows/.github/workflows/reusable_ragger_tests.yml@v1 + with: + download_app_binaries_artifact: "compiled_app_binaries" + regenerate_snapshots: ${{ inputs.golden_run == 'Open a PR' }} diff --git a/.github/workflows/ci-workflow.yml b/.github/workflows/ci-workflow.yml deleted file mode 100644 index cd28f5d..0000000 --- a/.github/workflows/ci-workflow.yml +++ /dev/null @@ -1,97 +0,0 @@ -name: CI - -on: - push: - branches: - - master - pull_request: - branches: - - master - - develop - workflow_dispatch: - -jobs: - scan-build: - name: Clang Static Analyzer - runs-on: ubuntu-latest - container: - image: ghcr.io/ledgerhq/ledger-app-builder/ledger-app-builder-lite:latest - - steps: - - uses: actions/checkout@v3 - - - name: Build with Clang Static Analyzer - run: | - make clean - scan-build --use-cc=clang -analyze-headers -enable-checker security -enable-checker unix -enable-checker valist -o scan-build --status-bugs make default - - - uses: actions/upload-artifact@v3 - if: failure() - with: - name: scan-build - path: scan-build - - - # ===================================================== - # SPECULOS TESTS - # ===================================================== - - - building_for_e2e_speculos_tests: - name: Building binaries for E2E Speculos tests - runs-on: ubuntu-latest - container: - image: ghcr.io/ledgerhq/ledger-app-builder/ledger-app-builder-lite:latest - - steps: - - uses: actions/checkout@v3 - - - name: Build testing binaries - run: | - mkdir tests/speculos/elfs - make clean && make -j DEBUG=1 BOLOS_SDK=$NANOS_SDK && mv bin/app.elf tests/speculos/elfs/nanos.elf - make clean && make -j DEBUG=1 BOLOS_SDK=$NANOX_SDK && mv bin/app.elf tests/speculos/elfs/nanox.elf - make clean && make -j DEBUG=1 BOLOS_SDK=$NANOSP_SDK && mv bin/app.elf tests/speculos/elfs/nanosp.elf - - - name: Upload app binaries - uses: actions/upload-artifact@v3 - with: - name: e2e_speculos_elfs - path: ./tests/speculos/elfs - - - jobs-e2e-speculos-tests: - name: Speculos tests - strategy: - fail-fast: false - matrix: - model: ["nanos", "nanox", "nanosp"] - - needs: [building_for_e2e_speculos_tests] - runs-on: ubuntu-latest - - steps: - - name: Clone - uses: actions/checkout@v3 - - - name: Create tmp folder for artifacts - run: mkdir tests/speculos/elfs - - - name: Download app binaries - uses: actions/download-artifact@v3 - with: - path: tmp/ - - - name: Gather elfs - run: cp `find tmp/e2e_speculos_elfs/ -name "*.elf"` tests/speculos/elfs/ - - - name: Install dependencies - run: | - cd tests/speculos - sudo apt-get update && sudo apt-get install -y qemu-user-static - pip install -r requirements.txt - - - name: Run speculos tests - run: | - cd tests/speculos - # pytest --model ${{ matrix.model }} --path ./elfs/${{ matrix.model }}.elf --display headless diff --git a/.github/workflows/codeql_checks.yml b/.github/workflows/codeql_checks.yml new file mode 100644 index 0000000..a0c4c5b --- /dev/null +++ b/.github/workflows/codeql_checks.yml @@ -0,0 +1,45 @@ +name: "CodeQL" + +on: + workflow_dispatch: + push: + branches: + - master + - main + - develop + pull_request: + # Excluded path: add the paths you want to ignore instead of deleting the workflow + paths-ignore: + - '.github/workflows/*.yml' + - 'tests/*' + +jobs: + analyse: + name: Analyse + strategy: + fail-fast: false + matrix: + sdk: ["$NANOX_SDK", "$NANOSP_SDK"] + # 'cpp' covers C and C++ + language: ['cpp'] + runs-on: ubuntu-latest + container: + image: ghcr.io/ledgerhq/ledger-app-builder/ledger-app-builder-legacy:latest + + steps: + - name: Clone + uses: actions/checkout@v4 + + - name: Initialize CodeQL + uses: github/codeql-action/init@v3 + with: + languages: ${{ matrix.language }} + queries: security-and-quality + + # CodeQL will create the database during the compilation + - name: Build + run: | + make BOLOS_SDK=${{ matrix.sdk }} + + - name: Perform CodeQL Analysis + uses: github/codeql-action/analyze@v3 diff --git a/.github/workflows/coding_style_checks.yml b/.github/workflows/coding_style_checks.yml new file mode 100644 index 0000000..7927239 --- /dev/null +++ b/.github/workflows/coding_style_checks.yml @@ -0,0 +1,25 @@ +name: Run coding style check through reusable workflow + +# This workflow will run linting checks to ensure a level of uniformization among all Ledger applications. +# +# The presence of this workflow is mandatory as a minimal level of linting is required. +# You are however free to modify the content of the .clang-format file and thus the coding style of your application. +# We simply ask you to not diverge too much from the linting of the everscale application. + +on: + workflow_dispatch: + push: + branches: + - master + - main + - develop + pull_request: + +jobs: + check_linting: + name: Check linting using the reusable workflow + uses: LedgerHQ/ledger-app-workflows/.github/workflows/reusable_lint.yml@v1 + with: + source: './src' + extensions: 'h,c' + version: 12 diff --git a/.github/workflows/guidelines_enforcer.yml b/.github/workflows/guidelines_enforcer.yml new file mode 100644 index 0000000..fdaf9f2 --- /dev/null +++ b/.github/workflows/guidelines_enforcer.yml @@ -0,0 +1,23 @@ +name: Ensure compliance with Ledger guidelines + +# This workflow is mandatory in all applications +# It calls a reusable workflow guidelines_enforcer developed by Ledger's internal developer team. +# The successful completion of the reusable workflow is a mandatory step for an app to be available on the Ledger +# application store. +# +# More information on the guidelines can be found in the repository: +# LedgerHQ/ledger-app-workflows/ + +on: + workflow_dispatch: + push: + branches: + - master + - main + - develop + pull_request: + +jobs: + guidelines_enforcer: + name: Call Ledger guidelines_enforcer + uses: LedgerHQ/ledger-app-workflows/.github/workflows/reusable_guidelines_enforcer.yml@v1 diff --git a/.github/workflows/misspellings_checks.yml b/.github/workflows/misspellings_checks.yml new file mode 100644 index 0000000..f38799e --- /dev/null +++ b/.github/workflows/misspellings_checks.yml @@ -0,0 +1,28 @@ +name: Misspellings checks + +# This workflow performs some misspelling checks on the repository +# It is there to help us maintain a level of quality in our codebase and does not have to be kept on forked +# applications. + +on: + workflow_dispatch: + push: + branches: + - master + - main + - develop + pull_request: + +jobs: + misspell: + name: Check misspellings + runs-on: ubuntu-latest + steps: + - name: Clone + uses: actions/checkout@v4 + + - name: Check misspellings + uses: codespell-project/actions-codespell@v2 + with: + builtin: clear,rare + check_filenames: true diff --git a/.github/workflows/python_client_checks.yml b/.github/workflows/python_client_checks.yml new file mode 100644 index 0000000..db60fd7 --- /dev/null +++ b/.github/workflows/python_client_checks.yml @@ -0,0 +1,41 @@ +name: Checks on the Python client + +# This workflow performs some checks on the Python client used by the everscale tests +# It is there to help us maintain a level of quality in our codebase and does not have to be kept on forked +# applications. + +on: + workflow_dispatch: + push: + branches: + - master + - main + - develop + pull_request: + +jobs: + lint: + name: everscale client linting + runs-on: ubuntu-latest + steps: + - name: Clone + uses: actions/checkout@v4 + - name: Installing PIP dependencies + run: | + pip install pylint + pip install -r tests/requirements.txt + - name: Lint Python code + run: pylint --rc tests/setup.cfg tests/application_client/ + + mypy: + name: Type checking + runs-on: ubuntu-latest + steps: + - name: Clone + uses: actions/checkout@v4 + - name: Installing PIP dependencies + run: | + pip install mypy + pip install -r tests/requirements.txt + - name: Mypy type checking + run: mypy tests/application_client/ From 44392bd8787fc3e04d58a34ae61fc3db93e77bd9 Mon Sep 17 00:00:00 2001 From: keiff3r Date: Thu, 13 Feb 2025 15:56:15 +0100 Subject: [PATCH 06/67] chore: remove pending review screen parameters --- Makefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index 9f55b85..58c5e2e 100644 --- a/Makefile +++ b/Makefile @@ -29,8 +29,8 @@ endif APP_LOAD_PARAMS += $(COMMON_LOAD_PARAMS) # Pending review parameters -APP_LOAD_PARAMS += --tlvraw 9F:01 -DEFINES += HAVE_PENDING_REVIEW_SCREEN +# APP_LOAD_PARAMS += --tlvraw 9F:01 +# DEFINES += HAVE_PENDING_REVIEW_SCREEN ################## # Define Version # From 584e7308935eb0c16620c9b894e522618ff63493 Mon Sep 17 00:00:00 2001 From: keiff3r Date: Thu, 13 Feb 2025 15:56:41 +0100 Subject: [PATCH 07/67] chore: add configuration files for development --- .clang-format | 18 ++++++++++++++++++ ledger_app.toml | 7 +++++++ 2 files changed, 25 insertions(+) create mode 100644 .clang-format create mode 100644 ledger_app.toml diff --git a/.clang-format b/.clang-format new file mode 100644 index 0000000..d65f1ce --- /dev/null +++ b/.clang-format @@ -0,0 +1,18 @@ +--- +BasedOnStyle: Google +IndentWidth: 4 +Language: Cpp +ColumnLimit: 100 +PointerAlignment: Right +AlignAfterOpenBracket: Align +AlignConsecutiveMacros: true +AllowAllParametersOfDeclarationOnNextLine: false +SortIncludes: false +SpaceAfterCStyleCast: true +AllowShortCaseLabelsOnASingleLine: false +AllowAllArgumentsOnNextLine: false +AllowShortBlocksOnASingleLine: Never +AllowShortFunctionsOnASingleLine: None +BinPackArguments: false +BinPackParameters: false +--- diff --git a/ledger_app.toml b/ledger_app.toml new file mode 100644 index 0000000..e6634a3 --- /dev/null +++ b/ledger_app.toml @@ -0,0 +1,7 @@ +[app] +build_directory = "./" +sdk = "C" +devices = ["nanos+", "nanox"] + +[tests] +pytest_directory = "./tests/" From d84d9991d01b95d974b74c700b96a148de80b7dc Mon Sep 17 00:00:00 2001 From: keiff3r Date: Thu, 13 Feb 2025 16:27:45 +0100 Subject: [PATCH 08/67] test: add ragger tests and move old tests into a relevant folder --- {tests => old-tests}/.gitignore | 0 {tests => old-tests}/Cargo.lock | 0 {tests => old-tests}/Cargo.toml | 0 {tests => old-tests}/python/apps/__init__.py | 0 {tests => old-tests}/speculos/conftest.py | 0 .../speculos/ledger_client/__init__.py | 0 .../ledger_client/exception/__init__.py | 0 .../exception/device_exception.py | 0 .../ledger_client/exception/errors.py | 0 .../speculos/ledger_client/ledger_cmd.py | 0 .../ledger_client/ledger_cmd_builder.py | 0 .../speculos/ledger_client/transaction.py | 0 .../speculos/ledger_client/utils.py | 0 .../speculos/requirements.txt | 0 .../get_pubkey/approve/nanos/00000.png | Bin .../get_pubkey/approve/nanos/00001.png | Bin .../get_pubkey/approve/nanos/00002.png | Bin .../get_pubkey/approve/nanos/00003.png | Bin .../get_pubkey/approve/nanos/00004.png | Bin .../get_pubkey/approve/nanos/00005.png | Bin .../get_pubkey/approve/nanosp/00000.png | Bin .../get_pubkey/approve/nanosp/00001.png | Bin .../get_pubkey/approve/nanosp/00002.png | Bin .../get_pubkey/approve/nanosp/00003.png | Bin .../get_pubkey/approve/nanox/00000.png | Bin .../get_pubkey/approve/nanox/00001.png | Bin .../get_pubkey/approve/nanox/00002.png | Bin .../get_pubkey/approve/nanox/00003.png | Bin .../get_pubkey/reject/nanos/00000.png | Bin .../get_pubkey/reject/nanos/00001.png | Bin .../get_pubkey/reject/nanos/00002.png | Bin .../get_pubkey/reject/nanos/00003.png | Bin .../get_pubkey/reject/nanos/00004.png | Bin .../get_pubkey/reject/nanosp/00000.png | Bin .../get_pubkey/reject/nanosp/00001.png | Bin .../get_pubkey/reject/nanosp/00002.png | Bin .../get_pubkey/reject/nanox/00000.png | Bin .../get_pubkey/reject/nanox/00001.png | Bin .../get_pubkey/reject/nanox/00002.png | Bin .../sign/sign_message/nanos/00000.png | Bin .../sign/sign_message/nanos/00001.png | Bin .../sign/sign_message/nanos/00002.png | Bin .../sign/sign_message/nanos/00003.png | Bin .../sign/sign_message/nanos/00004.png | Bin .../sign/sign_message/nanos/00005.png | Bin .../sign/sign_message/nanos/00006.png | Bin .../sign/sign_message/nanosp/00000.png | Bin .../sign/sign_message/nanosp/00001.png | Bin .../sign/sign_message/nanosp/00002.png | Bin .../sign/sign_message/nanosp/00003.png | Bin .../sign/sign_message/nanosp/00004.png | Bin .../sign/sign_message/nanosp/00005.png | Bin .../sign/sign_message/nanosp/00006.png | Bin .../sign/sign_message/nanox/00000.png | Bin .../sign/sign_message/nanox/00001.png | Bin .../sign/sign_message/nanox/00002.png | Bin .../sign/sign_message/nanox/00003.png | Bin .../sign/sign_message/nanox/00004.png | Bin .../sign/sign_message/nanox/00005.png | Bin .../sign/sign_message/nanox/00006.png | Bin .../sign/sign_reject/nanos/00000.png | Bin .../sign/sign_reject/nanos/00001.png | Bin .../sign/sign_reject/nanos/00002.png | Bin .../sign/sign_reject/nanos/00003.png | Bin .../sign/sign_reject/nanos/00004.png | Bin .../sign/sign_reject/nanos/00005.png | Bin .../sign/sign_reject/nanosp/00000.png | Bin .../sign/sign_reject/nanosp/00001.png | Bin .../sign/sign_reject/nanosp/00002.png | Bin .../sign/sign_reject/nanosp/00003.png | Bin .../sign/sign_reject/nanox/00000.png | Bin .../sign/sign_reject/nanox/00001.png | Bin .../sign/sign_reject/nanox/00002.png | Bin .../sign/sign_reject/nanox/00003.png | Bin .../sign_tx/burn_reject/nanos/00000.png | Bin .../sign_tx/burn_reject/nanos/00001.png | Bin .../sign_tx/burn_reject/nanos/00002.png | Bin .../sign_tx/burn_reject/nanos/00003.png | Bin .../sign_tx/burn_reject/nanos/00004.png | Bin .../sign_tx/burn_reject/nanosp/00000.png | Bin .../sign_tx/burn_reject/nanosp/00001.png | Bin .../sign_tx/burn_reject/nanosp/00002.png | Bin .../sign_tx/burn_reject/nanosp/00003.png | Bin .../sign_tx/burn_reject/nanosp/00004.png | Bin .../sign_tx/burn_reject/nanox/00000.png | Bin .../sign_tx/burn_reject/nanox/00001.png | Bin .../sign_tx/burn_reject/nanox/00002.png | Bin .../sign_tx/burn_reject/nanox/00003.png | Bin .../sign_tx/burn_reject/nanox/00004.png | Bin .../sign_tx/burn_tx/nanos/00000.png | Bin .../sign_tx/burn_tx/nanos/00001.png | Bin .../sign_tx/burn_tx/nanos/00002.png | Bin .../sign_tx/burn_tx/nanos/00003.png | Bin .../sign_tx/burn_tx/nanosp/00000.png | Bin .../sign_tx/burn_tx/nanosp/00001.png | Bin .../sign_tx/burn_tx/nanosp/00002.png | Bin .../sign_tx/burn_tx/nanosp/00003.png | Bin .../sign_tx/burn_tx/nanox/00000.png | Bin .../sign_tx/burn_tx/nanox/00001.png | Bin .../sign_tx/burn_tx/nanox/00002.png | Bin .../sign_tx/burn_tx/nanox/00003.png | Bin .../sign_tx/sign_confirm_tx/nanos/00000.png | Bin .../sign_tx/sign_confirm_tx/nanos/00001.png | Bin .../sign_tx/sign_confirm_tx/nanos/00002.png | Bin .../sign_tx/sign_confirm_tx/nanos/00003.png | Bin .../sign_tx/sign_confirm_tx/nanosp/00000.png | Bin .../sign_tx/sign_confirm_tx/nanosp/00001.png | Bin .../sign_tx/sign_confirm_tx/nanosp/00002.png | Bin .../sign_tx/sign_confirm_tx/nanosp/00003.png | Bin .../sign_tx/sign_confirm_tx/nanox/00000.png | Bin .../sign_tx/sign_confirm_tx/nanox/00001.png | Bin .../sign_tx/sign_confirm_tx/nanox/00002.png | Bin .../sign_tx/sign_confirm_tx/nanox/00003.png | Bin .../sign_tx/sign_reject_tx/nanos/00000.png | Bin .../sign_tx/sign_reject_tx/nanos/00001.png | Bin .../sign_tx/sign_reject_tx/nanos/00002.png | Bin .../sign_tx/sign_reject_tx/nanos/00003.png | Bin .../sign_tx/sign_reject_tx/nanos/00004.png | Bin .../sign_tx/sign_reject_tx/nanosp/00000.png | Bin .../sign_tx/sign_reject_tx/nanosp/00001.png | Bin .../sign_tx/sign_reject_tx/nanosp/00002.png | Bin .../sign_tx/sign_reject_tx/nanosp/00003.png | Bin .../sign_tx/sign_reject_tx/nanosp/00004.png | Bin .../sign_tx/sign_reject_tx/nanox/00000.png | Bin .../sign_tx/sign_reject_tx/nanox/00001.png | Bin .../sign_tx/sign_reject_tx/nanox/00002.png | Bin .../sign_tx/sign_reject_tx/nanox/00003.png | Bin .../sign_tx/sign_reject_tx/nanox/00004.png | Bin {tests => old-tests}/speculos/setup.cfg | 0 {tests => old-tests}/speculos/test_address.py | 0 .../speculos/test_configuration.py | 0 {tests => old-tests}/speculos/test_pubkey.py | 0 .../speculos/test_sign_message.py | 0 {tests => old-tests}/speculos/test_sign_tx.py | 0 {tests => old-tests}/src/main.rs | 0 tests/application_client/__init__.py | 0 .../everscale_command_sender.py | 176 ++++++++++++++++ .../everscale_response_unpacker.py | 77 +++++++ .../everscale_transaction.py | 188 +++++++++++++++++ tests/application_client/everscale_utils.py | 61 ++++++ tests/application_client/py.typed | 0 tests/conftest.py | 24 +++ tests/requirements.txt | 4 + tests/setup.cfg | 23 ++ .../00000.png | Bin 0 -> 400 bytes .../00001.png | Bin 0 -> 889 bytes .../00002.png | Bin 0 -> 498 bytes .../00003.png | Bin 0 -> 369 bytes .../00004.png | Bin 0 -> 356 bytes .../00005.png | Bin 0 -> 382 bytes .../00000.png | Bin 0 -> 400 bytes .../00001.png | Bin 0 -> 889 bytes .../00002.png | Bin 0 -> 498 bytes .../00003.png | Bin 0 -> 369 bytes .../00004.png | Bin 0 -> 382 bytes .../00000.png | Bin 0 -> 904 bytes .../00001.png | Bin 0 -> 556 bytes .../00002.png | Bin 0 -> 369 bytes .../00003.png | Bin 0 -> 356 bytes .../00004.png | Bin 0 -> 382 bytes .../00000.png | Bin 0 -> 904 bytes .../00001.png | Bin 0 -> 556 bytes .../00002.png | Bin 0 -> 369 bytes .../00003.png | Bin 0 -> 382 bytes .../nanosp/test_sign_message/00000.png | Bin 0 -> 415 bytes .../nanosp/test_sign_message/00001.png | Bin 0 -> 495 bytes .../nanosp/test_sign_message/00002.png | Bin 0 -> 443 bytes .../nanosp/test_sign_message/00003.png | Bin 0 -> 503 bytes .../nanosp/test_sign_message/00004.png | Bin 0 -> 451 bytes .../nanosp/test_sign_message/00005.png | Bin 0 -> 382 bytes .../nanosp/test_sign_tx_burn_usdt/00000.png | Bin 0 -> 414 bytes .../nanosp/test_sign_tx_burn_usdt/00001.png | Bin 0 -> 341 bytes .../nanosp/test_sign_tx_burn_usdt/00002.png | Bin 0 -> 387 bytes .../nanosp/test_sign_tx_burn_usdt/00003.png | Bin 0 -> 472 bytes .../nanosp/test_sign_tx_burn_usdt/00004.png | Bin 0 -> 382 bytes .../nanosp/test_sign_tx_confirm/00000.png | Bin 0 -> 414 bytes .../nanosp/test_sign_tx_confirm/00001.png | Bin 0 -> 354 bytes .../nanosp/test_sign_tx_confirm/00002.png | Bin 0 -> 518 bytes .../nanosp/test_sign_tx_confirm/00003.png | Bin 0 -> 472 bytes .../nanosp/test_sign_tx_confirm/00004.png | Bin 0 -> 382 bytes .../nanosp/test_sign_tx_transfer/00000.png | Bin 0 -> 414 bytes .../nanosp/test_sign_tx_transfer/00001.png | Bin 0 -> 374 bytes .../nanosp/test_sign_tx_transfer/00002.png | Bin 0 -> 517 bytes .../nanosp/test_sign_tx_transfer/00003.png | Bin 0 -> 872 bytes .../nanosp/test_sign_tx_transfer/00004.png | Bin 0 -> 518 bytes .../nanosp/test_sign_tx_transfer/00005.png | Bin 0 -> 472 bytes .../nanosp/test_sign_tx_transfer/00006.png | Bin 0 -> 382 bytes .../00000.png | Bin 0 -> 400 bytes .../00001.png | Bin 0 -> 889 bytes .../00002.png | Bin 0 -> 498 bytes .../00003.png | Bin 0 -> 369 bytes .../00004.png | Bin 0 -> 356 bytes .../00005.png | Bin 0 -> 382 bytes .../00000.png | Bin 0 -> 400 bytes .../00001.png | Bin 0 -> 889 bytes .../00002.png | Bin 0 -> 498 bytes .../00003.png | Bin 0 -> 369 bytes .../00004.png | Bin 0 -> 382 bytes .../00000.png | Bin 0 -> 904 bytes .../00001.png | Bin 0 -> 556 bytes .../00002.png | Bin 0 -> 369 bytes .../00003.png | Bin 0 -> 356 bytes .../00004.png | Bin 0 -> 382 bytes .../00000.png | Bin 0 -> 904 bytes .../00001.png | Bin 0 -> 556 bytes .../00002.png | Bin 0 -> 369 bytes .../00003.png | Bin 0 -> 382 bytes .../nanox/test_sign_message/00000.png | Bin 0 -> 415 bytes .../nanox/test_sign_message/00001.png | Bin 0 -> 495 bytes .../nanox/test_sign_message/00002.png | Bin 0 -> 443 bytes .../nanox/test_sign_message/00003.png | Bin 0 -> 503 bytes .../nanox/test_sign_message/00004.png | Bin 0 -> 451 bytes .../nanox/test_sign_message/00005.png | Bin 0 -> 382 bytes .../nanox/test_sign_tx_burn_usdt/00000.png | Bin 0 -> 414 bytes .../nanox/test_sign_tx_burn_usdt/00001.png | Bin 0 -> 341 bytes .../nanox/test_sign_tx_burn_usdt/00002.png | Bin 0 -> 387 bytes .../nanox/test_sign_tx_burn_usdt/00003.png | Bin 0 -> 472 bytes .../nanox/test_sign_tx_burn_usdt/00004.png | Bin 0 -> 382 bytes .../nanox/test_sign_tx_confirm/00000.png | Bin 0 -> 414 bytes .../nanox/test_sign_tx_confirm/00001.png | Bin 0 -> 354 bytes .../nanox/test_sign_tx_confirm/00002.png | Bin 0 -> 518 bytes .../nanox/test_sign_tx_confirm/00003.png | Bin 0 -> 472 bytes .../nanox/test_sign_tx_confirm/00004.png | Bin 0 -> 382 bytes .../nanox/test_sign_tx_transfer/00000.png | Bin 0 -> 414 bytes .../nanox/test_sign_tx_transfer/00001.png | Bin 0 -> 374 bytes .../nanox/test_sign_tx_transfer/00002.png | Bin 0 -> 517 bytes .../nanox/test_sign_tx_transfer/00003.png | Bin 0 -> 872 bytes .../nanox/test_sign_tx_transfer/00004.png | Bin 0 -> 518 bytes .../nanox/test_sign_tx_transfer/00005.png | Bin 0 -> 472 bytes .../nanox/test_sign_tx_transfer/00006.png | Bin 0 -> 382 bytes tests/test_address_cmd.py | 64 ++++++ tests/test_app_config_cmd.py | 18 ++ tests/test_pubkey_cmd.py | 61 ++++++ tests/test_sign_cmd.py | 199 ++++++++++++++++++ tests/test_sign_message_cmd.py | 49 +++++ tests/usage.md | 78 +++++++ tests/utils.py | 129 ++++++++++++ 237 files changed, 1151 insertions(+) rename {tests => old-tests}/.gitignore (100%) rename {tests => old-tests}/Cargo.lock (100%) rename {tests => old-tests}/Cargo.toml (100%) rename {tests => old-tests}/python/apps/__init__.py (100%) rename {tests => old-tests}/speculos/conftest.py (100%) rename {tests => old-tests}/speculos/ledger_client/__init__.py (100%) rename {tests => old-tests}/speculos/ledger_client/exception/__init__.py (100%) rename {tests => old-tests}/speculos/ledger_client/exception/device_exception.py (100%) rename {tests => old-tests}/speculos/ledger_client/exception/errors.py (100%) rename {tests => old-tests}/speculos/ledger_client/ledger_cmd.py (100%) rename {tests => old-tests}/speculos/ledger_client/ledger_cmd_builder.py (100%) rename {tests => old-tests}/speculos/ledger_client/transaction.py (100%) rename {tests => old-tests}/speculos/ledger_client/utils.py (100%) rename {tests => old-tests}/speculos/requirements.txt (100%) rename {tests => old-tests}/speculos/screenshots/get_pubkey/approve/nanos/00000.png (100%) rename {tests => old-tests}/speculos/screenshots/get_pubkey/approve/nanos/00001.png (100%) rename {tests => old-tests}/speculos/screenshots/get_pubkey/approve/nanos/00002.png (100%) rename {tests => old-tests}/speculos/screenshots/get_pubkey/approve/nanos/00003.png (100%) rename {tests => old-tests}/speculos/screenshots/get_pubkey/approve/nanos/00004.png (100%) rename {tests => old-tests}/speculos/screenshots/get_pubkey/approve/nanos/00005.png (100%) rename {tests => old-tests}/speculos/screenshots/get_pubkey/approve/nanosp/00000.png (100%) rename {tests => old-tests}/speculos/screenshots/get_pubkey/approve/nanosp/00001.png (100%) rename {tests => old-tests}/speculos/screenshots/get_pubkey/approve/nanosp/00002.png (100%) rename {tests => old-tests}/speculos/screenshots/get_pubkey/approve/nanosp/00003.png (100%) rename {tests => old-tests}/speculos/screenshots/get_pubkey/approve/nanox/00000.png (100%) rename {tests => old-tests}/speculos/screenshots/get_pubkey/approve/nanox/00001.png (100%) rename {tests => old-tests}/speculos/screenshots/get_pubkey/approve/nanox/00002.png (100%) rename {tests => old-tests}/speculos/screenshots/get_pubkey/approve/nanox/00003.png (100%) rename {tests => old-tests}/speculos/screenshots/get_pubkey/reject/nanos/00000.png (100%) rename {tests => old-tests}/speculos/screenshots/get_pubkey/reject/nanos/00001.png (100%) rename {tests => old-tests}/speculos/screenshots/get_pubkey/reject/nanos/00002.png (100%) rename {tests => old-tests}/speculos/screenshots/get_pubkey/reject/nanos/00003.png (100%) rename {tests => old-tests}/speculos/screenshots/get_pubkey/reject/nanos/00004.png (100%) rename {tests => old-tests}/speculos/screenshots/get_pubkey/reject/nanosp/00000.png (100%) rename {tests => old-tests}/speculos/screenshots/get_pubkey/reject/nanosp/00001.png (100%) rename {tests => old-tests}/speculos/screenshots/get_pubkey/reject/nanosp/00002.png (100%) rename {tests => old-tests}/speculos/screenshots/get_pubkey/reject/nanox/00000.png (100%) rename {tests => old-tests}/speculos/screenshots/get_pubkey/reject/nanox/00001.png (100%) rename {tests => old-tests}/speculos/screenshots/get_pubkey/reject/nanox/00002.png (100%) rename {tests => old-tests}/speculos/screenshots/sign/sign_message/nanos/00000.png (100%) rename {tests => old-tests}/speculos/screenshots/sign/sign_message/nanos/00001.png (100%) rename {tests => old-tests}/speculos/screenshots/sign/sign_message/nanos/00002.png (100%) rename {tests => old-tests}/speculos/screenshots/sign/sign_message/nanos/00003.png (100%) rename {tests => old-tests}/speculos/screenshots/sign/sign_message/nanos/00004.png (100%) rename {tests => old-tests}/speculos/screenshots/sign/sign_message/nanos/00005.png (100%) rename {tests => old-tests}/speculos/screenshots/sign/sign_message/nanos/00006.png (100%) rename {tests => old-tests}/speculos/screenshots/sign/sign_message/nanosp/00000.png (100%) rename {tests => old-tests}/speculos/screenshots/sign/sign_message/nanosp/00001.png (100%) rename {tests => old-tests}/speculos/screenshots/sign/sign_message/nanosp/00002.png (100%) rename {tests => old-tests}/speculos/screenshots/sign/sign_message/nanosp/00003.png (100%) rename {tests => old-tests}/speculos/screenshots/sign/sign_message/nanosp/00004.png (100%) rename {tests => old-tests}/speculos/screenshots/sign/sign_message/nanosp/00005.png (100%) rename {tests => old-tests}/speculos/screenshots/sign/sign_message/nanosp/00006.png (100%) rename {tests => old-tests}/speculos/screenshots/sign/sign_message/nanox/00000.png (100%) rename {tests => old-tests}/speculos/screenshots/sign/sign_message/nanox/00001.png (100%) rename {tests => old-tests}/speculos/screenshots/sign/sign_message/nanox/00002.png (100%) rename {tests => old-tests}/speculos/screenshots/sign/sign_message/nanox/00003.png (100%) rename {tests => old-tests}/speculos/screenshots/sign/sign_message/nanox/00004.png (100%) rename {tests => old-tests}/speculos/screenshots/sign/sign_message/nanox/00005.png (100%) rename {tests => old-tests}/speculos/screenshots/sign/sign_message/nanox/00006.png (100%) rename {tests => old-tests}/speculos/screenshots/sign/sign_reject/nanos/00000.png (100%) rename {tests => old-tests}/speculos/screenshots/sign/sign_reject/nanos/00001.png (100%) rename {tests => old-tests}/speculos/screenshots/sign/sign_reject/nanos/00002.png (100%) rename {tests => old-tests}/speculos/screenshots/sign/sign_reject/nanos/00003.png (100%) rename {tests => old-tests}/speculos/screenshots/sign/sign_reject/nanos/00004.png (100%) rename {tests => old-tests}/speculos/screenshots/sign/sign_reject/nanos/00005.png (100%) rename {tests => old-tests}/speculos/screenshots/sign/sign_reject/nanosp/00000.png (100%) rename {tests => old-tests}/speculos/screenshots/sign/sign_reject/nanosp/00001.png (100%) rename {tests => old-tests}/speculos/screenshots/sign/sign_reject/nanosp/00002.png (100%) rename {tests => old-tests}/speculos/screenshots/sign/sign_reject/nanosp/00003.png (100%) rename {tests => old-tests}/speculos/screenshots/sign/sign_reject/nanox/00000.png (100%) rename {tests => old-tests}/speculos/screenshots/sign/sign_reject/nanox/00001.png (100%) rename {tests => old-tests}/speculos/screenshots/sign/sign_reject/nanox/00002.png (100%) rename {tests => old-tests}/speculos/screenshots/sign/sign_reject/nanox/00003.png (100%) rename {tests => old-tests}/speculos/screenshots/sign_tx/burn_reject/nanos/00000.png (100%) rename {tests => old-tests}/speculos/screenshots/sign_tx/burn_reject/nanos/00001.png (100%) rename {tests => old-tests}/speculos/screenshots/sign_tx/burn_reject/nanos/00002.png (100%) rename {tests => old-tests}/speculos/screenshots/sign_tx/burn_reject/nanos/00003.png (100%) rename {tests => old-tests}/speculos/screenshots/sign_tx/burn_reject/nanos/00004.png (100%) rename {tests => old-tests}/speculos/screenshots/sign_tx/burn_reject/nanosp/00000.png (100%) rename {tests => old-tests}/speculos/screenshots/sign_tx/burn_reject/nanosp/00001.png (100%) rename {tests => old-tests}/speculos/screenshots/sign_tx/burn_reject/nanosp/00002.png (100%) rename {tests => old-tests}/speculos/screenshots/sign_tx/burn_reject/nanosp/00003.png (100%) rename {tests => old-tests}/speculos/screenshots/sign_tx/burn_reject/nanosp/00004.png (100%) rename {tests => old-tests}/speculos/screenshots/sign_tx/burn_reject/nanox/00000.png (100%) rename {tests => old-tests}/speculos/screenshots/sign_tx/burn_reject/nanox/00001.png (100%) rename {tests => old-tests}/speculos/screenshots/sign_tx/burn_reject/nanox/00002.png (100%) rename {tests => old-tests}/speculos/screenshots/sign_tx/burn_reject/nanox/00003.png (100%) rename {tests => old-tests}/speculos/screenshots/sign_tx/burn_reject/nanox/00004.png (100%) rename {tests => old-tests}/speculos/screenshots/sign_tx/burn_tx/nanos/00000.png (100%) rename {tests => old-tests}/speculos/screenshots/sign_tx/burn_tx/nanos/00001.png (100%) rename {tests => old-tests}/speculos/screenshots/sign_tx/burn_tx/nanos/00002.png (100%) rename {tests => old-tests}/speculos/screenshots/sign_tx/burn_tx/nanos/00003.png (100%) rename {tests => old-tests}/speculos/screenshots/sign_tx/burn_tx/nanosp/00000.png (100%) rename {tests => old-tests}/speculos/screenshots/sign_tx/burn_tx/nanosp/00001.png (100%) rename {tests => old-tests}/speculos/screenshots/sign_tx/burn_tx/nanosp/00002.png (100%) rename {tests => old-tests}/speculos/screenshots/sign_tx/burn_tx/nanosp/00003.png (100%) rename {tests => old-tests}/speculos/screenshots/sign_tx/burn_tx/nanox/00000.png (100%) rename {tests => old-tests}/speculos/screenshots/sign_tx/burn_tx/nanox/00001.png (100%) rename {tests => old-tests}/speculos/screenshots/sign_tx/burn_tx/nanox/00002.png (100%) rename {tests => old-tests}/speculos/screenshots/sign_tx/burn_tx/nanox/00003.png (100%) rename {tests => old-tests}/speculos/screenshots/sign_tx/sign_confirm_tx/nanos/00000.png (100%) rename {tests => old-tests}/speculos/screenshots/sign_tx/sign_confirm_tx/nanos/00001.png (100%) rename {tests => old-tests}/speculos/screenshots/sign_tx/sign_confirm_tx/nanos/00002.png (100%) rename {tests => old-tests}/speculos/screenshots/sign_tx/sign_confirm_tx/nanos/00003.png (100%) rename {tests => old-tests}/speculos/screenshots/sign_tx/sign_confirm_tx/nanosp/00000.png (100%) rename {tests => old-tests}/speculos/screenshots/sign_tx/sign_confirm_tx/nanosp/00001.png (100%) rename {tests => old-tests}/speculos/screenshots/sign_tx/sign_confirm_tx/nanosp/00002.png (100%) rename {tests => old-tests}/speculos/screenshots/sign_tx/sign_confirm_tx/nanosp/00003.png (100%) rename {tests => old-tests}/speculos/screenshots/sign_tx/sign_confirm_tx/nanox/00000.png (100%) rename {tests => old-tests}/speculos/screenshots/sign_tx/sign_confirm_tx/nanox/00001.png (100%) rename {tests => old-tests}/speculos/screenshots/sign_tx/sign_confirm_tx/nanox/00002.png (100%) rename {tests => old-tests}/speculos/screenshots/sign_tx/sign_confirm_tx/nanox/00003.png (100%) rename {tests => old-tests}/speculos/screenshots/sign_tx/sign_reject_tx/nanos/00000.png (100%) rename {tests => old-tests}/speculos/screenshots/sign_tx/sign_reject_tx/nanos/00001.png (100%) rename {tests => old-tests}/speculos/screenshots/sign_tx/sign_reject_tx/nanos/00002.png (100%) rename {tests => old-tests}/speculos/screenshots/sign_tx/sign_reject_tx/nanos/00003.png (100%) rename {tests => old-tests}/speculos/screenshots/sign_tx/sign_reject_tx/nanos/00004.png (100%) rename {tests => old-tests}/speculos/screenshots/sign_tx/sign_reject_tx/nanosp/00000.png (100%) rename {tests => old-tests}/speculos/screenshots/sign_tx/sign_reject_tx/nanosp/00001.png (100%) rename {tests => old-tests}/speculos/screenshots/sign_tx/sign_reject_tx/nanosp/00002.png (100%) rename {tests => old-tests}/speculos/screenshots/sign_tx/sign_reject_tx/nanosp/00003.png (100%) rename {tests => old-tests}/speculos/screenshots/sign_tx/sign_reject_tx/nanosp/00004.png (100%) rename {tests => old-tests}/speculos/screenshots/sign_tx/sign_reject_tx/nanox/00000.png (100%) rename {tests => old-tests}/speculos/screenshots/sign_tx/sign_reject_tx/nanox/00001.png (100%) rename {tests => old-tests}/speculos/screenshots/sign_tx/sign_reject_tx/nanox/00002.png (100%) rename {tests => old-tests}/speculos/screenshots/sign_tx/sign_reject_tx/nanox/00003.png (100%) rename {tests => old-tests}/speculos/screenshots/sign_tx/sign_reject_tx/nanox/00004.png (100%) rename {tests => old-tests}/speculos/setup.cfg (100%) rename {tests => old-tests}/speculos/test_address.py (100%) rename {tests => old-tests}/speculos/test_configuration.py (100%) rename {tests => old-tests}/speculos/test_pubkey.py (100%) rename {tests => old-tests}/speculos/test_sign_message.py (100%) rename {tests => old-tests}/speculos/test_sign_tx.py (100%) rename {tests => old-tests}/src/main.rs (100%) create mode 100644 tests/application_client/__init__.py create mode 100644 tests/application_client/everscale_command_sender.py create mode 100644 tests/application_client/everscale_response_unpacker.py create mode 100644 tests/application_client/everscale_transaction.py create mode 100644 tests/application_client/everscale_utils.py create mode 100644 tests/application_client/py.typed create mode 100644 tests/conftest.py create mode 100644 tests/requirements.txt create mode 100644 tests/setup.cfg create mode 100644 tests/snapshots/nanosp/test_get_address_wallet_v3_confirm_accepted/00000.png create mode 100644 tests/snapshots/nanosp/test_get_address_wallet_v3_confirm_accepted/00001.png create mode 100644 tests/snapshots/nanosp/test_get_address_wallet_v3_confirm_accepted/00002.png create mode 100644 tests/snapshots/nanosp/test_get_address_wallet_v3_confirm_accepted/00003.png create mode 100644 tests/snapshots/nanosp/test_get_address_wallet_v3_confirm_accepted/00004.png create mode 100644 tests/snapshots/nanosp/test_get_address_wallet_v3_confirm_accepted/00005.png create mode 100644 tests/snapshots/nanosp/test_get_address_wallet_v3_confirm_refused/00000.png create mode 100644 tests/snapshots/nanosp/test_get_address_wallet_v3_confirm_refused/00001.png create mode 100644 tests/snapshots/nanosp/test_get_address_wallet_v3_confirm_refused/00002.png create mode 100644 tests/snapshots/nanosp/test_get_address_wallet_v3_confirm_refused/00003.png create mode 100644 tests/snapshots/nanosp/test_get_address_wallet_v3_confirm_refused/00004.png create mode 100644 tests/snapshots/nanosp/test_get_public_key_confirm_accepted/00000.png create mode 100644 tests/snapshots/nanosp/test_get_public_key_confirm_accepted/00001.png create mode 100644 tests/snapshots/nanosp/test_get_public_key_confirm_accepted/00002.png create mode 100644 tests/snapshots/nanosp/test_get_public_key_confirm_accepted/00003.png create mode 100644 tests/snapshots/nanosp/test_get_public_key_confirm_accepted/00004.png create mode 100644 tests/snapshots/nanosp/test_get_public_key_confirm_refused/00000.png create mode 100644 tests/snapshots/nanosp/test_get_public_key_confirm_refused/00001.png create mode 100644 tests/snapshots/nanosp/test_get_public_key_confirm_refused/00002.png create mode 100644 tests/snapshots/nanosp/test_get_public_key_confirm_refused/00003.png create mode 100644 tests/snapshots/nanosp/test_sign_message/00000.png create mode 100644 tests/snapshots/nanosp/test_sign_message/00001.png create mode 100644 tests/snapshots/nanosp/test_sign_message/00002.png create mode 100644 tests/snapshots/nanosp/test_sign_message/00003.png create mode 100644 tests/snapshots/nanosp/test_sign_message/00004.png create mode 100644 tests/snapshots/nanosp/test_sign_message/00005.png create mode 100644 tests/snapshots/nanosp/test_sign_tx_burn_usdt/00000.png create mode 100644 tests/snapshots/nanosp/test_sign_tx_burn_usdt/00001.png create mode 100644 tests/snapshots/nanosp/test_sign_tx_burn_usdt/00002.png create mode 100644 tests/snapshots/nanosp/test_sign_tx_burn_usdt/00003.png create mode 100644 tests/snapshots/nanosp/test_sign_tx_burn_usdt/00004.png create mode 100644 tests/snapshots/nanosp/test_sign_tx_confirm/00000.png create mode 100644 tests/snapshots/nanosp/test_sign_tx_confirm/00001.png create mode 100644 tests/snapshots/nanosp/test_sign_tx_confirm/00002.png create mode 100644 tests/snapshots/nanosp/test_sign_tx_confirm/00003.png create mode 100644 tests/snapshots/nanosp/test_sign_tx_confirm/00004.png create mode 100644 tests/snapshots/nanosp/test_sign_tx_transfer/00000.png create mode 100644 tests/snapshots/nanosp/test_sign_tx_transfer/00001.png create mode 100644 tests/snapshots/nanosp/test_sign_tx_transfer/00002.png create mode 100644 tests/snapshots/nanosp/test_sign_tx_transfer/00003.png create mode 100644 tests/snapshots/nanosp/test_sign_tx_transfer/00004.png create mode 100644 tests/snapshots/nanosp/test_sign_tx_transfer/00005.png create mode 100644 tests/snapshots/nanosp/test_sign_tx_transfer/00006.png create mode 100644 tests/snapshots/nanox/test_get_address_wallet_v3_confirm_accepted/00000.png create mode 100644 tests/snapshots/nanox/test_get_address_wallet_v3_confirm_accepted/00001.png create mode 100644 tests/snapshots/nanox/test_get_address_wallet_v3_confirm_accepted/00002.png create mode 100644 tests/snapshots/nanox/test_get_address_wallet_v3_confirm_accepted/00003.png create mode 100644 tests/snapshots/nanox/test_get_address_wallet_v3_confirm_accepted/00004.png create mode 100644 tests/snapshots/nanox/test_get_address_wallet_v3_confirm_accepted/00005.png create mode 100644 tests/snapshots/nanox/test_get_address_wallet_v3_confirm_refused/00000.png create mode 100644 tests/snapshots/nanox/test_get_address_wallet_v3_confirm_refused/00001.png create mode 100644 tests/snapshots/nanox/test_get_address_wallet_v3_confirm_refused/00002.png create mode 100644 tests/snapshots/nanox/test_get_address_wallet_v3_confirm_refused/00003.png create mode 100644 tests/snapshots/nanox/test_get_address_wallet_v3_confirm_refused/00004.png create mode 100644 tests/snapshots/nanox/test_get_public_key_confirm_accepted/00000.png create mode 100644 tests/snapshots/nanox/test_get_public_key_confirm_accepted/00001.png create mode 100644 tests/snapshots/nanox/test_get_public_key_confirm_accepted/00002.png create mode 100644 tests/snapshots/nanox/test_get_public_key_confirm_accepted/00003.png create mode 100644 tests/snapshots/nanox/test_get_public_key_confirm_accepted/00004.png create mode 100644 tests/snapshots/nanox/test_get_public_key_confirm_refused/00000.png create mode 100644 tests/snapshots/nanox/test_get_public_key_confirm_refused/00001.png create mode 100644 tests/snapshots/nanox/test_get_public_key_confirm_refused/00002.png create mode 100644 tests/snapshots/nanox/test_get_public_key_confirm_refused/00003.png create mode 100644 tests/snapshots/nanox/test_sign_message/00000.png create mode 100644 tests/snapshots/nanox/test_sign_message/00001.png create mode 100644 tests/snapshots/nanox/test_sign_message/00002.png create mode 100644 tests/snapshots/nanox/test_sign_message/00003.png create mode 100644 tests/snapshots/nanox/test_sign_message/00004.png create mode 100644 tests/snapshots/nanox/test_sign_message/00005.png create mode 100644 tests/snapshots/nanox/test_sign_tx_burn_usdt/00000.png create mode 100644 tests/snapshots/nanox/test_sign_tx_burn_usdt/00001.png create mode 100644 tests/snapshots/nanox/test_sign_tx_burn_usdt/00002.png create mode 100644 tests/snapshots/nanox/test_sign_tx_burn_usdt/00003.png create mode 100644 tests/snapshots/nanox/test_sign_tx_burn_usdt/00004.png create mode 100644 tests/snapshots/nanox/test_sign_tx_confirm/00000.png create mode 100644 tests/snapshots/nanox/test_sign_tx_confirm/00001.png create mode 100644 tests/snapshots/nanox/test_sign_tx_confirm/00002.png create mode 100644 tests/snapshots/nanox/test_sign_tx_confirm/00003.png create mode 100644 tests/snapshots/nanox/test_sign_tx_confirm/00004.png create mode 100644 tests/snapshots/nanox/test_sign_tx_transfer/00000.png create mode 100644 tests/snapshots/nanox/test_sign_tx_transfer/00001.png create mode 100644 tests/snapshots/nanox/test_sign_tx_transfer/00002.png create mode 100644 tests/snapshots/nanox/test_sign_tx_transfer/00003.png create mode 100644 tests/snapshots/nanox/test_sign_tx_transfer/00004.png create mode 100644 tests/snapshots/nanox/test_sign_tx_transfer/00005.png create mode 100644 tests/snapshots/nanox/test_sign_tx_transfer/00006.png create mode 100644 tests/test_address_cmd.py create mode 100644 tests/test_app_config_cmd.py create mode 100644 tests/test_pubkey_cmd.py create mode 100644 tests/test_sign_cmd.py create mode 100644 tests/test_sign_message_cmd.py create mode 100644 tests/usage.md create mode 100644 tests/utils.py diff --git a/tests/.gitignore b/old-tests/.gitignore similarity index 100% rename from tests/.gitignore rename to old-tests/.gitignore diff --git a/tests/Cargo.lock b/old-tests/Cargo.lock similarity index 100% rename from tests/Cargo.lock rename to old-tests/Cargo.lock diff --git a/tests/Cargo.toml b/old-tests/Cargo.toml similarity index 100% rename from tests/Cargo.toml rename to old-tests/Cargo.toml diff --git a/tests/python/apps/__init__.py b/old-tests/python/apps/__init__.py similarity index 100% rename from tests/python/apps/__init__.py rename to old-tests/python/apps/__init__.py diff --git a/tests/speculos/conftest.py b/old-tests/speculos/conftest.py similarity index 100% rename from tests/speculos/conftest.py rename to old-tests/speculos/conftest.py diff --git a/tests/speculos/ledger_client/__init__.py b/old-tests/speculos/ledger_client/__init__.py similarity index 100% rename from tests/speculos/ledger_client/__init__.py rename to old-tests/speculos/ledger_client/__init__.py diff --git a/tests/speculos/ledger_client/exception/__init__.py b/old-tests/speculos/ledger_client/exception/__init__.py similarity index 100% rename from tests/speculos/ledger_client/exception/__init__.py rename to old-tests/speculos/ledger_client/exception/__init__.py diff --git a/tests/speculos/ledger_client/exception/device_exception.py b/old-tests/speculos/ledger_client/exception/device_exception.py similarity index 100% rename from tests/speculos/ledger_client/exception/device_exception.py rename to old-tests/speculos/ledger_client/exception/device_exception.py diff --git a/tests/speculos/ledger_client/exception/errors.py b/old-tests/speculos/ledger_client/exception/errors.py similarity index 100% rename from tests/speculos/ledger_client/exception/errors.py rename to old-tests/speculos/ledger_client/exception/errors.py diff --git a/tests/speculos/ledger_client/ledger_cmd.py b/old-tests/speculos/ledger_client/ledger_cmd.py similarity index 100% rename from tests/speculos/ledger_client/ledger_cmd.py rename to old-tests/speculos/ledger_client/ledger_cmd.py diff --git a/tests/speculos/ledger_client/ledger_cmd_builder.py b/old-tests/speculos/ledger_client/ledger_cmd_builder.py similarity index 100% rename from tests/speculos/ledger_client/ledger_cmd_builder.py rename to old-tests/speculos/ledger_client/ledger_cmd_builder.py diff --git a/tests/speculos/ledger_client/transaction.py b/old-tests/speculos/ledger_client/transaction.py similarity index 100% rename from tests/speculos/ledger_client/transaction.py rename to old-tests/speculos/ledger_client/transaction.py diff --git a/tests/speculos/ledger_client/utils.py b/old-tests/speculos/ledger_client/utils.py similarity index 100% rename from tests/speculos/ledger_client/utils.py rename to old-tests/speculos/ledger_client/utils.py diff --git a/tests/speculos/requirements.txt b/old-tests/speculos/requirements.txt similarity index 100% rename from tests/speculos/requirements.txt rename to old-tests/speculos/requirements.txt diff --git a/tests/speculos/screenshots/get_pubkey/approve/nanos/00000.png b/old-tests/speculos/screenshots/get_pubkey/approve/nanos/00000.png similarity index 100% rename from tests/speculos/screenshots/get_pubkey/approve/nanos/00000.png rename to old-tests/speculos/screenshots/get_pubkey/approve/nanos/00000.png diff --git a/tests/speculos/screenshots/get_pubkey/approve/nanos/00001.png b/old-tests/speculos/screenshots/get_pubkey/approve/nanos/00001.png similarity index 100% rename from tests/speculos/screenshots/get_pubkey/approve/nanos/00001.png rename to old-tests/speculos/screenshots/get_pubkey/approve/nanos/00001.png diff --git a/tests/speculos/screenshots/get_pubkey/approve/nanos/00002.png b/old-tests/speculos/screenshots/get_pubkey/approve/nanos/00002.png similarity index 100% rename from tests/speculos/screenshots/get_pubkey/approve/nanos/00002.png rename to old-tests/speculos/screenshots/get_pubkey/approve/nanos/00002.png diff --git a/tests/speculos/screenshots/get_pubkey/approve/nanos/00003.png b/old-tests/speculos/screenshots/get_pubkey/approve/nanos/00003.png similarity index 100% rename from tests/speculos/screenshots/get_pubkey/approve/nanos/00003.png rename to old-tests/speculos/screenshots/get_pubkey/approve/nanos/00003.png diff --git a/tests/speculos/screenshots/get_pubkey/approve/nanos/00004.png b/old-tests/speculos/screenshots/get_pubkey/approve/nanos/00004.png similarity index 100% rename from tests/speculos/screenshots/get_pubkey/approve/nanos/00004.png rename to old-tests/speculos/screenshots/get_pubkey/approve/nanos/00004.png diff --git a/tests/speculos/screenshots/get_pubkey/approve/nanos/00005.png b/old-tests/speculos/screenshots/get_pubkey/approve/nanos/00005.png similarity index 100% rename from tests/speculos/screenshots/get_pubkey/approve/nanos/00005.png rename to old-tests/speculos/screenshots/get_pubkey/approve/nanos/00005.png diff --git a/tests/speculos/screenshots/get_pubkey/approve/nanosp/00000.png b/old-tests/speculos/screenshots/get_pubkey/approve/nanosp/00000.png similarity index 100% rename from tests/speculos/screenshots/get_pubkey/approve/nanosp/00000.png rename to old-tests/speculos/screenshots/get_pubkey/approve/nanosp/00000.png diff --git a/tests/speculos/screenshots/get_pubkey/approve/nanosp/00001.png b/old-tests/speculos/screenshots/get_pubkey/approve/nanosp/00001.png similarity index 100% rename from tests/speculos/screenshots/get_pubkey/approve/nanosp/00001.png rename to old-tests/speculos/screenshots/get_pubkey/approve/nanosp/00001.png diff --git a/tests/speculos/screenshots/get_pubkey/approve/nanosp/00002.png b/old-tests/speculos/screenshots/get_pubkey/approve/nanosp/00002.png similarity index 100% rename from tests/speculos/screenshots/get_pubkey/approve/nanosp/00002.png rename to old-tests/speculos/screenshots/get_pubkey/approve/nanosp/00002.png diff --git a/tests/speculos/screenshots/get_pubkey/approve/nanosp/00003.png b/old-tests/speculos/screenshots/get_pubkey/approve/nanosp/00003.png similarity index 100% rename from tests/speculos/screenshots/get_pubkey/approve/nanosp/00003.png rename to old-tests/speculos/screenshots/get_pubkey/approve/nanosp/00003.png diff --git a/tests/speculos/screenshots/get_pubkey/approve/nanox/00000.png b/old-tests/speculos/screenshots/get_pubkey/approve/nanox/00000.png similarity index 100% rename from tests/speculos/screenshots/get_pubkey/approve/nanox/00000.png rename to old-tests/speculos/screenshots/get_pubkey/approve/nanox/00000.png diff --git a/tests/speculos/screenshots/get_pubkey/approve/nanox/00001.png b/old-tests/speculos/screenshots/get_pubkey/approve/nanox/00001.png similarity index 100% rename from tests/speculos/screenshots/get_pubkey/approve/nanox/00001.png rename to old-tests/speculos/screenshots/get_pubkey/approve/nanox/00001.png diff --git a/tests/speculos/screenshots/get_pubkey/approve/nanox/00002.png b/old-tests/speculos/screenshots/get_pubkey/approve/nanox/00002.png similarity index 100% rename from tests/speculos/screenshots/get_pubkey/approve/nanox/00002.png rename to old-tests/speculos/screenshots/get_pubkey/approve/nanox/00002.png diff --git a/tests/speculos/screenshots/get_pubkey/approve/nanox/00003.png b/old-tests/speculos/screenshots/get_pubkey/approve/nanox/00003.png similarity index 100% rename from tests/speculos/screenshots/get_pubkey/approve/nanox/00003.png rename to old-tests/speculos/screenshots/get_pubkey/approve/nanox/00003.png diff --git a/tests/speculos/screenshots/get_pubkey/reject/nanos/00000.png b/old-tests/speculos/screenshots/get_pubkey/reject/nanos/00000.png similarity index 100% rename from tests/speculos/screenshots/get_pubkey/reject/nanos/00000.png rename to old-tests/speculos/screenshots/get_pubkey/reject/nanos/00000.png diff --git a/tests/speculos/screenshots/get_pubkey/reject/nanos/00001.png b/old-tests/speculos/screenshots/get_pubkey/reject/nanos/00001.png similarity index 100% rename from tests/speculos/screenshots/get_pubkey/reject/nanos/00001.png rename to old-tests/speculos/screenshots/get_pubkey/reject/nanos/00001.png diff --git a/tests/speculos/screenshots/get_pubkey/reject/nanos/00002.png b/old-tests/speculos/screenshots/get_pubkey/reject/nanos/00002.png similarity index 100% rename from tests/speculos/screenshots/get_pubkey/reject/nanos/00002.png rename to old-tests/speculos/screenshots/get_pubkey/reject/nanos/00002.png diff --git a/tests/speculos/screenshots/get_pubkey/reject/nanos/00003.png b/old-tests/speculos/screenshots/get_pubkey/reject/nanos/00003.png similarity index 100% rename from tests/speculos/screenshots/get_pubkey/reject/nanos/00003.png rename to old-tests/speculos/screenshots/get_pubkey/reject/nanos/00003.png diff --git a/tests/speculos/screenshots/get_pubkey/reject/nanos/00004.png b/old-tests/speculos/screenshots/get_pubkey/reject/nanos/00004.png similarity index 100% rename from tests/speculos/screenshots/get_pubkey/reject/nanos/00004.png rename to old-tests/speculos/screenshots/get_pubkey/reject/nanos/00004.png diff --git a/tests/speculos/screenshots/get_pubkey/reject/nanosp/00000.png b/old-tests/speculos/screenshots/get_pubkey/reject/nanosp/00000.png similarity index 100% rename from tests/speculos/screenshots/get_pubkey/reject/nanosp/00000.png rename to old-tests/speculos/screenshots/get_pubkey/reject/nanosp/00000.png diff --git a/tests/speculos/screenshots/get_pubkey/reject/nanosp/00001.png b/old-tests/speculos/screenshots/get_pubkey/reject/nanosp/00001.png similarity index 100% rename from tests/speculos/screenshots/get_pubkey/reject/nanosp/00001.png rename to old-tests/speculos/screenshots/get_pubkey/reject/nanosp/00001.png diff --git a/tests/speculos/screenshots/get_pubkey/reject/nanosp/00002.png b/old-tests/speculos/screenshots/get_pubkey/reject/nanosp/00002.png similarity index 100% rename from tests/speculos/screenshots/get_pubkey/reject/nanosp/00002.png rename to old-tests/speculos/screenshots/get_pubkey/reject/nanosp/00002.png diff --git a/tests/speculos/screenshots/get_pubkey/reject/nanox/00000.png b/old-tests/speculos/screenshots/get_pubkey/reject/nanox/00000.png similarity index 100% rename from tests/speculos/screenshots/get_pubkey/reject/nanox/00000.png rename to old-tests/speculos/screenshots/get_pubkey/reject/nanox/00000.png diff --git a/tests/speculos/screenshots/get_pubkey/reject/nanox/00001.png b/old-tests/speculos/screenshots/get_pubkey/reject/nanox/00001.png similarity index 100% rename from tests/speculos/screenshots/get_pubkey/reject/nanox/00001.png rename to old-tests/speculos/screenshots/get_pubkey/reject/nanox/00001.png diff --git a/tests/speculos/screenshots/get_pubkey/reject/nanox/00002.png b/old-tests/speculos/screenshots/get_pubkey/reject/nanox/00002.png similarity index 100% rename from tests/speculos/screenshots/get_pubkey/reject/nanox/00002.png rename to old-tests/speculos/screenshots/get_pubkey/reject/nanox/00002.png diff --git a/tests/speculos/screenshots/sign/sign_message/nanos/00000.png b/old-tests/speculos/screenshots/sign/sign_message/nanos/00000.png similarity index 100% rename from tests/speculos/screenshots/sign/sign_message/nanos/00000.png rename to old-tests/speculos/screenshots/sign/sign_message/nanos/00000.png diff --git a/tests/speculos/screenshots/sign/sign_message/nanos/00001.png b/old-tests/speculos/screenshots/sign/sign_message/nanos/00001.png similarity index 100% rename from tests/speculos/screenshots/sign/sign_message/nanos/00001.png rename to old-tests/speculos/screenshots/sign/sign_message/nanos/00001.png diff --git a/tests/speculos/screenshots/sign/sign_message/nanos/00002.png b/old-tests/speculos/screenshots/sign/sign_message/nanos/00002.png similarity index 100% rename from tests/speculos/screenshots/sign/sign_message/nanos/00002.png rename to old-tests/speculos/screenshots/sign/sign_message/nanos/00002.png diff --git a/tests/speculos/screenshots/sign/sign_message/nanos/00003.png b/old-tests/speculos/screenshots/sign/sign_message/nanos/00003.png similarity index 100% rename from tests/speculos/screenshots/sign/sign_message/nanos/00003.png rename to old-tests/speculos/screenshots/sign/sign_message/nanos/00003.png diff --git a/tests/speculos/screenshots/sign/sign_message/nanos/00004.png b/old-tests/speculos/screenshots/sign/sign_message/nanos/00004.png similarity index 100% rename from tests/speculos/screenshots/sign/sign_message/nanos/00004.png rename to old-tests/speculos/screenshots/sign/sign_message/nanos/00004.png diff --git a/tests/speculos/screenshots/sign/sign_message/nanos/00005.png b/old-tests/speculos/screenshots/sign/sign_message/nanos/00005.png similarity index 100% rename from tests/speculos/screenshots/sign/sign_message/nanos/00005.png rename to old-tests/speculos/screenshots/sign/sign_message/nanos/00005.png diff --git a/tests/speculos/screenshots/sign/sign_message/nanos/00006.png b/old-tests/speculos/screenshots/sign/sign_message/nanos/00006.png similarity index 100% rename from tests/speculos/screenshots/sign/sign_message/nanos/00006.png rename to old-tests/speculos/screenshots/sign/sign_message/nanos/00006.png diff --git a/tests/speculos/screenshots/sign/sign_message/nanosp/00000.png b/old-tests/speculos/screenshots/sign/sign_message/nanosp/00000.png similarity index 100% rename from tests/speculos/screenshots/sign/sign_message/nanosp/00000.png rename to old-tests/speculos/screenshots/sign/sign_message/nanosp/00000.png diff --git a/tests/speculos/screenshots/sign/sign_message/nanosp/00001.png b/old-tests/speculos/screenshots/sign/sign_message/nanosp/00001.png similarity index 100% rename from tests/speculos/screenshots/sign/sign_message/nanosp/00001.png rename to old-tests/speculos/screenshots/sign/sign_message/nanosp/00001.png diff --git a/tests/speculos/screenshots/sign/sign_message/nanosp/00002.png b/old-tests/speculos/screenshots/sign/sign_message/nanosp/00002.png similarity index 100% rename from tests/speculos/screenshots/sign/sign_message/nanosp/00002.png rename to old-tests/speculos/screenshots/sign/sign_message/nanosp/00002.png diff --git a/tests/speculos/screenshots/sign/sign_message/nanosp/00003.png b/old-tests/speculos/screenshots/sign/sign_message/nanosp/00003.png similarity index 100% rename from tests/speculos/screenshots/sign/sign_message/nanosp/00003.png rename to old-tests/speculos/screenshots/sign/sign_message/nanosp/00003.png diff --git a/tests/speculos/screenshots/sign/sign_message/nanosp/00004.png b/old-tests/speculos/screenshots/sign/sign_message/nanosp/00004.png similarity index 100% rename from tests/speculos/screenshots/sign/sign_message/nanosp/00004.png rename to old-tests/speculos/screenshots/sign/sign_message/nanosp/00004.png diff --git a/tests/speculos/screenshots/sign/sign_message/nanosp/00005.png b/old-tests/speculos/screenshots/sign/sign_message/nanosp/00005.png similarity index 100% rename from tests/speculos/screenshots/sign/sign_message/nanosp/00005.png rename to old-tests/speculos/screenshots/sign/sign_message/nanosp/00005.png diff --git a/tests/speculos/screenshots/sign/sign_message/nanosp/00006.png b/old-tests/speculos/screenshots/sign/sign_message/nanosp/00006.png similarity index 100% rename from tests/speculos/screenshots/sign/sign_message/nanosp/00006.png rename to old-tests/speculos/screenshots/sign/sign_message/nanosp/00006.png diff --git a/tests/speculos/screenshots/sign/sign_message/nanox/00000.png b/old-tests/speculos/screenshots/sign/sign_message/nanox/00000.png similarity index 100% rename from tests/speculos/screenshots/sign/sign_message/nanox/00000.png rename to old-tests/speculos/screenshots/sign/sign_message/nanox/00000.png diff --git a/tests/speculos/screenshots/sign/sign_message/nanox/00001.png b/old-tests/speculos/screenshots/sign/sign_message/nanox/00001.png similarity index 100% rename from tests/speculos/screenshots/sign/sign_message/nanox/00001.png rename to old-tests/speculos/screenshots/sign/sign_message/nanox/00001.png diff --git a/tests/speculos/screenshots/sign/sign_message/nanox/00002.png b/old-tests/speculos/screenshots/sign/sign_message/nanox/00002.png similarity index 100% rename from tests/speculos/screenshots/sign/sign_message/nanox/00002.png rename to old-tests/speculos/screenshots/sign/sign_message/nanox/00002.png diff --git a/tests/speculos/screenshots/sign/sign_message/nanox/00003.png b/old-tests/speculos/screenshots/sign/sign_message/nanox/00003.png similarity index 100% rename from tests/speculos/screenshots/sign/sign_message/nanox/00003.png rename to old-tests/speculos/screenshots/sign/sign_message/nanox/00003.png diff --git a/tests/speculos/screenshots/sign/sign_message/nanox/00004.png b/old-tests/speculos/screenshots/sign/sign_message/nanox/00004.png similarity index 100% rename from tests/speculos/screenshots/sign/sign_message/nanox/00004.png rename to old-tests/speculos/screenshots/sign/sign_message/nanox/00004.png diff --git a/tests/speculos/screenshots/sign/sign_message/nanox/00005.png b/old-tests/speculos/screenshots/sign/sign_message/nanox/00005.png similarity index 100% rename from tests/speculos/screenshots/sign/sign_message/nanox/00005.png rename to old-tests/speculos/screenshots/sign/sign_message/nanox/00005.png diff --git a/tests/speculos/screenshots/sign/sign_message/nanox/00006.png b/old-tests/speculos/screenshots/sign/sign_message/nanox/00006.png similarity index 100% rename from tests/speculos/screenshots/sign/sign_message/nanox/00006.png rename to old-tests/speculos/screenshots/sign/sign_message/nanox/00006.png diff --git a/tests/speculos/screenshots/sign/sign_reject/nanos/00000.png b/old-tests/speculos/screenshots/sign/sign_reject/nanos/00000.png similarity index 100% rename from tests/speculos/screenshots/sign/sign_reject/nanos/00000.png rename to old-tests/speculos/screenshots/sign/sign_reject/nanos/00000.png diff --git a/tests/speculos/screenshots/sign/sign_reject/nanos/00001.png b/old-tests/speculos/screenshots/sign/sign_reject/nanos/00001.png similarity index 100% rename from tests/speculos/screenshots/sign/sign_reject/nanos/00001.png rename to old-tests/speculos/screenshots/sign/sign_reject/nanos/00001.png diff --git a/tests/speculos/screenshots/sign/sign_reject/nanos/00002.png b/old-tests/speculos/screenshots/sign/sign_reject/nanos/00002.png similarity index 100% rename from tests/speculos/screenshots/sign/sign_reject/nanos/00002.png rename to old-tests/speculos/screenshots/sign/sign_reject/nanos/00002.png diff --git a/tests/speculos/screenshots/sign/sign_reject/nanos/00003.png b/old-tests/speculos/screenshots/sign/sign_reject/nanos/00003.png similarity index 100% rename from tests/speculos/screenshots/sign/sign_reject/nanos/00003.png rename to old-tests/speculos/screenshots/sign/sign_reject/nanos/00003.png diff --git a/tests/speculos/screenshots/sign/sign_reject/nanos/00004.png b/old-tests/speculos/screenshots/sign/sign_reject/nanos/00004.png similarity index 100% rename from tests/speculos/screenshots/sign/sign_reject/nanos/00004.png rename to old-tests/speculos/screenshots/sign/sign_reject/nanos/00004.png diff --git a/tests/speculos/screenshots/sign/sign_reject/nanos/00005.png b/old-tests/speculos/screenshots/sign/sign_reject/nanos/00005.png similarity index 100% rename from tests/speculos/screenshots/sign/sign_reject/nanos/00005.png rename to old-tests/speculos/screenshots/sign/sign_reject/nanos/00005.png diff --git a/tests/speculos/screenshots/sign/sign_reject/nanosp/00000.png b/old-tests/speculos/screenshots/sign/sign_reject/nanosp/00000.png similarity index 100% rename from tests/speculos/screenshots/sign/sign_reject/nanosp/00000.png rename to old-tests/speculos/screenshots/sign/sign_reject/nanosp/00000.png diff --git a/tests/speculos/screenshots/sign/sign_reject/nanosp/00001.png b/old-tests/speculos/screenshots/sign/sign_reject/nanosp/00001.png similarity index 100% rename from tests/speculos/screenshots/sign/sign_reject/nanosp/00001.png rename to old-tests/speculos/screenshots/sign/sign_reject/nanosp/00001.png diff --git a/tests/speculos/screenshots/sign/sign_reject/nanosp/00002.png b/old-tests/speculos/screenshots/sign/sign_reject/nanosp/00002.png similarity index 100% rename from tests/speculos/screenshots/sign/sign_reject/nanosp/00002.png rename to old-tests/speculos/screenshots/sign/sign_reject/nanosp/00002.png diff --git a/tests/speculos/screenshots/sign/sign_reject/nanosp/00003.png b/old-tests/speculos/screenshots/sign/sign_reject/nanosp/00003.png similarity index 100% rename from tests/speculos/screenshots/sign/sign_reject/nanosp/00003.png rename to old-tests/speculos/screenshots/sign/sign_reject/nanosp/00003.png diff --git a/tests/speculos/screenshots/sign/sign_reject/nanox/00000.png b/old-tests/speculos/screenshots/sign/sign_reject/nanox/00000.png similarity index 100% rename from tests/speculos/screenshots/sign/sign_reject/nanox/00000.png rename to old-tests/speculos/screenshots/sign/sign_reject/nanox/00000.png diff --git a/tests/speculos/screenshots/sign/sign_reject/nanox/00001.png b/old-tests/speculos/screenshots/sign/sign_reject/nanox/00001.png similarity index 100% rename from tests/speculos/screenshots/sign/sign_reject/nanox/00001.png rename to old-tests/speculos/screenshots/sign/sign_reject/nanox/00001.png diff --git a/tests/speculos/screenshots/sign/sign_reject/nanox/00002.png b/old-tests/speculos/screenshots/sign/sign_reject/nanox/00002.png similarity index 100% rename from tests/speculos/screenshots/sign/sign_reject/nanox/00002.png rename to old-tests/speculos/screenshots/sign/sign_reject/nanox/00002.png diff --git a/tests/speculos/screenshots/sign/sign_reject/nanox/00003.png b/old-tests/speculos/screenshots/sign/sign_reject/nanox/00003.png similarity index 100% rename from tests/speculos/screenshots/sign/sign_reject/nanox/00003.png rename to old-tests/speculos/screenshots/sign/sign_reject/nanox/00003.png diff --git a/tests/speculos/screenshots/sign_tx/burn_reject/nanos/00000.png b/old-tests/speculos/screenshots/sign_tx/burn_reject/nanos/00000.png similarity index 100% rename from tests/speculos/screenshots/sign_tx/burn_reject/nanos/00000.png rename to old-tests/speculos/screenshots/sign_tx/burn_reject/nanos/00000.png diff --git a/tests/speculos/screenshots/sign_tx/burn_reject/nanos/00001.png b/old-tests/speculos/screenshots/sign_tx/burn_reject/nanos/00001.png similarity index 100% rename from tests/speculos/screenshots/sign_tx/burn_reject/nanos/00001.png rename to old-tests/speculos/screenshots/sign_tx/burn_reject/nanos/00001.png diff --git a/tests/speculos/screenshots/sign_tx/burn_reject/nanos/00002.png b/old-tests/speculos/screenshots/sign_tx/burn_reject/nanos/00002.png similarity index 100% rename from tests/speculos/screenshots/sign_tx/burn_reject/nanos/00002.png rename to old-tests/speculos/screenshots/sign_tx/burn_reject/nanos/00002.png diff --git a/tests/speculos/screenshots/sign_tx/burn_reject/nanos/00003.png b/old-tests/speculos/screenshots/sign_tx/burn_reject/nanos/00003.png similarity index 100% rename from tests/speculos/screenshots/sign_tx/burn_reject/nanos/00003.png rename to old-tests/speculos/screenshots/sign_tx/burn_reject/nanos/00003.png diff --git a/tests/speculos/screenshots/sign_tx/burn_reject/nanos/00004.png b/old-tests/speculos/screenshots/sign_tx/burn_reject/nanos/00004.png similarity index 100% rename from tests/speculos/screenshots/sign_tx/burn_reject/nanos/00004.png rename to old-tests/speculos/screenshots/sign_tx/burn_reject/nanos/00004.png diff --git a/tests/speculos/screenshots/sign_tx/burn_reject/nanosp/00000.png b/old-tests/speculos/screenshots/sign_tx/burn_reject/nanosp/00000.png similarity index 100% rename from tests/speculos/screenshots/sign_tx/burn_reject/nanosp/00000.png rename to old-tests/speculos/screenshots/sign_tx/burn_reject/nanosp/00000.png diff --git a/tests/speculos/screenshots/sign_tx/burn_reject/nanosp/00001.png b/old-tests/speculos/screenshots/sign_tx/burn_reject/nanosp/00001.png similarity index 100% rename from tests/speculos/screenshots/sign_tx/burn_reject/nanosp/00001.png rename to old-tests/speculos/screenshots/sign_tx/burn_reject/nanosp/00001.png diff --git a/tests/speculos/screenshots/sign_tx/burn_reject/nanosp/00002.png b/old-tests/speculos/screenshots/sign_tx/burn_reject/nanosp/00002.png similarity index 100% rename from tests/speculos/screenshots/sign_tx/burn_reject/nanosp/00002.png rename to old-tests/speculos/screenshots/sign_tx/burn_reject/nanosp/00002.png diff --git a/tests/speculos/screenshots/sign_tx/burn_reject/nanosp/00003.png b/old-tests/speculos/screenshots/sign_tx/burn_reject/nanosp/00003.png similarity index 100% rename from tests/speculos/screenshots/sign_tx/burn_reject/nanosp/00003.png rename to old-tests/speculos/screenshots/sign_tx/burn_reject/nanosp/00003.png diff --git a/tests/speculos/screenshots/sign_tx/burn_reject/nanosp/00004.png b/old-tests/speculos/screenshots/sign_tx/burn_reject/nanosp/00004.png similarity index 100% rename from tests/speculos/screenshots/sign_tx/burn_reject/nanosp/00004.png rename to old-tests/speculos/screenshots/sign_tx/burn_reject/nanosp/00004.png diff --git a/tests/speculos/screenshots/sign_tx/burn_reject/nanox/00000.png b/old-tests/speculos/screenshots/sign_tx/burn_reject/nanox/00000.png similarity index 100% rename from tests/speculos/screenshots/sign_tx/burn_reject/nanox/00000.png rename to old-tests/speculos/screenshots/sign_tx/burn_reject/nanox/00000.png diff --git a/tests/speculos/screenshots/sign_tx/burn_reject/nanox/00001.png b/old-tests/speculos/screenshots/sign_tx/burn_reject/nanox/00001.png similarity index 100% rename from tests/speculos/screenshots/sign_tx/burn_reject/nanox/00001.png rename to old-tests/speculos/screenshots/sign_tx/burn_reject/nanox/00001.png diff --git a/tests/speculos/screenshots/sign_tx/burn_reject/nanox/00002.png b/old-tests/speculos/screenshots/sign_tx/burn_reject/nanox/00002.png similarity index 100% rename from tests/speculos/screenshots/sign_tx/burn_reject/nanox/00002.png rename to old-tests/speculos/screenshots/sign_tx/burn_reject/nanox/00002.png diff --git a/tests/speculos/screenshots/sign_tx/burn_reject/nanox/00003.png b/old-tests/speculos/screenshots/sign_tx/burn_reject/nanox/00003.png similarity index 100% rename from tests/speculos/screenshots/sign_tx/burn_reject/nanox/00003.png rename to old-tests/speculos/screenshots/sign_tx/burn_reject/nanox/00003.png diff --git a/tests/speculos/screenshots/sign_tx/burn_reject/nanox/00004.png b/old-tests/speculos/screenshots/sign_tx/burn_reject/nanox/00004.png similarity index 100% rename from tests/speculos/screenshots/sign_tx/burn_reject/nanox/00004.png rename to old-tests/speculos/screenshots/sign_tx/burn_reject/nanox/00004.png diff --git a/tests/speculos/screenshots/sign_tx/burn_tx/nanos/00000.png b/old-tests/speculos/screenshots/sign_tx/burn_tx/nanos/00000.png similarity index 100% rename from tests/speculos/screenshots/sign_tx/burn_tx/nanos/00000.png rename to old-tests/speculos/screenshots/sign_tx/burn_tx/nanos/00000.png diff --git a/tests/speculos/screenshots/sign_tx/burn_tx/nanos/00001.png b/old-tests/speculos/screenshots/sign_tx/burn_tx/nanos/00001.png similarity index 100% rename from tests/speculos/screenshots/sign_tx/burn_tx/nanos/00001.png rename to old-tests/speculos/screenshots/sign_tx/burn_tx/nanos/00001.png diff --git a/tests/speculos/screenshots/sign_tx/burn_tx/nanos/00002.png b/old-tests/speculos/screenshots/sign_tx/burn_tx/nanos/00002.png similarity index 100% rename from tests/speculos/screenshots/sign_tx/burn_tx/nanos/00002.png rename to old-tests/speculos/screenshots/sign_tx/burn_tx/nanos/00002.png diff --git a/tests/speculos/screenshots/sign_tx/burn_tx/nanos/00003.png b/old-tests/speculos/screenshots/sign_tx/burn_tx/nanos/00003.png similarity index 100% rename from tests/speculos/screenshots/sign_tx/burn_tx/nanos/00003.png rename to old-tests/speculos/screenshots/sign_tx/burn_tx/nanos/00003.png diff --git a/tests/speculos/screenshots/sign_tx/burn_tx/nanosp/00000.png b/old-tests/speculos/screenshots/sign_tx/burn_tx/nanosp/00000.png similarity index 100% rename from tests/speculos/screenshots/sign_tx/burn_tx/nanosp/00000.png rename to old-tests/speculos/screenshots/sign_tx/burn_tx/nanosp/00000.png diff --git a/tests/speculos/screenshots/sign_tx/burn_tx/nanosp/00001.png b/old-tests/speculos/screenshots/sign_tx/burn_tx/nanosp/00001.png similarity index 100% rename from tests/speculos/screenshots/sign_tx/burn_tx/nanosp/00001.png rename to old-tests/speculos/screenshots/sign_tx/burn_tx/nanosp/00001.png diff --git a/tests/speculos/screenshots/sign_tx/burn_tx/nanosp/00002.png b/old-tests/speculos/screenshots/sign_tx/burn_tx/nanosp/00002.png similarity index 100% rename from tests/speculos/screenshots/sign_tx/burn_tx/nanosp/00002.png rename to old-tests/speculos/screenshots/sign_tx/burn_tx/nanosp/00002.png diff --git a/tests/speculos/screenshots/sign_tx/burn_tx/nanosp/00003.png b/old-tests/speculos/screenshots/sign_tx/burn_tx/nanosp/00003.png similarity index 100% rename from tests/speculos/screenshots/sign_tx/burn_tx/nanosp/00003.png rename to old-tests/speculos/screenshots/sign_tx/burn_tx/nanosp/00003.png diff --git a/tests/speculos/screenshots/sign_tx/burn_tx/nanox/00000.png b/old-tests/speculos/screenshots/sign_tx/burn_tx/nanox/00000.png similarity index 100% rename from tests/speculos/screenshots/sign_tx/burn_tx/nanox/00000.png rename to old-tests/speculos/screenshots/sign_tx/burn_tx/nanox/00000.png diff --git a/tests/speculos/screenshots/sign_tx/burn_tx/nanox/00001.png b/old-tests/speculos/screenshots/sign_tx/burn_tx/nanox/00001.png similarity index 100% rename from tests/speculos/screenshots/sign_tx/burn_tx/nanox/00001.png rename to old-tests/speculos/screenshots/sign_tx/burn_tx/nanox/00001.png diff --git a/tests/speculos/screenshots/sign_tx/burn_tx/nanox/00002.png b/old-tests/speculos/screenshots/sign_tx/burn_tx/nanox/00002.png similarity index 100% rename from tests/speculos/screenshots/sign_tx/burn_tx/nanox/00002.png rename to old-tests/speculos/screenshots/sign_tx/burn_tx/nanox/00002.png diff --git a/tests/speculos/screenshots/sign_tx/burn_tx/nanox/00003.png b/old-tests/speculos/screenshots/sign_tx/burn_tx/nanox/00003.png similarity index 100% rename from tests/speculos/screenshots/sign_tx/burn_tx/nanox/00003.png rename to old-tests/speculos/screenshots/sign_tx/burn_tx/nanox/00003.png diff --git a/tests/speculos/screenshots/sign_tx/sign_confirm_tx/nanos/00000.png b/old-tests/speculos/screenshots/sign_tx/sign_confirm_tx/nanos/00000.png similarity index 100% rename from tests/speculos/screenshots/sign_tx/sign_confirm_tx/nanos/00000.png rename to old-tests/speculos/screenshots/sign_tx/sign_confirm_tx/nanos/00000.png diff --git a/tests/speculos/screenshots/sign_tx/sign_confirm_tx/nanos/00001.png b/old-tests/speculos/screenshots/sign_tx/sign_confirm_tx/nanos/00001.png similarity index 100% rename from tests/speculos/screenshots/sign_tx/sign_confirm_tx/nanos/00001.png rename to old-tests/speculos/screenshots/sign_tx/sign_confirm_tx/nanos/00001.png diff --git a/tests/speculos/screenshots/sign_tx/sign_confirm_tx/nanos/00002.png b/old-tests/speculos/screenshots/sign_tx/sign_confirm_tx/nanos/00002.png similarity index 100% rename from tests/speculos/screenshots/sign_tx/sign_confirm_tx/nanos/00002.png rename to old-tests/speculos/screenshots/sign_tx/sign_confirm_tx/nanos/00002.png diff --git a/tests/speculos/screenshots/sign_tx/sign_confirm_tx/nanos/00003.png b/old-tests/speculos/screenshots/sign_tx/sign_confirm_tx/nanos/00003.png similarity index 100% rename from tests/speculos/screenshots/sign_tx/sign_confirm_tx/nanos/00003.png rename to old-tests/speculos/screenshots/sign_tx/sign_confirm_tx/nanos/00003.png diff --git a/tests/speculos/screenshots/sign_tx/sign_confirm_tx/nanosp/00000.png b/old-tests/speculos/screenshots/sign_tx/sign_confirm_tx/nanosp/00000.png similarity index 100% rename from tests/speculos/screenshots/sign_tx/sign_confirm_tx/nanosp/00000.png rename to old-tests/speculos/screenshots/sign_tx/sign_confirm_tx/nanosp/00000.png diff --git a/tests/speculos/screenshots/sign_tx/sign_confirm_tx/nanosp/00001.png b/old-tests/speculos/screenshots/sign_tx/sign_confirm_tx/nanosp/00001.png similarity index 100% rename from tests/speculos/screenshots/sign_tx/sign_confirm_tx/nanosp/00001.png rename to old-tests/speculos/screenshots/sign_tx/sign_confirm_tx/nanosp/00001.png diff --git a/tests/speculos/screenshots/sign_tx/sign_confirm_tx/nanosp/00002.png b/old-tests/speculos/screenshots/sign_tx/sign_confirm_tx/nanosp/00002.png similarity index 100% rename from tests/speculos/screenshots/sign_tx/sign_confirm_tx/nanosp/00002.png rename to old-tests/speculos/screenshots/sign_tx/sign_confirm_tx/nanosp/00002.png diff --git a/tests/speculos/screenshots/sign_tx/sign_confirm_tx/nanosp/00003.png b/old-tests/speculos/screenshots/sign_tx/sign_confirm_tx/nanosp/00003.png similarity index 100% rename from tests/speculos/screenshots/sign_tx/sign_confirm_tx/nanosp/00003.png rename to old-tests/speculos/screenshots/sign_tx/sign_confirm_tx/nanosp/00003.png diff --git a/tests/speculos/screenshots/sign_tx/sign_confirm_tx/nanox/00000.png b/old-tests/speculos/screenshots/sign_tx/sign_confirm_tx/nanox/00000.png similarity index 100% rename from tests/speculos/screenshots/sign_tx/sign_confirm_tx/nanox/00000.png rename to old-tests/speculos/screenshots/sign_tx/sign_confirm_tx/nanox/00000.png diff --git a/tests/speculos/screenshots/sign_tx/sign_confirm_tx/nanox/00001.png b/old-tests/speculos/screenshots/sign_tx/sign_confirm_tx/nanox/00001.png similarity index 100% rename from tests/speculos/screenshots/sign_tx/sign_confirm_tx/nanox/00001.png rename to old-tests/speculos/screenshots/sign_tx/sign_confirm_tx/nanox/00001.png diff --git a/tests/speculos/screenshots/sign_tx/sign_confirm_tx/nanox/00002.png b/old-tests/speculos/screenshots/sign_tx/sign_confirm_tx/nanox/00002.png similarity index 100% rename from tests/speculos/screenshots/sign_tx/sign_confirm_tx/nanox/00002.png rename to old-tests/speculos/screenshots/sign_tx/sign_confirm_tx/nanox/00002.png diff --git a/tests/speculos/screenshots/sign_tx/sign_confirm_tx/nanox/00003.png b/old-tests/speculos/screenshots/sign_tx/sign_confirm_tx/nanox/00003.png similarity index 100% rename from tests/speculos/screenshots/sign_tx/sign_confirm_tx/nanox/00003.png rename to old-tests/speculos/screenshots/sign_tx/sign_confirm_tx/nanox/00003.png diff --git a/tests/speculos/screenshots/sign_tx/sign_reject_tx/nanos/00000.png b/old-tests/speculos/screenshots/sign_tx/sign_reject_tx/nanos/00000.png similarity index 100% rename from tests/speculos/screenshots/sign_tx/sign_reject_tx/nanos/00000.png rename to old-tests/speculos/screenshots/sign_tx/sign_reject_tx/nanos/00000.png diff --git a/tests/speculos/screenshots/sign_tx/sign_reject_tx/nanos/00001.png b/old-tests/speculos/screenshots/sign_tx/sign_reject_tx/nanos/00001.png similarity index 100% rename from tests/speculos/screenshots/sign_tx/sign_reject_tx/nanos/00001.png rename to old-tests/speculos/screenshots/sign_tx/sign_reject_tx/nanos/00001.png diff --git a/tests/speculos/screenshots/sign_tx/sign_reject_tx/nanos/00002.png b/old-tests/speculos/screenshots/sign_tx/sign_reject_tx/nanos/00002.png similarity index 100% rename from tests/speculos/screenshots/sign_tx/sign_reject_tx/nanos/00002.png rename to old-tests/speculos/screenshots/sign_tx/sign_reject_tx/nanos/00002.png diff --git a/tests/speculos/screenshots/sign_tx/sign_reject_tx/nanos/00003.png b/old-tests/speculos/screenshots/sign_tx/sign_reject_tx/nanos/00003.png similarity index 100% rename from tests/speculos/screenshots/sign_tx/sign_reject_tx/nanos/00003.png rename to old-tests/speculos/screenshots/sign_tx/sign_reject_tx/nanos/00003.png diff --git a/tests/speculos/screenshots/sign_tx/sign_reject_tx/nanos/00004.png b/old-tests/speculos/screenshots/sign_tx/sign_reject_tx/nanos/00004.png similarity index 100% rename from tests/speculos/screenshots/sign_tx/sign_reject_tx/nanos/00004.png rename to old-tests/speculos/screenshots/sign_tx/sign_reject_tx/nanos/00004.png diff --git a/tests/speculos/screenshots/sign_tx/sign_reject_tx/nanosp/00000.png b/old-tests/speculos/screenshots/sign_tx/sign_reject_tx/nanosp/00000.png similarity index 100% rename from tests/speculos/screenshots/sign_tx/sign_reject_tx/nanosp/00000.png rename to old-tests/speculos/screenshots/sign_tx/sign_reject_tx/nanosp/00000.png diff --git a/tests/speculos/screenshots/sign_tx/sign_reject_tx/nanosp/00001.png b/old-tests/speculos/screenshots/sign_tx/sign_reject_tx/nanosp/00001.png similarity index 100% rename from tests/speculos/screenshots/sign_tx/sign_reject_tx/nanosp/00001.png rename to old-tests/speculos/screenshots/sign_tx/sign_reject_tx/nanosp/00001.png diff --git a/tests/speculos/screenshots/sign_tx/sign_reject_tx/nanosp/00002.png b/old-tests/speculos/screenshots/sign_tx/sign_reject_tx/nanosp/00002.png similarity index 100% rename from tests/speculos/screenshots/sign_tx/sign_reject_tx/nanosp/00002.png rename to old-tests/speculos/screenshots/sign_tx/sign_reject_tx/nanosp/00002.png diff --git a/tests/speculos/screenshots/sign_tx/sign_reject_tx/nanosp/00003.png b/old-tests/speculos/screenshots/sign_tx/sign_reject_tx/nanosp/00003.png similarity index 100% rename from tests/speculos/screenshots/sign_tx/sign_reject_tx/nanosp/00003.png rename to old-tests/speculos/screenshots/sign_tx/sign_reject_tx/nanosp/00003.png diff --git a/tests/speculos/screenshots/sign_tx/sign_reject_tx/nanosp/00004.png b/old-tests/speculos/screenshots/sign_tx/sign_reject_tx/nanosp/00004.png similarity index 100% rename from tests/speculos/screenshots/sign_tx/sign_reject_tx/nanosp/00004.png rename to old-tests/speculos/screenshots/sign_tx/sign_reject_tx/nanosp/00004.png diff --git a/tests/speculos/screenshots/sign_tx/sign_reject_tx/nanox/00000.png b/old-tests/speculos/screenshots/sign_tx/sign_reject_tx/nanox/00000.png similarity index 100% rename from tests/speculos/screenshots/sign_tx/sign_reject_tx/nanox/00000.png rename to old-tests/speculos/screenshots/sign_tx/sign_reject_tx/nanox/00000.png diff --git a/tests/speculos/screenshots/sign_tx/sign_reject_tx/nanox/00001.png b/old-tests/speculos/screenshots/sign_tx/sign_reject_tx/nanox/00001.png similarity index 100% rename from tests/speculos/screenshots/sign_tx/sign_reject_tx/nanox/00001.png rename to old-tests/speculos/screenshots/sign_tx/sign_reject_tx/nanox/00001.png diff --git a/tests/speculos/screenshots/sign_tx/sign_reject_tx/nanox/00002.png b/old-tests/speculos/screenshots/sign_tx/sign_reject_tx/nanox/00002.png similarity index 100% rename from tests/speculos/screenshots/sign_tx/sign_reject_tx/nanox/00002.png rename to old-tests/speculos/screenshots/sign_tx/sign_reject_tx/nanox/00002.png diff --git a/tests/speculos/screenshots/sign_tx/sign_reject_tx/nanox/00003.png b/old-tests/speculos/screenshots/sign_tx/sign_reject_tx/nanox/00003.png similarity index 100% rename from tests/speculos/screenshots/sign_tx/sign_reject_tx/nanox/00003.png rename to old-tests/speculos/screenshots/sign_tx/sign_reject_tx/nanox/00003.png diff --git a/tests/speculos/screenshots/sign_tx/sign_reject_tx/nanox/00004.png b/old-tests/speculos/screenshots/sign_tx/sign_reject_tx/nanox/00004.png similarity index 100% rename from tests/speculos/screenshots/sign_tx/sign_reject_tx/nanox/00004.png rename to old-tests/speculos/screenshots/sign_tx/sign_reject_tx/nanox/00004.png diff --git a/tests/speculos/setup.cfg b/old-tests/speculos/setup.cfg similarity index 100% rename from tests/speculos/setup.cfg rename to old-tests/speculos/setup.cfg diff --git a/tests/speculos/test_address.py b/old-tests/speculos/test_address.py similarity index 100% rename from tests/speculos/test_address.py rename to old-tests/speculos/test_address.py diff --git a/tests/speculos/test_configuration.py b/old-tests/speculos/test_configuration.py similarity index 100% rename from tests/speculos/test_configuration.py rename to old-tests/speculos/test_configuration.py diff --git a/tests/speculos/test_pubkey.py b/old-tests/speculos/test_pubkey.py similarity index 100% rename from tests/speculos/test_pubkey.py rename to old-tests/speculos/test_pubkey.py diff --git a/tests/speculos/test_sign_message.py b/old-tests/speculos/test_sign_message.py similarity index 100% rename from tests/speculos/test_sign_message.py rename to old-tests/speculos/test_sign_message.py diff --git a/tests/speculos/test_sign_tx.py b/old-tests/speculos/test_sign_tx.py similarity index 100% rename from tests/speculos/test_sign_tx.py rename to old-tests/speculos/test_sign_tx.py diff --git a/tests/src/main.rs b/old-tests/src/main.rs similarity index 100% rename from tests/src/main.rs rename to old-tests/src/main.rs diff --git a/tests/application_client/__init__.py b/tests/application_client/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/application_client/everscale_command_sender.py b/tests/application_client/everscale_command_sender.py new file mode 100644 index 0000000..b774bb6 --- /dev/null +++ b/tests/application_client/everscale_command_sender.py @@ -0,0 +1,176 @@ +from enum import IntEnum +from typing import Generator, List, Optional +from contextlib import contextmanager + +from ragger.backend.interface import BackendInterface, RAPDU + +MAX_APDU_LEN: int = 255 + +CLA: int = 0xE0 + + +class P1(IntEnum): + # Parameter 1 for first APDU number. + P1_START = 0x00 + # Parameter 1 for maximum APDU number. + P1_MAX = 0x03 + # Parameter 1 for screen confirmation for GET_PUBLIC_KEY. + P1_CONFIRM = 0x01 + + +class P2(IntEnum): + # Parameter 2 for last APDU to receive. + P2_LAST = 0x00 + # Parameter 2 for more APDU to receive. + P2_MORE = 0x80 + + +class InsType(IntEnum): + GET_APP_CONFIGURATION = 0x01 + GET_PUBLIC_KEY = 0x02 + SIGN_MESSAGE = 0x03 + GET_ADDRESS = 0x04 + SIGN_TRANSACTION = 0x05 + + +class WalletType(IntEnum): + WALLET_V3 = 0 + EVER_WALLET = 1 + SAFE_MULTISIG_WALLET = 2 + SAFE_MULTISIG_WALLET_24H = 3 + SETCODE_MULTISIG_WALLET = 4 + BRIDGE_MULTISIG_WALLET = 5 + SURF_WALLET = 6 + MULTISIG_2 = 7 + MULTISIG_2_1 = 8 + + +class Errors(IntEnum): + SW_INVALID_DATA = 0x6B00 + SW_CELL_UNDERFLOW = 0x6B01 + SW_RANGE_CHECK_FAIL = 0x6B02 + SW_WRONG_LABEL = 0x6B03 + SW_INVALID_FLAG = 0x6B04 + SW_END_OF_STREAM = 0x6B05 + SW_SLICE_IS_EMPTY = 0x6B06 + SW_INVALID_KEY = 0x6B07 + SW_CELL_IS_EMPTY = 0x6B08 + SW_INVALID_HASH = 0x6B09 + SW_INVALID_CELL_INDEX = 0x6B10 + SW_INVALID_REQUEST = 0x6B11 + SW_INVALID_FUNCTION_ID = 0x6B12 + SW_INVALID_SRC_ADDRESS = 0x6B13 + SW_INVALID_WALLET_ID = 0x6B14 + SW_INVALID_WALLET_TYPE = 0x6B15 + SW_INVALID_TICKER_LENGTH = 0x6B16 + SW_DENY = 0x6985 + # Status Word from everscale app + # SW_WRONG_P1P2 = 0x6A86 + # SW_WRONG_DATA_LENGTH = 0x6A87 + # SW_INS_NOT_SUPPORTED = 0x6D00 + # SW_CLA_NOT_SUPPORTED = 0x6E00 + # SW_WRONG_RESPONSE_LENGTH = 0xB000 + # SW_DISPLAY_BIP32_PATH_FAIL = 0xB001 + # SW_DISPLAY_ADDRESS_FAIL = 0xB002 + # SW_DISPLAY_AMOUNT_FAIL = 0xB003 + # SW_WRONG_TX_LENGTH = 0xB004 + # SW_TX_PARSING_FAIL = 0xB005 + # SW_TX_HASH_FAIL = 0xB006 + # SW_BAD_STATE = 0xB007 + # SW_SIGNATURE_FAIL = 0xB008 + + +def split_message(message: bytes, max_size: int) -> List[bytes]: + return [message[x : x + max_size] for x in range(0, len(message), max_size)] + + +class EverscaleCommandSender: + def __init__(self, backend: BackendInterface) -> None: + self.backend = backend + + def get_app_and_version(self) -> RAPDU: + return self.backend.exchange( + cla=0xB0, # specific CLA for BOLOS + ins=0x01, # specific INS for get_app_and_version + p1=P1.P1_START, + p2=P2.P2_LAST, + data=b"", + ) + + def get_app_config(self) -> RAPDU: + return self.backend.exchange( + cla=CLA, + ins=InsType.GET_APP_CONFIGURATION, + p1=P1.P1_START, + p2=P2.P2_LAST, + data=b"", + ) + + def get_public_key(self, account_number: int) -> RAPDU: + return self.backend.exchange( + cla=CLA, + ins=InsType.GET_PUBLIC_KEY, + p1=P1.P1_START, + p2=P2.P2_LAST, + data=account_number.to_bytes(4, "big"), + ) + + @contextmanager + def get_public_key_with_confirmation( + self, account_number: int + ) -> Generator[None, None, None]: + with self.backend.exchange_async( + cla=CLA, + ins=InsType.GET_PUBLIC_KEY, + p1=P1.P1_CONFIRM, + p2=P2.P2_LAST, + data=account_number.to_bytes(4, "big"), + ) as response: + yield response + + def get_address(self, account_number: int, wallet_type: WalletType) -> RAPDU: + return self.backend.exchange( + cla=CLA, + ins=InsType.GET_ADDRESS, + p1=P1.P1_START, + p2=P2.P2_LAST, + data=account_number.to_bytes(4, "big") + wallet_type.to_bytes(1, "big"), + ) + + @contextmanager + def get_address_with_confirmation( + self, account_number: int, wallet_type: WalletType + ) -> Generator[None, None, None]: + with self.backend.exchange_async( + cla=CLA, + ins=InsType.GET_ADDRESS, + p1=P1.P1_CONFIRM, + p2=P2.P2_LAST, + data=account_number.to_bytes(4, "big") + wallet_type.to_bytes(1, "big"), + ) as response: + yield response + + @contextmanager + def sign_message(self, payload: bytes) -> Generator[None, None, None]: + with self.backend.exchange_async( + cla=CLA, + ins=InsType.SIGN_MESSAGE, + p1=P1.P1_CONFIRM, + p2=P2.P2_LAST, + data=payload, + ) as response: + yield response + + @contextmanager + def sign_tx(self, transaction: bytes) -> Generator[None, None, None]: + with self.backend.exchange_async( + cla=CLA, + ins=InsType.SIGN_TRANSACTION, + p1=P1.P1_CONFIRM, + p2=P2.P2_LAST, + data=transaction, + ) as response: + yield response + + def get_async_response(self) -> Optional[RAPDU]: + return self.backend.last_async_response diff --git a/tests/application_client/everscale_response_unpacker.py b/tests/application_client/everscale_response_unpacker.py new file mode 100644 index 0000000..9c6fed4 --- /dev/null +++ b/tests/application_client/everscale_response_unpacker.py @@ -0,0 +1,77 @@ +from typing import Tuple +from struct import unpack + +# remainder, data_len, data +def pop_sized_buf_from_buffer(buffer:bytes, size:int) -> Tuple[bytes, bytes]: + return buffer[size:], buffer[0:size] + +# remainder, data_len, data +def pop_size_prefixed_buf_from_buf(buffer:bytes) -> Tuple[bytes, int, bytes]: + data_len = buffer[0] + return buffer[1+data_len:], data_len, buffer[1:data_len+1] + +# Unpack from response: +# response = app_name (var) +def unpack_get_app_name_response(response: bytes) -> str: + return response.decode("ascii") + +# Unpack from response: +# response = MAJOR (1) +# MINOR (1) +# PATCH (1) +def unpack_get_version_response(response: bytes) -> Tuple[int, int, int]: + assert len(response) == 3 + major, minor, patch = unpack("BBB", response) + return (major, minor, patch) + +# Unpack from response: +# response = format_id (1) +# app_name_raw_len (1) +# app_name_raw (var) +# version_raw_len (1) +# version_raw (var) +# unused_len (1) +# unused (var) +def unpack_get_app_and_version_response(response: bytes) -> Tuple[str, str]: + response, _ = pop_sized_buf_from_buffer(response, 1) + response, _, app_name_raw = pop_size_prefixed_buf_from_buf(response) + response, _, version_raw = pop_size_prefixed_buf_from_buf(response) + response, _, _ = pop_size_prefixed_buf_from_buf(response) + + assert len(response) == 0 + + return app_name_raw.decode("ascii"), version_raw.decode("ascii") + +# Unpack from response: +# response = pub_key_len (1) +# pub_key (var) +def unpack_get_public_key_response(response: bytes) -> Tuple[int, bytes]: + response, pub_key_len, pub_key = pop_size_prefixed_buf_from_buf(response) + + assert pub_key_len == 32 + assert len(response) == 0 + + return pub_key_len, pub_key + +# Unpack from response: +# response = address_len (1) +# address (var) +def unpack_get_address_response(response: bytes) -> Tuple[int, bytes]: + response, address_len, address = pop_size_prefixed_buf_from_buf(response) + + assert address_len == 32 + assert len(response) == 0 + + return address_len, address + +# Unpack from response: +# response = der_sig_len (1) +# der_sig (var) +# v (1) +def unpack_sign_tx_response(response: bytes) -> Tuple[int, bytes, int]: + response, der_sig_len, der_sig = pop_size_prefixed_buf_from_buf(response) + response, v = pop_sized_buf_from_buffer(response, 1) + + assert len(response) == 0 + + return der_sig_len, der_sig, int.from_bytes(v, byteorder='big') diff --git a/tests/application_client/everscale_transaction.py b/tests/application_client/everscale_transaction.py new file mode 100644 index 0000000..31aa1d7 --- /dev/null +++ b/tests/application_client/everscale_transaction.py @@ -0,0 +1,188 @@ +# from application_client.everscale_command_sender import WalletType + +# class Transaction: +# ADDRESS_LENGTH = 32 +# CHAIN_ID_LENGTH = 4 + +# FLAG_WITH_WALLET_ID = 0x01 +# FLAG_WITH_WORKCHAIN_ID = 0x02 +# FLAG_WITH_ADDRESS = 0x04 +# FLAG_WITH_CHAIN_ID = 0x08 + +# def __init__(self, +# decimals: int, +# ticker: str, +# message: bytes, +# current_wallet_type: WalletType, +# workchain_id: int | None = None, +# prepend_address: bytes | None = None, +# chain_id: bytes | None = None) -> None: +# """ +# Construct a Transaction. + +# The metadata byte is deduced as follows: +# - FLAG_WITH_WALLET_ID is set if a current_wallet_type is provided and +# it differs from the origin_wallet_type. +# - FLAG_WITH_WORKCHAIN_ID is set if workchain_id is provided. +# - FLAG_WITH_ADDRESS is set if prepend_address is provided. +# - FLAG_WITH_CHAIN_ID is set if chain_id is provided. + +# If current_wallet_type is None or equals origin_wallet_type, then that field is omitted +# and on deserialization the origin_wallet_type will be used. +# """ +# self.decimals = decimals +# self.ticker = ticker +# self.message = message +# self.workchain_id = workchain_id +# self.prepend_address = prepend_address +# self.chain_id = chain_id + +# # Deduce metadata flags based on optional inputs. +# metadata = 0 +# if current_wallet_type is not None: +# metadata |= self.FLAG_WITH_WALLET_ID +# self.current_wallet_type = current_wallet_type +# else: +# # Do not include the field; on the device, it will be set to origin_wallet_type. +# self.current_wallet_type = None + +# if workchain_id is not None: +# metadata |= self.FLAG_WITH_WORKCHAIN_ID + +# if prepend_address is not None: +# if len(prepend_address) != self.ADDRESS_LENGTH: +# raise ValueError(f"prepend_address must be {self.ADDRESS_LENGTH} bytes") +# metadata |= self.FLAG_WITH_ADDRESS + +# if chain_id is not None: +# if len(chain_id) != self.CHAIN_ID_LENGTH: +# raise ValueError(f"chain_id must be {self.CHAIN_ID_LENGTH} bytes") +# metadata |= self.FLAG_WITH_CHAIN_ID + +# self.metadata = metadata + +# # Nice-to-haves: check ticker length constraints. +# ticker_len = len(ticker) +# if ticker_len == 0 or ticker_len > 10: +# raise ValueError("Ticker length must be between 1 and 10 bytes.") + +# def serialize(self) -> bytes: +# """ +# Serialize the transaction into a byte-buffer with the following structure: + +# [decimals:1] [ticker_length:1] [ticker:N] [metadata:1] +# [optional fields (if flagged)...] [message:remaining bytes] +# """ +# result = bytearray() +# # 1. Decimals (1 byte) +# result.append(self.decimals) + +# # 2. Ticker: length (1 byte) followed by its ASCII bytes +# ticker_bytes = self.ticker.encode("ascii") +# ticker_len = len(ticker_bytes) +# result.append(ticker_len) +# result.extend(ticker_bytes) + +# # 3. Metadata (1 byte; deduced from optional parameters) +# result.append(self.metadata) + +# # 4. Conditionally append optional fields based on metadata flags. +# if self.metadata & self.FLAG_WITH_WALLET_ID: +# # current_wallet_type is provided and differs from origin_wallet_type. +# result.append(self.current_wallet_type) +# # Workchain id. +# if self.metadata & self.FLAG_WITH_WORKCHAIN_ID: +# result.append(self.workchain_id) +# # Prepend address. +# if self.metadata & self.FLAG_WITH_ADDRESS: +# result.extend(self.prepend_address) +# # Chain id. +# if self.metadata & self.FLAG_WITH_CHAIN_ID: +# result.extend(self.chain_id) + +# # 5. Append the message (payload). +# result.extend(self.message) + +# return bytes(result) + +# @classmethod +# def from_bytes(cls, data: bytes) -> "Transaction": +# """ +# Deserialize a byte-buffer into a Transaction object. + +# The parsing order in the buffer is: +# decimals (1 byte) -> +# ticker_length (1 byte) -> +# ticker -> +# metadata (1 byte) -> +# [optional fields... based on metadata] -> +# message (remaining bytes) + +# If the metadata does NOT include FLAG_WITH_WALLET_ID, then current_wallet_type +# defaults to origin_wallet_type. +# """ +# offset = 0 + +# # Read decimals (1 byte) +# if len(data) < offset + 1: +# raise ValueError("Data too short for decimals") +# decimals = data[offset] +# offset += 1 + +# # Read ticker: first its length (1 byte) then the ticker string +# if len(data) < offset + 1: +# raise ValueError("Data too short for ticker length") +# ticker_len = data[offset] +# offset += 1 +# if len(data) < offset + ticker_len: +# raise ValueError("Data too short for ticker") +# ticker = data[offset:offset+ticker_len].decode("ascii") +# offset += ticker_len + +# # Read metadata (1 byte) +# if len(data) < offset + 1: +# raise ValueError("Data too short for metadata") +# metadata = data[offset] +# offset += 1 + +# # Read optional fields based on metadata flags. +# current_wallet_type = None +# if metadata & cls.FLAG_WITH_WALLET_ID: +# if len(data) < offset + 1: +# raise ValueError("Data too short for current_wallet_type") +# current_wallet_type = data[offset] +# offset += 1 + +# workchain_id = None +# if metadata & cls.FLAG_WITH_WORKCHAIN_ID: +# if len(data) < offset + 1: +# raise ValueError("Data too short for workchain_id") +# workchain_id = data[offset] +# offset += 1 + +# prepend_address = None +# if metadata & cls.FLAG_WITH_ADDRESS: +# if len(data) < offset + cls.ADDRESS_LENGTH: +# raise ValueError("Data too short for prepend_address") +# prepend_address = data[offset:offset+cls.ADDRESS_LENGTH] +# offset += cls.ADDRESS_LENGTH + +# chain_id = None +# if metadata & cls.FLAG_WITH_CHAIN_ID: +# if len(data) < offset + cls.CHAIN_ID_LENGTH: +# raise ValueError("Data too short for chain_id") +# chain_id = data[offset:offset+cls.CHAIN_ID_LENGTH] +# offset += cls.CHAIN_ID_LENGTH + +# # The remaining bytes are the message. +# message = data[offset:] + +# return cls( +# decimals=decimals, +# ticker=ticker, +# message=message, +# current_wallet_type=current_wallet_type, +# workchain_id=workchain_id, +# prepend_address=prepend_address, +# chain_id=chain_id +# ) diff --git a/tests/application_client/everscale_utils.py b/tests/application_client/everscale_utils.py new file mode 100644 index 0000000..fd96e62 --- /dev/null +++ b/tests/application_client/everscale_utils.py @@ -0,0 +1,61 @@ +from io import BytesIO +from typing import Optional, Literal + + +UINT64_MAX: int = 2**64-1 +UINT32_MAX: int = 2**32-1 +UINT16_MAX: int = 2**16-1 + + +def write_varint(n: int) -> bytes: + if n < 0xFC: + return n.to_bytes(1, byteorder="little") + + if n <= UINT16_MAX: + return b"\xFD" + n.to_bytes(2, byteorder="little") + + if n <= UINT32_MAX: + return b"\xFE" + n.to_bytes(4, byteorder="little") + + if n <= UINT64_MAX: + return b"\xFF" + n.to_bytes(8, byteorder="little") + + raise ValueError(f"Can't write to varint: '{n}'!") + + +def read_varint(buf: BytesIO, + prefix: Optional[bytes] = None) -> int: + b: bytes = prefix if prefix else buf.read(1) + + if not b: + raise ValueError(f"Can't read prefix: '{b.hex()}'!") + + n: int = {b"\xfd": 2, b"\xfe": 4, b"\xff": 8}.get(b, 1) # default to 1 + + b = buf.read(n) if n > 1 else b + + if len(b) != n: + raise ValueError("Can't read varint!") + + return int.from_bytes(b, byteorder="little") + + +def read(buf: BytesIO, size: int) -> bytes: + b: bytes = buf.read(size) + + if len(b) < size: + raise ValueError(f"Can't read {size} bytes in buffer!") + + return b + + +def read_uint(buf: BytesIO, + bit_len: int, + byteorder: Literal['big', 'little'] = 'little') -> int: + size: int = bit_len // 8 + b: bytes = buf.read(size) + + if len(b) < size: + raise ValueError(f"Can't read u{bit_len} in buffer!") + + return int.from_bytes(b, byteorder) diff --git a/tests/application_client/py.typed b/tests/application_client/py.typed new file mode 100644 index 0000000..e69de29 diff --git a/tests/conftest.py b/tests/conftest.py new file mode 100644 index 0000000..76b5e0c --- /dev/null +++ b/tests/conftest.py @@ -0,0 +1,24 @@ +from ragger.conftest import configuration + +########################### +### CONFIGURATION START ### +########################### + +# You can configure optional parameters by overriding the value of ragger.configuration.OPTIONAL_CONFIGURATION +# Please refer to ragger/conftest/configuration.py for their descriptions and accepted values + +# Define pytest markers +def pytest_configure(config): + config.addinivalue_line( + "markers", + "active_test_scope: marks tests related to application name functionality", + ) + # Add more markers here as needed + + +######################### +### CONFIGURATION END ### +######################### + +# Pull all features from the base ragger conftest using the overridden configuration +pytest_plugins = ("ragger.conftest.base_conftest", ) diff --git a/tests/requirements.txt b/tests/requirements.txt new file mode 100644 index 0000000..dd07dfb --- /dev/null +++ b/tests/requirements.txt @@ -0,0 +1,4 @@ +pytest +ragger[speculos,ledgerwallet]>=1.11.4 +ecdsa>=0.16.1,<0.17.0 +pycryptodome diff --git a/tests/setup.cfg b/tests/setup.cfg new file mode 100644 index 0000000..2d024b3 --- /dev/null +++ b/tests/setup.cfg @@ -0,0 +1,23 @@ +[tool:pytest] +addopts = --strict-markers -m active_test_scope + +[pylint] +disable = C0114, # missing-module-docstring + C0115, # missing-class-docstring + C0116, # missing-function-docstring + C0103, # invalid-name + R0801, # duplicate-code + R0913, # too-many-arguments + R0917 # too-many-positional-arguments + +max-line-length=120 +extension-pkg-whitelist=hid + +[pycodestyle] +max-line-length = 100 + +[mypy-hid.*] +ignore_missing_imports = True + +[mypy-pytest.*] +ignore_missing_imports = True diff --git a/tests/snapshots/nanosp/test_get_address_wallet_v3_confirm_accepted/00000.png b/tests/snapshots/nanosp/test_get_address_wallet_v3_confirm_accepted/00000.png new file mode 100644 index 0000000000000000000000000000000000000000..a487005a859c0e4cfa0212a67f75a4794d81978c GIT binary patch literal 400 zcmV;B0dM|^P)CI7!~g&QfPa@`!PrJQ5_gtexv+u#;<7n?ZA>=8WP3sS)E3>Z zE!xY!9dS=7B}gQ@x;^0FVDIF?`GpenfZ9e>)xCO*lgBykAKe#*G9mk>o6EkWtAGi$ zGexMpHiozruqDn$Y{#w$*~F;G!$#0S7$x##_JEJys@+nJ)BK}UfHaSYH}BKlb~|vz<*qUayO&UL-bn@O u0WKrm9KB3jyJN~A3;+NC0000$MC1WGrw>UKISsS`00007f41`H4H{t$A@?G-a3Pqu<#o}@1@9$}fku0%ThPF!~gb+dqA>^C5uIsuk{4d9T zS3Z8YzUBId<-UvGCoWpLbdQcHjvQ;%tk&B8?SK1TEBx7hMIW^f>fKOlwFUxjnajcP z-OiCaz*=tofDZr4KFg(7YgGq&@Rcn?2x)*ILvP{W9WZ1JuKl?y^aE32<+#>o0|Y>@f`GM(Ncr|y8h;0}$$;zDX`v$1xH z(jbi6P`3bmh`#a3=kr&wUJp+nQ@)@7<*7gjA>^m<%lczldl|NC>ZWrDgdC~V3l3>G zLH*?Y>#KPpJq`N~f#{lpjin%}J8sng`H@OBZ1D}8ex-s+HXp>Y3JlLRff%ROhZ5bJ z@*)#n&Bf7qth$G%;TS)&I1*~8RqRrZVXtImXeC>fH~N;|MwasF0d1GPR|EK_0enT_ zO#nDv6CE2$YTv`&V1gA8gLAv4ytCBjcS>aE$58=3`2o)E}u|pZ5;eCtMSf* zF0KY1O(Q2oIOV0}&xF!N6=4t^)Q_%usk+U?;dYTgjBCH8SmtPx1z2BFzeE^}5s3zu zaa85ivUJ>2coVR$-!6I`(&;QM7DS!V=~VZtq3>5Wvu~3QY4SId&j7U%ugmMgs}U1!Bc zH4Dp>pX&T@fwwSXfV<;$N&TJ5e>&o#V^92bwA!LdiGHNeJr(Fx>dH#0!36k{)^PQd zIv*xyS-x%b%i5=|<^;&W#mijHe?Xaf8|7>bk!L_Ejk#Ea5JCtcguI%+Tt#N5f~LHY P00000NkvXXu0mjfn=Q4X literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanosp/test_get_address_wallet_v3_confirm_accepted/00002.png b/tests/snapshots/nanosp/test_get_address_wallet_v3_confirm_accepted/00002.png new file mode 100644 index 0000000000000000000000000000000000000000..79ec8e7d5f4668017394572679a188b792d1ef70 GIT binary patch literal 498 zcmV*S6;srWKHAi^h!zFxUtJDqm8Ea z9rNzALm^q>xitNU(YR64UP|5nWF1Akk1LaR!Q5YZ9KACV#eURt_~q%TbGA$6H3u%p zJogO1o_6;ql!phhj?8JYj+0y%l1`fs-7^3av|+f|n&x?zb}dPI8$MPx#07*qoM6N<$g6k6JrvLx| literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanosp/test_get_address_wallet_v3_confirm_accepted/00003.png b/tests/snapshots/nanosp/test_get_address_wallet_v3_confirm_accepted/00003.png new file mode 100644 index 0000000000000000000000000000000000000000..78530ed78893e8cde716b8c31d30c1cb56cec73a GIT binary patch literal 369 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h6`U|_WHba4!+nDh2VG~Xcwk(P&x z3)S!bpLC;}UuDU|MO!+Jod3P|R5r6{pX~zF0|gT%26<`T{T*_-xRm|fi)A_DwP|4u zk1alRYrXrl&7>ePtl`Dg1Ll7_D%QL^;QO}e@r*i)a}8^{Zkzo5pnJe9hTGs)%i9RC z2YX)kopaUu!*yX^<(ljOafd(VJ$`faOn+Rm{dn)VSh(O}xmV@2(sNgM{y)Fspw}8F z?VIlpU+W0(yO8^$vgAz6x~JdvT`wp)rTMS?c;!KRuJu=CXIz>qbCu`Eg=N1@Caz2l zXef@WjPbS{x`#dx8HeXrotLqoTi}!zV zWi2{>VN>7nJ8ahbIp@!pu@k+dTCr@8V=d>cc^8CC`cqk8A;56?-sZ_S(sh?ur-Fn$ MUHx3vIVCg!0MAmW;Q#;t literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanosp/test_get_address_wallet_v3_confirm_accepted/00004.png b/tests/snapshots/nanosp/test_get_address_wallet_v3_confirm_accepted/00004.png new file mode 100644 index 0000000000000000000000000000000000000000..5fd127e517c190a1684db420b839a65dd8776a10 GIT binary patch literal 356 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h6`U|`htba4!+nDh2#AYZeBfa}G~ z%X2sUSKT3Q%6Ru-)(e8M#-Se-4!|1j!jMc=4!j z_CJRO);kNf|C#^xTYZvZt?H%gi`lBKIP^;~T)*|9>>tm^$s6J??VLTmiitVa@RZl# z9D}7HW~IBg#_v|Osdspo)b@#I##$}$!vTL1erwOq|6RGGG~%xIOYz59T*k-q6J81a z$=e)pd!KrK?JqHvo`lxakeiYh%(DN_TKY9re^&30zAaAgrtV<9s?#_7_s4|tE$2+UT~i!DCi)dVeekXbfGQn;e2~0fsAjk5Y(@*V#~rbuHu`7A_H&AxgwHf8y4cdKvg$JbB4n%ez%sZ31aBYd&Oo@(7)_WJ(Znl2o8^PD` zFE`_Y-IS+Kdq0Q2-7r_C=}F(5ev`U`H~)QH|9$1FHE$YjoVax+e0xei%S`SAGlOm! zp7{T3NA-mVOYb&rdU8MdyIHo@@7cE*uj@I+Zu{2i)KMSV-E~oCI7!~g&QfPa@`!PrJQ5_gtexv+u#;<7n?ZA>=8WP3sS)E3>Z zE!xY!9dS=7B}gQ@x;^0FVDIF?`GpenfZ9e>)xCO*lgBykAKe#*G9mk>o6EkWtAGi$ zGexMpHiozruqDn$Y{#w$*~F;G!$#0S7$x##_JEJys@+nJ)BK}UfHaSYH}BKlb~|vz<*qUayO&UL-bn@O u0WKrm9KB3jyJN~A3;+NC0000$MC1WGrw>UKISsS`00007f41`H4H{t$A@?G-a3Pqu<#o}@1@9$}fku0%ThPF!~gb+dqA>^C5uIsuk{4d9T zS3Z8YzUBId<-UvGCoWpLbdQcHjvQ;%tk&B8?SK1TEBx7hMIW^f>fKOlwFUxjnajcP z-OiCaz*=tofDZr4KFg(7YgGq&@Rcn?2x)*ILvP{W9WZ1JuKl?y^aE32<+#>o0|Y>@f`GM(Ncr|y8h;0}$$;zDX`v$1xH z(jbi6P`3bmh`#a3=kr&wUJp+nQ@)@7<*7gjA>^m<%lczldl|NC>ZWrDgdC~V3l3>G zLH*?Y>#KPpJq`N~f#{lpjin%}J8sng`H@OBZ1D}8ex-s+HXp>Y3JlLRff%ROhZ5bJ z@*)#n&Bf7qth$G%;TS)&I1*~8RqRrZVXtImXeC>fH~N;|MwasF0d1GPR|EK_0enT_ zO#nDv6CE2$YTv`&V1gA8gLAv4ytCBjcS>aE$58=3`2o)E}u|pZ5;eCtMSf* zF0KY1O(Q2oIOV0}&xF!N6=4t^)Q_%usk+U?;dYTgjBCH8SmtPx1z2BFzeE^}5s3zu zaa85ivUJ>2coVR$-!6I`(&;QM7DS!V=~VZtq3>5Wvu~3QY4SId&j7U%ugmMgs}U1!Bc zH4Dp>pX&T@fwwSXfV<;$N&TJ5e>&o#V^92bwA!LdiGHNeJr(Fx>dH#0!36k{)^PQd zIv*xyS-x%b%i5=|<^;&W#mijHe?Xaf8|7>bk!L_Ejk#Ea5JCtcguI%+Tt#N5f~LHY P00000NkvXXu0mjfn=Q4X literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanosp/test_get_address_wallet_v3_confirm_refused/00002.png b/tests/snapshots/nanosp/test_get_address_wallet_v3_confirm_refused/00002.png new file mode 100644 index 0000000000000000000000000000000000000000..79ec8e7d5f4668017394572679a188b792d1ef70 GIT binary patch literal 498 zcmV*S6;srWKHAi^h!zFxUtJDqm8Ea z9rNzALm^q>xitNU(YR64UP|5nWF1Akk1LaR!Q5YZ9KACV#eURt_~q%TbGA$6H3u%p zJogO1o_6;ql!phhj?8JYj+0y%l1`fs-7^3av|+f|n&x?zb}dPI8$MPx#07*qoM6N<$g6k6JrvLx| literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanosp/test_get_address_wallet_v3_confirm_refused/00003.png b/tests/snapshots/nanosp/test_get_address_wallet_v3_confirm_refused/00003.png new file mode 100644 index 0000000000000000000000000000000000000000..78530ed78893e8cde716b8c31d30c1cb56cec73a GIT binary patch literal 369 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h6`U|_WHba4!+nDh2VG~Xcwk(P&x z3)S!bpLC;}UuDU|MO!+Jod3P|R5r6{pX~zF0|gT%26<`T{T*_-xRm|fi)A_DwP|4u zk1alRYrXrl&7>ePtl`Dg1Ll7_D%QL^;QO}e@r*i)a}8^{Zkzo5pnJe9hTGs)%i9RC z2YX)kopaUu!*yX^<(ljOafd(VJ$`faOn+Rm{dn)VSh(O}xmV@2(sNgM{y)Fspw}8F z?VIlpU+W0(yO8^$vgAz6x~JdvT`wp)rTMS?c;!KRuJu=CXIz>qbCu`Eg=N1@Caz2l zXef@WjPbS{x`#dx8HeXrotLqoTi}!zV zWi2{>VN>7nJ8ahbIp@!pu@k+dTCr@8V=d>cc^8CC`cqk8A;56?-sZ_S(sh?ur-Fn$ MUHx3vIVCg!0MAmW;Q#;t literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanosp/test_get_address_wallet_v3_confirm_refused/00004.png b/tests/snapshots/nanosp/test_get_address_wallet_v3_confirm_refused/00004.png new file mode 100644 index 0000000000000000000000000000000000000000..a58590b988714545e7960f7f400f360ffc5de41f GIT binary patch literal 382 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h6`U|@9hba4!+nDh2#bl+hG9*4k? zQuR0Wo;SViCn%lTo!KM1sAjk5Y(@*V#~rbuHu`7A_H&AxgwHf8y4cdKvg$JbB4n%ez%sZ31aBYd&Oo@(7)_WJ(Znl2o8^PD` zFE`_Y-IS+Kdq0Q2-7r_C=}F(5ev`U`H~)QH|9$1FHE$YjoVax+e0xei%S`SAGlOm! zp7{T3NA-mVOYb&rdU8MdyIHo@@7cE*uj@I+Zu{2i)KMSV-E~o8GLwKmkH`Ak$EC#E_E*H^E)Hz+84Xmjkj19-@3^!2iC3w87M$~`iC%H8O9Meo1) zhFE2f0|FL+CVX#V{;joSK$y+IZp*VL1Raju7Q&1kh<35Jw-2X7PzU&oaVMWRW%jJv zYVU4)&;e?SMsA|MzHU?z$q65YaQL3f)j*ezNZE714+kV&*N)}O_wZT>I*GMFyN)lJ z=D+z4z}vqlilRWz05yhUy-+Pt6;qHujQOjo#_)xgoekq7E>?k53-NqYh_pBSL3C*8 zUs!8YGkq)lR|lF48Jo$mtl=!)NkgqoLCWg~4yYFS7XSiB3)-$d;jysr`PSQljjvy3 z90v$>R|TBf)sodYgy-DN{-|p)kkg&Auf zc_S9U&09vu#O7K_oWd3+_ewSm1smTrktq+Sp>Con#&YMyTL{w7C!Qk38nFOa?4*3~ zKIMZqsnvgzTKzYfSKmxSmqb3RGLtwi9px+=m~42omeg*+prZdJfp!g7g2h?yYZK3CM9LFiusIpEP7)|%%-BU)M}Da<{$4yFUn%SLDX{q#U1%s_q`dT}Bj zE&;uf`5%*pVw1*8c{P{MvqfQ16h%=KMRB=*9{_|vH|Jwsi?1e&mz{c&@-0Xo`Ep(% z&Ssyy(y3~t^JyNJjF&7WfN8sGJZ=kGxy@ZIWP=(?IvJ=s0_FhuYtA)4<%d}vYxQGV zW6}~a;;sGjg(SWM0_W*b>e?l|tPb73iXIq!RE*e$A8&~d*b-(G-vP1Z-&-Y)kY!1H2u=wA0002sIA4*$Ip_N8bzQb) zV^Cid4V-?a$vGES(~sN-u@9kk-;J*(7s!> zE=yf&*H0xD#K8$qG=3HoVB+@1 z5WlzP;d9PGHSo-vwTn<%B0-0>TcZi12$2(yaj?K5M2>t9T zfVe+%c2LRhP*s|piC=|!`6?gkl|u}^zDrz@LjMEa9And!7O8pM$!jF&BwBV>DM`@J zpPd1A`vU+#+OY=o=O@~ssdk<-JQ3>mxWl6)F$UwJwsCs*6-C^Mi)V-Z2hm>hVEeRx zdTL*;e8xZFckhuY_Vxby<7kmyUc~ciZLDphxoQS_Hm2Gs`p0yYI7uH#kW;~)y3z*L zXs!%higRcNI1yJ@alM^zCE|PuTGwFhY}oQfY%av7DcjMH#_iG`Eouu8yvMDf_J*>y zOx+VU1C7{j5BG~O&vN1^n15xOW02l6J@wB~lT7xHA*7n@ABGyd5>)7w43bO@wnBOV u0000000000000000000000000w($$(`{Y7*AFC$-0000ePtl`Dg1Ll7_D%QL^;QO}e@r*i)a}8^{Zkzo5pnJe9hTGs)%i9RC z2YX)kopaUu!*yX^<(ljOafd(VJ$`faOn+Rm{dn)VSh(O}xmV@2(sNgM{y)Fspw}8F z?VIlpU+W0(yO8^$vgAz6x~JdvT`wp)rTMS?c;!KRuJu=CXIz>qbCu`Eg=N1@Caz2l zXef@WjPbS{x`#dx8HeXrotLqoTi}!zV zWi2{>VN>7nJ8ahbIp@!pu@k+dTCr@8V=d>cc^8CC`cqk8A;56?-sZ_S(sh?ur-Fn$ MUHx3vIVCg!0MAmW;Q#;t literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanosp/test_get_public_key_confirm_accepted/00003.png b/tests/snapshots/nanosp/test_get_public_key_confirm_accepted/00003.png new file mode 100644 index 0000000000000000000000000000000000000000..5fd127e517c190a1684db420b839a65dd8776a10 GIT binary patch literal 356 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 MUHx3vIVCg!0MAmW;Q#;t literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanosp/test_get_public_key_confirm_refused/00003.png b/tests/snapshots/nanosp/test_get_public_key_confirm_refused/00003.png new file mode 100644 index 0000000000000000000000000000000000000000..a58590b988714545e7960f7f400f360ffc5de41f GIT binary patch literal 382 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h6`U|@9hba4!+nDh2#bl+hG9*4k? zQuR0Wo;SViCn%lTo!KM1sAjk5Y(@*V#~rbuHu`7A_H&AxgwHf8y4cdKvg$JbB4n%ez%sZ31aBYd&Oo@(7)_WJ(Znl2o8^PD` zFE`_Y-IS+Kdq0Q2-7r_C=}F(5ev`U`H~)QH|9$1FHE$YjoVax+e0xei%S`SAGlOm! zp7{T3NA-mVOYb&rdU8MdyIHo@@7cE*uj@I+Zu{2i)KMSV-E~o5YKJ%(KU&1ONcAAJx@!`E?Y1^<~WN}zCyXs#X zo?o6k@9c|LZskJhD8km*o@uZbHa}-B?&(7HD5C%IYmwHRbJ)2) z`V`bZme<8JnX>F>hL3vOBL0b~>J+pM|9!ySI57nP0000WkROv_^0k3i)wKWs002ov JPDHLkV1lAe!YTj& literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanosp/test_sign_message/00001.png b/tests/snapshots/nanosp/test_sign_message/00001.png new file mode 100644 index 0000000000000000000000000000000000000000..db58d4271e08ae84259d65e743b146b6eeb34040 GIT binary patch literal 495 zcmVCRas>u{W-+tmB-kpkV8Dl<-x{vwMKau1!vxGfGVdp z7D#u;oH<2zl&7kD)I2wmyS@QsMm2jX9PLTZk!n#_)XS(&VQ3{+x19&w%Q>(GwKiy# zz5m#%oyuR~Q07OnIfI6&E$BL5UeSlPy%>?!lBu$(r|_2~(+(xE@A)z!x7lac&<9ns zW^^c|o)2Zxdx-Xp#vQsPNC7!3$U l1A@_jU^D;#008)ZegSnO17HlDNRj{m002ovPDHLkV1o5L-%9`h literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanosp/test_sign_message/00002.png b/tests/snapshots/nanosp/test_sign_message/00002.png new file mode 100644 index 0000000000000000000000000000000000000000..464ffaaead3e4412e784f03312a4bf44e4a813a8 GIT binary patch literal 443 zcmV;s0Yv_ZP)oH7i0AUiSYB=>x^#1=w49H$fj003aSFaP7#+VMxN)oRIg z?30 z1|Ne&_O$iUGO?v+cR-(Zb>ve{V@v&0MBT@0{4V4zk>K)TXI$pUW1O51(H)@bah;tZ z*V;0tco)mNB3YdcJ8dcFkq{Bu0b@8dbR87C=)GlH)Dv|KQx^^^xO(iwMQ*te_QVln z9ndQO{P9gERXoE}kuOJZ{&gBHPaQ!=XMIH%?Raroto1TQQ@e<#B*UHxGUea5mlI!} zw69%8cbTf@%uq@`HwEE6!1StR>&IEV32$b79|ZusGx=>{XUnHM${~M2+|z;w|JCX4 zmMpvnBx3@SF#*Y#fMoLo{GX@OTUwNt>Th5cnd)z&l$z>q#vEkg6w1VNI1}Xs00000 l00000000000001P^9z5Ghd}eiv=IOR002ovPDHLkV1h{_#5({0 literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanosp/test_sign_message/00003.png b/tests/snapshots/nanosp/test_sign_message/00003.png new file mode 100644 index 0000000000000000000000000000000000000000..e52854f5ba2364e90179f67a78c28752a8349b4c GIT binary patch literal 503 zcmVK70z}J!-{_0Tk97eKYAYO%(HD!#`&@lUi0Y3 z!mVF%)6EA9u=BuEo(YY40^~c?OWrl-K&C8fIou5)w4>toWc6}$sql4qX82zWF1Y7y zb?5jcR+J||dTFsX7_9cRcENHIRgjnR*lamSv1==nUFP{YqE+?vWZYE69oH6n&L7g2 zYOY23^;WdnncLxAjc|1d0002~uNkHXa1D34G#H4j502E=p4I8kkx`pEWGnAxK51(9 zUQqc~p?b91XlGHvhcx5c^_$Cg#PhW$C!LO2wokdo`6+>uk*dONRdE?4psY-KldqfU zxn!cWD%JU$9AHxgZB`MRCtO&P2fk&6!4ojj;`Ls_EiY6%Jmvo066X4?%u`~iimAIk tH~`B(DjZZpw2C0ssKJtyu-Nf#oo{^!u-4&!p|! z==N;!POxkrV1cDiF0C=cO8ML3+B9_dSIH%&lS7;=TomE&y7j+pdoaH|aNrOp3)cYS zXL?(>I(fJ5k@l4xCZ-WKZsDScNm1tKpSSsAjk5Y(@*V#~rbuHu`7A_H&AxgwHf8y4cdKvg$JbB4n%ez%sZ31aBYd&Oo@(7)_WJ(Znl2o8^PD` zFE`_Y-IS+Kdq0Q2-7r_C=}F(5ev`U`H~)QH|9$1FHE$YjoVax+e0xei%S`SAGlOm! zp7{T3NA-mVOYb&rdU8MdyIHo@@7cE*uj@I+Zu{2i)KMSV-E~ovpO}&+|8}fC)JNq`>?#dJ%s{^>GN_4usXQirk{^@^BA?p!El9&T9q~zMsh2=YdLB`_ONiP zKy6XlUGFZ>Cn7mP3u*>=5`jjNzMlT@h zzae7@N*=PmmFN!W3v{U6=P$CIoUrWl5+z{O*Y_}3zl4#8 zS9qDnBmjVyl&%>Ugr`i8m3IrxoPjI3NXAygp?-VZj{A-D$)0uw6C~h#4|%(JE?JwP z%>)UUC6v!e*9-b@Bw(;uf)d{5J1--ra}eH1ztvoR46^9o=0T`M|7LP9k}5RPL6GI( nQo;)W00000000000GIg$)?uOm8>e-)00000NkvXXu0mjfI1rXX literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanosp/test_sign_tx_burn_usdt/00002.png b/tests/snapshots/nanosp/test_sign_tx_burn_usdt/00002.png new file mode 100644 index 0000000000000000000000000000000000000000..96a5caeb32a1bfacfd54f0948eccd45612dd33fe GIT binary patch literal 387 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 QwFD&U>FVdQ&MBb@0PMM>*Z=?k literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanosp/test_sign_tx_transfer/00002.png b/tests/snapshots/nanosp/test_sign_tx_transfer/00002.png new file mode 100644 index 0000000000000000000000000000000000000000..79a77673d7bd10a263a1a333e44005aaf77d60a9 GIT binary patch literal 517 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 P00000NkvXXu0mjfn=Q4X literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanox/test_get_address_wallet_v3_confirm_accepted/00002.png b/tests/snapshots/nanox/test_get_address_wallet_v3_confirm_accepted/00002.png new file mode 100644 index 0000000000000000000000000000000000000000..79ec8e7d5f4668017394572679a188b792d1ef70 GIT binary patch literal 498 zcmV*S6;srWKHAi^h!zFxUtJDqm8Ea z9rNzALm^q>xitNU(YR64UP|5nWF1Akk1LaR!Q5YZ9KACV#eURt_~q%TbGA$6H3u%p zJogO1o_6;ql!phhj?8JYj+0y%l1`fs-7^3av|+f|n&x?zb}dPI8$MPx#07*qoM6N<$g6k6JrvLx| literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanox/test_get_address_wallet_v3_confirm_accepted/00003.png b/tests/snapshots/nanox/test_get_address_wallet_v3_confirm_accepted/00003.png new file mode 100644 index 0000000000000000000000000000000000000000..78530ed78893e8cde716b8c31d30c1cb56cec73a GIT binary patch literal 369 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h6`U|_WHba4!+nDh2VG~Xcwk(P&x z3)S!bpLC;}UuDU|MO!+Jod3P|R5r6{pX~zF0|gT%26<`T{T*_-xRm|fi)A_DwP|4u zk1alRYrXrl&7>ePtl`Dg1Ll7_D%QL^;QO}e@r*i)a}8^{Zkzo5pnJe9hTGs)%i9RC z2YX)kopaUu!*yX^<(ljOafd(VJ$`faOn+Rm{dn)VSh(O}xmV@2(sNgM{y)Fspw}8F z?VIlpU+W0(yO8^$vgAz6x~JdvT`wp)rTMS?c;!KRuJu=CXIz>qbCu`Eg=N1@Caz2l zXef@WjPbS{x`#dx8HeXrotLqoTi}!zV zWi2{>VN>7nJ8ahbIp@!pu@k+dTCr@8V=d>cc^8CC`cqk8A;56?-sZ_S(sh?ur-Fn$ MUHx3vIVCg!0MAmW;Q#;t literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanox/test_get_address_wallet_v3_confirm_accepted/00004.png b/tests/snapshots/nanox/test_get_address_wallet_v3_confirm_accepted/00004.png new file mode 100644 index 0000000000000000000000000000000000000000..5fd127e517c190a1684db420b839a65dd8776a10 GIT binary patch literal 356 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h6`U|`htba4!+nDh2#AYZeBfa}G~ z%X2sUSKT3Q%6Ru-)(e8M#-Se-4!|1j!jMc=4!j z_CJRO);kNf|C#^xTYZvZt?H%gi`lBKIP^;~T)*|9>>tm^$s6J??VLTmiitVa@RZl# z9D}7HW~IBg#_v|Osdspo)b@#I##$}$!vTL1erwOq|6RGGG~%xIOYz59T*k-q6J81a z$=e)pd!KrK?JqHvo`lxakeiYh%(DN_TKY9re^&30zAaAgrtV<9s?#_7_s4|tE$2+UT~i!DCi)dVeekXbfGQn;e2~0fsAjk5Y(@*V#~rbuHu`7A_H&AxgwHf8y4cdKvg$JbB4n%ez%sZ31aBYd&Oo@(7)_WJ(Znl2o8^PD` zFE`_Y-IS+Kdq0Q2-7r_C=}F(5ev`U`H~)QH|9$1FHE$YjoVax+e0xei%S`SAGlOm! zp7{T3NA-mVOYb&rdU8MdyIHo@@7cE*uj@I+Zu{2i)KMSV-E~oCI7!~g&QfPa@`!PrJQ5_gtexv+u#;<7n?ZA>=8WP3sS)E3>Z zE!xY!9dS=7B}gQ@x;^0FVDIF?`GpenfZ9e>)xCO*lgBykAKe#*G9mk>o6EkWtAGi$ zGexMpHiozruqDn$Y{#w$*~F;G!$#0S7$x##_JEJys@+nJ)BK}UfHaSYH}BKlb~|vz<*qUayO&UL-bn@O u0WKrm9KB3jyJN~A3;+NC0000$MC1WGrw>UKISsS`00007f41`H4H{t$A@?G-a3Pqu<#o}@1@9$}fku0%ThPF!~gb+dqA>^C5uIsuk{4d9T zS3Z8YzUBId<-UvGCoWpLbdQcHjvQ;%tk&B8?SK1TEBx7hMIW^f>fKOlwFUxjnajcP z-OiCaz*=tofDZr4KFg(7YgGq&@Rcn?2x)*ILvP{W9WZ1JuKl?y^aE32<+#>o0|Y>@f`GM(Ncr|y8h;0}$$;zDX`v$1xH z(jbi6P`3bmh`#a3=kr&wUJp+nQ@)@7<*7gjA>^m<%lczldl|NC>ZWrDgdC~V3l3>G zLH*?Y>#KPpJq`N~f#{lpjin%}J8sng`H@OBZ1D}8ex-s+HXp>Y3JlLRff%ROhZ5bJ z@*)#n&Bf7qth$G%;TS)&I1*~8RqRrZVXtImXeC>fH~N;|MwasF0d1GPR|EK_0enT_ zO#nDv6CE2$YTv`&V1gA8gLAv4ytCBjcS>aE$58=3`2o)E}u|pZ5;eCtMSf* zF0KY1O(Q2oIOV0}&xF!N6=4t^)Q_%usk+U?;dYTgjBCH8SmtPx1z2BFzeE^}5s3zu zaa85ivUJ>2coVR$-!6I`(&;QM7DS!V=~VZtq3>5Wvu~3QY4SId&j7U%ugmMgs}U1!Bc zH4Dp>pX&T@fwwSXfV<;$N&TJ5e>&o#V^92bwA!LdiGHNeJr(Fx>dH#0!36k{)^PQd zIv*xyS-x%b%i5=|<^;&W#mijHe?Xaf8|7>bk!L_Ejk#Ea5JCtcguI%+Tt#N5f~LHY P00000NkvXXu0mjfn=Q4X literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanox/test_get_address_wallet_v3_confirm_refused/00002.png b/tests/snapshots/nanox/test_get_address_wallet_v3_confirm_refused/00002.png new file mode 100644 index 0000000000000000000000000000000000000000..79ec8e7d5f4668017394572679a188b792d1ef70 GIT binary patch literal 498 zcmV*S6;srWKHAi^h!zFxUtJDqm8Ea z9rNzALm^q>xitNU(YR64UP|5nWF1Akk1LaR!Q5YZ9KACV#eURt_~q%TbGA$6H3u%p zJogO1o_6;ql!phhj?8JYj+0y%l1`fs-7^3av|+f|n&x?zb}dPI8$MPx#07*qoM6N<$g6k6JrvLx| literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanox/test_get_address_wallet_v3_confirm_refused/00003.png b/tests/snapshots/nanox/test_get_address_wallet_v3_confirm_refused/00003.png new file mode 100644 index 0000000000000000000000000000000000000000..78530ed78893e8cde716b8c31d30c1cb56cec73a GIT binary patch literal 369 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h6`U|_WHba4!+nDh2VG~Xcwk(P&x z3)S!bpLC;}UuDU|MO!+Jod3P|R5r6{pX~zF0|gT%26<`T{T*_-xRm|fi)A_DwP|4u zk1alRYrXrl&7>ePtl`Dg1Ll7_D%QL^;QO}e@r*i)a}8^{Zkzo5pnJe9hTGs)%i9RC z2YX)kopaUu!*yX^<(ljOafd(VJ$`faOn+Rm{dn)VSh(O}xmV@2(sNgM{y)Fspw}8F z?VIlpU+W0(yO8^$vgAz6x~JdvT`wp)rTMS?c;!KRuJu=CXIz>qbCu`Eg=N1@Caz2l zXef@WjPbS{x`#dx8HeXrotLqoTi}!zV zWi2{>VN>7nJ8ahbIp@!pu@k+dTCr@8V=d>cc^8CC`cqk8A;56?-sZ_S(sh?ur-Fn$ MUHx3vIVCg!0MAmW;Q#;t literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanox/test_get_address_wallet_v3_confirm_refused/00004.png b/tests/snapshots/nanox/test_get_address_wallet_v3_confirm_refused/00004.png new file mode 100644 index 0000000000000000000000000000000000000000..a58590b988714545e7960f7f400f360ffc5de41f GIT binary patch literal 382 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h6`U|@9hba4!+nDh2#bl+hG9*4k? zQuR0Wo;SViCn%lTo!KM1sAjk5Y(@*V#~rbuHu`7A_H&AxgwHf8y4cdKvg$JbB4n%ez%sZ31aBYd&Oo@(7)_WJ(Znl2o8^PD` zFE`_Y-IS+Kdq0Q2-7r_C=}F(5ev`U`H~)QH|9$1FHE$YjoVax+e0xei%S`SAGlOm! zp7{T3NA-mVOYb&rdU8MdyIHo@@7cE*uj@I+Zu{2i)KMSV-E~o8GLwKmkH`Ak$EC#E_E*H^E)Hz+84Xmjkj19-@3^!2iC3w87M$~`iC%H8O9Meo1) zhFE2f0|FL+CVX#V{;joSK$y+IZp*VL1Raju7Q&1kh<35Jw-2X7PzU&oaVMWRW%jJv zYVU4)&;e?SMsA|MzHU?z$q65YaQL3f)j*ezNZE714+kV&*N)}O_wZT>I*GMFyN)lJ z=D+z4z}vqlilRWz05yhUy-+Pt6;qHujQOjo#_)xgoekq7E>?k53-NqYh_pBSL3C*8 zUs!8YGkq)lR|lF48Jo$mtl=!)NkgqoLCWg~4yYFS7XSiB3)-$d;jysr`PSQljjvy3 z90v$>R|TBf)sodYgy-DN{-|p)kkg&Auf zc_S9U&09vu#O7K_oWd3+_ewSm1smTrktq+Sp>Con#&YMyTL{w7C!Qk38nFOa?4*3~ zKIMZqsnvgzTKzYfSKmxSmqb3RGLtwi9px+=m~42omeg*+prZdJfp!g7g2h?yYZK3CM9LFiusIpEP7)|%%-BU)M}Da<{$4yFUn%SLDX{q#U1%s_q`dT}Bj zE&;uf`5%*pVw1*8c{P{MvqfQ16h%=KMRB=*9{_|vH|Jwsi?1e&mz{c&@-0Xo`Ep(% z&Ssyy(y3~t^JyNJjF&7WfN8sGJZ=kGxy@ZIWP=(?IvJ=s0_FhuYtA)4<%d}vYxQGV zW6}~a;;sGjg(SWM0_W*b>e?l|tPb73iXIq!RE*e$A8&~d*b-(G-vP1Z-&-Y)kY!1H2u=wA0002sIA4*$Ip_N8bzQb) zV^Cid4V-?a$vGES(~sN-u@9kk-;J*(7s!> zE=yf&*H0xD#K8$qG=3HoVB+@1 z5WlzP;d9PGHSo-vwTn<%B0-0>TcZi12$2(yaj?K5M2>t9T zfVe+%c2LRhP*s|piC=|!`6?gkl|u}^zDrz@LjMEa9And!7O8pM$!jF&BwBV>DM`@J zpPd1A`vU+#+OY=o=O@~ssdk<-JQ3>mxWl6)F$UwJwsCs*6-C^Mi)V-Z2hm>hVEeRx zdTL*;e8xZFckhuY_Vxby<7kmyUc~ciZLDphxoQS_Hm2Gs`p0yYI7uH#kW;~)y3z*L zXs!%higRcNI1yJ@alM^zCE|PuTGwFhY}oQfY%av7DcjMH#_iG`Eouu8yvMDf_J*>y zOx+VU1C7{j5BG~O&vN1^n15xOW02l6J@wB~lT7xHA*7n@ABGyd5>)7w43bO@wnBOV u0000000000000000000000000w($$(`{Y7*AFC$-0000ePtl`Dg1Ll7_D%QL^;QO}e@r*i)a}8^{Zkzo5pnJe9hTGs)%i9RC z2YX)kopaUu!*yX^<(ljOafd(VJ$`faOn+Rm{dn)VSh(O}xmV@2(sNgM{y)Fspw}8F z?VIlpU+W0(yO8^$vgAz6x~JdvT`wp)rTMS?c;!KRuJu=CXIz>qbCu`Eg=N1@Caz2l zXef@WjPbS{x`#dx8HeXrotLqoTi}!zV zWi2{>VN>7nJ8ahbIp@!pu@k+dTCr@8V=d>cc^8CC`cqk8A;56?-sZ_S(sh?ur-Fn$ MUHx3vIVCg!0MAmW;Q#;t literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanox/test_get_public_key_confirm_accepted/00003.png b/tests/snapshots/nanox/test_get_public_key_confirm_accepted/00003.png new file mode 100644 index 0000000000000000000000000000000000000000..5fd127e517c190a1684db420b839a65dd8776a10 GIT binary patch literal 356 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 MUHx3vIVCg!0MAmW;Q#;t literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanox/test_get_public_key_confirm_refused/00003.png b/tests/snapshots/nanox/test_get_public_key_confirm_refused/00003.png new file mode 100644 index 0000000000000000000000000000000000000000..a58590b988714545e7960f7f400f360ffc5de41f GIT binary patch literal 382 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h6`U|@9hba4!+nDh2#bl+hG9*4k? zQuR0Wo;SViCn%lTo!KM1sAjk5Y(@*V#~rbuHu`7A_H&AxgwHf8y4cdKvg$JbB4n%ez%sZ31aBYd&Oo@(7)_WJ(Znl2o8^PD` zFE`_Y-IS+Kdq0Q2-7r_C=}F(5ev`U`H~)QH|9$1FHE$YjoVax+e0xei%S`SAGlOm! zp7{T3NA-mVOYb&rdU8MdyIHo@@7cE*uj@I+Zu{2i)KMSV-E~o5YKJ%(KU&1ONcAAJx@!`E?Y1^<~WN}zCyXs#X zo?o6k@9c|LZskJhD8km*o@uZbHa}-B?&(7HD5C%IYmwHRbJ)2) z`V`bZme<8JnX>F>hL3vOBL0b~>J+pM|9!ySI57nP0000WkROv_^0k3i)wKWs002ov JPDHLkV1lAe!YTj& literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanox/test_sign_message/00001.png b/tests/snapshots/nanox/test_sign_message/00001.png new file mode 100644 index 0000000000000000000000000000000000000000..db58d4271e08ae84259d65e743b146b6eeb34040 GIT binary patch literal 495 zcmVCRas>u{W-+tmB-kpkV8Dl<-x{vwMKau1!vxGfGVdp z7D#u;oH<2zl&7kD)I2wmyS@QsMm2jX9PLTZk!n#_)XS(&VQ3{+x19&w%Q>(GwKiy# zz5m#%oyuR~Q07OnIfI6&E$BL5UeSlPy%>?!lBu$(r|_2~(+(xE@A)z!x7lac&<9ns zW^^c|o)2Zxdx-Xp#vQsPNC7!3$U l1A@_jU^D;#008)ZegSnO17HlDNRj{m002ovPDHLkV1o5L-%9`h literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanox/test_sign_message/00002.png b/tests/snapshots/nanox/test_sign_message/00002.png new file mode 100644 index 0000000000000000000000000000000000000000..464ffaaead3e4412e784f03312a4bf44e4a813a8 GIT binary patch literal 443 zcmV;s0Yv_ZP)oH7i0AUiSYB=>x^#1=w49H$fj003aSFaP7#+VMxN)oRIg z?30 z1|Ne&_O$iUGO?v+cR-(Zb>ve{V@v&0MBT@0{4V4zk>K)TXI$pUW1O51(H)@bah;tZ z*V;0tco)mNB3YdcJ8dcFkq{Bu0b@8dbR87C=)GlH)Dv|KQx^^^xO(iwMQ*te_QVln z9ndQO{P9gERXoE}kuOJZ{&gBHPaQ!=XMIH%?Raroto1TQQ@e<#B*UHxGUea5mlI!} zw69%8cbTf@%uq@`HwEE6!1StR>&IEV32$b79|ZusGx=>{XUnHM${~M2+|z;w|JCX4 zmMpvnBx3@SF#*Y#fMoLo{GX@OTUwNt>Th5cnd)z&l$z>q#vEkg6w1VNI1}Xs00000 l00000000000001P^9z5Ghd}eiv=IOR002ovPDHLkV1h{_#5({0 literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanox/test_sign_message/00003.png b/tests/snapshots/nanox/test_sign_message/00003.png new file mode 100644 index 0000000000000000000000000000000000000000..e52854f5ba2364e90179f67a78c28752a8349b4c GIT binary patch literal 503 zcmVK70z}J!-{_0Tk97eKYAYO%(HD!#`&@lUi0Y3 z!mVF%)6EA9u=BuEo(YY40^~c?OWrl-K&C8fIou5)w4>toWc6}$sql4qX82zWF1Y7y zb?5jcR+J||dTFsX7_9cRcENHIRgjnR*lamSv1==nUFP{YqE+?vWZYE69oH6n&L7g2 zYOY23^;WdnncLxAjc|1d0002~uNkHXa1D34G#H4j502E=p4I8kkx`pEWGnAxK51(9 zUQqc~p?b91XlGHvhcx5c^_$Cg#PhW$C!LO2wokdo`6+>uk*dONRdE?4psY-KldqfU zxn!cWD%JU$9AHxgZB`MRCtO&P2fk&6!4ojj;`Ls_EiY6%Jmvo066X4?%u`~iimAIk tH~`B(DjZZpw2C0ssKJtyu-Nf#oo{^!u-4&!p|! z==N;!POxkrV1cDiF0C=cO8ML3+B9_dSIH%&lS7;=TomE&y7j+pdoaH|aNrOp3)cYS zXL?(>I(fJ5k@l4xCZ-WKZsDScNm1tKpSSsAjk5Y(@*V#~rbuHu`7A_H&AxgwHf8y4cdKvg$JbB4n%ez%sZ31aBYd&Oo@(7)_WJ(Znl2o8^PD` zFE`_Y-IS+Kdq0Q2-7r_C=}F(5ev`U`H~)QH|9$1FHE$YjoVax+e0xei%S`SAGlOm! zp7{T3NA-mVOYb&rdU8MdyIHo@@7cE*uj@I+Zu{2i)KMSV-E~ovpO}&+|8}fC)JNq`>?#dJ%s{^>GN_4usXQirk{^@^BA?p!El9&T9q~zMsh2=YdLB`_ONiP zKy6XlUGFZ>Cn7mP3u*>=5`jjNzMlT@h zzae7@N*=PmmFN!W3v{U6=P$CIoUrWl5+z{O*Y_}3zl4#8 zS9qDnBmjVyl&%>Ugr`i8m3IrxoPjI3NXAygp?-VZj{A-D$)0uw6C~h#4|%(JE?JwP z%>)UUC6v!e*9-b@Bw(;uf)d{5J1--ra}eH1ztvoR46^9o=0T`M|7LP9k}5RPL6GI( nQo;)W00000000000GIg$)?uOm8>e-)00000NkvXXu0mjfI1rXX literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanox/test_sign_tx_burn_usdt/00002.png b/tests/snapshots/nanox/test_sign_tx_burn_usdt/00002.png new file mode 100644 index 0000000000000000000000000000000000000000..96a5caeb32a1bfacfd54f0948eccd45612dd33fe GIT binary patch literal 387 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 QwFD&U>FVdQ&MBb@0PMM>*Z=?k literal 0 HcmV?d00001 diff --git a/tests/snapshots/nanox/test_sign_tx_transfer/00002.png b/tests/snapshots/nanox/test_sign_tx_transfer/00002.png new file mode 100644 index 0000000000000000000000000000000000000000..79a77673d7bd10a263a1a333e44005aaf77d60a9 GIT binary patch literal 517 zcmV+g0{Z=lP)Jzp^b!$W#V8|MH30DxnK5JCvry-@J2-2vyE zOH;pX4eYG(0KjumI7exhQAcNIY3!B?Nu$4Bn)?1M<*Z2KSb7uc$|oWhO#U9+WRtseX%= zUl^V0$L>4;003QIGlj%yZze4xs#nkWt?HdJ{dQU%HZp`ov90QPc_t+w&f1r<2xXRZ zCU4p*tUH93@q^f%1)O;%+Q9M<9?Jz)cYSL+$BX{<&#Q|JbElTsAw1K${vC0%A1;Pb zWwNQxolb-MhtRT^3mUF%3cH>7d#C;Tj0|BV1kGo=E_G!mJ428QF!@QXQ`fL=S+W}6 zg|bXF3dif22KNs^baK!%-qW09W`CQ?R5SaVu?CumLYfAX%o@C^oZhKy=w_`Wok%g3 zN4oI$B{=s+Zt~w-%R0wO07Gy+w>U2Jc1%mN zBFKGbec)?(g&BYnfHj}-t5M#;`h=-O; zeY!y~XE^=_!6nq)@j@lb*@cQ-YDFnutcBs~wK#i<3zosz^x zEB>XOWAp*+2~dmVpd39*dJM1ou;O`t0>-w+K-t=)Lybw8iDDakPncl}{E*-chw09{ zU4o^O-t++OBy08`!Gl?^IOAwzr6lzzS;Q_ z=DRG!1JVl`EAkxU*lZV5&UEbq_ZZLF1@NRkpip*@lG$PwKx&YncW}+@RsB9t3-Fjk zHIA^mCyoksrVbWX@!TU_jThiukrD^AjgBoU;prCG6VUcY>XEpSw9ReMCLW#!iSZsvkqjvbGmoeLSx3idvD0fGtC)Pt>jVpMI!c~XH*x!*UvedO{Wg$KL%}cUVHz3+ yWsru>mYD6E|CtAbrc+_tI0000008hY#u#Ia{Gp)!u6V?? z;uv(DqVT>e8l7*WqW!yc9((W23U4mgbt-P>XM2kQ^9IbG*n9V~kS{TLhmxmnxBm?g z2^DXHxHq$~Iepelv^ZCnc$c`#dubl3dILnb$-ckV!kpY>x<$2Honx<(IiM9xs(sR~ zk{(|=6WFoYYx4tm#XS!Ne`C6?oatQgXnr~VpCr5q&D@Xl3e4O z7dkE2DliY}Lh(m_!_GTo)`_d>&FXvr4^?eNEGX?q!6v9abh1Yu+K$$5tN97)op?7R z`7OD8%bD@;4ZNYi`yC?~g3Nz2jn6W%#TAkpd6_XVqvQ>^)w7;AzIH7!<&?%8DEUF= zWcKqXijvFy?K9*ubm0!YwPW))Ak7nX0P&*p)wsF$*=m-d3qSq@7cvg#+rk<*$z=Z+ zBh_U8FrL9XF$%rYMUr_2rARLT0000000000000000026P)Nkl`l1;k+@4An6g^M6kcbtxu@7*hfO000000DuchDWw$aQJnB& zJ%BsK3VrpQ1hnYqoNY&PO0WdV>i`7cs)e_@w@x()p@w=B24`klR6(CLpxqtlZO|2 zIWjpO-F~*EHtLqUMt)Wc_@bMv^h#{CUFW0M(vJ1P=5N1GhWcHM(-Xu*&bc@D4_o$^ z7Y|pL)I@*DzttR=&yLH#^{|TW)8Sp0qphw%epiuSUG#WHS~ht|j~;`U4>BXmdi9@& zuz>%00000G5i7^TsbXePb2LB O0000sAjk5Y(@*V#~rbuHu`7A_H&AxgwHf8y4cdKvg$JbB4n%ez%sZ31aBYd&Oo@(7)_WJ(Znl2o8^PD` zFE`_Y-IS+Kdq0Q2-7r_C=}F(5ev`U`H~)QH|9$1FHE$YjoVax+e0xei%S`SAGlOm! zp7{T3NA-mVOYb&rdU8MdyIHo@@7cE*uj@I+Zu{2i)KMSV-E~o None: + temp = [] + for wallet_type in range(9): + client = EverscaleCommandSender(backend) + response = client.get_address(account_number=0, wallet_type=wallet_type).data + _, address = unpack_get_address_response(response) + + assert address.hex() == EXPECTED_ADDRESSES[wallet_type], f"Error with wallet_type: {wallet_type}, expected: {EXPECTED_ADDRESSES[wallet_type]}, but got {address.hex()}" + + +# In this test we check that the GET_ADDRESS works in confirmation mode +@pytest.mark.active_test_scope +def test_get_address_wallet_v3_confirm_accepted(backend: BackendInterface, scenario_navigator: NavigateWithScenario) -> None: + client = EverscaleCommandSender(backend) + account_number = 0 + wallet_type = WalletType.WALLET_V3 + with client.get_address_with_confirmation(account_number=account_number, wallet_type=wallet_type): + scenario_navigator.address_review_approve() + + response = client.get_async_response().data + _, address = unpack_get_address_response(response) + + assert address.hex() == EXPECTED_ADDRESSES[wallet_type], f"Error with wallet_type: {wallet_type}, expected: {EXPECTED_ADDRESSES[wallet_type]}, but got {address.hex()}" + + +# In this test we check that the GET_ADDRESS in confirmation mode replies an error if the user refuses +@pytest.mark.active_test_scope +def test_get_address_wallet_v3_confirm_refused(backend: BackendInterface, scenario_navigator: NavigateWithScenario) -> None: + client = EverscaleCommandSender(backend) + account_number = 0 + wallet_type = WalletType.WALLET_V3 + + with pytest.raises(ExceptionRAPDU) as e: + with client.get_address_with_confirmation(account_number=account_number, wallet_type=wallet_type): + scenario_navigator.address_review_reject() + + # Assert that we have received a refusal + assert e.value.status == Errors.SW_DENY + assert len(e.value.data) == 0 + + + + + diff --git a/tests/test_app_config_cmd.py b/tests/test_app_config_cmd.py new file mode 100644 index 0000000..b272b86 --- /dev/null +++ b/tests/test_app_config_cmd.py @@ -0,0 +1,18 @@ +import pytest +from ragger.backend.interface import BackendInterface + +from application_client.everscale_command_sender import EverscaleCommandSender +from application_client.everscale_response_unpacker import unpack_get_version_response + +from utils import verify_version + +# In this test we check the behavior of the device when asked to provide the app version +@pytest.mark.active_test_scope +def test_get_app_config(backend: BackendInterface) -> None: + # Use the app interface instead of raw interface + client = EverscaleCommandSender(backend) + # Send the GET_VERSION instruction + rapdu = client.get_app_config() + # Use an helper to parse the response, assert the values + MAJOR, MINOR, PATCH = unpack_get_version_response(rapdu.data) + verify_version(f"{MAJOR}.{MINOR}.{PATCH}") diff --git a/tests/test_pubkey_cmd.py b/tests/test_pubkey_cmd.py new file mode 100644 index 0000000..e5f6fec --- /dev/null +++ b/tests/test_pubkey_cmd.py @@ -0,0 +1,61 @@ +import pytest + +from ragger.bip import calculate_public_key_and_chaincode, CurveChoice +from ragger.error import ExceptionRAPDU +from ragger.backend.interface import BackendInterface +from ragger.navigator.navigation_scenario import NavigateWithScenario + +from application_client.everscale_command_sender import EverscaleCommandSender, Errors +from application_client.everscale_response_unpacker import unpack_get_public_key_response + +HARDENED_OFFSET = 0x80000000 +PATH_PREFIX = "44'/396'/" +PATH_SUFFIX = "'/0'/0'" + +# In this test we check that the GET_PUBLIC_KEY works in non-confirmation mode +@pytest.mark.active_test_scope +def test_get_public_key_no_confirm(backend: BackendInterface) -> None: + account_number_list = [ + 0, + 1, + 911, + 255, + 2147483647 + ] + for account_number in account_number_list: + client = EverscaleCommandSender(backend) + response = client.get_public_key(account_number=account_number).data + _, public_key = unpack_get_public_key_response(response) + + ref_public_key, _ = calculate_public_key_and_chaincode(CurveChoice.Ed25519Slip, path=PATH_PREFIX + str(account_number | HARDENED_OFFSET) + PATH_SUFFIX) + assert "00" + public_key.hex() == ref_public_key + + +# In this test we check that the GET_PUBLIC_KEY works in confirmation mode +@pytest.mark.active_test_scope +def test_get_public_key_confirm_accepted(backend: BackendInterface, scenario_navigator: NavigateWithScenario) -> None: + client = EverscaleCommandSender(backend) + account_number = 0 + with client.get_public_key_with_confirmation(account_number=account_number): + scenario_navigator.address_review_approve() + + response = client.get_async_response().data + _, public_key = unpack_get_public_key_response(response) + + ref_public_key, _ = calculate_public_key_and_chaincode(CurveChoice.Ed25519Slip, path=PATH_PREFIX + str(account_number | HARDENED_OFFSET) + PATH_SUFFIX) + assert "00" + public_key.hex() == ref_public_key + + +# In this test we check that the GET_PUBLIC_KEY in confirmation mode replies an error if the user refuses +@pytest.mark.active_test_scope +def test_get_public_key_confirm_refused(backend: BackendInterface, scenario_navigator: NavigateWithScenario) -> None: + client = EverscaleCommandSender(backend) + account_number = 0 + + with pytest.raises(ExceptionRAPDU) as e: + with client.get_public_key_with_confirmation(account_number=account_number): + scenario_navigator.address_review_reject() + + # Assert that we have received a refusal + assert e.value.status == Errors.SW_DENY + assert len(e.value.data) == 0 diff --git a/tests/test_sign_cmd.py b/tests/test_sign_cmd.py new file mode 100644 index 0000000..c208eb2 --- /dev/null +++ b/tests/test_sign_cmd.py @@ -0,0 +1,199 @@ +import pytest + +from ragger.backend.interface import BackendInterface +from ragger.error import ExceptionRAPDU +from ragger.firmware import Firmware +from ragger.navigator import Navigator, NavInsID +from ragger.navigator.navigation_scenario import NavigateWithScenario + +from application_client.everscale_command_sender import EverscaleCommandSender +from application_client.everscale_response_unpacker import unpack_sign_tx_response +from utils import navigate_until_text_and_compare + + +def run_test( + backend: BackendInterface, + navigator: Navigator, + default_screenshot_path: str, + test_name: str, + transaction: str, + expected_signature: str, +) -> None: + # Use the app interface instead of raw interface + client = EverscaleCommandSender(backend) + + # Raw transaction + transaction_bytes = bytes.fromhex(transaction) + + # Send the sign device instruction. + # As it requires on-screen validation, the function is asynchronous. + # It will yield the result when the navigation is done + with client.sign_tx(transaction_bytes): + # Validate the on-screen request by performing the navigation appropriate for this device + navigate_until_text_and_compare( + backend.firmware, navigator, "Accept", default_screenshot_path, test_name + ) + + # The device as yielded the result, parse it and ensure that the signature is correct + response = client.get_async_response().data + _, der_sig, _ = unpack_sign_tx_response(response) + assert der_sig.hex() == expected_signature + + +# In this tests we check the behavior of the device when asked to sign a transaction + + +# In this test we send to the device a transaction to sign and validate it on screen +# The transaction is short and will be sent in one chunk +# We will ensure that the displayed information is correct by using screenshots comparison + + +@pytest.mark.active_test_scope +def test_sign_tx_burn_usdt( + backend: BackendInterface, + navigator: Navigator, + default_screenshot_path: str, + test_name: str, +) -> None: + run_test( + backend, + navigator, + default_screenshot_path, + test_name, + "0000000001090455534454000101040100c9002161b3badb535d1b88d0e4d60d316567b1448568efafdf21846ecd0ba02e3adabf97000000ca7e2c951fb3d692b2a677323640012165801be2256b3d704f24c46aea3298c1a5ea8f8d1aa86ccc89474bc0570265e7898ac0000000000000000036d36956f8b969d03802216b562548ad00000000000000000000000049504f808015e4256b3d704f24c46aea3298c1a5ea8f8d1aa86ccc89474bc0570265e7898ad00328480101c03bf4894e22cdd500e450cbe5838b9938fda1e4d3727fe3b5385c5114b0293f0001", # Transaction + "a8b3ee327f6a64945e875d59ec49b12bea553b30170be65c541176f052156035428f8a0180e9f8802622b4f3339f2161076790b822e55c0d46f01b919f6de005", # Expected_signature + ) + +@pytest.mark.active_test_scope +def test_sign_tx_confirm( + backend: BackendInterface, + navigator: Navigator, + default_screenshot_path: str, + test_name: str, +) -> None: + run_test( + backend, + navigator, + default_screenshot_path, + test_name, + "00000000020904455645520001010101003b000071b3badb535d1b88d0e4d60d316567b1448568efafdf21846ecd0ba02e3adabf97000000ca7e395aa2b3d695f78d53a076b24a0de621e6767fc0", # Transaction + "8a5a9435d8b85f37f0d0b6dd0cb39521c8acf3f04cff7d53a4fb83e05313baace8b63b0fc3d8e6d0f9dd1922bc65df11efbecb9c34e4c79ec2a7267d67613e0e", # Expected_signature + ) + + + +# TODO: Add tests for the other transaction types + + +@pytest.mark.active_test_scope +def test_sign_tx_transfer( + backend: BackendInterface, + navigator: Navigator, + default_screenshot_path: str, + test_name: str, +) -> None: + run_test( + backend, + navigator, + default_screenshot_path, + test_name, + "00000000010904455645520001010301006c000161b3badb535d1b88d0e4d60d316567b1448568efafdf21846ecd0ba02e3adabf97000000ca7cfb9642b3d6449ea677323640010165801be2256b3d704f24c46aea3298c1a5ea8f8d1aa86ccc89474bc0570265e7898ac0000000000000000036d36956f8b969d038020000", # Transaction + "a0396cd952160f068e0a7d6279ba2b61a2215a4dd997fcc1fe8905722341a20a86424dfdb2598b86855e73e47a1804023ff3f9afffd91825df0f58825dabd808", # Expected_signature + ) + + +# # In this test we send to the device a transaction to trig a blind-signing flow +# # The transaction is short and will be sent in one chunk +# # We will ensure that the displayed information is correct by using screenshots comparison +# def test_sign_tx_short_tx_blind_sign(firmware: Firmware, +# backend: BackendInterface, +# navigator: Navigator, +# scenario_navigator: NavigateWithScenario, +# test_name: str, +# default_screenshot_path: str) -> None: +# # Use the app interface instead of raw interface +# client = EverscaleCommandSender(backend) +# # The path used for this entire test +# path: str = "m/44'/1'/0'/0/0" + +# # First we need to get the public key of the device in order to build the transaction +# rapdu = client.get_public_key(path=path) +# _, public_key, _, _ = unpack_get_public_key_response(rapdu.data) + +# # Create the transaction that will be sent to the device for signing +# transaction = Transaction( +# nonce=1, +# to="0x0000000000000000000000000000000000000000", +# value=0, +# memo="Blind-sign" +# ).serialize() + +# # Send the sign device instruction. +# valid_instruction = [NavInsID.RIGHT_CLICK] if firmware.is_nano else [NavInsID.USE_CASE_CHOICE_REJECT] +# # As it requires on-screen validation, the function is asynchronous. +# # It will yield the result when the navigation is done +# with client.sign_tx(path=path, transaction=transaction): +# navigator.navigate_and_compare(default_screenshot_path, +# test_name+"/part1", +# valid_instruction, +# screen_change_after_last_instruction=False) + +# # Validate the on-screen request by performing the navigation appropriate for this device +# scenario_navigator.review_approve() + +# # The device as yielded the result, parse it and ensure that the signature is correct +# response = client.get_async_response().data +# _, der_sig, _ = unpack_sign_tx_response(response) +# assert check_signature_validity(public_key, der_sig, transaction) + +# # In this test se send to the device a transaction to sign and validate it on screen +# # This test is mostly the same as the previous one but with different values. +# # In particular the long memo will force the transaction to be sent in multiple chunks +# def test_sign_tx_long_tx(backend: BackendInterface, scenario_navigator: NavigateWithScenario) -> None: +# # Use the app interface instead of raw interface +# client = EverscaleCommandSender(backend) +# path: str = "m/44'/1'/0'/0/0" + +# rapdu = client.get_public_key(path=path) +# _, public_key, _, _ = unpack_get_public_key_response(rapdu.data) + +# transaction = Transaction( +# nonce=1, +# to="0xde0b295669a9fd93d5f28d9ec85e40f4cb697bae", +# value=666, +# memo=("This is a very long memo. " +# "It will force the app client to send the serialized transaction to be sent in chunk. " +# "As the maximum chunk size is 255 bytes we will make this memo greater than 255 characters. " +# "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed non risus. Suspendisse lectus tortor, " +# "dignissim sit amet, adipiscing nec, ultricies sed, dolor. Cras elementum ultrices diam.") +# ).serialize() + +# with client.sign_tx(path=path, transaction=transaction): +# scenario_navigator.review_approve() + +# response = client.get_async_response().data +# _, der_sig, _ = unpack_sign_tx_response(response) +# assert check_signature_validity(public_key, der_sig, transaction) + + +# # Transaction signature refused test +# # The test will ask for a transaction signature that will be refused on screen +# def test_sign_tx_refused(backend: BackendInterface, scenario_navigator: NavigateWithScenario) -> None: +# # Use the app interface instead of raw interface +# client = EverscaleCommandSender(backend) +# path: str = "m/44'/1'/0'/0/0" + +# transaction = Transaction( +# nonce=1, +# to="0xde0b295669a9fd93d5f28d9ec85e40f4cb697bae", +# value=666, +# memo="This transaction will be refused by the user" +# ).serialize() + +# with pytest.raises(ExceptionRAPDU) as e: +# with client.sign_tx(path=path, transaction=transaction): +# scenario_navigator.review_reject() + +# # Assert that we have received a refusal +# assert e.value.status == Errors.SW_DENY +# assert len(e.value.data) == 0 diff --git a/tests/test_sign_message_cmd.py b/tests/test_sign_message_cmd.py new file mode 100644 index 0000000..0b07bfe --- /dev/null +++ b/tests/test_sign_message_cmd.py @@ -0,0 +1,49 @@ +import pytest + +from ragger.backend.interface import BackendInterface +from ragger.error import ExceptionRAPDU +from ragger.firmware import Firmware +from ragger.navigator import Navigator, NavInsID +from ragger.navigator.navigation_scenario import NavigateWithScenario + +from application_client.everscale_command_sender import EverscaleCommandSender, Errors, WalletType +from application_client.everscale_response_unpacker import unpack_get_public_key_response, unpack_sign_tx_response +from utils import navigate_until_text_and_compare + +# In this tests we check the behavior of the device when asked to sign a transaction + + +# In this test we send to the device a transaction to sign and validate it on screen +# The transaction is short and will be sent in one chunk +# We will ensure that the displayed information is correct by using screenshots comparison + +# TODO: Add a valid raw message and a valid expected signature +@pytest.mark.active_test_scope +def test_sign_message(backend: BackendInterface, navigator: Navigator, default_screenshot_path: str, test_name: str) -> None: + # Use the app interface instead of raw interface + client = EverscaleCommandSender(backend) + account_number = 0 + wallet_type = WalletType.WALLET_V3 + # First we need to get the public key of the device in order to build the transaction + rapdu = client.get_public_key(account_number=account_number) + + # Message to sign + payload = bytes.fromhex("00000000001111111111111111111111111111111111111111111111111111111111111111") + + # Send the sign device instruction. + # As it requires on-screen validation, the function is asynchronous. + # It will yield the result when the navigation is done + with client.sign_message(payload=payload): + # Validate the on-screen request by performing the navigation appropriate for this device + navigate_until_text_and_compare( + backend.firmware, + navigator, + "message.", + default_screenshot_path, + test_name + ) + + # The device as yielded the result, parse it and ensure that the signature is correct + response = client.get_async_response().data + _, der_sig, _ = unpack_sign_tx_response(response) + assert der_sig.hex() == "d2edfcb178abad8df455f605d2887e6fed24ed1d2462e1fc216fad55f2e60fa372239ce950b7ab944a2eb80a2bcfaadfa02f870c6b3ed6df29fa9bc7419a730f" \ No newline at end of file diff --git a/tests/usage.md b/tests/usage.md new file mode 100644 index 0000000..dc2fbfa --- /dev/null +++ b/tests/usage.md @@ -0,0 +1,78 @@ +# How to use the Ragger test framework + +This framework allows testing the application on the Speculos emulator or on a real device using LedgerComm or LedgerWallet + +## Quickly get started with Ragger and Speculos + +### Install ragger and dependencies + +```shell +pip install --extra-index-url https://test.pypi.org/simple/ -r requirements.txt +sudo apt-get update && sudo apt-get install qemu-user-static +``` + +### Compile the application + +The application to test must be compiled for all required devices. +You can use for this the container `ghcr.io/ledgerhq/ledger-app-builder/ledger-app-builder-lite`: + +```shell +docker pull ghcr.io/ledgerhq/ledger-app-builder/ledger-app-builder-lite:latest +cd # replace with the name of your app, (eg boilerplate) +docker run --user "$(id -u)":"$(id -g)" --rm -ti -v "$(realpath .):/app" --privileged -v "/dev/bus/usb:/dev/bus/usb" ledger-app-builder-lite:latest +make clean && make BOLOS_SDK=$_SDK # replace with one of [NANOX, NANOSP, STAX, FLEX] +exit +``` + +### Run a simple test using the Speculos emulator + +You can use the following command to get your first experience with Ragger and Speculos + +```shell +pytest -v --tb=short --device nanox --display +``` + +Or you can refer to the section `Available pytest options` to configure the options you want to use + +### Run a simple test using a real device + +The application to test must be loaded and started on a Ledger device plugged in USB. +You can use for this the container `ghcr.io/ledgerhq/ledger-app-builder/ledger-app-builder-lite`: + +```shell +docker pull ghcr.io/ledgerhq/ledger-app-builder/ledger-app-builder-lite:latest +cd app-/ # replace with the name of your app, (eg boilerplate) +docker run --user "$(id -u)":"$(id -g)" --rm -ti -v "$(realpath .):/app" --privileged -v "/dev/bus/usb:/dev/bus/usb" ledger-app-builder-lite:latest +make clean && make BOLOS_SDK=$_SDK load # replace with one of [NANOX, NANOSP, STAX, FLEX] +exit +``` + +You can use the following command to get your first experience with Ragger and Ledgerwallet on a NANOX. +Make sure that the device is plugged, unlocked, and that the tested application is open. + +```shell +pytest -v --tb=short --device nanox --backend ledgerwallet +``` + +Or you can refer to the section `Available pytest options` to configure the options you want to use + +## Available pytest options + +Standard useful pytest options + +```shell + -v formats the test summary in a readable way + -s enable logs for successful tests, on Speculos it will enable app logs if compiled with DEBUG=1 + -k only run the tests that contain in their names + --tb=short in case of errors, formats the test traceback in a readable way +``` + +Custom pytest options + +```shell + --device run the test on the specified device [nanox,nanosp,stax,flex,all]. This parameter is mandatory + --backend run the tests against the backend [speculos, ledgercomm, ledgerwallet]. Speculos is the default + --display on Speculos, enables the display of the app screen using QT + --golden_run on Speculos, screen comparison functions will save the current screen instead of comparing + --log_apdu_file log all apdu exchanges to the file in parameter. The previous file content is erased +``` diff --git a/tests/utils.py b/tests/utils.py new file mode 100644 index 0000000..000024b --- /dev/null +++ b/tests/utils.py @@ -0,0 +1,129 @@ +from pathlib import Path +from typing import List +import re +from Crypto.Hash import keccak + +from ecdsa.curves import SECP256k1 +from ecdsa.keys import VerifyingKey +from ecdsa.util import sigdecode_der +from ragger.navigator import NavInsID + +# Check if a signature of a given message is valid +def check_signature_validity(public_key: bytes, signature: bytes, message: bytes) -> bool: + pk: VerifyingKey = VerifyingKey.from_string( + public_key, + curve=SECP256k1, + hashfunc=None + ) + # Compute message hash (keccak_256) + k = keccak.new(digest_bits=256) + k.update(message) + message_hash = k.digest() + + return pk.verify_digest(signature=signature, + digest=message_hash, + sigdecode=sigdecode_der) + + +def verify_name(name: str) -> None: + """Verify the app name, based on defines in Makefile + + Args: + name (str): Name to be checked + """ + + name_str = "" + lines = _read_makefile() + name_re = re.compile(r"^APPNAME\s?=\s?\"?(?P\w+)\"?", re.I) + for line in lines: + info = name_re.match(line) + if info: + dinfo = info.groupdict() + name_str = dinfo["val"] + assert name == name_str + + +def verify_version(version: str) -> None: + """Verify the app version, based on defines in Makefile + + Args: + Version (str): Version to be checked + """ + + vers_dict = {} + vers_str = "" + lines = _read_makefile() + version_re = re.compile(r"^APPVERSION_(?P\w)\s?=\s?(?P\d*)", re.I) + for line in lines: + info = version_re.match(line) + if info: + dinfo = info.groupdict() + vers_dict[dinfo["part"]] = dinfo["val"] + try: + vers_str = f"{vers_dict['M']}.{vers_dict['N']}.{vers_dict['P']}" + except KeyError: + pass + assert version == vers_str + + +def _read_makefile() -> List[str]: + """Read lines from the parent Makefile """ + + parent = Path(__file__).parent.parent.resolve() + makefile = f"{parent}/Makefile" + with open(makefile, "r", encoding="utf-8") as f_p: + lines = f_p.readlines() + return lines + + +def navigate_until_text_and_compare( + firmware, + navigator, + text: str, + screenshot_path: str, + test_name: str, + screen_change_before_first_instruction: bool = True, + screen_change_after_last_instruction: bool = True, + nav_ins_confirm_instruction: NavInsID = NavInsID.USE_CASE_REVIEW_CONFIRM, +): + """Navigate through device screens until specified text is found and compare screenshots. + + This function handles navigation through device screens differently based on the device type (Stax/Flex vs others). + It will navigate through screens until the specified text is found, taking screenshots for comparison along the way. + + Args: + firmware: The firmware object containing device information + navigator: The navigator object used to control device navigation + text: The text string to search for on device screens + screenshot_path: Path where screenshot comparison files will be saved + test_name: The name of the test that is being run + screen_change_before_first_instruction: Whether to wait for screen change before first instruction + screen_change_after_last_instruction: Whether to wait for screen change after last instruction + Returns: + None + + Note: + For Stax/Flex devices: + - Uses swipe left gesture for navigation + - Uses review confirm for confirmation + For other devices: + - Uses right click for navigation + - Uses both click for confirmation + """ + if firmware.device.startswith(("stax", "flex")): + go_right_instruction = NavInsID.SWIPE_CENTER_TO_LEFT + confirm_instructions = [nav_ins_confirm_instruction] + else: + go_right_instruction = NavInsID.RIGHT_CLICK + confirm_instructions = [NavInsID.BOTH_CLICK] + + navigator.navigate_until_text_and_compare( + go_right_instruction, + confirm_instructions, + text, + screenshot_path, + test_name, + 300, + screen_change_before_first_instruction, + screen_change_after_last_instruction, + ) From ab56cf51523da8cb59c7a4dcee04b3a92f2da6d9 Mon Sep 17 00:00:00 2001 From: keiff3r Date: Thu, 13 Feb 2025 16:27:53 +0100 Subject: [PATCH 09/67] fix: edit the text in the sign message approval screen --- src/sign.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sign.c b/src/sign.c index 37d2c3e..0a2f726 100644 --- a/src/sign.c +++ b/src/sign.c @@ -56,7 +56,7 @@ UX_STEP_CB( { &C_icon_validate_14, "Sign", - "message", + "message.", }); UX_FLOW(ux_sign_flow, From e37de50d94bca44a0d3d65802290007690695d07 Mon Sep 17 00:00:00 2001 From: keiff3r Date: Thu, 13 Feb 2025 16:43:07 +0100 Subject: [PATCH 10/67] test: generate golden snapshots --- .../00001.png | Bin 889 -> 915 bytes .../00002.png | Bin 498 -> 488 bytes .../00001.png | Bin 889 -> 915 bytes .../00002.png | Bin 498 -> 488 bytes .../00000.png | Bin 904 -> 933 bytes .../00001.png | Bin 556 -> 531 bytes .../00000.png | Bin 904 -> 933 bytes .../00001.png | Bin 556 -> 531 bytes .../nanosp/test_sign_message/00001.png | Bin 495 -> 499 bytes .../nanosp/test_sign_message/00002.png | Bin 443 -> 416 bytes .../nanosp/test_sign_tx_confirm/00002.png | Bin 518 -> 502 bytes .../nanosp/test_sign_tx_transfer/00003.png | Bin 872 -> 909 bytes .../nanosp/test_sign_tx_transfer/00004.png | Bin 518 -> 506 bytes 13 files changed, 0 insertions(+), 0 deletions(-) diff --git a/tests/snapshots/nanosp/test_get_address_wallet_v3_confirm_accepted/00001.png b/tests/snapshots/nanosp/test_get_address_wallet_v3_confirm_accepted/00001.png index b0fb95c2cfac3c69ca7b1d8de2628c54755efe3e..22d76bffbe0c12d657b0c4e004cff6cd552dc00b 100644 GIT binary patch delta 892 zcmV-?1B3ke29pPnB!5~-L_t(|ob8%jlH4E+gh?tl;r>VBE_s*=#UiQI2=HuX^*wp8 zK(hEV?I|Tmk|arzBuPGr)>>}eyoKtp;nIqmPW=|ZtVf(!lqgWikI|F*N<&o=R2T>KF;*lnl6o*@da#{ z^@k)J-X^zZz_{Q}h11|-*4A!gy(vlq*KbFC1sGk7g-`C!AI1K9c>9?0`TQ@tLXsp& z@>BR_-3V(h(|_xlbpjY2F-Iy!+lifrdjLyP67Yq8F2m@WlMSyRT9Plg*bEia0wqj@ z%umT-ElBNWb%d6$lIIdugX3Lw7^)?VBhnZC$vhg0pbc0yYAt-t6ozfADvUAN!gDiV zY3ziN56~BA5P-D7&BlVc0qOvE|0HeHTIK5?ngmY#g0nXZ9aMNp)ubVX_b2 zNv=Zg#7T1Y!Bu2>O*OPvAO*$Og{u*&B}F^$FlSmUKw9lIPk&WCf(HSO@3J}}CWQp+ zDoZ7dv45q{OvbLVgd4{}u4c?X34_sH;Mr#>j@1CdO)*EXfJfXtpdG&hP-)5~Nf2?Ut8Rm&DfylY*!k$WYX}yrryS z-BQ~Rn7I+gLft(HO9heC`P90bmhuGT+PFckvKlJJ=>SVXWPFh7qh$#i#C}O#(^_+| z>UEAaJJsyG7PNE1X4FU3e&6+k^$o6jbX;28nJ@zSE`WUXNRlK;k|arz_wX0@fOf&- S=vuh|0000VRUGm@xMWL<5;&JBh?`evW zEU{RIwo4&|5JCtc$)!dFUNjYK7P2q<@$%^zKh={E?T;DkB%vh9Bb9A*4qB< zfBRl5{Mmj*AGHta-B4?_1_E!H%fa#8&XGI7T5kP-4*$wN%YUU;YgGq&@Rcn?2x)*I zLvP{W9WZ1JuKl?y^aE32<+#>o0| zY>@f`GM(Ncr|y8h;0}$$;zDX`v$1xH(jbi6P`3bmh`#a3=kr&wUJp+nQ@)@7<*7gj zA>^m<%lczldw&_WYwD(R2!tG|)C&%2I6?j7{p+iFB0UZJ4uR;JgN>yisylAg0Qr$h zHEi(>oPMQ(N;V(FvI-2(HGvqX)`t?^oAM$PUd_ePd91pJr{Nesvp5oJs8#Gzj$yB4 zWoRW^l{fm9-bR-4=>ct*y;lSHrU86K;Y|QIUK1S~N`GqK!`@(pmGx^qZzqC=X*~T# z>}H}CeU^=s$)s z)ExbX;T(JtR-sQ43^M27C~|lqHMH2;9->XQM!Ek(G|p6u6RT)jMo^0dL*N>445ALI zW|oa=nSYWk=ZyUfLxFQHpHOOT9Q-h=@y>%Tt_B`WBPT^T<)!4$gwjP7VGteEkFI*D zy3NGlc9B4gYrmyf=4g`zSYJ}VL>P<_i3XQ(ROQvOblg*T6R@t|E_xl(=`1Z4M4i#; zRQIc)?^idoZ<7vb@;8&u0JRaX%j?3bwdIv{9Dk1`eeV`Te4Ue82_b|KLVhf!8rtw* z(<53!!A{GdCAi^pG*QP)UO&6PR8zJ372^w;s^$lZrlAt)1VUV_Or)b_hKIvbl}xIk zi^pBueJ&8_viE$nUklnB$#=KD|H0>}U1!BcH4Dp>pX&T@fwwSXfV<;$N&TJ5e>&o# zV_Q%Bb+p=|N{N1?&^;CCRqD!0s=);KlGbqblsX?KXIZ{&^vl|(uI2>D!Ntp5&3{0d sdK=|z4UuO+Dvh~Vgb+dqA%wh|zg$ITr-G)ukpKVy07*qoM6N<$f@trxc>n+a diff --git a/tests/snapshots/nanosp/test_get_address_wallet_v3_confirm_accepted/00002.png b/tests/snapshots/nanosp/test_get_address_wallet_v3_confirm_accepted/00002.png index 79ec8e7d5f4668017394572679a188b792d1ef70..65e1c70c8d5979cf3076db3f830b5ceaf341ae27 100644 GIT binary patch delta 462 zcmV;<0Wtpa1Ly;gB!90-L_t(|obB0Ba)clZfMMF{O}PJ&yh|Up<4_VpU<2$p|M%2Y zL<|tbrUU>006fNZUDtK_PZ{N-+Ed-jZi6hdsCnNjDlH#lMg5~>9COY|YhHO=mRa#Q zKjAeR)CW*UV$Qi01^*FM>y-2IaPc#s3TQPOs%KLVrpB061AkpzE045pF{(9b-n424 zRLymc{ka;-;5x%y6&o5Hv6id>X~CkJ3#k`$`_`U@ZCky9JK%12nF?MxT^9BXE<2ld z^N+vg=@!1}E4Dg2C#VZuYdLL==!r$xc=M@NdwDyfRqzVQhpTrg4;Rt_AuRy_;7{;t zsG-~xyv3pMHFMlAvS5N|9hGU zCBzUzSSbJi0KnJSwr$%s|0Sb-RDZgA*?o|8lDhYk(P;Y^8SS4X<5+7gqwclkvQEb1 z{D!w^7(T#oCe~WDDELc;v`fyPhl_s$x`1|XL-%aM!lKOCVSk{z-^vp07H4TM%|%&n zK-XR8+@EWq4X!iXUA0q_BUZ{9P!bl^+9*dsw{Pv~*s|3tcmVc(x2fQn(`9APS6;srWPeTL>-0)V+qkjIETfI4_8s%?v_m0T;<+^ahtarE(q2m4|70CSypJoB zcfs6WdK|qo62*ShbNJ=ysdKhVVBE_s*=#UiQI2=HuX^*wp8 zK(hEV?I|Tmk|arzBuPGr)>>}eyoKtp;nIqmPW=|ZtVf(!lqgWikI|F*N<&o=R2T>KF;*lnl6o*@da#{ z^@k)J-X^zZz_{Q}h11|-*4A!gy(vlq*KbFC1sGk7g-`C!AI1K9c>9?0`TQ@tLXsp& z@>BR_-3V(h(|_xlbpjY2F-Iy!+lifrdjLyP67Yq8F2m@WlMSyRT9Plg*bEia0wqj@ z%umT-ElBNWb%d6$lIIdugX3Lw7^)?VBhnZC$vhg0pbc0yYAt-t6ozfADvUAN!gDiV zY3ziN56~BA5P-D7&BlVc0qOvE|0HeHTIK5?ngmY#g0nXZ9aMNp)ubVX_b2 zNv=Zg#7T1Y!Bu2>O*OPvAO*$Og{u*&B}F^$FlSmUKw9lIPk&WCf(HSO@3J}}CWQp+ zDoZ7dv45q{OvbLVgd4{}u4c?X34_sH;Mr#>j@1CdO)*EXfJfXtpdG&hP-)5~Nf2?Ut8Rm&DfylY*!k$WYX}yrryS z-BQ~Rn7I+gLft(HO9heC`P90bmhuGT+PFckvKlJJ=>SVXWPFh7qh$#i#C}O#(^_+| z>UEAaJJsyG7PNE1X4FU3e&6+k^$o6jbX;28nJ@zSE`WUXNRlK;k|arz_wX0@fOf&- S=vuh|0000VRUGm@xMWL<5;&JBh?`evW zEU{RIwo4&|5JCtc$)!dFUNjYK7P2q<@$%^zKh={E?T;DkB%vh9Bb9A*4qB< zfBRl5{Mmj*AGHta-B4?_1_E!H%fa#8&XGI7T5kP-4*$wN%YUU;YgGq&@Rcn?2x)*I zLvP{W9WZ1JuKl?y^aE32<+#>o0| zY>@f`GM(Ncr|y8h;0}$$;zDX`v$1xH(jbi6P`3bmh`#a3=kr&wUJp+nQ@)@7<*7gj zA>^m<%lczldw&_WYwD(R2!tG|)C&%2I6?j7{p+iFB0UZJ4uR;JgN>yisylAg0Qr$h zHEi(>oPMQ(N;V(FvI-2(HGvqX)`t?^oAM$PUd_ePd91pJr{Nesvp5oJs8#Gzj$yB4 zWoRW^l{fm9-bR-4=>ct*y;lSHrU86K;Y|QIUK1S~N`GqK!`@(pmGx^qZzqC=X*~T# z>}H}CeU^=s$)s z)ExbX;T(JtR-sQ43^M27C~|lqHMH2;9->XQM!Ek(G|p6u6RT)jMo^0dL*N>445ALI zW|oa=nSYWk=ZyUfLxFQHpHOOT9Q-h=@y>%Tt_B`WBPT^T<)!4$gwjP7VGteEkFI*D zy3NGlc9B4gYrmyf=4g`zSYJ}VL>P<_i3XQ(ROQvOblg*T6R@t|E_xl(=`1Z4M4i#; zRQIc)?^idoZ<7vb@;8&u0JRaX%j?3bwdIv{9Dk1`eeV`Te4Ue82_b|KLVhf!8rtw* z(<53!!A{GdCAi^pG*QP)UO&6PR8zJ372^w;s^$lZrlAt)1VUV_Or)b_hKIvbl}xIk zi^pBueJ&8_viE$nUklnB$#=KD|H0>}U1!BcH4Dp>pX&T@fwwSXfV<;$N&TJ5e>&o# zV_Q%Bb+p=|N{N1?&^;CCRqD!0s=);KlGbqblsX?KXIZ{&^vl|(uI2>D!Ntp5&3{0d sdK=|z4UuO+Dvh~Vgb+dqA%wh|zg$ITr-G)ukpKVy07*qoM6N<$f@trxc>n+a diff --git a/tests/snapshots/nanosp/test_get_address_wallet_v3_confirm_refused/00002.png b/tests/snapshots/nanosp/test_get_address_wallet_v3_confirm_refused/00002.png index 79ec8e7d5f4668017394572679a188b792d1ef70..65e1c70c8d5979cf3076db3f830b5ceaf341ae27 100644 GIT binary patch delta 462 zcmV;<0Wtpa1Ly;gB!90-L_t(|obB0Ba)clZfMMF{O}PJ&yh|Up<4_VpU<2$p|M%2Y zL<|tbrUU>006fNZUDtK_PZ{N-+Ed-jZi6hdsCnNjDlH#lMg5~>9COY|YhHO=mRa#Q zKjAeR)CW*UV$Qi01^*FM>y-2IaPc#s3TQPOs%KLVrpB061AkpzE045pF{(9b-n424 zRLymc{ka;-;5x%y6&o5Hv6id>X~CkJ3#k`$`_`U@ZCky9JK%12nF?MxT^9BXE<2ld z^N+vg=@!1}E4Dg2C#VZuYdLL==!r$xc=M@NdwDyfRqzVQhpTrg4;Rt_AuRy_;7{;t zsG-~xyv3pMHFMlAvS5N|9hGU zCBzUzSSbJi0KnJSwr$%s|0Sb-RDZgA*?o|8lDhYk(P;Y^8SS4X<5+7gqwclkvQEb1 z{D!w^7(T#oCe~WDDELc;v`fyPhl_s$x`1|XL-%aM!lKOCVSk{z-^vp07H4TM%|%&n zK-XR8+@EWq4X!iXUA0q_BUZ{9P!bl^+9*dsw{Pv~*s|3tcmVc(x2fQn(`9APS6;srWPeTL>-0)V+qkjIETfI4_8s%?v_m0T;<+^ahtarE(q2m4|70CSypJoB zcfs6WdK|qo62*ShbNJ=ysdKhV`4C@Yg(;H{zMvEbXzTly0kT$DvtwG7k>uVSO0Z4C@6f$IdXOY z4>^oJU)Huzowrx+k>OMBM!#!!|H%!pO3ngoSOA*vy-nk9tpx*uGy^YNoSYE!a_qL4 z%;>4{?dnWl47$ z?QxG)mTsD3as0=4Y3W~2B%Jc@z&yqtvd|sNBWkE>#OQREUwk~sQi&}$951CWM-)xf z9<|z1w^tfOKl>Z67Y# zW_$+r2l!YbE4WdJ83F*<1FH4HwoCBbo`Y9hT0GeXX9)gS8?6*%A(sGw8DkFqRFVCmLSMOHlZ@%?Xb0% zk>zG~q@pPeaQ)YnUYH#~siEo(+)0r_CWG2aRRWlG;xkW~T~7^VzP%*VTI_2<%;b`R zLJiOx2Jq`G#R>P;vh$Sl%(G(L9s9@AFlsTn= zl1uDg=KLpHk+;LI%dr{Y;o**MD*3WYUKB-96h-k3m}D%qB-m=TxAqUW4!#|zz?h2X zAtgyRRYOL8kSV(*Lag=%%){kR{JZT{owZC@)!C6S<`3rrWycJFlncCucfwb zZ+~RxQ7K|uS5Xs1DKRnzxH+eq247mQiMKeThDLPCA0~341&{$zCDGC3ho1P3g^G!KqwJpBI l(nGi?ilQirq9_jV7b0~ft1^{xcK`qY00>D%PDHLkV1nrn!bt!C delta 881 zcmV-%1CIQq2Z#rdB!5pyL_t(|ob8-lZtNfoh109P_yd$|uIA!O|1gH1@)`g@uo z{1{9eb29C96-7}LMNt&RalVr6TWjOj`@V5aQDH1pE0Fz!X|0W2&7IE{juk}n0RJ+L zJ6o3HzVBVjN+NcT_}ZEG$5_*9Me?0#Y|(ACHq@p0OjI5xrhhsH*H^E)Hz+84Xmjkj z19-@3^!2iC3w87M$~`iC%H8O9Meo1)hFE2f0|FL+CVX#V{;joSK$y+IZp*VL1Raju z7Q&1kh<35Jw-2X7PzU&oaVMWRW%jJvYVU4)&;e?SMsA|MzHU?z$q65YaQL3f)j*ez zNZE714+kV&*ME-X%lGhF2s(+iK)a4FndZOw4#3;LD2k#$&j2-sV!co;Q592=KaBaS zs>bkzmz@pcBQ92fR15KZQ;4)T{6TbR>0elDR5N`m{Z|K?3mKcqv8>@N-bq8PO+m`* z2M(wf`4<2JM+@4nJ>jvi@cGu;f{m|VW*i3ybyo$P+JDuO)j5Rc+|B-|a$+uHAsCbt zHp0His-fhwhYae+d7QoG0M##kGT1lM37AE&fHVp+E-!+jb z52vASqAA95=fztH($FWKBE=f909fp#eDFTygEy(wf0J7MHje?l|tPb73 zifSGheN>Fth97T<57-iB6yE`{<>Ti$x0*FezPYGxeT|vN!w>XS2#QTLqgkGpZ?~}Q z05=ZKZ&bD{&6byL_-z^}?^mr%S~NfZ#43uSD2k#eiUs}ySJ*h?Qe!(@PjAOTOE|9fgZ z5Rpq%ObGx0066YzrE<<${(D`QU9u`54|WSUzuS$O!j*uT-vDvlt|* zTb<Gra0n^C4MKjmkoa#v|+J6p9`mYS(8uc|vRcKPnF#(w~7KMk9)E?@=tIj^Dg zm$odbNhixEkrw`r53}D2ZPEAz48V=k8&&+#s*BG#FJ=SJx{19BrH~YKICpERW|Tza z%qh1gr#*B!BZsL_t(|ob8!Ga>F1DMQNuu@%@j)UApiL!+<1Y1SDzSTP2Q= zWl4MpP6+@2007`PUy;E%=lbh)UAARoP+t@coPMUsITu&uS%yK@HnoR2z9WO1Xo5~w zrPWE@Jz|#Y*bJNA{t-Ws!6GHlzFV~}OI>T%PbC({wikaj3V*EqGz=rof*Ih)`3xmr z+O%kzuC`B=EZoK8$qG=3HoVB+@15WlzP;d9PGHSo-vwTn<%B0-0>TcZi12$2(y zaj?K5M2>t9TfVe+%c2LRhP*s|piC=|!`6?gkl|u}^zDrz@ zLjMEa9And!7JsRE+{tSs=p)p1RTo)@ZH_U5ayP27fpaS66Ypop2@MdnTObxa|dI10c00000000000000000000006e}3*`Ic VLU$jlCky}p002ovPDHLkV1nMS_w4`x diff --git a/tests/snapshots/nanosp/test_get_public_key_confirm_refused/00000.png b/tests/snapshots/nanosp/test_get_public_key_confirm_refused/00000.png index a63f85f1db8b849a5dcbea69fdefdc20a1688f58..0633ead3d2b5df3b86c3e77b3eb3c3e301f7bef6 100644 GIT binary patch delta 911 zcmV;A191F^2c-v)B!6s4L_t(|ob8%XlH4E+M4eP_;`<+oyX0dk6osT#gJiS2(fb-R zfCUH{wS8ShQ4~c{6h-kmzk=;sYvbj8-?-*fVJuWDko|1aS{u8Pol6VH3RCk9en%R2 zQl{g+@2qJhnY?GZ>`4C@Yg(;H{zMvEbXzTly0kT$DvtwG7k>uVSO0Z4C@6f$IdXOY z4>^oJU)Huzowrx+k>OMBM!#!!|H%!pO3ngoSOA*vy-nk9tpx*uGy^YNoSYE!a_qL4 z%;>4{?dnWl47$ z?QxG)mTsD3as0=4Y3W~2B%Jc@z&yqtvd|sNBWkE>#OQREUwk~sQi&}$951CWM-)xf z9<|z1w^tfOKl>Z67Y# zW_$+r2l!YbE4WdJ83F*<1FH4HwoCBbo`Y9hT0GeXX9)gS8?6*%A(sGw8DkFqRFVCmLSMOHlZ@%?Xb0% zk>zG~q@pPeaQ)YnUYH#~siEo(+)0r_CWG2aRRWlG;xkW~T~7^VzP%*VTI_2<%;b`R zLJiOx2Jq`G#R>P;vh$Sl%(G(L9s9@AFlsTn= zl1uDg=KLpHk+;LI%dr{Y;o**MD*3WYUKB-96h-k3m}D%qB-m=TxAqUW4!#|zz?h2X zAtgyRRYOL8kSV(*Lag=%%){kR{JZT{owZC@)!C6S<`3rrWycJFlncCucfwb zZ+~RxQ7K|uS5Xs1DKRnzxH+eq247mQiMKeThDLPCA0~341&{$zCDGC3ho1P3g^G!KqwJpBI l(nGi?ilQirq9_jV7b0~ft1^{xcK`qY00>D%PDHLkV1nrn!bt!C delta 881 zcmV-%1CIQq2Z#rdB!5pyL_t(|ob8-lZtNfoh109P_yd$|uIA!O|1gH1@)`g@uo z{1{9eb29C96-7}LMNt&RalVr6TWjOj`@V5aQDH1pE0Fz!X|0W2&7IE{juk}n0RJ+L zJ6o3HzVBVjN+NcT_}ZEG$5_*9Me?0#Y|(ACHq@p0OjI5xrhhsH*H^E)Hz+84Xmjkj z19-@3^!2iC3w87M$~`iC%H8O9Meo1)hFE2f0|FL+CVX#V{;joSK$y+IZp*VL1Raju z7Q&1kh<35Jw-2X7PzU&oaVMWRW%jJvYVU4)&;e?SMsA|MzHU?z$q65YaQL3f)j*ez zNZE714+kV&*ME-X%lGhF2s(+iK)a4FndZOw4#3;LD2k#$&j2-sV!co;Q592=KaBaS zs>bkzmz@pcBQ92fR15KZQ;4)T{6TbR>0elDR5N`m{Z|K?3mKcqv8>@N-bq8PO+m`* z2M(wf`4<2JM+@4nJ>jvi@cGu;f{m|VW*i3ybyo$P+JDuO)j5Rc+|B-|a$+uHAsCbt zHp0His-fhwhYae+d7QoG0M##kGT1lM37AE&fHVp+E-!+jb z52vASqAA95=fztH($FWKBE=f909fp#eDFTygEy(wf0J7MHje?l|tPb73 zifSGheN>Fth97T<57-iB6yE`{<>Ti$x0*FezPYGxeT|vN!w>XS2#QTLqgkGpZ?~}Q z05=ZKZ&bD{&6byL_-z^}?^mr%S~NfZ#43uSD2k#eiUs}ySJ*h?Qe!(@PjAOTOE|9fgZ z5Rpq%ObGx0066YzrE<<${(D`QU9u`54|WSUzuS$O!j*uT-vDvlt|* zTb<Gra0n^C4MKjmkoa#v|+J6p9`mYS(8uc|vRcKPnF#(w~7KMk9)E?@=tIj^Dg zm$odbNhixEkrw`r53}D2ZPEAz48V=k8&&+#s*BG#FJ=SJx{19BrH~YKICpERW|Tza z%qh1gr#*B!BZsL_t(|ob8!Ga>F1DMQNuu@%@j)UApiL!+<1Y1SDzSTP2Q= zWl4MpP6+@2007`PUy;E%=lbh)UAARoP+t@coPMUsITu&uS%yK@HnoR2z9WO1Xo5~w zrPWE@Jz|#Y*bJNA{t-Ws!6GHlzFV~}OI>T%PbC({wikaj3V*EqGz=rof*Ih)`3xmr z+O%kzuC`B=EZoK8$qG=3HoVB+@15WlzP;d9PGHSo-vwTn<%B0-0>TcZi12$2(y zaj?K5M2>t9TfVe+%c2LRhP*s|piC=|!`6?gkl|u}^zDrz@ zLjMEa9And!7JsRE+{tSs=p)p1RTo)@ZH_U5ayP27fpaS66Ypop2@MdnTObxa|dI10c00000000000000000000006e}3*`Ic VLU$jlCky}p002ovPDHLkV1nMS_w4`x diff --git a/tests/snapshots/nanosp/test_sign_message/00001.png b/tests/snapshots/nanosp/test_sign_message/00001.png index db58d4271e08ae84259d65e743b146b6eeb34040..0e9571e809f05f6a3ae4ee0b705318d5ec455726 100644 GIT binary patch delta 473 zcmV;~0Ve+M1M>rrB!9X|L_t(|obA|Al7k=&fMIrLZ{q!r#9j8mDZ@aBP$HrB|DI}E z0TZN32mk;8z;Zu^ZN(VR565w|BJN_0`C!fwwj$yc*1`XL4AYXjMg{YqCdE(BAS*Nm92{A!d`LbQ^MRzSh zmw7L~Qq~_`u~H2VQ)sO-Xl30J6kd~Enbb<8H5rT6#4d{7#e}x*tspIi`#e>;kyfDQd&W7*+jB4g_279U=IC~CHOMAUo?P3Pwg zEja8{KlAJ#8MgBsARc~1r0`uYVjH3W&M1JhvH(+$O-AZ%OMN5rgIuI{hwMLIGs$Fs z86nkVe=%y{iB-rG|HGcf()-?q9}zv$E8i(2Vig%ypHfU@K9XZA!Wji{Mgg2r0A~~c z0001+*=-;38IfMQ?IS)TGHkbf#Aifuya_v_0M00YGYa600ssI20N>{y2pcLCx1eyw P00000NkvXXu0mjf@f_2@ delta 469 zcmV;`0V@9U1MdTnB!9L^L_t(|obA|Aa)clZfMMI|O}PJ&yh|UPG7JeJh)Wpze@|^z zVk9iC9tQvb0I=Mb{qcF8*B>dRRwUL{&%I*0W6$#}Kb6Oq5p}M*g?-7?u6_t4S%T>B^w2z#mb|H4av5a3+_lxRtq8n5Qa_*?(_9?!0>CRas>u{W-+t zmB-kpkV8Dl<-x{vwMKau1!vxGfGVdp7D#u;oH<2zl&7kD)I2wmyS@QsMm2jX9PLTZ zk!n#_)XS(&VQ3{+x19&w%Q>(GwKiy#z5m#%oyuR~Q07OnIfI6&E$BL5UeSlPy%>?! zlBu$(r|_2~(|-;nvG4gZBDdLR*U$%5vu1QCq@E9D;5ne_k(Jv`(s>eIto3^o0I-_8 zi4&QRcwNJ)--SdbBg5oiBJ+_F&jG<`Krk8*j0Oa&8!&atMo(vYnf(Qtlg#Wdqf9lk zzZgA;#4Z$x`*5VO>D}!;;yWT8}fKvAZeo8JY8J#85|{(l6K_wt(lEz0G5MQhW{ zxn&2a@`yV-qs&gfL`>YG)1=x}og=}V{REW7M=eBhrI(3Ii&v(yH4|!f29q^1Pln}Q zbyo>G&3pA#r~dR+mFl0vR9dN>+;F1DKvCN1PT2pF*h@d0G7NekJ2C1c_k6X) z7D7B6rxXAH0ARZ>|Krx$@kg!IYRPrvb1j+Wy{)z7z{enJx%}L|FXa6pdNqqt~pwDr+4v888sK!2Zhb>ve{V@v&0MBT@0 z{4V4zk>K)TXI$pUW1O51(H)@bah;tZ*V;0tco)mNB3YdcJ8dcFkq{Bu0b@8dbR87C z=)GlH)Dv|KQx^^^xO(iwMQ*te_QVln9ndQO{P9gERXoE}kuOJZ{&gBHPaQ!=XMIH% z?Raroto1TQQ-8aNrzFFk3Nq#2x0e%Np0uxBMt7O2=FCt^J~sv7J;3y;W$VXTya{h+ zeIEq?yfgW2VQ0&yJIWz{LEO`V2mjUS?v^aP2P9(xk}(0vn1E#S1pJ?;(_31Um+Eg| z7MbdAqm-KJZ^j&C;uOlnb2t;_1poj5000000000002%-Q0B-XOf02hk^To6g00000 LNkvXXu0mjfBfP>M diff --git a/tests/snapshots/nanosp/test_sign_tx_confirm/00002.png b/tests/snapshots/nanosp/test_sign_tx_confirm/00002.png index cc3d151dfdcadd1c20874bf522d917db45ba42ac..4668646d53df70e2628c6853fd15411d9d3c9b46 100644 GIT binary patch delta 476 zcmV<20VDo~1oi`vB!9h0L_t(|obB0LZp0uAK+&}7PT2pF*h@d6B4lIYfFbGVp073o z#=~n8avT5v0Kj%%QGs&K;z~*>D)_K7tKm$V)hA=Fm2=i3@nH$XHt`b`s43^1QYurX z&b!Q@x=gvQOE&8st(A9FlT^%B(Tdf&j?-yt(sy`7L3G?nTz@}%LDwyXt-7Uy>Q6;Q zk%_N`LEkuGTk>6Dzj;S-_459xHa z`|eOXEm@t|Jbww$C8GwwIXPzHM}>_%3lb-bw@NmjjGBj(*14&5z}d;66Q>zgS1%1M zI;v~S6_LL5=^*SXx%gg%L+3o`?!2ewSl4tjluyc}bOFL!@5<7VLo_hUS zC6}f#VB4{4%m9czx|6-X%-35#F;octg|7{H|kY? z$$tIW%uc5Fw`p`Wy}ub_@FaGjCtY+hW3Uw63jhEB000000000000000Eb|Kj^0000dd5i&Ly^Ql_hGt9FM z4+u#}2><{9xb9woVkw7DhN$}Iy_|0)ti zPyDTS(ln_FKO`<3-t9Nx;Uoe%&300FMkQ0u59HQ$q+m%M(Y`hJ<3lZ?(q zwIQ|V&YFR+)PEd#sXd(2dGi&o+v1337^&upI>S=VUjsE)!mRGK;vZuEvy?W{zbLFj zx|J?X)r^Jtxenv3Q(R}RKT@@(3}qW~*7WDDkQ1Q(H|I9GzKM$~ zZ_}czdePsdshTTITm9)}an^c)ImnFuHOf#k`j;^WzlmMwHw^}vIXH^p1poj500000 i0000000000j`;@Fv)->{(Iwje0000f}gwgUQ-2X^(7ayjiQY0iD{#Muio|MUu zOn?CGmZcCv2qAhYq~Z@=9goG z)E|)P@D@3>0%XDM8oSAb)YfJ*Iw@*{&~L*$0!SCK@#g;gRjk*;)7O;m=U>?s2qA?0 zFZ}QyBWEvp#((eZ!)vO%H0a*Cx3r}n+vxIv#1OjEZ|O$UCIP5uj?CV_YDve}ByhDZ zj4kU3@vqq2}TD{D1iYm|HjghPfVtnc1Rd!1^*e zC`Tjgs#^DB*pmICSAcv+mrGqq*Fknpq(z2=m^sHsBuL$e^c)Nc^`;99lg#X2!$>u= ze;JO!Ct(%(Bteon21n89h1AgEUVM<2)(HN9$3L!(qVl_Pj*?E;W=P2GZ?g=Q()>mu zfhi=I#(ybgahHl07PFz-hZ02X$I0*i;hl9%IV6%F$|IrLI@#* zNCGwVC8af*mZmn~OBbmV@aT}9RaG4u#4L4KM*+3Q6)DjXES(mle^69NiLZ`LD(siZ zn=r1HfKuW#qyBX}GM7{H-M0aO#5ldaM!yv6!g4A@*-?U0mB)!$UZKP9GOO-1kQ|Nt zsBb7GCF&0Ge_WgXZ1cr1r~Z(H9>XPaP>egRZjSnQ{31h$+l1jEX2<`ph*UIN`oADy zhTwi@_JGl**Pe#Kb(SfCb0wi&*#3byjJ7qJvF$vG5<&U3XUh*+Y2Z3EK40J1#I$tBk zfO#2Hb9GA*LI@#*5aOG-uIsuk{wrX=%OBibTXOxutGQf56LIi-fC<@Ii;qncz! z=kZX2Gj}&NelUG7og_UEqs6HO$eohJMl1fMon!O??0*SRi{zjjJxh8Fulum#d4B@N zw#Go&+N48`NtlUZ8+=cgVG8_^;0=fA&bwWLrIOzC0PZAf_8-HTYR&$`Xbs*(QRq#A zN!A)1Wt`qv4Q0|ktUmH8rdiT{<^ADF=o?m8!$FlMv+T@F_x5Jze>?C>z`03Cq@HnS zxkbX98h;cXCRTPm-h2u3Tf=<6y#8#y+4&OYyDY>5(hC|Z@*LyXY!_3`bnOH87|+=S z@T5MVPZsvkqjvbGmoeLSx3idvD0fGtC)Pt z>q-O*a5_q!Q#Wz@pkHz&cKtSxPeZ{k>0ufg24#?j&X$<%o8?|U+Brj-6=(K@5JCtc bgm|CduP0i=?|9U200000NkvXXu0mjfeAB1X diff --git a/tests/snapshots/nanosp/test_sign_tx_transfer/00004.png b/tests/snapshots/nanosp/test_sign_tx_transfer/00004.png index de482ce9030dc045f9746bdfca8f23a8232aa454..bf2a3759c3164d526955f4c523a1a9501da0f447 100644 GIT binary patch delta 480 zcmV<60U!Q`1o{JzB!9t4L_t(|obB0La)lrafMMF{PT2pF+)E$YahO0t#Kfb{|2?&c zfZ?jA6aWAK;5D{w+qTVr$;cno9#NOwhCWYH^S(0*Z670}{G<9f)>_M`d2M>1C*yH` z!b>y^A7D5VYpq%o{3%1)CFkwo;%9&esF)4n*@lTl8MDJci+_9j6s?M*v`KSP)(jBM zb&mbD658N8!!5EM8XU1w_JESGsn$lB1>LUN)3D2Suiy^Y+ube&e`|W5*)zE8)qJ}C z_)A`H;YnYy#o24ZaHG??zp1=jNC$+p1OR}4!N<^@ zcJ`mXyS8r1_rhk5OZu#IK>Av9mC& z+CDRGAI_xxwd+tLA4&U+uKf}s{&h|u?H1?k8P?kt)u%kh@Hw>zdX^wNzIOTAC4V`2 z9gy`kG?uY*I&Uw{EVKqNgIeE|G1m z!G}!3d#kzmR%(!m{$&QCCi)kn4?c-i=#wTvrVmmPUH||9000000000000000Ak8nt Whw!{vzu52q0000o#MH?y!geb!90IDc1{c$c`#dubl3dILnb z$-ckV!kpY>x<$2Honx<(IiM9xs(sR~k{(|=6WFoYYx4tm#XS!Ne`C6?oatQgXnr~V zCNhV01s7d zMJy=oN5LkjK6J82AKH%AZ>#wU>YaEuBl#`4e9M{f@D047!22B|7=p}yGmXzOvBedV z8+n;AFr(xRxYe_sH@mZ1wj{sb2?4(Hp#8aK&g{}?0HWdAUp!8 Date: Thu, 13 Feb 2025 20:37:52 +0100 Subject: [PATCH 11/67] test: update sign message test payload and signature --- .../nanosp/test_sign_message/00001.png | Bin 499 -> 487 bytes tests/test_sign_message_cmd.py | 7 ++++--- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/tests/snapshots/nanosp/test_sign_message/00001.png b/tests/snapshots/nanosp/test_sign_message/00001.png index 0e9571e809f05f6a3ae4ee0b705318d5ec455726..35838d9c37a584b925b90214d8dc68ffcdc03d96 100644 GIT binary patch delta 461 zcmV;;0W$vc1Lp&fB!8|+L_t(|obA|Aa)lraKvCLxJ8}O@axeXG9>YM0P$FUQp0Ao# zzyv800ssI2Fx`(~TjzORKODzVi?}<_Gabw|!dgUpBHL&AHEe5rF`?pRlx9DxgmTya zd<@%)u4y6;G!2%|)*cB`B9uSYN1_bxX;a^TIH$x+We=Q2j(@LEBrg3My^CzMDSK=o zj$y~8;zCr;^fYnT#4J-;tAv;!t9;om_oAnk zpxeA>zf#s8UA9tn4pV5YF=%Dp5){6ZU76HMq&69|*2FHd-o=F0-mM@lhU@IA-DD+E zDx};s-tV|~eSZg-%v{^)Z}}xWS#3WG0I;ENHl|%}6X{bnH}f*9#|9BmbsHM*PaB$W z8KnKp9+7TdZ$K@$MU?q?hbZP)#z~pGHVE*`JIWcw!au z#Q$MWed&GfQ1H!>R_RF@5vxeI@@69AkrYP}&M1I03P#|J0yv`p00013%xdR|dqi5T zc8<75q}yuehrrB!9X|L_t(|obA|Al7k=&fMIrLZ{q!r#9j8mDZ@aBP$HrB|DI}E z0TZN32mk;8z;Zu^ZN(VR565w|BJN_0`C!fwwj$yc*1`XL4AYXjMg{YqCdE(BAS*Nm92{A!d`LbQ^MRzSh zmw7L~Qq~_`u~H2VQ)sO-Xl30J6kd~Enbb<8H5rT6#4d{7#e}x*tspIi`#e>;kyfDQd&W7*+jB4g_279U=IC~CHOMAUo?P3Pwg zEja8{KlAJ#8MgBsARc~1r0`uYVjH3W&M1JhvH(+$O-AZ%OMN5rgIuI{hwMLIGs$Fs z86nkVe=%y{iB-rG|HGcf()-?q9}zv$E8i(2Vig%ypHfU@K9XZA!Wji{Mgg2r0A~~c z0001+*=-;38IfMQ?IS)TGHkbf#Aifuya_v_0M00YGYa600ssI20N>{y2pcLCx1eyw P00000NkvXXu0mjf;#AYP diff --git a/tests/test_sign_message_cmd.py b/tests/test_sign_message_cmd.py index 0b07bfe..7910426 100644 --- a/tests/test_sign_message_cmd.py +++ b/tests/test_sign_message_cmd.py @@ -28,8 +28,9 @@ def test_sign_message(backend: BackendInterface, navigator: Navigator, default_s rapdu = client.get_public_key(account_number=account_number) # Message to sign - payload = bytes.fromhex("00000000001111111111111111111111111111111111111111111111111111111111111111") - + message_hash = "1111111111111111111111111111111111111111111111111111111111111111" + message_bytes = bytes.fromhex(message_hash) + payload = account_number.to_bytes(4, byteorder='big') + message_bytes # Send the sign device instruction. # As it requires on-screen validation, the function is asynchronous. # It will yield the result when the navigation is done @@ -46,4 +47,4 @@ def test_sign_message(backend: BackendInterface, navigator: Navigator, default_s # The device as yielded the result, parse it and ensure that the signature is correct response = client.get_async_response().data _, der_sig, _ = unpack_sign_tx_response(response) - assert der_sig.hex() == "d2edfcb178abad8df455f605d2887e6fed24ed1d2462e1fc216fad55f2e60fa372239ce950b7ab944a2eb80a2bcfaadfa02f870c6b3ed6df29fa9bc7419a730f" \ No newline at end of file + assert der_sig.hex() == "d4883fb9095f3610dfc0888917c8b5548c7074f0f010966c94a5c405ccabe8d320c90334786dbf2b34f10e75c5370ae151b0b11cb190a16d7509983964d6dd00" \ No newline at end of file From 12a8ce58866ec6f684252aa3127421372e6effff Mon Sep 17 00:00:00 2001 From: keiff3r Date: Thu, 13 Feb 2025 20:45:32 +0100 Subject: [PATCH 12/67] ops: exclude lock files from misspellings check --- .github/workflows/misspellings_checks.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/misspellings_checks.yml b/.github/workflows/misspellings_checks.yml index f38799e..5bbdb91 100644 --- a/.github/workflows/misspellings_checks.yml +++ b/.github/workflows/misspellings_checks.yml @@ -26,3 +26,4 @@ jobs: with: builtin: clear,rare check_filenames: true + skip: "*.lock" From 278984f23369f41d8b9b0b09807e17cfdf775ab0 Mon Sep 17 00:00:00 2001 From: keiff3r Date: Thu, 13 Feb 2025 20:46:22 +0100 Subject: [PATCH 13/67] fix: correct typos --- Makefile | 2 +- client/src/main.rs | 4 ++-- old-tests/speculos/ledger_client/utils.py | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Makefile b/Makefile index 58c5e2e..dd52698 100644 --- a/Makefile +++ b/Makefile @@ -42,7 +42,7 @@ APPVERSION_P = 10 APPVERSION = "$(APPVERSION_M).$(APPVERSION_N).$(APPVERSION_P)" ########################### -# Set Chain environnement # +# Set Chain environment # ########################### ifeq ($(CHAIN),) diff --git a/client/src/main.rs b/client/src/main.rs index 38d9ac3..b4318de 100644 --- a/client/src/main.rs +++ b/client/src/main.rs @@ -459,14 +459,14 @@ fn prepare_multisig_wallet_deploy( fn prepare_token_body( tokens: BigUint, owner: &MsgAddressInt, - destiantion: &MsgAddressInt, + destination: &MsgAddressInt, ) -> anyhow::Result { let payload: ton_types::Cell = Default::default(); let (function_token, input_token) = MessageBuilder::new(tip3_1::token_wallet_contract::transfer()) .arg(BigUint128(tokens)) // amount - .arg(destiantion) // recipient owner wallet + .arg(destination) // recipient owner wallet .arg(BigUint128(INITIAL_BALANCE.into())) // deployWalletValue .arg(owner) // remainingGasTo .arg(false) // notify diff --git a/old-tests/speculos/ledger_client/utils.py b/old-tests/speculos/ledger_client/utils.py index aa7bd96..7cef3dd 100644 --- a/old-tests/speculos/ledger_client/utils.py +++ b/old-tests/speculos/ledger_client/utils.py @@ -98,7 +98,7 @@ def read(buf: BytesIO, size: int) -> bytes: b: bytes = buf.read(size) if len(b) < size: - raise ValueError(f"Cant read {size} bytes in buffer!") + raise ValueError(f"Can't read {size} bytes in buffer!") return b From 7216654d3af784448c4ca46326ec4259367a569b Mon Sep 17 00:00:00 2001 From: keiff3r Date: Thu, 13 Feb 2025 20:49:25 +0100 Subject: [PATCH 14/67] style: format the C codebase - Use clang-format to format all .c and .h files --- fuzz/fuzzer.c | 26 ++-- fuzz/os_mocks.c | 6 +- src/cell.c | 23 ++-- src/contract.c | 239 ++++++++++++++++-------------------- src/get_address.c | 81 ++++++------ src/get_app_configuration.c | 7 +- src/get_public_key.c | 66 +++++----- src/hashmap_label.c | 14 ++- src/main.c | 121 ++++++++++-------- src/menu.c | 50 ++++---- src/message.c | 110 ++++++++++++----- src/sign.c | 100 ++++++++------- src/sign_transaction.c | 215 ++++++++++++++++---------------- src/slice_data.c | 5 +- src/utils.c | 44 +++---- 15 files changed, 582 insertions(+), 525 deletions(-) diff --git a/fuzz/fuzzer.c b/fuzz/fuzzer.c index a872a4b..e69fa65 100644 --- a/fuzz/fuzzer.c +++ b/fuzz/fuzzer.c @@ -22,15 +22,14 @@ BocContext_t boc_context; DataContext_t data_context; -void hex_to_bytes(const char* hex, uint8_t* bytes) -{ +void hex_to_bytes(const char* hex, uint8_t* bytes) { size_t len = strlen(hex); size_t final_len = len / 2; - for (size_t i=0, j=0; j> 5; // level - uint8_t hashes = (d1 & 16) == 16; // with hashes - uint8_t exotic = (d1 & 8) == 8; // exotic - uint8_t rc = d1 & 7; // refs count + uint8_t level = d1 >> 5; // level + uint8_t hashes = (d1 & 16) == 16; // with hashes + uint8_t exotic = (d1 & 8) == 8; // exotic + uint8_t rc = d1 & 7; // refs count uint8_t absent = rc == 7 && hashes; uint8_t pruned = d1 == PRUNED_BRANCH_D1; UNUSED(level); VALIDATE(!hashes, ERR_INVALID_CELL); - VALIDATE(!exotic || pruned, ERR_INVALID_CELL); // only ordinary or pruned cells are valid + VALIDATE(!exotic || pruned, ERR_INVALID_CELL); // only ordinary or pruned cells are valid VALIDATE(rc <= MAX_REFERENCES_COUNT, ERR_INVALID_CELL); VALIDATE(!absent, ERR_INVALID_CELL); @@ -89,7 +91,7 @@ uint16_t deserialize_cell(struct Cell_t* cell, const uint8_t cell_index, const u VALIDATE(ref <= cells_count && ref > cell_index, ERR_INVALID_CELL); } - return CELL_DATA_OFFSET + data_size + refs_count; // cell size + return CELL_DATA_OFFSET + data_size + refs_count; // cell size } void calc_cell_hash(Cell_t* cell, const uint8_t cell_index) { @@ -108,7 +110,7 @@ void calc_cell_hash(Cell_t* cell, const uint8_t cell_index) { return; } - uint8_t hash_buffer[266]; // d1(1) + d2(1) + data(128) + 4 * (depth(2) + hash(32)) + uint8_t hash_buffer[266]; // d1(1) + d2(1) + data(128) + 4 * (depth(2) + hash(32)) uint16_t hash_buffer_offset = 0; hash_buffer[0] = d1 & 0b00011111; @@ -143,6 +145,9 @@ void calc_cell_hash(Cell_t* cell, const uint8_t cell_index) { hash_buffer_offset += HASH_SIZE; } - int result = cx_hash_sha256(hash_buffer, hash_buffer_offset, bc->hashes + cell_index * HASH_SIZE, HASH_SIZE); + int result = cx_hash_sha256(hash_buffer, + hash_buffer_offset, + bc->hashes + cell_index * HASH_SIZE, + HASH_SIZE); VALIDATE(result == HASH_SIZE, ERR_INVALID_HASH); } diff --git a/src/contract.c b/src/contract.c index 45b353e..e4434e2 100644 --- a/src/contract.c +++ b/src/contract.c @@ -7,117 +7,87 @@ #include "hashmap_label.h" // Wallets code -const uint8_t safe_multisig_wallet[] = { 0x01, 0x02, 0x49, 0x01, - 0x00, 0x10, 0xF4, 0x00, 0x02, 0x01, 0x34, 0x06, - 0x01, 0x01, 0x01, 0xC0, 0x02, 0x02, 0x03, 0xCF, - 0x20, 0x05, 0x03, 0x01, 0x01, 0xDE, 0x04, 0x00, - 0x03, 0xD0, 0x20, 0x00, 0x41, 0xD8, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x04 }; - -const uint8_t safe_multisig_wallet_24h[] = { 0x01, 0x02, 0x49, 0x01, - 0x00, 0x10, 0xF7, 0x00, 0x02, 0x01, 0x34, 0x06, - 0x01, 0x01, 0x01, 0xC0, 0x02, 0x02, 0x03, 0xCF, - 0x20, 0x05, 0x03, 0x01, 0x01, 0xDE, 0x04, 0x00, - 0x03, 0xD0, 0x20, 0x00, 0x41, 0xD8, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x04 }; - -const uint8_t setcode_multisig_wallet[] = { 0x01, 0x02, 0x65, 0x01, - 0x00, 0x1A, 0x04, 0x00, 0x02, 0x01, 0x34, 0x06, - 0x01, 0x01, 0x01, 0xC0, 0x02, 0x02, 0x03, 0xCF, - 0x20, 0x05, 0x03, 0x01, 0x01, 0xDE, 0x04, 0x00, - 0x03, 0xD0, 0x20, 0x00, 0x41, 0xD8, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x04 }; - -const uint8_t bridge_multisig_wallet[] = { 0x01, 0x02, 0x45, 0x01, - 0x00, 0x11, 0x04, 0x00, 0x02, 0x01, 0x34, 0x03, - 0x01, 0x01, 0x01, 0xC0, 0x02, 0x00, 0x43, 0xD0, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x20 }; - -const uint8_t multisig_2_wallet[] = { 0x01, 0x02, 0x56, 0x01, - 0x00, 0x0F, 0xDD, 0x00, 0x02, 0x01, 0x34, 0x03, - 0x01, 0x01, 0x01, 0xC0, 0x02, 0x00, 0x43, 0xD0, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x20 }; - -const uint8_t multisig_2_1_wallet[] = { 0x01, 0x02, 0x4D, 0x01, - 0x00, 0x10, 0xB2, 0x00, 0x02, 0x01, 0x34, 0x03, - 0x01, 0x01, 0x01, 0xC0, 0x02, 0x00, 0x43, 0xD0, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x20 }; - -const uint8_t surf_wallet[] = { 0x01, 0x02, 0x4D, 0x01, - 0x00, 0x12, 0xB4, 0x00, 0x02, 0x01, 0x34, 0x03, - 0x01, 0x01, 0x01, 0xC0, 0x02, 0x00, 0x43, 0xD0, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x20 }; +const uint8_t safe_multisig_wallet[] = { + 0x01, 0x02, 0x49, 0x01, 0x00, 0x10, 0xF4, 0x00, 0x02, 0x01, 0x34, 0x06, 0x01, 0x01, + 0x01, 0xC0, 0x02, 0x02, 0x03, 0xCF, 0x20, 0x05, 0x03, 0x01, 0x01, 0xDE, 0x04, 0x00, + 0x03, 0xD0, 0x20, 0x00, 0x41, 0xD8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04}; + +const uint8_t safe_multisig_wallet_24h[] = { + 0x01, 0x02, 0x49, 0x01, 0x00, 0x10, 0xF7, 0x00, 0x02, 0x01, 0x34, 0x06, 0x01, 0x01, + 0x01, 0xC0, 0x02, 0x02, 0x03, 0xCF, 0x20, 0x05, 0x03, 0x01, 0x01, 0xDE, 0x04, 0x00, + 0x03, 0xD0, 0x20, 0x00, 0x41, 0xD8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04}; + +const uint8_t setcode_multisig_wallet[] = { + 0x01, 0x02, 0x65, 0x01, 0x00, 0x1A, 0x04, 0x00, 0x02, 0x01, 0x34, 0x06, 0x01, 0x01, + 0x01, 0xC0, 0x02, 0x02, 0x03, 0xCF, 0x20, 0x05, 0x03, 0x01, 0x01, 0xDE, 0x04, 0x00, + 0x03, 0xD0, 0x20, 0x00, 0x41, 0xD8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04}; + +const uint8_t bridge_multisig_wallet[] = { + 0x01, 0x02, 0x45, 0x01, 0x00, 0x11, 0x04, 0x00, 0x02, 0x01, 0x34, 0x03, 0x01, 0x01, + 0x01, 0xC0, 0x02, 0x00, 0x43, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20}; + +const uint8_t multisig_2_wallet[] = { + 0x01, 0x02, 0x56, 0x01, 0x00, 0x0F, 0xDD, 0x00, 0x02, 0x01, 0x34, 0x03, 0x01, 0x01, + 0x01, 0xC0, 0x02, 0x00, 0x43, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20}; + +const uint8_t multisig_2_1_wallet[] = { + 0x01, 0x02, 0x4D, 0x01, 0x00, 0x10, 0xB2, 0x00, 0x02, 0x01, 0x34, 0x03, 0x01, 0x01, + 0x01, 0xC0, 0x02, 0x00, 0x43, 0xD0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20}; + +const uint8_t surf_wallet[] = {0x01, 0x02, 0x4D, 0x01, 0x00, 0x12, 0xB4, 0x00, 0x02, 0x01, 0x34, + 0x03, 0x01, 0x01, 0x01, 0xC0, 0x02, 0x00, 0x43, 0xD0, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20}; // Wallets code hash -const uint8_t wallet_v3_code_hash[] = { 0x84, 0xDA, 0xFA, 0x44, 0x9F, 0x98, 0xA6, 0x98, - 0x77, 0x89, 0xBA, 0x23, 0x23, 0x58, 0x07, 0x2B, - 0xC0, 0xF7, 0x6D, 0xC4, 0x52, 0x40, 0x02, 0xA5, - 0xD0, 0x91, 0x8B, 0x9A, 0x75, 0xD2, 0xD5, 0x99 }; - -const uint8_t ever_wallet_code_hash[] = { 0x3B, 0xA6, 0x52, 0x8A, 0xB2, 0x69, 0x4C, 0x11, - 0x81, 0x80, 0xAA, 0x3B, 0xD1, 0x0D, 0xD1, 0x9F, - 0xF4, 0x00, 0xB9, 0x09, 0xAB, 0x4D, 0xCF, 0x58, - 0xFC, 0x69, 0x92, 0x5B, 0x2C, 0x7B, 0x12, 0xA6 }; - -const uint8_t safe_multisig_wallet_code_hash[] = { 0x80, 0xd6, 0xc4, 0x7c, 0x4a, 0x25, 0x54, 0x3c, - 0x9b, 0x39, 0x7b, 0x71, 0x71, 0x6f, 0x3f, 0xae, - 0x1e, 0x2c, 0x5d, 0x24, 0x71, 0x74, 0xc5, 0x2e, - 0x2c, 0x19, 0xbd, 0x89, 0x64, 0x42, 0xb1, 0x05 }; - -const uint8_t safe_multisig_wallet_24h_code_hash[] = { 0x7d, 0x09, 0x96, 0x94, 0x34, 0x06, 0xf7, 0xd6, - 0x2a, 0x4f, 0xf2, 0x91, 0xb1, 0x22, 0x8b, 0xf0, - 0x6e, 0xbd, 0x3e, 0x04, 0x8b, 0x58, 0x43, 0x6c, - 0x5b, 0x70, 0xfb, 0x77, 0xff, 0x8b, 0x4b, 0xf2 }; - -const uint8_t setcode_multisig_wallet_code_hash[] = { 0xe2, 0xb6, 0x0b, 0x6b, 0x60, 0x2c, 0x10, 0xce, - 0xd7, 0xea, 0x8e, 0xde, 0x4b, 0xdf, 0x96, 0x34, - 0x2c, 0x97, 0x57, 0x0a, 0x37, 0x98, 0x06, 0x6f, - 0x3f, 0xb5, 0x0a, 0x4b, 0x2b, 0x27, 0xa2, 0x08 }; - -const uint8_t bridge_multisig_wallet_code_hash[] = { 0xF3, 0xA0, 0x7A, 0xE8, 0x4F, 0xC3, 0x43, 0x25, - 0x9D, 0x7F, 0xA4, 0x84, 0x7B, 0x86, 0x33, 0x5B, - 0x3F, 0xDC, 0xFC, 0x8B, 0x31, 0xF1, 0xBA, 0x4B, - 0x7A, 0x94, 0x99, 0xD5, 0x53, 0x0F, 0x0B, 0x18 }; - -const uint8_t multisig_2_wallet_code_hash[] = { 0x29, 0xb2, 0x47, 0x76, 0xb3, 0xdf, 0x6a, 0x05, - 0xc5, 0xa1, 0xb8, 0xd8, 0xfd, 0x75, 0xcb, 0x72, - 0xa1, 0xd3, 0x3c, 0x0a, 0x44, 0x38, 0x53, 0x32, - 0xa8, 0xbf, 0xc2, 0x72, 0x7f, 0xb6, 0x65, 0x90 }; - -const uint8_t multisig_2_1_wallet_code_hash[] = { 0xd6, 0x6d, 0x19, 0x87, 0x66, 0xab, 0xdb, 0xe1, - 0x25, 0x3f, 0x34, 0x15, 0x82, 0x6c, 0x94, 0x6c, - 0x37, 0x1f, 0x51, 0x12, 0x55, 0x24, 0x08, 0x62, - 0x5a, 0xeb, 0x0b, 0x31, 0xe0, 0xef, 0x2d, 0xf3, }; - - -const uint8_t surf_wallet_code_hash[] = { 0x20, 0x7d, 0xc5, 0x60, 0xc5, 0x95, 0x6d, 0xe1, - 0xa2, 0xc1, 0x47, 0x93, 0x56, 0xf8, 0xf3, 0xee, - 0x70, 0xa5, 0x97, 0x67, 0xdb, 0x2b, 0xf4, 0x78, - 0x8b, 0x1d, 0x61, 0xad, 0x42, 0xcd, 0xad, 0x82 }; +const uint8_t wallet_v3_code_hash[] = { + 0x84, 0xDA, 0xFA, 0x44, 0x9F, 0x98, 0xA6, 0x98, 0x77, 0x89, 0xBA, 0x23, 0x23, 0x58, 0x07, 0x2B, + 0xC0, 0xF7, 0x6D, 0xC4, 0x52, 0x40, 0x02, 0xA5, 0xD0, 0x91, 0x8B, 0x9A, 0x75, 0xD2, 0xD5, 0x99}; + +const uint8_t ever_wallet_code_hash[] = { + 0x3B, 0xA6, 0x52, 0x8A, 0xB2, 0x69, 0x4C, 0x11, 0x81, 0x80, 0xAA, 0x3B, 0xD1, 0x0D, 0xD1, 0x9F, + 0xF4, 0x00, 0xB9, 0x09, 0xAB, 0x4D, 0xCF, 0x58, 0xFC, 0x69, 0x92, 0x5B, 0x2C, 0x7B, 0x12, 0xA6}; + +const uint8_t safe_multisig_wallet_code_hash[] = { + 0x80, 0xd6, 0xc4, 0x7c, 0x4a, 0x25, 0x54, 0x3c, 0x9b, 0x39, 0x7b, 0x71, 0x71, 0x6f, 0x3f, 0xae, + 0x1e, 0x2c, 0x5d, 0x24, 0x71, 0x74, 0xc5, 0x2e, 0x2c, 0x19, 0xbd, 0x89, 0x64, 0x42, 0xb1, 0x05}; + +const uint8_t safe_multisig_wallet_24h_code_hash[] = { + 0x7d, 0x09, 0x96, 0x94, 0x34, 0x06, 0xf7, 0xd6, 0x2a, 0x4f, 0xf2, 0x91, 0xb1, 0x22, 0x8b, 0xf0, + 0x6e, 0xbd, 0x3e, 0x04, 0x8b, 0x58, 0x43, 0x6c, 0x5b, 0x70, 0xfb, 0x77, 0xff, 0x8b, 0x4b, 0xf2}; + +const uint8_t setcode_multisig_wallet_code_hash[] = { + 0xe2, 0xb6, 0x0b, 0x6b, 0x60, 0x2c, 0x10, 0xce, 0xd7, 0xea, 0x8e, 0xde, 0x4b, 0xdf, 0x96, 0x34, + 0x2c, 0x97, 0x57, 0x0a, 0x37, 0x98, 0x06, 0x6f, 0x3f, 0xb5, 0x0a, 0x4b, 0x2b, 0x27, 0xa2, 0x08}; + +const uint8_t bridge_multisig_wallet_code_hash[] = { + 0xF3, 0xA0, 0x7A, 0xE8, 0x4F, 0xC3, 0x43, 0x25, 0x9D, 0x7F, 0xA4, 0x84, 0x7B, 0x86, 0x33, 0x5B, + 0x3F, 0xDC, 0xFC, 0x8B, 0x31, 0xF1, 0xBA, 0x4B, 0x7A, 0x94, 0x99, 0xD5, 0x53, 0x0F, 0x0B, 0x18}; + +const uint8_t multisig_2_wallet_code_hash[] = { + 0x29, 0xb2, 0x47, 0x76, 0xb3, 0xdf, 0x6a, 0x05, 0xc5, 0xa1, 0xb8, 0xd8, 0xfd, 0x75, 0xcb, 0x72, + 0xa1, 0xd3, 0x3c, 0x0a, 0x44, 0x38, 0x53, 0x32, 0xa8, 0xbf, 0xc2, 0x72, 0x7f, 0xb6, 0x65, 0x90}; + +const uint8_t multisig_2_1_wallet_code_hash[] = { + 0xd6, 0x6d, 0x19, 0x87, 0x66, 0xab, 0xdb, 0xe1, 0x25, 0x3f, 0x34, 0x15, 0x82, 0x6c, 0x94, 0x6c, + 0x37, 0x1f, 0x51, 0x12, 0x55, 0x24, 0x08, 0x62, 0x5a, 0xeb, 0x0b, 0x31, 0xe0, 0xef, 0x2d, 0xf3, +}; + +const uint8_t surf_wallet_code_hash[] = { + 0x20, 0x7d, 0xc5, 0x60, 0xc5, 0x95, 0x6d, 0xe1, 0xa2, 0xc1, 0x47, 0x93, 0x56, 0xf8, 0xf3, 0xee, + 0x70, 0xa5, 0x97, 0x67, 0xdb, 0x2b, 0xf4, 0x78, 0x8b, 0x1d, 0x61, 0xad, 0x42, 0xcd, 0xad, 0x82}; // Cell depths const uint32_t safe_multisig_wallet_cell_depth = 0x0C; @@ -139,7 +109,7 @@ void deserialize_cells_tree(struct ByteStream_t* src) { VALIDATE(!index_included && !has_crc && !has_cache_bits, ERR_INVALID_CONTRACT); } - uint8_t ref_size = first_byte & 0x7; // size in bytes + uint8_t ref_size = first_byte & 0x7; // size in bytes VALIDATE(ref_size == 1, ERR_INVALID_CONTRACT); uint8_t offset_size = ByteStream_read_byte(src); @@ -184,7 +154,7 @@ void deserialize_cells_tree(struct ByteStream_t* src) { void find_public_key_cell() { BocContext_t* bc = &boc_context; - VALIDATE(Cell_get_data(&bc->cells[0])[0] & 0x20, ERR_INVALID_CONTRACT); // has data branch + VALIDATE(Cell_get_data(&bc->cells[0])[0] & 0x20, ERR_INVALID_CONTRACT); // has data branch uint8_t refs_count = 0; uint8_t* refs = Cell_get_refs(&bc->cells[0], &refs_count); @@ -211,12 +181,12 @@ void compute_wallet_v3_address(uint32_t account_number, uint8_t* address) { // Compute data hash { - uint8_t hash_buffer[42]; // d1(1) + d2(1) + data(8) + pubkey(32) + uint8_t hash_buffer[42]; // d1(1) + d2(1) + data(8) + pubkey(32) uint16_t hash_buffer_offset = 0; - hash_buffer[0] = 0x00; // d1(1) - hash_buffer[1] = 0x50; // d2(1) + hash_buffer[0] = 0x00; // d1(1) + hash_buffer[1] = 0x50; // d2(1) hash_buffer_offset += 2; // Data @@ -237,11 +207,11 @@ void compute_wallet_v3_address(uint32_t account_number, uint8_t* address) { // Compute address { - uint8_t hash_buffer[71]; // d1(1) + d2(1) + data(5) + code_hash(32) + data_hash(32) + uint8_t hash_buffer[71]; // d1(1) + d2(1) + data(5) + code_hash(32) + data_hash(32) uint16_t hash_buffer_offset = 0; - hash_buffer[0] = 0x02; // d1(1) - hash_buffer[1] = 0x01; // d2(1) + hash_buffer[0] = 0x02; // d1(1) + hash_buffer[1] = 0x01; // d2(1) hash_buffer_offset += 2; // Data @@ -269,12 +239,12 @@ void compute_ever_wallet_address(uint32_t account_number, uint8_t* address) { // Compute data hash { - uint8_t hash_buffer[42]; // d1(1) + d2(1) + pubkey(32) + data(8) + uint8_t hash_buffer[42]; // d1(1) + d2(1) + pubkey(32) + data(8) uint16_t hash_buffer_offset = 0; - hash_buffer[0] = 0x00; // d1(1) - hash_buffer[1] = 0x50; // d2(1) + hash_buffer[0] = 0x00; // d1(1) + hash_buffer[1] = 0x50; // d2(1) hash_buffer_offset += 2; // Pubkey @@ -295,11 +265,11 @@ void compute_ever_wallet_address(uint32_t account_number, uint8_t* address) { // Compute address { - uint8_t hash_buffer[71]; // d1(1) + d2(1) + data(5) + code_hash(32) + data_hash(32) + uint8_t hash_buffer[71]; // d1(1) + d2(1) + data(5) + code_hash(32) + data_hash(32) uint16_t hash_buffer_offset = 0; - hash_buffer[0] = 0x02; // d1(1) - hash_buffer[1] = 0x01; // d2(1) + hash_buffer[0] = 0x02; // d1(1) + hash_buffer[1] = 0x01; // d2(1) hash_buffer_offset += 2; // Data @@ -310,7 +280,9 @@ void compute_ever_wallet_address(uint32_t account_number, uint8_t* address) { hash_buffer_offset += sizeof(uint32_t); // Code hash - memcpy(hash_buffer + hash_buffer_offset, ever_wallet_code_hash, sizeof(ever_wallet_code_hash)); + memcpy(hash_buffer + hash_buffer_offset, + ever_wallet_code_hash, + sizeof(ever_wallet_code_hash)); hash_buffer_offset += sizeof(ever_wallet_code_hash); // Data hash @@ -322,17 +294,22 @@ void compute_ever_wallet_address(uint32_t account_number, uint8_t* address) { } } -void compute_multisig_address(uint32_t account_number, const uint8_t* wallet, uint16_t wallet_size, const uint8_t* code_hash, uint32_t cell_depth, uint8_t* address) { +void compute_multisig_address(uint32_t account_number, + const uint8_t* wallet, + uint16_t wallet_size, + const uint8_t* code_hash, + uint32_t cell_depth, + uint8_t* address) { { ByteStream_t src; - ByteStream_init(&src, (uint8_t*)wallet, wallet_size); + ByteStream_init(&src, (uint8_t*) wallet, wallet_size); deserialize_cells_tree(&src); } BocContext_t* bc = &boc_context; VALIDATE(bc->cells_count != 0, ERR_INVALID_CONTRACT); - find_public_key_cell(); // sets public key cell index to boc_context + find_public_key_cell(); // sets public key cell index to boc_context // Set code hash memcpy(bc->hashes + (bc->public_key_cell_index + 1) * HASH_SIZE, code_hash, HASH_SIZE); @@ -341,7 +318,8 @@ void compute_multisig_address(uint32_t account_number, const uint8_t* wallet, ui VALIDATE(bc->public_key_cell_index && bc->public_key_label_size_bits, ERR_INVALID_CONTRACT); Cell_t* cell = &bc->cells[bc->public_key_cell_index]; uint8_t cell_data_size = Cell_get_data_size(cell); - VALIDATE(cell_data_size != 0 && cell_data_size <= MAX_PUBLIC_KEY_CELL_DATA_SIZE, ERR_INVALID_CONTRACT); + VALIDATE(cell_data_size != 0 && cell_data_size <= MAX_PUBLIC_KEY_CELL_DATA_SIZE, + ERR_INVALID_CONTRACT); uint8_t* cell_data = Cell_get_data(cell); memcpy(bc->public_key_cell_data, cell_data, cell_data_size); @@ -442,6 +420,7 @@ void get_address(const uint32_t account_number, uint8_t wallet_type, uint8_t* ad #else -void get_address(const uint32_t account_number, uint8_t wallet_type, uint8_t* address) {} +void get_address(const uint32_t account_number, uint8_t wallet_type, uint8_t* address) { +} #endif diff --git a/src/get_address.c b/src/get_address.c index cef6b3c..04b80cb 100644 --- a/src/get_address.c +++ b/src/get_address.c @@ -14,46 +14,46 @@ static uint8_t set_result_get_address() { return tx; } -UX_STEP_NOCB( - ux_display_address_flow_1_step, - pnn, - { - &C_icon_eye, - "Verify", - "address", - }); -UX_STEP_NOCB( - ux_display_address_flow_2_step, - bnnn_paging, - { - .title = "Address", - .text = data_context.addr_context.address_str, - }); -UX_STEP_CB( - ux_display_address_flow_3_step, - pb, - send_response(0, false), - { - &C_icon_crossmark, - "Reject", - }); -UX_STEP_CB( - ux_display_address_flow_4_step, - pb, - send_response(set_result_get_address(), true), - { - &C_icon_validate_14, - "Approve", - }); +UX_STEP_NOCB(ux_display_address_flow_1_step, + pnn, + { + &C_icon_eye, + "Verify", + "address", + }); +UX_STEP_NOCB(ux_display_address_flow_2_step, + bnnn_paging, + { + .title = "Address", + .text = data_context.addr_context.address_str, + }); +UX_STEP_CB(ux_display_address_flow_3_step, + pb, + send_response(0, false), + { + &C_icon_crossmark, + "Reject", + }); +UX_STEP_CB(ux_display_address_flow_4_step, + pb, + send_response(set_result_get_address(), true), + { + &C_icon_validate_14, + "Approve", + }); UX_FLOW(ux_display_address_flow, - &ux_display_address_flow_1_step, - &ux_display_address_flow_2_step, - &ux_display_address_flow_3_step, - &ux_display_address_flow_4_step -); + &ux_display_address_flow_1_step, + &ux_display_address_flow_2_step, + &ux_display_address_flow_3_step, + &ux_display_address_flow_4_step); -void handleGetAddress(uint8_t p1, uint8_t p2, uint8_t *dataBuffer, uint16_t dataLength, volatile unsigned int *flags, volatile unsigned int *tx) { +void handleGetAddress(uint8_t p1, + uint8_t p2, + uint8_t *dataBuffer, + uint16_t dataLength, + volatile unsigned int *flags, + volatile unsigned int *tx) { VALIDATE(p2 == 0 && dataLength == (sizeof(uint32_t) + sizeof(uint8_t)), ERR_INVALID_REQUEST); size_t offset = 0; @@ -70,8 +70,11 @@ void handleGetAddress(uint8_t p1, uint8_t p2, uint8_t *dataBuffer, uint16_t data THROW(SUCCESS); } if (p1 == P1_CONFIRM) { - AddressContext_t* context = &data_context.addr_context; - format_hex(context->address, sizeof(context->address), context->address_str, sizeof(context->address_str)); + AddressContext_t *context = &data_context.addr_context; + format_hex(context->address, + sizeof(context->address), + context->address_str, + sizeof(context->address_str)); ux_flow_init(0, ux_display_address_flow, NULL); *flags |= IO_ASYNCH_REPLY; return; diff --git a/src/get_app_configuration.c b/src/get_app_configuration.c index d45dd60..ef0c414 100644 --- a/src/get_app_configuration.c +++ b/src/get_app_configuration.c @@ -2,7 +2,12 @@ #include "utils.h" #include "errors.h" -void handleGetAppConfiguration(uint8_t p1, uint8_t p2, uint8_t *dataBuffer, uint16_t dataLength, volatile unsigned int *flags, volatile unsigned int *tx) { +void handleGetAppConfiguration(uint8_t p1, + uint8_t p2, + uint8_t *dataBuffer, + uint16_t dataLength, + volatile unsigned int *flags, + volatile unsigned int *tx) { UNUSED(dataBuffer); UNUSED(flags); VALIDATE(p1 == 0 && p2 == 0 && dataLength == 0, ERR_INVALID_REQUEST); diff --git a/src/get_public_key.c b/src/get_public_key.c index 1617136..4a03a3f 100644 --- a/src/get_public_key.c +++ b/src/get_public_key.c @@ -15,51 +15,55 @@ static uint8_t set_result_get_public_key() { #ifndef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION -UX_STEP_NOCB( - ux_display_public_flow_1_step, - bnnn_paging, - { - .title = "Public key", - .text = data_context.pk_context.public_key_str, - }); -UX_STEP_CB( - ux_display_public_flow_2_step, - pb, - send_response(0, false), - { - &C_icon_crossmark, - "Reject", - }); -UX_STEP_CB( - ux_display_public_flow_3_step, - pb, - send_response(set_result_get_public_key(), true), - { - &C_icon_validate_14, - "Approve", - }); +UX_STEP_NOCB(ux_display_public_flow_1_step, + bnnn_paging, + { + .title = "Public key", + .text = data_context.pk_context.public_key_str, + }); +UX_STEP_CB(ux_display_public_flow_2_step, + pb, + send_response(0, false), + { + &C_icon_crossmark, + "Reject", + }); +UX_STEP_CB(ux_display_public_flow_3_step, + pb, + send_response(set_result_get_public_key(), true), + { + &C_icon_validate_14, + "Approve", + }); UX_FLOW(ux_display_public_flow, - &ux_display_public_flow_1_step, - &ux_display_public_flow_2_step, - &ux_display_public_flow_3_step -); + &ux_display_public_flow_1_step, + &ux_display_public_flow_2_step, + &ux_display_public_flow_3_step); #endif -void handleGetPublicKey(uint8_t p1, uint8_t p2, uint8_t *dataBuffer, uint16_t dataLength, volatile unsigned int *flags, volatile unsigned int *tx) { +void handleGetPublicKey(uint8_t p1, + uint8_t p2, + uint8_t *dataBuffer, + uint16_t dataLength, + volatile unsigned int *flags, + volatile unsigned int *tx) { VALIDATE(p2 == 0 && dataLength == sizeof(uint32_t), ERR_INVALID_REQUEST); uint32_t account_number = readUint32BE(dataBuffer); - PublicKeyContext_t* context = &data_context.pk_context; + PublicKeyContext_t *context = &data_context.pk_context; get_public_key(account_number, context->public_key); if (p1 == P1_NON_CONFIRM) { *tx = set_result_get_public_key(); THROW(SUCCESS); - } + } if (p1 == P1_CONFIRM) { - format_hex(context->public_key, sizeof(context->public_key), context->public_key_str, sizeof(context->public_key_str)); + format_hex(context->public_key, + sizeof(context->public_key), + context->public_key_str, + sizeof(context->public_key_str)); #ifndef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION ux_flow_init(0, ux_display_public_flow, NULL); #endif diff --git a/src/hashmap_label.c b/src/hashmap_label.c index 84e5fe2..aaf85a5 100644 --- a/src/hashmap_label.c +++ b/src/hashmap_label.c @@ -10,15 +10,15 @@ uint8_t get_label_same(uint8_t max, struct SliceData_t* slice, struct SliceData_ VALIDATE(length <= 64, ERR_RANGE_CHECK); uint8_t length_bytes = length / 8 + (length % 8 ? 1 : 0); - SliceData_fill(label, value, length_bytes); + SliceData_fill(label, value, length_bytes); SliceData_truncate(label, length); return length >= max ? 0 : (max - length); } uint8_t get_label(uint8_t max, struct SliceData_t* slice, struct SliceData_t* label) { VALIDATE(SliceData_is_empty(slice) == false, ERR_SLICE_IS_EMPTY); - VALIDATE(SliceData_get_next_bit(slice) == 1, ERR_WRONG_LABEL); // label short - VALIDATE(SliceData_get_next_bit(slice) == 1, ERR_WRONG_LABEL); // label long + VALIDATE(SliceData_get_next_bit(slice) == 1, ERR_WRONG_LABEL); // label short + VALIDATE(SliceData_get_next_bit(slice) == 1, ERR_WRONG_LABEL); // label long return get_label_same(max, slice, label); } @@ -43,7 +43,7 @@ void put_to_node(uint8_t cell_index, uint16_t bit_len, struct SliceData_t* key) if (SliceData_equal(&label, key)) { uint8_t len = 16 - leading_zeros(bit_len); - uint8_t label_size_bits = 2 + 1 + len; // prefix + key bit + len + uint8_t label_size_bits = 2 + 1 + len; // prefix + key bit + len boc_context.public_key_label_size_bits = label_size_bits; boc_context.public_key_cell_index = cell_index; return; @@ -51,10 +51,12 @@ void put_to_node(uint8_t cell_index, uint16_t bit_len, struct SliceData_t* key) // common prefix { - uint8_t max_prefix_len = MIN(SliceData_remaining_bits(&label), SliceData_remaining_bits(key)); + uint8_t max_prefix_len = + MIN(SliceData_remaining_bits(&label), SliceData_remaining_bits(key)); VALIDATE(max_prefix_len <= 64, ERR_RANGE_CHECK); uint8_t i = 0; - while (i < max_prefix_len && SliceData_get_bits(&label, i, 1) == SliceData_get_bits(key, i, 1)) { + while (i < max_prefix_len && + SliceData_get_bits(&label, i, 1) == SliceData_get_bits(key, i, 1)) { i += 1; } diff --git a/src/main.c b/src/main.c index 040ca7f..26c0a03 100644 --- a/src/main.c +++ b/src/main.c @@ -1,19 +1,19 @@ /******************************************************************************* -* Ledger Free TON App -* (c) 2016 Ledger -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. -********************************************************************************/ + * Ledger Free TON App + * (c) 2016 Ledger + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + ********************************************************************************/ #include "utils.h" #include "menu.h" @@ -60,8 +60,12 @@ void handleApdu(volatile unsigned int *flags, volatile unsigned int *tx, int rx) THROW(0x6802); } - handleGetAppConfiguration(G_io_apdu_buffer[OFFSET_P1], G_io_apdu_buffer[OFFSET_P2], - G_io_apdu_buffer + OFFSET_CDATA, G_io_apdu_buffer[OFFSET_LC], flags, tx); + handleGetAppConfiguration(G_io_apdu_buffer[OFFSET_P1], + G_io_apdu_buffer[OFFSET_P2], + G_io_apdu_buffer + OFFSET_CDATA, + G_io_apdu_buffer[OFFSET_LC], + flags, + tx); } break; case INS_GET_PUBLIC_KEY: { @@ -71,7 +75,12 @@ void handleApdu(volatile unsigned int *flags, volatile unsigned int *tx, int rx) THROW(0x6985); } - handleGetPublicKey(G_io_apdu_buffer[OFFSET_P1], G_io_apdu_buffer[OFFSET_P2], G_io_apdu_buffer + OFFSET_CDATA, G_io_apdu_buffer[OFFSET_LC], flags, tx); + handleGetPublicKey(G_io_apdu_buffer[OFFSET_P1], + G_io_apdu_buffer[OFFSET_P2], + G_io_apdu_buffer + OFFSET_CDATA, + G_io_apdu_buffer[OFFSET_LC], + flags, + tx); } break; case INS_GET_ADDRESS: { @@ -81,11 +90,17 @@ void handleApdu(volatile unsigned int *flags, volatile unsigned int *tx, int rx) THROW(0x6985); } - handleGetAddress(G_io_apdu_buffer[OFFSET_P1], G_io_apdu_buffer[OFFSET_P2], G_io_apdu_buffer + OFFSET_CDATA, G_io_apdu_buffer[OFFSET_LC], flags, tx); + handleGetAddress(G_io_apdu_buffer[OFFSET_P1], + G_io_apdu_buffer[OFFSET_P2], + G_io_apdu_buffer + OFFSET_CDATA, + G_io_apdu_buffer[OFFSET_LC], + flags, + tx); } break; case INS_SIGN: { - if (G_io_apdu_buffer[OFFSET_P1] != P1_CONFIRM || G_io_apdu_buffer[OFFSET_P2] != 0) { + if (G_io_apdu_buffer[OFFSET_P1] != P1_CONFIRM || + G_io_apdu_buffer[OFFSET_P2] != 0) { THROW(0x6802); } @@ -124,7 +139,11 @@ void handleApdu(volatile unsigned int *flags, volatile unsigned int *tx, int rx) // than replaces, the current message buffer bool first_data_chunk = !(p2 & P2_EXTEND); - handleSignTransaction(G_io_apdu_buffer + OFFSET_CDATA, G_io_apdu_buffer[OFFSET_LC], flags, first_data_chunk, more); + handleSignTransaction(G_io_apdu_buffer + OFFSET_CDATA, + G_io_apdu_buffer[OFFSET_LC], + flags, + first_data_chunk, + more); } break; default: @@ -136,18 +155,18 @@ void handleApdu(volatile unsigned int *flags, volatile unsigned int *tx, int rx) THROW(EXCEPTION_IO_RESET); } CATCH_OTHER(e) { - switch (e & 0xF000) { - case 0x6000: - sw = e; - break; - case 0x9000: - // All is well - sw = e; - break; - default: - // Internal error - sw = 0x6800 | (e & 0x7FF); - break; + switch (e & 0xF000) { + case 0x6000: + sw = e; + break; + case 0x9000: + // All is well + sw = e; + break; + default: + // Internal error + sw = 0x6800 | (e & 0x7FF); + break; } // Unexpected exception => report G_io_apdu_buffer[*tx] = sw >> 8; @@ -181,8 +200,8 @@ void app_main(void) { BEGIN_TRY { TRY { rx = tx; - tx = 0; // ensure no race in catch_other if io_exchange throws - // an error + tx = 0; // ensure no race in catch_other if io_exchange throws + // an error rx = io_exchange(CHANNEL_APDU | flags, rx); flags = 0; @@ -197,7 +216,7 @@ void app_main(void) { handleApdu(&flags, &tx, rx); } CATCH(EXCEPTION_IO_RESET) { - THROW(EXCEPTION_IO_RESET); + THROW(EXCEPTION_IO_RESET); } CATCH_OTHER(e) { switch (e & 0xF000) { @@ -231,7 +250,7 @@ void app_main(void) { // override point, but nothing more to do void io_seproxyhal_display(const bagl_element_t *element) { - io_seproxyhal_display_default((bagl_element_t*)element); + io_seproxyhal_display_default((bagl_element_t *) element); } unsigned char io_event(unsigned char channel) { @@ -251,7 +270,9 @@ unsigned char io_event(unsigned char channel) { break; case SEPROXYHAL_TAG_STATUS_EVENT: - if (G_io_apdu_media == IO_APDU_MEDIA_USB_HID && !(U4BE(G_io_seproxyhal_spi_buffer, 3) & SEPROXYHAL_TAG_STATUS_EVENT_FLAG_USB_POWERED)) { + if (G_io_apdu_media == IO_APDU_MEDIA_USB_HID && + !(U4BE(G_io_seproxyhal_spi_buffer, 3) & + SEPROXYHAL_TAG_STATUS_EVENT_FLAG_USB_POWERED)) { THROW(EXCEPTION_IO_RESET); } // no break is intentional @@ -265,18 +286,17 @@ unsigned char io_event(unsigned char channel) { break; case SEPROXYHAL_TAG_TICKER_EVENT: - UX_TICKER_EVENT(G_io_seproxyhal_spi_buffer, - { + UX_TICKER_EVENT(G_io_seproxyhal_spi_buffer, { #ifndef TARGET_NANOX if (UX_ALLOWED) { if (ux_step_count) { - // prepare next screen - ux_step = (ux_step+1)%ux_step_count; - // redisplay screen - UX_REDISPLAY(); + // prepare next screen + ux_step = (ux_step + 1) % ux_step_count; + // redisplay screen + UX_REDISPLAY(); } } -#endif // TARGET_NANOX +#endif // TARGET_NANOX }); break; } @@ -290,7 +310,6 @@ unsigned char io_event(unsigned char channel) { return 1; } - unsigned short io_exchange_al(unsigned char channel, unsigned short tx_len) { switch (channel & ~(IO_FLAGS)) { case CHANNEL_KEYBOARD: @@ -304,11 +323,10 @@ unsigned short io_exchange_al(unsigned char channel, unsigned short tx_len) { if (channel & IO_RESET_AFTER_REPLIED) { reset(); } - return 0; // nothing received from the master so far (it's a tx - // transaction) + return 0; // nothing received from the master so far (it's a tx + // transaction) } else { - return io_seproxyhal_spi_recv(G_io_apdu_buffer, - sizeof(G_io_apdu_buffer), 0); + return io_seproxyhal_spi_recv(G_io_apdu_buffer, sizeof(G_io_apdu_buffer), 0); } default: @@ -332,7 +350,6 @@ void app_exit() { } void nv_app_state_init() { - } __attribute__((section(".boot"))) int main(void) { @@ -359,7 +376,7 @@ __attribute__((section(".boot"))) int main(void) { #ifdef HAVE_BLE BLE_power(0, NULL); BLE_power(1, "Nano X"); -#endif // HAVE_BLE +#endif // HAVE_BLE app_main(); } diff --git a/src/menu.c b/src/menu.c index 45d143f..29b5499 100644 --- a/src/menu.c +++ b/src/menu.c @@ -2,38 +2,30 @@ #include "os.h" ////////////////////////////////////////////////////////////////////// -UX_STEP_NOCB( - ux_idle_flow_1_step, - nn, - { - "Application", - "is ready", - }); -UX_STEP_NOCB( - ux_idle_flow_3_step, - bn, - { - "Version", - APPVERSION, - }); -UX_STEP_VALID( - ux_idle_flow_4_step, - pb, - os_sched_exit(-1), - { - &C_icon_dashboard_x, - "Quit", - }); -UX_FLOW(ux_idle_flow, - &ux_idle_flow_1_step, - &ux_idle_flow_3_step, - &ux_idle_flow_4_step, - FLOW_LOOP -); +UX_STEP_NOCB(ux_idle_flow_1_step, + nn, + { + "Application", + "is ready", + }); +UX_STEP_NOCB(ux_idle_flow_3_step, + bn, + { + "Version", + APPVERSION, + }); +UX_STEP_VALID(ux_idle_flow_4_step, + pb, + os_sched_exit(-1), + { + &C_icon_dashboard_x, + "Quit", + }); +UX_FLOW(ux_idle_flow, &ux_idle_flow_1_step, &ux_idle_flow_3_step, &ux_idle_flow_4_step, FLOW_LOOP); void ui_idle(void) { // reserve a display stack slot if none yet - if(G_ux.stack_count == 0) { + if (G_ux.stack_count == 0) { ux_stack_push(); } ux_flow_init(0, ux_idle_flow, NULL); diff --git a/src/message.c b/src/message.c index e21de54..37d1ab2 100644 --- a/src/message.c +++ b/src/message.c @@ -8,7 +8,11 @@ #define ROOT_CELL_INDEX 0 #define GIFT_CELL_INDEX 1 -void deserialize_array(uint8_t* in, uint8_t in_size, uint16_t offset, uint8_t* out, uint8_t out_size) { +void deserialize_array(uint8_t* in, + uint8_t in_size, + uint16_t offset, + uint8_t* out, + uint8_t out_size) { uint8_t shift = offset % 8; uint8_t first_data_byte = offset / 8; for (uint16_t i = first_data_byte, j = 0; j < out_size; ++i, ++j) { @@ -35,7 +39,7 @@ void deserialize_address(struct SliceData_t* slice, int8_t* wc, uint8_t* address uint8_t anycast = SliceData_get_next_bit(slice); UNUSED(anycast); - *wc = (int8_t)SliceData_get_next_byte(slice); + *wc = (int8_t) SliceData_get_next_byte(slice); uint8_t* data = SliceData_begin(slice); uint16_t offset = SliceData_get_cursor(slice); @@ -57,18 +61,25 @@ void deserialize_value(struct SliceData_t* slice, uint8_t* value, uint8_t value_ } void set_dst_address(uint8_t wc, const uint8_t* address) { - char wc_temp[6]; // snprintf always returns zero - snprintf(wc_temp, sizeof(wc_temp), "%d:", (int8_t)wc); + char wc_temp[6]; // snprintf always returns zero + snprintf(wc_temp, sizeof(wc_temp), "%d:", (int8_t) wc); int wc_len = strlen(wc_temp); char* address_str = data_context.sign_tr_context.address_str; memcpy(address_str, wc_temp, wc_len); address_str += wc_len; - format_hex(address, ADDRESS_LENGTH, address_str, sizeof(data_context.sign_tr_context.address_str)); + format_hex(address, + ADDRESS_LENGTH, + address_str, + sizeof(data_context.sign_tr_context.address_str)); } -void set_amount(const uint8_t* amount, uint8_t amount_length, uint8_t flags, uint8_t decimals, const char* ticker) { +void set_amount(const uint8_t* amount, + uint8_t amount_length, + uint8_t flags, + uint8_t decimals, + const char* ticker) { char* amount_str = data_context.sign_tr_context.amount_str; size_t amount_str_size = sizeof(data_context.sign_tr_context.amount_str); @@ -77,8 +88,10 @@ void set_amount(const uint8_t* amount, uint8_t amount_length, uint8_t flags, uin switch (flags) { case NORMAL_FLAG: { const char* space = " "; - uint8_t text_size = convert_hex_amount_to_displayable(amount, decimals, amount_length, amount_str); - VALIDATE(amount_str_size >= text_size + strlen(space) + strlen(ticker), ERR_INVALID_MESSAGE); + uint8_t text_size = + convert_hex_amount_to_displayable(amount, decimals, amount_length, amount_str); + VALIDATE(amount_str_size >= text_size + strlen(space) + strlen(ticker), + ERR_INVALID_MESSAGE); strncpy(amount_str + text_size, space, strlen(space)); strncpy(amount_str + text_size + strlen(space), ticker, strlen(ticker)); @@ -106,10 +119,15 @@ void set_amount(const uint8_t* amount, uint8_t amount_length, uint8_t flags, uin void set_transaction_id(const uint8_t* transaction_id) { char* transaction_id_str = data_context.sign_tr_context.transaction_id_str; memset(transaction_id_str, 0, sizeof(data_context.sign_tr_context.transaction_id_str)); - format_hex(transaction_id, TRANSACTION_ID_LENGTH, transaction_id_str, sizeof(data_context.sign_tr_context.transaction_id_str)); + format_hex(transaction_id, + TRANSACTION_ID_LENGTH, + transaction_id_str, + sizeof(data_context.sign_tr_context.transaction_id_str)); } -void deserialize_int_message_header(struct SliceData_t* slice, uint8_t flags, SignTransactionContext_t* ctx) { +void deserialize_int_message_header(struct SliceData_t* slice, + uint8_t flags, + SignTransactionContext_t* ctx) { uint8_t int_msg = SliceData_get_next_bit(slice); VALIDATE(!int_msg, ERR_INVALID_MESSAGE); @@ -160,11 +178,13 @@ void deserialize_int_message_header(struct SliceData_t* slice, uint8_t flags, Si UNUSED(created_at); } - -int deserialize_token_body(struct SliceData_t* slice, struct SliceData_t* ref_slice, SignTransactionContext_t* ctx) { +int deserialize_token_body(struct SliceData_t* slice, + struct SliceData_t* ref_slice, + SignTransactionContext_t* ctx) { // FunctionId if (SliceData_remaining_bits(slice) < sizeof(uint32_t) * 8) { - if (!ref_slice || !ref_slice->data || (SliceData_remaining_bits(ref_slice) < sizeof(uint32_t) * 8)) { + if (!ref_slice || !ref_slice->data || + (SliceData_remaining_bits(ref_slice) < sizeof(uint32_t) * 8)) { // Empty payload is ok return SIGN_TRANSACTION_FLOW_TRANSFER; } @@ -235,7 +255,11 @@ int deserialize_token_body(struct SliceData_t* slice, struct SliceData_t* ref_sl return sign_transaction_flow; } -int deserialize_multisig_params(struct SliceData_t* slice, uint32_t function_id, uint8_t wc, uint8_t* address, SignTransactionContext_t* ctx) { +int deserialize_multisig_params(struct SliceData_t* slice, + uint32_t function_id, + uint8_t wc, + uint8_t* address, + SignTransactionContext_t* ctx) { int sign_transaction_flow = SIGN_TRANSACTION_FLOW_ERROR; switch (function_id) { @@ -331,10 +355,16 @@ void prepare_payload_hash(BocContext_t* bc) { } if (!data_context.sign_tr_context.sign_with_chain_id) { - memcpy(data_context.sign_tr_context.to_sign, &bc->hashes[ROOT_CELL_INDEX * HASH_SIZE], TO_SIGN_LENGTH); + memcpy(data_context.sign_tr_context.to_sign, + &bc->hashes[ROOT_CELL_INDEX * HASH_SIZE], + TO_SIGN_LENGTH); } else { - memcpy(data_context.sign_tr_context.to_sign, data_context.sign_tr_context.chain_id, CHAIN_ID_LENGTH); - memcpy(data_context.sign_tr_context.to_sign + CHAIN_ID_LENGTH, &bc->hashes[ROOT_CELL_INDEX * HASH_SIZE], TO_SIGN_LENGTH); + memcpy(data_context.sign_tr_context.to_sign, + data_context.sign_tr_context.chain_id, + CHAIN_ID_LENGTH); + memcpy(data_context.sign_tr_context.to_sign + CHAIN_ID_LENGTH, + &bc->hashes[ROOT_CELL_INDEX * HASH_SIZE], + TO_SIGN_LENGTH); } } @@ -372,9 +402,13 @@ uint32_t deserialize_contract_header(struct SliceData_t* slice) { return function_id; } -void prepend_address_to_cell(uint8_t* cell_buffer, uint16_t cell_buffer_size, struct Cell_t* cell, uint8_t wc, uint8_t* address) { +void prepend_address_to_cell(uint8_t* cell_buffer, + uint16_t cell_buffer_size, + struct Cell_t* cell, + uint8_t wc, + uint8_t* address) { uint16_t bit_len = Cell_bit_len(cell); - bit_len += 267; // Prefix(2) + Anycast(1) + WorkchainId(8) + Address(32 * 8) + bit_len += 267; // Prefix(2) + Anycast(1) + WorkchainId(8) + Address(32 * 8) uint8_t d1 = Cell_get_d1(cell); uint8_t d2 = ((bit_len >> 2) & 0b11111110) | (bit_len % 8 != 0); @@ -386,11 +420,11 @@ void prepend_address_to_cell(uint8_t* cell_buffer, uint16_t cell_buffer_size, st SliceData_init(&slice, cell_buffer + CELL_DATA_OFFSET, cell_buffer_size); // Append prefix - uint8_t prefix[] = { 0x80 }; // $100 prefix AddrStd + uint8_t prefix[] = {0x80}; // $100 prefix AddrStd SliceData_append(&slice, prefix, 3, false); // Append workchain - uint8_t wc_buf[] = { wc }; + uint8_t wc_buf[] = {wc}; SliceData_append(&slice, wc_buf, 8, false); // Append address @@ -415,7 +449,10 @@ void prepend_address_to_cell(uint8_t* cell_buffer, uint16_t cell_buffer_size, st cell->cell_begin = cell_buffer; } -int prepare_to_sign(struct ByteStream_t* src, uint8_t wc, uint8_t* address, uint8_t* prepend_address) { +int prepare_to_sign(struct ByteStream_t* src, + uint8_t wc, + uint8_t* address, + uint8_t* prepend_address) { // Init context BocContext_t* bc = &boc_context; DataContext_t* dc = &data_context; @@ -465,7 +502,8 @@ int prepare_to_sign(struct ByteStream_t* src, uint8_t wc, uint8_t* address, uint SliceData_t ref_slice; SliceData_from_cell(&ref_slice, ref_cell); - sign_transaction_flow = deserialize_token_body(&gift_slice, &ref_slice, &dc->sign_tr_context); + sign_transaction_flow = + deserialize_token_body(&gift_slice, &ref_slice, &dc->sign_tr_context); } // Calculate payload hash to sign @@ -494,7 +532,11 @@ int prepare_to_sign(struct ByteStream_t* src, uint8_t wc, uint8_t* address, uint SliceData_from_cell(&gift_slice, gift_cell); } - sign_transaction_flow = deserialize_multisig_params(&gift_slice, function_id, wc, address, &dc->sign_tr_context); + sign_transaction_flow = deserialize_multisig_params(&gift_slice, + function_id, + wc, + address, + &dc->sign_tr_context); uint8_t gift_refs_count; Cell_get_refs(gift_cell, &gift_refs_count); @@ -508,7 +550,8 @@ int prepare_to_sign(struct ByteStream_t* src, uint8_t wc, uint8_t* address, uint SliceData_from_cell(&body_slice, body_cell); if (!SliceData_is_empty(&body_slice)) { - sign_transaction_flow = deserialize_token_body(&body_slice, NULL, &dc->sign_tr_context); + sign_transaction_flow = + deserialize_token_body(&body_slice, NULL, &dc->sign_tr_context); } } @@ -530,7 +573,11 @@ int prepare_to_sign(struct ByteStream_t* src, uint8_t wc, uint8_t* address, uint SliceData_t gift_slice; SliceData_from_cell(&gift_slice, gift_cell); - sign_transaction_flow = deserialize_multisig_params(&gift_slice, function_id, wc, address, &dc->sign_tr_context); + sign_transaction_flow = deserialize_multisig_params(&gift_slice, + function_id, + wc, + address, + &dc->sign_tr_context); uint8_t gift_refs_count; Cell_get_refs(gift_cell, &gift_refs_count); @@ -544,13 +591,18 @@ int prepare_to_sign(struct ByteStream_t* src, uint8_t wc, uint8_t* address, uint SliceData_from_cell(&body_slice, body_cell); if (!SliceData_is_empty(&body_slice)) { - sign_transaction_flow = deserialize_token_body(&body_slice, NULL, &dc->sign_tr_context); + sign_transaction_flow = + deserialize_token_body(&body_slice, NULL, &dc->sign_tr_context); } } // Prepend address to root cell - uint8_t cell_buffer[130]; // d1(1) + d2(1) + data(128) - prepend_address_to_cell(cell_buffer, sizeof(cell_buffer), root_cell, wc, prepend_address); + uint8_t cell_buffer[130]; // d1(1) + d2(1) + data(128) + prepend_address_to_cell(cell_buffer, + sizeof(cell_buffer), + root_cell, + wc, + prepend_address); // Calculate payload hash to sign prepare_payload_hash(bc); diff --git a/src/sign.c b/src/sign.c index 0a2f726..62ee2c7 100644 --- a/src/sign.c +++ b/src/sign.c @@ -2,17 +2,27 @@ #include "utils.h" #include "errors.h" -static const char SIGN_MAGIC[] = {0xFF, 0xFF, 0xFF, 0xFF }; +static const char SIGN_MAGIC[] = {0xFF, 0xFF, 0xFF, 0xFF}; static uint8_t set_result_sign() { cx_ecfp_private_key_t privateKey; - SignContext_t* context = &data_context.sign_context; + SignContext_t *context = &data_context.sign_context; BEGIN_TRY { TRY { get_private_key(context->account_number, &privateKey); - cx_eddsa_sign(&privateKey, CX_LAST, CX_SHA512, context->to_sign, SIGN_MAGIC_LENGTH + TO_SIGN_LENGTH, NULL, 0, context->signature, SIGNATURE_LENGTH, NULL); - } FINALLY { + cx_eddsa_sign(&privateKey, + CX_LAST, + CX_SHA512, + context->to_sign, + SIGN_MAGIC_LENGTH + TO_SIGN_LENGTH, + NULL, + 0, + context->signature, + SIGNATURE_LENGTH, + NULL); + } + FINALLY { explicit_bzero(&privateKey, sizeof(privateKey)); } } @@ -25,49 +35,46 @@ static uint8_t set_result_sign() { return tx; } -UX_STEP_NOCB( - ux_sign_flow_1_step, - pnn, - { - &C_icon_certificate, - "Sign", - "message", - }); -UX_STEP_NOCB( - ux_sign_flow_2_step, - bnnn_paging, - { - .title = "Message", - .text = data_context.sign_context.to_sign_str, - }); -UX_STEP_CB( - ux_sign_flow_3_step, - pbb, - send_response(0, false), - { - &C_icon_crossmark, - "Cancel", - "signature", - }); -UX_STEP_CB( - ux_sign_flow_4_step, - pbb, - send_response(set_result_sign(), true), - { - &C_icon_validate_14, - "Sign", - "message.", - }); +UX_STEP_NOCB(ux_sign_flow_1_step, + pnn, + { + &C_icon_certificate, + "Sign", + "message", + }); +UX_STEP_NOCB(ux_sign_flow_2_step, + bnnn_paging, + { + .title = "Message", + .text = data_context.sign_context.to_sign_str, + }); +UX_STEP_CB(ux_sign_flow_3_step, + pbb, + send_response(0, false), + { + &C_icon_crossmark, + "Cancel", + "signature", + }); +UX_STEP_CB(ux_sign_flow_4_step, + pbb, + send_response(set_result_sign(), true), + { + &C_icon_validate_14, + "Sign", + "message.", + }); UX_FLOW(ux_sign_flow, - &ux_sign_flow_1_step, - &ux_sign_flow_2_step, - &ux_sign_flow_3_step, - &ux_sign_flow_4_step -); + &ux_sign_flow_1_step, + &ux_sign_flow_2_step, + &ux_sign_flow_3_step, + &ux_sign_flow_4_step); -void handleSign(uint8_t *dataBuffer, __attribute__((unused)) uint16_t dataLength, volatile unsigned int *flags) { - SignContext_t* context = &data_context.sign_context; +void handleSign(uint8_t *dataBuffer, + __attribute__((unused)) uint16_t dataLength, + volatile unsigned int *flags) { + SignContext_t *context = &data_context.sign_context; size_t offset = 0; @@ -78,7 +85,10 @@ void handleSign(uint8_t *dataBuffer, __attribute__((unused)) uint16_t dataLength VALIDATE(dataLength >= offset + TO_SIGN_LENGTH, ERR_INVALID_REQUEST); memcpy(context->to_sign, SIGN_MAGIC, SIGN_MAGIC_LENGTH); memcpy(context->to_sign + SIGN_MAGIC_LENGTH, dataBuffer + offset, TO_SIGN_LENGTH); - format_hex(context->to_sign, SIGN_MAGIC_LENGTH + TO_SIGN_LENGTH, context->to_sign_str, sizeof(context->to_sign_str)); + format_hex(context->to_sign, + SIGN_MAGIC_LENGTH + TO_SIGN_LENGTH, + context->to_sign_str, + sizeof(context->to_sign_str)); ux_flow_init(0, ux_sign_flow, NULL); *flags |= IO_ASYNCH_REPLY; diff --git a/src/sign_transaction.c b/src/sign_transaction.c index 6636886..9d7411e 100644 --- a/src/sign_transaction.c +++ b/src/sign_transaction.c @@ -7,17 +7,36 @@ static uint8_t set_result_sign_transaction() { cx_ecfp_private_key_t privateKey; - SignTransactionContext_t* context = &data_context.sign_tr_context; + SignTransactionContext_t *context = &data_context.sign_tr_context; BEGIN_TRY { TRY { get_private_key(context->account_number, &privateKey); if (!context->sign_with_chain_id) { - cx_eddsa_sign(&privateKey, CX_LAST, CX_SHA512, context->to_sign, TO_SIGN_LENGTH, NULL, 0, context->signature, SIGNATURE_LENGTH, NULL); + cx_eddsa_sign(&privateKey, + CX_LAST, + CX_SHA512, + context->to_sign, + TO_SIGN_LENGTH, + NULL, + 0, + context->signature, + SIGNATURE_LENGTH, + NULL); } else { - cx_eddsa_sign(&privateKey, CX_LAST, CX_SHA512, context->to_sign, CHAIN_ID_LENGTH + TO_SIGN_LENGTH, NULL, 0, context->signature, SIGNATURE_LENGTH, NULL); + cx_eddsa_sign(&privateKey, + CX_LAST, + CX_SHA512, + context->to_sign, + CHAIN_ID_LENGTH + TO_SIGN_LENGTH, + NULL, + 0, + context->signature, + SIGNATURE_LENGTH, + NULL); } - } FINALLY { + } + FINALLY { explicit_bzero(&privateKey, sizeof(privateKey)); } } @@ -30,115 +49,85 @@ static uint8_t set_result_sign_transaction() { return tx; } -UX_STEP_NOCB( - ux_sign_transaction_intro, - pnn, - { - &C_icon_eye, - "Review", - "transaction", - }); -UX_STEP_NOCB( - ux_sign_transaction_burn, - bnnn_paging, - { - .title = "Action", - .text = "Burn" - }); -UX_STEP_NOCB( - ux_sign_transaction_deploy, - bnnn_paging, - { - .title = "Action", - .text = "Deploy" - }); -UX_STEP_NOCB( - ux_sign_transaction_confirm, - bnnn_paging, - { - .title = "Action", - .text = "Confirm" - }); -UX_STEP_NOCB( - ux_sign_transaction_transfer, - bnnn_paging, - { - .title = "Action", - .text = "Transfer" - }); -UX_STEP_NOCB( - ux_sign_transaction_amount, - bnnn_paging, - { - .title = "Amount", - .text = data_context.sign_tr_context.amount_str, - }); -UX_STEP_NOCB( - ux_sign_transaction_address, - bnnn_paging, - { - .title = "Address", - .text = data_context.sign_tr_context.address_str, - }); -UX_STEP_NOCB( - ux_sign_transaction_transaction_id, - bnnn_paging, - { - .title = "Transaction id", - .text = data_context.sign_tr_context.transaction_id_str, - }); -UX_STEP_CB( - ux_sign_transaction_accept, - pbb, - send_response(set_result_sign_transaction(), true), - { - &C_icon_validate_14, - "Accept", - "and send", - }); -UX_STEP_CB( - ux_sign_transaction_reject, - pb, - send_response(0, false), - { - &C_icon_crossmark, - "Reject", - }); +UX_STEP_NOCB(ux_sign_transaction_intro, + pnn, + { + &C_icon_eye, + "Review", + "transaction", + }); +UX_STEP_NOCB(ux_sign_transaction_burn, bnnn_paging, {.title = "Action", .text = "Burn"}); +UX_STEP_NOCB(ux_sign_transaction_deploy, bnnn_paging, {.title = "Action", .text = "Deploy"}); +UX_STEP_NOCB(ux_sign_transaction_confirm, bnnn_paging, {.title = "Action", .text = "Confirm"}); +UX_STEP_NOCB(ux_sign_transaction_transfer, bnnn_paging, {.title = "Action", .text = "Transfer"}); +UX_STEP_NOCB(ux_sign_transaction_amount, + bnnn_paging, + { + .title = "Amount", + .text = data_context.sign_tr_context.amount_str, + }); +UX_STEP_NOCB(ux_sign_transaction_address, + bnnn_paging, + { + .title = "Address", + .text = data_context.sign_tr_context.address_str, + }); +UX_STEP_NOCB(ux_sign_transaction_transaction_id, + bnnn_paging, + { + .title = "Transaction id", + .text = data_context.sign_tr_context.transaction_id_str, + }); +UX_STEP_CB(ux_sign_transaction_accept, + pbb, + send_response(set_result_sign_transaction(), true), + { + &C_icon_validate_14, + "Accept", + "and send", + }); +UX_STEP_CB(ux_sign_transaction_reject, + pb, + send_response(0, false), + { + &C_icon_crossmark, + "Reject", + }); UX_FLOW(ux_sign_transaction_burn_flow, - &ux_sign_transaction_intro, - &ux_sign_transaction_burn, - &ux_sign_transaction_amount, - &ux_sign_transaction_accept, - &ux_sign_transaction_reject -); + &ux_sign_transaction_intro, + &ux_sign_transaction_burn, + &ux_sign_transaction_amount, + &ux_sign_transaction_accept, + &ux_sign_transaction_reject); UX_FLOW(ux_sign_transaction_deploy_flow, - &ux_sign_transaction_intro, - &ux_sign_transaction_deploy, - &ux_sign_transaction_address, - &ux_sign_transaction_accept, - &ux_sign_transaction_reject -); + &ux_sign_transaction_intro, + &ux_sign_transaction_deploy, + &ux_sign_transaction_address, + &ux_sign_transaction_accept, + &ux_sign_transaction_reject); UX_FLOW(ux_sign_transaction_confirm_flow, - &ux_sign_transaction_intro, - &ux_sign_transaction_confirm, - &ux_sign_transaction_transaction_id, - &ux_sign_transaction_accept, - &ux_sign_transaction_reject -); + &ux_sign_transaction_intro, + &ux_sign_transaction_confirm, + &ux_sign_transaction_transaction_id, + &ux_sign_transaction_accept, + &ux_sign_transaction_reject); UX_FLOW(ux_sign_transaction_transfer_flow, - &ux_sign_transaction_intro, - &ux_sign_transaction_transfer, - &ux_sign_transaction_amount, - &ux_sign_transaction_address, - &ux_sign_transaction_accept, - &ux_sign_transaction_reject -); - -int handleSignTransaction(uint8_t *dataBuffer, uint16_t dataLength, volatile unsigned int *flags, bool is_first_chunk, bool more) { + &ux_sign_transaction_intro, + &ux_sign_transaction_transfer, + &ux_sign_transaction_amount, + &ux_sign_transaction_address, + &ux_sign_transaction_accept, + &ux_sign_transaction_reject); + +int handleSignTransaction(uint8_t *dataBuffer, + uint16_t dataLength, + volatile unsigned int *flags, + bool is_first_chunk, + bool more) { if (is_first_chunk) { reset_app_context(); } @@ -176,7 +165,8 @@ int handleSignTransaction(uint8_t *dataBuffer, uint16_t dataLength, volatile uns // Read wallet type if present if (metadata & FLAG_WITH_WALLET_ID) { - VALIDATE(dataLength >= offset + sizeof(context->current_wallet_type), ERR_INVALID_REQUEST); + VALIDATE(dataLength >= offset + sizeof(context->current_wallet_type), + ERR_INVALID_REQUEST); context->current_wallet_type = dataBuffer[offset]; offset += sizeof(context->current_wallet_type); } else { @@ -215,17 +205,18 @@ int handleSignTransaction(uint8_t *dataBuffer, uint16_t dataLength, volatile uns context->sign_with_chain_id = false; } } - // offset is a pointer to dataBuffer, or the number of bytes we moved. here + offset means start of the message - // we need to save data to a context buffer and add msg_length to offset of this buffer - uint8_t* msg_begin = dataBuffer + offset; + // offset is a pointer to dataBuffer, or the number of bytes we moved. here + offset means start + // of the message we need to save data to a context buffer and add msg_length to offset of this + // buffer + uint8_t *msg_begin = dataBuffer + offset; // Since we check LC dataLength can not be manipulated uint16_t msg_length = dataLength - offset; - if (msg_begin && msg_length > 0) { // if data exists - VALIDATE(context->data_offset + msg_length < sizeof(context->data) , ERR_INVALID_DATA); + if (msg_begin && msg_length > 0) { // if data exists + VALIDATE(context->data_offset + msg_length < sizeof(context->data), ERR_INVALID_DATA); memcpy(context->data + context->data_offset, msg_begin, msg_length); - context->data_offset += msg_length; // add length of the new message to our context offset + context->data_offset += msg_length; // add length of the new message to our context offset } if (more) { diff --git a/src/slice_data.c b/src/slice_data.c index e34d94f..6eb9f6e 100644 --- a/src/slice_data.c +++ b/src/slice_data.c @@ -66,7 +66,7 @@ uint8_t SliceData_get_bits(const struct SliceData_t* self, uint16_t offset, uint } ret = (ret >> (8 - r)) >> (8 - bits); - return (uint8_t)ret; + return (uint8_t) ret; } } @@ -161,8 +161,7 @@ void SliceData_append(struct SliceData_t* self, uint8_t* in, uint16_t bits, bool uint16_t offset = self->data_window_start; if (offset % 8 == 0 || bytes == 0) { memcpy(self->data + offset / 8, in, bytes ? bytes : 1); - } - else { + } else { uint8_t shift = offset % 8; uint8_t first_data_byte = offset / 8; uint8_t prev = 0; diff --git a/src/utils.c b/src/utils.c index 598b4b9..042d914 100644 --- a/src/utils.c +++ b/src/utils.c @@ -7,7 +7,7 @@ #ifndef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION -void get_public_key(uint32_t account_number, uint8_t* publicKeyArray) { +void get_public_key(uint32_t account_number, uint8_t *publicKeyArray) { cx_ecfp_private_key_t privateKey; cx_ecfp_public_key_t publicKey; @@ -37,13 +37,11 @@ void get_public_key(uint32_t account_number, uint8_t* publicKeyArray) { static const uint32_t HARDENED_OFFSET = 0x80000000; void get_private_key(uint32_t account_number, cx_ecfp_private_key_t *privateKey) { - const uint32_t derivePath[BIP32_PATH] = { - 44 | HARDENED_OFFSET, - 396 | HARDENED_OFFSET, - account_number | HARDENED_OFFSET, - 0 | HARDENED_OFFSET, - 0 | HARDENED_OFFSET - }; + const uint32_t derivePath[BIP32_PATH] = {44 | HARDENED_OFFSET, + 396 | HARDENED_OFFSET, + account_number | HARDENED_OFFSET, + 0 | HARDENED_OFFSET, + 0 | HARDENED_OFFSET}; uint8_t privateKeyData[32]; BEGIN_TRY { @@ -56,10 +54,7 @@ void get_private_key(uint32_t account_number, cx_ecfp_private_key_t *privateKey) NULL, NULL, 0); - cx_ecfp_init_private_key(CX_CURVE_Ed25519, - privateKeyData, - 32, - privateKey); + cx_ecfp_init_private_key(CX_CURVE_Ed25519, privateKeyData, 32, privateKey); } CATCH_OTHER(e) { explicit_bzero(&privateKeyData, sizeof(privateKeyData)); @@ -73,8 +68,8 @@ void get_private_key(uint32_t account_number, cx_ecfp_private_key_t *privateKey) } void send_response(uint8_t tx, bool approve) { - G_io_apdu_buffer[tx++] = approve? 0x90 : 0x69; - G_io_apdu_buffer[tx++] = approve? 0x00 : 0x85; + G_io_apdu_buffer[tx++] = approve ? 0x90 : 0x69; + G_io_apdu_buffer[tx++] = approve ? 0x00 : 0x85; reset_app_context(); // Send back the response, do not restart the event loop io_exchange(CHANNEL_APDU | IO_RETURN_AFTER_TX, tx); @@ -89,9 +84,9 @@ unsigned int ui_prepro(const bagl_element_t *element) { if (display) { if (element->component.userid == 1) { UX_CALLBACK_SET_INTERVAL(2000); - } - else { - UX_CALLBACK_SET_INTERVAL(MAX(3000, 1000 + bagl_label_roundtrip_duration_ms(element, 7))); + } else { + UX_CALLBACK_SET_INTERVAL( + MAX(3000, 1000 + bagl_label_roundtrip_duration_ms(element, 7))); } } } @@ -173,7 +168,10 @@ uint16_t format_hex(const uint8_t *in, size_t in_len, char *out, size_t out_len) } #define SCRATCH_SIZE 37 -uint8_t convert_hex_amount_to_displayable(const uint8_t* amount, uint8_t decimals, uint8_t amount_length, char* out) { +uint8_t convert_hex_amount_to_displayable(const uint8_t *amount, + uint8_t decimals, + uint8_t amount_length, + char *out) { uint8_t LOOP1 = SCRATCH_SIZE - decimals; uint8_t LOOP2 = decimals; uint16_t scratch[SCRATCH_SIZE]; @@ -194,8 +192,7 @@ uint8_t convert_hex_amount_to_displayable(const uint8_t* amount, uint8_t decimal for (j = 0; j < 8; j++) { uint8_t k; uint16_t shifted_in = - (((amount[i] & 0xff) & ((1 << (7 - j)))) != 0) ? (short)1 - : (short)0; + (((amount[i] & 0xff) & ((1 << (7 - j)))) != 0) ? (short) 1 : (short) 0; for (k = smin; k < nscratch; k++) { scratch[k] += ((scratch[k] >= 5) ? 3 : 0); } @@ -204,11 +201,10 @@ uint8_t convert_hex_amount_to_displayable(const uint8_t* amount, uint8_t decimal smin -= 1; } for (k = smin; k < nscratch - 1; k++) { - scratch[k] = - ((scratch[k] << 1) & 0xF) | ((scratch[k + 1] >= 8) ? 1 : 0); + scratch[k] = ((scratch[k] << 1) & 0xF) | ((scratch[k + 1] >= 8) ? 1 : 0); } - scratch[nscratch - 1] = ((scratch[nscratch - 1] << 1) & 0x0F) | - (shifted_in == 1 ? 1 : 0); + scratch[nscratch - 1] = + ((scratch[nscratch - 1] << 1) & 0x0F) | (shifted_in == 1 ? 1 : 0); } } From dfb3219ab8708f6828db54bbb869ef4392b7916b Mon Sep 17 00:00:00 2001 From: keiff3r Date: Thu, 13 Feb 2025 20:56:11 +0100 Subject: [PATCH 15/67] style: update clang-format and format C codebase --- .clang-format | 14 ++++- fuzz/fuzzer.c | 4 +- fuzz/os_mocks.c | 8 +-- src/byte_stream.c | 4 +- src/cell.c | 36 ++++++------ src/contract.c | 55 +++++++++--------- src/get_address.c | 12 ++-- src/get_app_configuration.c | 10 ++-- src/get_public_key.c | 16 +++--- src/globals.c | 2 +- src/hashmap_label.c | 20 +++---- src/main.c | 26 ++++----- src/message.c | 110 ++++++++++++++++-------------------- src/sign.c | 10 ++-- src/sign_transaction.c | 18 +++--- src/slice_data.c | 26 ++++----- src/utils.c | 48 ++++++++-------- 17 files changed, 205 insertions(+), 214 deletions(-) diff --git a/.clang-format b/.clang-format index d65f1ce..c70f6aa 100644 --- a/.clang-format +++ b/.clang-format @@ -6,13 +6,21 @@ ColumnLimit: 100 PointerAlignment: Right AlignAfterOpenBracket: Align AlignConsecutiveMacros: true -AllowAllParametersOfDeclarationOnNextLine: false +AlignConsecutiveAssignments: true +AlignConsecutiveDeclarations: true +AllowAllParametersOfDeclarationOnNextLine: true SortIncludes: false SpaceAfterCStyleCast: true AllowShortCaseLabelsOnASingleLine: false -AllowAllArgumentsOnNextLine: false +AllowAllArgumentsOnNextLine: true AllowShortBlocksOnASingleLine: Never AllowShortFunctionsOnASingleLine: None BinPackArguments: false BinPackParameters: false ---- +BreakBeforeBinaryOperators: NonAssignment +BreakBeforeBraces: Attach +BreakBeforeTernaryOperators: true +BreakConstructorInitializersBeforeComma: true +ReflowComments: false +SpaceBeforeParens: ControlStatements +AlwaysBreakAfterReturnType: None diff --git a/fuzz/fuzzer.c b/fuzz/fuzzer.c index e69fa65..85b739c 100644 --- a/fuzz/fuzzer.c +++ b/fuzz/fuzzer.c @@ -19,11 +19,11 @@ #ifdef FUZZ_WITH_PROTOBUF #else -BocContext_t boc_context; +BocContext_t boc_context; DataContext_t data_context; void hex_to_bytes(const char* hex, uint8_t* bytes) { - size_t len = strlen(hex); + size_t len = strlen(hex); size_t final_len = len / 2; for (size_t i = 0, j = 0; j < final_len; i += 2, j++) bytes[j] = (hex[i] % 32 + 9) % 25 * 16 + (hex[i + 1] % 32 + 9) % 25; diff --git a/fuzz/os_mocks.c b/fuzz/os_mocks.c index 0186a7e..2dd9d95 100644 --- a/fuzz/os_mocks.c +++ b/fuzz/os_mocks.c @@ -16,7 +16,7 @@ try_context_t *try_context_get(void) { try_context_t *try_context_set(try_context_t *ctx) { try_context_t *previous_ctx = current_context; - current_context = ctx; + current_context = ctx; return previous_ctx; } @@ -32,13 +32,13 @@ try_context_t *try_context_set(try_context_t *ctx) { // } size_t cx_hash_sha256(const uint8_t *in, size_t len, uint8_t *out, size_t out_len) { - EVP_MD_CTX *mdctx; + EVP_MD_CTX *mdctx; const EVP_MD *md; - unsigned int hash_len; + unsigned int hash_len; uint8_t tmpBuf[EVP_MAX_MD_SIZE]; - md = EVP_sha256(); + md = EVP_sha256(); mdctx = EVP_MD_CTX_new(); EVP_DigestInit_ex(mdctx, md, NULL); EVP_DigestUpdate(mdctx, in, len); diff --git a/src/byte_stream.c b/src/byte_stream.c index d0174d6..319d780 100644 --- a/src/byte_stream.c +++ b/src/byte_stream.c @@ -5,8 +5,8 @@ void ByteStream_init(struct ByteStream_t* self, uint8_t* data, uint16_t data_size) { VALIDATE(self && data && data_size, ERR_END_OF_STREAM); self->data_size = data_size; - self->offset = 0; - self->data = data; + self->offset = 0; + self->data = data; } void ByteStream_move_by(struct ByteStream_t* self, uint16_t data_size) { diff --git a/src/cell.c b/src/cell.c index c3595ec..d20a0bf 100644 --- a/src/cell.c +++ b/src/cell.c @@ -3,7 +3,7 @@ void Cell_init(struct Cell_t* self, uint8_t* cell_begin, uint16_t cell_length) { VALIDATE(self && cell_begin, ERR_CELL_IS_EMPTY); - self->cell_begin = cell_begin; + self->cell_begin = cell_begin; self->cell_length = cell_length; } @@ -30,8 +30,8 @@ uint8_t* Cell_get_data(const struct Cell_t* self) { } uint8_t* Cell_get_refs(const struct Cell_t* self, uint8_t* refs_count) { - uint8_t d1 = Cell_get_d1(self); - *refs_count = d1 & 7; + uint8_t d1 = Cell_get_d1(self); + *refs_count = d1 & 7; uint8_t data_size = Cell_get_data_size(self); return self->cell_begin + CELL_DATA_OFFSET + data_size; } @@ -63,13 +63,13 @@ uint16_t Cell_bit_len(struct Cell_t* self) { } uint16_t deserialize_cell(struct Cell_t* cell, - const uint8_t cell_index, - const uint8_t cells_count) { - uint8_t d1 = Cell_get_d1(cell); - uint8_t level = d1 >> 5; // level + const uint8_t cell_index, + const uint8_t cells_count) { + uint8_t d1 = Cell_get_d1(cell); + uint8_t level = d1 >> 5; // level uint8_t hashes = (d1 & 16) == 16; // with hashes uint8_t exotic = (d1 & 8) == 8; // exotic - uint8_t rc = d1 & 7; // refs count + uint8_t rc = d1 & 7; // refs count uint8_t absent = rc == 7 && hashes; uint8_t pruned = d1 == PRUNED_BRANCH_D1; UNUSED(level); @@ -82,8 +82,8 @@ uint16_t deserialize_cell(struct Cell_t* cell, uint8_t data_size = Cell_get_data_size(cell); VALIDATE(!pruned || pruned && (data_size == PRUNED_BRANCH_DATA_SIZE), ERR_INVALID_CELL); - uint8_t refs_count = 0; - uint8_t* refs = Cell_get_refs(cell, &refs_count); + uint8_t refs_count = 0; + uint8_t* refs = Cell_get_refs(cell, &refs_count); for (uint8_t i = 0; i < refs_count; ++i) { VALIDATE(cell && cell->cell_length > CELL_DATA_OFFSET + data_size + i, ERR_INVALID_CELL); @@ -113,8 +113,8 @@ void calc_cell_hash(Cell_t* cell, const uint8_t cell_index) { uint8_t hash_buffer[266]; // d1(1) + d2(1) + data(128) + 4 * (depth(2) + hash(32)) uint16_t hash_buffer_offset = 0; - hash_buffer[0] = d1 & 0b00011111; - hash_buffer[1] = Cell_get_d2(cell); + hash_buffer[0] = d1 & 0b00011111; + hash_buffer[1] = Cell_get_d2(cell); hash_buffer_offset += 2; uint8_t data_size = Cell_get_data_size(cell); if (bc->public_key_cell_index && cell_index == bc->public_key_cell_index) { @@ -124,14 +124,14 @@ void calc_cell_hash(Cell_t* cell, const uint8_t cell_index) { } hash_buffer_offset += data_size; - uint8_t refs_count = 0; - uint8_t* refs = Cell_get_refs(cell, &refs_count); + uint8_t refs_count = 0; + uint8_t* refs = Cell_get_refs(cell, &refs_count); VALIDATE(refs_count <= MAX_REFERENCES_COUNT, ERR_INVALID_CELL); for (uint8_t child = 0; child < refs_count; ++child) { uint8_t* depth = &bc->cell_depth[cell_index]; VALIDATE(refs[child] < MAX_CONTRACT_CELLS_COUNT, ERR_INVALID_CELL); uint8_t child_depth = bc->cell_depth[refs[child]]; - *depth = (*depth > child_depth + 1) ? *depth : (child_depth + 1); + *depth = (*depth > child_depth + 1) ? *depth : (child_depth + 1); uint8_t buf[2]; buf[0] = 0; buf[1] = child_depth; @@ -145,9 +145,7 @@ void calc_cell_hash(Cell_t* cell, const uint8_t cell_index) { hash_buffer_offset += HASH_SIZE; } - int result = cx_hash_sha256(hash_buffer, - hash_buffer_offset, - bc->hashes + cell_index * HASH_SIZE, - HASH_SIZE); + int result = cx_hash_sha256( + hash_buffer, hash_buffer_offset, bc->hashes + cell_index * HASH_SIZE, HASH_SIZE); VALIDATE(result == HASH_SIZE, ERR_INVALID_HASH); } diff --git a/src/contract.c b/src/contract.c index e4434e2..be8be45 100644 --- a/src/contract.c +++ b/src/contract.c @@ -90,21 +90,21 @@ const uint8_t surf_wallet_code_hash[] = { 0x70, 0xa5, 0x97, 0x67, 0xdb, 0x2b, 0xf4, 0x78, 0x8b, 0x1d, 0x61, 0xad, 0x42, 0xcd, 0xad, 0x82}; // Cell depths -const uint32_t safe_multisig_wallet_cell_depth = 0x0C; +const uint32_t safe_multisig_wallet_cell_depth = 0x0C; const uint32_t safe_multisig_wallet_24h_cell_depth = 0x0C; -const uint32_t setcode_multisig_wallet_cell_depth = 0x0D; -const uint32_t bridge_multisig_wallet_cell_depth = 0x0B; -const uint32_t multisig_2_wallet_cell_depth = 0x0C; -const uint32_t multisig_2_1_wallet_cell_depth = 0x0A; -const uint32_t surf_wallet_cell_depth = 0x0C; +const uint32_t setcode_multisig_wallet_cell_depth = 0x0D; +const uint32_t bridge_multisig_wallet_cell_depth = 0x0B; +const uint32_t multisig_2_wallet_cell_depth = 0x0C; +const uint32_t multisig_2_1_wallet_cell_depth = 0x0A; +const uint32_t surf_wallet_cell_depth = 0x0C; void deserialize_cells_tree(struct ByteStream_t* src) { uint8_t first_byte = ByteStream_read_byte(src); { - bool index_included = (first_byte & 0x80) != 0; - bool has_crc = (first_byte & 0x40) != 0; - bool has_cache_bits = (first_byte & 0x20) != 0; - uint8_t flags = (first_byte & 0x18) >> 3; + bool index_included = (first_byte & 0x80) != 0; + bool has_crc = (first_byte & 0x40) != 0; + bool has_cache_bits = (first_byte & 0x20) != 0; + uint8_t flags = (first_byte & 0x18) >> 3; UNUSED(flags); VALIDATE(!index_included && !has_crc && !has_cache_bits, ERR_INVALID_CONTRACT); } @@ -136,10 +136,10 @@ void deserialize_cells_tree(struct ByteStream_t* src) { for (uint8_t i = 0; i < cells_count; ++i) { VALIDATE(i < MAX_CONTRACT_CELLS_COUNT, ERR_INVALID_CONTRACT); - uint8_t* cell_begin = ByteStream_get_cursor(src); + uint8_t* cell_begin = ByteStream_get_cursor(src); uint16_t cell_length = ByteStream_get_length(src); Cell_init(&cell, cell_begin, cell_length); - uint16_t offset = deserialize_cell(&cell, i, cells_count); + uint16_t offset = deserialize_cell(&cell, i, cells_count); boc_context.cells[i] = cell; ByteStream_read_data(src, offset); @@ -156,8 +156,8 @@ void find_public_key_cell() { BocContext_t* bc = &boc_context; VALIDATE(Cell_get_data(&bc->cells[0])[0] & 0x20, ERR_INVALID_CONTRACT); // has data branch - uint8_t refs_count = 0; - uint8_t* refs = Cell_get_refs(&bc->cells[0], &refs_count); + uint8_t refs_count = 0; + uint8_t* refs = Cell_get_refs(&bc->cells[0], &refs_count); VALIDATE(refs_count > 0 && refs_count <= 2, ERR_INVALID_CONTRACT); uint8_t data_root = refs[refs_count - 1]; @@ -165,7 +165,7 @@ void find_public_key_cell() { refs = Cell_get_refs(&bc->cells[data_root], &refs_count); VALIDATE(refs_count != 0 && refs_count <= MAX_REFERENCES_COUNT, ERR_INVALID_CONTRACT); - uint8_t key_buffer[8]; + uint8_t key_buffer[8]; SliceData_t key; memset(key_buffer, 0, sizeof(key_buffer)); SliceData_init(&key, key_buffer, sizeof(key_buffer)); @@ -210,8 +210,8 @@ void compute_wallet_v3_address(uint32_t account_number, uint8_t* address) { uint8_t hash_buffer[71]; // d1(1) + d2(1) + data(5) + code_hash(32) + data_hash(32) uint16_t hash_buffer_offset = 0; - hash_buffer[0] = 0x02; // d1(1) - hash_buffer[1] = 0x01; // d2(1) + hash_buffer[0] = 0x02; // d1(1) + hash_buffer[1] = 0x01; // d2(1) hash_buffer_offset += 2; // Data @@ -268,8 +268,8 @@ void compute_ever_wallet_address(uint32_t account_number, uint8_t* address) { uint8_t hash_buffer[71]; // d1(1) + d2(1) + data(5) + code_hash(32) + data_hash(32) uint16_t hash_buffer_offset = 0; - hash_buffer[0] = 0x02; // d1(1) - hash_buffer[1] = 0x01; // d2(1) + hash_buffer[0] = 0x02; // d1(1) + hash_buffer[1] = 0x01; // d2(1) hash_buffer_offset += 2; // Data @@ -280,9 +280,8 @@ void compute_ever_wallet_address(uint32_t account_number, uint8_t* address) { hash_buffer_offset += sizeof(uint32_t); // Code hash - memcpy(hash_buffer + hash_buffer_offset, - ever_wallet_code_hash, - sizeof(ever_wallet_code_hash)); + memcpy( + hash_buffer + hash_buffer_offset, ever_wallet_code_hash, sizeof(ever_wallet_code_hash)); hash_buffer_offset += sizeof(ever_wallet_code_hash); // Data hash @@ -294,12 +293,12 @@ void compute_ever_wallet_address(uint32_t account_number, uint8_t* address) { } } -void compute_multisig_address(uint32_t account_number, +void compute_multisig_address(uint32_t account_number, const uint8_t* wallet, - uint16_t wallet_size, + uint16_t wallet_size, const uint8_t* code_hash, - uint32_t cell_depth, - uint8_t* address) { + uint32_t cell_depth, + uint8_t* address) { { ByteStream_t src; ByteStream_init(&src, (uint8_t*) wallet, wallet_size); @@ -316,7 +315,7 @@ void compute_multisig_address(uint32_t account_number, bc->cell_depth[bc->public_key_cell_index + 1] = cell_depth; VALIDATE(bc->public_key_cell_index && bc->public_key_label_size_bits, ERR_INVALID_CONTRACT); - Cell_t* cell = &bc->cells[bc->public_key_cell_index]; + Cell_t* cell = &bc->cells[bc->public_key_cell_index]; uint8_t cell_data_size = Cell_get_data_size(cell); VALIDATE(cell_data_size != 0 && cell_data_size <= MAX_PUBLIC_KEY_CELL_DATA_SIZE, ERR_INVALID_CONTRACT); @@ -326,7 +325,7 @@ void compute_multisig_address(uint32_t account_number, uint8_t* public_key = data_context.pk_context.public_key; get_public_key(account_number, public_key); - uint8_t* data = bc->public_key_cell_data; + uint8_t* data = bc->public_key_cell_data; SliceData_t slice; SliceData_init(&slice, data, sizeof(bc->public_key_cell_data)); SliceData_move_by(&slice, bc->public_key_label_size_bits); diff --git a/src/get_address.c b/src/get_address.c index 04b80cb..efab109 100644 --- a/src/get_address.c +++ b/src/get_address.c @@ -6,7 +6,7 @@ #include "byte_stream.h" static uint8_t set_result_get_address() { - uint8_t tx = 0; + uint8_t tx = 0; G_io_apdu_buffer[tx++] = ADDRESS_LENGTH; memmove(G_io_apdu_buffer + tx, data_context.addr_context.address, ADDRESS_LENGTH); tx += ADDRESS_LENGTH; @@ -25,7 +25,7 @@ UX_STEP_NOCB(ux_display_address_flow_2_step, bnnn_paging, { .title = "Address", - .text = data_context.addr_context.address_str, + .text = data_context.addr_context.address_str, }); UX_STEP_CB(ux_display_address_flow_3_step, pb, @@ -48,10 +48,10 @@ UX_FLOW(ux_display_address_flow, &ux_display_address_flow_3_step, &ux_display_address_flow_4_step); -void handleGetAddress(uint8_t p1, - uint8_t p2, - uint8_t *dataBuffer, - uint16_t dataLength, +void handleGetAddress(uint8_t p1, + uint8_t p2, + uint8_t *dataBuffer, + uint16_t dataLength, volatile unsigned int *flags, volatile unsigned int *tx) { VALIDATE(p2 == 0 && dataLength == (sizeof(uint32_t) + sizeof(uint8_t)), ERR_INVALID_REQUEST); diff --git a/src/get_app_configuration.c b/src/get_app_configuration.c index ef0c414..fcee9ac 100644 --- a/src/get_app_configuration.c +++ b/src/get_app_configuration.c @@ -2,10 +2,10 @@ #include "utils.h" #include "errors.h" -void handleGetAppConfiguration(uint8_t p1, - uint8_t p2, - uint8_t *dataBuffer, - uint16_t dataLength, +void handleGetAppConfiguration(uint8_t p1, + uint8_t p2, + uint8_t *dataBuffer, + uint16_t dataLength, volatile unsigned int *flags, volatile unsigned int *tx) { UNUSED(dataBuffer); @@ -15,6 +15,6 @@ void handleGetAppConfiguration(uint8_t p1, G_io_apdu_buffer[0] = LEDGER_MAJOR_VERSION; G_io_apdu_buffer[1] = LEDGER_MINOR_VERSION; G_io_apdu_buffer[2] = LEDGER_PATCH_VERSION; - *tx = 3; + *tx = 3; THROW(SUCCESS); } diff --git a/src/get_public_key.c b/src/get_public_key.c index 4a03a3f..886873c 100644 --- a/src/get_public_key.c +++ b/src/get_public_key.c @@ -5,7 +5,7 @@ #include "errors.h" static uint8_t set_result_get_public_key() { - uint8_t tx = 0; + uint8_t tx = 0; G_io_apdu_buffer[tx++] = PUBLIC_KEY_LENGTH; memmove(G_io_apdu_buffer + tx, data_context.pk_context.public_key, PUBLIC_KEY_LENGTH); tx += PUBLIC_KEY_LENGTH; @@ -19,7 +19,7 @@ UX_STEP_NOCB(ux_display_public_flow_1_step, bnnn_paging, { .title = "Public key", - .text = data_context.pk_context.public_key_str, + .text = data_context.pk_context.public_key_str, }); UX_STEP_CB(ux_display_public_flow_2_step, pb, @@ -43,16 +43,16 @@ UX_FLOW(ux_display_public_flow, #endif -void handleGetPublicKey(uint8_t p1, - uint8_t p2, - uint8_t *dataBuffer, - uint16_t dataLength, +void handleGetPublicKey(uint8_t p1, + uint8_t p2, + uint8_t *dataBuffer, + uint16_t dataLength, volatile unsigned int *flags, volatile unsigned int *tx) { VALIDATE(p2 == 0 && dataLength == sizeof(uint32_t), ERR_INVALID_REQUEST); - uint32_t account_number = readUint32BE(dataBuffer); - PublicKeyContext_t *context = &data_context.pk_context; + uint32_t account_number = readUint32BE(dataBuffer); + PublicKeyContext_t *context = &data_context.pk_context; get_public_key(account_number, context->public_key); if (p1 == P1_NON_CONFIRM) { *tx = set_result_get_public_key(); diff --git a/src/globals.c b/src/globals.c index e8d7cc0..9a2e7b9 100644 --- a/src/globals.c +++ b/src/globals.c @@ -2,7 +2,7 @@ #include "os.h" #include "ux.h" -ux_state_t G_ux; +ux_state_t G_ux; bolos_ux_params_t G_ux_params; // display stepped screens diff --git a/src/hashmap_label.c b/src/hashmap_label.c index aaf85a5..2d223ef 100644 --- a/src/hashmap_label.c +++ b/src/hashmap_label.c @@ -5,7 +5,7 @@ #include "errors.h" uint8_t get_label_same(uint8_t max, struct SliceData_t* slice, struct SliceData_t* label) { - uint8_t value = SliceData_get_next_bit(slice) ? 0xff : 0; + uint8_t value = SliceData_get_next_bit(slice) ? 0xff : 0; uint8_t length = SliceData_get_next_size(slice, max); VALIDATE(length <= 64, ERR_RANGE_CHECK); @@ -31,21 +31,21 @@ void put_to_node(uint8_t cell_index, uint16_t bit_len, struct SliceData_t* key) VALIDATE(key->data[i] == 0, ERR_INVALID_KEY); } - Cell_t* cell = &boc_context.cells[cell_index]; + Cell_t* cell = &boc_context.cells[cell_index]; SliceData_t slice; SliceData_init(&slice, Cell_get_data(cell), Cell_get_data_size(cell)); SliceData_t label; - uint8_t label_data[8]; + uint8_t label_data[8]; memset(label_data, 0, sizeof(label_data)); SliceData_init(&label, label_data, sizeof(label_data)); get_label(bit_len, &slice, &label); if (SliceData_equal(&label, key)) { - uint8_t len = 16 - leading_zeros(bit_len); - uint8_t label_size_bits = 2 + 1 + len; // prefix + key bit + len + uint8_t len = 16 - leading_zeros(bit_len); + uint8_t label_size_bits = 2 + 1 + len; // prefix + key bit + len boc_context.public_key_label_size_bits = label_size_bits; - boc_context.public_key_cell_index = cell_index; + boc_context.public_key_cell_index = cell_index; return; } @@ -55,8 +55,8 @@ void put_to_node(uint8_t cell_index, uint16_t bit_len, struct SliceData_t* key) MIN(SliceData_remaining_bits(&label), SliceData_remaining_bits(key)); VALIDATE(max_prefix_len <= 64, ERR_RANGE_CHECK); uint8_t i = 0; - while (i < max_prefix_len && - SliceData_get_bits(&label, i, 1) == SliceData_get_bits(key, i, 1)) { + while (i < max_prefix_len + && SliceData_get_bits(&label, i, 1) == SliceData_get_bits(key, i, 1)) { i += 1; } @@ -71,8 +71,8 @@ void put_to_node(uint8_t cell_index, uint16_t bit_len, struct SliceData_t* key) uint8_t next_index = SliceData_get_next_bit(key); VALIDATE(next_index == 0, ERR_INVALID_KEY); - uint8_t refs_count = 0; - uint8_t* refs = Cell_get_refs(&boc_context.cells[cell_index], &refs_count); + uint8_t refs_count = 0; + uint8_t* refs = Cell_get_refs(&boc_context.cells[cell_index], &refs_count); VALIDATE(refs_count > 0 && refs_count <= MAX_REFERENCES_COUNT, ERR_INVALID_DATA); uint8_t next_cell = refs[next_index]; VALIDATE(next_cell != 0 && next_cell <= MAX_CONTRACT_CELLS_COUNT, ERR_INVALID_DATA); diff --git a/src/main.c b/src/main.c index 26c0a03..bfc6487 100644 --- a/src/main.c +++ b/src/main.c @@ -21,7 +21,7 @@ unsigned char G_io_seproxyhal_spi_buffer[IO_SEPROXYHAL_BUFFER_SIZE_B]; -BocContext_t boc_context; +BocContext_t boc_context; DataContext_t data_context; void reset_app_context() { @@ -99,8 +99,8 @@ void handleApdu(volatile unsigned int *flags, volatile unsigned int *tx, int rx) } break; case INS_SIGN: { - if (G_io_apdu_buffer[OFFSET_P1] != P1_CONFIRM || - G_io_apdu_buffer[OFFSET_P2] != 0) { + if (G_io_apdu_buffer[OFFSET_P1] != P1_CONFIRM + || G_io_apdu_buffer[OFFSET_P2] != 0) { THROW(0x6802); } @@ -126,8 +126,8 @@ void handleApdu(volatile unsigned int *flags, volatile unsigned int *tx, int rx) THROW(0x6808); } - uint8_t p2 = G_io_apdu_buffer[OFFSET_P2]; - bool more = (bool) (p2 & P2_MORE); + uint8_t p2 = G_io_apdu_buffer[OFFSET_P2]; + bool more = (bool) (p2 & P2_MORE); // P2_MORE is a signal for more apdu to receive in current chunk; // P2_EXTEND is a signal for extended buffer and can't be in first chunk; @@ -169,7 +169,7 @@ void handleApdu(volatile unsigned int *flags, volatile unsigned int *tx, int rx) break; } // Unexpected exception => report - G_io_apdu_buffer[*tx] = sw >> 8; + G_io_apdu_buffer[*tx] = sw >> 8; G_io_apdu_buffer[*tx + 1] = sw; *tx += 2; } @@ -180,8 +180,8 @@ void handleApdu(volatile unsigned int *flags, volatile unsigned int *tx, int rx) } void app_main(void) { - volatile unsigned int rx = 0; - volatile unsigned int tx = 0; + volatile unsigned int rx = 0; + volatile unsigned int tx = 0; volatile unsigned int flags = 0; // Stores the information about the current command. Some commands expect @@ -202,7 +202,7 @@ void app_main(void) { rx = tx; tx = 0; // ensure no race in catch_other if io_exchange throws // an error - rx = io_exchange(CHANNEL_APDU | flags, rx); + rx = io_exchange(CHANNEL_APDU | flags, rx); flags = 0; // no apdu received, well, reset the session, and reset the @@ -236,7 +236,7 @@ void app_main(void) { flags &= ~IO_ASYNCH_REPLY; } // Unexpected exception => report - G_io_apdu_buffer[tx] = sw >> 8; + G_io_apdu_buffer[tx] = sw >> 8; G_io_apdu_buffer[tx + 1] = sw; tx += 2; } @@ -270,9 +270,9 @@ unsigned char io_event(unsigned char channel) { break; case SEPROXYHAL_TAG_STATUS_EVENT: - if (G_io_apdu_media == IO_APDU_MEDIA_USB_HID && - !(U4BE(G_io_seproxyhal_spi_buffer, 3) & - SEPROXYHAL_TAG_STATUS_EVENT_FLAG_USB_POWERED)) { + if (G_io_apdu_media == IO_APDU_MEDIA_USB_HID + && !(U4BE(G_io_seproxyhal_spi_buffer, 3) + & SEPROXYHAL_TAG_STATUS_EVENT_FLAG_USB_POWERED)) { THROW(EXCEPTION_IO_RESET); } // no break is intentional diff --git a/src/message.c b/src/message.c index 37d1ab2..92fb4e7 100644 --- a/src/message.c +++ b/src/message.c @@ -8,18 +8,15 @@ #define ROOT_CELL_INDEX 0 #define GIFT_CELL_INDEX 1 -void deserialize_array(uint8_t* in, - uint8_t in_size, - uint16_t offset, - uint8_t* out, - uint8_t out_size) { - uint8_t shift = offset % 8; +void deserialize_array( + uint8_t* in, uint8_t in_size, uint16_t offset, uint8_t* out, uint8_t out_size) { + uint8_t shift = offset % 8; uint8_t first_data_byte = offset / 8; for (uint16_t i = first_data_byte, j = 0; j < out_size; ++i, ++j) { VALIDATE(i == (j + first_data_byte) && (i + 1) <= in_size, ERR_INVALID_MESSAGE); uint8_t cur = in[i] << shift; - out[j] = cur; + out[j] = cur; if (j == out_size - 1 && i + 1 < in_size) { out[j] |= in[i + 1] >> (8 - shift); @@ -41,8 +38,8 @@ void deserialize_address(struct SliceData_t* slice, int8_t* wc, uint8_t* address *wc = (int8_t) SliceData_get_next_byte(slice); - uint8_t* data = SliceData_begin(slice); - uint16_t offset = SliceData_get_cursor(slice); + uint8_t* data = SliceData_begin(slice); + uint16_t offset = SliceData_get_cursor(slice); uint16_t data_size = SliceData_data_size(slice); deserialize_array(data, data_size, offset, address, ADDRESS_LENGTH); @@ -52,7 +49,7 @@ void deserialize_address(struct SliceData_t* slice, int8_t* wc, uint8_t* address } void deserialize_value(struct SliceData_t* slice, uint8_t* value, uint8_t value_length) { - uint8_t* data = SliceData_begin(slice); + uint8_t* data = SliceData_begin(slice); uint16_t data_size = SliceData_data_size(slice); uint16_t offset = SliceData_get_cursor(slice); @@ -69,18 +66,16 @@ void set_dst_address(uint8_t wc, const uint8_t* address) { memcpy(address_str, wc_temp, wc_len); address_str += wc_len; - format_hex(address, - ADDRESS_LENGTH, - address_str, - sizeof(data_context.sign_tr_context.address_str)); + format_hex( + address, ADDRESS_LENGTH, address_str, sizeof(data_context.sign_tr_context.address_str)); } void set_amount(const uint8_t* amount, - uint8_t amount_length, - uint8_t flags, - uint8_t decimals, - const char* ticker) { - char* amount_str = data_context.sign_tr_context.amount_str; + uint8_t amount_length, + uint8_t flags, + uint8_t decimals, + const char* ticker) { + char* amount_str = data_context.sign_tr_context.amount_str; size_t amount_str_size = sizeof(data_context.sign_tr_context.amount_str); memset(amount_str, 0, amount_str_size); @@ -88,7 +83,7 @@ void set_amount(const uint8_t* amount, switch (flags) { case NORMAL_FLAG: { const char* space = " "; - uint8_t text_size = + uint8_t text_size = convert_hex_amount_to_displayable(amount, decimals, amount_length, amount_str); VALIDATE(amount_str_size >= text_size + strlen(space) + strlen(ticker), ERR_INVALID_MESSAGE); @@ -125,8 +120,8 @@ void set_transaction_id(const uint8_t* transaction_id) { sizeof(data_context.sign_tr_context.transaction_id_str)); } -void deserialize_int_message_header(struct SliceData_t* slice, - uint8_t flags, +void deserialize_int_message_header(struct SliceData_t* slice, + uint8_t flags, SignTransactionContext_t* ctx) { uint8_t int_msg = SliceData_get_next_bit(slice); VALIDATE(!int_msg, ERR_INVALID_MESSAGE); @@ -141,12 +136,12 @@ void deserialize_int_message_header(struct SliceData_t* slice, UNUSED(bounced); // Sender address - int8_t src_wc = 0; + int8_t src_wc = 0; uint8_t src_addr[ADDRESS_LENGTH]; deserialize_address(slice, &src_wc, src_addr); // Recipient address - int8_t dst_wc = 0; + int8_t dst_wc = 0; uint8_t dst_address[ADDRESS_LENGTH]; deserialize_address(slice, &dst_wc, dst_address); @@ -178,13 +173,13 @@ void deserialize_int_message_header(struct SliceData_t* slice, UNUSED(created_at); } -int deserialize_token_body(struct SliceData_t* slice, - struct SliceData_t* ref_slice, +int deserialize_token_body(struct SliceData_t* slice, + struct SliceData_t* ref_slice, SignTransactionContext_t* ctx) { // FunctionId if (SliceData_remaining_bits(slice) < sizeof(uint32_t) * 8) { - if (!ref_slice || !ref_slice->data || - (SliceData_remaining_bits(ref_slice) < sizeof(uint32_t) * 8)) { + if (!ref_slice || !ref_slice->data + || (SliceData_remaining_bits(ref_slice) < sizeof(uint32_t) * 8)) { // Empty payload is ok return SIGN_TRANSACTION_FLOW_TRANSFER; } @@ -214,7 +209,7 @@ int deserialize_token_body(struct SliceData_t* slice, slice = ref_slice; } - int8_t wc = 0; + int8_t wc = 0; uint8_t address[ADDRESS_LENGTH]; deserialize_address(slice, &wc, address); @@ -255,10 +250,10 @@ int deserialize_token_body(struct SliceData_t* slice, return sign_transaction_flow; } -int deserialize_multisig_params(struct SliceData_t* slice, - uint32_t function_id, - uint8_t wc, - uint8_t* address, +int deserialize_multisig_params(struct SliceData_t* slice, + uint32_t function_id, + uint8_t wc, + uint8_t* address, SignTransactionContext_t* ctx) { int sign_transaction_flow = SIGN_TRANSACTION_FLOW_ERROR; @@ -275,7 +270,7 @@ int deserialize_multisig_params(struct SliceData_t* slice, } case MULTISIG_SEND_TRANSACTION: { // Recipient address - int8_t dst_wc = 0; + int8_t dst_wc = 0; uint8_t dst_address[ADDRESS_LENGTH]; deserialize_address(slice, &dst_wc, dst_address); @@ -300,7 +295,7 @@ int deserialize_multisig_params(struct SliceData_t* slice, case MULTISIG_SUBMIT_TRANSACTION: case MULTISIG2_SUBMIT_TRANSACTION: { // Recipient address - int8_t dst_wc = 0; + int8_t dst_wc = 0; uint8_t dst_address[ADDRESS_LENGTH]; deserialize_address(slice, &dst_wc, dst_address); @@ -402,11 +397,11 @@ uint32_t deserialize_contract_header(struct SliceData_t* slice) { return function_id; } -void prepend_address_to_cell(uint8_t* cell_buffer, - uint16_t cell_buffer_size, +void prepend_address_to_cell(uint8_t* cell_buffer, + uint16_t cell_buffer_size, struct Cell_t* cell, - uint8_t wc, - uint8_t* address) { + uint8_t wc, + uint8_t* address) { uint16_t bit_len = Cell_bit_len(cell); bit_len += 267; // Prefix(2) + Anycast(1) + WorkchainId(8) + Address(32 * 8) @@ -431,13 +426,13 @@ void prepend_address_to_cell(uint8_t* cell_buffer, SliceData_append(&slice, address, ADDRESS_LENGTH * 8, false); // Append cell data - uint8_t* data = Cell_get_data(cell); - uint8_t data_size = Cell_get_data_size(cell); + uint8_t* data = Cell_get_data(cell); + uint8_t data_size = Cell_get_data_size(cell); SliceData_append(&slice, data, data_size * 8, false); // Append references - uint8_t refs_count = 0; - uint8_t* refs = Cell_get_refs(cell, &refs_count); + uint8_t refs_count = 0; + uint8_t* refs = Cell_get_refs(cell, &refs_count); VALIDATE(refs_count <= MAX_REFERENCES_COUNT, ERR_INVALID_MESSAGE); for (uint8_t child = 0; child < refs_count; ++child) { @@ -450,11 +445,11 @@ void prepend_address_to_cell(uint8_t* cell_buffer, } int prepare_to_sign(struct ByteStream_t* src, - uint8_t wc, - uint8_t* address, - uint8_t* prepend_address) { + uint8_t wc, + uint8_t* address, + uint8_t* prepend_address) { // Init context - BocContext_t* bc = &boc_context; + BocContext_t* bc = &boc_context; DataContext_t* dc = &data_context; // Parse transaction boc @@ -532,11 +527,8 @@ int prepare_to_sign(struct ByteStream_t* src, SliceData_from_cell(&gift_slice, gift_cell); } - sign_transaction_flow = deserialize_multisig_params(&gift_slice, - function_id, - wc, - address, - &dc->sign_tr_context); + sign_transaction_flow = deserialize_multisig_params( + &gift_slice, function_id, wc, address, &dc->sign_tr_context); uint8_t gift_refs_count; Cell_get_refs(gift_cell, &gift_refs_count); @@ -573,11 +565,8 @@ int prepare_to_sign(struct ByteStream_t* src, SliceData_t gift_slice; SliceData_from_cell(&gift_slice, gift_cell); - sign_transaction_flow = deserialize_multisig_params(&gift_slice, - function_id, - wc, - address, - &dc->sign_tr_context); + sign_transaction_flow = deserialize_multisig_params( + &gift_slice, function_id, wc, address, &dc->sign_tr_context); uint8_t gift_refs_count; Cell_get_refs(gift_cell, &gift_refs_count); @@ -598,11 +587,8 @@ int prepare_to_sign(struct ByteStream_t* src, // Prepend address to root cell uint8_t cell_buffer[130]; // d1(1) + d2(1) + data(128) - prepend_address_to_cell(cell_buffer, - sizeof(cell_buffer), - root_cell, - wc, - prepend_address); + prepend_address_to_cell( + cell_buffer, sizeof(cell_buffer), root_cell, wc, prepend_address); // Calculate payload hash to sign prepare_payload_hash(bc); diff --git a/src/sign.c b/src/sign.c index 62ee2c7..2fe2459 100644 --- a/src/sign.c +++ b/src/sign.c @@ -6,7 +6,7 @@ static const char SIGN_MAGIC[] = {0xFF, 0xFF, 0xFF, 0xFF}; static uint8_t set_result_sign() { cx_ecfp_private_key_t privateKey; - SignContext_t *context = &data_context.sign_context; + SignContext_t *context = &data_context.sign_context; BEGIN_TRY { TRY { @@ -28,7 +28,7 @@ static uint8_t set_result_sign() { } END_TRY; - uint8_t tx = 0; + uint8_t tx = 0; G_io_apdu_buffer[tx++] = SIGNATURE_LENGTH; memmove(G_io_apdu_buffer + tx, context->signature, SIGNATURE_LENGTH); tx += SIGNATURE_LENGTH; @@ -46,7 +46,7 @@ UX_STEP_NOCB(ux_sign_flow_2_step, bnnn_paging, { .title = "Message", - .text = data_context.sign_context.to_sign_str, + .text = data_context.sign_context.to_sign_str, }); UX_STEP_CB(ux_sign_flow_3_step, pbb, @@ -71,9 +71,9 @@ UX_FLOW(ux_sign_flow, &ux_sign_flow_3_step, &ux_sign_flow_4_step); -void handleSign(uint8_t *dataBuffer, +void handleSign(uint8_t *dataBuffer, __attribute__((unused)) uint16_t dataLength, - volatile unsigned int *flags) { + volatile unsigned int *flags) { SignContext_t *context = &data_context.sign_context; size_t offset = 0; diff --git a/src/sign_transaction.c b/src/sign_transaction.c index 9d7411e..74a0ead 100644 --- a/src/sign_transaction.c +++ b/src/sign_transaction.c @@ -6,7 +6,7 @@ #include "contract.h" static uint8_t set_result_sign_transaction() { - cx_ecfp_private_key_t privateKey; + cx_ecfp_private_key_t privateKey; SignTransactionContext_t *context = &data_context.sign_tr_context; BEGIN_TRY { @@ -42,7 +42,7 @@ static uint8_t set_result_sign_transaction() { } END_TRY; - uint8_t tx = 0; + uint8_t tx = 0; G_io_apdu_buffer[tx++] = SIGNATURE_LENGTH; memmove(G_io_apdu_buffer + tx, context->signature, SIGNATURE_LENGTH); tx += SIGNATURE_LENGTH; @@ -64,19 +64,19 @@ UX_STEP_NOCB(ux_sign_transaction_amount, bnnn_paging, { .title = "Amount", - .text = data_context.sign_tr_context.amount_str, + .text = data_context.sign_tr_context.amount_str, }); UX_STEP_NOCB(ux_sign_transaction_address, bnnn_paging, { .title = "Address", - .text = data_context.sign_tr_context.address_str, + .text = data_context.sign_tr_context.address_str, }); UX_STEP_NOCB(ux_sign_transaction_transaction_id, bnnn_paging, { .title = "Transaction id", - .text = data_context.sign_tr_context.transaction_id_str, + .text = data_context.sign_tr_context.transaction_id_str, }); UX_STEP_CB(ux_sign_transaction_accept, pbb, @@ -123,11 +123,11 @@ UX_FLOW(ux_sign_transaction_transfer_flow, &ux_sign_transaction_accept, &ux_sign_transaction_reject); -int handleSignTransaction(uint8_t *dataBuffer, - uint16_t dataLength, +int handleSignTransaction(uint8_t *dataBuffer, + uint16_t dataLength, volatile unsigned int *flags, - bool is_first_chunk, - bool more) { + bool is_first_chunk, + bool more) { if (is_first_chunk) { reset_app_context(); } diff --git a/src/slice_data.c b/src/slice_data.c index 6eb9f6e..8184186 100644 --- a/src/slice_data.c +++ b/src/slice_data.c @@ -5,15 +5,15 @@ void SliceData_init(struct SliceData_t* self, uint8_t* data, uint16_t data_size_bytes) { VALIDATE(self && data, ERR_SLICE_IS_EMPTY); - self->data = data; + self->data = data; self->data_window_start = 0; - self->data_window_end = data_size_bytes * 8; - self->data_size_bytes = data_size_bytes; + self->data_window_end = data_size_bytes * 8; + self->data_size_bytes = data_size_bytes; } void SliceData_from_cell(struct SliceData_t* self, struct Cell_t* cell) { - uint8_t* cell_data = Cell_get_data(cell); - uint8_t cell_data_size = Cell_get_data_size(cell); + uint8_t* cell_data = Cell_get_data(cell); + uint8_t cell_data_size = Cell_get_data_size(cell); SliceData_init(self, cell_data, cell_data_size); } @@ -49,8 +49,8 @@ uint8_t SliceData_get_bits(const struct SliceData_t* self, uint16_t offset, uint VALIDATE(bits != 0 && bits <= 8, ERR_RANGE_CHECK); uint16_t index = self->data_window_start + offset; - uint8_t q = index / 8; - uint8_t r = index % 8; + uint8_t q = index / 8; + uint8_t r = index % 8; if (r == 0) { return self->data[q] >> (8 - r - bits); } else if (bits <= (8 - r)) { @@ -94,7 +94,7 @@ uint64_t SliceData_get_int(const struct SliceData_t* self, uint8_t bits) { } uint64_t value = 0; - uint8_t bytes = bits / 8; + uint8_t bytes = bits / 8; for (uint8_t i = 0; i < bytes; ++i) { uint64_t byte = SliceData_get_byte(self, 8 * i); value |= byte << (8 * (7 - i)); @@ -119,8 +119,8 @@ uint64_t SliceData_get_next_size(struct SliceData_t* self, uint16_t max_value) { if (max_value == 0) { return 0; } - uint8_t bits = 16 - leading_zeros(max_value); - uint64_t res = SliceData_get_next_int(self, bits); + uint8_t bits = 16 - leading_zeros(max_value); + uint64_t res = SliceData_get_next_int(self, bits); return res; } @@ -130,7 +130,7 @@ bool SliceData_is_empty(const struct SliceData_t* self) { } bool SliceData_equal(const struct SliceData_t* self, const struct SliceData_t* other) { - uint32_t self_rb = SliceData_remaining_bits(self); + uint32_t self_rb = SliceData_remaining_bits(self); uint32_t other_rb = SliceData_remaining_bits(other); if (self_rb != other_rb) { return false; @@ -162,9 +162,9 @@ void SliceData_append(struct SliceData_t* self, uint8_t* in, uint16_t bits, bool if (offset % 8 == 0 || bytes == 0) { memcpy(self->data + offset / 8, in, bytes ? bytes : 1); } else { - uint8_t shift = offset % 8; + uint8_t shift = offset % 8; uint8_t first_data_byte = offset / 8; - uint8_t prev = 0; + uint8_t prev = 0; for (uint16_t i = first_data_byte, j = 0; j < bytes; ++i, ++j) { VALIDATE(i == (j + first_data_byte) && i < self->data_size_bytes, ERR_INVALID_DATA); diff --git a/src/utils.c b/src/utils.c index 042d914..737713a 100644 --- a/src/utils.c +++ b/src/utils.c @@ -9,7 +9,7 @@ void get_public_key(uint32_t account_number, uint8_t *publicKeyArray) { cx_ecfp_private_key_t privateKey; - cx_ecfp_public_key_t publicKey; + cx_ecfp_public_key_t publicKey; get_private_key(account_number, &privateKey); BEGIN_TRY { @@ -128,7 +128,7 @@ uint64_t readUint64BE(uint8_t *buffer) { } uint8_t leading_zeros(uint16_t value) { - uint8_t lz = 0; + uint8_t lz = 0; uint16_t msb = 0x8000; for (uint8_t i = 0; i < 16; ++i) { if ((value << i) & msb) { @@ -145,17 +145,17 @@ uint16_t format_hex(const uint8_t *in, size_t in_len, char *out, size_t out_len) return -1; } - const char hex[] = "0123456789abcdef"; - size_t i = 0; - int written = 0; + const char hex[] = "0123456789abcdef"; + size_t i = 0; + int written = 0; while (i < in_len && (i * 2 + (2 + 1)) <= out_len) { uint8_t high_nibble = (in[i] & 0xF0) >> 4; - *out = hex[high_nibble]; + *out = hex[high_nibble]; out++; uint8_t low_nibble = in[i] & 0x0F; - *out = hex[low_nibble]; + *out = hex[low_nibble]; out++; i++; @@ -169,28 +169,28 @@ uint16_t format_hex(const uint8_t *in, size_t in_len, char *out, size_t out_len) #define SCRATCH_SIZE 37 uint8_t convert_hex_amount_to_displayable(const uint8_t *amount, - uint8_t decimals, - uint8_t amount_length, - char *out) { - uint8_t LOOP1 = SCRATCH_SIZE - decimals; - uint8_t LOOP2 = decimals; + uint8_t decimals, + uint8_t amount_length, + char *out) { + uint8_t LOOP1 = SCRATCH_SIZE - decimals; + uint8_t LOOP2 = decimals; uint16_t scratch[SCRATCH_SIZE]; - uint8_t offset = 0; - uint8_t nonZero = 0; - uint8_t i; - uint8_t targetOffset = 0; - uint8_t workOffset; - uint8_t j; - uint8_t nscratch = SCRATCH_SIZE; - uint8_t smin = nscratch - 2; - uint8_t comma = 0; + uint8_t offset = 0; + uint8_t nonZero = 0; + uint8_t i; + uint8_t targetOffset = 0; + uint8_t workOffset; + uint8_t j; + uint8_t nscratch = SCRATCH_SIZE; + uint8_t smin = nscratch - 2; + uint8_t comma = 0; for (i = 0; i < SCRATCH_SIZE; i++) { scratch[i] = 0; } for (i = 0; i < amount_length; i++) { for (j = 0; j < 8; j++) { - uint8_t k; + uint8_t k; uint16_t shifted_in = (((amount[i] & 0xff) & ((1 << (7 - j)))) != 0) ? (short) 1 : (short) 0; for (k = smin; k < nscratch; k++) { @@ -212,7 +212,7 @@ uint8_t convert_hex_amount_to_displayable(const uint8_t *amount, if (!nonZero && (scratch[offset] == 0)) { offset++; } else { - nonZero = 1; + nonZero = 1; out[targetOffset++] = scratch[offset++] + '0'; } } @@ -234,7 +234,7 @@ uint8_t convert_hex_amount_to_displayable(const uint8_t *amount, } if (!comma) { out[targetOffset++] = '.'; - comma = 1; + comma = 1; } out[targetOffset++] = scratch[offset++] + '0'; } From c9e8b6ebe193f6424048a3b835fbee2d7fb5946e Mon Sep 17 00:00:00 2001 From: keiff3r Date: Thu, 13 Feb 2025 20:58:56 +0100 Subject: [PATCH 16/67] test: update golden snapshots for nanox --- .../00001.png | Bin 889 -> 915 bytes .../00002.png | Bin 498 -> 488 bytes .../00001.png | Bin 889 -> 915 bytes .../00002.png | Bin 498 -> 488 bytes .../00000.png | Bin 904 -> 933 bytes .../00001.png | Bin 556 -> 531 bytes .../00000.png | Bin 904 -> 933 bytes .../00001.png | Bin 556 -> 531 bytes .../snapshots/nanox/test_sign_message/00001.png | Bin 495 -> 487 bytes .../snapshots/nanox/test_sign_message/00002.png | Bin 443 -> 416 bytes .../nanox/test_sign_tx_confirm/00002.png | Bin 518 -> 502 bytes .../nanox/test_sign_tx_transfer/00003.png | Bin 872 -> 909 bytes .../nanox/test_sign_tx_transfer/00004.png | Bin 518 -> 506 bytes 13 files changed, 0 insertions(+), 0 deletions(-) diff --git a/tests/snapshots/nanox/test_get_address_wallet_v3_confirm_accepted/00001.png b/tests/snapshots/nanox/test_get_address_wallet_v3_confirm_accepted/00001.png index b0fb95c2cfac3c69ca7b1d8de2628c54755efe3e..22d76bffbe0c12d657b0c4e004cff6cd552dc00b 100644 GIT binary patch delta 892 zcmV-?1B3ke29pPnB!5~-L_t(|ob8%jlH4E+gh?tl;r>VBE_s*=#UiQI2=HuX^*wp8 zK(hEV?I|Tmk|arzBuPGr)>>}eyoKtp;nIqmPW=|ZtVf(!lqgWikI|F*N<&o=R2T>KF;*lnl6o*@da#{ z^@k)J-X^zZz_{Q}h11|-*4A!gy(vlq*KbFC1sGk7g-`C!AI1K9c>9?0`TQ@tLXsp& z@>BR_-3V(h(|_xlbpjY2F-Iy!+lifrdjLyP67Yq8F2m@WlMSyRT9Plg*bEia0wqj@ z%umT-ElBNWb%d6$lIIdugX3Lw7^)?VBhnZC$vhg0pbc0yYAt-t6ozfADvUAN!gDiV zY3ziN56~BA5P-D7&BlVc0qOvE|0HeHTIK5?ngmY#g0nXZ9aMNp)ubVX_b2 zNv=Zg#7T1Y!Bu2>O*OPvAO*$Og{u*&B}F^$FlSmUKw9lIPk&WCf(HSO@3J}}CWQp+ zDoZ7dv45q{OvbLVgd4{}u4c?X34_sH;Mr#>j@1CdO)*EXfJfXtpdG&hP-)5~Nf2?Ut8Rm&DfylY*!k$WYX}yrryS z-BQ~Rn7I+gLft(HO9heC`P90bmhuGT+PFckvKlJJ=>SVXWPFh7qh$#i#C}O#(^_+| z>UEAaJJsyG7PNE1X4FU3e&6+k^$o6jbX;28nJ@zSE`WUXNRlK;k|arz_wX0@fOf&- S=vuh|0000VRUGm@xMWL<5;&JBh?`evW zEU{RIwo4&|5JCtc$)!dFUNjYK7P2q<@$%^zKh={E?T;DkB%vh9Bb9A*4qB< zfBRl5{Mmj*AGHta-B4?_1_E!H%fa#8&XGI7T5kP-4*$wN%YUU;YgGq&@Rcn?2x)*I zLvP{W9WZ1JuKl?y^aE32<+#>o0| zY>@f`GM(Ncr|y8h;0}$$;zDX`v$1xH(jbi6P`3bmh`#a3=kr&wUJp+nQ@)@7<*7gj zA>^m<%lczldw&_WYwD(R2!tG|)C&%2I6?j7{p+iFB0UZJ4uR;JgN>yisylAg0Qr$h zHEi(>oPMQ(N;V(FvI-2(HGvqX)`t?^oAM$PUd_ePd91pJr{Nesvp5oJs8#Gzj$yB4 zWoRW^l{fm9-bR-4=>ct*y;lSHrU86K;Y|QIUK1S~N`GqK!`@(pmGx^qZzqC=X*~T# z>}H}CeU^=s$)s z)ExbX;T(JtR-sQ43^M27C~|lqHMH2;9->XQM!Ek(G|p6u6RT)jMo^0dL*N>445ALI zW|oa=nSYWk=ZyUfLxFQHpHOOT9Q-h=@y>%Tt_B`WBPT^T<)!4$gwjP7VGteEkFI*D zy3NGlc9B4gYrmyf=4g`zSYJ}VL>P<_i3XQ(ROQvOblg*T6R@t|E_xl(=`1Z4M4i#; zRQIc)?^idoZ<7vb@;8&u0JRaX%j?3bwdIv{9Dk1`eeV`Te4Ue82_b|KLVhf!8rtw* z(<53!!A{GdCAi^pG*QP)UO&6PR8zJ372^w;s^$lZrlAt)1VUV_Or)b_hKIvbl}xIk zi^pBueJ&8_viE$nUklnB$#=KD|H0>}U1!BcH4Dp>pX&T@fwwSXfV<;$N&TJ5e>&o# zV_Q%Bb+p=|N{N1?&^;CCRqD!0s=);KlGbqblsX?KXIZ{&^vl|(uI2>D!Ntp5&3{0d sdK=|z4UuO+Dvh~Vgb+dqA%wh|zg$ITr-G)ukpKVy07*qoM6N<$f@trxc>n+a diff --git a/tests/snapshots/nanox/test_get_address_wallet_v3_confirm_accepted/00002.png b/tests/snapshots/nanox/test_get_address_wallet_v3_confirm_accepted/00002.png index 79ec8e7d5f4668017394572679a188b792d1ef70..65e1c70c8d5979cf3076db3f830b5ceaf341ae27 100644 GIT binary patch delta 462 zcmV;<0Wtpa1Ly;gB!90-L_t(|obB0Ba)clZfMMF{O}PJ&yh|Up<4_VpU<2$p|M%2Y zL<|tbrUU>006fNZUDtK_PZ{N-+Ed-jZi6hdsCnNjDlH#lMg5~>9COY|YhHO=mRa#Q zKjAeR)CW*UV$Qi01^*FM>y-2IaPc#s3TQPOs%KLVrpB061AkpzE045pF{(9b-n424 zRLymc{ka;-;5x%y6&o5Hv6id>X~CkJ3#k`$`_`U@ZCky9JK%12nF?MxT^9BXE<2ld z^N+vg=@!1}E4Dg2C#VZuYdLL==!r$xc=M@NdwDyfRqzVQhpTrg4;Rt_AuRy_;7{;t zsG-~xyv3pMHFMlAvS5N|9hGU zCBzUzSSbJi0KnJSwr$%s|0Sb-RDZgA*?o|8lDhYk(P;Y^8SS4X<5+7gqwclkvQEb1 z{D!w^7(T#oCe~WDDELc;v`fyPhl_s$x`1|XL-%aM!lKOCVSk{z-^vp07H4TM%|%&n zK-XR8+@EWq4X!iXUA0q_BUZ{9P!bl^+9*dsw{Pv~*s|3tcmVc(x2fQn(`9APS6;srWPeTL>-0)V+qkjIETfI4_8s%?v_m0T;<+^ahtarE(q2m4|70CSypJoB zcfs6WdK|qo62*ShbNJ=ysdKhVVBE_s*=#UiQI2=HuX^*wp8 zK(hEV?I|Tmk|arzBuPGr)>>}eyoKtp;nIqmPW=|ZtVf(!lqgWikI|F*N<&o=R2T>KF;*lnl6o*@da#{ z^@k)J-X^zZz_{Q}h11|-*4A!gy(vlq*KbFC1sGk7g-`C!AI1K9c>9?0`TQ@tLXsp& z@>BR_-3V(h(|_xlbpjY2F-Iy!+lifrdjLyP67Yq8F2m@WlMSyRT9Plg*bEia0wqj@ z%umT-ElBNWb%d6$lIIdugX3Lw7^)?VBhnZC$vhg0pbc0yYAt-t6ozfADvUAN!gDiV zY3ziN56~BA5P-D7&BlVc0qOvE|0HeHTIK5?ngmY#g0nXZ9aMNp)ubVX_b2 zNv=Zg#7T1Y!Bu2>O*OPvAO*$Og{u*&B}F^$FlSmUKw9lIPk&WCf(HSO@3J}}CWQp+ zDoZ7dv45q{OvbLVgd4{}u4c?X34_sH;Mr#>j@1CdO)*EXfJfXtpdG&hP-)5~Nf2?Ut8Rm&DfylY*!k$WYX}yrryS z-BQ~Rn7I+gLft(HO9heC`P90bmhuGT+PFckvKlJJ=>SVXWPFh7qh$#i#C}O#(^_+| z>UEAaJJsyG7PNE1X4FU3e&6+k^$o6jbX;28nJ@zSE`WUXNRlK;k|arz_wX0@fOf&- S=vuh|0000VRUGm@xMWL<5;&JBh?`evW zEU{RIwo4&|5JCtc$)!dFUNjYK7P2q<@$%^zKh={E?T;DkB%vh9Bb9A*4qB< zfBRl5{Mmj*AGHta-B4?_1_E!H%fa#8&XGI7T5kP-4*$wN%YUU;YgGq&@Rcn?2x)*I zLvP{W9WZ1JuKl?y^aE32<+#>o0| zY>@f`GM(Ncr|y8h;0}$$;zDX`v$1xH(jbi6P`3bmh`#a3=kr&wUJp+nQ@)@7<*7gj zA>^m<%lczldw&_WYwD(R2!tG|)C&%2I6?j7{p+iFB0UZJ4uR;JgN>yisylAg0Qr$h zHEi(>oPMQ(N;V(FvI-2(HGvqX)`t?^oAM$PUd_ePd91pJr{Nesvp5oJs8#Gzj$yB4 zWoRW^l{fm9-bR-4=>ct*y;lSHrU86K;Y|QIUK1S~N`GqK!`@(pmGx^qZzqC=X*~T# z>}H}CeU^=s$)s z)ExbX;T(JtR-sQ43^M27C~|lqHMH2;9->XQM!Ek(G|p6u6RT)jMo^0dL*N>445ALI zW|oa=nSYWk=ZyUfLxFQHpHOOT9Q-h=@y>%Tt_B`WBPT^T<)!4$gwjP7VGteEkFI*D zy3NGlc9B4gYrmyf=4g`zSYJ}VL>P<_i3XQ(ROQvOblg*T6R@t|E_xl(=`1Z4M4i#; zRQIc)?^idoZ<7vb@;8&u0JRaX%j?3bwdIv{9Dk1`eeV`Te4Ue82_b|KLVhf!8rtw* z(<53!!A{GdCAi^pG*QP)UO&6PR8zJ372^w;s^$lZrlAt)1VUV_Or)b_hKIvbl}xIk zi^pBueJ&8_viE$nUklnB$#=KD|H0>}U1!BcH4Dp>pX&T@fwwSXfV<;$N&TJ5e>&o# zV_Q%Bb+p=|N{N1?&^;CCRqD!0s=);KlGbqblsX?KXIZ{&^vl|(uI2>D!Ntp5&3{0d sdK=|z4UuO+Dvh~Vgb+dqA%wh|zg$ITr-G)ukpKVy07*qoM6N<$f@trxc>n+a diff --git a/tests/snapshots/nanox/test_get_address_wallet_v3_confirm_refused/00002.png b/tests/snapshots/nanox/test_get_address_wallet_v3_confirm_refused/00002.png index 79ec8e7d5f4668017394572679a188b792d1ef70..65e1c70c8d5979cf3076db3f830b5ceaf341ae27 100644 GIT binary patch delta 462 zcmV;<0Wtpa1Ly;gB!90-L_t(|obB0Ba)clZfMMF{O}PJ&yh|Up<4_VpU<2$p|M%2Y zL<|tbrUU>006fNZUDtK_PZ{N-+Ed-jZi6hdsCnNjDlH#lMg5~>9COY|YhHO=mRa#Q zKjAeR)CW*UV$Qi01^*FM>y-2IaPc#s3TQPOs%KLVrpB061AkpzE045pF{(9b-n424 zRLymc{ka;-;5x%y6&o5Hv6id>X~CkJ3#k`$`_`U@ZCky9JK%12nF?MxT^9BXE<2ld z^N+vg=@!1}E4Dg2C#VZuYdLL==!r$xc=M@NdwDyfRqzVQhpTrg4;Rt_AuRy_;7{;t zsG-~xyv3pMHFMlAvS5N|9hGU zCBzUzSSbJi0KnJSwr$%s|0Sb-RDZgA*?o|8lDhYk(P;Y^8SS4X<5+7gqwclkvQEb1 z{D!w^7(T#oCe~WDDELc;v`fyPhl_s$x`1|XL-%aM!lKOCVSk{z-^vp07H4TM%|%&n zK-XR8+@EWq4X!iXUA0q_BUZ{9P!bl^+9*dsw{Pv~*s|3tcmVc(x2fQn(`9APS6;srWPeTL>-0)V+qkjIETfI4_8s%?v_m0T;<+^ahtarE(q2m4|70CSypJoB zcfs6WdK|qo62*ShbNJ=ysdKhV`4C@Yg(;H{zMvEbXzTly0kT$DvtwG7k>uVSO0Z4C@6f$IdXOY z4>^oJU)Huzowrx+k>OMBM!#!!|H%!pO3ngoSOA*vy-nk9tpx*uGy^YNoSYE!a_qL4 z%;>4{?dnWl47$ z?QxG)mTsD3as0=4Y3W~2B%Jc@z&yqtvd|sNBWkE>#OQREUwk~sQi&}$951CWM-)xf z9<|z1w^tfOKl>Z67Y# zW_$+r2l!YbE4WdJ83F*<1FH4HwoCBbo`Y9hT0GeXX9)gS8?6*%A(sGw8DkFqRFVCmLSMOHlZ@%?Xb0% zk>zG~q@pPeaQ)YnUYH#~siEo(+)0r_CWG2aRRWlG;xkW~T~7^VzP%*VTI_2<%;b`R zLJiOx2Jq`G#R>P;vh$Sl%(G(L9s9@AFlsTn= zl1uDg=KLpHk+;LI%dr{Y;o**MD*3WYUKB-96h-k3m}D%qB-m=TxAqUW4!#|zz?h2X zAtgyRRYOL8kSV(*Lag=%%){kR{JZT{owZC@)!C6S<`3rrWycJFlncCucfwb zZ+~RxQ7K|uS5Xs1DKRnzxH+eq247mQiMKeThDLPCA0~341&{$zCDGC3ho1P3g^G!KqwJpBI l(nGi?ilQirq9_jV7b0~ft1^{xcK`qY00>D%PDHLkV1nrn!bt!C delta 881 zcmV-%1CIQq2Z#rdB!5pyL_t(|ob8-lZtNfoh109P_yd$|uIA!O|1gH1@)`g@uo z{1{9eb29C96-7}LMNt&RalVr6TWjOj`@V5aQDH1pE0Fz!X|0W2&7IE{juk}n0RJ+L zJ6o3HzVBVjN+NcT_}ZEG$5_*9Me?0#Y|(ACHq@p0OjI5xrhhsH*H^E)Hz+84Xmjkj z19-@3^!2iC3w87M$~`iC%H8O9Meo1)hFE2f0|FL+CVX#V{;joSK$y+IZp*VL1Raju z7Q&1kh<35Jw-2X7PzU&oaVMWRW%jJvYVU4)&;e?SMsA|MzHU?z$q65YaQL3f)j*ez zNZE714+kV&*ME-X%lGhF2s(+iK)a4FndZOw4#3;LD2k#$&j2-sV!co;Q592=KaBaS zs>bkzmz@pcBQ92fR15KZQ;4)T{6TbR>0elDR5N`m{Z|K?3mKcqv8>@N-bq8PO+m`* z2M(wf`4<2JM+@4nJ>jvi@cGu;f{m|VW*i3ybyo$P+JDuO)j5Rc+|B-|a$+uHAsCbt zHp0His-fhwhYae+d7QoG0M##kGT1lM37AE&fHVp+E-!+jb z52vASqAA95=fztH($FWKBE=f909fp#eDFTygEy(wf0J7MHje?l|tPb73 zifSGheN>Fth97T<57-iB6yE`{<>Ti$x0*FezPYGxeT|vN!w>XS2#QTLqgkGpZ?~}Q z05=ZKZ&bD{&6byL_-z^}?^mr%S~NfZ#43uSD2k#eiUs}ySJ*h?Qe!(@PjAOTOE|9fgZ z5Rpq%ObGx0066YzrE<<${(D`QU9u`54|WSUzuS$O!j*uT-vDvlt|* zTb<Gra0n^C4MKjmkoa#v|+J6p9`mYS(8uc|vRcKPnF#(w~7KMk9)E?@=tIj^Dg zm$odbNhixEkrw`r53}D2ZPEAz48V=k8&&+#s*BG#FJ=SJx{19BrH~YKICpERW|Tza z%qh1gr#*B!BZsL_t(|ob8!Ga>F1DMQNuu@%@j)UApiL!+<1Y1SDzSTP2Q= zWl4MpP6+@2007`PUy;E%=lbh)UAARoP+t@coPMUsITu&uS%yK@HnoR2z9WO1Xo5~w zrPWE@Jz|#Y*bJNA{t-Ws!6GHlzFV~}OI>T%PbC({wikaj3V*EqGz=rof*Ih)`3xmr z+O%kzuC`B=EZoK8$qG=3HoVB+@15WlzP;d9PGHSo-vwTn<%B0-0>TcZi12$2(y zaj?K5M2>t9TfVe+%c2LRhP*s|piC=|!`6?gkl|u}^zDrz@ zLjMEa9And!7JsRE+{tSs=p)p1RTo)@ZH_U5ayP27fpaS66Ypop2@MdnTObxa|dI10c00000000000000000000006e}3*`Ic VLU$jlCky}p002ovPDHLkV1nMS_w4`x diff --git a/tests/snapshots/nanox/test_get_public_key_confirm_refused/00000.png b/tests/snapshots/nanox/test_get_public_key_confirm_refused/00000.png index a63f85f1db8b849a5dcbea69fdefdc20a1688f58..0633ead3d2b5df3b86c3e77b3eb3c3e301f7bef6 100644 GIT binary patch delta 911 zcmV;A191F^2c-v)B!6s4L_t(|ob8%XlH4E+M4eP_;`<+oyX0dk6osT#gJiS2(fb-R zfCUH{wS8ShQ4~c{6h-kmzk=;sYvbj8-?-*fVJuWDko|1aS{u8Pol6VH3RCk9en%R2 zQl{g+@2qJhnY?GZ>`4C@Yg(;H{zMvEbXzTly0kT$DvtwG7k>uVSO0Z4C@6f$IdXOY z4>^oJU)Huzowrx+k>OMBM!#!!|H%!pO3ngoSOA*vy-nk9tpx*uGy^YNoSYE!a_qL4 z%;>4{?dnWl47$ z?QxG)mTsD3as0=4Y3W~2B%Jc@z&yqtvd|sNBWkE>#OQREUwk~sQi&}$951CWM-)xf z9<|z1w^tfOKl>Z67Y# zW_$+r2l!YbE4WdJ83F*<1FH4HwoCBbo`Y9hT0GeXX9)gS8?6*%A(sGw8DkFqRFVCmLSMOHlZ@%?Xb0% zk>zG~q@pPeaQ)YnUYH#~siEo(+)0r_CWG2aRRWlG;xkW~T~7^VzP%*VTI_2<%;b`R zLJiOx2Jq`G#R>P;vh$Sl%(G(L9s9@AFlsTn= zl1uDg=KLpHk+;LI%dr{Y;o**MD*3WYUKB-96h-k3m}D%qB-m=TxAqUW4!#|zz?h2X zAtgyRRYOL8kSV(*Lag=%%){kR{JZT{owZC@)!C6S<`3rrWycJFlncCucfwb zZ+~RxQ7K|uS5Xs1DKRnzxH+eq247mQiMKeThDLPCA0~341&{$zCDGC3ho1P3g^G!KqwJpBI l(nGi?ilQirq9_jV7b0~ft1^{xcK`qY00>D%PDHLkV1nrn!bt!C delta 881 zcmV-%1CIQq2Z#rdB!5pyL_t(|ob8-lZtNfoh109P_yd$|uIA!O|1gH1@)`g@uo z{1{9eb29C96-7}LMNt&RalVr6TWjOj`@V5aQDH1pE0Fz!X|0W2&7IE{juk}n0RJ+L zJ6o3HzVBVjN+NcT_}ZEG$5_*9Me?0#Y|(ACHq@p0OjI5xrhhsH*H^E)Hz+84Xmjkj z19-@3^!2iC3w87M$~`iC%H8O9Meo1)hFE2f0|FL+CVX#V{;joSK$y+IZp*VL1Raju z7Q&1kh<35Jw-2X7PzU&oaVMWRW%jJvYVU4)&;e?SMsA|MzHU?z$q65YaQL3f)j*ez zNZE714+kV&*ME-X%lGhF2s(+iK)a4FndZOw4#3;LD2k#$&j2-sV!co;Q592=KaBaS zs>bkzmz@pcBQ92fR15KZQ;4)T{6TbR>0elDR5N`m{Z|K?3mKcqv8>@N-bq8PO+m`* z2M(wf`4<2JM+@4nJ>jvi@cGu;f{m|VW*i3ybyo$P+JDuO)j5Rc+|B-|a$+uHAsCbt zHp0His-fhwhYae+d7QoG0M##kGT1lM37AE&fHVp+E-!+jb z52vASqAA95=fztH($FWKBE=f909fp#eDFTygEy(wf0J7MHje?l|tPb73 zifSGheN>Fth97T<57-iB6yE`{<>Ti$x0*FezPYGxeT|vN!w>XS2#QTLqgkGpZ?~}Q z05=ZKZ&bD{&6byL_-z^}?^mr%S~NfZ#43uSD2k#eiUs}ySJ*h?Qe!(@PjAOTOE|9fgZ z5Rpq%ObGx0066YzrE<<${(D`QU9u`54|WSUzuS$O!j*uT-vDvlt|* zTb<Gra0n^C4MKjmkoa#v|+J6p9`mYS(8uc|vRcKPnF#(w~7KMk9)E?@=tIj^Dg zm$odbNhixEkrw`r53}D2ZPEAz48V=k8&&+#s*BG#FJ=SJx{19BrH~YKICpERW|Tza z%qh1gr#*B!BZsL_t(|ob8!Ga>F1DMQNuu@%@j)UApiL!+<1Y1SDzSTP2Q= zWl4MpP6+@2007`PUy;E%=lbh)UAARoP+t@coPMUsITu&uS%yK@HnoR2z9WO1Xo5~w zrPWE@Jz|#Y*bJNA{t-Ws!6GHlzFV~}OI>T%PbC({wikaj3V*EqGz=rof*Ih)`3xmr z+O%kzuC`B=EZoK8$qG=3HoVB+@15WlzP;d9PGHSo-vwTn<%B0-0>TcZi12$2(y zaj?K5M2>t9TfVe+%c2LRhP*s|piC=|!`6?gkl|u}^zDrz@ zLjMEa9And!7JsRE+{tSs=p)p1RTo)@ZH_U5ayP27fpaS66Ypop2@MdnTObxa|dI10c00000000000000000000006e}3*`Ic VLU$jlCky}p002ovPDHLkV1nMS_w4`x diff --git a/tests/snapshots/nanox/test_sign_message/00001.png b/tests/snapshots/nanox/test_sign_message/00001.png index db58d4271e08ae84259d65e743b146b6eeb34040..35838d9c37a584b925b90214d8dc68ffcdc03d96 100644 GIT binary patch delta 461 zcmV;;0W$vY1Lp&fB!8|+L_t(|obA|Aa)lraKvCLxJ8}O@axeXG9>YM0P$FUQp0Ao# zzyv800ssI2Fx`(~TjzORKODzVi?}<_Gabw|!dgUpBHL&AHEe5rF`?pRlx9DxgmTya zd<@%)u4y6;G!2%|)*cB`B9uSYN1_bxX;a^TIH$x+We=Q2j(@LEBrg3My^CzMDSK=o zj$y~8;zCr;^fYnT#4J-;tAv;!t9;om_oAnk zpxeA>zf#s8UA9tn4pV5YF=%Dp5){6ZU76HMq&69|*2FHd-o=F0-mM@lhU@IA-DD+E zDx};s-tV|~eSZg-%v{^)Z}}xWS#3WG0I;ENHl|%}6X{bnH}f*9#|9BmbsHM*PaB$W z8KnKp9+7TdZ$K@$MU?q?hbZP)#z~pGHVE*`JIWcw!au z#Q$MWed&GfQ1H!>R_RF@5vxeI@@69AkrYP}&M1I03P#|J0yv`p00013%xdR|dqi5T zc8<75q}yuehdRRwUL{&%I*0W6$#}Kb6Oq5p}M*g?-7?u6_t4S%T>B^w2z#mb|H4av5a3+_lxRtq8n5Qa_*?(_9?!0>CRas>u{W-+t zmB-kpkV8Dl<-x{vwMKau1!vxGfGVdp7D#u;oH<2zl&7kD)I2wmyS@QsMm2jX9PLTZ zk!n#_)XS(&VQ3{+x19&w%Q>(GwKiy#z5m#%oyuR~Q07OnIfI6&E$BL5UeSlPy%>?! zlBu$(r|_2~(|-;nvG4gZBDdLR*U$%5vu1QCq@E9D;5ne_k(Jv`(s>eIto3^o0I-_8 zi4&QRcwNJ)--SdbBg5oiBJ+_F&jG<`Krk8*j0Oa&8!&atMo(vYnf(Qtlg#Wdqf9lk zzZgA;#4Z$x`*5VO>D}!;;yWT8}fKvAZeo8JY8J#85|{(l6K_wt(lEz0G5MQhW{ zxn&2a@`yV-qs&gfL`>YG)1=x}og=}V{REW7M=eBhrI(3Ii&v(yH4|!f29q^1Pln}Q zbyo>G&3pA#r~dR+mFl0vR9dN>+;F1DKvCN1PT2pF*h@d0G7NekJ2C1c_k6X) z7D7B6rxXAH0ARZ>|Krx$@kg!IYRPrvb1j+Wy{)z7z{enJx%}L|FXa6pdNqqt~pwDr+4v888sK!2Zhb>ve{V@v&0MBT@0 z{4V4zk>K)TXI$pUW1O51(H)@bah;tZ*V;0tco)mNB3YdcJ8dcFkq{Bu0b@8dbR87C z=)GlH)Dv|KQx^^^xO(iwMQ*te_QVln9ndQO{P9gERXoE}kuOJZ{&gBHPaQ!=XMIH% z?Raroto1TQQ-8aNrzFFk3Nq#2x0e%Np0uxBMt7O2=FCt^J~sv7J;3y;W$VXTya{h+ zeIEq?yfgW2VQ0&yJIWz{LEO`V2mjUS?v^aP2P9(xk}(0vn1E#S1pJ?;(_31Um+Eg| z7MbdAqm-KJZ^j&C;uOlnb2t;_1poj5000000000002%-Q0B-XOf02hk^To6g00000 LNkvXXu0mjfBfP>M diff --git a/tests/snapshots/nanox/test_sign_tx_confirm/00002.png b/tests/snapshots/nanox/test_sign_tx_confirm/00002.png index cc3d151dfdcadd1c20874bf522d917db45ba42ac..4668646d53df70e2628c6853fd15411d9d3c9b46 100644 GIT binary patch delta 476 zcmV<20VDo~1oi`vB!9h0L_t(|obB0LZp0uAK+&}7PT2pF*h@d6B4lIYfFbGVp073o z#=~n8avT5v0Kj%%QGs&K;z~*>D)_K7tKm$V)hA=Fm2=i3@nH$XHt`b`s43^1QYurX z&b!Q@x=gvQOE&8st(A9FlT^%B(Tdf&j?-yt(sy`7L3G?nTz@}%LDwyXt-7Uy>Q6;Q zk%_N`LEkuGTk>6Dzj;S-_459xHa z`|eOXEm@t|Jbww$C8GwwIXPzHM}>_%3lb-bw@NmjjGBj(*14&5z}d;66Q>zgS1%1M zI;v~S6_LL5=^*SXx%gg%L+3o`?!2ewSl4tjluyc}bOFL!@5<7VLo_hUS zC6}f#VB4{4%m9czx|6-X%-35#F;octg|7{H|kY? z$$tIW%uc5Fw`p`Wy}ub_@FaGjCtY+hW3Uw63jhEB000000000000000Eb|Kj^0000dd5i&Ly^Ql_hGt9FM z4+u#}2><{9xb9woVkw7DhN$}Iy_|0)ti zPyDTS(ln_FKO`<3-t9Nx;Uoe%&300FMkQ0u59HQ$q+m%M(Y`hJ<3lZ?(q zwIQ|V&YFR+)PEd#sXd(2dGi&o+v1337^&upI>S=VUjsE)!mRGK;vZuEvy?W{zbLFj zx|J?X)r^Jtxenv3Q(R}RKT@@(3}qW~*7WDDkQ1Q(H|I9GzKM$~ zZ_}czdePsdshTTITm9)}an^c)ImnFuHOf#k`j;^WzlmMwHw^}vIXH^p1poj500000 i0000000000j`;@Fv)->{(Iwje0000f}gwgUQ-2X^(7ayjiQY0iD{#Muio|MUu zOn?CGmZcCv2qAhYq~Z@=9goG z)E|)P@D@3>0%XDM8oSAb)YfJ*Iw@*{&~L*$0!SCK@#g;gRjk*;)7O;m=U>?s2qA?0 zFZ}QyBWEvp#((eZ!)vO%H0a*Cx3r}n+vxIv#1OjEZ|O$UCIP5uj?CV_YDve}ByhDZ zj4kU3@vqq2}TD{D1iYm|HjghPfVtnc1Rd!1^*e zC`Tjgs#^DB*pmICSAcv+mrGqq*Fknpq(z2=m^sHsBuL$e^c)Nc^`;99lg#X2!$>u= ze;JO!Ct(%(Bteon21n89h1AgEUVM<2)(HN9$3L!(qVl_Pj*?E;W=P2GZ?g=Q()>mu zfhi=I#(ybgahHl07PFz-hZ02X$I0*i;hl9%IV6%F$|IrLI@#* zNCGwVC8af*mZmn~OBbmV@aT}9RaG4u#4L4KM*+3Q6)DjXES(mle^69NiLZ`LD(siZ zn=r1HfKuW#qyBX}GM7{H-M0aO#5ldaM!yv6!g4A@*-?U0mB)!$UZKP9GOO-1kQ|Nt zsBb7GCF&0Ge_WgXZ1cr1r~Z(H9>XPaP>egRZjSnQ{31h$+l1jEX2<`ph*UIN`oADy zhTwi@_JGl**Pe#Kb(SfCb0wi&*#3byjJ7qJvF$vG5<&U3XUh*+Y2Z3EK40J1#I$tBk zfO#2Hb9GA*LI@#*5aOG-uIsuk{wrX=%OBibTXOxutGQf56LIi-fC<@Ii;qncz! z=kZX2Gj}&NelUG7og_UEqs6HO$eohJMl1fMon!O??0*SRi{zjjJxh8Fulum#d4B@N zw#Go&+N48`NtlUZ8+=cgVG8_^;0=fA&bwWLrIOzC0PZAf_8-HTYR&$`Xbs*(QRq#A zN!A)1Wt`qv4Q0|ktUmH8rdiT{<^ADF=o?m8!$FlMv+T@F_x5Jze>?C>z`03Cq@HnS zxkbX98h;cXCRTPm-h2u3Tf=<6y#8#y+4&OYyDY>5(hC|Z@*LyXY!_3`bnOH87|+=S z@T5MVPZsvkqjvbGmoeLSx3idvD0fGtC)Pt z>q-O*a5_q!Q#Wz@pkHz&cKtSxPeZ{k>0ufg24#?j&X$<%o8?|U+Brj-6=(K@5JCtc bgm|CduP0i=?|9U200000NkvXXu0mjfeAB1X diff --git a/tests/snapshots/nanox/test_sign_tx_transfer/00004.png b/tests/snapshots/nanox/test_sign_tx_transfer/00004.png index de482ce9030dc045f9746bdfca8f23a8232aa454..bf2a3759c3164d526955f4c523a1a9501da0f447 100644 GIT binary patch delta 480 zcmV<60U!Q`1o{JzB!9t4L_t(|obB0La)lrafMMF{PT2pF+)E$YahO0t#Kfb{|2?&c zfZ?jA6aWAK;5D{w+qTVr$;cno9#NOwhCWYH^S(0*Z670}{G<9f)>_M`d2M>1C*yH` z!b>y^A7D5VYpq%o{3%1)CFkwo;%9&esF)4n*@lTl8MDJci+_9j6s?M*v`KSP)(jBM zb&mbD658N8!!5EM8XU1w_JESGsn$lB1>LUN)3D2Suiy^Y+ube&e`|W5*)zE8)qJ}C z_)A`H;YnYy#o24ZaHG??zp1=jNC$+p1OR}4!N<^@ zcJ`mXyS8r1_rhk5OZu#IK>Av9mC& z+CDRGAI_xxwd+tLA4&U+uKf}s{&h|u?H1?k8P?kt)u%kh@Hw>zdX^wNzIOTAC4V`2 z9gy`kG?uY*I&Uw{EVKqNgIeE|G1m z!G}!3d#kzmR%(!m{$&QCCi)kn4?c-i=#wTvrVmmPUH||9000000000000000Ak8nt Whw!{vzu52q0000o#MH?y!geb!90IDc1{c$c`#dubl3dILnb z$-ckV!kpY>x<$2Honx<(IiM9xs(sR~k{(|=6WFoYYx4tm#XS!Ne`C6?oatQgXnr~V zCNhV01s7d zMJy=oN5LkjK6J82AKH%AZ>#wU>YaEuBl#`4e9M{f@D047!22B|7=p}yGmXzOvBedV z8+n;AFr(xRxYe_sH@mZ1wj{sb2?4(Hp#8aK&g{}?0HWdAUp!8 Date: Thu, 13 Feb 2025 21:05:00 +0100 Subject: [PATCH 17/67] style: update .clang-format and format C codebase --- .clang-format | 7 ++++ fuzz/ux.h | 2 +- src/apdu_constants.h | 47 +++++++++++++++------- src/byte_stream.h | 4 +- src/cell.h | 12 +++--- src/contract.h | 40 +++++++++---------- src/errors.h | 36 ++++++++--------- src/globals.h | 94 ++++++++++++++++++++++---------------------- src/slice_data.h | 22 +++++------ src/utils.h | 27 +++++++------ 10 files changed, 160 insertions(+), 131 deletions(-) diff --git a/.clang-format b/.clang-format index c70f6aa..d20cb81 100644 --- a/.clang-format +++ b/.clang-format @@ -24,3 +24,10 @@ BreakConstructorInitializersBeforeComma: true ReflowComments: false SpaceBeforeParens: ControlStatements AlwaysBreakAfterReturnType: None +IndentCaseLabels: true +AllowShortEnumsOnASingleLine: false +BreakStringLiterals: true +IndentWrappedFunctionNames: false +KeepEmptyLinesAtTheStartOfBlocks: false +AlignTrailingComments: true +SortUsingDeclarations: false diff --git a/fuzz/ux.h b/fuzz/ux.h index 65fec9e..af11ba5 100644 --- a/fuzz/ux.h +++ b/fuzz/ux.h @@ -1,4 +1,4 @@ #pragma once -#define bagl_element_t int +#define bagl_element_t int #define cx_ecfp_private_key_t int diff --git a/src/apdu_constants.h b/src/apdu_constants.h index cfefca3..6256739 100644 --- a/src/apdu_constants.h +++ b/src/apdu_constants.h @@ -9,24 +9,43 @@ #include "cx.h" #include "os_io_seproxyhal.h" -#define CLA 0xE0 +#define CLA 0xE0 #define INS_GET_APP_CONFIGURATION 0x01 -#define INS_GET_PUBLIC_KEY 0x02 -#define INS_SIGN 0x03 -#define INS_GET_ADDRESS 0x04 -#define INS_SIGN_TRANSACTION 0x05 +#define INS_GET_PUBLIC_KEY 0x02 +#define INS_SIGN 0x03 +#define INS_GET_ADDRESS 0x04 +#define INS_SIGN_TRANSACTION 0x05 -#define OFFSET_CLA 0 -#define OFFSET_INS 1 -#define OFFSET_P1 2 -#define OFFSET_P2 3 -#define OFFSET_LC 4 +#define OFFSET_CLA 0 +#define OFFSET_INS 1 +#define OFFSET_P1 2 +#define OFFSET_P2 3 +#define OFFSET_LC 4 #define OFFSET_CDATA 5 -void handleGetAppConfiguration(uint8_t p1, uint8_t p2, uint8_t *dataBuffer, uint16_t dataLength, volatile unsigned int *flags, volatile unsigned int *tx); -void handleGetPublicKey(uint8_t p1, uint8_t p2, uint8_t *dataBuffer, uint16_t dataLength, volatile unsigned int *flags, volatile unsigned int *tx); -void handleGetAddress(uint8_t p1, uint8_t p2, uint8_t *dataBuffer, uint16_t dataLength, volatile unsigned int *flags, volatile unsigned int *tx); +void handleGetAppConfiguration(uint8_t p1, + uint8_t p2, + uint8_t *dataBuffer, + uint16_t dataLength, + volatile unsigned int *flags, + volatile unsigned int *tx); +void handleGetPublicKey(uint8_t p1, + uint8_t p2, + uint8_t *dataBuffer, + uint16_t dataLength, + volatile unsigned int *flags, + volatile unsigned int *tx); +void handleGetAddress(uint8_t p1, + uint8_t p2, + uint8_t *dataBuffer, + uint16_t dataLength, + volatile unsigned int *flags, + volatile unsigned int *tx); void handleSign(uint8_t *dataBuffer, uint16_t dataLength, volatile unsigned int *flags); -int handleSignTransaction(uint8_t *dataBuffer, uint16_t dataLength, volatile unsigned int *flags, bool is_first_chunk, bool more); +int handleSignTransaction(uint8_t *dataBuffer, + uint16_t dataLength, + volatile unsigned int *flags, + bool is_first_chunk, + bool more); #endif diff --git a/src/byte_stream.h b/src/byte_stream.h index 6b5144c..6b71a97 100644 --- a/src/byte_stream.h +++ b/src/byte_stream.h @@ -9,9 +9,9 @@ typedef struct ByteStream_t { uint8_t* data; } ByteStream_t; -void ByteStream_init(struct ByteStream_t* self, uint8_t* data, uint16_t data_size); +void ByteStream_init(struct ByteStream_t* self, uint8_t* data, uint16_t data_size); uint8_t* ByteStream_read_data(struct ByteStream_t* self, uint32_t data_size); -uint8_t ByteStream_read_byte(struct ByteStream_t* self); +uint8_t ByteStream_read_byte(struct ByteStream_t* self); uint32_t ByteStream_read_u32(struct ByteStream_t* self); uint8_t* ByteStream_get_cursor(struct ByteStream_t* self); uint16_t ByteStream_get_length(struct ByteStream_t* self); diff --git a/src/cell.h b/src/cell.h index 28fa859..c72c407 100644 --- a/src/cell.h +++ b/src/cell.h @@ -4,7 +4,7 @@ #include #include -#define CELL_DATA_OFFSET 2 +#define CELL_DATA_OFFSET 2 #define MAX_REFERENCES_COUNT 4 typedef struct Cell_t { @@ -12,14 +12,14 @@ typedef struct Cell_t { uint16_t cell_length; } Cell_t; -void Cell_init(struct Cell_t* self, uint8_t* cell_begin, uint16_t cell_length); -uint8_t Cell_get_d1(const struct Cell_t* self); -uint8_t Cell_get_d2(const struct Cell_t* self); -uint8_t Cell_get_data_size(const struct Cell_t* self); +void Cell_init(struct Cell_t* self, uint8_t* cell_begin, uint16_t cell_length); +uint8_t Cell_get_d1(const struct Cell_t* self); +uint8_t Cell_get_d2(const struct Cell_t* self); +uint8_t Cell_get_data_size(const struct Cell_t* self); uint8_t* Cell_get_data(const struct Cell_t* self); uint8_t* Cell_get_refs(const struct Cell_t* self, uint8_t* refs_count); uint16_t Cell_bit_len(struct Cell_t* self); uint16_t deserialize_cell(struct Cell_t* cell, const uint8_t cell_index, const uint8_t cells_count); -void calc_cell_hash(Cell_t* cell, const uint8_t cell_index); +void calc_cell_hash(Cell_t* cell, const uint8_t cell_index); #endif diff --git a/src/contract.h b/src/contract.h index 80b8d2e..e76c640 100644 --- a/src/contract.h +++ b/src/contract.h @@ -6,28 +6,28 @@ #include #include -#define SIGN_TRANSACTION_FLOW_ERROR -1 +#define SIGN_TRANSACTION_FLOW_ERROR -1 #define SIGN_TRANSACTION_FLOW_TRANSFER 0 -#define SIGN_TRANSACTION_FLOW_DEPLOY 1 -#define SIGN_TRANSACTION_FLOW_CONFIRM 2 -#define SIGN_TRANSACTION_FLOW_BURN 3 +#define SIGN_TRANSACTION_FLOW_DEPLOY 1 +#define SIGN_TRANSACTION_FLOW_CONFIRM 2 +#define SIGN_TRANSACTION_FLOW_BURN 3 enum { - WALLET_V3 = 0, - EVER_WALLET = 1, - SAFE_MULTISIG_WALLET = 2, - SAFE_MULTISIG_WALLET_24H = 3, - SETCODE_MULTISIG_WALLET = 4, - BRIDGE_MULTISIG_WALLET = 5, - SURF_WALLET = 6, - MULTISIG_2 = 7, - MULTISIG_2_1 = 8, + WALLET_V3 = 0, + EVER_WALLET = 1, + SAFE_MULTISIG_WALLET = 2, + SAFE_MULTISIG_WALLET_24H = 3, + SETCODE_MULTISIG_WALLET = 4, + BRIDGE_MULTISIG_WALLET = 5, + SURF_WALLET = 6, + MULTISIG_2 = 7, + MULTISIG_2_1 = 8, }; enum { - MULTISIG_DEPLOY_TRANSACTION = 1813932348, - MULTISIG_SEND_TRANSACTION = 1290691692, - MULTISIG_SUBMIT_TRANSACTION = 320701133, + MULTISIG_DEPLOY_TRANSACTION = 1813932348, + MULTISIG_SEND_TRANSACTION = 1290691692, + MULTISIG_SUBMIT_TRANSACTION = 320701133, MULTISIG_CONFIRM_TRANSACTION = 447168749, MULTISIG2_DEPLOY_TRANSACTION = 733015951, @@ -35,14 +35,14 @@ enum { }; enum { - TOKEN_BURN = 1445284013, // Burn - TOKEN_TRANSFER = 1944199491, // Deploy + TOKEN_BURN = 1445284013, // Burn + TOKEN_TRANSFER = 1944199491, // Deploy TOKEN_TRANSFER_TO_WALLET = 1185535980, // Ordinary transfer }; enum { - NORMAL_FLAG = 3, - ALL_BALANCE_FLAG = 128, + NORMAL_FLAG = 3, + ALL_BALANCE_FLAG = 128, ALL_BALANCE_AND_DELETE_FLAG = 160 }; diff --git a/src/errors.h b/src/errors.h index b6b5ef9..4c8eb1e 100644 --- a/src/errors.h +++ b/src/errors.h @@ -2,27 +2,27 @@ #define _ERRORS_H_ enum { - SUCCESS = 0x9000, - ERR_INVALID_DATA = 0x6B00, - ERR_CELL_UNDERFLOW = 0x6B01, - ERR_RANGE_CHECK = 0x6B02, - ERR_WRONG_LABEL = 0x6B03, - ERR_INVALID_FLAG = 0x6B04, - ERR_END_OF_STREAM = 0x6B05, - ERR_SLICE_IS_EMPTY = 0x6B06, - ERR_INVALID_KEY = 0x6B07, - ERR_CELL_IS_EMPTY = 0x6B08, - ERR_INVALID_HASH = 0x6B09, - ERR_INVALID_CELL_INDEX = 0x6B10, - ERR_INVALID_REQUEST = 0x6B11, + SUCCESS = 0x9000, + ERR_INVALID_DATA = 0x6B00, + ERR_CELL_UNDERFLOW = 0x6B01, + ERR_RANGE_CHECK = 0x6B02, + ERR_WRONG_LABEL = 0x6B03, + ERR_INVALID_FLAG = 0x6B04, + ERR_END_OF_STREAM = 0x6B05, + ERR_SLICE_IS_EMPTY = 0x6B06, + ERR_INVALID_KEY = 0x6B07, + ERR_CELL_IS_EMPTY = 0x6B08, + ERR_INVALID_HASH = 0x6B09, + ERR_INVALID_CELL_INDEX = 0x6B10, + ERR_INVALID_REQUEST = 0x6B11, ERR_INVALID_FUNCTION_ID = 0x6B12, ERR_INVALID_SRC_ADDRESS = 0x6B13, - ERR_INVALID_WALLET_ID = 0x6B14, + ERR_INVALID_WALLET_ID = 0x6B14, ERR_INVALID_WALLET_TYPE = 0x6B15, - ERR_TICKER_LENGTH = 0x6B16, - ERR_INVALID_CELL = 0x6B17, - ERR_INVALID_CONTRACT = 0x6B18, - ERR_INVALID_MESSAGE = 0x6B19, + ERR_TICKER_LENGTH = 0x6B16, + ERR_INVALID_CELL = 0x6B17, + ERR_INVALID_CONTRACT = 0x6B18, + ERR_INVALID_MESSAGE = 0x6B19, }; #endif diff --git a/src/globals.h b/src/globals.h index ae82278..95e8a89 100644 --- a/src/globals.h +++ b/src/globals.h @@ -8,45 +8,45 @@ #include "errors.h" #include "cell.h" -#define P1_CONFIRM 0x01 +#define P1_CONFIRM 0x01 #define P1_NON_CONFIRM 0x00 #define P2_EXTEND 0x01 -#define P2_MORE 0x02 +#define P2_MORE 0x02 -#define PUBLIC_KEY_LENGTH 32 -#define ADDRESS_LENGTH 32 +#define PUBLIC_KEY_LENGTH 32 +#define ADDRESS_LENGTH 32 #define TRANSACTION_ID_LENGTH 8 -#define BIP32_PATH 5 -#define AMOUNT_LENGHT 16 -#define TO_SIGN_LENGTH 32 -#define SIGN_MAGIC_LENGTH 4 -#define CHAIN_ID_LENGTH 4 -#define SIGNATURE_LENGTH 64 -#define HASH_SIZE 32 -#define MAX_ROOTS_COUNT 1 - -#define PRUNED_BRANCH_D1 0b00101000 +#define BIP32_PATH 5 +#define AMOUNT_LENGHT 16 +#define TO_SIGN_LENGTH 32 +#define SIGN_MAGIC_LENGTH 4 +#define CHAIN_ID_LENGTH 4 +#define SIGNATURE_LENGTH 64 +#define HASH_SIZE 32 +#define MAX_ROOTS_COUNT 1 + +#define PRUNED_BRANCH_D1 0b00101000 #define PRUNED_BRANCH_DATA_SIZE 36 #define MAX_TICKER_LEN 10 -#define MAX_DATA_LEN 1024 +#define MAX_DATA_LEN 1024 #define WALLET_ID 0x4BA92D8A -#define MAX_CONTRACT_CELLS_COUNT 7 -#define HASHES_BUFFER_SIZE (MAX_CONTRACT_CELLS_COUNT * HASH_SIZE) -#define MAX_PUBLIC_KEY_CELL_DATA_SIZE 36 // label(3) + public key(32) + tag(1) +#define MAX_CONTRACT_CELLS_COUNT 7 +#define HASHES_BUFFER_SIZE (MAX_CONTRACT_CELLS_COUNT * HASH_SIZE) +#define MAX_PUBLIC_KEY_CELL_DATA_SIZE 36 // label(3) + public key(32) + tag(1) -#define FLAG_WITH_WALLET_ID 0x01 +#define FLAG_WITH_WALLET_ID 0x01 #define FLAG_WITH_WORKCHAIN_ID 0x02 -#define FLAG_WITH_ADDRESS 0x04 -#define FLAG_WITH_CHAIN_ID 0x08 +#define FLAG_WITH_ADDRESS 0x04 +#define FLAG_WITH_CHAIN_ID 0x08 void reset_app_context(void); typedef struct BocContext_t { - Cell_t cells[MAX_CONTRACT_CELLS_COUNT]; + Cell_t cells[MAX_CONTRACT_CELLS_COUNT]; uint8_t hashes[HASHES_BUFFER_SIZE]; uint8_t cell_depth[MAX_CONTRACT_CELLS_COUNT]; uint8_t public_key_cell_data[MAX_PUBLIC_KEY_CELL_DATA_SIZE]; @@ -57,46 +57,46 @@ typedef struct BocContext_t { typedef struct AddressContext_t { uint8_t address[ADDRESS_LENGTH]; - char address_str[65]; + char address_str[65]; } AddressContext_t; typedef struct PublicKeyContext_t { uint8_t public_key[PUBLIC_KEY_LENGTH]; - char public_key_str[65]; + char public_key_str[65]; } PublicKeyContext_t; typedef struct SignContext_t { - uint8_t chain_id[CHAIN_ID_LENGTH]; - uint8_t to_sign[SIGN_MAGIC_LENGTH + TO_SIGN_LENGTH]; - uint8_t signature[SIGNATURE_LENGTH]; + uint8_t chain_id[CHAIN_ID_LENGTH]; + uint8_t to_sign[SIGN_MAGIC_LENGTH + TO_SIGN_LENGTH]; + uint8_t signature[SIGNATURE_LENGTH]; uint32_t account_number; - char to_sign_str[73]; + char to_sign_str[73]; } SignContext_t; typedef struct SignTransactionContext_t { - bool sign_with_chain_id; - uint8_t chain_id[CHAIN_ID_LENGTH]; - uint8_t to_sign[CHAIN_ID_LENGTH + TO_SIGN_LENGTH]; - uint8_t signature[SIGNATURE_LENGTH]; - char address_str[70]; - char amount_str[40]; - char transaction_id_str[20]; + bool sign_with_chain_id; + uint8_t chain_id[CHAIN_ID_LENGTH]; + uint8_t to_sign[CHAIN_ID_LENGTH + TO_SIGN_LENGTH]; + uint8_t signature[SIGNATURE_LENGTH]; + char address_str[70]; + char amount_str[40]; + char transaction_id_str[20]; uint32_t account_number; - uint8_t origin_wallet_type; - uint8_t current_wallet_type; - uint8_t decimals; - uint8_t address[ADDRESS_LENGTH]; - uint8_t prepend_address[ADDRESS_LENGTH]; - uint8_t wc; - uint8_t data[MAX_DATA_LEN]; + uint8_t origin_wallet_type; + uint8_t current_wallet_type; + uint8_t decimals; + uint8_t address[ADDRESS_LENGTH]; + uint8_t prepend_address[ADDRESS_LENGTH]; + uint8_t wc; + uint8_t data[MAX_DATA_LEN]; uint16_t data_offset; - char ticker[MAX_TICKER_LEN]; + char ticker[MAX_TICKER_LEN]; } SignTransactionContext_t; typedef union { - PublicKeyContext_t pk_context; - AddressContext_t addr_context; - SignContext_t sign_context; + PublicKeyContext_t pk_context; + AddressContext_t addr_context; + SignContext_t sign_context; SignTransactionContext_t sign_tr_context; } DataContext_t; @@ -104,7 +104,7 @@ typedef union { extern unsigned int ux_step; extern unsigned int ux_step_count; -extern BocContext_t boc_context; +extern BocContext_t boc_context; extern DataContext_t data_context; #endif diff --git a/src/slice_data.h b/src/slice_data.h index 8eee81a..9769fc3 100644 --- a/src/slice_data.h +++ b/src/slice_data.h @@ -13,22 +13,22 @@ typedef struct SliceData_t { struct Cell_t; -void SliceData_init(struct SliceData_t* self, uint8_t* data, uint16_t data_size_bytes); -void SliceData_from_cell(struct SliceData_t* self, struct Cell_t* cell); -void SliceData_fill(struct SliceData_t* self, uint8_t value, uint16_t data_size_bytes); -void SliceData_truncate(struct SliceData_t* self, uint16_t size); +void SliceData_init(struct SliceData_t* self, uint8_t* data, uint16_t data_size_bytes); +void SliceData_from_cell(struct SliceData_t* self, struct Cell_t* cell); +void SliceData_fill(struct SliceData_t* self, uint8_t value, uint16_t data_size_bytes); +void SliceData_truncate(struct SliceData_t* self, uint16_t size); uint16_t SliceData_remaining_bits(const struct SliceData_t* self); -void SliceData_move_by(struct SliceData_t* self, uint16_t offset); -uint8_t SliceData_get_bits(const struct SliceData_t* self, uint16_t offset, uint8_t bits); -uint8_t SliceData_get_next_bit(struct SliceData_t* self); -uint8_t SliceData_get_next_byte(struct SliceData_t* self); +void SliceData_move_by(struct SliceData_t* self, uint16_t offset); +uint8_t SliceData_get_bits(const struct SliceData_t* self, uint16_t offset, uint8_t bits); +uint8_t SliceData_get_next_bit(struct SliceData_t* self); +uint8_t SliceData_get_next_byte(struct SliceData_t* self); uint64_t SliceData_get_next_int(struct SliceData_t* self, uint8_t bits); uint64_t SliceData_get_next_size(struct SliceData_t* self, uint16_t max_value); -bool SliceData_is_empty(const struct SliceData_t* self); -bool SliceData_equal(const struct SliceData_t* self, const struct SliceData_t* other); +bool SliceData_is_empty(const struct SliceData_t* self); +bool SliceData_equal(const struct SliceData_t* self, const struct SliceData_t* other); uint16_t SliceData_get_cursor(const struct SliceData_t* self); uint8_t* SliceData_begin(const struct SliceData_t* self); uint16_t SliceData_data_size(const struct SliceData_t* self); -void SliceData_append(struct SliceData_t* self, uint8_t* data, uint16_t bits, bool append_tag); +void SliceData_append(struct SliceData_t* self, uint8_t* data, uint16_t bits, bool append_tag); #endif diff --git a/src/utils.h b/src/utils.h index de58385..ede41b3 100644 --- a/src/utils.h +++ b/src/utils.h @@ -11,9 +11,9 @@ #ifndef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION unsigned int ui_prepro(const bagl_element_t *element); -void get_public_key(uint32_t accountNumber, uint8_t* publicKeyArray); -void get_private_key(uint32_t accountNumber, cx_ecfp_private_key_t *privateKey); -void send_response(uint8_t tx, bool approve); +void get_public_key(uint32_t accountNumber, uint8_t *publicKeyArray); +void get_private_key(uint32_t accountNumber, cx_ecfp_private_key_t *privateKey); +void send_response(uint8_t tx, bool approve); #endif @@ -23,18 +23,21 @@ void writeUint64BE(uint64_t val, uint8_t *bytes); uint16_t readUint16BE(uint8_t *buffer); uint32_t readUint32BE(uint8_t *buffer); uint64_t readUint64BE(uint8_t *buffer); -uint8_t leading_zeros(uint16_t value); +uint8_t leading_zeros(uint16_t value); uint16_t format_hex(const uint8_t *in, size_t in_len, char *out, size_t out_len); -uint8_t convert_hex_amount_to_displayable(const uint8_t* amount, uint8_t decimals, uint8_t amount_length, char* out); - -#define VALIDATE(cond, error) \ - do {\ - if (!(cond)) { \ +uint8_t convert_hex_amount_to_displayable(const uint8_t *amount, + uint8_t decimals, + uint8_t amount_length, + char *out); + +#define VALIDATE(cond, error) \ + do { \ + if (!(cond)) { \ PRINTF("Validation Error in %s: %d\n", __FILE__, __LINE__); \ - THROW(error); \ - } \ - } while(0) + THROW(error); \ + } \ + } while (0) #define PRINT_LINE() PRINTF("Print line %s: %d\n", __FILE__, __LINE__) From 64ba64773c9dd2c81ce6d229bf965cb70936b922 Mon Sep 17 00:00:00 2001 From: keiff3r Date: Mon, 17 Feb 2025 15:46:08 +0100 Subject: [PATCH 18/67] fix: replace deprecated function with new ones and format files --- .clang-format | 5 ++- fuzz/fuzzer.c | 4 +- src/byte_stream.c | 18 ++++----- src/cell.c | 32 +++++++-------- src/contract.c | 40 +++++++++---------- src/errors.h | 4 ++ src/hashmap_label.c | 10 ++--- src/message.c | 88 +++++++++++++++++++++--------------------- src/sign.c | 21 +++++----- src/sign_transaction.c | 36 ++++++++--------- src/slice_data.c | 40 +++++++++---------- src/utils.c | 34 ++++++++++------ 12 files changed, 173 insertions(+), 159 deletions(-) diff --git a/.clang-format b/.clang-format index d20cb81..3a8467a 100644 --- a/.clang-format +++ b/.clang-format @@ -1,5 +1,5 @@ ---- BasedOnStyle: Google +DerivePointerAlignment: false IndentWidth: 4 Language: Cpp ColumnLimit: 100 @@ -31,3 +31,6 @@ IndentWrappedFunctionNames: false KeepEmptyLinesAtTheStartOfBlocks: false AlignTrailingComments: true SortUsingDeclarations: false +PointerBindsToType: true +BraceWrapping: + AfterEnum: true diff --git a/fuzz/fuzzer.c b/fuzz/fuzzer.c index 85b739c..163748a 100644 --- a/fuzz/fuzzer.c +++ b/fuzz/fuzzer.c @@ -22,14 +22,14 @@ BocContext_t boc_context; DataContext_t data_context; -void hex_to_bytes(const char* hex, uint8_t* bytes) { +void hex_to_bytes(const char *hex, uint8_t *bytes) { size_t len = strlen(hex); size_t final_len = len / 2; for (size_t i = 0, j = 0; j < final_len; i += 2, j++) bytes[j] = (hex[i] % 32 + 9) % 25 * 16 + (hex[i + 1] % 32 + 9) % 25; } -extern int LLVMFuzzerTestOneInput(const uint8_t* buf, size_t len) { +extern int LLVMFuzzerTestOneInput(const uint8_t *buf, size_t len) { if (len < 1) return -1; /*auto boc = "0101040104a0a0a01a4ba92d8ae00301e02800004000"; diff --git a/src/byte_stream.c b/src/byte_stream.c index 319d780..714ea0e 100644 --- a/src/byte_stream.c +++ b/src/byte_stream.c @@ -2,26 +2,26 @@ #include "errors.h" #include "utils.h" -void ByteStream_init(struct ByteStream_t* self, uint8_t* data, uint16_t data_size) { +void ByteStream_init(struct ByteStream_t *self, uint8_t *data, uint16_t data_size) { VALIDATE(self && data && data_size, ERR_END_OF_STREAM); self->data_size = data_size; self->offset = 0; self->data = data; } -void ByteStream_move_by(struct ByteStream_t* self, uint16_t data_size) { +void ByteStream_move_by(struct ByteStream_t *self, uint16_t data_size) { self->offset += data_size; } -uint8_t* ByteStream_read_data(struct ByteStream_t* self, uint32_t data_size) { +uint8_t *ByteStream_read_data(struct ByteStream_t *self, uint32_t data_size) { VALIDATE(self->data_size - self->offset >= data_size, ERR_END_OF_STREAM); - uint8_t* data = self->data + self->offset; + uint8_t *data = self->data + self->offset; ByteStream_move_by(self, data_size); return data; } -uint8_t ByteStream_read_byte(struct ByteStream_t* self) { +uint8_t ByteStream_read_byte(struct ByteStream_t *self) { VALIDATE(self->data_size - self->offset >= sizeof(uint8_t), ERR_END_OF_STREAM); uint8_t byte = self->data[self->offset]; @@ -29,7 +29,7 @@ uint8_t ByteStream_read_byte(struct ByteStream_t* self) { return byte; } -uint32_t ByteStream_read_u32(struct ByteStream_t* self) { +uint32_t ByteStream_read_u32(struct ByteStream_t *self) { VALIDATE(self->data_size - self->offset >= sizeof(uint32_t), ERR_END_OF_STREAM); uint32_t u32 = readUint32BE(self->data + self->offset); @@ -37,15 +37,15 @@ uint32_t ByteStream_read_u32(struct ByteStream_t* self) { return u32; } -uint8_t* ByteStream_get_cursor(struct ByteStream_t* self) { +uint8_t *ByteStream_get_cursor(struct ByteStream_t *self) { return self->data + self->offset; } -uint16_t ByteStream_get_length(struct ByteStream_t* self) { +uint16_t ByteStream_get_length(struct ByteStream_t *self) { return self->data_size - self->offset; } -uint64_t ByteStream_read_uint(struct ByteStream_t* self, uint16_t bytes) { +uint64_t ByteStream_read_uint(struct ByteStream_t *self, uint16_t bytes) { VALIDATE(bytes > 0 && bytes <= 8, ERR_END_OF_STREAM); uint64_t val; diff --git a/src/cell.c b/src/cell.c index d20a0bf..25edfd5 100644 --- a/src/cell.c +++ b/src/cell.c @@ -1,42 +1,42 @@ #include "cell.h" #include "utils.h" -void Cell_init(struct Cell_t* self, uint8_t* cell_begin, uint16_t cell_length) { +void Cell_init(struct Cell_t *self, uint8_t *cell_begin, uint16_t cell_length) { VALIDATE(self && cell_begin, ERR_CELL_IS_EMPTY); self->cell_begin = cell_begin; self->cell_length = cell_length; } -uint8_t Cell_get_d1(const struct Cell_t* self) { +uint8_t Cell_get_d1(const struct Cell_t *self) { VALIDATE(self && self->cell_begin, ERR_CELL_IS_EMPTY); VALIDATE(self->cell_length > 0, ERR_INVALID_CELL); return self->cell_begin[0]; } -uint8_t Cell_get_d2(const struct Cell_t* self) { +uint8_t Cell_get_d2(const struct Cell_t *self) { VALIDATE(self && self->cell_begin, ERR_CELL_IS_EMPTY); VALIDATE(self->cell_length > 1, ERR_INVALID_CELL); return self->cell_begin[1]; } -uint8_t Cell_get_data_size(const struct Cell_t* self) { +uint8_t Cell_get_data_size(const struct Cell_t *self) { uint8_t d2 = Cell_get_d2(self); return (d2 >> 1) + (((d2 & 1) != 0) ? 1 : 0); } -uint8_t* Cell_get_data(const struct Cell_t* self) { +uint8_t *Cell_get_data(const struct Cell_t *self) { VALIDATE(self && self->cell_begin, ERR_CELL_IS_EMPTY); return self->cell_begin + CELL_DATA_OFFSET; } -uint8_t* Cell_get_refs(const struct Cell_t* self, uint8_t* refs_count) { +uint8_t *Cell_get_refs(const struct Cell_t *self, uint8_t *refs_count) { uint8_t d1 = Cell_get_d1(self); *refs_count = d1 & 7; uint8_t data_size = Cell_get_data_size(self); return self->cell_begin + CELL_DATA_OFFSET + data_size; } -uint16_t Cell_bit_len(struct Cell_t* self) { +uint16_t Cell_bit_len(struct Cell_t *self) { uint8_t data_size = Cell_get_data_size(self); uint16_t bit_len = data_size * 8; @@ -44,7 +44,7 @@ uint16_t Cell_bit_len(struct Cell_t* self) { return bit_len; } - uint8_t* data = Cell_get_data(self); + uint8_t *data = Cell_get_data(self); for (int8_t i = data_size - 1; i >= 0; --i) { if (data[i] == 0) { bit_len -= 8; @@ -62,7 +62,7 @@ uint16_t Cell_bit_len(struct Cell_t* self) { return bit_len; } -uint16_t deserialize_cell(struct Cell_t* cell, +uint16_t deserialize_cell(struct Cell_t *cell, const uint8_t cell_index, const uint8_t cells_count) { uint8_t d1 = Cell_get_d1(cell); @@ -83,7 +83,7 @@ uint16_t deserialize_cell(struct Cell_t* cell, VALIDATE(!pruned || pruned && (data_size == PRUNED_BRANCH_DATA_SIZE), ERR_INVALID_CELL); uint8_t refs_count = 0; - uint8_t* refs = Cell_get_refs(cell, &refs_count); + uint8_t *refs = Cell_get_refs(cell, &refs_count); for (uint8_t i = 0; i < refs_count; ++i) { VALIDATE(cell && cell->cell_length > CELL_DATA_OFFSET + data_size + i, ERR_INVALID_CELL); @@ -94,8 +94,8 @@ uint16_t deserialize_cell(struct Cell_t* cell, return CELL_DATA_OFFSET + data_size + refs_count; // cell size } -void calc_cell_hash(Cell_t* cell, const uint8_t cell_index) { - BocContext_t* bc = &boc_context; +void calc_cell_hash(Cell_t *cell, const uint8_t cell_index) { + BocContext_t *bc = &boc_context; uint8_t d1 = Cell_get_d1(cell); if (d1 == PRUNED_BRANCH_D1) { @@ -104,7 +104,7 @@ void calc_cell_hash(Cell_t* cell, const uint8_t cell_index) { // 1 byte - level mask // 32 bytes - hash // 2 bytes - cell depth (BE) - uint8_t* cell_data = Cell_get_data(cell); + uint8_t *cell_data = Cell_get_data(cell); memcpy(bc->hashes + cell_index * HASH_SIZE, cell_data + 2, HASH_SIZE); bc->cell_depth[cell_index] = *(cell_data + 2 + HASH_SIZE + 1); return; @@ -125,10 +125,10 @@ void calc_cell_hash(Cell_t* cell, const uint8_t cell_index) { hash_buffer_offset += data_size; uint8_t refs_count = 0; - uint8_t* refs = Cell_get_refs(cell, &refs_count); + uint8_t *refs = Cell_get_refs(cell, &refs_count); VALIDATE(refs_count <= MAX_REFERENCES_COUNT, ERR_INVALID_CELL); for (uint8_t child = 0; child < refs_count; ++child) { - uint8_t* depth = &bc->cell_depth[cell_index]; + uint8_t *depth = &bc->cell_depth[cell_index]; VALIDATE(refs[child] < MAX_CONTRACT_CELLS_COUNT, ERR_INVALID_CELL); uint8_t child_depth = bc->cell_depth[refs[child]]; *depth = (*depth > child_depth + 1) ? *depth : (child_depth + 1); @@ -140,7 +140,7 @@ void calc_cell_hash(Cell_t* cell, const uint8_t cell_index) { } for (uint8_t child = 0; child < refs_count; ++child) { - uint8_t* cell_hash = bc->hashes + refs[child] * HASH_SIZE; + uint8_t *cell_hash = bc->hashes + refs[child] * HASH_SIZE; memcpy(hash_buffer + hash_buffer_offset, cell_hash, HASH_SIZE); hash_buffer_offset += HASH_SIZE; } diff --git a/src/contract.c b/src/contract.c index be8be45..d3915c0 100644 --- a/src/contract.c +++ b/src/contract.c @@ -98,7 +98,7 @@ const uint32_t multisig_2_wallet_cell_depth = 0x0C; const uint32_t multisig_2_1_wallet_cell_depth = 0x0A; const uint32_t surf_wallet_cell_depth = 0x0C; -void deserialize_cells_tree(struct ByteStream_t* src) { +void deserialize_cells_tree(struct ByteStream_t *src) { uint8_t first_byte = ByteStream_read_byte(src); { bool index_included = (first_byte & 0x80) != 0; @@ -123,9 +123,9 @@ void deserialize_cells_tree(struct ByteStream_t* src) { { uint8_t absent_count = ByteStream_read_uint(src, ref_size); UNUSED(absent_count); - uint8_t* total_cells_size = ByteStream_read_data(src, offset_size); + uint8_t *total_cells_size = ByteStream_read_data(src, offset_size); UNUSED(total_cells_size); - uint8_t* buf = ByteStream_read_data(src, roots_count * ref_size); + uint8_t *buf = ByteStream_read_data(src, roots_count * ref_size); UNUSED(buf); } @@ -136,7 +136,7 @@ void deserialize_cells_tree(struct ByteStream_t* src) { for (uint8_t i = 0; i < cells_count; ++i) { VALIDATE(i < MAX_CONTRACT_CELLS_COUNT, ERR_INVALID_CONTRACT); - uint8_t* cell_begin = ByteStream_get_cursor(src); + uint8_t *cell_begin = ByteStream_get_cursor(src); uint16_t cell_length = ByteStream_get_length(src); Cell_init(&cell, cell_begin, cell_length); uint16_t offset = deserialize_cell(&cell, i, cells_count); @@ -153,11 +153,11 @@ void deserialize_cells_tree(struct ByteStream_t* src) { } void find_public_key_cell() { - BocContext_t* bc = &boc_context; + BocContext_t *bc = &boc_context; VALIDATE(Cell_get_data(&bc->cells[0])[0] & 0x20, ERR_INVALID_CONTRACT); // has data branch uint8_t refs_count = 0; - uint8_t* refs = Cell_get_refs(&bc->cells[0], &refs_count); + uint8_t *refs = Cell_get_refs(&bc->cells[0], &refs_count); VALIDATE(refs_count > 0 && refs_count <= 2, ERR_INVALID_CONTRACT); uint8_t data_root = refs[refs_count - 1]; @@ -176,7 +176,7 @@ void find_public_key_cell() { #ifndef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION -void compute_wallet_v3_address(uint32_t account_number, uint8_t* address) { +void compute_wallet_v3_address(uint32_t account_number, uint8_t *address) { uint8_t data_hash[HASH_SIZE]; // Compute data hash @@ -234,7 +234,7 @@ void compute_wallet_v3_address(uint32_t account_number, uint8_t* address) { } } -void compute_ever_wallet_address(uint32_t account_number, uint8_t* address) { +void compute_ever_wallet_address(uint32_t account_number, uint8_t *address) { uint8_t data_hash[HASH_SIZE]; // Compute data hash @@ -294,18 +294,18 @@ void compute_ever_wallet_address(uint32_t account_number, uint8_t* address) { } void compute_multisig_address(uint32_t account_number, - const uint8_t* wallet, + const uint8_t *wallet, uint16_t wallet_size, - const uint8_t* code_hash, + const uint8_t *code_hash, uint32_t cell_depth, - uint8_t* address) { + uint8_t *address) { { ByteStream_t src; - ByteStream_init(&src, (uint8_t*) wallet, wallet_size); + ByteStream_init(&src, (uint8_t *) wallet, wallet_size); deserialize_cells_tree(&src); } - BocContext_t* bc = &boc_context; + BocContext_t *bc = &boc_context; VALIDATE(bc->cells_count != 0, ERR_INVALID_CONTRACT); find_public_key_cell(); // sets public key cell index to boc_context @@ -315,31 +315,31 @@ void compute_multisig_address(uint32_t account_number, bc->cell_depth[bc->public_key_cell_index + 1] = cell_depth; VALIDATE(bc->public_key_cell_index && bc->public_key_label_size_bits, ERR_INVALID_CONTRACT); - Cell_t* cell = &bc->cells[bc->public_key_cell_index]; + Cell_t *cell = &bc->cells[bc->public_key_cell_index]; uint8_t cell_data_size = Cell_get_data_size(cell); VALIDATE(cell_data_size != 0 && cell_data_size <= MAX_PUBLIC_KEY_CELL_DATA_SIZE, ERR_INVALID_CONTRACT); - uint8_t* cell_data = Cell_get_data(cell); + uint8_t *cell_data = Cell_get_data(cell); memcpy(bc->public_key_cell_data, cell_data, cell_data_size); - uint8_t* public_key = data_context.pk_context.public_key; + uint8_t *public_key = data_context.pk_context.public_key; get_public_key(account_number, public_key); - uint8_t* data = bc->public_key_cell_data; + uint8_t *data = bc->public_key_cell_data; SliceData_t slice; SliceData_init(&slice, data, sizeof(bc->public_key_cell_data)); SliceData_move_by(&slice, bc->public_key_label_size_bits); SliceData_append(&slice, public_key, PUBLIC_KEY_LENGTH * 8, true); for (int16_t i = bc->public_key_cell_index; i >= 0; --i) { - Cell_t* it_cell = &bc->cells[i]; + Cell_t *it_cell = &bc->cells[i]; calc_cell_hash(it_cell, i); } memcpy(address, bc->hashes, HASH_SIZE); } -void get_address(const uint32_t account_number, uint8_t wallet_type, uint8_t* address) { +void get_address(const uint32_t account_number, uint8_t wallet_type, uint8_t *address) { switch (wallet_type) { case WALLET_V3: { compute_wallet_v3_address(account_number, address); @@ -419,7 +419,7 @@ void get_address(const uint32_t account_number, uint8_t wallet_type, uint8_t* ad #else -void get_address(const uint32_t account_number, uint8_t wallet_type, uint8_t* address) { +void get_address(const uint32_t account_number, uint8_t wallet_type, uint8_t *address) { } #endif diff --git a/src/errors.h b/src/errors.h index 4c8eb1e..1d777b9 100644 --- a/src/errors.h +++ b/src/errors.h @@ -23,6 +23,10 @@ enum { ERR_INVALID_CELL = 0x6B17, ERR_INVALID_CONTRACT = 0x6B18, ERR_INVALID_MESSAGE = 0x6B19, + ERR_SIGNING_FAILED = 0x6B20, + ERR_GENERATE_PAIR_FAILED = 0x6B21, + ERR_INIT_PRIVATE_KEY_FAILED = 0x6B22, + ERR_DERIVE_PATH_FAILED = 0x6B23, }; #endif diff --git a/src/hashmap_label.c b/src/hashmap_label.c index 2d223ef..5e2f216 100644 --- a/src/hashmap_label.c +++ b/src/hashmap_label.c @@ -4,7 +4,7 @@ #include "utils.h" #include "errors.h" -uint8_t get_label_same(uint8_t max, struct SliceData_t* slice, struct SliceData_t* label) { +uint8_t get_label_same(uint8_t max, struct SliceData_t *slice, struct SliceData_t *label) { uint8_t value = SliceData_get_next_bit(slice) ? 0xff : 0; uint8_t length = SliceData_get_next_size(slice, max); VALIDATE(length <= 64, ERR_RANGE_CHECK); @@ -15,7 +15,7 @@ uint8_t get_label_same(uint8_t max, struct SliceData_t* slice, struct SliceData_ return length >= max ? 0 : (max - length); } -uint8_t get_label(uint8_t max, struct SliceData_t* slice, struct SliceData_t* label) { +uint8_t get_label(uint8_t max, struct SliceData_t *slice, struct SliceData_t *label) { VALIDATE(SliceData_is_empty(slice) == false, ERR_SLICE_IS_EMPTY); VALIDATE(SliceData_get_next_bit(slice) == 1, ERR_WRONG_LABEL); // label short VALIDATE(SliceData_get_next_bit(slice) == 1, ERR_WRONG_LABEL); // label long @@ -23,7 +23,7 @@ uint8_t get_label(uint8_t max, struct SliceData_t* slice, struct SliceData_t* la return get_label_same(max, slice, label); } -void put_to_node(uint8_t cell_index, uint16_t bit_len, struct SliceData_t* key) { +void put_to_node(uint8_t cell_index, uint16_t bit_len, struct SliceData_t *key) { VALIDATE(cell_index != 0 && cell_index <= MAX_CONTRACT_CELLS_COUNT, ERR_INVALID_DATA); static const uint8_t key_len_bytes = 8; VALIDATE(key && key->data_size_bytes == key_len_bytes, ERR_RANGE_CHECK); @@ -31,7 +31,7 @@ void put_to_node(uint8_t cell_index, uint16_t bit_len, struct SliceData_t* key) VALIDATE(key->data[i] == 0, ERR_INVALID_KEY); } - Cell_t* cell = &boc_context.cells[cell_index]; + Cell_t *cell = &boc_context.cells[cell_index]; SliceData_t slice; SliceData_init(&slice, Cell_get_data(cell), Cell_get_data_size(cell)); @@ -72,7 +72,7 @@ void put_to_node(uint8_t cell_index, uint16_t bit_len, struct SliceData_t* key) VALIDATE(next_index == 0, ERR_INVALID_KEY); uint8_t refs_count = 0; - uint8_t* refs = Cell_get_refs(&boc_context.cells[cell_index], &refs_count); + uint8_t *refs = Cell_get_refs(&boc_context.cells[cell_index], &refs_count); VALIDATE(refs_count > 0 && refs_count <= MAX_REFERENCES_COUNT, ERR_INVALID_DATA); uint8_t next_cell = refs[next_index]; VALIDATE(next_cell != 0 && next_cell <= MAX_CONTRACT_CELLS_COUNT, ERR_INVALID_DATA); diff --git a/src/message.c b/src/message.c index 92fb4e7..11bf637 100644 --- a/src/message.c +++ b/src/message.c @@ -9,7 +9,7 @@ #define GIFT_CELL_INDEX 1 void deserialize_array( - uint8_t* in, uint8_t in_size, uint16_t offset, uint8_t* out, uint8_t out_size) { + uint8_t *in, uint8_t in_size, uint16_t offset, uint8_t *out, uint8_t out_size) { uint8_t shift = offset % 8; uint8_t first_data_byte = offset / 8; for (uint16_t i = first_data_byte, j = 0; j < out_size; ++i, ++j) { @@ -28,7 +28,7 @@ void deserialize_array( } } -void deserialize_address(struct SliceData_t* slice, int8_t* wc, uint8_t* address) { +void deserialize_address(struct SliceData_t *slice, int8_t *wc, uint8_t *address) { uint8_t addr_type = SliceData_get_next_int(slice, 2); VALIDATE(addr_type == 0 || addr_type == 2, ERR_INVALID_MESSAGE); @@ -38,7 +38,7 @@ void deserialize_address(struct SliceData_t* slice, int8_t* wc, uint8_t* address *wc = (int8_t) SliceData_get_next_byte(slice); - uint8_t* data = SliceData_begin(slice); + uint8_t *data = SliceData_begin(slice); uint16_t offset = SliceData_get_cursor(slice); uint16_t data_size = SliceData_data_size(slice); @@ -48,8 +48,8 @@ void deserialize_address(struct SliceData_t* slice, int8_t* wc, uint8_t* address } } -void deserialize_value(struct SliceData_t* slice, uint8_t* value, uint8_t value_length) { - uint8_t* data = SliceData_begin(slice); +void deserialize_value(struct SliceData_t *slice, uint8_t *value, uint8_t value_length) { + uint8_t *data = SliceData_begin(slice); uint16_t data_size = SliceData_data_size(slice); uint16_t offset = SliceData_get_cursor(slice); @@ -57,12 +57,12 @@ void deserialize_value(struct SliceData_t* slice, uint8_t* value, uint8_t value_ SliceData_move_by(slice, value_length * 8); } -void set_dst_address(uint8_t wc, const uint8_t* address) { +void set_dst_address(uint8_t wc, const uint8_t *address) { char wc_temp[6]; // snprintf always returns zero snprintf(wc_temp, sizeof(wc_temp), "%d:", (int8_t) wc); int wc_len = strlen(wc_temp); - char* address_str = data_context.sign_tr_context.address_str; + char *address_str = data_context.sign_tr_context.address_str; memcpy(address_str, wc_temp, wc_len); address_str += wc_len; @@ -70,19 +70,19 @@ void set_dst_address(uint8_t wc, const uint8_t* address) { address, ADDRESS_LENGTH, address_str, sizeof(data_context.sign_tr_context.address_str)); } -void set_amount(const uint8_t* amount, +void set_amount(const uint8_t *amount, uint8_t amount_length, uint8_t flags, uint8_t decimals, - const char* ticker) { - char* amount_str = data_context.sign_tr_context.amount_str; + const char *ticker) { + char *amount_str = data_context.sign_tr_context.amount_str; size_t amount_str_size = sizeof(data_context.sign_tr_context.amount_str); memset(amount_str, 0, amount_str_size); switch (flags) { case NORMAL_FLAG: { - const char* space = " "; + const char *space = " "; uint8_t text_size = convert_hex_amount_to_displayable(amount, decimals, amount_length, amount_str); VALIDATE(amount_str_size >= text_size + strlen(space) + strlen(ticker), @@ -93,14 +93,14 @@ void set_amount(const uint8_t* amount, break; } case ALL_BALANCE_FLAG: { - const char* text = "All balance"; + const char *text = "All balance"; VALIDATE(amount_str_size >= strlen(text), ERR_INVALID_MESSAGE); strncpy(amount_str, text, strlen(text)); break; } case ALL_BALANCE_AND_DELETE_FLAG: { - const char* text = "All balance and delete account"; + const char *text = "All balance and delete account"; VALIDATE(amount_str_size >= strlen(text), ERR_INVALID_MESSAGE); strncpy(amount_str, text, strlen(text)); @@ -111,8 +111,8 @@ void set_amount(const uint8_t* amount, } } -void set_transaction_id(const uint8_t* transaction_id) { - char* transaction_id_str = data_context.sign_tr_context.transaction_id_str; +void set_transaction_id(const uint8_t *transaction_id) { + char *transaction_id_str = data_context.sign_tr_context.transaction_id_str; memset(transaction_id_str, 0, sizeof(data_context.sign_tr_context.transaction_id_str)); format_hex(transaction_id, TRANSACTION_ID_LENGTH, @@ -120,9 +120,9 @@ void set_transaction_id(const uint8_t* transaction_id) { sizeof(data_context.sign_tr_context.transaction_id_str)); } -void deserialize_int_message_header(struct SliceData_t* slice, +void deserialize_int_message_header(struct SliceData_t *slice, uint8_t flags, - SignTransactionContext_t* ctx) { + SignTransactionContext_t *ctx) { uint8_t int_msg = SliceData_get_next_bit(slice); VALIDATE(!int_msg, ERR_INVALID_MESSAGE); @@ -173,9 +173,9 @@ void deserialize_int_message_header(struct SliceData_t* slice, UNUSED(created_at); } -int deserialize_token_body(struct SliceData_t* slice, - struct SliceData_t* ref_slice, - SignTransactionContext_t* ctx) { +int deserialize_token_body(struct SliceData_t *slice, + struct SliceData_t *ref_slice, + SignTransactionContext_t *ctx) { // FunctionId if (SliceData_remaining_bits(slice) < sizeof(uint32_t) * 8) { if (!ref_slice || !ref_slice->data @@ -250,11 +250,11 @@ int deserialize_token_body(struct SliceData_t* slice, return sign_transaction_flow; } -int deserialize_multisig_params(struct SliceData_t* slice, +int deserialize_multisig_params(struct SliceData_t *slice, uint32_t function_id, uint8_t wc, - uint8_t* address, - SignTransactionContext_t* ctx) { + uint8_t *address, + SignTransactionContext_t *ctx) { int sign_transaction_flow = SIGN_TRANSACTION_FLOW_ERROR; switch (function_id) { @@ -343,9 +343,9 @@ int deserialize_multisig_params(struct SliceData_t* slice, return sign_transaction_flow; } -void prepare_payload_hash(BocContext_t* bc) { +void prepare_payload_hash(BocContext_t *bc) { for (int16_t i = bc->cells_count - 1; i >= 0; --i) { - Cell_t* cell = &bc->cells[i]; + Cell_t *cell = &bc->cells[i]; calc_cell_hash(cell, i); } @@ -363,7 +363,7 @@ void prepare_payload_hash(BocContext_t* bc) { } } -uint32_t deserialize_wallet_v3(struct SliceData_t* slice) { +uint32_t deserialize_wallet_v3(struct SliceData_t *slice) { uint32_t id = SliceData_get_next_int(slice, 32); VALIDATE(id == WALLET_ID, ERR_INVALID_MESSAGE); @@ -381,7 +381,7 @@ uint32_t deserialize_wallet_v3(struct SliceData_t* slice) { return flags; } -uint32_t deserialize_contract_header(struct SliceData_t* slice) { +uint32_t deserialize_contract_header(struct SliceData_t *slice) { uint8_t is_pubkey_present = SliceData_get_next_bit(slice); if (is_pubkey_present) { SliceData_move_by(slice, PUBLIC_KEY_LENGTH * 8); @@ -397,11 +397,11 @@ uint32_t deserialize_contract_header(struct SliceData_t* slice) { return function_id; } -void prepend_address_to_cell(uint8_t* cell_buffer, +void prepend_address_to_cell(uint8_t *cell_buffer, uint16_t cell_buffer_size, - struct Cell_t* cell, + struct Cell_t *cell, uint8_t wc, - uint8_t* address) { + uint8_t *address) { uint16_t bit_len = Cell_bit_len(cell); bit_len += 267; // Prefix(2) + Anycast(1) + WorkchainId(8) + Address(32 * 8) @@ -426,13 +426,13 @@ void prepend_address_to_cell(uint8_t* cell_buffer, SliceData_append(&slice, address, ADDRESS_LENGTH * 8, false); // Append cell data - uint8_t* data = Cell_get_data(cell); + uint8_t *data = Cell_get_data(cell); uint8_t data_size = Cell_get_data_size(cell); SliceData_append(&slice, data, data_size * 8, false); // Append references uint8_t refs_count = 0; - uint8_t* refs = Cell_get_refs(cell, &refs_count); + uint8_t *refs = Cell_get_refs(cell, &refs_count); VALIDATE(refs_count <= MAX_REFERENCES_COUNT, ERR_INVALID_MESSAGE); for (uint8_t child = 0; child < refs_count; ++child) { @@ -444,20 +444,20 @@ void prepend_address_to_cell(uint8_t* cell_buffer, cell->cell_begin = cell_buffer; } -int prepare_to_sign(struct ByteStream_t* src, +int prepare_to_sign(struct ByteStream_t *src, uint8_t wc, - uint8_t* address, - uint8_t* prepend_address) { + uint8_t *address, + uint8_t *prepend_address) { // Init context - BocContext_t* bc = &boc_context; - DataContext_t* dc = &data_context; + BocContext_t *bc = &boc_context; + DataContext_t *dc = &data_context; // Parse transaction boc deserialize_cells_tree(src); // Root VALIDATE(bc->cells_count > ROOT_CELL_INDEX, ERR_INVALID_MESSAGE); - Cell_t* root_cell = &bc->cells[ROOT_CELL_INDEX]; + Cell_t *root_cell = &bc->cells[ROOT_CELL_INDEX]; SliceData_t root_slice; SliceData_from_cell(&root_slice, root_cell); @@ -470,7 +470,7 @@ int prepare_to_sign(struct ByteStream_t* src, // Gift VALIDATE(bc->cells_count > GIFT_CELL_INDEX, ERR_INVALID_CELL_INDEX); - Cell_t* gift_cell = &bc->cells[GIFT_CELL_INDEX]; + Cell_t *gift_cell = &bc->cells[GIFT_CELL_INDEX]; SliceData_t gift_slice; SliceData_from_cell(&gift_slice, gift_cell); @@ -492,7 +492,7 @@ int prepare_to_sign(struct ByteStream_t* src, uint8_t body_bit = SliceData_get_next_bit(&gift_slice); if (body_bit || gift_refs_count) { VALIDATE(bc->cells_count > GIFT_CELL_INDEX + 1, ERR_INVALID_CELL_INDEX); - Cell_t* ref_cell = &bc->cells[GIFT_CELL_INDEX + 1]; + Cell_t *ref_cell = &bc->cells[GIFT_CELL_INDEX + 1]; SliceData_t ref_slice; SliceData_from_cell(&ref_slice, ref_cell); @@ -518,7 +518,7 @@ int prepare_to_sign(struct ByteStream_t* src, // Gift VALIDATE(in_same_cell || bc->cells_count > GIFT_CELL_INDEX, ERR_INVALID_CELL_INDEX); - Cell_t* gift_cell = in_same_cell ? root_cell : &bc->cells[GIFT_CELL_INDEX]; + Cell_t *gift_cell = in_same_cell ? root_cell : &bc->cells[GIFT_CELL_INDEX]; SliceData_t gift_slice; if (in_same_cell) { @@ -536,7 +536,7 @@ int prepare_to_sign(struct ByteStream_t* src, // Gift body if (gift_refs_count) { VALIDATE(bc->cells_count > GIFT_CELL_INDEX + 1, ERR_INVALID_CELL_INDEX); - Cell_t* body_cell = &bc->cells[GIFT_CELL_INDEX + 1]; + Cell_t *body_cell = &bc->cells[GIFT_CELL_INDEX + 1]; SliceData_t body_slice; SliceData_from_cell(&body_slice, body_cell); @@ -560,7 +560,7 @@ int prepare_to_sign(struct ByteStream_t* src, // Gift VALIDATE(bc->cells_count > GIFT_CELL_INDEX, ERR_INVALID_CELL_INDEX); - Cell_t* gift_cell = &bc->cells[GIFT_CELL_INDEX]; + Cell_t *gift_cell = &bc->cells[GIFT_CELL_INDEX]; SliceData_t gift_slice; SliceData_from_cell(&gift_slice, gift_cell); @@ -574,7 +574,7 @@ int prepare_to_sign(struct ByteStream_t* src, // Gift body if (gift_refs_count) { VALIDATE(bc->cells_count > GIFT_CELL_INDEX + 1, ERR_INVALID_CELL_INDEX); - Cell_t* body_cell = &bc->cells[GIFT_CELL_INDEX + 1]; + Cell_t *body_cell = &bc->cells[GIFT_CELL_INDEX + 1]; SliceData_t body_slice; SliceData_from_cell(&body_slice, body_cell); diff --git a/src/sign.c b/src/sign.c index 2fe2459..b7be299 100644 --- a/src/sign.c +++ b/src/sign.c @@ -7,20 +7,19 @@ static const char SIGN_MAGIC[] = {0xFF, 0xFF, 0xFF, 0xFF}; static uint8_t set_result_sign() { cx_ecfp_private_key_t privateKey; SignContext_t *context = &data_context.sign_context; - + cx_err_t error; BEGIN_TRY { TRY { get_private_key(context->account_number, &privateKey); - cx_eddsa_sign(&privateKey, - CX_LAST, - CX_SHA512, - context->to_sign, - SIGN_MAGIC_LENGTH + TO_SIGN_LENGTH, - NULL, - 0, - context->signature, - SIGNATURE_LENGTH, - NULL); + error = cx_eddsa_sign_no_throw(&privateKey, + CX_SHA512, + context->to_sign, + SIGN_MAGIC_LENGTH + TO_SIGN_LENGTH, + context->signature, + SIGNATURE_LENGTH); + if (error != CX_OK) { + THROW(ERR_SIGNING_FAILED); + } } FINALLY { explicit_bzero(&privateKey, sizeof(privateKey)); diff --git a/src/sign_transaction.c b/src/sign_transaction.c index 74a0ead..639034e 100644 --- a/src/sign_transaction.c +++ b/src/sign_transaction.c @@ -8,32 +8,28 @@ static uint8_t set_result_sign_transaction() { cx_ecfp_private_key_t privateKey; SignTransactionContext_t *context = &data_context.sign_tr_context; + cx_err_t error; BEGIN_TRY { TRY { get_private_key(context->account_number, &privateKey); if (!context->sign_with_chain_id) { - cx_eddsa_sign(&privateKey, - CX_LAST, - CX_SHA512, - context->to_sign, - TO_SIGN_LENGTH, - NULL, - 0, - context->signature, - SIGNATURE_LENGTH, - NULL); + error = cx_eddsa_sign_no_throw(&privateKey, + CX_SHA512, + context->to_sign, + TO_SIGN_LENGTH, + context->signature, + SIGNATURE_LENGTH); } else { - cx_eddsa_sign(&privateKey, - CX_LAST, - CX_SHA512, - context->to_sign, - CHAIN_ID_LENGTH + TO_SIGN_LENGTH, - NULL, - 0, - context->signature, - SIGNATURE_LENGTH, - NULL); + error = cx_eddsa_sign_no_throw(&privateKey, + CX_SHA512, + context->to_sign, + CHAIN_ID_LENGTH + TO_SIGN_LENGTH, + context->signature, + SIGNATURE_LENGTH); + } + if (error != CX_OK) { + THROW(ERR_SIGNING_FAILED); } } FINALLY { diff --git a/src/slice_data.c b/src/slice_data.c index 8184186..fed1bc9 100644 --- a/src/slice_data.c +++ b/src/slice_data.c @@ -3,7 +3,7 @@ #include "utils.h" #include "cell.h" -void SliceData_init(struct SliceData_t* self, uint8_t* data, uint16_t data_size_bytes) { +void SliceData_init(struct SliceData_t *self, uint8_t *data, uint16_t data_size_bytes) { VALIDATE(self && data, ERR_SLICE_IS_EMPTY); self->data = data; self->data_window_start = 0; @@ -11,25 +11,25 @@ void SliceData_init(struct SliceData_t* self, uint8_t* data, uint16_t data_size_ self->data_size_bytes = data_size_bytes; } -void SliceData_from_cell(struct SliceData_t* self, struct Cell_t* cell) { - uint8_t* cell_data = Cell_get_data(cell); +void SliceData_from_cell(struct SliceData_t *self, struct Cell_t *cell) { + uint8_t *cell_data = Cell_get_data(cell); uint8_t cell_data_size = Cell_get_data_size(cell); SliceData_init(self, cell_data, cell_data_size); } -void SliceData_fill(struct SliceData_t* self, uint8_t value, uint16_t data_size_bytes) { +void SliceData_fill(struct SliceData_t *self, uint8_t value, uint16_t data_size_bytes) { VALIDATE(self && self->data, ERR_SLICE_IS_EMPTY); VALIDATE(self->data_size_bytes >= data_size_bytes, ERR_INVALID_DATA); memset(self->data, value, data_size_bytes); } -void SliceData_truncate(struct SliceData_t* self, uint16_t size) { +void SliceData_truncate(struct SliceData_t *self, uint16_t size) { VALIDATE(self && self->data, ERR_SLICE_IS_EMPTY); VALIDATE(size <= self->data_window_end, ERR_CELL_UNDERFLOW); self->data_window_end = size; } -uint16_t SliceData_remaining_bits(const struct SliceData_t* self) { +uint16_t SliceData_remaining_bits(const struct SliceData_t *self) { VALIDATE(self && self->data, ERR_SLICE_IS_EMPTY); if (self->data_window_start > self->data_window_end) { return 0; @@ -37,13 +37,13 @@ uint16_t SliceData_remaining_bits(const struct SliceData_t* self) { return self->data_window_end - self->data_window_start; } -void SliceData_move_by(struct SliceData_t* self, uint16_t offset) { +void SliceData_move_by(struct SliceData_t *self, uint16_t offset) { VALIDATE(self && self->data, ERR_SLICE_IS_EMPTY); VALIDATE(self->data_window_start + offset <= self->data_window_end, ERR_CELL_UNDERFLOW); self->data_window_start += offset; } -uint8_t SliceData_get_bits(const struct SliceData_t* self, uint16_t offset, uint8_t bits) { +uint8_t SliceData_get_bits(const struct SliceData_t *self, uint16_t offset, uint8_t bits) { VALIDATE(self && self->data, ERR_SLICE_IS_EMPTY); VALIDATE(offset + bits <= SliceData_remaining_bits(self), ERR_CELL_UNDERFLOW); VALIDATE(bits != 0 && bits <= 8, ERR_RANGE_CHECK); @@ -70,23 +70,23 @@ uint8_t SliceData_get_bits(const struct SliceData_t* self, uint16_t offset, uint } } -uint8_t SliceData_get_next_bit(struct SliceData_t* self) { +uint8_t SliceData_get_next_bit(struct SliceData_t *self) { uint8_t bit = SliceData_get_bits(self, 0, 1); SliceData_move_by(self, 1); return bit; } -uint8_t SliceData_get_byte(const struct SliceData_t* self, uint16_t offset) { +uint8_t SliceData_get_byte(const struct SliceData_t *self, uint16_t offset) { return SliceData_get_bits(self, offset, 8); } -uint8_t SliceData_get_next_byte(struct SliceData_t* self) { +uint8_t SliceData_get_next_byte(struct SliceData_t *self) { uint8_t value = SliceData_get_byte(self, 0); SliceData_move_by(self, 8); return value; } -uint64_t SliceData_get_int(const struct SliceData_t* self, uint8_t bits) { +uint64_t SliceData_get_int(const struct SliceData_t *self, uint8_t bits) { VALIDATE(bits <= SliceData_remaining_bits(self), ERR_CELL_UNDERFLOW); VALIDATE(bits <= 64, ERR_RANGE_CHECK); if (bits == 0) { @@ -109,13 +109,13 @@ uint64_t SliceData_get_int(const struct SliceData_t* self, uint8_t bits) { return value >> (64 - bits); } -uint64_t SliceData_get_next_int(struct SliceData_t* self, uint8_t bits) { +uint64_t SliceData_get_next_int(struct SliceData_t *self, uint8_t bits) { uint64_t value = SliceData_get_int(self, bits); SliceData_move_by(self, bits); return value; } -uint64_t SliceData_get_next_size(struct SliceData_t* self, uint16_t max_value) { +uint64_t SliceData_get_next_size(struct SliceData_t *self, uint16_t max_value) { if (max_value == 0) { return 0; } @@ -124,12 +124,12 @@ uint64_t SliceData_get_next_size(struct SliceData_t* self, uint16_t max_value) { return res; } -bool SliceData_is_empty(const struct SliceData_t* self) { +bool SliceData_is_empty(const struct SliceData_t *self) { VALIDATE(self && self->data, ERR_SLICE_IS_EMPTY); return self->data_window_start >= self->data_window_end; } -bool SliceData_equal(const struct SliceData_t* self, const struct SliceData_t* other) { +bool SliceData_equal(const struct SliceData_t *self, const struct SliceData_t *other) { uint32_t self_rb = SliceData_remaining_bits(self); uint32_t other_rb = SliceData_remaining_bits(other); if (self_rb != other_rb) { @@ -139,22 +139,22 @@ bool SliceData_equal(const struct SliceData_t* self, const struct SliceData_t* o return SliceData_get_int(self, self_rb) == SliceData_get_int(other, other_rb); } -uint16_t SliceData_get_cursor(const struct SliceData_t* self) { +uint16_t SliceData_get_cursor(const struct SliceData_t *self) { VALIDATE(self && self->data, ERR_SLICE_IS_EMPTY); return self->data_window_start; } -uint8_t* SliceData_begin(const struct SliceData_t* self) { +uint8_t *SliceData_begin(const struct SliceData_t *self) { VALIDATE(self && self->data, ERR_SLICE_IS_EMPTY); return self->data; } -uint16_t SliceData_data_size(const struct SliceData_t* self) { +uint16_t SliceData_data_size(const struct SliceData_t *self) { VALIDATE(self && self->data, ERR_SLICE_IS_EMPTY); return self->data_size_bytes; } -void SliceData_append(struct SliceData_t* self, uint8_t* in, uint16_t bits, bool append_tag) { +void SliceData_append(struct SliceData_t *self, uint8_t *in, uint16_t bits, bool append_tag) { uint8_t bytes = bits / 8; VALIDATE(bytes <= SliceData_remaining_bits(self) * 8, ERR_CELL_UNDERFLOW); diff --git a/src/utils.c b/src/utils.c index 737713a..4f1b9f6 100644 --- a/src/utils.c +++ b/src/utils.c @@ -10,11 +10,15 @@ void get_public_key(uint32_t account_number, uint8_t *publicKeyArray) { cx_ecfp_private_key_t privateKey; cx_ecfp_public_key_t publicKey; + cx_err_t error; get_private_key(account_number, &privateKey); BEGIN_TRY { TRY { - cx_ecfp_generate_pair(CX_CURVE_Ed25519, &publicKey, &privateKey, 1); + error = cx_ecfp_generate_pair_no_throw(CX_CURVE_Ed25519, &publicKey, &privateKey, 1); + if (error != CX_OK) { + THROW(ERR_GENERATE_PAIR_FAILED); + } } CATCH_OTHER(e) { explicit_bzero(&privateKey, sizeof(privateKey)); @@ -43,18 +47,26 @@ void get_private_key(uint32_t account_number, cx_ecfp_private_key_t *privateKey) 0 | HARDENED_OFFSET, 0 | HARDENED_OFFSET}; - uint8_t privateKeyData[32]; + uint8_t privateKeyData[64]; + cx_err_t error; BEGIN_TRY { TRY { - os_perso_derive_node_bip32_seed_key(HDW_ED25519_SLIP10, - CX_CURVE_Ed25519, - derivePath, - BIP32_PATH, - privateKeyData, - NULL, - NULL, - 0); - cx_ecfp_init_private_key(CX_CURVE_Ed25519, privateKeyData, 32, privateKey); + error = os_derive_bip32_with_seed_no_throw(HDW_ED25519_SLIP10, + CX_CURVE_Ed25519, + derivePath, + BIP32_PATH, + privateKeyData, + NULL, + NULL, + 0); + if (error != CX_OK) { + THROW(ERR_DERIVE_PATH_FAILED); + } + error = + cx_ecfp_init_private_key_no_throw(CX_CURVE_Ed25519, privateKeyData, 32, privateKey); + if (error != CX_OK) { + THROW(ERR_INIT_PRIVATE_KEY_FAILED); + } } CATCH_OTHER(e) { explicit_bzero(&privateKeyData, sizeof(privateKeyData)); From c5781e983a73bedf0797181efc919b978b3313b0 Mon Sep 17 00:00:00 2001 From: keiff3r Date: Mon, 17 Feb 2025 15:47:15 +0100 Subject: [PATCH 19/67] fix: change handleSignTransaction return type from int to void --- src/apdu_constants.h | 2 +- src/sign_transaction.c | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/apdu_constants.h b/src/apdu_constants.h index 6256739..59b7e77 100644 --- a/src/apdu_constants.h +++ b/src/apdu_constants.h @@ -42,7 +42,7 @@ void handleGetAddress(uint8_t p1, volatile unsigned int *flags, volatile unsigned int *tx); void handleSign(uint8_t *dataBuffer, uint16_t dataLength, volatile unsigned int *flags); -int handleSignTransaction(uint8_t *dataBuffer, +void handleSignTransaction(uint8_t *dataBuffer, uint16_t dataLength, volatile unsigned int *flags, bool is_first_chunk, diff --git a/src/sign_transaction.c b/src/sign_transaction.c index 639034e..86e70cd 100644 --- a/src/sign_transaction.c +++ b/src/sign_transaction.c @@ -119,11 +119,11 @@ UX_FLOW(ux_sign_transaction_transfer_flow, &ux_sign_transaction_accept, &ux_sign_transaction_reject); -int handleSignTransaction(uint8_t *dataBuffer, - uint16_t dataLength, - volatile unsigned int *flags, - bool is_first_chunk, - bool more) { +void handleSignTransaction(uint8_t *dataBuffer, + uint16_t dataLength, + volatile unsigned int *flags, + bool is_first_chunk, + bool more) { if (is_first_chunk) { reset_app_context(); } From 1482e6228a5815665ec4873f6a8aecdb8cb6b056 Mon Sep 17 00:00:00 2001 From: keiff3r Date: Mon, 17 Feb 2025 16:27:00 +0100 Subject: [PATCH 20/67] style: update pointer alignment and formatting in .clang-format --- .clang-format | 29 +++------ fuzz/fuzzer.c | 4 +- fuzz/os_mocks.c | 14 ++-- src/byte_stream.c | 18 +++--- src/cell.c | 38 +++++------ src/contract.c | 45 ++++++------- src/get_address.c | 8 +-- src/get_app_configuration.c | 6 +- src/get_public_key.c | 8 +-- src/hashmap_label.c | 14 ++-- src/main.c | 16 ++--- src/message.c | 124 ++++++++++++++++++++---------------- src/sign.c | 8 +-- src/sign_transaction.c | 10 +-- src/slice_data.c | 40 ++++++------ src/utils.c | 22 +++---- 16 files changed, 204 insertions(+), 200 deletions(-) diff --git a/.clang-format b/.clang-format index 3a8467a..e8b1433 100644 --- a/.clang-format +++ b/.clang-format @@ -1,36 +1,23 @@ +--- BasedOnStyle: Google -DerivePointerAlignment: false IndentWidth: 4 Language: Cpp ColumnLimit: 100 -PointerAlignment: Right +DerivePointerAlignment: false +PointerAlignment: Left AlignAfterOpenBracket: Align AlignConsecutiveMacros: true AlignConsecutiveAssignments: true AlignConsecutiveDeclarations: true -AllowAllParametersOfDeclarationOnNextLine: true +AllowAllParametersOfDeclarationOnNextLine: false SortIncludes: false SpaceAfterCStyleCast: true AllowShortCaseLabelsOnASingleLine: false -AllowAllArgumentsOnNextLine: true +AllowAllArgumentsOnNextLine: false AllowShortBlocksOnASingleLine: Never AllowShortFunctionsOnASingleLine: None BinPackArguments: false BinPackParameters: false -BreakBeforeBinaryOperators: NonAssignment -BreakBeforeBraces: Attach -BreakBeforeTernaryOperators: true -BreakConstructorInitializersBeforeComma: true -ReflowComments: false -SpaceBeforeParens: ControlStatements -AlwaysBreakAfterReturnType: None -IndentCaseLabels: true -AllowShortEnumsOnASingleLine: false -BreakStringLiterals: true -IndentWrappedFunctionNames: false -KeepEmptyLinesAtTheStartOfBlocks: false -AlignTrailingComments: true -SortUsingDeclarations: false -PointerBindsToType: true -BraceWrapping: - AfterEnum: true + +--- + diff --git a/fuzz/fuzzer.c b/fuzz/fuzzer.c index 163748a..85b739c 100644 --- a/fuzz/fuzzer.c +++ b/fuzz/fuzzer.c @@ -22,14 +22,14 @@ BocContext_t boc_context; DataContext_t data_context; -void hex_to_bytes(const char *hex, uint8_t *bytes) { +void hex_to_bytes(const char* hex, uint8_t* bytes) { size_t len = strlen(hex); size_t final_len = len / 2; for (size_t i = 0, j = 0; j < final_len; i += 2, j++) bytes[j] = (hex[i] % 32 + 9) % 25 * 16 + (hex[i + 1] % 32 + 9) % 25; } -extern int LLVMFuzzerTestOneInput(const uint8_t *buf, size_t len) { +extern int LLVMFuzzerTestOneInput(const uint8_t* buf, size_t len) { if (len < 1) return -1; /*auto boc = "0101040104a0a0a01a4ba92d8ae00301e02800004000"; diff --git a/fuzz/os_mocks.c b/fuzz/os_mocks.c index 2dd9d95..10ff014 100644 --- a/fuzz/os_mocks.c +++ b/fuzz/os_mocks.c @@ -9,13 +9,13 @@ void os_longjmp(unsigned int exception) { longjmp(try_context_get()->jmp_buf, exception); } -try_context_t *current_context = NULL; -try_context_t *try_context_get(void) { +try_context_t* current_context = NULL; +try_context_t* try_context_get(void) { return current_context; } -try_context_t *try_context_set(try_context_t *ctx) { - try_context_t *previous_ctx = current_context; +try_context_t* try_context_set(try_context_t* ctx) { + try_context_t* previous_ctx = current_context; current_context = ctx; return previous_ctx; } @@ -31,9 +31,9 @@ try_context_t *try_context_set(try_context_t *ctx) { // return CX_OK; // } -size_t cx_hash_sha256(const uint8_t *in, size_t len, uint8_t *out, size_t out_len) { - EVP_MD_CTX *mdctx; - const EVP_MD *md; +size_t cx_hash_sha256(const uint8_t* in, size_t len, uint8_t* out, size_t out_len) { + EVP_MD_CTX* mdctx; + const EVP_MD* md; unsigned int hash_len; uint8_t tmpBuf[EVP_MAX_MD_SIZE]; diff --git a/src/byte_stream.c b/src/byte_stream.c index 714ea0e..319d780 100644 --- a/src/byte_stream.c +++ b/src/byte_stream.c @@ -2,26 +2,26 @@ #include "errors.h" #include "utils.h" -void ByteStream_init(struct ByteStream_t *self, uint8_t *data, uint16_t data_size) { +void ByteStream_init(struct ByteStream_t* self, uint8_t* data, uint16_t data_size) { VALIDATE(self && data && data_size, ERR_END_OF_STREAM); self->data_size = data_size; self->offset = 0; self->data = data; } -void ByteStream_move_by(struct ByteStream_t *self, uint16_t data_size) { +void ByteStream_move_by(struct ByteStream_t* self, uint16_t data_size) { self->offset += data_size; } -uint8_t *ByteStream_read_data(struct ByteStream_t *self, uint32_t data_size) { +uint8_t* ByteStream_read_data(struct ByteStream_t* self, uint32_t data_size) { VALIDATE(self->data_size - self->offset >= data_size, ERR_END_OF_STREAM); - uint8_t *data = self->data + self->offset; + uint8_t* data = self->data + self->offset; ByteStream_move_by(self, data_size); return data; } -uint8_t ByteStream_read_byte(struct ByteStream_t *self) { +uint8_t ByteStream_read_byte(struct ByteStream_t* self) { VALIDATE(self->data_size - self->offset >= sizeof(uint8_t), ERR_END_OF_STREAM); uint8_t byte = self->data[self->offset]; @@ -29,7 +29,7 @@ uint8_t ByteStream_read_byte(struct ByteStream_t *self) { return byte; } -uint32_t ByteStream_read_u32(struct ByteStream_t *self) { +uint32_t ByteStream_read_u32(struct ByteStream_t* self) { VALIDATE(self->data_size - self->offset >= sizeof(uint32_t), ERR_END_OF_STREAM); uint32_t u32 = readUint32BE(self->data + self->offset); @@ -37,15 +37,15 @@ uint32_t ByteStream_read_u32(struct ByteStream_t *self) { return u32; } -uint8_t *ByteStream_get_cursor(struct ByteStream_t *self) { +uint8_t* ByteStream_get_cursor(struct ByteStream_t* self) { return self->data + self->offset; } -uint16_t ByteStream_get_length(struct ByteStream_t *self) { +uint16_t ByteStream_get_length(struct ByteStream_t* self) { return self->data_size - self->offset; } -uint64_t ByteStream_read_uint(struct ByteStream_t *self, uint16_t bytes) { +uint64_t ByteStream_read_uint(struct ByteStream_t* self, uint16_t bytes) { VALIDATE(bytes > 0 && bytes <= 8, ERR_END_OF_STREAM); uint64_t val; diff --git a/src/cell.c b/src/cell.c index 25edfd5..c76a888 100644 --- a/src/cell.c +++ b/src/cell.c @@ -1,42 +1,42 @@ #include "cell.h" #include "utils.h" -void Cell_init(struct Cell_t *self, uint8_t *cell_begin, uint16_t cell_length) { +void Cell_init(struct Cell_t* self, uint8_t* cell_begin, uint16_t cell_length) { VALIDATE(self && cell_begin, ERR_CELL_IS_EMPTY); self->cell_begin = cell_begin; self->cell_length = cell_length; } -uint8_t Cell_get_d1(const struct Cell_t *self) { +uint8_t Cell_get_d1(const struct Cell_t* self) { VALIDATE(self && self->cell_begin, ERR_CELL_IS_EMPTY); VALIDATE(self->cell_length > 0, ERR_INVALID_CELL); return self->cell_begin[0]; } -uint8_t Cell_get_d2(const struct Cell_t *self) { +uint8_t Cell_get_d2(const struct Cell_t* self) { VALIDATE(self && self->cell_begin, ERR_CELL_IS_EMPTY); VALIDATE(self->cell_length > 1, ERR_INVALID_CELL); return self->cell_begin[1]; } -uint8_t Cell_get_data_size(const struct Cell_t *self) { +uint8_t Cell_get_data_size(const struct Cell_t* self) { uint8_t d2 = Cell_get_d2(self); return (d2 >> 1) + (((d2 & 1) != 0) ? 1 : 0); } -uint8_t *Cell_get_data(const struct Cell_t *self) { +uint8_t* Cell_get_data(const struct Cell_t* self) { VALIDATE(self && self->cell_begin, ERR_CELL_IS_EMPTY); return self->cell_begin + CELL_DATA_OFFSET; } -uint8_t *Cell_get_refs(const struct Cell_t *self, uint8_t *refs_count) { +uint8_t* Cell_get_refs(const struct Cell_t* self, uint8_t* refs_count) { uint8_t d1 = Cell_get_d1(self); *refs_count = d1 & 7; uint8_t data_size = Cell_get_data_size(self); return self->cell_begin + CELL_DATA_OFFSET + data_size; } -uint16_t Cell_bit_len(struct Cell_t *self) { +uint16_t Cell_bit_len(struct Cell_t* self) { uint8_t data_size = Cell_get_data_size(self); uint16_t bit_len = data_size * 8; @@ -44,7 +44,7 @@ uint16_t Cell_bit_len(struct Cell_t *self) { return bit_len; } - uint8_t *data = Cell_get_data(self); + uint8_t* data = Cell_get_data(self); for (int8_t i = data_size - 1; i >= 0; --i) { if (data[i] == 0) { bit_len -= 8; @@ -62,7 +62,7 @@ uint16_t Cell_bit_len(struct Cell_t *self) { return bit_len; } -uint16_t deserialize_cell(struct Cell_t *cell, +uint16_t deserialize_cell(struct Cell_t* cell, const uint8_t cell_index, const uint8_t cells_count) { uint8_t d1 = Cell_get_d1(cell); @@ -83,7 +83,7 @@ uint16_t deserialize_cell(struct Cell_t *cell, VALIDATE(!pruned || pruned && (data_size == PRUNED_BRANCH_DATA_SIZE), ERR_INVALID_CELL); uint8_t refs_count = 0; - uint8_t *refs = Cell_get_refs(cell, &refs_count); + uint8_t* refs = Cell_get_refs(cell, &refs_count); for (uint8_t i = 0; i < refs_count; ++i) { VALIDATE(cell && cell->cell_length > CELL_DATA_OFFSET + data_size + i, ERR_INVALID_CELL); @@ -94,8 +94,8 @@ uint16_t deserialize_cell(struct Cell_t *cell, return CELL_DATA_OFFSET + data_size + refs_count; // cell size } -void calc_cell_hash(Cell_t *cell, const uint8_t cell_index) { - BocContext_t *bc = &boc_context; +void calc_cell_hash(Cell_t* cell, const uint8_t cell_index) { + BocContext_t* bc = &boc_context; uint8_t d1 = Cell_get_d1(cell); if (d1 == PRUNED_BRANCH_D1) { @@ -104,7 +104,7 @@ void calc_cell_hash(Cell_t *cell, const uint8_t cell_index) { // 1 byte - level mask // 32 bytes - hash // 2 bytes - cell depth (BE) - uint8_t *cell_data = Cell_get_data(cell); + uint8_t* cell_data = Cell_get_data(cell); memcpy(bc->hashes + cell_index * HASH_SIZE, cell_data + 2, HASH_SIZE); bc->cell_depth[cell_index] = *(cell_data + 2 + HASH_SIZE + 1); return; @@ -125,10 +125,10 @@ void calc_cell_hash(Cell_t *cell, const uint8_t cell_index) { hash_buffer_offset += data_size; uint8_t refs_count = 0; - uint8_t *refs = Cell_get_refs(cell, &refs_count); + uint8_t* refs = Cell_get_refs(cell, &refs_count); VALIDATE(refs_count <= MAX_REFERENCES_COUNT, ERR_INVALID_CELL); for (uint8_t child = 0; child < refs_count; ++child) { - uint8_t *depth = &bc->cell_depth[cell_index]; + uint8_t* depth = &bc->cell_depth[cell_index]; VALIDATE(refs[child] < MAX_CONTRACT_CELLS_COUNT, ERR_INVALID_CELL); uint8_t child_depth = bc->cell_depth[refs[child]]; *depth = (*depth > child_depth + 1) ? *depth : (child_depth + 1); @@ -140,12 +140,14 @@ void calc_cell_hash(Cell_t *cell, const uint8_t cell_index) { } for (uint8_t child = 0; child < refs_count; ++child) { - uint8_t *cell_hash = bc->hashes + refs[child] * HASH_SIZE; + uint8_t* cell_hash = bc->hashes + refs[child] * HASH_SIZE; memcpy(hash_buffer + hash_buffer_offset, cell_hash, HASH_SIZE); hash_buffer_offset += HASH_SIZE; } - int result = cx_hash_sha256( - hash_buffer, hash_buffer_offset, bc->hashes + cell_index * HASH_SIZE, HASH_SIZE); + int result = cx_hash_sha256(hash_buffer, + hash_buffer_offset, + bc->hashes + cell_index * HASH_SIZE, + HASH_SIZE); VALIDATE(result == HASH_SIZE, ERR_INVALID_HASH); } diff --git a/src/contract.c b/src/contract.c index d3915c0..da8494d 100644 --- a/src/contract.c +++ b/src/contract.c @@ -98,7 +98,7 @@ const uint32_t multisig_2_wallet_cell_depth = 0x0C; const uint32_t multisig_2_1_wallet_cell_depth = 0x0A; const uint32_t surf_wallet_cell_depth = 0x0C; -void deserialize_cells_tree(struct ByteStream_t *src) { +void deserialize_cells_tree(struct ByteStream_t* src) { uint8_t first_byte = ByteStream_read_byte(src); { bool index_included = (first_byte & 0x80) != 0; @@ -123,9 +123,9 @@ void deserialize_cells_tree(struct ByteStream_t *src) { { uint8_t absent_count = ByteStream_read_uint(src, ref_size); UNUSED(absent_count); - uint8_t *total_cells_size = ByteStream_read_data(src, offset_size); + uint8_t* total_cells_size = ByteStream_read_data(src, offset_size); UNUSED(total_cells_size); - uint8_t *buf = ByteStream_read_data(src, roots_count * ref_size); + uint8_t* buf = ByteStream_read_data(src, roots_count * ref_size); UNUSED(buf); } @@ -136,7 +136,7 @@ void deserialize_cells_tree(struct ByteStream_t *src) { for (uint8_t i = 0; i < cells_count; ++i) { VALIDATE(i < MAX_CONTRACT_CELLS_COUNT, ERR_INVALID_CONTRACT); - uint8_t *cell_begin = ByteStream_get_cursor(src); + uint8_t* cell_begin = ByteStream_get_cursor(src); uint16_t cell_length = ByteStream_get_length(src); Cell_init(&cell, cell_begin, cell_length); uint16_t offset = deserialize_cell(&cell, i, cells_count); @@ -153,11 +153,11 @@ void deserialize_cells_tree(struct ByteStream_t *src) { } void find_public_key_cell() { - BocContext_t *bc = &boc_context; + BocContext_t* bc = &boc_context; VALIDATE(Cell_get_data(&bc->cells[0])[0] & 0x20, ERR_INVALID_CONTRACT); // has data branch uint8_t refs_count = 0; - uint8_t *refs = Cell_get_refs(&bc->cells[0], &refs_count); + uint8_t* refs = Cell_get_refs(&bc->cells[0], &refs_count); VALIDATE(refs_count > 0 && refs_count <= 2, ERR_INVALID_CONTRACT); uint8_t data_root = refs[refs_count - 1]; @@ -176,7 +176,7 @@ void find_public_key_cell() { #ifndef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION -void compute_wallet_v3_address(uint32_t account_number, uint8_t *address) { +void compute_wallet_v3_address(uint32_t account_number, uint8_t* address) { uint8_t data_hash[HASH_SIZE]; // Compute data hash @@ -234,7 +234,7 @@ void compute_wallet_v3_address(uint32_t account_number, uint8_t *address) { } } -void compute_ever_wallet_address(uint32_t account_number, uint8_t *address) { +void compute_ever_wallet_address(uint32_t account_number, uint8_t* address) { uint8_t data_hash[HASH_SIZE]; // Compute data hash @@ -280,8 +280,9 @@ void compute_ever_wallet_address(uint32_t account_number, uint8_t *address) { hash_buffer_offset += sizeof(uint32_t); // Code hash - memcpy( - hash_buffer + hash_buffer_offset, ever_wallet_code_hash, sizeof(ever_wallet_code_hash)); + memcpy(hash_buffer + hash_buffer_offset, + ever_wallet_code_hash, + sizeof(ever_wallet_code_hash)); hash_buffer_offset += sizeof(ever_wallet_code_hash); // Data hash @@ -294,18 +295,18 @@ void compute_ever_wallet_address(uint32_t account_number, uint8_t *address) { } void compute_multisig_address(uint32_t account_number, - const uint8_t *wallet, + const uint8_t* wallet, uint16_t wallet_size, - const uint8_t *code_hash, + const uint8_t* code_hash, uint32_t cell_depth, - uint8_t *address) { + uint8_t* address) { { ByteStream_t src; - ByteStream_init(&src, (uint8_t *) wallet, wallet_size); + ByteStream_init(&src, (uint8_t*) wallet, wallet_size); deserialize_cells_tree(&src); } - BocContext_t *bc = &boc_context; + BocContext_t* bc = &boc_context; VALIDATE(bc->cells_count != 0, ERR_INVALID_CONTRACT); find_public_key_cell(); // sets public key cell index to boc_context @@ -315,31 +316,31 @@ void compute_multisig_address(uint32_t account_number, bc->cell_depth[bc->public_key_cell_index + 1] = cell_depth; VALIDATE(bc->public_key_cell_index && bc->public_key_label_size_bits, ERR_INVALID_CONTRACT); - Cell_t *cell = &bc->cells[bc->public_key_cell_index]; + Cell_t* cell = &bc->cells[bc->public_key_cell_index]; uint8_t cell_data_size = Cell_get_data_size(cell); VALIDATE(cell_data_size != 0 && cell_data_size <= MAX_PUBLIC_KEY_CELL_DATA_SIZE, ERR_INVALID_CONTRACT); - uint8_t *cell_data = Cell_get_data(cell); + uint8_t* cell_data = Cell_get_data(cell); memcpy(bc->public_key_cell_data, cell_data, cell_data_size); - uint8_t *public_key = data_context.pk_context.public_key; + uint8_t* public_key = data_context.pk_context.public_key; get_public_key(account_number, public_key); - uint8_t *data = bc->public_key_cell_data; + uint8_t* data = bc->public_key_cell_data; SliceData_t slice; SliceData_init(&slice, data, sizeof(bc->public_key_cell_data)); SliceData_move_by(&slice, bc->public_key_label_size_bits); SliceData_append(&slice, public_key, PUBLIC_KEY_LENGTH * 8, true); for (int16_t i = bc->public_key_cell_index; i >= 0; --i) { - Cell_t *it_cell = &bc->cells[i]; + Cell_t* it_cell = &bc->cells[i]; calc_cell_hash(it_cell, i); } memcpy(address, bc->hashes, HASH_SIZE); } -void get_address(const uint32_t account_number, uint8_t wallet_type, uint8_t *address) { +void get_address(const uint32_t account_number, uint8_t wallet_type, uint8_t* address) { switch (wallet_type) { case WALLET_V3: { compute_wallet_v3_address(account_number, address); @@ -419,7 +420,7 @@ void get_address(const uint32_t account_number, uint8_t wallet_type, uint8_t *ad #else -void get_address(const uint32_t account_number, uint8_t wallet_type, uint8_t *address) { +void get_address(const uint32_t account_number, uint8_t wallet_type, uint8_t* address) { } #endif diff --git a/src/get_address.c b/src/get_address.c index efab109..f2dc790 100644 --- a/src/get_address.c +++ b/src/get_address.c @@ -50,10 +50,10 @@ UX_FLOW(ux_display_address_flow, void handleGetAddress(uint8_t p1, uint8_t p2, - uint8_t *dataBuffer, + uint8_t* dataBuffer, uint16_t dataLength, - volatile unsigned int *flags, - volatile unsigned int *tx) { + volatile unsigned int* flags, + volatile unsigned int* tx) { VALIDATE(p2 == 0 && dataLength == (sizeof(uint32_t) + sizeof(uint8_t)), ERR_INVALID_REQUEST); size_t offset = 0; @@ -70,7 +70,7 @@ void handleGetAddress(uint8_t p1, THROW(SUCCESS); } if (p1 == P1_CONFIRM) { - AddressContext_t *context = &data_context.addr_context; + AddressContext_t* context = &data_context.addr_context; format_hex(context->address, sizeof(context->address), context->address_str, diff --git a/src/get_app_configuration.c b/src/get_app_configuration.c index fcee9ac..645a3f5 100644 --- a/src/get_app_configuration.c +++ b/src/get_app_configuration.c @@ -4,10 +4,10 @@ void handleGetAppConfiguration(uint8_t p1, uint8_t p2, - uint8_t *dataBuffer, + uint8_t* dataBuffer, uint16_t dataLength, - volatile unsigned int *flags, - volatile unsigned int *tx) { + volatile unsigned int* flags, + volatile unsigned int* tx) { UNUSED(dataBuffer); UNUSED(flags); VALIDATE(p1 == 0 && p2 == 0 && dataLength == 0, ERR_INVALID_REQUEST); diff --git a/src/get_public_key.c b/src/get_public_key.c index 886873c..63e29e2 100644 --- a/src/get_public_key.c +++ b/src/get_public_key.c @@ -45,14 +45,14 @@ UX_FLOW(ux_display_public_flow, void handleGetPublicKey(uint8_t p1, uint8_t p2, - uint8_t *dataBuffer, + uint8_t* dataBuffer, uint16_t dataLength, - volatile unsigned int *flags, - volatile unsigned int *tx) { + volatile unsigned int* flags, + volatile unsigned int* tx) { VALIDATE(p2 == 0 && dataLength == sizeof(uint32_t), ERR_INVALID_REQUEST); uint32_t account_number = readUint32BE(dataBuffer); - PublicKeyContext_t *context = &data_context.pk_context; + PublicKeyContext_t* context = &data_context.pk_context; get_public_key(account_number, context->public_key); if (p1 == P1_NON_CONFIRM) { *tx = set_result_get_public_key(); diff --git a/src/hashmap_label.c b/src/hashmap_label.c index 5e2f216..8ad896e 100644 --- a/src/hashmap_label.c +++ b/src/hashmap_label.c @@ -4,7 +4,7 @@ #include "utils.h" #include "errors.h" -uint8_t get_label_same(uint8_t max, struct SliceData_t *slice, struct SliceData_t *label) { +uint8_t get_label_same(uint8_t max, struct SliceData_t* slice, struct SliceData_t* label) { uint8_t value = SliceData_get_next_bit(slice) ? 0xff : 0; uint8_t length = SliceData_get_next_size(slice, max); VALIDATE(length <= 64, ERR_RANGE_CHECK); @@ -15,7 +15,7 @@ uint8_t get_label_same(uint8_t max, struct SliceData_t *slice, struct SliceData_ return length >= max ? 0 : (max - length); } -uint8_t get_label(uint8_t max, struct SliceData_t *slice, struct SliceData_t *label) { +uint8_t get_label(uint8_t max, struct SliceData_t* slice, struct SliceData_t* label) { VALIDATE(SliceData_is_empty(slice) == false, ERR_SLICE_IS_EMPTY); VALIDATE(SliceData_get_next_bit(slice) == 1, ERR_WRONG_LABEL); // label short VALIDATE(SliceData_get_next_bit(slice) == 1, ERR_WRONG_LABEL); // label long @@ -23,7 +23,7 @@ uint8_t get_label(uint8_t max, struct SliceData_t *slice, struct SliceData_t *la return get_label_same(max, slice, label); } -void put_to_node(uint8_t cell_index, uint16_t bit_len, struct SliceData_t *key) { +void put_to_node(uint8_t cell_index, uint16_t bit_len, struct SliceData_t* key) { VALIDATE(cell_index != 0 && cell_index <= MAX_CONTRACT_CELLS_COUNT, ERR_INVALID_DATA); static const uint8_t key_len_bytes = 8; VALIDATE(key && key->data_size_bytes == key_len_bytes, ERR_RANGE_CHECK); @@ -31,7 +31,7 @@ void put_to_node(uint8_t cell_index, uint16_t bit_len, struct SliceData_t *key) VALIDATE(key->data[i] == 0, ERR_INVALID_KEY); } - Cell_t *cell = &boc_context.cells[cell_index]; + Cell_t* cell = &boc_context.cells[cell_index]; SliceData_t slice; SliceData_init(&slice, Cell_get_data(cell), Cell_get_data_size(cell)); @@ -55,8 +55,8 @@ void put_to_node(uint8_t cell_index, uint16_t bit_len, struct SliceData_t *key) MIN(SliceData_remaining_bits(&label), SliceData_remaining_bits(key)); VALIDATE(max_prefix_len <= 64, ERR_RANGE_CHECK); uint8_t i = 0; - while (i < max_prefix_len - && SliceData_get_bits(&label, i, 1) == SliceData_get_bits(key, i, 1)) { + while (i < max_prefix_len && + SliceData_get_bits(&label, i, 1) == SliceData_get_bits(key, i, 1)) { i += 1; } @@ -72,7 +72,7 @@ void put_to_node(uint8_t cell_index, uint16_t bit_len, struct SliceData_t *key) VALIDATE(next_index == 0, ERR_INVALID_KEY); uint8_t refs_count = 0; - uint8_t *refs = Cell_get_refs(&boc_context.cells[cell_index], &refs_count); + uint8_t* refs = Cell_get_refs(&boc_context.cells[cell_index], &refs_count); VALIDATE(refs_count > 0 && refs_count <= MAX_REFERENCES_COUNT, ERR_INVALID_DATA); uint8_t next_cell = refs[next_index]; VALIDATE(next_cell != 0 && next_cell <= MAX_CONTRACT_CELLS_COUNT, ERR_INVALID_DATA); diff --git a/src/main.c b/src/main.c index bfc6487..5a7f771 100644 --- a/src/main.c +++ b/src/main.c @@ -33,7 +33,7 @@ void reset_spi_buffer() { memset(&G_io_seproxyhal_spi_buffer, 0, sizeof(G_io_seproxyhal_spi_buffer)); } -void handleApdu(volatile unsigned int *flags, volatile unsigned int *tx, int rx) { +void handleApdu(volatile unsigned int* flags, volatile unsigned int* tx, int rx) { unsigned short sw = 0; if (!flags || !tx) { @@ -99,8 +99,8 @@ void handleApdu(volatile unsigned int *flags, volatile unsigned int *tx, int rx) } break; case INS_SIGN: { - if (G_io_apdu_buffer[OFFSET_P1] != P1_CONFIRM - || G_io_apdu_buffer[OFFSET_P2] != 0) { + if (G_io_apdu_buffer[OFFSET_P1] != P1_CONFIRM || + G_io_apdu_buffer[OFFSET_P2] != 0) { THROW(0x6802); } @@ -249,8 +249,8 @@ void app_main(void) { } // override point, but nothing more to do -void io_seproxyhal_display(const bagl_element_t *element) { - io_seproxyhal_display_default((bagl_element_t *) element); +void io_seproxyhal_display(const bagl_element_t* element) { + io_seproxyhal_display_default((bagl_element_t*) element); } unsigned char io_event(unsigned char channel) { @@ -270,9 +270,9 @@ unsigned char io_event(unsigned char channel) { break; case SEPROXYHAL_TAG_STATUS_EVENT: - if (G_io_apdu_media == IO_APDU_MEDIA_USB_HID - && !(U4BE(G_io_seproxyhal_spi_buffer, 3) - & SEPROXYHAL_TAG_STATUS_EVENT_FLAG_USB_POWERED)) { + if (G_io_apdu_media == IO_APDU_MEDIA_USB_HID && + !(U4BE(G_io_seproxyhal_spi_buffer, 3) & + SEPROXYHAL_TAG_STATUS_EVENT_FLAG_USB_POWERED)) { THROW(EXCEPTION_IO_RESET); } // no break is intentional diff --git a/src/message.c b/src/message.c index 11bf637..dc6f0cf 100644 --- a/src/message.c +++ b/src/message.c @@ -8,8 +8,11 @@ #define ROOT_CELL_INDEX 0 #define GIFT_CELL_INDEX 1 -void deserialize_array( - uint8_t *in, uint8_t in_size, uint16_t offset, uint8_t *out, uint8_t out_size) { +void deserialize_array(uint8_t* in, + uint8_t in_size, + uint16_t offset, + uint8_t* out, + uint8_t out_size) { uint8_t shift = offset % 8; uint8_t first_data_byte = offset / 8; for (uint16_t i = first_data_byte, j = 0; j < out_size; ++i, ++j) { @@ -28,7 +31,7 @@ void deserialize_array( } } -void deserialize_address(struct SliceData_t *slice, int8_t *wc, uint8_t *address) { +void deserialize_address(struct SliceData_t* slice, int8_t* wc, uint8_t* address) { uint8_t addr_type = SliceData_get_next_int(slice, 2); VALIDATE(addr_type == 0 || addr_type == 2, ERR_INVALID_MESSAGE); @@ -38,7 +41,7 @@ void deserialize_address(struct SliceData_t *slice, int8_t *wc, uint8_t *address *wc = (int8_t) SliceData_get_next_byte(slice); - uint8_t *data = SliceData_begin(slice); + uint8_t* data = SliceData_begin(slice); uint16_t offset = SliceData_get_cursor(slice); uint16_t data_size = SliceData_data_size(slice); @@ -48,8 +51,8 @@ void deserialize_address(struct SliceData_t *slice, int8_t *wc, uint8_t *address } } -void deserialize_value(struct SliceData_t *slice, uint8_t *value, uint8_t value_length) { - uint8_t *data = SliceData_begin(slice); +void deserialize_value(struct SliceData_t* slice, uint8_t* value, uint8_t value_length) { + uint8_t* data = SliceData_begin(slice); uint16_t data_size = SliceData_data_size(slice); uint16_t offset = SliceData_get_cursor(slice); @@ -57,32 +60,34 @@ void deserialize_value(struct SliceData_t *slice, uint8_t *value, uint8_t value_ SliceData_move_by(slice, value_length * 8); } -void set_dst_address(uint8_t wc, const uint8_t *address) { +void set_dst_address(uint8_t wc, const uint8_t* address) { char wc_temp[6]; // snprintf always returns zero snprintf(wc_temp, sizeof(wc_temp), "%d:", (int8_t) wc); int wc_len = strlen(wc_temp); - char *address_str = data_context.sign_tr_context.address_str; + char* address_str = data_context.sign_tr_context.address_str; memcpy(address_str, wc_temp, wc_len); address_str += wc_len; - format_hex( - address, ADDRESS_LENGTH, address_str, sizeof(data_context.sign_tr_context.address_str)); + format_hex(address, + ADDRESS_LENGTH, + address_str, + sizeof(data_context.sign_tr_context.address_str)); } -void set_amount(const uint8_t *amount, +void set_amount(const uint8_t* amount, uint8_t amount_length, uint8_t flags, uint8_t decimals, - const char *ticker) { - char *amount_str = data_context.sign_tr_context.amount_str; + const char* ticker) { + char* amount_str = data_context.sign_tr_context.amount_str; size_t amount_str_size = sizeof(data_context.sign_tr_context.amount_str); memset(amount_str, 0, amount_str_size); switch (flags) { case NORMAL_FLAG: { - const char *space = " "; + const char* space = " "; uint8_t text_size = convert_hex_amount_to_displayable(amount, decimals, amount_length, amount_str); VALIDATE(amount_str_size >= text_size + strlen(space) + strlen(ticker), @@ -93,14 +98,14 @@ void set_amount(const uint8_t *amount, break; } case ALL_BALANCE_FLAG: { - const char *text = "All balance"; + const char* text = "All balance"; VALIDATE(amount_str_size >= strlen(text), ERR_INVALID_MESSAGE); strncpy(amount_str, text, strlen(text)); break; } case ALL_BALANCE_AND_DELETE_FLAG: { - const char *text = "All balance and delete account"; + const char* text = "All balance and delete account"; VALIDATE(amount_str_size >= strlen(text), ERR_INVALID_MESSAGE); strncpy(amount_str, text, strlen(text)); @@ -111,8 +116,8 @@ void set_amount(const uint8_t *amount, } } -void set_transaction_id(const uint8_t *transaction_id) { - char *transaction_id_str = data_context.sign_tr_context.transaction_id_str; +void set_transaction_id(const uint8_t* transaction_id) { + char* transaction_id_str = data_context.sign_tr_context.transaction_id_str; memset(transaction_id_str, 0, sizeof(data_context.sign_tr_context.transaction_id_str)); format_hex(transaction_id, TRANSACTION_ID_LENGTH, @@ -120,9 +125,9 @@ void set_transaction_id(const uint8_t *transaction_id) { sizeof(data_context.sign_tr_context.transaction_id_str)); } -void deserialize_int_message_header(struct SliceData_t *slice, +void deserialize_int_message_header(struct SliceData_t* slice, uint8_t flags, - SignTransactionContext_t *ctx) { + SignTransactionContext_t* ctx) { uint8_t int_msg = SliceData_get_next_bit(slice); VALIDATE(!int_msg, ERR_INVALID_MESSAGE); @@ -173,13 +178,13 @@ void deserialize_int_message_header(struct SliceData_t *slice, UNUSED(created_at); } -int deserialize_token_body(struct SliceData_t *slice, - struct SliceData_t *ref_slice, - SignTransactionContext_t *ctx) { +int deserialize_token_body(struct SliceData_t* slice, + struct SliceData_t* ref_slice, + SignTransactionContext_t* ctx) { // FunctionId if (SliceData_remaining_bits(slice) < sizeof(uint32_t) * 8) { - if (!ref_slice || !ref_slice->data - || (SliceData_remaining_bits(ref_slice) < sizeof(uint32_t) * 8)) { + if (!ref_slice || !ref_slice->data || + (SliceData_remaining_bits(ref_slice) < sizeof(uint32_t) * 8)) { // Empty payload is ok return SIGN_TRANSACTION_FLOW_TRANSFER; } @@ -250,11 +255,11 @@ int deserialize_token_body(struct SliceData_t *slice, return sign_transaction_flow; } -int deserialize_multisig_params(struct SliceData_t *slice, +int deserialize_multisig_params(struct SliceData_t* slice, uint32_t function_id, uint8_t wc, - uint8_t *address, - SignTransactionContext_t *ctx) { + uint8_t* address, + SignTransactionContext_t* ctx) { int sign_transaction_flow = SIGN_TRANSACTION_FLOW_ERROR; switch (function_id) { @@ -343,9 +348,9 @@ int deserialize_multisig_params(struct SliceData_t *slice, return sign_transaction_flow; } -void prepare_payload_hash(BocContext_t *bc) { +void prepare_payload_hash(BocContext_t* bc) { for (int16_t i = bc->cells_count - 1; i >= 0; --i) { - Cell_t *cell = &bc->cells[i]; + Cell_t* cell = &bc->cells[i]; calc_cell_hash(cell, i); } @@ -363,7 +368,7 @@ void prepare_payload_hash(BocContext_t *bc) { } } -uint32_t deserialize_wallet_v3(struct SliceData_t *slice) { +uint32_t deserialize_wallet_v3(struct SliceData_t* slice) { uint32_t id = SliceData_get_next_int(slice, 32); VALIDATE(id == WALLET_ID, ERR_INVALID_MESSAGE); @@ -381,7 +386,7 @@ uint32_t deserialize_wallet_v3(struct SliceData_t *slice) { return flags; } -uint32_t deserialize_contract_header(struct SliceData_t *slice) { +uint32_t deserialize_contract_header(struct SliceData_t* slice) { uint8_t is_pubkey_present = SliceData_get_next_bit(slice); if (is_pubkey_present) { SliceData_move_by(slice, PUBLIC_KEY_LENGTH * 8); @@ -397,11 +402,11 @@ uint32_t deserialize_contract_header(struct SliceData_t *slice) { return function_id; } -void prepend_address_to_cell(uint8_t *cell_buffer, +void prepend_address_to_cell(uint8_t* cell_buffer, uint16_t cell_buffer_size, - struct Cell_t *cell, + struct Cell_t* cell, uint8_t wc, - uint8_t *address) { + uint8_t* address) { uint16_t bit_len = Cell_bit_len(cell); bit_len += 267; // Prefix(2) + Anycast(1) + WorkchainId(8) + Address(32 * 8) @@ -426,13 +431,13 @@ void prepend_address_to_cell(uint8_t *cell_buffer, SliceData_append(&slice, address, ADDRESS_LENGTH * 8, false); // Append cell data - uint8_t *data = Cell_get_data(cell); + uint8_t* data = Cell_get_data(cell); uint8_t data_size = Cell_get_data_size(cell); SliceData_append(&slice, data, data_size * 8, false); // Append references uint8_t refs_count = 0; - uint8_t *refs = Cell_get_refs(cell, &refs_count); + uint8_t* refs = Cell_get_refs(cell, &refs_count); VALIDATE(refs_count <= MAX_REFERENCES_COUNT, ERR_INVALID_MESSAGE); for (uint8_t child = 0; child < refs_count; ++child) { @@ -444,20 +449,20 @@ void prepend_address_to_cell(uint8_t *cell_buffer, cell->cell_begin = cell_buffer; } -int prepare_to_sign(struct ByteStream_t *src, +int prepare_to_sign(struct ByteStream_t* src, uint8_t wc, - uint8_t *address, - uint8_t *prepend_address) { + uint8_t* address, + uint8_t* prepend_address) { // Init context - BocContext_t *bc = &boc_context; - DataContext_t *dc = &data_context; + BocContext_t* bc = &boc_context; + DataContext_t* dc = &data_context; // Parse transaction boc deserialize_cells_tree(src); // Root VALIDATE(bc->cells_count > ROOT_CELL_INDEX, ERR_INVALID_MESSAGE); - Cell_t *root_cell = &bc->cells[ROOT_CELL_INDEX]; + Cell_t* root_cell = &bc->cells[ROOT_CELL_INDEX]; SliceData_t root_slice; SliceData_from_cell(&root_slice, root_cell); @@ -470,7 +475,7 @@ int prepare_to_sign(struct ByteStream_t *src, // Gift VALIDATE(bc->cells_count > GIFT_CELL_INDEX, ERR_INVALID_CELL_INDEX); - Cell_t *gift_cell = &bc->cells[GIFT_CELL_INDEX]; + Cell_t* gift_cell = &bc->cells[GIFT_CELL_INDEX]; SliceData_t gift_slice; SliceData_from_cell(&gift_slice, gift_cell); @@ -492,7 +497,7 @@ int prepare_to_sign(struct ByteStream_t *src, uint8_t body_bit = SliceData_get_next_bit(&gift_slice); if (body_bit || gift_refs_count) { VALIDATE(bc->cells_count > GIFT_CELL_INDEX + 1, ERR_INVALID_CELL_INDEX); - Cell_t *ref_cell = &bc->cells[GIFT_CELL_INDEX + 1]; + Cell_t* ref_cell = &bc->cells[GIFT_CELL_INDEX + 1]; SliceData_t ref_slice; SliceData_from_cell(&ref_slice, ref_cell); @@ -518,7 +523,7 @@ int prepare_to_sign(struct ByteStream_t *src, // Gift VALIDATE(in_same_cell || bc->cells_count > GIFT_CELL_INDEX, ERR_INVALID_CELL_INDEX); - Cell_t *gift_cell = in_same_cell ? root_cell : &bc->cells[GIFT_CELL_INDEX]; + Cell_t* gift_cell = in_same_cell ? root_cell : &bc->cells[GIFT_CELL_INDEX]; SliceData_t gift_slice; if (in_same_cell) { @@ -527,8 +532,11 @@ int prepare_to_sign(struct ByteStream_t *src, SliceData_from_cell(&gift_slice, gift_cell); } - sign_transaction_flow = deserialize_multisig_params( - &gift_slice, function_id, wc, address, &dc->sign_tr_context); + sign_transaction_flow = deserialize_multisig_params(&gift_slice, + function_id, + wc, + address, + &dc->sign_tr_context); uint8_t gift_refs_count; Cell_get_refs(gift_cell, &gift_refs_count); @@ -536,7 +544,7 @@ int prepare_to_sign(struct ByteStream_t *src, // Gift body if (gift_refs_count) { VALIDATE(bc->cells_count > GIFT_CELL_INDEX + 1, ERR_INVALID_CELL_INDEX); - Cell_t *body_cell = &bc->cells[GIFT_CELL_INDEX + 1]; + Cell_t* body_cell = &bc->cells[GIFT_CELL_INDEX + 1]; SliceData_t body_slice; SliceData_from_cell(&body_slice, body_cell); @@ -560,13 +568,16 @@ int prepare_to_sign(struct ByteStream_t *src, // Gift VALIDATE(bc->cells_count > GIFT_CELL_INDEX, ERR_INVALID_CELL_INDEX); - Cell_t *gift_cell = &bc->cells[GIFT_CELL_INDEX]; + Cell_t* gift_cell = &bc->cells[GIFT_CELL_INDEX]; SliceData_t gift_slice; SliceData_from_cell(&gift_slice, gift_cell); - sign_transaction_flow = deserialize_multisig_params( - &gift_slice, function_id, wc, address, &dc->sign_tr_context); + sign_transaction_flow = deserialize_multisig_params(&gift_slice, + function_id, + wc, + address, + &dc->sign_tr_context); uint8_t gift_refs_count; Cell_get_refs(gift_cell, &gift_refs_count); @@ -574,7 +585,7 @@ int prepare_to_sign(struct ByteStream_t *src, // Gift body if (gift_refs_count) { VALIDATE(bc->cells_count > GIFT_CELL_INDEX + 1, ERR_INVALID_CELL_INDEX); - Cell_t *body_cell = &bc->cells[GIFT_CELL_INDEX + 1]; + Cell_t* body_cell = &bc->cells[GIFT_CELL_INDEX + 1]; SliceData_t body_slice; SliceData_from_cell(&body_slice, body_cell); @@ -587,8 +598,11 @@ int prepare_to_sign(struct ByteStream_t *src, // Prepend address to root cell uint8_t cell_buffer[130]; // d1(1) + d2(1) + data(128) - prepend_address_to_cell( - cell_buffer, sizeof(cell_buffer), root_cell, wc, prepend_address); + prepend_address_to_cell(cell_buffer, + sizeof(cell_buffer), + root_cell, + wc, + prepend_address); // Calculate payload hash to sign prepare_payload_hash(bc); diff --git a/src/sign.c b/src/sign.c index b7be299..e8ce30b 100644 --- a/src/sign.c +++ b/src/sign.c @@ -6,7 +6,7 @@ static const char SIGN_MAGIC[] = {0xFF, 0xFF, 0xFF, 0xFF}; static uint8_t set_result_sign() { cx_ecfp_private_key_t privateKey; - SignContext_t *context = &data_context.sign_context; + SignContext_t* context = &data_context.sign_context; cx_err_t error; BEGIN_TRY { TRY { @@ -70,10 +70,10 @@ UX_FLOW(ux_sign_flow, &ux_sign_flow_3_step, &ux_sign_flow_4_step); -void handleSign(uint8_t *dataBuffer, +void handleSign(uint8_t* dataBuffer, __attribute__((unused)) uint16_t dataLength, - volatile unsigned int *flags) { - SignContext_t *context = &data_context.sign_context; + volatile unsigned int* flags) { + SignContext_t* context = &data_context.sign_context; size_t offset = 0; diff --git a/src/sign_transaction.c b/src/sign_transaction.c index 86e70cd..312b9c2 100644 --- a/src/sign_transaction.c +++ b/src/sign_transaction.c @@ -7,7 +7,7 @@ static uint8_t set_result_sign_transaction() { cx_ecfp_private_key_t privateKey; - SignTransactionContext_t *context = &data_context.sign_tr_context; + SignTransactionContext_t* context = &data_context.sign_tr_context; cx_err_t error; BEGIN_TRY { @@ -119,16 +119,16 @@ UX_FLOW(ux_sign_transaction_transfer_flow, &ux_sign_transaction_accept, &ux_sign_transaction_reject); -void handleSignTransaction(uint8_t *dataBuffer, +void handleSignTransaction(uint8_t* dataBuffer, uint16_t dataLength, - volatile unsigned int *flags, + volatile unsigned int* flags, bool is_first_chunk, bool more) { if (is_first_chunk) { reset_app_context(); } - SignTransactionContext_t *context = &data_context.sign_tr_context; + SignTransactionContext_t* context = &data_context.sign_tr_context; size_t offset = 0; @@ -204,7 +204,7 @@ void handleSignTransaction(uint8_t *dataBuffer, // offset is a pointer to dataBuffer, or the number of bytes we moved. here + offset means start // of the message we need to save data to a context buffer and add msg_length to offset of this // buffer - uint8_t *msg_begin = dataBuffer + offset; + uint8_t* msg_begin = dataBuffer + offset; // Since we check LC dataLength can not be manipulated uint16_t msg_length = dataLength - offset; diff --git a/src/slice_data.c b/src/slice_data.c index fed1bc9..8184186 100644 --- a/src/slice_data.c +++ b/src/slice_data.c @@ -3,7 +3,7 @@ #include "utils.h" #include "cell.h" -void SliceData_init(struct SliceData_t *self, uint8_t *data, uint16_t data_size_bytes) { +void SliceData_init(struct SliceData_t* self, uint8_t* data, uint16_t data_size_bytes) { VALIDATE(self && data, ERR_SLICE_IS_EMPTY); self->data = data; self->data_window_start = 0; @@ -11,25 +11,25 @@ void SliceData_init(struct SliceData_t *self, uint8_t *data, uint16_t data_size_ self->data_size_bytes = data_size_bytes; } -void SliceData_from_cell(struct SliceData_t *self, struct Cell_t *cell) { - uint8_t *cell_data = Cell_get_data(cell); +void SliceData_from_cell(struct SliceData_t* self, struct Cell_t* cell) { + uint8_t* cell_data = Cell_get_data(cell); uint8_t cell_data_size = Cell_get_data_size(cell); SliceData_init(self, cell_data, cell_data_size); } -void SliceData_fill(struct SliceData_t *self, uint8_t value, uint16_t data_size_bytes) { +void SliceData_fill(struct SliceData_t* self, uint8_t value, uint16_t data_size_bytes) { VALIDATE(self && self->data, ERR_SLICE_IS_EMPTY); VALIDATE(self->data_size_bytes >= data_size_bytes, ERR_INVALID_DATA); memset(self->data, value, data_size_bytes); } -void SliceData_truncate(struct SliceData_t *self, uint16_t size) { +void SliceData_truncate(struct SliceData_t* self, uint16_t size) { VALIDATE(self && self->data, ERR_SLICE_IS_EMPTY); VALIDATE(size <= self->data_window_end, ERR_CELL_UNDERFLOW); self->data_window_end = size; } -uint16_t SliceData_remaining_bits(const struct SliceData_t *self) { +uint16_t SliceData_remaining_bits(const struct SliceData_t* self) { VALIDATE(self && self->data, ERR_SLICE_IS_EMPTY); if (self->data_window_start > self->data_window_end) { return 0; @@ -37,13 +37,13 @@ uint16_t SliceData_remaining_bits(const struct SliceData_t *self) { return self->data_window_end - self->data_window_start; } -void SliceData_move_by(struct SliceData_t *self, uint16_t offset) { +void SliceData_move_by(struct SliceData_t* self, uint16_t offset) { VALIDATE(self && self->data, ERR_SLICE_IS_EMPTY); VALIDATE(self->data_window_start + offset <= self->data_window_end, ERR_CELL_UNDERFLOW); self->data_window_start += offset; } -uint8_t SliceData_get_bits(const struct SliceData_t *self, uint16_t offset, uint8_t bits) { +uint8_t SliceData_get_bits(const struct SliceData_t* self, uint16_t offset, uint8_t bits) { VALIDATE(self && self->data, ERR_SLICE_IS_EMPTY); VALIDATE(offset + bits <= SliceData_remaining_bits(self), ERR_CELL_UNDERFLOW); VALIDATE(bits != 0 && bits <= 8, ERR_RANGE_CHECK); @@ -70,23 +70,23 @@ uint8_t SliceData_get_bits(const struct SliceData_t *self, uint16_t offset, uint } } -uint8_t SliceData_get_next_bit(struct SliceData_t *self) { +uint8_t SliceData_get_next_bit(struct SliceData_t* self) { uint8_t bit = SliceData_get_bits(self, 0, 1); SliceData_move_by(self, 1); return bit; } -uint8_t SliceData_get_byte(const struct SliceData_t *self, uint16_t offset) { +uint8_t SliceData_get_byte(const struct SliceData_t* self, uint16_t offset) { return SliceData_get_bits(self, offset, 8); } -uint8_t SliceData_get_next_byte(struct SliceData_t *self) { +uint8_t SliceData_get_next_byte(struct SliceData_t* self) { uint8_t value = SliceData_get_byte(self, 0); SliceData_move_by(self, 8); return value; } -uint64_t SliceData_get_int(const struct SliceData_t *self, uint8_t bits) { +uint64_t SliceData_get_int(const struct SliceData_t* self, uint8_t bits) { VALIDATE(bits <= SliceData_remaining_bits(self), ERR_CELL_UNDERFLOW); VALIDATE(bits <= 64, ERR_RANGE_CHECK); if (bits == 0) { @@ -109,13 +109,13 @@ uint64_t SliceData_get_int(const struct SliceData_t *self, uint8_t bits) { return value >> (64 - bits); } -uint64_t SliceData_get_next_int(struct SliceData_t *self, uint8_t bits) { +uint64_t SliceData_get_next_int(struct SliceData_t* self, uint8_t bits) { uint64_t value = SliceData_get_int(self, bits); SliceData_move_by(self, bits); return value; } -uint64_t SliceData_get_next_size(struct SliceData_t *self, uint16_t max_value) { +uint64_t SliceData_get_next_size(struct SliceData_t* self, uint16_t max_value) { if (max_value == 0) { return 0; } @@ -124,12 +124,12 @@ uint64_t SliceData_get_next_size(struct SliceData_t *self, uint16_t max_value) { return res; } -bool SliceData_is_empty(const struct SliceData_t *self) { +bool SliceData_is_empty(const struct SliceData_t* self) { VALIDATE(self && self->data, ERR_SLICE_IS_EMPTY); return self->data_window_start >= self->data_window_end; } -bool SliceData_equal(const struct SliceData_t *self, const struct SliceData_t *other) { +bool SliceData_equal(const struct SliceData_t* self, const struct SliceData_t* other) { uint32_t self_rb = SliceData_remaining_bits(self); uint32_t other_rb = SliceData_remaining_bits(other); if (self_rb != other_rb) { @@ -139,22 +139,22 @@ bool SliceData_equal(const struct SliceData_t *self, const struct SliceData_t *o return SliceData_get_int(self, self_rb) == SliceData_get_int(other, other_rb); } -uint16_t SliceData_get_cursor(const struct SliceData_t *self) { +uint16_t SliceData_get_cursor(const struct SliceData_t* self) { VALIDATE(self && self->data, ERR_SLICE_IS_EMPTY); return self->data_window_start; } -uint8_t *SliceData_begin(const struct SliceData_t *self) { +uint8_t* SliceData_begin(const struct SliceData_t* self) { VALIDATE(self && self->data, ERR_SLICE_IS_EMPTY); return self->data; } -uint16_t SliceData_data_size(const struct SliceData_t *self) { +uint16_t SliceData_data_size(const struct SliceData_t* self) { VALIDATE(self && self->data, ERR_SLICE_IS_EMPTY); return self->data_size_bytes; } -void SliceData_append(struct SliceData_t *self, uint8_t *in, uint16_t bits, bool append_tag) { +void SliceData_append(struct SliceData_t* self, uint8_t* in, uint16_t bits, bool append_tag) { uint8_t bytes = bits / 8; VALIDATE(bytes <= SliceData_remaining_bits(self) * 8, ERR_CELL_UNDERFLOW); diff --git a/src/utils.c b/src/utils.c index 4f1b9f6..6c72259 100644 --- a/src/utils.c +++ b/src/utils.c @@ -7,7 +7,7 @@ #ifndef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION -void get_public_key(uint32_t account_number, uint8_t *publicKeyArray) { +void get_public_key(uint32_t account_number, uint8_t* publicKeyArray) { cx_ecfp_private_key_t privateKey; cx_ecfp_public_key_t publicKey; cx_err_t error; @@ -40,7 +40,7 @@ void get_public_key(uint32_t account_number, uint8_t *publicKeyArray) { static const uint32_t HARDENED_OFFSET = 0x80000000; -void get_private_key(uint32_t account_number, cx_ecfp_private_key_t *privateKey) { +void get_private_key(uint32_t account_number, cx_ecfp_private_key_t* privateKey) { const uint32_t derivePath[BIP32_PATH] = {44 | HARDENED_OFFSET, 396 | HARDENED_OFFSET, account_number | HARDENED_OFFSET, @@ -89,7 +89,7 @@ void send_response(uint8_t tx, bool approve) { ui_idle(); } -unsigned int ui_prepro(const bagl_element_t *element) { +unsigned int ui_prepro(const bagl_element_t* element) { unsigned int display = 1; if (element->component.userid > 0) { display = (ux_step == element->component.userid - 1); @@ -107,14 +107,14 @@ unsigned int ui_prepro(const bagl_element_t *element) { #endif -void writeUint32BE(uint32_t val, uint8_t *bytes) { +void writeUint32BE(uint32_t val, uint8_t* bytes) { bytes[0] = (val >> 24) & 0xFF; bytes[1] = (val >> 16) & 0xFF; bytes[2] = (val >> 8) & 0xFF; bytes[3] = val & 0xFF; } -void writeUint64BE(uint64_t val, uint8_t *bytes) { +void writeUint64BE(uint64_t val, uint8_t* bytes) { bytes[0] = (val >> 56) & 0xFF; bytes[1] = (val >> 48) & 0xFF; bytes[2] = (val >> 40) & 0xFF; @@ -125,15 +125,15 @@ void writeUint64BE(uint64_t val, uint8_t *bytes) { bytes[7] = val & 0xFF; } -uint16_t readUint16BE(uint8_t *buffer) { +uint16_t readUint16BE(uint8_t* buffer) { return (buffer[0] << 8) | (buffer[1]); } -uint32_t readUint32BE(uint8_t *buffer) { +uint32_t readUint32BE(uint8_t* buffer) { return (buffer[0] << 24) | (buffer[1] << 16) | (buffer[2] << 8) | (buffer[3]); } -uint64_t readUint64BE(uint8_t *buffer) { +uint64_t readUint64BE(uint8_t* buffer) { uint32_t i1 = buffer[3] + (buffer[2] << 8u) + (buffer[1] << 16u) + (buffer[0] << 24u); uint32_t i2 = buffer[7] + (buffer[6] << 8u) + (buffer[5] << 16u) + (buffer[4] << 24u); return i2 | ((uint64_t) i1 << 32u); @@ -152,7 +152,7 @@ uint8_t leading_zeros(uint16_t value) { return lz; } -uint16_t format_hex(const uint8_t *in, size_t in_len, char *out, size_t out_len) { +uint16_t format_hex(const uint8_t* in, size_t in_len, char* out, size_t out_len) { if (out_len < 2 * in_len + 1) { return -1; } @@ -180,10 +180,10 @@ uint16_t format_hex(const uint8_t *in, size_t in_len, char *out, size_t out_len) } #define SCRATCH_SIZE 37 -uint8_t convert_hex_amount_to_displayable(const uint8_t *amount, +uint8_t convert_hex_amount_to_displayable(const uint8_t* amount, uint8_t decimals, uint8_t amount_length, - char *out) { + char* out) { uint8_t LOOP1 = SCRATCH_SIZE - decimals; uint8_t LOOP2 = decimals; uint16_t scratch[SCRATCH_SIZE]; From a371648fd636f12ba366d47e94654cd5e29f9f3f Mon Sep 17 00:00:00 2001 From: keiff3r Date: Mon, 17 Feb 2025 16:35:38 +0100 Subject: [PATCH 21/67] style: minor formatting and whitespace adjustments - remove AlignConsecutiveAssignments: true - remove AlignConsecutiveDeclarations: true --- .clang-format | 4 +- fuzz/fuzzer.c | 4 +- fuzz/os_mocks.c | 8 ++-- src/byte_stream.c | 4 +- src/cell.c | 30 +++++++-------- src/contract.c | 50 ++++++++++++------------ src/get_address.c | 12 +++--- src/get_app_configuration.c | 10 ++--- src/get_public_key.c | 16 ++++---- src/globals.c | 2 +- src/hashmap_label.c | 16 ++++---- src/main.c | 16 ++++---- src/message.c | 76 ++++++++++++++++++------------------- src/sign.c | 12 +++--- src/sign_transaction.c | 20 +++++----- src/slice_data.c | 26 ++++++------- src/utils.c | 52 ++++++++++++------------- 17 files changed, 178 insertions(+), 180 deletions(-) diff --git a/.clang-format b/.clang-format index e8b1433..5480d6b 100644 --- a/.clang-format +++ b/.clang-format @@ -7,8 +7,7 @@ DerivePointerAlignment: false PointerAlignment: Left AlignAfterOpenBracket: Align AlignConsecutiveMacros: true -AlignConsecutiveAssignments: true -AlignConsecutiveDeclarations: true + AllowAllParametersOfDeclarationOnNextLine: false SortIncludes: false SpaceAfterCStyleCast: true @@ -18,6 +17,5 @@ AllowShortBlocksOnASingleLine: Never AllowShortFunctionsOnASingleLine: None BinPackArguments: false BinPackParameters: false - --- diff --git a/fuzz/fuzzer.c b/fuzz/fuzzer.c index 85b739c..e69fa65 100644 --- a/fuzz/fuzzer.c +++ b/fuzz/fuzzer.c @@ -19,11 +19,11 @@ #ifdef FUZZ_WITH_PROTOBUF #else -BocContext_t boc_context; +BocContext_t boc_context; DataContext_t data_context; void hex_to_bytes(const char* hex, uint8_t* bytes) { - size_t len = strlen(hex); + size_t len = strlen(hex); size_t final_len = len / 2; for (size_t i = 0, j = 0; j < final_len; i += 2, j++) bytes[j] = (hex[i] % 32 + 9) % 25 * 16 + (hex[i + 1] % 32 + 9) % 25; diff --git a/fuzz/os_mocks.c b/fuzz/os_mocks.c index 10ff014..9279f25 100644 --- a/fuzz/os_mocks.c +++ b/fuzz/os_mocks.c @@ -16,7 +16,7 @@ try_context_t* try_context_get(void) { try_context_t* try_context_set(try_context_t* ctx) { try_context_t* previous_ctx = current_context; - current_context = ctx; + current_context = ctx; return previous_ctx; } @@ -32,13 +32,13 @@ try_context_t* try_context_set(try_context_t* ctx) { // } size_t cx_hash_sha256(const uint8_t* in, size_t len, uint8_t* out, size_t out_len) { - EVP_MD_CTX* mdctx; + EVP_MD_CTX* mdctx; const EVP_MD* md; - unsigned int hash_len; + unsigned int hash_len; uint8_t tmpBuf[EVP_MAX_MD_SIZE]; - md = EVP_sha256(); + md = EVP_sha256(); mdctx = EVP_MD_CTX_new(); EVP_DigestInit_ex(mdctx, md, NULL); EVP_DigestUpdate(mdctx, in, len); diff --git a/src/byte_stream.c b/src/byte_stream.c index 319d780..d0174d6 100644 --- a/src/byte_stream.c +++ b/src/byte_stream.c @@ -5,8 +5,8 @@ void ByteStream_init(struct ByteStream_t* self, uint8_t* data, uint16_t data_size) { VALIDATE(self && data && data_size, ERR_END_OF_STREAM); self->data_size = data_size; - self->offset = 0; - self->data = data; + self->offset = 0; + self->data = data; } void ByteStream_move_by(struct ByteStream_t* self, uint16_t data_size) { diff --git a/src/cell.c b/src/cell.c index c76a888..c3595ec 100644 --- a/src/cell.c +++ b/src/cell.c @@ -3,7 +3,7 @@ void Cell_init(struct Cell_t* self, uint8_t* cell_begin, uint16_t cell_length) { VALIDATE(self && cell_begin, ERR_CELL_IS_EMPTY); - self->cell_begin = cell_begin; + self->cell_begin = cell_begin; self->cell_length = cell_length; } @@ -30,8 +30,8 @@ uint8_t* Cell_get_data(const struct Cell_t* self) { } uint8_t* Cell_get_refs(const struct Cell_t* self, uint8_t* refs_count) { - uint8_t d1 = Cell_get_d1(self); - *refs_count = d1 & 7; + uint8_t d1 = Cell_get_d1(self); + *refs_count = d1 & 7; uint8_t data_size = Cell_get_data_size(self); return self->cell_begin + CELL_DATA_OFFSET + data_size; } @@ -63,13 +63,13 @@ uint16_t Cell_bit_len(struct Cell_t* self) { } uint16_t deserialize_cell(struct Cell_t* cell, - const uint8_t cell_index, - const uint8_t cells_count) { - uint8_t d1 = Cell_get_d1(cell); - uint8_t level = d1 >> 5; // level + const uint8_t cell_index, + const uint8_t cells_count) { + uint8_t d1 = Cell_get_d1(cell); + uint8_t level = d1 >> 5; // level uint8_t hashes = (d1 & 16) == 16; // with hashes uint8_t exotic = (d1 & 8) == 8; // exotic - uint8_t rc = d1 & 7; // refs count + uint8_t rc = d1 & 7; // refs count uint8_t absent = rc == 7 && hashes; uint8_t pruned = d1 == PRUNED_BRANCH_D1; UNUSED(level); @@ -82,8 +82,8 @@ uint16_t deserialize_cell(struct Cell_t* cell, uint8_t data_size = Cell_get_data_size(cell); VALIDATE(!pruned || pruned && (data_size == PRUNED_BRANCH_DATA_SIZE), ERR_INVALID_CELL); - uint8_t refs_count = 0; - uint8_t* refs = Cell_get_refs(cell, &refs_count); + uint8_t refs_count = 0; + uint8_t* refs = Cell_get_refs(cell, &refs_count); for (uint8_t i = 0; i < refs_count; ++i) { VALIDATE(cell && cell->cell_length > CELL_DATA_OFFSET + data_size + i, ERR_INVALID_CELL); @@ -113,8 +113,8 @@ void calc_cell_hash(Cell_t* cell, const uint8_t cell_index) { uint8_t hash_buffer[266]; // d1(1) + d2(1) + data(128) + 4 * (depth(2) + hash(32)) uint16_t hash_buffer_offset = 0; - hash_buffer[0] = d1 & 0b00011111; - hash_buffer[1] = Cell_get_d2(cell); + hash_buffer[0] = d1 & 0b00011111; + hash_buffer[1] = Cell_get_d2(cell); hash_buffer_offset += 2; uint8_t data_size = Cell_get_data_size(cell); if (bc->public_key_cell_index && cell_index == bc->public_key_cell_index) { @@ -124,14 +124,14 @@ void calc_cell_hash(Cell_t* cell, const uint8_t cell_index) { } hash_buffer_offset += data_size; - uint8_t refs_count = 0; - uint8_t* refs = Cell_get_refs(cell, &refs_count); + uint8_t refs_count = 0; + uint8_t* refs = Cell_get_refs(cell, &refs_count); VALIDATE(refs_count <= MAX_REFERENCES_COUNT, ERR_INVALID_CELL); for (uint8_t child = 0; child < refs_count; ++child) { uint8_t* depth = &bc->cell_depth[cell_index]; VALIDATE(refs[child] < MAX_CONTRACT_CELLS_COUNT, ERR_INVALID_CELL); uint8_t child_depth = bc->cell_depth[refs[child]]; - *depth = (*depth > child_depth + 1) ? *depth : (child_depth + 1); + *depth = (*depth > child_depth + 1) ? *depth : (child_depth + 1); uint8_t buf[2]; buf[0] = 0; buf[1] = child_depth; diff --git a/src/contract.c b/src/contract.c index da8494d..e4434e2 100644 --- a/src/contract.c +++ b/src/contract.c @@ -90,21 +90,21 @@ const uint8_t surf_wallet_code_hash[] = { 0x70, 0xa5, 0x97, 0x67, 0xdb, 0x2b, 0xf4, 0x78, 0x8b, 0x1d, 0x61, 0xad, 0x42, 0xcd, 0xad, 0x82}; // Cell depths -const uint32_t safe_multisig_wallet_cell_depth = 0x0C; +const uint32_t safe_multisig_wallet_cell_depth = 0x0C; const uint32_t safe_multisig_wallet_24h_cell_depth = 0x0C; -const uint32_t setcode_multisig_wallet_cell_depth = 0x0D; -const uint32_t bridge_multisig_wallet_cell_depth = 0x0B; -const uint32_t multisig_2_wallet_cell_depth = 0x0C; -const uint32_t multisig_2_1_wallet_cell_depth = 0x0A; -const uint32_t surf_wallet_cell_depth = 0x0C; +const uint32_t setcode_multisig_wallet_cell_depth = 0x0D; +const uint32_t bridge_multisig_wallet_cell_depth = 0x0B; +const uint32_t multisig_2_wallet_cell_depth = 0x0C; +const uint32_t multisig_2_1_wallet_cell_depth = 0x0A; +const uint32_t surf_wallet_cell_depth = 0x0C; void deserialize_cells_tree(struct ByteStream_t* src) { uint8_t first_byte = ByteStream_read_byte(src); { - bool index_included = (first_byte & 0x80) != 0; - bool has_crc = (first_byte & 0x40) != 0; - bool has_cache_bits = (first_byte & 0x20) != 0; - uint8_t flags = (first_byte & 0x18) >> 3; + bool index_included = (first_byte & 0x80) != 0; + bool has_crc = (first_byte & 0x40) != 0; + bool has_cache_bits = (first_byte & 0x20) != 0; + uint8_t flags = (first_byte & 0x18) >> 3; UNUSED(flags); VALIDATE(!index_included && !has_crc && !has_cache_bits, ERR_INVALID_CONTRACT); } @@ -136,10 +136,10 @@ void deserialize_cells_tree(struct ByteStream_t* src) { for (uint8_t i = 0; i < cells_count; ++i) { VALIDATE(i < MAX_CONTRACT_CELLS_COUNT, ERR_INVALID_CONTRACT); - uint8_t* cell_begin = ByteStream_get_cursor(src); + uint8_t* cell_begin = ByteStream_get_cursor(src); uint16_t cell_length = ByteStream_get_length(src); Cell_init(&cell, cell_begin, cell_length); - uint16_t offset = deserialize_cell(&cell, i, cells_count); + uint16_t offset = deserialize_cell(&cell, i, cells_count); boc_context.cells[i] = cell; ByteStream_read_data(src, offset); @@ -156,8 +156,8 @@ void find_public_key_cell() { BocContext_t* bc = &boc_context; VALIDATE(Cell_get_data(&bc->cells[0])[0] & 0x20, ERR_INVALID_CONTRACT); // has data branch - uint8_t refs_count = 0; - uint8_t* refs = Cell_get_refs(&bc->cells[0], &refs_count); + uint8_t refs_count = 0; + uint8_t* refs = Cell_get_refs(&bc->cells[0], &refs_count); VALIDATE(refs_count > 0 && refs_count <= 2, ERR_INVALID_CONTRACT); uint8_t data_root = refs[refs_count - 1]; @@ -165,7 +165,7 @@ void find_public_key_cell() { refs = Cell_get_refs(&bc->cells[data_root], &refs_count); VALIDATE(refs_count != 0 && refs_count <= MAX_REFERENCES_COUNT, ERR_INVALID_CONTRACT); - uint8_t key_buffer[8]; + uint8_t key_buffer[8]; SliceData_t key; memset(key_buffer, 0, sizeof(key_buffer)); SliceData_init(&key, key_buffer, sizeof(key_buffer)); @@ -210,8 +210,8 @@ void compute_wallet_v3_address(uint32_t account_number, uint8_t* address) { uint8_t hash_buffer[71]; // d1(1) + d2(1) + data(5) + code_hash(32) + data_hash(32) uint16_t hash_buffer_offset = 0; - hash_buffer[0] = 0x02; // d1(1) - hash_buffer[1] = 0x01; // d2(1) + hash_buffer[0] = 0x02; // d1(1) + hash_buffer[1] = 0x01; // d2(1) hash_buffer_offset += 2; // Data @@ -268,8 +268,8 @@ void compute_ever_wallet_address(uint32_t account_number, uint8_t* address) { uint8_t hash_buffer[71]; // d1(1) + d2(1) + data(5) + code_hash(32) + data_hash(32) uint16_t hash_buffer_offset = 0; - hash_buffer[0] = 0x02; // d1(1) - hash_buffer[1] = 0x01; // d2(1) + hash_buffer[0] = 0x02; // d1(1) + hash_buffer[1] = 0x01; // d2(1) hash_buffer_offset += 2; // Data @@ -294,12 +294,12 @@ void compute_ever_wallet_address(uint32_t account_number, uint8_t* address) { } } -void compute_multisig_address(uint32_t account_number, +void compute_multisig_address(uint32_t account_number, const uint8_t* wallet, - uint16_t wallet_size, + uint16_t wallet_size, const uint8_t* code_hash, - uint32_t cell_depth, - uint8_t* address) { + uint32_t cell_depth, + uint8_t* address) { { ByteStream_t src; ByteStream_init(&src, (uint8_t*) wallet, wallet_size); @@ -316,7 +316,7 @@ void compute_multisig_address(uint32_t account_number, bc->cell_depth[bc->public_key_cell_index + 1] = cell_depth; VALIDATE(bc->public_key_cell_index && bc->public_key_label_size_bits, ERR_INVALID_CONTRACT); - Cell_t* cell = &bc->cells[bc->public_key_cell_index]; + Cell_t* cell = &bc->cells[bc->public_key_cell_index]; uint8_t cell_data_size = Cell_get_data_size(cell); VALIDATE(cell_data_size != 0 && cell_data_size <= MAX_PUBLIC_KEY_CELL_DATA_SIZE, ERR_INVALID_CONTRACT); @@ -326,7 +326,7 @@ void compute_multisig_address(uint32_t account_number, uint8_t* public_key = data_context.pk_context.public_key; get_public_key(account_number, public_key); - uint8_t* data = bc->public_key_cell_data; + uint8_t* data = bc->public_key_cell_data; SliceData_t slice; SliceData_init(&slice, data, sizeof(bc->public_key_cell_data)); SliceData_move_by(&slice, bc->public_key_label_size_bits); diff --git a/src/get_address.c b/src/get_address.c index f2dc790..fb3039a 100644 --- a/src/get_address.c +++ b/src/get_address.c @@ -6,7 +6,7 @@ #include "byte_stream.h" static uint8_t set_result_get_address() { - uint8_t tx = 0; + uint8_t tx = 0; G_io_apdu_buffer[tx++] = ADDRESS_LENGTH; memmove(G_io_apdu_buffer + tx, data_context.addr_context.address, ADDRESS_LENGTH); tx += ADDRESS_LENGTH; @@ -25,7 +25,7 @@ UX_STEP_NOCB(ux_display_address_flow_2_step, bnnn_paging, { .title = "Address", - .text = data_context.addr_context.address_str, + .text = data_context.addr_context.address_str, }); UX_STEP_CB(ux_display_address_flow_3_step, pb, @@ -48,10 +48,10 @@ UX_FLOW(ux_display_address_flow, &ux_display_address_flow_3_step, &ux_display_address_flow_4_step); -void handleGetAddress(uint8_t p1, - uint8_t p2, - uint8_t* dataBuffer, - uint16_t dataLength, +void handleGetAddress(uint8_t p1, + uint8_t p2, + uint8_t* dataBuffer, + uint16_t dataLength, volatile unsigned int* flags, volatile unsigned int* tx) { VALIDATE(p2 == 0 && dataLength == (sizeof(uint32_t) + sizeof(uint8_t)), ERR_INVALID_REQUEST); diff --git a/src/get_app_configuration.c b/src/get_app_configuration.c index 645a3f5..239a393 100644 --- a/src/get_app_configuration.c +++ b/src/get_app_configuration.c @@ -2,10 +2,10 @@ #include "utils.h" #include "errors.h" -void handleGetAppConfiguration(uint8_t p1, - uint8_t p2, - uint8_t* dataBuffer, - uint16_t dataLength, +void handleGetAppConfiguration(uint8_t p1, + uint8_t p2, + uint8_t* dataBuffer, + uint16_t dataLength, volatile unsigned int* flags, volatile unsigned int* tx) { UNUSED(dataBuffer); @@ -15,6 +15,6 @@ void handleGetAppConfiguration(uint8_t p1, G_io_apdu_buffer[0] = LEDGER_MAJOR_VERSION; G_io_apdu_buffer[1] = LEDGER_MINOR_VERSION; G_io_apdu_buffer[2] = LEDGER_PATCH_VERSION; - *tx = 3; + *tx = 3; THROW(SUCCESS); } diff --git a/src/get_public_key.c b/src/get_public_key.c index 63e29e2..858335c 100644 --- a/src/get_public_key.c +++ b/src/get_public_key.c @@ -5,7 +5,7 @@ #include "errors.h" static uint8_t set_result_get_public_key() { - uint8_t tx = 0; + uint8_t tx = 0; G_io_apdu_buffer[tx++] = PUBLIC_KEY_LENGTH; memmove(G_io_apdu_buffer + tx, data_context.pk_context.public_key, PUBLIC_KEY_LENGTH); tx += PUBLIC_KEY_LENGTH; @@ -19,7 +19,7 @@ UX_STEP_NOCB(ux_display_public_flow_1_step, bnnn_paging, { .title = "Public key", - .text = data_context.pk_context.public_key_str, + .text = data_context.pk_context.public_key_str, }); UX_STEP_CB(ux_display_public_flow_2_step, pb, @@ -43,16 +43,16 @@ UX_FLOW(ux_display_public_flow, #endif -void handleGetPublicKey(uint8_t p1, - uint8_t p2, - uint8_t* dataBuffer, - uint16_t dataLength, +void handleGetPublicKey(uint8_t p1, + uint8_t p2, + uint8_t* dataBuffer, + uint16_t dataLength, volatile unsigned int* flags, volatile unsigned int* tx) { VALIDATE(p2 == 0 && dataLength == sizeof(uint32_t), ERR_INVALID_REQUEST); - uint32_t account_number = readUint32BE(dataBuffer); - PublicKeyContext_t* context = &data_context.pk_context; + uint32_t account_number = readUint32BE(dataBuffer); + PublicKeyContext_t* context = &data_context.pk_context; get_public_key(account_number, context->public_key); if (p1 == P1_NON_CONFIRM) { *tx = set_result_get_public_key(); diff --git a/src/globals.c b/src/globals.c index 9a2e7b9..e8d7cc0 100644 --- a/src/globals.c +++ b/src/globals.c @@ -2,7 +2,7 @@ #include "os.h" #include "ux.h" -ux_state_t G_ux; +ux_state_t G_ux; bolos_ux_params_t G_ux_params; // display stepped screens diff --git a/src/hashmap_label.c b/src/hashmap_label.c index 8ad896e..aaf85a5 100644 --- a/src/hashmap_label.c +++ b/src/hashmap_label.c @@ -5,7 +5,7 @@ #include "errors.h" uint8_t get_label_same(uint8_t max, struct SliceData_t* slice, struct SliceData_t* label) { - uint8_t value = SliceData_get_next_bit(slice) ? 0xff : 0; + uint8_t value = SliceData_get_next_bit(slice) ? 0xff : 0; uint8_t length = SliceData_get_next_size(slice, max); VALIDATE(length <= 64, ERR_RANGE_CHECK); @@ -31,21 +31,21 @@ void put_to_node(uint8_t cell_index, uint16_t bit_len, struct SliceData_t* key) VALIDATE(key->data[i] == 0, ERR_INVALID_KEY); } - Cell_t* cell = &boc_context.cells[cell_index]; + Cell_t* cell = &boc_context.cells[cell_index]; SliceData_t slice; SliceData_init(&slice, Cell_get_data(cell), Cell_get_data_size(cell)); SliceData_t label; - uint8_t label_data[8]; + uint8_t label_data[8]; memset(label_data, 0, sizeof(label_data)); SliceData_init(&label, label_data, sizeof(label_data)); get_label(bit_len, &slice, &label); if (SliceData_equal(&label, key)) { - uint8_t len = 16 - leading_zeros(bit_len); - uint8_t label_size_bits = 2 + 1 + len; // prefix + key bit + len + uint8_t len = 16 - leading_zeros(bit_len); + uint8_t label_size_bits = 2 + 1 + len; // prefix + key bit + len boc_context.public_key_label_size_bits = label_size_bits; - boc_context.public_key_cell_index = cell_index; + boc_context.public_key_cell_index = cell_index; return; } @@ -71,8 +71,8 @@ void put_to_node(uint8_t cell_index, uint16_t bit_len, struct SliceData_t* key) uint8_t next_index = SliceData_get_next_bit(key); VALIDATE(next_index == 0, ERR_INVALID_KEY); - uint8_t refs_count = 0; - uint8_t* refs = Cell_get_refs(&boc_context.cells[cell_index], &refs_count); + uint8_t refs_count = 0; + uint8_t* refs = Cell_get_refs(&boc_context.cells[cell_index], &refs_count); VALIDATE(refs_count > 0 && refs_count <= MAX_REFERENCES_COUNT, ERR_INVALID_DATA); uint8_t next_cell = refs[next_index]; VALIDATE(next_cell != 0 && next_cell <= MAX_CONTRACT_CELLS_COUNT, ERR_INVALID_DATA); diff --git a/src/main.c b/src/main.c index 5a7f771..e6abe1d 100644 --- a/src/main.c +++ b/src/main.c @@ -21,7 +21,7 @@ unsigned char G_io_seproxyhal_spi_buffer[IO_SEPROXYHAL_BUFFER_SIZE_B]; -BocContext_t boc_context; +BocContext_t boc_context; DataContext_t data_context; void reset_app_context() { @@ -126,8 +126,8 @@ void handleApdu(volatile unsigned int* flags, volatile unsigned int* tx, int rx) THROW(0x6808); } - uint8_t p2 = G_io_apdu_buffer[OFFSET_P2]; - bool more = (bool) (p2 & P2_MORE); + uint8_t p2 = G_io_apdu_buffer[OFFSET_P2]; + bool more = (bool) (p2 & P2_MORE); // P2_MORE is a signal for more apdu to receive in current chunk; // P2_EXTEND is a signal for extended buffer and can't be in first chunk; @@ -169,7 +169,7 @@ void handleApdu(volatile unsigned int* flags, volatile unsigned int* tx, int rx) break; } // Unexpected exception => report - G_io_apdu_buffer[*tx] = sw >> 8; + G_io_apdu_buffer[*tx] = sw >> 8; G_io_apdu_buffer[*tx + 1] = sw; *tx += 2; } @@ -180,8 +180,8 @@ void handleApdu(volatile unsigned int* flags, volatile unsigned int* tx, int rx) } void app_main(void) { - volatile unsigned int rx = 0; - volatile unsigned int tx = 0; + volatile unsigned int rx = 0; + volatile unsigned int tx = 0; volatile unsigned int flags = 0; // Stores the information about the current command. Some commands expect @@ -202,7 +202,7 @@ void app_main(void) { rx = tx; tx = 0; // ensure no race in catch_other if io_exchange throws // an error - rx = io_exchange(CHANNEL_APDU | flags, rx); + rx = io_exchange(CHANNEL_APDU | flags, rx); flags = 0; // no apdu received, well, reset the session, and reset the @@ -236,7 +236,7 @@ void app_main(void) { flags &= ~IO_ASYNCH_REPLY; } // Unexpected exception => report - G_io_apdu_buffer[tx] = sw >> 8; + G_io_apdu_buffer[tx] = sw >> 8; G_io_apdu_buffer[tx + 1] = sw; tx += 2; } diff --git a/src/message.c b/src/message.c index dc6f0cf..37d1ab2 100644 --- a/src/message.c +++ b/src/message.c @@ -9,17 +9,17 @@ #define GIFT_CELL_INDEX 1 void deserialize_array(uint8_t* in, - uint8_t in_size, + uint8_t in_size, uint16_t offset, uint8_t* out, - uint8_t out_size) { - uint8_t shift = offset % 8; + uint8_t out_size) { + uint8_t shift = offset % 8; uint8_t first_data_byte = offset / 8; for (uint16_t i = first_data_byte, j = 0; j < out_size; ++i, ++j) { VALIDATE(i == (j + first_data_byte) && (i + 1) <= in_size, ERR_INVALID_MESSAGE); uint8_t cur = in[i] << shift; - out[j] = cur; + out[j] = cur; if (j == out_size - 1 && i + 1 < in_size) { out[j] |= in[i + 1] >> (8 - shift); @@ -41,8 +41,8 @@ void deserialize_address(struct SliceData_t* slice, int8_t* wc, uint8_t* address *wc = (int8_t) SliceData_get_next_byte(slice); - uint8_t* data = SliceData_begin(slice); - uint16_t offset = SliceData_get_cursor(slice); + uint8_t* data = SliceData_begin(slice); + uint16_t offset = SliceData_get_cursor(slice); uint16_t data_size = SliceData_data_size(slice); deserialize_array(data, data_size, offset, address, ADDRESS_LENGTH); @@ -52,7 +52,7 @@ void deserialize_address(struct SliceData_t* slice, int8_t* wc, uint8_t* address } void deserialize_value(struct SliceData_t* slice, uint8_t* value, uint8_t value_length) { - uint8_t* data = SliceData_begin(slice); + uint8_t* data = SliceData_begin(slice); uint16_t data_size = SliceData_data_size(slice); uint16_t offset = SliceData_get_cursor(slice); @@ -76,11 +76,11 @@ void set_dst_address(uint8_t wc, const uint8_t* address) { } void set_amount(const uint8_t* amount, - uint8_t amount_length, - uint8_t flags, - uint8_t decimals, - const char* ticker) { - char* amount_str = data_context.sign_tr_context.amount_str; + uint8_t amount_length, + uint8_t flags, + uint8_t decimals, + const char* ticker) { + char* amount_str = data_context.sign_tr_context.amount_str; size_t amount_str_size = sizeof(data_context.sign_tr_context.amount_str); memset(amount_str, 0, amount_str_size); @@ -88,7 +88,7 @@ void set_amount(const uint8_t* amount, switch (flags) { case NORMAL_FLAG: { const char* space = " "; - uint8_t text_size = + uint8_t text_size = convert_hex_amount_to_displayable(amount, decimals, amount_length, amount_str); VALIDATE(amount_str_size >= text_size + strlen(space) + strlen(ticker), ERR_INVALID_MESSAGE); @@ -125,8 +125,8 @@ void set_transaction_id(const uint8_t* transaction_id) { sizeof(data_context.sign_tr_context.transaction_id_str)); } -void deserialize_int_message_header(struct SliceData_t* slice, - uint8_t flags, +void deserialize_int_message_header(struct SliceData_t* slice, + uint8_t flags, SignTransactionContext_t* ctx) { uint8_t int_msg = SliceData_get_next_bit(slice); VALIDATE(!int_msg, ERR_INVALID_MESSAGE); @@ -141,12 +141,12 @@ void deserialize_int_message_header(struct SliceData_t* slice, UNUSED(bounced); // Sender address - int8_t src_wc = 0; + int8_t src_wc = 0; uint8_t src_addr[ADDRESS_LENGTH]; deserialize_address(slice, &src_wc, src_addr); // Recipient address - int8_t dst_wc = 0; + int8_t dst_wc = 0; uint8_t dst_address[ADDRESS_LENGTH]; deserialize_address(slice, &dst_wc, dst_address); @@ -178,8 +178,8 @@ void deserialize_int_message_header(struct SliceData_t* slice, UNUSED(created_at); } -int deserialize_token_body(struct SliceData_t* slice, - struct SliceData_t* ref_slice, +int deserialize_token_body(struct SliceData_t* slice, + struct SliceData_t* ref_slice, SignTransactionContext_t* ctx) { // FunctionId if (SliceData_remaining_bits(slice) < sizeof(uint32_t) * 8) { @@ -214,7 +214,7 @@ int deserialize_token_body(struct SliceData_t* slice, slice = ref_slice; } - int8_t wc = 0; + int8_t wc = 0; uint8_t address[ADDRESS_LENGTH]; deserialize_address(slice, &wc, address); @@ -255,10 +255,10 @@ int deserialize_token_body(struct SliceData_t* slice, return sign_transaction_flow; } -int deserialize_multisig_params(struct SliceData_t* slice, - uint32_t function_id, - uint8_t wc, - uint8_t* address, +int deserialize_multisig_params(struct SliceData_t* slice, + uint32_t function_id, + uint8_t wc, + uint8_t* address, SignTransactionContext_t* ctx) { int sign_transaction_flow = SIGN_TRANSACTION_FLOW_ERROR; @@ -275,7 +275,7 @@ int deserialize_multisig_params(struct SliceData_t* slice, } case MULTISIG_SEND_TRANSACTION: { // Recipient address - int8_t dst_wc = 0; + int8_t dst_wc = 0; uint8_t dst_address[ADDRESS_LENGTH]; deserialize_address(slice, &dst_wc, dst_address); @@ -300,7 +300,7 @@ int deserialize_multisig_params(struct SliceData_t* slice, case MULTISIG_SUBMIT_TRANSACTION: case MULTISIG2_SUBMIT_TRANSACTION: { // Recipient address - int8_t dst_wc = 0; + int8_t dst_wc = 0; uint8_t dst_address[ADDRESS_LENGTH]; deserialize_address(slice, &dst_wc, dst_address); @@ -402,11 +402,11 @@ uint32_t deserialize_contract_header(struct SliceData_t* slice) { return function_id; } -void prepend_address_to_cell(uint8_t* cell_buffer, - uint16_t cell_buffer_size, +void prepend_address_to_cell(uint8_t* cell_buffer, + uint16_t cell_buffer_size, struct Cell_t* cell, - uint8_t wc, - uint8_t* address) { + uint8_t wc, + uint8_t* address) { uint16_t bit_len = Cell_bit_len(cell); bit_len += 267; // Prefix(2) + Anycast(1) + WorkchainId(8) + Address(32 * 8) @@ -431,13 +431,13 @@ void prepend_address_to_cell(uint8_t* cell_buffer, SliceData_append(&slice, address, ADDRESS_LENGTH * 8, false); // Append cell data - uint8_t* data = Cell_get_data(cell); - uint8_t data_size = Cell_get_data_size(cell); + uint8_t* data = Cell_get_data(cell); + uint8_t data_size = Cell_get_data_size(cell); SliceData_append(&slice, data, data_size * 8, false); // Append references - uint8_t refs_count = 0; - uint8_t* refs = Cell_get_refs(cell, &refs_count); + uint8_t refs_count = 0; + uint8_t* refs = Cell_get_refs(cell, &refs_count); VALIDATE(refs_count <= MAX_REFERENCES_COUNT, ERR_INVALID_MESSAGE); for (uint8_t child = 0; child < refs_count; ++child) { @@ -450,11 +450,11 @@ void prepend_address_to_cell(uint8_t* cell_buffer, } int prepare_to_sign(struct ByteStream_t* src, - uint8_t wc, - uint8_t* address, - uint8_t* prepend_address) { + uint8_t wc, + uint8_t* address, + uint8_t* prepend_address) { // Init context - BocContext_t* bc = &boc_context; + BocContext_t* bc = &boc_context; DataContext_t* dc = &data_context; // Parse transaction boc diff --git a/src/sign.c b/src/sign.c index e8ce30b..f08ac8a 100644 --- a/src/sign.c +++ b/src/sign.c @@ -6,8 +6,8 @@ static const char SIGN_MAGIC[] = {0xFF, 0xFF, 0xFF, 0xFF}; static uint8_t set_result_sign() { cx_ecfp_private_key_t privateKey; - SignContext_t* context = &data_context.sign_context; - cx_err_t error; + SignContext_t* context = &data_context.sign_context; + cx_err_t error; BEGIN_TRY { TRY { get_private_key(context->account_number, &privateKey); @@ -27,7 +27,7 @@ static uint8_t set_result_sign() { } END_TRY; - uint8_t tx = 0; + uint8_t tx = 0; G_io_apdu_buffer[tx++] = SIGNATURE_LENGTH; memmove(G_io_apdu_buffer + tx, context->signature, SIGNATURE_LENGTH); tx += SIGNATURE_LENGTH; @@ -45,7 +45,7 @@ UX_STEP_NOCB(ux_sign_flow_2_step, bnnn_paging, { .title = "Message", - .text = data_context.sign_context.to_sign_str, + .text = data_context.sign_context.to_sign_str, }); UX_STEP_CB(ux_sign_flow_3_step, pbb, @@ -70,9 +70,9 @@ UX_FLOW(ux_sign_flow, &ux_sign_flow_3_step, &ux_sign_flow_4_step); -void handleSign(uint8_t* dataBuffer, +void handleSign(uint8_t* dataBuffer, __attribute__((unused)) uint16_t dataLength, - volatile unsigned int* flags) { + volatile unsigned int* flags) { SignContext_t* context = &data_context.sign_context; size_t offset = 0; diff --git a/src/sign_transaction.c b/src/sign_transaction.c index 312b9c2..fe2956c 100644 --- a/src/sign_transaction.c +++ b/src/sign_transaction.c @@ -6,9 +6,9 @@ #include "contract.h" static uint8_t set_result_sign_transaction() { - cx_ecfp_private_key_t privateKey; + cx_ecfp_private_key_t privateKey; SignTransactionContext_t* context = &data_context.sign_tr_context; - cx_err_t error; + cx_err_t error; BEGIN_TRY { TRY { @@ -38,7 +38,7 @@ static uint8_t set_result_sign_transaction() { } END_TRY; - uint8_t tx = 0; + uint8_t tx = 0; G_io_apdu_buffer[tx++] = SIGNATURE_LENGTH; memmove(G_io_apdu_buffer + tx, context->signature, SIGNATURE_LENGTH); tx += SIGNATURE_LENGTH; @@ -60,19 +60,19 @@ UX_STEP_NOCB(ux_sign_transaction_amount, bnnn_paging, { .title = "Amount", - .text = data_context.sign_tr_context.amount_str, + .text = data_context.sign_tr_context.amount_str, }); UX_STEP_NOCB(ux_sign_transaction_address, bnnn_paging, { .title = "Address", - .text = data_context.sign_tr_context.address_str, + .text = data_context.sign_tr_context.address_str, }); UX_STEP_NOCB(ux_sign_transaction_transaction_id, bnnn_paging, { .title = "Transaction id", - .text = data_context.sign_tr_context.transaction_id_str, + .text = data_context.sign_tr_context.transaction_id_str, }); UX_STEP_CB(ux_sign_transaction_accept, pbb, @@ -119,11 +119,11 @@ UX_FLOW(ux_sign_transaction_transfer_flow, &ux_sign_transaction_accept, &ux_sign_transaction_reject); -void handleSignTransaction(uint8_t* dataBuffer, - uint16_t dataLength, +void handleSignTransaction(uint8_t* dataBuffer, + uint16_t dataLength, volatile unsigned int* flags, - bool is_first_chunk, - bool more) { + bool is_first_chunk, + bool more) { if (is_first_chunk) { reset_app_context(); } diff --git a/src/slice_data.c b/src/slice_data.c index 8184186..6eb9f6e 100644 --- a/src/slice_data.c +++ b/src/slice_data.c @@ -5,15 +5,15 @@ void SliceData_init(struct SliceData_t* self, uint8_t* data, uint16_t data_size_bytes) { VALIDATE(self && data, ERR_SLICE_IS_EMPTY); - self->data = data; + self->data = data; self->data_window_start = 0; - self->data_window_end = data_size_bytes * 8; - self->data_size_bytes = data_size_bytes; + self->data_window_end = data_size_bytes * 8; + self->data_size_bytes = data_size_bytes; } void SliceData_from_cell(struct SliceData_t* self, struct Cell_t* cell) { - uint8_t* cell_data = Cell_get_data(cell); - uint8_t cell_data_size = Cell_get_data_size(cell); + uint8_t* cell_data = Cell_get_data(cell); + uint8_t cell_data_size = Cell_get_data_size(cell); SliceData_init(self, cell_data, cell_data_size); } @@ -49,8 +49,8 @@ uint8_t SliceData_get_bits(const struct SliceData_t* self, uint16_t offset, uint VALIDATE(bits != 0 && bits <= 8, ERR_RANGE_CHECK); uint16_t index = self->data_window_start + offset; - uint8_t q = index / 8; - uint8_t r = index % 8; + uint8_t q = index / 8; + uint8_t r = index % 8; if (r == 0) { return self->data[q] >> (8 - r - bits); } else if (bits <= (8 - r)) { @@ -94,7 +94,7 @@ uint64_t SliceData_get_int(const struct SliceData_t* self, uint8_t bits) { } uint64_t value = 0; - uint8_t bytes = bits / 8; + uint8_t bytes = bits / 8; for (uint8_t i = 0; i < bytes; ++i) { uint64_t byte = SliceData_get_byte(self, 8 * i); value |= byte << (8 * (7 - i)); @@ -119,8 +119,8 @@ uint64_t SliceData_get_next_size(struct SliceData_t* self, uint16_t max_value) { if (max_value == 0) { return 0; } - uint8_t bits = 16 - leading_zeros(max_value); - uint64_t res = SliceData_get_next_int(self, bits); + uint8_t bits = 16 - leading_zeros(max_value); + uint64_t res = SliceData_get_next_int(self, bits); return res; } @@ -130,7 +130,7 @@ bool SliceData_is_empty(const struct SliceData_t* self) { } bool SliceData_equal(const struct SliceData_t* self, const struct SliceData_t* other) { - uint32_t self_rb = SliceData_remaining_bits(self); + uint32_t self_rb = SliceData_remaining_bits(self); uint32_t other_rb = SliceData_remaining_bits(other); if (self_rb != other_rb) { return false; @@ -162,9 +162,9 @@ void SliceData_append(struct SliceData_t* self, uint8_t* in, uint16_t bits, bool if (offset % 8 == 0 || bytes == 0) { memcpy(self->data + offset / 8, in, bytes ? bytes : 1); } else { - uint8_t shift = offset % 8; + uint8_t shift = offset % 8; uint8_t first_data_byte = offset / 8; - uint8_t prev = 0; + uint8_t prev = 0; for (uint16_t i = first_data_byte, j = 0; j < bytes; ++i, ++j) { VALIDATE(i == (j + first_data_byte) && i < self->data_size_bytes, ERR_INVALID_DATA); diff --git a/src/utils.c b/src/utils.c index 6c72259..761730a 100644 --- a/src/utils.c +++ b/src/utils.c @@ -9,8 +9,8 @@ void get_public_key(uint32_t account_number, uint8_t* publicKeyArray) { cx_ecfp_private_key_t privateKey; - cx_ecfp_public_key_t publicKey; - cx_err_t error; + cx_ecfp_public_key_t publicKey; + cx_err_t error; get_private_key(account_number, &privateKey); BEGIN_TRY { @@ -47,7 +47,7 @@ void get_private_key(uint32_t account_number, cx_ecfp_private_key_t* privateKey) 0 | HARDENED_OFFSET, 0 | HARDENED_OFFSET}; - uint8_t privateKeyData[64]; + uint8_t privateKeyData[64]; cx_err_t error; BEGIN_TRY { TRY { @@ -140,7 +140,7 @@ uint64_t readUint64BE(uint8_t* buffer) { } uint8_t leading_zeros(uint16_t value) { - uint8_t lz = 0; + uint8_t lz = 0; uint16_t msb = 0x8000; for (uint8_t i = 0; i < 16; ++i) { if ((value << i) & msb) { @@ -157,17 +157,17 @@ uint16_t format_hex(const uint8_t* in, size_t in_len, char* out, size_t out_len) return -1; } - const char hex[] = "0123456789abcdef"; - size_t i = 0; - int written = 0; + const char hex[] = "0123456789abcdef"; + size_t i = 0; + int written = 0; while (i < in_len && (i * 2 + (2 + 1)) <= out_len) { uint8_t high_nibble = (in[i] & 0xF0) >> 4; - *out = hex[high_nibble]; + *out = hex[high_nibble]; out++; uint8_t low_nibble = in[i] & 0x0F; - *out = hex[low_nibble]; + *out = hex[low_nibble]; out++; i++; @@ -181,28 +181,28 @@ uint16_t format_hex(const uint8_t* in, size_t in_len, char* out, size_t out_len) #define SCRATCH_SIZE 37 uint8_t convert_hex_amount_to_displayable(const uint8_t* amount, - uint8_t decimals, - uint8_t amount_length, - char* out) { - uint8_t LOOP1 = SCRATCH_SIZE - decimals; - uint8_t LOOP2 = decimals; + uint8_t decimals, + uint8_t amount_length, + char* out) { + uint8_t LOOP1 = SCRATCH_SIZE - decimals; + uint8_t LOOP2 = decimals; uint16_t scratch[SCRATCH_SIZE]; - uint8_t offset = 0; - uint8_t nonZero = 0; - uint8_t i; - uint8_t targetOffset = 0; - uint8_t workOffset; - uint8_t j; - uint8_t nscratch = SCRATCH_SIZE; - uint8_t smin = nscratch - 2; - uint8_t comma = 0; + uint8_t offset = 0; + uint8_t nonZero = 0; + uint8_t i; + uint8_t targetOffset = 0; + uint8_t workOffset; + uint8_t j; + uint8_t nscratch = SCRATCH_SIZE; + uint8_t smin = nscratch - 2; + uint8_t comma = 0; for (i = 0; i < SCRATCH_SIZE; i++) { scratch[i] = 0; } for (i = 0; i < amount_length; i++) { for (j = 0; j < 8; j++) { - uint8_t k; + uint8_t k; uint16_t shifted_in = (((amount[i] & 0xff) & ((1 << (7 - j)))) != 0) ? (short) 1 : (short) 0; for (k = smin; k < nscratch; k++) { @@ -224,7 +224,7 @@ uint8_t convert_hex_amount_to_displayable(const uint8_t* amount, if (!nonZero && (scratch[offset] == 0)) { offset++; } else { - nonZero = 1; + nonZero = 1; out[targetOffset++] = scratch[offset++] + '0'; } } @@ -246,7 +246,7 @@ uint8_t convert_hex_amount_to_displayable(const uint8_t* amount, } if (!comma) { out[targetOffset++] = '.'; - comma = 1; + comma = 1; } out[targetOffset++] = scratch[offset++] + '0'; } From 9658ee606f857b6e660b6fa297655b9f0f9dec9e Mon Sep 17 00:00:00 2001 From: keiff3r Date: Mon, 17 Feb 2025 16:50:04 +0100 Subject: [PATCH 22/67] style: apply consistent code formatting across header files --- src/apdu_constants.h | 48 +++--- src/byte_stream.h | 4 +- src/cell.h | 10 +- src/contract.h | 32 ++-- src/errors.h | 38 ++--- src/globals.h | 52 +++--- src/message.h | 5 +- src/slice_data.h | 22 +-- src/text | 385 +++++++++++++++++++++++++++++++++++++++++++ src/utils.h | 30 ++-- 10 files changed, 505 insertions(+), 121 deletions(-) create mode 100644 src/text diff --git a/src/apdu_constants.h b/src/apdu_constants.h index 59b7e77..c834f93 100644 --- a/src/apdu_constants.h +++ b/src/apdu_constants.h @@ -23,29 +23,29 @@ #define OFFSET_LC 4 #define OFFSET_CDATA 5 -void handleGetAppConfiguration(uint8_t p1, - uint8_t p2, - uint8_t *dataBuffer, - uint16_t dataLength, - volatile unsigned int *flags, - volatile unsigned int *tx); -void handleGetPublicKey(uint8_t p1, - uint8_t p2, - uint8_t *dataBuffer, - uint16_t dataLength, - volatile unsigned int *flags, - volatile unsigned int *tx); -void handleGetAddress(uint8_t p1, - uint8_t p2, - uint8_t *dataBuffer, - uint16_t dataLength, - volatile unsigned int *flags, - volatile unsigned int *tx); -void handleSign(uint8_t *dataBuffer, uint16_t dataLength, volatile unsigned int *flags); -void handleSignTransaction(uint8_t *dataBuffer, - uint16_t dataLength, - volatile unsigned int *flags, - bool is_first_chunk, - bool more); +void handleGetAppConfiguration(uint8_t p1, + uint8_t p2, + uint8_t* dataBuffer, + uint16_t dataLength, + volatile unsigned int* flags, + volatile unsigned int* tx); +void handleGetPublicKey(uint8_t p1, + uint8_t p2, + uint8_t* dataBuffer, + uint16_t dataLength, + volatile unsigned int* flags, + volatile unsigned int* tx); +void handleGetAddress(uint8_t p1, + uint8_t p2, + uint8_t* dataBuffer, + uint16_t dataLength, + volatile unsigned int* flags, + volatile unsigned int* tx); +void handleSign(uint8_t* dataBuffer, uint16_t dataLength, volatile unsigned int* flags); +void handleSignTransaction(uint8_t* dataBuffer, + uint16_t dataLength, + volatile unsigned int* flags, + bool is_first_chunk, + bool more); #endif diff --git a/src/byte_stream.h b/src/byte_stream.h index 6b71a97..6b5144c 100644 --- a/src/byte_stream.h +++ b/src/byte_stream.h @@ -9,9 +9,9 @@ typedef struct ByteStream_t { uint8_t* data; } ByteStream_t; -void ByteStream_init(struct ByteStream_t* self, uint8_t* data, uint16_t data_size); +void ByteStream_init(struct ByteStream_t* self, uint8_t* data, uint16_t data_size); uint8_t* ByteStream_read_data(struct ByteStream_t* self, uint32_t data_size); -uint8_t ByteStream_read_byte(struct ByteStream_t* self); +uint8_t ByteStream_read_byte(struct ByteStream_t* self); uint32_t ByteStream_read_u32(struct ByteStream_t* self); uint8_t* ByteStream_get_cursor(struct ByteStream_t* self); uint16_t ByteStream_get_length(struct ByteStream_t* self); diff --git a/src/cell.h b/src/cell.h index c72c407..f14105f 100644 --- a/src/cell.h +++ b/src/cell.h @@ -12,14 +12,14 @@ typedef struct Cell_t { uint16_t cell_length; } Cell_t; -void Cell_init(struct Cell_t* self, uint8_t* cell_begin, uint16_t cell_length); -uint8_t Cell_get_d1(const struct Cell_t* self); -uint8_t Cell_get_d2(const struct Cell_t* self); -uint8_t Cell_get_data_size(const struct Cell_t* self); +void Cell_init(struct Cell_t* self, uint8_t* cell_begin, uint16_t cell_length); +uint8_t Cell_get_d1(const struct Cell_t* self); +uint8_t Cell_get_d2(const struct Cell_t* self); +uint8_t Cell_get_data_size(const struct Cell_t* self); uint8_t* Cell_get_data(const struct Cell_t* self); uint8_t* Cell_get_refs(const struct Cell_t* self, uint8_t* refs_count); uint16_t Cell_bit_len(struct Cell_t* self); uint16_t deserialize_cell(struct Cell_t* cell, const uint8_t cell_index, const uint8_t cells_count); -void calc_cell_hash(Cell_t* cell, const uint8_t cell_index); +void calc_cell_hash(Cell_t* cell, const uint8_t cell_index); #endif diff --git a/src/contract.h b/src/contract.h index e76c640..2f0be49 100644 --- a/src/contract.h +++ b/src/contract.h @@ -13,21 +13,21 @@ #define SIGN_TRANSACTION_FLOW_BURN 3 enum { - WALLET_V3 = 0, - EVER_WALLET = 1, - SAFE_MULTISIG_WALLET = 2, + WALLET_V3 = 0, + EVER_WALLET = 1, + SAFE_MULTISIG_WALLET = 2, SAFE_MULTISIG_WALLET_24H = 3, - SETCODE_MULTISIG_WALLET = 4, - BRIDGE_MULTISIG_WALLET = 5, - SURF_WALLET = 6, - MULTISIG_2 = 7, - MULTISIG_2_1 = 8, + SETCODE_MULTISIG_WALLET = 4, + BRIDGE_MULTISIG_WALLET = 5, + SURF_WALLET = 6, + MULTISIG_2 = 7, + MULTISIG_2_1 = 8, }; enum { - MULTISIG_DEPLOY_TRANSACTION = 1813932348, - MULTISIG_SEND_TRANSACTION = 1290691692, - MULTISIG_SUBMIT_TRANSACTION = 320701133, + MULTISIG_DEPLOY_TRANSACTION = 1813932348, + MULTISIG_SEND_TRANSACTION = 1290691692, + MULTISIG_SUBMIT_TRANSACTION = 320701133, MULTISIG_CONFIRM_TRANSACTION = 447168749, MULTISIG2_DEPLOY_TRANSACTION = 733015951, @@ -35,16 +35,12 @@ enum { }; enum { - TOKEN_BURN = 1445284013, // Burn - TOKEN_TRANSFER = 1944199491, // Deploy + TOKEN_BURN = 1445284013, // Burn + TOKEN_TRANSFER = 1944199491, // Deploy TOKEN_TRANSFER_TO_WALLET = 1185535980, // Ordinary transfer }; -enum { - NORMAL_FLAG = 3, - ALL_BALANCE_FLAG = 128, - ALL_BALANCE_AND_DELETE_FLAG = 160 -}; +enum { NORMAL_FLAG = 3, ALL_BALANCE_FLAG = 128, ALL_BALANCE_AND_DELETE_FLAG = 160 }; struct ByteStream_t; void deserialize_cells_tree(struct ByteStream_t* src); diff --git a/src/errors.h b/src/errors.h index 1d777b9..c4dc81c 100644 --- a/src/errors.h +++ b/src/errors.h @@ -2,28 +2,28 @@ #define _ERRORS_H_ enum { - SUCCESS = 0x9000, - ERR_INVALID_DATA = 0x6B00, - ERR_CELL_UNDERFLOW = 0x6B01, - ERR_RANGE_CHECK = 0x6B02, - ERR_WRONG_LABEL = 0x6B03, - ERR_INVALID_FLAG = 0x6B04, - ERR_END_OF_STREAM = 0x6B05, - ERR_SLICE_IS_EMPTY = 0x6B06, - ERR_INVALID_KEY = 0x6B07, - ERR_CELL_IS_EMPTY = 0x6B08, - ERR_INVALID_HASH = 0x6B09, - ERR_INVALID_CELL_INDEX = 0x6B10, - ERR_INVALID_REQUEST = 0x6B11, + SUCCESS = 0x9000, + ERR_INVALID_DATA = 0x6B00, + ERR_CELL_UNDERFLOW = 0x6B01, + ERR_RANGE_CHECK = 0x6B02, + ERR_WRONG_LABEL = 0x6B03, + ERR_INVALID_FLAG = 0x6B04, + ERR_END_OF_STREAM = 0x6B05, + ERR_SLICE_IS_EMPTY = 0x6B06, + ERR_INVALID_KEY = 0x6B07, + ERR_CELL_IS_EMPTY = 0x6B08, + ERR_INVALID_HASH = 0x6B09, + ERR_INVALID_CELL_INDEX = 0x6B10, + ERR_INVALID_REQUEST = 0x6B11, ERR_INVALID_FUNCTION_ID = 0x6B12, ERR_INVALID_SRC_ADDRESS = 0x6B13, - ERR_INVALID_WALLET_ID = 0x6B14, + ERR_INVALID_WALLET_ID = 0x6B14, ERR_INVALID_WALLET_TYPE = 0x6B15, - ERR_TICKER_LENGTH = 0x6B16, - ERR_INVALID_CELL = 0x6B17, - ERR_INVALID_CONTRACT = 0x6B18, - ERR_INVALID_MESSAGE = 0x6B19, - ERR_SIGNING_FAILED = 0x6B20, + ERR_TICKER_LENGTH = 0x6B16, + ERR_INVALID_CELL = 0x6B17, + ERR_INVALID_CONTRACT = 0x6B18, + ERR_INVALID_MESSAGE = 0x6B19, + ERR_SIGNING_FAILED = 0x6B20, ERR_GENERATE_PAIR_FAILED = 0x6B21, ERR_INIT_PRIVATE_KEY_FAILED = 0x6B22, ERR_DERIVE_PATH_FAILED = 0x6B23, diff --git a/src/globals.h b/src/globals.h index 95e8a89..0c2ecfc 100644 --- a/src/globals.h +++ b/src/globals.h @@ -46,7 +46,7 @@ void reset_app_context(void); typedef struct BocContext_t { - Cell_t cells[MAX_CONTRACT_CELLS_COUNT]; + Cell_t cells[MAX_CONTRACT_CELLS_COUNT]; uint8_t hashes[HASHES_BUFFER_SIZE]; uint8_t cell_depth[MAX_CONTRACT_CELLS_COUNT]; uint8_t public_key_cell_data[MAX_PUBLIC_KEY_CELL_DATA_SIZE]; @@ -57,46 +57,46 @@ typedef struct BocContext_t { typedef struct AddressContext_t { uint8_t address[ADDRESS_LENGTH]; - char address_str[65]; + char address_str[65]; } AddressContext_t; typedef struct PublicKeyContext_t { uint8_t public_key[PUBLIC_KEY_LENGTH]; - char public_key_str[65]; + char public_key_str[65]; } PublicKeyContext_t; typedef struct SignContext_t { - uint8_t chain_id[CHAIN_ID_LENGTH]; - uint8_t to_sign[SIGN_MAGIC_LENGTH + TO_SIGN_LENGTH]; - uint8_t signature[SIGNATURE_LENGTH]; + uint8_t chain_id[CHAIN_ID_LENGTH]; + uint8_t to_sign[SIGN_MAGIC_LENGTH + TO_SIGN_LENGTH]; + uint8_t signature[SIGNATURE_LENGTH]; uint32_t account_number; - char to_sign_str[73]; + char to_sign_str[73]; } SignContext_t; typedef struct SignTransactionContext_t { - bool sign_with_chain_id; - uint8_t chain_id[CHAIN_ID_LENGTH]; - uint8_t to_sign[CHAIN_ID_LENGTH + TO_SIGN_LENGTH]; - uint8_t signature[SIGNATURE_LENGTH]; - char address_str[70]; - char amount_str[40]; - char transaction_id_str[20]; + bool sign_with_chain_id; + uint8_t chain_id[CHAIN_ID_LENGTH]; + uint8_t to_sign[CHAIN_ID_LENGTH + TO_SIGN_LENGTH]; + uint8_t signature[SIGNATURE_LENGTH]; + char address_str[70]; + char amount_str[40]; + char transaction_id_str[20]; uint32_t account_number; - uint8_t origin_wallet_type; - uint8_t current_wallet_type; - uint8_t decimals; - uint8_t address[ADDRESS_LENGTH]; - uint8_t prepend_address[ADDRESS_LENGTH]; - uint8_t wc; - uint8_t data[MAX_DATA_LEN]; + uint8_t origin_wallet_type; + uint8_t current_wallet_type; + uint8_t decimals; + uint8_t address[ADDRESS_LENGTH]; + uint8_t prepend_address[ADDRESS_LENGTH]; + uint8_t wc; + uint8_t data[MAX_DATA_LEN]; uint16_t data_offset; - char ticker[MAX_TICKER_LEN]; + char ticker[MAX_TICKER_LEN]; } SignTransactionContext_t; typedef union { - PublicKeyContext_t pk_context; - AddressContext_t addr_context; - SignContext_t sign_context; + PublicKeyContext_t pk_context; + AddressContext_t addr_context; + SignContext_t sign_context; SignTransactionContext_t sign_tr_context; } DataContext_t; @@ -104,7 +104,7 @@ typedef union { extern unsigned int ux_step; extern unsigned int ux_step_count; -extern BocContext_t boc_context; +extern BocContext_t boc_context; extern DataContext_t data_context; #endif diff --git a/src/message.h b/src/message.h index cd48c84..296f600 100644 --- a/src/message.h +++ b/src/message.h @@ -6,6 +6,9 @@ #define DEFAULT_WORKCHAIN_ID 0 struct ByteStream_t; -int prepare_to_sign(struct ByteStream_t* src, uint8_t wc, uint8_t* address, uint8_t* prepend_address); +int prepare_to_sign(struct ByteStream_t* src, + uint8_t wc, + uint8_t* address, + uint8_t* prepend_address); #endif diff --git a/src/slice_data.h b/src/slice_data.h index 9769fc3..8eee81a 100644 --- a/src/slice_data.h +++ b/src/slice_data.h @@ -13,22 +13,22 @@ typedef struct SliceData_t { struct Cell_t; -void SliceData_init(struct SliceData_t* self, uint8_t* data, uint16_t data_size_bytes); -void SliceData_from_cell(struct SliceData_t* self, struct Cell_t* cell); -void SliceData_fill(struct SliceData_t* self, uint8_t value, uint16_t data_size_bytes); -void SliceData_truncate(struct SliceData_t* self, uint16_t size); +void SliceData_init(struct SliceData_t* self, uint8_t* data, uint16_t data_size_bytes); +void SliceData_from_cell(struct SliceData_t* self, struct Cell_t* cell); +void SliceData_fill(struct SliceData_t* self, uint8_t value, uint16_t data_size_bytes); +void SliceData_truncate(struct SliceData_t* self, uint16_t size); uint16_t SliceData_remaining_bits(const struct SliceData_t* self); -void SliceData_move_by(struct SliceData_t* self, uint16_t offset); -uint8_t SliceData_get_bits(const struct SliceData_t* self, uint16_t offset, uint8_t bits); -uint8_t SliceData_get_next_bit(struct SliceData_t* self); -uint8_t SliceData_get_next_byte(struct SliceData_t* self); +void SliceData_move_by(struct SliceData_t* self, uint16_t offset); +uint8_t SliceData_get_bits(const struct SliceData_t* self, uint16_t offset, uint8_t bits); +uint8_t SliceData_get_next_bit(struct SliceData_t* self); +uint8_t SliceData_get_next_byte(struct SliceData_t* self); uint64_t SliceData_get_next_int(struct SliceData_t* self, uint8_t bits); uint64_t SliceData_get_next_size(struct SliceData_t* self, uint16_t max_value); -bool SliceData_is_empty(const struct SliceData_t* self); -bool SliceData_equal(const struct SliceData_t* self, const struct SliceData_t* other); +bool SliceData_is_empty(const struct SliceData_t* self); +bool SliceData_equal(const struct SliceData_t* self, const struct SliceData_t* other); uint16_t SliceData_get_cursor(const struct SliceData_t* self); uint8_t* SliceData_begin(const struct SliceData_t* self); uint16_t SliceData_data_size(const struct SliceData_t* self); -void SliceData_append(struct SliceData_t* self, uint8_t* data, uint16_t bits, bool append_tag); +void SliceData_append(struct SliceData_t* self, uint8_t* data, uint16_t bits, bool append_tag); #endif diff --git a/src/text b/src/text new file mode 100644 index 0000000..4b62c2e --- /dev/null +++ b/src/text @@ -0,0 +1,385 @@ +/usr/bin/docker run --name cf2912b6eda476ca142b2814c965c07_cbf8c6 --label 119993 --workdir /github/workspace --rm -e "INPUT_SOURCE" -e "INPUT_EXTENSIONS" -e "INPUT_CLANGFORMATVERSION" -e "INPUT_EXCLUDE" -e "INPUT_STYLE" -e "INPUT_INPLACE" -e "HOME" -e "GITHUB_JOB" -e "GITHUB_REF" -e "GITHUB_SHA" -e "GITHUB_REPOSITORY" -e "GITHUB_REPOSITORY_OWNER" -e "GITHUB_REPOSITORY_OWNER_ID" -e "GITHUB_RUN_ID" -e "GITHUB_RUN_NUMBER" -e "GITHUB_RETENTION_DAYS" -e "GITHUB_RUN_ATTEMPT" -e "GITHUB_REPOSITORY_ID" -e "GITHUB_ACTOR_ID" -e "GITHUB_ACTOR" -e "GITHUB_TRIGGERING_ACTOR" -e "GITHUB_WORKFLOW" -e "GITHUB_HEAD_REF" -e "GITHUB_BASE_REF" -e "GITHUB_EVENT_NAME" -e "GITHUB_SERVER_URL" -e "GITHUB_API_URL" -e "GITHUB_GRAPHQL_URL" -e "GITHUB_REF_NAME" -e "GITHUB_REF_PROTECTED" -e "GITHUB_REF_TYPE" -e "GITHUB_WORKFLOW_REF" -e "GITHUB_WORKFLOW_SHA" -e "GITHUB_WORKSPACE" -e "GITHUB_ACTION" -e "GITHUB_EVENT_PATH" -e "GITHUB_ACTION_REPOSITORY" -e "GITHUB_ACTION_REF" -e "GITHUB_PATH" -e "GITHUB_ENV" -e "GITHUB_STEP_SUMMARY" -e "GITHUB_STATE" -e "GITHUB_OUTPUT" -e "RUNNER_OS" -e "RUNNER_ARCH" -e "RUNNER_NAME" -e "RUNNER_ENVIRONMENT" -e "RUNNER_TOOL_CACHE" -e "RUNNER_TEMP" -e "RUNNER_WORKSPACE" -e "ACTIONS_RUNTIME_URL" -e "ACTIONS_RUNTIME_TOKEN" -e "ACTIONS_CACHE_URL" -e "ACTIONS_RESULTS_URL" -e GITHUB_ACTIONS=true -e CI=true --network github_network_87a5535abc654fe98bcb659114df86d4 -v "/var/run/docker.sock":"/var/run/docker.sock" -v "/home/runner/work/_temp/_github_home":"/github/home" -v "/home/runner/work/_temp/_github_workflow":"/github/workflow" -v "/home/runner/work/_temp/_runner_file_commands":"/github/file_commands" -v "/home/runner/work/app-everscale/app-everscale":"/github/workspace" 119993:0cf2912b6eda476ca142b2814c965c07 "--clang-format-executable" "/clang-format/clang-format12" "-r" "--color" "always" "--style" "file" "--inplace" "false" "--extensions" "h,c" "--exclude" "none" "./src" +Processing 26 files: ./src/menu.c, ./src/sign.c, ./src/main.c, ./src/contract.c, ./src/contract.h, ./src/hashmap_label.c, ./src/message.h, ./src/menu.h, ./src/apdu_constants.h, ./src/message.c, ./src/cell.h, ./src/slice_data.c, ./src/byte_stream.c, ./src/get_app_configuration.c, ./src/slice_data.h, ./src/get_public_key.c, ./src/globals.c, ./src/sign_transaction.c, ./src/globals.h, ./src/errors.h, ./src/cell.c, ./src/get_address.c, ./src/utils.c, ./src/byte_stream.h, ./src/hashmap_label.h, ./src/utils.h +--- ./src/message.h (original) ++++ ./src/message.h (reformatted) +@@ -6,6 +6,9 @@ +#define DEFAULT_WORKCHAIN_ID 0 + + struct ByteStream_t; +- + int + prepare_to_sign(struct ByteStream_t* src, + uint8_t wc, + uint8_t* address, + uint8_t* prepend_address); ++ + int + prepare_to_sign(struct ByteStream_t* src, + +uint8_t wc, + +uint8_t* address, + +uint8_t* prepend_address); + +#endif +-- -./ src / contract.h(original)++ +./ src / contract.h(reformatted) @ @-13, 21 + 13, + 21 @ @ +#define SIGN_TRANSACTION_FLOW_BURN 3 + + enum { + -WALLET_V3 = 0, + -EVER_WALLET = 1, + -SAFE_MULTISIG_WALLET = 2, + +WALLET_V3 = 0, + +EVER_WALLET = 1, + +SAFE_MULTISIG_WALLET = 2, + SAFE_MULTISIG_WALLET_24H = 3, + -SETCODE_MULTISIG_WALLET = 4, + -BRIDGE_MULTISIG_WALLET = 5, + -SURF_WALLET = 6, + -MULTISIG_2 = 7, + -MULTISIG_2_1 = 8, + +SETCODE_MULTISIG_WALLET = 4, + +BRIDGE_MULTISIG_WALLET = 5, + +SURF_WALLET = 6, + +MULTISIG_2 = 7, + +MULTISIG_2_1 = 8, + }; + +enum { + -MULTISIG_DEPLOY_TRANSACTION = 1813932348, + -MULTISIG_SEND_TRANSACTION = 1290691692, + -MULTISIG_SUBMIT_TRANSACTION = 320701133, + +MULTISIG_DEPLOY_TRANSACTION = 1813932348, + +MULTISIG_SEND_TRANSACTION = 1290691692, + +MULTISIG_SUBMIT_TRANSACTION = 320701133, + MULTISIG_CONFIRM_TRANSACTION = 447168749, + + MULTISIG2_DEPLOY_TRANSACTION = 733015951, + @ @-35, + 16 + 35, + 12 @ @ +}; + +enum { + -TOKEN_BURN = 1445284013, // Burn + -TOKEN_TRANSFER = 1944199491, // Deploy + +TOKEN_BURN = 1445284013, // Burn + +TOKEN_TRANSFER = 1944199491, // Deploy + TOKEN_TRANSFER_TO_WALLET = 1185535980, // Ordinary transfer +}; + +- enum { -NORMAL_FLAG = 3, -ALL_BALANCE_FLAG = 128, -ALL_BALANCE_AND_DELETE_FLAG = 160 - }; ++ enum { NORMAL_FLAG = 3, ALL_BALANCE_FLAG = 128, ALL_BALANCE_AND_DELETE_FLAG = 160 }; + +struct ByteStream_t; +void deserialize_cells_tree(struct ByteStream_t* src); +-- -./ src / apdu_constants.h(original)++ +./ src / apdu_constants.h(reformatted) @ @-23, 29 + 23, + 29 @ @ +#define OFFSET_LC 4 +#define OFFSET_CDATA 5 + + -void handleGetAppConfiguration(uint8_t p1, + -uint8_t p2, + -uint8_t* dataBuffer, + -uint16_t dataLength, + -volatile unsigned int* flags, + -volatile unsigned int* tx); +- void +handleGetPublicKey(uint8_t p1, + -uint8_t p2, + -uint8_t* dataBuffer, + -uint16_t dataLength, + -volatile unsigned int* flags, + -volatile unsigned int* tx); +- void +handleGetAddress(uint8_t p1, + -uint8_t p2, + -uint8_t* dataBuffer, + -uint16_t dataLength, + -volatile unsigned int* flags, + -volatile unsigned int* tx); +- void handleSign(uint8_t* dataBuffer, uint16_t dataLength, volatile unsigned int* flags); +- void +handleSignTransaction(uint8_t* dataBuffer, + -uint16_t dataLength, + -volatile unsigned int* flags, + -bool is_first_chunk, + -bool more); ++ void +handleGetAppConfiguration(uint8_t p1, + +uint8_t p2, + +uint8_t* dataBuffer, + +uint16_t dataLength, + +volatile unsigned int* flags, + +volatile unsigned int* tx); ++ void +handleGetPublicKey(uint8_t p1, + +uint8_t p2, + +uint8_t* dataBuffer, + +uint16_t dataLength, + +volatile unsigned int* flags, + +volatile unsigned int* tx); ++ void +handleGetAddress(uint8_t p1, + +uint8_t p2, + +uint8_t* dataBuffer, + +uint16_t dataLength, + +volatile unsigned int* flags, + +volatile unsigned int* tx); ++ void handleSign(uint8_t* dataBuffer, uint16_t dataLength, volatile unsigned int* flags); ++ void +handleSignTransaction(uint8_t* dataBuffer, + +uint16_t dataLength, + +volatile unsigned int* flags, + +bool is_first_chunk, + +bool more); + +#endif +-- -./ src / cell.h(original)++ +./ src / cell.h(reformatted) @ @-12, 14 + 12, + 14 @ @uint16_t cell_length; +} +Cell_t; + +- void Cell_init(struct Cell_t* self, uint8_t* cell_begin, uint16_t cell_length); +- uint8_t Cell_get_d1(const struct Cell_t* self); +- uint8_t Cell_get_d2(const struct Cell_t* self); +- uint8_t Cell_get_data_size(const struct Cell_t* self); ++ void Cell_init(struct Cell_t* self, uint8_t* cell_begin, uint16_t cell_length); ++ uint8_t Cell_get_d1(const struct Cell_t* self); ++ uint8_t Cell_get_d2(const struct Cell_t* self); ++ uint8_t Cell_get_data_size(const struct Cell_t* self); +uint8_t* Cell_get_data(const struct Cell_t* self); +uint8_t* Cell_get_refs(const struct Cell_t* self, uint8_t* refs_count); +uint16_t Cell_bit_len(struct Cell_t* self); +uint16_t deserialize_cell(struct Cell_t* cell, const uint8_t cell_index, const uint8_t cells_count); +- void calc_cell_hash(Cell_t* cell, const uint8_t cell_index); ++ void calc_cell_hash(Cell_t* cell, const uint8_t cell_index); + +#endif +-- -./ src / slice_data.h(original)++ +./ src / slice_data.h(reformatted) @ @-13, 22 + 13, + 22 @ @ + + struct Cell_t; + +- void SliceData_init(struct SliceData_t* self, uint8_t* data, uint16_t data_size_bytes); +- void SliceData_from_cell(struct SliceData_t* self, struct Cell_t* cell); +- void SliceData_fill(struct SliceData_t* self, uint8_t value, uint16_t data_size_bytes); +- void SliceData_truncate(struct SliceData_t* self, uint16_t size); ++ void SliceData_init(struct SliceData_t* self, uint8_t* data, uint16_t data_size_bytes); ++ void SliceData_from_cell(struct SliceData_t* self, struct Cell_t* cell); ++ void SliceData_fill(struct SliceData_t* self, uint8_t value, uint16_t data_size_bytes); ++ void SliceData_truncate(struct SliceData_t* self, uint16_t size); +uint16_t SliceData_remaining_bits(const struct SliceData_t* self); +- void SliceData_move_by(struct SliceData_t* self, uint16_t offset); +- uint8_t SliceData_get_bits(const struct SliceData_t* self, uint16_t offset, uint8_t bits); +- uint8_t SliceData_get_next_bit(struct SliceData_t* self); +- uint8_t SliceData_get_next_byte(struct SliceData_t* self); ++ void SliceData_move_by(struct SliceData_t* self, uint16_t offset); ++ uint8_t SliceData_get_bits(const struct SliceData_t* self, uint16_t offset, uint8_t bits); ++ uint8_t SliceData_get_next_bit(struct SliceData_t* self); ++ uint8_t SliceData_get_next_byte(struct SliceData_t* self); +uint64_t SliceData_get_next_int(struct SliceData_t* self, uint8_t bits); +uint64_t SliceData_get_next_size(struct SliceData_t* self, uint16_t max_value); +- bool SliceData_is_empty(const struct SliceData_t* self); +- bool SliceData_equal(const struct SliceData_t* self, const struct SliceData_t* other); ++ bool SliceData_is_empty(const struct SliceData_t* self); ++ bool SliceData_equal(const struct SliceData_t* self, const struct SliceData_t* other); +uint16_t SliceData_get_cursor(const struct SliceData_t* self); +uint8_t* SliceData_begin(const struct SliceData_t* self); +uint16_t SliceData_data_size(const struct SliceData_t* self); +- void SliceData_append(struct SliceData_t* self, uint8_t* data, uint16_t bits, bool append_tag); ++ void SliceData_append(struct SliceData_t* self, uint8_t* data, uint16_t bits, bool append_tag); + +#endif +-- -./ src / globals.h(original)++ +./ src / globals.h(reformatted) @ @-46, 7 + 46, + 7 @ @ void reset_app_context(void); + +typedef struct BocContext_t { + - Cell_t cells[MAX_CONTRACT_CELLS_COUNT]; + + Cell_t cells[MAX_CONTRACT_CELLS_COUNT]; + uint8_t hashes[HASHES_BUFFER_SIZE]; + uint8_t cell_depth[MAX_CONTRACT_CELLS_COUNT]; + uint8_t public_key_cell_data[MAX_PUBLIC_KEY_CELL_DATA_SIZE]; + @ @-57, 46 + 57, + 46 @ @ + + typedef struct AddressContext_t { + uint8_t address[ADDRESS_LENGTH]; + - char address_str[65]; + + char address_str[65]; + } AddressContext_t; + + typedef struct PublicKeyContext_t { + uint8_t public_key[PUBLIC_KEY_LENGTH]; + - char public_key_str[65]; + + char public_key_str[65]; + } PublicKeyContext_t; + + typedef struct SignContext_t { + - uint8_t chain_id[CHAIN_ID_LENGTH]; + - uint8_t to_sign[SIGN_MAGIC_LENGTH + TO_SIGN_LENGTH]; + - uint8_t signature[SIGNATURE_LENGTH]; + + uint8_t chain_id[CHAIN_ID_LENGTH]; + + uint8_t to_sign[SIGN_MAGIC_LENGTH + TO_SIGN_LENGTH]; + + uint8_t signature[SIGNATURE_LENGTH]; + uint32_t account_number; + - char to_sign_str[73]; + + char to_sign_str[73]; + } SignContext_t; + + typedef struct SignTransactionContext_t { + - bool sign_with_chain_id; + - uint8_t chain_id[CHAIN_ID_LENGTH]; + - uint8_t to_sign[CHAIN_ID_LENGTH + TO_SIGN_LENGTH]; + - uint8_t signature[SIGNATURE_LENGTH]; + - char address_str[70]; + - char amount_str[40]; + - char transaction_id_str[20]; + + bool sign_with_chain_id; + + uint8_t chain_id[CHAIN_ID_LENGTH]; + + uint8_t to_sign[CHAIN_ID_LENGTH + TO_SIGN_LENGTH]; + + uint8_t signature[SIGNATURE_LENGTH]; + + char address_str[70]; + + char amount_str[40]; + + char transaction_id_str[20]; + uint32_t account_number; + - uint8_t origin_wallet_type; + - uint8_t current_wallet_type; + - uint8_t decimals; + - uint8_t address[ADDRESS_LENGTH]; + - uint8_t prepend_address[ADDRESS_LENGTH]; + - uint8_t wc; + - uint8_t data[MAX_DATA_LEN]; + + uint8_t origin_wallet_type; + + uint8_t current_wallet_type; + + uint8_t decimals; + + uint8_t address[ADDRESS_LENGTH]; + + uint8_t prepend_address[ADDRESS_LENGTH]; + + uint8_t wc; + + uint8_t data[MAX_DATA_LEN]; + uint16_t data_offset; + - char ticker[MAX_TICKER_LEN]; + + char ticker[MAX_TICKER_LEN]; + } SignTransactionContext_t; + + typedef union { + - PublicKeyContext_t pk_context; + - AddressContext_t addr_context; + - SignContext_t sign_context; + + PublicKeyContext_t pk_context; + + AddressContext_t addr_context; + + SignContext_t sign_context; + SignTransactionContext_t sign_tr_context; + } DataContext_t; + + @ @-104, 7 + 104, 7 @ @ extern unsigned int ux_step; + extern unsigned int ux_step_count; + + - extern BocContext_t boc_context; + + extern BocContext_t boc_context; + extern DataContext_t data_context; + +#endif + -- -./ src / byte_stream.h(original)++ +./ src / byte_stream.h(reformatted) @ @-9, 9 + 9, + 9 @ @uint8_t* data; +} ByteStream_t; + +- void ByteStream_init(struct ByteStream_t* self, uint8_t* data, uint16_t data_size); ++ void ByteStream_init(struct ByteStream_t* self, uint8_t* data, uint16_t data_size); +uint8_t* ByteStream_read_data(struct ByteStream_t* self, uint32_t data_size); +- uint8_t ByteStream_read_byte(struct ByteStream_t* self); ++ uint8_t ByteStream_read_byte(struct ByteStream_t* self); +uint32_t ByteStream_read_u32(struct ByteStream_t* self); +uint8_t* ByteStream_get_cursor(struct ByteStream_t* self); +uint16_t ByteStream_get_length(struct ByteStream_t* self); +-- -./ src / errors.h(original)++ +./ src / errors.h(reformatted) @ @-2, 28 + 2, + 28 @ @ +#define _ERRORS_H_ + + enum { + -SUCCESS = 0x9000, + -ERR_INVALID_DATA = 0x6B00, + -ERR_CELL_UNDERFLOW = 0x6B01, + -ERR_RANGE_CHECK = 0x6B02, + -ERR_WRONG_LABEL = 0x6B03, + -ERR_INVALID_FLAG = 0x6B04, + -ERR_END_OF_STREAM = 0x6B05, + -ERR_SLICE_IS_EMPTY = 0x6B06, + -ERR_INVALID_KEY = 0x6B07, + -ERR_CELL_IS_EMPTY = 0x6B08, + -ERR_INVALID_HASH = 0x6B09, + -ERR_INVALID_CELL_INDEX = 0x6B10, + -ERR_INVALID_REQUEST = 0x6B11, + +SUCCESS = 0x9000, + +ERR_INVALID_DATA = 0x6B00, + +ERR_CELL_UNDERFLOW = 0x6B01, + +ERR_RANGE_CHECK = 0x6B02, + +ERR_WRONG_LABEL = 0x6B03, + +ERR_INVALID_FLAG = 0x6B04, + +ERR_END_OF_STREAM = 0x6B05, + +ERR_SLICE_IS_EMPTY = 0x6B06, + +ERR_INVALID_KEY = 0x6B07, + +ERR_CELL_IS_EMPTY = 0x6B08, + +ERR_INVALID_HASH = 0x6B09, + +ERR_INVALID_CELL_INDEX = 0x6B10, + +ERR_INVALID_REQUEST = 0x6B11, + ERR_INVALID_FUNCTION_ID = 0x6B12, + ERR_INVALID_SRC_ADDRESS = 0x6B13, + -ERR_INVALID_WALLET_ID = 0x6B14, + +ERR_INVALID_WALLET_ID = 0x6B14, + ERR_INVALID_WALLET_TYPE = 0x6B15, + -ERR_TICKER_LENGTH = 0x6B16, + -ERR_INVALID_CELL = 0x6B17, + -ERR_INVALID_CONTRACT = 0x6B18, + -ERR_INVALID_MESSAGE = 0x6B19, + -ERR_SIGNING_FAILED = 0x6B20, + +ERR_TICKER_LENGTH = 0x6B16, + +ERR_INVALID_CELL = 0x6B17, + +ERR_INVALID_CONTRACT = 0x6B18, + +ERR_INVALID_MESSAGE = 0x6B19, + +ERR_SIGNING_FAILED = 0x6B20, + ERR_GENERATE_PAIR_FAILED = 0x6B21, + ERR_INIT_PRIVATE_KEY_FAILED = 0x6B22, + ERR_DERIVE_PATH_FAILED = 0x6B23, + -- -./ src / utils.h(original)++ +./ src / utils.h(reformatted) @ @-10, + 26 + 10, + 26 @ @ + +#ifndef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION + + -unsigned int ui_prepro(const bagl_element_t* element); + -void get_public_key(uint32_t accountNumber, uint8_t* publicKeyArray); + -void get_private_key(uint32_t accountNumber, cx_ecfp_private_key_t* privateKey); + -void send_response(uint8_t tx, bool approve); + +unsigned int ui_prepro(const bagl_element_t* element); + +void get_public_key(uint32_t accountNumber, uint8_t* publicKeyArray); + +void get_private_key(uint32_t accountNumber, cx_ecfp_private_key_t* privateKey); + +void send_response(uint8_t tx, bool approve); + +#endif + + -void writeUint32BE(uint32_t val, uint8_t* bytes); + -void writeUint64BE(uint64_t val, uint8_t* bytes); + +void writeUint32BE(uint32_t val, uint8_t* bytes); + +void writeUint64BE(uint64_t val, uint8_t* bytes); + + -uint16_t readUint16BE(uint8_t * buffer); + -uint32_t readUint32BE(uint8_t * buffer); + -uint64_t readUint64BE(uint8_t * buffer); + -uint8_t leading_zeros(uint16_t value); + +uint16_t readUint16BE(uint8_t * buffer); + +uint32_t readUint32BE(uint8_t * buffer); + +uint64_t readUint64BE(uint8_t * buffer); + +uint8_t leading_zeros(uint16_t value); + + -uint16_t format_hex(const uint8_t* in, size_t in_len, char* out, size_t out_len); + -uint8_t convert_hex_amount_to_displayable(const uint8_t* amount, + -uint8_t decimals, + -uint8_t amount_length, + -char* out); + +uint16_t format_hex(const uint8_t* in, size_t in_len, char* out, size_t out_len); + +uint8_t convert_hex_amount_to_displayable(const uint8_t* amount, + +uint8_t decimals, + +uint8_t amount_length, + +char* out); + +#define VALIDATE(cond, error) do { \ No newline at end of file diff --git a/src/utils.h b/src/utils.h index ede41b3..552d025 100644 --- a/src/utils.h +++ b/src/utils.h @@ -10,26 +10,26 @@ #ifndef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION -unsigned int ui_prepro(const bagl_element_t *element); -void get_public_key(uint32_t accountNumber, uint8_t *publicKeyArray); -void get_private_key(uint32_t accountNumber, cx_ecfp_private_key_t *privateKey); -void send_response(uint8_t tx, bool approve); +unsigned int ui_prepro(const bagl_element_t* element); +void get_public_key(uint32_t accountNumber, uint8_t* publicKeyArray); +void get_private_key(uint32_t accountNumber, cx_ecfp_private_key_t* privateKey); +void send_response(uint8_t tx, bool approve); #endif -void writeUint32BE(uint32_t val, uint8_t *bytes); -void writeUint64BE(uint64_t val, uint8_t *bytes); +void writeUint32BE(uint32_t val, uint8_t* bytes); +void writeUint64BE(uint64_t val, uint8_t* bytes); -uint16_t readUint16BE(uint8_t *buffer); -uint32_t readUint32BE(uint8_t *buffer); -uint64_t readUint64BE(uint8_t *buffer); -uint8_t leading_zeros(uint16_t value); +uint16_t readUint16BE(uint8_t* buffer); +uint32_t readUint32BE(uint8_t* buffer); +uint64_t readUint64BE(uint8_t* buffer); +uint8_t leading_zeros(uint16_t value); -uint16_t format_hex(const uint8_t *in, size_t in_len, char *out, size_t out_len); -uint8_t convert_hex_amount_to_displayable(const uint8_t *amount, - uint8_t decimals, - uint8_t amount_length, - char *out); +uint16_t format_hex(const uint8_t* in, size_t in_len, char* out, size_t out_len); +uint8_t convert_hex_amount_to_displayable(const uint8_t* amount, + uint8_t decimals, + uint8_t amount_length, + char* out); #define VALIDATE(cond, error) \ do { \ From 15d6b3cce7495a2e5253499153363614394be1f3 Mon Sep 17 00:00:00 2001 From: keiff3r Date: Mon, 17 Feb 2025 18:03:57 +0100 Subject: [PATCH 23/67] refactor: move handler file in the corresponding folder --- src/{ => handler}/get_address.c | 0 src/{ => handler}/get_app_configuration.c | 0 src/{ => handler}/get_public_key.c | 0 src/{ => handler}/sign.c | 0 src/{ => handler}/sign_transaction.c | 0 5 files changed, 0 insertions(+), 0 deletions(-) rename src/{ => handler}/get_address.c (100%) rename src/{ => handler}/get_app_configuration.c (100%) rename src/{ => handler}/get_public_key.c (100%) rename src/{ => handler}/sign.c (100%) rename src/{ => handler}/sign_transaction.c (100%) diff --git a/src/get_address.c b/src/handler/get_address.c similarity index 100% rename from src/get_address.c rename to src/handler/get_address.c diff --git a/src/get_app_configuration.c b/src/handler/get_app_configuration.c similarity index 100% rename from src/get_app_configuration.c rename to src/handler/get_app_configuration.c diff --git a/src/get_public_key.c b/src/handler/get_public_key.c similarity index 100% rename from src/get_public_key.c rename to src/handler/get_public_key.c diff --git a/src/sign.c b/src/handler/sign.c similarity index 100% rename from src/sign.c rename to src/handler/sign.c diff --git a/src/sign_transaction.c b/src/handler/sign_transaction.c similarity index 100% rename from src/sign_transaction.c rename to src/handler/sign_transaction.c From c4ad079c567647f91d03d550739ed60617572dc1 Mon Sep 17 00:00:00 2001 From: keiff3r Date: Mon, 17 Feb 2025 19:09:48 +0100 Subject: [PATCH 24/67] refactor: centralize UI display logic and separate platform-specific implementations This commit introduces a new UI display architecture: - Created a common display.h header with UI display function declarations - Added platform-specific implementations for BAGL and NBGL - Moved UI flow definitions from individual handler files to display_bagl.c - Extracted response setting functions to a separate response_setter.c/h - Updated handler files to use new centralized UI display functions - Replaced direct ux_flow_init calls with platform-agnostic UI display functions --- src/handler/get_address.c | 48 +------- src/handler/get_public_key.c | 45 +------ src/handler/sign.c | 69 +---------- src/handler/sign_transaction.c | 133 +-------------------- src/main.c | 3 +- src/menu.h | 2 +- src/response_setter.c | 89 ++++++++++++++ src/response_setter.h | 8 ++ src/ui/display.h | 6 + src/ui/display_bagl.c | 207 +++++++++++++++++++++++++++++++++ src/ui/display_nbgl.c | 35 ++++++ src/ui/menu.h | 8 ++ src/{menu.c => ui/menu_bagl.c} | 4 +- src/ui/menu_nbgl.c | 40 +++++++ src/utils.c | 2 +- 15 files changed, 411 insertions(+), 288 deletions(-) create mode 100644 src/response_setter.c create mode 100644 src/response_setter.h create mode 100644 src/ui/display.h create mode 100644 src/ui/display_bagl.c create mode 100644 src/ui/display_nbgl.c create mode 100644 src/ui/menu.h rename src/{menu.c => ui/menu_bagl.c} (90%) create mode 100644 src/ui/menu_nbgl.c diff --git a/src/handler/get_address.c b/src/handler/get_address.c index fb3039a..90a972f 100644 --- a/src/handler/get_address.c +++ b/src/handler/get_address.c @@ -4,50 +4,8 @@ #include "contract.h" #include "slice_data.h" #include "byte_stream.h" - -static uint8_t set_result_get_address() { - uint8_t tx = 0; - G_io_apdu_buffer[tx++] = ADDRESS_LENGTH; - memmove(G_io_apdu_buffer + tx, data_context.addr_context.address, ADDRESS_LENGTH); - tx += ADDRESS_LENGTH; - reset_app_context(); - return tx; -} - -UX_STEP_NOCB(ux_display_address_flow_1_step, - pnn, - { - &C_icon_eye, - "Verify", - "address", - }); -UX_STEP_NOCB(ux_display_address_flow_2_step, - bnnn_paging, - { - .title = "Address", - .text = data_context.addr_context.address_str, - }); -UX_STEP_CB(ux_display_address_flow_3_step, - pb, - send_response(0, false), - { - &C_icon_crossmark, - "Reject", - }); -UX_STEP_CB(ux_display_address_flow_4_step, - pb, - send_response(set_result_get_address(), true), - { - &C_icon_validate_14, - "Approve", - }); - -UX_FLOW(ux_display_address_flow, - &ux_display_address_flow_1_step, - &ux_display_address_flow_2_step, - &ux_display_address_flow_3_step, - &ux_display_address_flow_4_step); - +#include "response_setter.h" +#include "ui/display.h" void handleGetAddress(uint8_t p1, uint8_t p2, uint8_t* dataBuffer, @@ -75,7 +33,7 @@ void handleGetAddress(uint8_t p1, sizeof(context->address), context->address_str, sizeof(context->address_str)); - ux_flow_init(0, ux_display_address_flow, NULL); + ui_display_address(); *flags |= IO_ASYNCH_REPLY; return; } diff --git a/src/handler/get_public_key.c b/src/handler/get_public_key.c index 858335c..d6e36a3 100644 --- a/src/handler/get_public_key.c +++ b/src/handler/get_public_key.c @@ -3,45 +3,8 @@ #include "utils.h" #include "apdu_constants.h" #include "errors.h" - -static uint8_t set_result_get_public_key() { - uint8_t tx = 0; - G_io_apdu_buffer[tx++] = PUBLIC_KEY_LENGTH; - memmove(G_io_apdu_buffer + tx, data_context.pk_context.public_key, PUBLIC_KEY_LENGTH); - tx += PUBLIC_KEY_LENGTH; - reset_app_context(); - return tx; -} - -#ifndef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION - -UX_STEP_NOCB(ux_display_public_flow_1_step, - bnnn_paging, - { - .title = "Public key", - .text = data_context.pk_context.public_key_str, - }); -UX_STEP_CB(ux_display_public_flow_2_step, - pb, - send_response(0, false), - { - &C_icon_crossmark, - "Reject", - }); -UX_STEP_CB(ux_display_public_flow_3_step, - pb, - send_response(set_result_get_public_key(), true), - { - &C_icon_validate_14, - "Approve", - }); - -UX_FLOW(ux_display_public_flow, - &ux_display_public_flow_1_step, - &ux_display_public_flow_2_step, - &ux_display_public_flow_3_step); - -#endif +#include "ui/display.h" +#include "response_setter.h" void handleGetPublicKey(uint8_t p1, uint8_t p2, @@ -64,9 +27,7 @@ void handleGetPublicKey(uint8_t p1, sizeof(context->public_key), context->public_key_str, sizeof(context->public_key_str)); -#ifndef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION - ux_flow_init(0, ux_display_public_flow, NULL); -#endif + ui_display_public_key(); *flags |= IO_ASYNCH_REPLY; return; } diff --git a/src/handler/sign.c b/src/handler/sign.c index f08ac8a..9971525 100644 --- a/src/handler/sign.c +++ b/src/handler/sign.c @@ -1,75 +1,10 @@ #include "apdu_constants.h" #include "utils.h" #include "errors.h" +#include "ui/display.h" static const char SIGN_MAGIC[] = {0xFF, 0xFF, 0xFF, 0xFF}; -static uint8_t set_result_sign() { - cx_ecfp_private_key_t privateKey; - SignContext_t* context = &data_context.sign_context; - cx_err_t error; - BEGIN_TRY { - TRY { - get_private_key(context->account_number, &privateKey); - error = cx_eddsa_sign_no_throw(&privateKey, - CX_SHA512, - context->to_sign, - SIGN_MAGIC_LENGTH + TO_SIGN_LENGTH, - context->signature, - SIGNATURE_LENGTH); - if (error != CX_OK) { - THROW(ERR_SIGNING_FAILED); - } - } - FINALLY { - explicit_bzero(&privateKey, sizeof(privateKey)); - } - } - END_TRY; - - uint8_t tx = 0; - G_io_apdu_buffer[tx++] = SIGNATURE_LENGTH; - memmove(G_io_apdu_buffer + tx, context->signature, SIGNATURE_LENGTH); - tx += SIGNATURE_LENGTH; - return tx; -} - -UX_STEP_NOCB(ux_sign_flow_1_step, - pnn, - { - &C_icon_certificate, - "Sign", - "message", - }); -UX_STEP_NOCB(ux_sign_flow_2_step, - bnnn_paging, - { - .title = "Message", - .text = data_context.sign_context.to_sign_str, - }); -UX_STEP_CB(ux_sign_flow_3_step, - pbb, - send_response(0, false), - { - &C_icon_crossmark, - "Cancel", - "signature", - }); -UX_STEP_CB(ux_sign_flow_4_step, - pbb, - send_response(set_result_sign(), true), - { - &C_icon_validate_14, - "Sign", - "message.", - }); - -UX_FLOW(ux_sign_flow, - &ux_sign_flow_1_step, - &ux_sign_flow_2_step, - &ux_sign_flow_3_step, - &ux_sign_flow_4_step); - void handleSign(uint8_t* dataBuffer, __attribute__((unused)) uint16_t dataLength, volatile unsigned int* flags) { @@ -89,6 +24,6 @@ void handleSign(uint8_t* dataBuffer, context->to_sign_str, sizeof(context->to_sign_str)); - ux_flow_init(0, ux_sign_flow, NULL); + ui_display_sign(); *flags |= IO_ASYNCH_REPLY; } diff --git a/src/handler/sign_transaction.c b/src/handler/sign_transaction.c index fe2956c..9a3e15d 100644 --- a/src/handler/sign_transaction.c +++ b/src/handler/sign_transaction.c @@ -4,120 +4,8 @@ #include "byte_stream.h" #include "message.h" #include "contract.h" - -static uint8_t set_result_sign_transaction() { - cx_ecfp_private_key_t privateKey; - SignTransactionContext_t* context = &data_context.sign_tr_context; - cx_err_t error; - - BEGIN_TRY { - TRY { - get_private_key(context->account_number, &privateKey); - if (!context->sign_with_chain_id) { - error = cx_eddsa_sign_no_throw(&privateKey, - CX_SHA512, - context->to_sign, - TO_SIGN_LENGTH, - context->signature, - SIGNATURE_LENGTH); - } else { - error = cx_eddsa_sign_no_throw(&privateKey, - CX_SHA512, - context->to_sign, - CHAIN_ID_LENGTH + TO_SIGN_LENGTH, - context->signature, - SIGNATURE_LENGTH); - } - if (error != CX_OK) { - THROW(ERR_SIGNING_FAILED); - } - } - FINALLY { - explicit_bzero(&privateKey, sizeof(privateKey)); - } - } - END_TRY; - - uint8_t tx = 0; - G_io_apdu_buffer[tx++] = SIGNATURE_LENGTH; - memmove(G_io_apdu_buffer + tx, context->signature, SIGNATURE_LENGTH); - tx += SIGNATURE_LENGTH; - return tx; -} - -UX_STEP_NOCB(ux_sign_transaction_intro, - pnn, - { - &C_icon_eye, - "Review", - "transaction", - }); -UX_STEP_NOCB(ux_sign_transaction_burn, bnnn_paging, {.title = "Action", .text = "Burn"}); -UX_STEP_NOCB(ux_sign_transaction_deploy, bnnn_paging, {.title = "Action", .text = "Deploy"}); -UX_STEP_NOCB(ux_sign_transaction_confirm, bnnn_paging, {.title = "Action", .text = "Confirm"}); -UX_STEP_NOCB(ux_sign_transaction_transfer, bnnn_paging, {.title = "Action", .text = "Transfer"}); -UX_STEP_NOCB(ux_sign_transaction_amount, - bnnn_paging, - { - .title = "Amount", - .text = data_context.sign_tr_context.amount_str, - }); -UX_STEP_NOCB(ux_sign_transaction_address, - bnnn_paging, - { - .title = "Address", - .text = data_context.sign_tr_context.address_str, - }); -UX_STEP_NOCB(ux_sign_transaction_transaction_id, - bnnn_paging, - { - .title = "Transaction id", - .text = data_context.sign_tr_context.transaction_id_str, - }); -UX_STEP_CB(ux_sign_transaction_accept, - pbb, - send_response(set_result_sign_transaction(), true), - { - &C_icon_validate_14, - "Accept", - "and send", - }); -UX_STEP_CB(ux_sign_transaction_reject, - pb, - send_response(0, false), - { - &C_icon_crossmark, - "Reject", - }); - -UX_FLOW(ux_sign_transaction_burn_flow, - &ux_sign_transaction_intro, - &ux_sign_transaction_burn, - &ux_sign_transaction_amount, - &ux_sign_transaction_accept, - &ux_sign_transaction_reject); - -UX_FLOW(ux_sign_transaction_deploy_flow, - &ux_sign_transaction_intro, - &ux_sign_transaction_deploy, - &ux_sign_transaction_address, - &ux_sign_transaction_accept, - &ux_sign_transaction_reject); - -UX_FLOW(ux_sign_transaction_confirm_flow, - &ux_sign_transaction_intro, - &ux_sign_transaction_confirm, - &ux_sign_transaction_transaction_id, - &ux_sign_transaction_accept, - &ux_sign_transaction_reject); - -UX_FLOW(ux_sign_transaction_transfer_flow, - &ux_sign_transaction_intro, - &ux_sign_transaction_transfer, - &ux_sign_transaction_amount, - &ux_sign_transaction_address, - &ux_sign_transaction_accept, - &ux_sign_transaction_reject); +#include "response_setter.h" +#include "ui/display.h" void handleSignTransaction(uint8_t* dataBuffer, uint16_t dataLength, @@ -225,22 +113,7 @@ void handleSignTransaction(uint8_t* dataBuffer, int flow = prepare_to_sign(&src, context->wc, context->address, context->prepend_address); - switch (flow) { - case SIGN_TRANSACTION_FLOW_TRANSFER: - ux_flow_init(0, ux_sign_transaction_transfer_flow, NULL); - break; - case SIGN_TRANSACTION_FLOW_DEPLOY: - ux_flow_init(0, ux_sign_transaction_deploy_flow, NULL); - break; - case SIGN_TRANSACTION_FLOW_CONFIRM: - ux_flow_init(0, ux_sign_transaction_confirm_flow, NULL); - break; - case SIGN_TRANSACTION_FLOW_BURN: - ux_flow_init(0, ux_sign_transaction_burn_flow, NULL); - break; - default: - THROW(ERR_INVALID_REQUEST); - } + ui_display_sign_transaction(flow); *flags |= IO_ASYNCH_REPLY; } diff --git a/src/main.c b/src/main.c index e6abe1d..0fa7f95 100644 --- a/src/main.c +++ b/src/main.c @@ -248,6 +248,7 @@ void app_main(void) { // return_to_dashboard } +// This does not seem to be used // override point, but nothing more to do void io_seproxyhal_display(const bagl_element_t* element) { io_seproxyhal_display_default((bagl_element_t*) element); @@ -371,7 +372,7 @@ __attribute__((section(".boot"))) int main(void) { USB_power(0); USB_power(1); - ui_idle(); + ui_main_menu(); #ifdef HAVE_BLE BLE_power(0, NULL); diff --git a/src/menu.h b/src/menu.h index e7a5c46..b7d7fe4 100644 --- a/src/menu.h +++ b/src/menu.h @@ -7,6 +7,6 @@ #ifndef _MENU_H_ #define _MENU_H_ -void ui_idle(void); +void ui_main_menu(void); #endif diff --git a/src/response_setter.c b/src/response_setter.c new file mode 100644 index 0000000..403d8f3 --- /dev/null +++ b/src/response_setter.c @@ -0,0 +1,89 @@ +#include "response_setter.h" + +uint8_t set_result_get_address() { + uint8_t tx = 0; + G_io_apdu_buffer[tx++] = ADDRESS_LENGTH; + memmove(G_io_apdu_buffer + tx, data_context.addr_context.address, ADDRESS_LENGTH); + tx += ADDRESS_LENGTH; + reset_app_context(); + return tx; +} + +uint8_t set_result_get_public_key() { + uint8_t tx = 0; + G_io_apdu_buffer[tx++] = PUBLIC_KEY_LENGTH; + memmove(G_io_apdu_buffer + tx, data_context.pk_context.public_key, PUBLIC_KEY_LENGTH); + tx += PUBLIC_KEY_LENGTH; + reset_app_context(); + return tx; +} + +uint8_t set_result_sign_transaction() { + cx_ecfp_private_key_t privateKey; + SignTransactionContext_t* context = &data_context.sign_tr_context; + cx_err_t error; + + BEGIN_TRY { + TRY { + get_private_key(context->account_number, &privateKey); + if (!context->sign_with_chain_id) { + error = cx_eddsa_sign_no_throw(&privateKey, + CX_SHA512, + context->to_sign, + TO_SIGN_LENGTH, + context->signature, + SIGNATURE_LENGTH); + } else { + error = cx_eddsa_sign_no_throw(&privateKey, + CX_SHA512, + context->to_sign, + CHAIN_ID_LENGTH + TO_SIGN_LENGTH, + context->signature, + SIGNATURE_LENGTH); + } + if (error != CX_OK) { + THROW(ERR_SIGNING_FAILED); + } + } + FINALLY { + explicit_bzero(&privateKey, sizeof(privateKey)); + } + } + END_TRY; + + uint8_t tx = 0; + G_io_apdu_buffer[tx++] = SIGNATURE_LENGTH; + memmove(G_io_apdu_buffer + tx, context->signature, SIGNATURE_LENGTH); + tx += SIGNATURE_LENGTH; + return tx; +} + +uint8_t set_result_sign() { + cx_ecfp_private_key_t privateKey; + SignContext_t* context = &data_context.sign_context; + cx_err_t error; + BEGIN_TRY { + TRY { + get_private_key(context->account_number, &privateKey); + error = cx_eddsa_sign_no_throw(&privateKey, + CX_SHA512, + context->to_sign, + SIGN_MAGIC_LENGTH + TO_SIGN_LENGTH, + context->signature, + SIGNATURE_LENGTH); + if (error != CX_OK) { + THROW(ERR_SIGNING_FAILED); + } + } + FINALLY { + explicit_bzero(&privateKey, sizeof(privateKey)); + } + } + END_TRY; + + uint8_t tx = 0; + G_io_apdu_buffer[tx++] = SIGNATURE_LENGTH; + memmove(G_io_apdu_buffer + tx, context->signature, SIGNATURE_LENGTH); + tx += SIGNATURE_LENGTH; + return tx; +} diff --git a/src/response_setter.h b/src/response_setter.h new file mode 100644 index 0000000..7ef7c5d --- /dev/null +++ b/src/response_setter.h @@ -0,0 +1,8 @@ +#pragma once +#include "globals.h" +#include "utils.h" + +uint8_t set_result_get_address(); +uint8_t set_result_get_public_key(); +uint8_t set_result_sign_transaction(); +uint8_t set_result_sign(); diff --git a/src/ui/display.h b/src/ui/display.h new file mode 100644 index 0000000..f60d3c1 --- /dev/null +++ b/src/ui/display.h @@ -0,0 +1,6 @@ +#pragma once + +void ui_display_address(); +void ui_display_public_key(); +void ui_display_sign_transaction(int flow); +void ui_display_sign(); diff --git a/src/ui/display_bagl.c b/src/ui/display_bagl.c new file mode 100644 index 0000000..f1b3606 --- /dev/null +++ b/src/ui/display_bagl.c @@ -0,0 +1,207 @@ +#ifdef HAVE_BAGL +#include "display.h" +#include "response_setter.h" +#include "contract.h" +// Screens and flows +UX_STEP_NOCB(ux_display_address_flow_1_step, + pnn, + { + &C_icon_eye, + "Verify", + "address", + }); +UX_STEP_NOCB(ux_display_address_flow_2_step, + bnnn_paging, + { + .title = "Address", + .text = data_context.addr_context.address_str, + }); +UX_STEP_CB(ux_display_address_flow_3_step, + pb, + send_response(0, false), + { + &C_icon_crossmark, + "Reject", + }); +UX_STEP_CB(ux_display_address_flow_4_step, + pb, + send_response(set_result_get_address(), true), + { + &C_icon_validate_14, + "Approve", + }); + +UX_FLOW(ux_display_address_flow, + &ux_display_address_flow_1_step, + &ux_display_address_flow_2_step, + &ux_display_address_flow_3_step, + &ux_display_address_flow_4_step); + +UX_STEP_NOCB(ux_display_public_flow_1_step, + bnnn_paging, + { + .title = "Public key", + .text = data_context.pk_context.public_key_str, + }); +UX_STEP_CB(ux_display_public_flow_2_step, + pb, + send_response(0, false), + { + &C_icon_crossmark, + "Reject", + }); +UX_STEP_CB(ux_display_public_flow_3_step, + pb, + send_response(set_result_get_public_key(), true), + { + &C_icon_validate_14, + "Approve", + }); + +UX_FLOW(ux_display_public_flow, + &ux_display_public_flow_1_step, + &ux_display_public_flow_2_step, + &ux_display_public_flow_3_step); + +UX_STEP_NOCB(ux_sign_flow_1_step, + pnn, + { + &C_icon_certificate, + "Sign", + "message", + }); +UX_STEP_NOCB(ux_sign_flow_2_step, + bnnn_paging, + { + .title = "Message", + .text = data_context.sign_context.to_sign_str, + }); +UX_STEP_CB(ux_sign_flow_3_step, + pbb, + send_response(0, false), + { + &C_icon_crossmark, + "Cancel", + "signature", + }); +UX_STEP_CB(ux_sign_flow_4_step, + pbb, + send_response(set_result_sign(), true), + { + &C_icon_validate_14, + "Sign", + "message.", + }); + +UX_FLOW(ux_sign_flow, + &ux_sign_flow_1_step, + &ux_sign_flow_2_step, + &ux_sign_flow_3_step, + &ux_sign_flow_4_step); + +UX_STEP_NOCB(ux_sign_transaction_intro, + pnn, + { + &C_icon_eye, + "Review", + "transaction", + }); +UX_STEP_NOCB(ux_sign_transaction_burn, bnnn_paging, {.title = "Action", .text = "Burn"}); +UX_STEP_NOCB(ux_sign_transaction_deploy, bnnn_paging, {.title = "Action", .text = "Deploy"}); +UX_STEP_NOCB(ux_sign_transaction_confirm, bnnn_paging, {.title = "Action", .text = "Confirm"}); +UX_STEP_NOCB(ux_sign_transaction_transfer, bnnn_paging, {.title = "Action", .text = "Transfer"}); +UX_STEP_NOCB(ux_sign_transaction_amount, + bnnn_paging, + { + .title = "Amount", + .text = data_context.sign_tr_context.amount_str, + }); +UX_STEP_NOCB(ux_sign_transaction_address, + bnnn_paging, + { + .title = "Address", + .text = data_context.sign_tr_context.address_str, + }); +UX_STEP_NOCB(ux_sign_transaction_transaction_id, + bnnn_paging, + { + .title = "Transaction id", + .text = data_context.sign_tr_context.transaction_id_str, + }); +UX_STEP_CB(ux_sign_transaction_accept, + pbb, + send_response(set_result_sign_transaction(), true), + { + &C_icon_validate_14, + "Accept", + "and send", + }); +UX_STEP_CB(ux_sign_transaction_reject, + pb, + send_response(0, false), + { + &C_icon_crossmark, + "Reject", + }); + +UX_FLOW(ux_sign_transaction_burn_flow, + &ux_sign_transaction_intro, + &ux_sign_transaction_burn, + &ux_sign_transaction_amount, + &ux_sign_transaction_accept, + &ux_sign_transaction_reject); + +UX_FLOW(ux_sign_transaction_deploy_flow, + &ux_sign_transaction_intro, + &ux_sign_transaction_deploy, + &ux_sign_transaction_address, + &ux_sign_transaction_accept, + &ux_sign_transaction_reject); + +UX_FLOW(ux_sign_transaction_confirm_flow, + &ux_sign_transaction_intro, + &ux_sign_transaction_confirm, + &ux_sign_transaction_transaction_id, + &ux_sign_transaction_accept, + &ux_sign_transaction_reject); + +UX_FLOW(ux_sign_transaction_transfer_flow, + &ux_sign_transaction_intro, + &ux_sign_transaction_transfer, + &ux_sign_transaction_amount, + &ux_sign_transaction_address, + &ux_sign_transaction_accept, + &ux_sign_transaction_reject); + +// Display functions +void ui_display_address() { + ux_flow_init(0, ux_display_address_flow, NULL); +} + +void ui_display_public_key() { + ux_flow_init(0, ux_display_public_flow, NULL); +} + +void ui_display_sign() { + ux_flow_init(0, ux_sign_flow, NULL); +} + +void ui_display_sign_transaction(int flow) { + switch (flow) { + case SIGN_TRANSACTION_FLOW_TRANSFER: + ux_flow_init(0, ux_sign_transaction_transfer_flow, NULL); + break; + case SIGN_TRANSACTION_FLOW_DEPLOY: + ux_flow_init(0, ux_sign_transaction_deploy_flow, NULL); + break; + case SIGN_TRANSACTION_FLOW_CONFIRM: + ux_flow_init(0, ux_sign_transaction_confirm_flow, NULL); + break; + case SIGN_TRANSACTION_FLOW_BURN: + ux_flow_init(0, ux_sign_transaction_burn_flow, NULL); + break; + default: + THROW(ERR_INVALID_REQUEST); + } +} +#endif \ No newline at end of file diff --git a/src/ui/display_nbgl.c b/src/ui/display_nbgl.c new file mode 100644 index 0000000..7d29b1d --- /dev/null +++ b/src/ui/display_nbgl.c @@ -0,0 +1,35 @@ +#ifdef HAVE_NBGL +#include "display.h" +#include "response_setter.h" +#include "contract.h" + +// TODO: Implement this +void ui_display_address() { +} + +// TODO: Implement this +void ui_display_public_key() { +} + +// TODO: Implement this +void ui_display_sign_transaction(int flow) { + switch (flow) { + case SIGN_TRANSACTION_FLOW_TRANSFER: + break; + case SIGN_TRANSACTION_FLOW_DEPLOY: + break; + case SIGN_TRANSACTION_FLOW_CONFIRM: + break; + case SIGN_TRANSACTION_FLOW_BURN: + break; + default: + THROW(ERR_INVALID_REQUEST); + break; + } +} + +// TODO: Implement this +void ui_display_sign() { +} + +#endif \ No newline at end of file diff --git a/src/ui/menu.h b/src/ui/menu.h new file mode 100644 index 0000000..2588cce --- /dev/null +++ b/src/ui/menu.h @@ -0,0 +1,8 @@ +#include "globals.h" +#include "glyphs.h" + +#pragma once + +void ui_main_menu(void); + +void ui_about_menu(void); diff --git a/src/menu.c b/src/ui/menu_bagl.c similarity index 90% rename from src/menu.c rename to src/ui/menu_bagl.c index 29b5499..e33faa7 100644 --- a/src/menu.c +++ b/src/ui/menu_bagl.c @@ -1,3 +1,4 @@ +#ifdef HAVE_BAGL #include "menu.h" #include "os.h" @@ -23,10 +24,11 @@ UX_STEP_VALID(ux_idle_flow_4_step, }); UX_FLOW(ux_idle_flow, &ux_idle_flow_1_step, &ux_idle_flow_3_step, &ux_idle_flow_4_step, FLOW_LOOP); -void ui_idle(void) { +void ui_main_menu(void) { // reserve a display stack slot if none yet if (G_ux.stack_count == 0) { ux_stack_push(); } ux_flow_init(0, ux_idle_flow, NULL); } +#endif diff --git a/src/ui/menu_nbgl.c b/src/ui/menu_nbgl.c new file mode 100644 index 0000000..d569931 --- /dev/null +++ b/src/ui/menu_nbgl.c @@ -0,0 +1,40 @@ +#ifdef HAVE_NBGL + +#include "menu.h" +#include "os.h" + +// ----------------------------------------------------------- +// --------------------- SETTINGS MENU ----------------------- +// ----------------------------------------------------------- +#define SETTING_INFO_NB 2 +static const char* const INFO_TYPES[SETTING_INFO_NB] = {"Version", "Developer"}; +static const char* const INFO_CONTENTS[SETTING_INFO_NB] = {APPVERSION, "Blooo"}; +static const nbgl_contentInfoList_t infoList = { + .nbInfos = SETTING_INFO_NB, + .infoTypes = INFO_TYPES, + .infoContents = INFO_CONTENTS, +}; + +// ----------------------------------------------------------- +// ----------------------- HOME PAGE ------------------------- +// ----------------------------------------------------------- + +void ui_main_menu(void) { + tx_state->currentInstruction = -1; + + nbgl_useCaseHomeAndSettings(APPNAME, + &C_app_everscale_64px, + NULL, + INIT_HOME_PAGE, + NULL, + &infoList, + NULL, + app_quit); +} + +void app_quit(void) { + // exit app here + os_sched_exit(-1); +} + +#endif \ No newline at end of file diff --git a/src/utils.c b/src/utils.c index 761730a..1e8e46d 100644 --- a/src/utils.c +++ b/src/utils.c @@ -86,7 +86,7 @@ void send_response(uint8_t tx, bool approve) { // Send back the response, do not restart the event loop io_exchange(CHANNEL_APDU | IO_RETURN_AFTER_TX, tx); // Display back the original UX - ui_idle(); + ui_main_menu(); } unsigned int ui_prepro(const bagl_element_t* element) { From c3efedb5c7eedf0f3d024572a4fabfe1c7ec7b58 Mon Sep 17 00:00:00 2001 From: keiff3r Date: Tue, 18 Feb 2025 12:23:45 +0100 Subject: [PATCH 25/67] refactor: update Makefile and main application structure This commit introduces several significant changes: - Modernized Makefile with clearer configuration sections - Updated application icons for different Ledger devices - Simplified main application logic - Removed unused global variables and functions - Added new dispatcher and handler infrastructure - Prepared for more modular APDU command handling --- Makefile | 254 ++++------ icons/app_boilerplate_14px.gif | Bin 0 -> 70 bytes icons/app_boilerplate_16px.gif | Bin 0 -> 66 bytes icons/app_boilerplate_32px.gif | Bin 0 -> 116 bytes icons/app_boilerplate_40px.gif | Bin 0 -> 497 bytes src/apdu/dispatcher.c | 84 ++++ src/apdu/dispatcher.h | 3 + src/apdu_constants.h | 25 +- src/errors.h | 4 + src/globals.c | 16 +- src/handler/get_address.h | 22 + src/handler/get_app_configuration.c | 34 +- src/handler/get_app_configuration.h | 3 + src/handler/get_public_key.h | 22 + src/handler/sign.h | 16 + src/handler/sign_transaction.h | 18 + src/main.c | 731 +++++++++++++++------------- src/menu.h | 12 - src/ui/menu.h | 4 +- src/utils.c | 40 +- 20 files changed, 702 insertions(+), 586 deletions(-) create mode 100644 icons/app_boilerplate_14px.gif create mode 100644 icons/app_boilerplate_16px.gif create mode 100644 icons/app_boilerplate_32px.gif create mode 100644 icons/app_boilerplate_40px.gif create mode 100644 src/apdu/dispatcher.c create mode 100644 src/apdu/dispatcher.h create mode 100644 src/handler/get_address.h create mode 100644 src/handler/get_app_configuration.h create mode 100644 src/handler/get_public_key.h create mode 100644 src/handler/sign.h create mode 100644 src/handler/sign_transaction.h delete mode 100644 src/menu.h diff --git a/Makefile b/Makefile index dd52698..b28a83a 100644 --- a/Makefile +++ b/Makefile @@ -1,176 +1,110 @@ -#******************************************************************************* -# Ledger App -# (c) 2017 Ledger +# **************************************************************************** +# Ledger App Everscale +# (c) 2023 Ledger SAS. # -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at # -# http://www.apache.org/licenses/LICENSE-2.0 +# http://www.apache.org/licenses/LICENSE-2.0 # -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -#******************************************************************************* +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# **************************************************************************** ifeq ($(BOLOS_SDK),) $(error Environment variable BOLOS_SDK is not set) endif -include $(BOLOS_SDK)/Makefile.defines - -APP_LOAD_PARAMS = --curve ed25519 -ifeq ($(TARGET_NAME), TARGET_NANOX) - APP_LOAD_PARAMS += --appFlags 0x200 # APPLICATION_FLAG_BOLOS_SETTINGS -else - APP_LOAD_PARAMS += --appFlags 0x000 -endif -APP_LOAD_PARAMS += $(COMMON_LOAD_PARAMS) -# Pending review parameters -# APP_LOAD_PARAMS += --tlvraw 9F:01 -# DEFINES += HAVE_PENDING_REVIEW_SCREEN +include $(BOLOS_SDK)/Makefile.defines -################## -# Define Version # -################## +######################################## +# Mandatory configuration # +######################################## +# Application name +APPNAME = "Everscale" +# Application version APPVERSION_M = 1 APPVERSION_N = 0 APPVERSION_P = 10 -APPVERSION = "$(APPVERSION_M).$(APPVERSION_N).$(APPVERSION_P)" - -########################### -# Set Chain environment # -########################### - -ifeq ($(CHAIN),) -CHAIN=everscale -endif - -SUPPORTED_CHAINS=$(shell find makefile_conf/chain/ -type f -name '*.mk'| sed 's/.*\/\(.*\).mk/\1/g' | sort) - -# Check if chain is available -ifeq ($(shell test -s ./makefile_conf/chain/$(CHAIN).mk && echo -n yes), yes) -include ./makefile_conf/chain/$(CHAIN).mk -else -$(error Unsupported CHAIN - use $(SUPPORTED_CHAINS)) -endif - -######### -# Other # -######### - -#prepare hsm generation -ifeq ($(TARGET_NAME),TARGET_NANOS) -ICONNAME=icons/nanos_app_$(CHAIN).gif -else -ICONNAME=icons/nanox_app_$(CHAIN).gif -endif - -################ -# Default rule # -################ -all: default - -DEFINES += $(DEFINES_LIB) -DEFINES += APPNAME=\"$(APPNAME)\" -DEFINES += APPVERSION=\"$(APPVERSION)\" -DEFINES += LEDGER_MAJOR_VERSION=$(APPVERSION_M) LEDGER_MINOR_VERSION=$(APPVERSION_N) LEDGER_PATCH_VERSION=$(APPVERSION_P) -DEFINES += OS_IO_SEPROXYHAL -DEFINES += HAVE_BAGL HAVE_UX_FLOW HAVE_SPRINTF -DEFINES += HAVE_IO_USB HAVE_L4_USBLIB IO_USB_MAX_ENDPOINTS=6 IO_HID_EP_LENGTH=64 HAVE_USB_APDU -DEFINES += USB_SEGMENT_SIZE=64 -DEFINES += BLE_SEGMENT_SIZE=32 -DEFINES += HAVE_WEBUSB WEBUSB_URL_SIZE_B=0 WEBUSB_URL="" -DEFINES += UNUSED\(x\)=\(void\)x - -ifeq ($(TARGET_NAME),TARGET_NANOX) - DEFINES += HAVE_BLE BLE_COMMAND_TIMEOUT_MS=2000 HAVE_BLE_APDU -endif - -ifeq ($(TARGET_NAME),TARGET_NANOS) - DEFINES += IO_SEPROXYHAL_BUFFER_SIZE_B=128 -else - DEFINES += IO_SEPROXYHAL_BUFFER_SIZE_B=300 - DEFINES += HAVE_GLO096 - DEFINES += BAGL_WIDTH=128 BAGL_HEIGHT=64 - DEFINES += HAVE_BAGL_ELLIPSIS - DEFINES += HAVE_BAGL_FONT_OPEN_SANS_REGULAR_11PX - DEFINES += HAVE_BAGL_FONT_OPEN_SANS_EXTRABOLD_11PX - DEFINES += HAVE_BAGL_FONT_OPEN_SANS_LIGHT_16PX -endif - -DEBUG = 0 -ifneq ($(DEBUG),0) - DEFINES += HAVE_PRINTF - ifeq ($(TARGET_NAME),TARGET_NANOS) - DEFINES += PRINTF=screen_printf - else - DEFINES += PRINTF=mcu_usb_printf - endif -else - DEFINES += PRINTF\(...\)= -endif - -############## -# Compiler # -############## -ifneq ($(BOLOS_ENV),) -$(info BOLOS_ENV=$(BOLOS_ENV)) -CLANGPATH := $(BOLOS_ENV)/clang-arm-fropi/bin/ -GCCPATH := $(BOLOS_ENV)/gcc-arm-none-eabi-5_3-2016q1/bin/ -else -$(info BOLOS_ENV is not set: falling back to CLANGPATH and GCCPATH) -endif -ifeq ($(CLANGPATH),) -$(info CLANGPATH is not set: clang will be used from PATH) -endif -ifeq ($(GCCPATH),) -$(info GCCPATH is not set: arm-none-eabi-* will be used from PATH) -endif - -CC := $(CLANGPATH)clang -CFLAGS += -O3 -Os -AS := $(GCCPATH)arm-none-eabi-gcc -LD := $(GCCPATH)arm-none-eabi-gcc -LDFLAGS += -O3 -Os -LDLIBS += -lm -lgcc -lc - -# import rules to compile glyphs(/pone) -include $(BOLOS_SDK)/Makefile.glyphs +APPVERSION = "$(APPVERSION_M).$(APPVERSION_N).$(APPVERSION_P)" -### variables processed by the common makefile.rules of the SDK to grab source files and include dirs +# Application source files APP_SOURCE_PATH += src -SDK_SOURCE_PATH += lib_stusb lib_stusb_impl lib_ux - -ifeq ($(TARGET_NAME),TARGET_NANOX) - SDK_SOURCE_PATH += lib_blewbxx lib_blewbxx_impl -endif - -WITH_U2F=0 -ifneq ($(WITH_U2F),0) - DEFINES += HAVE_U2F HAVE_IO_U2F - DEFINES += U2F_PROXY_MAGIC=\"~$(COIN)\" - SDK_SOURCE_PATH += lib_u2f -endif - -load: all load-only -load-only: - python3 -m ledgerblue.loadApp $(APP_LOAD_PARAMS) - -load-offline: all - python3 -m ledgerblue.loadApp $(APP_LOAD_PARAMS) --offline - -delete: - python3 -m ledgerblue.deleteApp $(COMMON_DELETE_PARAMS) - -# import generic rules from the sdk -include $(BOLOS_SDK)/Makefile.rules - -#add dependency on custom makefile filename -dep/%.d: %.c Makefile -listvariants: - @echo VARIANTS CHAIN $(SUPPORTED_CHAINS) +# Application icons following guidelines: +# https://developers.ledger.com/docs/embedded-app/design-requirements/#device-icon +ICON_NANOX = icons/app_boilerplate_14px.gif +ICON_NANOSP = icons/app_boilerplate_14px.gif +ICON_STAX = icons/app_boilerplate_32px.gif +ICON_FLEX = icons/app_boilerplate_40px.gif + +# Application allowed derivation curves. +# Possibles curves are: secp256k1, secp256r1, ed25519 and bls12381g1 +# If your app needs it, you can specify multiple curves by using: +# `CURVE_APP_LOAD_PARAMS = ` +CURVE_APP_LOAD_PARAMS = ed25519 + +# Application allowed derivation paths. +# You should request a specific path for your app. +# This serve as an isolation mechanism. +# Most application will have to request a path according to the BIP-0044 +# and SLIP-0044 standards. +# If your app needs it, you can specify multiple path by using: +# `PATH_APP_LOAD_PARAMS = "44'/1'" "45'/1'"` +PATH_APP_LOAD_PARAMS = "44'/396'" # purpose=coin(44) / coin_type=Testnet(1) + +# Setting to allow building variant applications +# - is the name of the parameter which should be set +# to specify the variant that should be build. +# - a list of variant that can be build using this app code. +# * It must at least contains one value. +# * Values can be the app ticker or anything else but should be unique. +VARIANT_PARAM = COIN +VARIANT_VALUES = EVER + +# Enabling DEBUG flag will enable PRINTF and disable optimizations +DEBUG = 1 + +######################################## +# Application custom permissions # +######################################## +# See SDK `include/appflags.h` for the purpose of each permission +#HAVE_APPLICATION_FLAG_DERIVE_MASTER = 1 +#HAVE_APPLICATION_FLAG_GLOBAL_PIN = 1 +#HAVE_APPLICATION_FLAG_BOLOS_SETTINGS = 1 +#HAVE_APPLICATION_FLAG_LIBRARY = 1 + +######################################## +# Application communication interfaces # +######################################## +ENABLE_BLUETOOTH = 1 +#ENABLE_NFC = 1 +# ENABLE_NBGL_FOR_NANO_DEVICES = 1 + +######################################## +# NBGL custom features # +######################################## +ENABLE_NBGL_QRCODE = 1 +#ENABLE_NBGL_KEYBOARD = 1 +#ENABLE_NBGL_KEYPAD = 1 + +######################################## +# Features disablers # +######################################## +# These advanced settings allow to disable some feature that are by +# default enabled in the SDK `Makefile.standard_app`. +#DISABLE_STANDARD_APP_FILES = 1 +#DISABLE_DEFAULT_IO_SEPROXY_BUFFER_SIZE = 1 # To allow custom size declaration +#DISABLE_STANDARD_APP_DEFINES = 1 # Will set all the following disablers +#DISABLE_STANDARD_SNPRINTF = 1 +#DISABLE_STANDARD_USB = 1 +#DISABLE_STANDARD_WEBUSB = 1 +#DISABLE_DEBUG_LEDGER_ASSERT = 1 +#DISABLE_DEBUG_THROW = 1 + +include $(BOLOS_SDK)/Makefile.standard_app \ No newline at end of file diff --git a/icons/app_boilerplate_14px.gif b/icons/app_boilerplate_14px.gif new file mode 100644 index 0000000000000000000000000000000000000000..7dedb19784df83ce976bd5aef8a768e942754aa8 GIT binary patch literal 70 zcmZ?wbhEHbOuKIUBc02Qn~N0|4sJF$(|y literal 0 HcmV?d00001 diff --git a/icons/app_boilerplate_40px.gif b/icons/app_boilerplate_40px.gif new file mode 100644 index 0000000000000000000000000000000000000000..497acdda52f82624832e11a552902670058f11a4 GIT binary patch literal 497 zcmZ?wbhEHb)L_tH_{_rq1gxyATwGjYVq*IG`Z+l{^XARFbm`KoSFb*Q{`~9Lum4~G zQU?Z#KUpC3e{Rp*#Pn3(#PrPMY`*lw+}uQ413eQ{5M*>8#V(SQ<;1r_Go-l~q%Pqqu}|#oRRkZheiZ-YzUTtC9jXtlb&dWSdrLu>0`g z0%o*^EpO|59beCNkm1&S_iqE=c<)wNsE5*`hBZISw z#|_Vh#w^+Xj@=gdj*T59911rY7C5XANpot-Q1MuHl=lzI*@TykCsr$~+m;v_IGoul zkg?%|*QT@0ri^ORUcVcP92i;b?e};DG^p6*S&1 +#include +#include "parser.h" + +#include "buffer.h" +#include "io.h" +#include "ledger_assert.h" +#include "apdu_constants.h" +#include "dispatcher.h" +#include "globals.h" +#include "handler/get_app_configuration.h" +#include "handler/get_public_key.h" +#include "handler/sign_transaction.h" + +int apdu_dispatcher(const command_t* cmd, volatile unsigned int* flags) { + LEDGER_ASSERT(cmd != NULL, "NULL cmd"); + + if (cmd->cla != CLA) { + return io_send_sw(ERR_CLA_NOT_SUPPORTED); + } + + buffer_t buf = {0}; + + switch (cmd->ins) { + case INS_GET_APP_CONFIGURATION: + if (cmd->p1 != 0 || cmd->p2 != 0) { + return io_send_sw(ERR_WRONG_P1P2); + } + if (cmd->lc != 0) { + return io_send_sw(ERR_WRONG_DATA_LENGTH); + } + + return handleGetAppConfiguration(); + // case INS_GET_PUBLIC_KEY: + // if (cmd->p1 > 1 || cmd->p2 > 0) { + // return io_send_sw(SW_WRONG_P1P2); + // } + + // if (!cmd->data) { + // return io_send_sw(SW_WRONG_DATA_LENGTH); + // } + + // buf.ptr = cmd->data; + // buf.size = cmd->lc; + // buf.offset = 0; + + // return handler_get_public_key(&buf, (bool) cmd->p1); + // case SIGN_TX: + // if ((cmd->p1 == P1_START && cmd->p2 != P2_MORE) || // + // cmd->p1 > P1_MAX || // + // (cmd->p2 != P2_LAST && cmd->p2 != P2_MORE)) { + // return io_send_sw(SW_WRONG_P1P2); + // } + + // if (!cmd->data) { + // return io_send_sw(SW_WRONG_DATA_LENGTH); + // } + + // buf.ptr = cmd->data; + // buf.size = cmd->lc; + // buf.offset = 0; + + // return handler_sign_tx(&buf, cmd->p1, (bool) (cmd->p2 & P2_MORE)); + default: + return io_send_sw(ERR_INS_NOT_SUPPORTED); + } +} diff --git a/src/apdu/dispatcher.h b/src/apdu/dispatcher.h new file mode 100644 index 0000000..34e0841 --- /dev/null +++ b/src/apdu/dispatcher.h @@ -0,0 +1,3 @@ +#pragma once + +int apdu_dispatcher(const command_t* cmd, volatile unsigned int* flags); diff --git a/src/apdu_constants.h b/src/apdu_constants.h index c834f93..99f5f94 100644 --- a/src/apdu_constants.h +++ b/src/apdu_constants.h @@ -23,29 +23,6 @@ #define OFFSET_LC 4 #define OFFSET_CDATA 5 -void handleGetAppConfiguration(uint8_t p1, - uint8_t p2, - uint8_t* dataBuffer, - uint16_t dataLength, - volatile unsigned int* flags, - volatile unsigned int* tx); -void handleGetPublicKey(uint8_t p1, - uint8_t p2, - uint8_t* dataBuffer, - uint16_t dataLength, - volatile unsigned int* flags, - volatile unsigned int* tx); -void handleGetAddress(uint8_t p1, - uint8_t p2, - uint8_t* dataBuffer, - uint16_t dataLength, - volatile unsigned int* flags, - volatile unsigned int* tx); -void handleSign(uint8_t* dataBuffer, uint16_t dataLength, volatile unsigned int* flags); -void handleSignTransaction(uint8_t* dataBuffer, - uint16_t dataLength, - volatile unsigned int* flags, - bool is_first_chunk, - bool more); +#define APPVERSION_LEN 3 #endif diff --git a/src/errors.h b/src/errors.h index c4dc81c..e05f13c 100644 --- a/src/errors.h +++ b/src/errors.h @@ -27,6 +27,10 @@ enum { ERR_GENERATE_PAIR_FAILED = 0x6B21, ERR_INIT_PRIVATE_KEY_FAILED = 0x6B22, ERR_DERIVE_PATH_FAILED = 0x6B23, + ERR_WRONG_DATA_LENGTH = 0x6B24, + ERR_CLA_NOT_SUPPORTED = 0x6B25, + ERR_WRONG_P1P2 = 0x6B26, + ERR_INS_NOT_SUPPORTED = 0x6B27, }; #endif diff --git a/src/globals.c b/src/globals.c index e8d7cc0..9d0a7a4 100644 --- a/src/globals.c +++ b/src/globals.c @@ -1,10 +1,10 @@ -#include "globals.h" -#include "os.h" -#include "ux.h" +// #include "globals.h" +// #include "os.h" +// #include "ux.h" -ux_state_t G_ux; -bolos_ux_params_t G_ux_params; +// ux_state_t G_ux; +// bolos_ux_params_t G_ux_params; -// display stepped screens -unsigned int ux_step; -unsigned int ux_step_count; +// // display stepped screens +// unsigned int ux_step; +// unsigned int ux_step_count; diff --git a/src/handler/get_address.h b/src/handler/get_address.h new file mode 100644 index 0000000..4a24cec --- /dev/null +++ b/src/handler/get_address.h @@ -0,0 +1,22 @@ +#ifndef __GET_ADDRESS_H__ +#define __GET_ADDRESS_H__ + +#include + +/** + * Handles the get address command + * @param p1 parameter 1 - confirmation flag (P1_CONFIRM or P1_NON_CONFIRM) + * @param p2 parameter 2 (expected to be 0) + * @param dataBuffer input data buffer + * @param dataLength length of input data + * @param flags pointer to flags + * @param tx pointer to tx + */ +void handleGetAddress(uint8_t p1, + uint8_t p2, + uint8_t* dataBuffer, + uint16_t dataLength, + volatile unsigned int* flags, + volatile unsigned int* tx); + +#endif // __GET_ADDRESS_H__ diff --git a/src/handler/get_app_configuration.c b/src/handler/get_app_configuration.c index 239a393..600a3dd 100644 --- a/src/handler/get_app_configuration.c +++ b/src/handler/get_app_configuration.c @@ -1,20 +1,26 @@ + +#include // uint*_t +#include // UINT8_MAX +#include // _Static_assert + #include "apdu_constants.h" #include "utils.h" #include "errors.h" +#include "io.h" -void handleGetAppConfiguration(uint8_t p1, - uint8_t p2, - uint8_t* dataBuffer, - uint16_t dataLength, - volatile unsigned int* flags, - volatile unsigned int* tx) { - UNUSED(dataBuffer); - UNUSED(flags); - VALIDATE(p1 == 0 && p2 == 0 && dataLength == 0, ERR_INVALID_REQUEST); +int handleGetAppConfiguration() { + _Static_assert(APPVERSION_LEN == 3, "Length of (MAJOR || MINOR || PATCH) must be 3!"); + _Static_assert(MAJOR_VERSION >= 0 && MAJOR_VERSION <= UINT8_MAX, + "MAJOR version must be between 0 and 255!"); + _Static_assert(MINOR_VERSION >= 0 && MINOR_VERSION <= UINT8_MAX, + "MINOR version must be between 0 and 255!"); + _Static_assert(PATCH_VERSION >= 0 && PATCH_VERSION <= UINT8_MAX, + "PATCH version must be between 0 and 255!"); - G_io_apdu_buffer[0] = LEDGER_MAJOR_VERSION; - G_io_apdu_buffer[1] = LEDGER_MINOR_VERSION; - G_io_apdu_buffer[2] = LEDGER_PATCH_VERSION; - *tx = 3; - THROW(SUCCESS); + return io_send_response_pointer( + (const uint8_t*) &(uint8_t[APPVERSION_LEN]){(uint8_t) MAJOR_VERSION, + (uint8_t) MINOR_VERSION, + (uint8_t) PATCH_VERSION}, + APPVERSION_LEN, + SUCCESS); } diff --git a/src/handler/get_app_configuration.h b/src/handler/get_app_configuration.h new file mode 100644 index 0000000..48b05a5 --- /dev/null +++ b/src/handler/get_app_configuration.h @@ -0,0 +1,3 @@ +#pragma once + +int handleGetAppConfiguration(); diff --git a/src/handler/get_public_key.h b/src/handler/get_public_key.h new file mode 100644 index 0000000..e494c81 --- /dev/null +++ b/src/handler/get_public_key.h @@ -0,0 +1,22 @@ +#ifndef __GET_PUBLIC_KEY_H__ +#define __GET_PUBLIC_KEY_H__ + +#include + +/** + * Handles the get public key command + * @param p1 parameter 1 - confirmation flag (P1_CONFIRM or P1_NON_CONFIRM) + * @param p2 parameter 2 (expected to be 0) + * @param dataBuffer input data buffer + * @param dataLength length of input data + * @param flags pointer to flags + * @param tx pointer to tx + */ +void handleGetPublicKey(uint8_t p1, + uint8_t p2, + uint8_t* dataBuffer, + uint16_t dataLength, + volatile unsigned int* flags, + volatile unsigned int* tx); + +#endif // __GET_PUBLIC_KEY_H__ diff --git a/src/handler/sign.h b/src/handler/sign.h new file mode 100644 index 0000000..3826256 --- /dev/null +++ b/src/handler/sign.h @@ -0,0 +1,16 @@ +#ifndef __SIGN_H__ +#define __SIGN_H__ + +#include + +/** + * Handles the sign command + * @param dataBuffer input data buffer + * @param dataLength length of input data + * @param flags pointer to flags + */ +void handleSign(uint8_t* dataBuffer, + uint16_t dataLength, + volatile unsigned int* flags); + +#endif // __SIGN_H__ diff --git a/src/handler/sign_transaction.h b/src/handler/sign_transaction.h new file mode 100644 index 0000000..b26b6d4 --- /dev/null +++ b/src/handler/sign_transaction.h @@ -0,0 +1,18 @@ +#pragma once + +#include +#include + +/** + * Handles the sign transaction command + * @param dataBuffer input data buffer + * @param dataLength length of input data + * @param flags pointer to flags + * @param is_first_chunk indicates if this is the first chunk of data + * @param more indicates if more chunks are expected + */ +void handleSignTransaction(uint8_t* dataBuffer, + uint16_t dataLength, + volatile unsigned int* flags, + bool is_first_chunk, + bool more); diff --git a/src/main.c b/src/main.c index 0fa7f95..a942a2f 100644 --- a/src/main.c +++ b/src/main.c @@ -16,10 +16,14 @@ ********************************************************************************/ #include "utils.h" -#include "menu.h" +#include "io.h" #include "apdu_constants.h" +#include "parser.h" +#include "errors.h" +#include "ui/menu.h" +#include "apdu/dispatcher.h" -unsigned char G_io_seproxyhal_spi_buffer[IO_SEPROXYHAL_BUFFER_SIZE_B]; +// unsigned char G_io_seproxyhal_spi_buffer[IO_SEPROXYHAL_BUFFER_SIZE_B]; BocContext_t boc_context; DataContext_t data_context; @@ -29,165 +33,175 @@ void reset_app_context() { memset(&data_context, 0, sizeof(data_context)); } -void reset_spi_buffer() { - memset(&G_io_seproxyhal_spi_buffer, 0, sizeof(G_io_seproxyhal_spi_buffer)); -} - -void handleApdu(volatile unsigned int* flags, volatile unsigned int* tx, int rx) { - unsigned short sw = 0; - - if (!flags || !tx) { - THROW(0x6802); - } - - if (rx < 0) { - THROW(0x6813); - } - - BEGIN_TRY { - TRY { - if (G_io_apdu_buffer[OFFSET_CLA] != CLA) { - THROW(0x6E00); - } - // must at least hold the class and instruction - if (rx <= OFFSET_INS) { - THROW(0x6b00); - } - PRINTF("command: %d\n", G_io_apdu_buffer[OFFSET_INS]); - switch (G_io_apdu_buffer[OFFSET_INS]) { - case INS_GET_APP_CONFIGURATION: { - if (G_io_apdu_buffer[OFFSET_P1] != 0 || G_io_apdu_buffer[OFFSET_P2] != 0) { - THROW(0x6802); - } - - handleGetAppConfiguration(G_io_apdu_buffer[OFFSET_P1], - G_io_apdu_buffer[OFFSET_P2], - G_io_apdu_buffer + OFFSET_CDATA, - G_io_apdu_buffer[OFFSET_LC], - flags, - tx); - } break; - - case INS_GET_PUBLIC_KEY: { - if (G_io_apdu_buffer[OFFSET_LC] != rx - OFFSET_CDATA) { - // the length of the APDU should match what's in the 5-byte header. - // If not fail. Don't want to buffer overrun or anything. - THROW(0x6985); - } - - handleGetPublicKey(G_io_apdu_buffer[OFFSET_P1], - G_io_apdu_buffer[OFFSET_P2], - G_io_apdu_buffer + OFFSET_CDATA, - G_io_apdu_buffer[OFFSET_LC], - flags, - tx); - } break; - - case INS_GET_ADDRESS: { - if (G_io_apdu_buffer[OFFSET_LC] != rx - OFFSET_CDATA) { - // the length of the APDU should match what's in the 5-byte header. - // If not fail. Don't want to buffer overrun or anything. - THROW(0x6985); - } - - handleGetAddress(G_io_apdu_buffer[OFFSET_P1], - G_io_apdu_buffer[OFFSET_P2], - G_io_apdu_buffer + OFFSET_CDATA, - G_io_apdu_buffer[OFFSET_LC], - flags, - tx); - } break; - - case INS_SIGN: { - if (G_io_apdu_buffer[OFFSET_P1] != P1_CONFIRM || - G_io_apdu_buffer[OFFSET_P2] != 0) { - THROW(0x6802); - } - - if (G_io_apdu_buffer[OFFSET_LC] != rx - OFFSET_CDATA) { - // the length of the APDU should match what's in the 5-byte header. - // If not fail. Don't want to buffer overrun or anything. - THROW(0x6985); - } - - handleSign(G_io_apdu_buffer + OFFSET_CDATA, G_io_apdu_buffer[OFFSET_LC], flags); - } break; - - case INS_SIGN_TRANSACTION: { - if (G_io_apdu_buffer[OFFSET_LC] != rx - OFFSET_CDATA) { - // the length of the APDU should match what's in the 5-byte header. - // If not fail. Don't want to buffer overrun or anything. - THROW(0x6985); - } - - uint8_t p1 = G_io_apdu_buffer[OFFSET_P1]; - if (p1 == P1_NON_CONFIRM) { - // Don't allow blind signing. - THROW(0x6808); - } - - uint8_t p2 = G_io_apdu_buffer[OFFSET_P2]; - bool more = (bool) (p2 & P2_MORE); - - // P2_MORE is a signal for more apdu to receive in current chunk; - // P2_EXTEND is a signal for extended buffer and can't be in first chunk; - // P2_MORE && !P2_EXTEND = first chunk; - // P2_EXTEND && !P2_MORE = last chunk; - // P2_EXTEND && P2_MORE = ordinary request without chunks; - - // P2_EXTEND is set to signal that this APDU buffer extends, rather - // than replaces, the current message buffer - bool first_data_chunk = !(p2 & P2_EXTEND); - - handleSignTransaction(G_io_apdu_buffer + OFFSET_CDATA, - G_io_apdu_buffer[OFFSET_LC], - flags, - first_data_chunk, - more); - } break; - - default: - THROW(0x6D00); - break; - } - } - CATCH(EXCEPTION_IO_RESET) { - THROW(EXCEPTION_IO_RESET); - } - CATCH_OTHER(e) { - switch (e & 0xF000) { - case 0x6000: - sw = e; - break; - case 0x9000: - // All is well - sw = e; - break; - default: - // Internal error - sw = 0x6800 | (e & 0x7FF); - break; - } - // Unexpected exception => report - G_io_apdu_buffer[*tx] = sw >> 8; - G_io_apdu_buffer[*tx + 1] = sw; - *tx += 2; - } - FINALLY { - } - } - END_TRY; -} +// void reset_spi_buffer() { +// memset(&G_io_seproxyhal_spi_buffer, 0, sizeof(G_io_seproxyhal_spi_buffer)); +// } + +// void handleApdu(volatile unsigned int* flags, volatile unsigned int* tx, int rx) { +// unsigned short sw = 0; + +// if (!flags || !tx) { +// THROW(0x6802); +// } + +// if (rx < 0) { +// THROW(0x6813); +// } + +// BEGIN_TRY { +// TRY { +// if (G_io_apdu_buffer[OFFSET_CLA] != CLA) { +// THROW(0x6E00); +// } +// // must at least hold the class and instruction +// if (rx <= OFFSET_INS) { +// THROW(0x6b00); +// } +// PRINTF("command: %d\n", G_io_apdu_buffer[OFFSET_INS]); +// switch (G_io_apdu_buffer[OFFSET_INS]) { +// case INS_GET_APP_CONFIGURATION: { +// if (G_io_apdu_buffer[OFFSET_P1] != 0 || G_io_apdu_buffer[OFFSET_P2] != 0) { +// THROW(0x6802); +// } + +// handleGetAppConfiguration(G_io_apdu_buffer[OFFSET_P1], +// G_io_apdu_buffer[OFFSET_P2], +// G_io_apdu_buffer + OFFSET_CDATA, +// G_io_apdu_buffer[OFFSET_LC], +// flags, +// tx); +// } break; + +// case INS_GET_PUBLIC_KEY: { +// if (G_io_apdu_buffer[OFFSET_LC] != rx - OFFSET_CDATA) { +// // the length of the APDU should match what's in the 5-byte header. +// // If not fail. Don't want to buffer overrun or anything. +// THROW(0x6985); +// } + +// handleGetPublicKey(G_io_apdu_buffer[OFFSET_P1], +// G_io_apdu_buffer[OFFSET_P2], +// G_io_apdu_buffer + OFFSET_CDATA, +// G_io_apdu_buffer[OFFSET_LC], +// flags, +// tx); +// } break; + +// case INS_GET_ADDRESS: { +// if (G_io_apdu_buffer[OFFSET_LC] != rx - OFFSET_CDATA) { +// // the length of the APDU should match what's in the 5-byte header. +// // If not fail. Don't want to buffer overrun or anything. +// THROW(0x6985); +// } + +// handleGetAddress(G_io_apdu_buffer[OFFSET_P1], +// G_io_apdu_buffer[OFFSET_P2], +// G_io_apdu_buffer + OFFSET_CDATA, +// G_io_apdu_buffer[OFFSET_LC], +// flags, +// tx); +// } break; + +// case INS_SIGN: { +// if (G_io_apdu_buffer[OFFSET_P1] != P1_CONFIRM || +// G_io_apdu_buffer[OFFSET_P2] != 0) { +// THROW(0x6802); +// } + +// if (G_io_apdu_buffer[OFFSET_LC] != rx - OFFSET_CDATA) { +// // the length of the APDU should match what's in the 5-byte header. +// // If not fail. Don't want to buffer overrun or anything. +// THROW(0x6985); +// } + +// handleSign(G_io_apdu_buffer + OFFSET_CDATA, G_io_apdu_buffer[OFFSET_LC], +// flags); +// } break; + +// case INS_SIGN_TRANSACTION: { +// if (G_io_apdu_buffer[OFFSET_LC] != rx - OFFSET_CDATA) { +// // the length of the APDU should match what's in the 5-byte header. +// // If not fail. Don't want to buffer overrun or anything. +// THROW(0x6985); +// } + +// uint8_t p1 = G_io_apdu_buffer[OFFSET_P1]; +// if (p1 == P1_NON_CONFIRM) { +// // Don't allow blind signing. +// THROW(0x6808); +// } + +// uint8_t p2 = G_io_apdu_buffer[OFFSET_P2]; +// bool more = (bool) (p2 & P2_MORE); + +// // P2_MORE is a signal for more apdu to receive in current chunk; +// // P2_EXTEND is a signal for extended buffer and can't be in first chunk; +// // P2_MORE && !P2_EXTEND = first chunk; +// // P2_EXTEND && !P2_MORE = last chunk; +// // P2_EXTEND && P2_MORE = ordinary request without chunks; + +// // P2_EXTEND is set to signal that this APDU buffer extends, rather +// // than replaces, the current message buffer +// bool first_data_chunk = !(p2 & P2_EXTEND); + +// handleSignTransaction(G_io_apdu_buffer + OFFSET_CDATA, +// G_io_apdu_buffer[OFFSET_LC], +// flags, +// first_data_chunk, +// more); +// } break; + +// default: +// THROW(0x6D00); +// break; +// } +// } +// CATCH(EXCEPTION_IO_RESET) { +// THROW(EXCEPTION_IO_RESET); +// } +// CATCH_OTHER(e) { +// switch (e & 0xF000) { +// case 0x6000: +// sw = e; +// break; +// case 0x9000: +// // All is well +// sw = e; +// break; +// default: +// // Internal error +// sw = 0x6800 | (e & 0x7FF); +// break; +// } +// // Unexpected exception => report +// G_io_apdu_buffer[*tx] = sw >> 8; +// G_io_apdu_buffer[*tx + 1] = sw; +// *tx += 2; +// } +// FINALLY { +// } +// } +// END_TRY; +// } void app_main(void) { volatile unsigned int rx = 0; volatile unsigned int tx = 0; volatile unsigned int flags = 0; + // Length of APDU command received in G_io_apdu_buffer + int input_len = 0; + // Structured APDU command + command_t cmd; + + io_init(); + + ui_main_menu(); + // Stores the information about the current command. Some commands expect // multiple APDUs before they become complete and executed. reset_app_context(); - reset_spi_buffer(); + // reset_spi_buffer(); // DESIGN NOTE: the bootloader ignores the way APDU are fetched. The only // goal is to retrieve APDU. @@ -196,203 +210,228 @@ void app_main(void) { // switch event, before the apdu is replied to the bootloader. This avoid // APDU injection faults. for (;;) { - volatile unsigned short sw = 0; - BEGIN_TRY { - TRY { - rx = tx; - tx = 0; // ensure no race in catch_other if io_exchange throws - // an error - rx = io_exchange(CHANNEL_APDU | flags, rx); - flags = 0; - - // no apdu received, well, reset the session, and reset the - // bootloader configuration - if (rx == 0) { - THROW(0x6982); - } - - PRINTF("New APDU received:\n%.*H\n", rx, G_io_apdu_buffer); - - handleApdu(&flags, &tx, rx); - } - CATCH(EXCEPTION_IO_RESET) { - THROW(EXCEPTION_IO_RESET); - } - CATCH_OTHER(e) { - switch (e & 0xF000) { - case 0x6000: - sw = e; - break; - case 0x9000: - // All is well - sw = e; - break; - default: - // Internal error - sw = 0x6800 | (e & 0x7FF); - break; - } - if (e != 0x9000) { - flags &= ~IO_ASYNCH_REPLY; - } - // Unexpected exception => report - G_io_apdu_buffer[tx] = sw >> 8; - G_io_apdu_buffer[tx + 1] = sw; - tx += 2; - } - FINALLY { - } + // Receive command bytes in G_io_apdu_buffer + if ((input_len = io_recv_command()) < 0) { + PRINTF("=> io_recv_command failure\n"); + return; } - END_TRY; - } - // return_to_dashboard -} - -// This does not seem to be used -// override point, but nothing more to do -void io_seproxyhal_display(const bagl_element_t* element) { - io_seproxyhal_display_default((bagl_element_t*) element); -} - -unsigned char io_event(unsigned char channel) { - UNUSED(channel); - - // nothing done with the event, throw an error on the transport layer if - // needed - - // can't have more than one tag in the reply, not supported yet. - switch (G_io_seproxyhal_spi_buffer[0]) { - case SEPROXYHAL_TAG_FINGER_EVENT: - UX_FINGER_EVENT(G_io_seproxyhal_spi_buffer); - break; - - case SEPROXYHAL_TAG_BUTTON_PUSH_EVENT: - UX_BUTTON_PUSH_EVENT(G_io_seproxyhal_spi_buffer); - break; - - case SEPROXYHAL_TAG_STATUS_EVENT: - if (G_io_apdu_media == IO_APDU_MEDIA_USB_HID && - !(U4BE(G_io_seproxyhal_spi_buffer, 3) & - SEPROXYHAL_TAG_STATUS_EVENT_FLAG_USB_POWERED)) { - THROW(EXCEPTION_IO_RESET); - } - // no break is intentional - __attribute__((fallthrough)); - default: - UX_DEFAULT_EVENT(); - break; - - case SEPROXYHAL_TAG_DISPLAY_PROCESSED_EVENT: - UX_DISPLAYED_EVENT({}); - break; - - case SEPROXYHAL_TAG_TICKER_EVENT: - UX_TICKER_EVENT(G_io_seproxyhal_spi_buffer, { -#ifndef TARGET_NANOX - if (UX_ALLOWED) { - if (ux_step_count) { - // prepare next screen - ux_step = (ux_step + 1) % ux_step_count; - // redisplay screen - UX_REDISPLAY(); - } - } -#endif // TARGET_NANOX - }); - break; - } - - // close the event if not done previously (by a display or whatever) - if (!io_seproxyhal_spi_is_status_sent()) { - io_seproxyhal_general_status(); - } - - // command has been processed, DO NOT reset the current APDU transport - return 1; -} - -unsigned short io_exchange_al(unsigned char channel, unsigned short tx_len) { - switch (channel & ~(IO_FLAGS)) { - case CHANNEL_KEYBOARD: - break; - - // multiplexed io exchange over a SPI channel and TLV encapsulated protocol - case CHANNEL_SPI: - if (tx_len) { - io_seproxyhal_spi_send(G_io_apdu_buffer, tx_len); - - if (channel & IO_RESET_AFTER_REPLIED) { - reset(); - } - return 0; // nothing received from the master so far (it's a tx - // transaction) - } else { - return io_seproxyhal_spi_recv(G_io_apdu_buffer, sizeof(G_io_apdu_buffer), 0); - } - - default: - THROW(INVALID_PARAMETER); - } - return 0; -} - -/** - * Exit the application and go back to the dashboard. - */ -void app_exit() { - BEGIN_TRY_L(exit) { - TRY_L(exit) { - os_sched_exit(-1); + // Parse APDU command from G_io_apdu_buffer + if (!apdu_parser(&cmd, G_io_apdu_buffer, input_len)) { + PRINTF("=> /!\\ BAD LENGTH: %.*H\n", input_len, G_io_apdu_buffer); + io_send_sw(ERR_WRONG_DATA_LENGTH); + continue; } - FINALLY_L(exit) { + PRINTF("=> CLA=%02X | INS=%02X | P1=%02X | P2=%02X | Lc=%02X | CData=%.*H\n", + cmd.cla, + cmd.ins, + cmd.p1, + cmd.p2, + cmd.lc, + cmd.lc, + cmd.data); + // Dispatch structured APDU command to handler + if (apdu_dispatcher(&cmd, &flags) < 0) { + PRINTF("=> apdu_dispatcher failure\n"); + return; } - } - END_TRY_L(exit); -} - -void nv_app_state_init() { -} - -__attribute__((section(".boot"))) int main(void) { - // exit critical section - __asm volatile("cpsie i"); - - // ensure exception will work as planned - os_boot(); - for (;;) { - UX_INIT(); - - BEGIN_TRY { - TRY { - io_seproxyhal_init(); - - nv_app_state_init(); - - USB_power(0); - USB_power(1); - - ui_main_menu(); - -#ifdef HAVE_BLE - BLE_power(0, NULL); - BLE_power(1, "Nano X"); -#endif // HAVE_BLE - - app_main(); - } - CATCH(EXCEPTION_IO_RESET) { - // reset IO and UX before continuing - continue; - } - CATCH_ALL { - break; - } - FINALLY { - } - } - END_TRY; + // volatile unsigned short sw = 0; + // BEGIN_TRY { + // TRY { + // rx = tx; + // tx = 0; // ensure no race in catch_other if io_exchange throws + // // an error + // rx = io_exchange(CHANNEL_APDU | flags, rx); + // flags = 0; + + // // no apdu received, well, reset the session, and reset the + // // bootloader configuration + // if (rx == 0) { + // THROW(0x6982); + // } + + // PRINTF("New APDU received:\n%.*H\n", rx, G_io_apdu_buffer); + + // handleApdu(&flags, &tx, rx); + // } + // CATCH(EXCEPTION_IO_RESET) { + // THROW(EXCEPTION_IO_RESET); + // } + // CATCH_OTHER(e) { + // switch (e & 0xF000) { + // case 0x6000: + // sw = e; + // break; + // case 0x9000: + // // All is well + // sw = e; + // break; + // default: + // // Internal error + // sw = 0x6800 | (e & 0x7FF); + // break; + // } + // if (e != 0x9000) { + // flags &= ~IO_ASYNCH_REPLY; + // } + // // Unexpected exception => report + // G_io_apdu_buffer[tx] = sw >> 8; + // G_io_apdu_buffer[tx + 1] = sw; + // tx += 2; + // } + // FINALLY { + // } + // } + // END_TRY; } - app_exit(); - return 0; + // return_to_dashboard } + +// This does not seem to be used +// // override point, but nothing more to do +// void io_seproxyhal_display(const bagl_element_t* element) { +// io_seproxyhal_display_default((bagl_element_t*) element); +// } + +// unsigned char io_event(unsigned char channel) { +// UNUSED(channel); + +// // nothing done with the event, throw an error on the transport layer if +// // needed + +// // can't have more than one tag in the reply, not supported yet. +// switch (G_io_seproxyhal_spi_buffer[0]) { +// case SEPROXYHAL_TAG_FINGER_EVENT: +// UX_FINGER_EVENT(G_io_seproxyhal_spi_buffer); +// break; + +// case SEPROXYHAL_TAG_BUTTON_PUSH_EVENT: +// UX_BUTTON_PUSH_EVENT(G_io_seproxyhal_spi_buffer); +// break; + +// case SEPROXYHAL_TAG_STATUS_EVENT: +// if (G_io_apdu_media == IO_APDU_MEDIA_USB_HID && +// !(U4BE(G_io_seproxyhal_spi_buffer, 3) & +// SEPROXYHAL_TAG_STATUS_EVENT_FLAG_USB_POWERED)) { +// THROW(EXCEPTION_IO_RESET); +// } +// // no break is intentional +// __attribute__((fallthrough)); +// default: +// UX_DEFAULT_EVENT(); +// break; + +// case SEPROXYHAL_TAG_DISPLAY_PROCESSED_EVENT: +// UX_DISPLAYED_EVENT({}); +// break; + +// case SEPROXYHAL_TAG_TICKER_EVENT: +// UX_TICKER_EVENT(G_io_seproxyhal_spi_buffer, { +// #ifndef TARGET_NANOX +// if (UX_ALLOWED) { +// if (ux_step_count) { +// // prepare next screen +// ux_step = (ux_step + 1) % ux_step_count; +// // redisplay screen +// UX_REDISPLAY(); +// } +// } +// #endif // TARGET_NANOX +// }); +// break; +// } + +// // close the event if not done previously (by a display or whatever) +// if (!io_seproxyhal_spi_is_status_sent()) { +// io_seproxyhal_general_status(); +// } + +// // command has been processed, DO NOT reset the current APDU transport +// return 1; +// } + +// unsigned short io_exchange_al(unsigned char channel, unsigned short tx_len) { +// switch (channel & ~(IO_FLAGS)) { +// case CHANNEL_KEYBOARD: +// break; + +// // multiplexed io exchange over a SPI channel and TLV encapsulated protocol +// case CHANNEL_SPI: +// if (tx_len) { +// io_seproxyhal_spi_send(G_io_apdu_buffer, tx_len); + +// if (channel & IO_RESET_AFTER_REPLIED) { +// reset(); +// } +// return 0; // nothing received from the master so far (it's a tx +// // transaction) +// } else { +// return io_seproxyhal_spi_recv(G_io_apdu_buffer, sizeof(G_io_apdu_buffer), 0); +// } + +// default: +// THROW(INVALID_PARAMETER); +// } +// return 0; +// } + +// /** +// * Exit the application and go back to the dashboard. +// */ +// void app_exit() { +// BEGIN_TRY_L(exit) { +// TRY_L(exit) { +// os_sched_exit(-1); +// } +// FINALLY_L(exit) { +// } +// } +// END_TRY_L(exit); +// } + +// void nv_app_state_init() { +// } + +// __attribute__((section(".boot"))) int main(void) { +// // exit critical section +// __asm volatile("cpsie i"); + +// // ensure exception will work as planned +// os_boot(); + +// for (;;) { +// UX_INIT(); + +// BEGIN_TRY { +// TRY { +// io_seproxyhal_init(); + +// nv_app_state_init(); + +// USB_power(0); +// USB_power(1); + +// ui_main_menu(); + +// #ifdef HAVE_BLE +// BLE_power(0, NULL); +// BLE_power(1, "Nano X"); +// #endif // HAVE_BLE + +// app_main(); +// } +// CATCH(EXCEPTION_IO_RESET) { +// // reset IO and UX before continuing +// continue; +// } +// CATCH_ALL { +// break; +// } +// FINALLY { +// } +// } +// END_TRY; +// } +// app_exit(); +// return 0; +// } diff --git a/src/menu.h b/src/menu.h deleted file mode 100644 index b7d7fe4..0000000 --- a/src/menu.h +++ /dev/null @@ -1,12 +0,0 @@ -#include "globals.h" - -#ifndef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION -#include "glyphs.h" -#endif - -#ifndef _MENU_H_ -#define _MENU_H_ - -void ui_main_menu(void); - -#endif diff --git a/src/ui/menu.h b/src/ui/menu.h index 2588cce..aa15b48 100644 --- a/src/ui/menu.h +++ b/src/ui/menu.h @@ -1,8 +1,8 @@ +#pragma once + #include "globals.h" #include "glyphs.h" -#pragma once - void ui_main_menu(void); void ui_about_menu(void); diff --git a/src/utils.c b/src/utils.c index 1e8e46d..45486f6 100644 --- a/src/utils.c +++ b/src/utils.c @@ -152,32 +152,32 @@ uint8_t leading_zeros(uint16_t value) { return lz; } -uint16_t format_hex(const uint8_t* in, size_t in_len, char* out, size_t out_len) { - if (out_len < 2 * in_len + 1) { - return -1; - } +// uint16_t format_hex(const uint8_t* in, size_t in_len, char* out, size_t out_len) { +// if (out_len < 2 * in_len + 1) { +// return -1; +// } - const char hex[] = "0123456789abcdef"; - size_t i = 0; - int written = 0; +// const char hex[] = "0123456789abcdef"; +// size_t i = 0; +// int written = 0; - while (i < in_len && (i * 2 + (2 + 1)) <= out_len) { - uint8_t high_nibble = (in[i] & 0xF0) >> 4; - *out = hex[high_nibble]; - out++; +// while (i < in_len && (i * 2 + (2 + 1)) <= out_len) { +// uint8_t high_nibble = (in[i] & 0xF0) >> 4; +// *out = hex[high_nibble]; +// out++; - uint8_t low_nibble = in[i] & 0x0F; - *out = hex[low_nibble]; - out++; +// uint8_t low_nibble = in[i] & 0x0F; +// *out = hex[low_nibble]; +// out++; - i++; - written += 2; - } +// i++; +// written += 2; +// } - *out = '\0'; +// *out = '\0'; - return written + 1; -} +// return written + 1; +// } #define SCRATCH_SIZE 37 uint8_t convert_hex_amount_to_displayable(const uint8_t* amount, From e5a1e0872f5e9d0fec94fd72e81e0f371e9d14ce Mon Sep 17 00:00:00 2001 From: keiff3r Date: Tue, 18 Feb 2025 17:42:51 +0100 Subject: [PATCH 26/67] refactor: improve public key and error handling in key derivation functions This commit introduces several improvements to key derivation and error handling: - Modify get_public_key and get_private_key to return error codes - Add new error codes for key derivation and user rejection - Simplify error handling in key derivation functions - Update dispatcher and handler to use new error handling approach - Add helper functions for sending response in public key retrieval - Refactor UI validation logic for public key confirmation - Replace #ifndef header guards with #pragma once --- src/apdu/dispatcher.c | 25 ++--- src/apdu_constants.h | 5 +- src/errors.h | 3 + src/handler/get_address.c | 1 + src/handler/get_public_key.c | 29 +++--- src/handler/get_public_key.h | 21 +--- src/handler/sign.c | 1 + src/helper/send_response.c | 90 ++++++++++++++++++ src/helper/send_response.h | 9 ++ src/message.c | 1 + src/ui/action/validate.c | 29 ++++++ src/ui/action/validate.h | 21 ++++ src/ui/display.h | 7 ++ src/ui/display_bagl.c | 15 ++- src/utils.c | 81 +++++++--------- src/utils.h | 6 +- .../00000.png | Bin 933 -> 904 bytes .../00001.png | Bin 531 -> 556 bytes .../00000.png | Bin 933 -> 904 bytes .../00001.png | Bin 531 -> 556 bytes 20 files changed, 243 insertions(+), 101 deletions(-) create mode 100644 src/helper/send_response.c create mode 100644 src/helper/send_response.h create mode 100644 src/ui/action/validate.c create mode 100644 src/ui/action/validate.h diff --git a/src/apdu/dispatcher.c b/src/apdu/dispatcher.c index 4b9bb28..f330651 100644 --- a/src/apdu/dispatcher.c +++ b/src/apdu/dispatcher.c @@ -48,20 +48,23 @@ int apdu_dispatcher(const command_t* cmd, volatile unsigned int* flags) { } return handleGetAppConfiguration(); - // case INS_GET_PUBLIC_KEY: - // if (cmd->p1 > 1 || cmd->p2 > 0) { - // return io_send_sw(SW_WRONG_P1P2); - // } + case INS_GET_PUBLIC_KEY: + if (cmd->p1 > 1 || cmd->p2 > 0) { + return io_send_sw(ERR_WRONG_P1P2); + } + if (cmd->lc != sizeof(uint32_t)) { + return io_send_sw(ERR_WRONG_DATA_LENGTH); + } - // if (!cmd->data) { - // return io_send_sw(SW_WRONG_DATA_LENGTH); - // } + if (!cmd->data) { + return io_send_sw(ERR_NO_DATA); + } - // buf.ptr = cmd->data; - // buf.size = cmd->lc; - // buf.offset = 0; + buf.ptr = cmd->data; + buf.size = cmd->lc; + buf.offset = 0; - // return handler_get_public_key(&buf, (bool) cmd->p1); + return handleGetPublicKey(&buf, (bool) cmd->p1, flags); // case SIGN_TX: // if ((cmd->p1 == P1_START && cmd->p2 != P2_MORE) || // // cmd->p1 > P1_MAX || // diff --git a/src/apdu_constants.h b/src/apdu_constants.h index 99f5f94..d8f1160 100644 --- a/src/apdu_constants.h +++ b/src/apdu_constants.h @@ -1,5 +1,4 @@ -#ifndef _APDU_CONSTANTS_H_ -#define _APDU_CONSTANTS_H_ +#pragma once #include #include @@ -24,5 +23,3 @@ #define OFFSET_CDATA 5 #define APPVERSION_LEN 3 - -#endif diff --git a/src/errors.h b/src/errors.h index e05f13c..06c5bd2 100644 --- a/src/errors.h +++ b/src/errors.h @@ -31,6 +31,9 @@ enum { ERR_CLA_NOT_SUPPORTED = 0x6B25, ERR_WRONG_P1P2 = 0x6B26, ERR_INS_NOT_SUPPORTED = 0x6B27, + ERR_NO_DATA = 0x6B28, + ERR_GET_PUBLIC_KEY_FAILED = 0x6B29, + ERR_USER_REJECTED = 0x6985, }; #endif diff --git a/src/handler/get_address.c b/src/handler/get_address.c index 90a972f..e33a00f 100644 --- a/src/handler/get_address.c +++ b/src/handler/get_address.c @@ -1,3 +1,4 @@ +#include "format.h" #include "apdu_constants.h" #include "globals.h" #include "utils.h" diff --git a/src/handler/get_public_key.c b/src/handler/get_public_key.c index d6e36a3..95fadc0 100644 --- a/src/handler/get_public_key.c +++ b/src/handler/get_public_key.c @@ -1,36 +1,31 @@ #include "os.h" #include "ux.h" +#include "format.h" +#include "read.h" +#include "buffer.h" +#include "parser.h" #include "utils.h" #include "apdu_constants.h" #include "errors.h" #include "ui/display.h" #include "response_setter.h" +#include "helper/send_response.h" -void handleGetPublicKey(uint8_t p1, - uint8_t p2, - uint8_t* dataBuffer, - uint16_t dataLength, - volatile unsigned int* flags, - volatile unsigned int* tx) { - VALIDATE(p2 == 0 && dataLength == sizeof(uint32_t), ERR_INVALID_REQUEST); - - uint32_t account_number = readUint32BE(dataBuffer); +int handleGetPublicKey(buffer_t* cdata, bool display, volatile unsigned int* flags) { + uint32_t account_number = read_u32_be(cdata->ptr, cdata->offset); PublicKeyContext_t* context = &data_context.pk_context; - get_public_key(account_number, context->public_key); - if (p1 == P1_NON_CONFIRM) { - *tx = set_result_get_public_key(); - THROW(SUCCESS); + if (get_public_key(account_number, context->public_key) != 0) { + return io_send_sw(ERR_GET_PUBLIC_KEY_FAILED); } - if (p1 == P1_CONFIRM) { + if (display) { format_hex(context->public_key, sizeof(context->public_key), context->public_key_str, sizeof(context->public_key_str)); ui_display_public_key(); *flags |= IO_ASYNCH_REPLY; - return; + return 0; } - - THROW(ERR_INVALID_REQUEST); + return helper_send_response_public_key(); } diff --git a/src/handler/get_public_key.h b/src/handler/get_public_key.h index e494c81..1cb0bb0 100644 --- a/src/handler/get_public_key.h +++ b/src/handler/get_public_key.h @@ -1,22 +1,11 @@ -#ifndef __GET_PUBLIC_KEY_H__ -#define __GET_PUBLIC_KEY_H__ +#pragma once #include /** * Handles the get public key command - * @param p1 parameter 1 - confirmation flag (P1_CONFIRM or P1_NON_CONFIRM) - * @param p2 parameter 2 (expected to be 0) - * @param dataBuffer input data buffer - * @param dataLength length of input data - * @param flags pointer to flags - * @param tx pointer to tx + * @param cdata command data + * @param display display flag + * @param flags flags */ -void handleGetPublicKey(uint8_t p1, - uint8_t p2, - uint8_t* dataBuffer, - uint16_t dataLength, - volatile unsigned int* flags, - volatile unsigned int* tx); - -#endif // __GET_PUBLIC_KEY_H__ +int handleGetPublicKey(buffer_t* cdata, bool display, volatile unsigned int* flags); diff --git a/src/handler/sign.c b/src/handler/sign.c index 9971525..bbde721 100644 --- a/src/handler/sign.c +++ b/src/handler/sign.c @@ -1,3 +1,4 @@ +#include "format.h" #include "apdu_constants.h" #include "utils.h" #include "errors.h" diff --git a/src/helper/send_response.c b/src/helper/send_response.c new file mode 100644 index 0000000..0603ac6 --- /dev/null +++ b/src/helper/send_response.c @@ -0,0 +1,90 @@ +#include "helper/send_response.h" + +int helper_send_response_public_key() { + uint8_t resp[1 + PUBLIC_KEY_LENGTH] = {0}; + size_t offset = 0; + resp[offset++] = PUBLIC_KEY_LENGTH; + memmove(resp + offset, data_context.pk_context.public_key, PUBLIC_KEY_LENGTH); + offset += PUBLIC_KEY_LENGTH; + reset_app_context(); + return io_send_response_pointer(resp, offset, SUCCESS); +} + +uint8_t helper_send_response_address() { + uint8_t tx = 0; + G_io_apdu_buffer[tx++] = ADDRESS_LENGTH; + memmove(G_io_apdu_buffer + tx, data_context.addr_context.address, ADDRESS_LENGTH); + tx += ADDRESS_LENGTH; + reset_app_context(); + return tx; +} + +uint8_t helper_send_response_sign_transaction() { + cx_ecfp_private_key_t privateKey; + SignTransactionContext_t* context = &data_context.sign_tr_context; + cx_err_t error; + + BEGIN_TRY { + TRY { + get_private_key(context->account_number, &privateKey); + if (!context->sign_with_chain_id) { + error = cx_eddsa_sign_no_throw(&privateKey, + CX_SHA512, + context->to_sign, + TO_SIGN_LENGTH, + context->signature, + SIGNATURE_LENGTH); + } else { + error = cx_eddsa_sign_no_throw(&privateKey, + CX_SHA512, + context->to_sign, + CHAIN_ID_LENGTH + TO_SIGN_LENGTH, + context->signature, + SIGNATURE_LENGTH); + } + if (error != CX_OK) { + THROW(ERR_SIGNING_FAILED); + } + } + FINALLY { + explicit_bzero(&privateKey, sizeof(privateKey)); + } + } + END_TRY; + + uint8_t tx = 0; + G_io_apdu_buffer[tx++] = SIGNATURE_LENGTH; + memmove(G_io_apdu_buffer + tx, context->signature, SIGNATURE_LENGTH); + tx += SIGNATURE_LENGTH; + return tx; +} + +uint8_t helper_send_response_sign() { + cx_ecfp_private_key_t privateKey; + SignContext_t* context = &data_context.sign_context; + cx_err_t error; + BEGIN_TRY { + TRY { + get_private_key(context->account_number, &privateKey); + error = cx_eddsa_sign_no_throw(&privateKey, + CX_SHA512, + context->to_sign, + SIGN_MAGIC_LENGTH + TO_SIGN_LENGTH, + context->signature, + SIGNATURE_LENGTH); + if (error != CX_OK) { + THROW(ERR_SIGNING_FAILED); + } + } + FINALLY { + explicit_bzero(&privateKey, sizeof(privateKey)); + } + } + END_TRY; + + uint8_t tx = 0; + G_io_apdu_buffer[tx++] = SIGNATURE_LENGTH; + memmove(G_io_apdu_buffer + tx, context->signature, SIGNATURE_LENGTH); + tx += SIGNATURE_LENGTH; + return tx; +} diff --git a/src/helper/send_response.h b/src/helper/send_response.h new file mode 100644 index 0000000..eba64b0 --- /dev/null +++ b/src/helper/send_response.h @@ -0,0 +1,9 @@ +#pragma once +#include "globals.h" +#include "utils.h" +#include "io.h" + +int helper_send_response_public_key(); +uint8_t helper_send_response_address(); +uint8_t helper_send_response_sign_transaction(); +uint8_t helper_send_response_sign(); diff --git a/src/message.c b/src/message.c index 37d1ab2..b2d9cc6 100644 --- a/src/message.c +++ b/src/message.c @@ -4,6 +4,7 @@ #include "slice_data.h" #include "byte_stream.h" #include "contract.h" +#include "format.h" #define ROOT_CELL_INDEX 0 #define GIFT_CELL_INDEX 1 diff --git a/src/ui/action/validate.c b/src/ui/action/validate.c new file mode 100644 index 0000000..322847b --- /dev/null +++ b/src/ui/action/validate.c @@ -0,0 +1,29 @@ +/***************************************************************************** + * Ledger App Boilerplate. + * (c) 2020 Ledger SAS. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + *****************************************************************************/ + +#include "validate.h" +#include "errors.h" +#include "helper/send_response.h" +#include "io.h" + +void validate_pubkey(bool choice) { + if (choice) { + helper_send_response_public_key(); + } else { + io_send_sw(ERR_USER_REJECTED); + } +} \ No newline at end of file diff --git a/src/ui/action/validate.h b/src/ui/action/validate.h new file mode 100644 index 0000000..94ef27d --- /dev/null +++ b/src/ui/action/validate.h @@ -0,0 +1,21 @@ +#pragma once + +#include // bool + +/** + * Action for public key validation and export. + * + * @param[in] choice + * User choice (either approved or rejected). + * + */ +void validate_pubkey(bool choice); + +/** + * Action for transaction information validation. + * + * @param[in] choice + * User choice (either approved or rejectd). + * + */ +void validate_transaction(bool choice); \ No newline at end of file diff --git a/src/ui/display.h b/src/ui/display.h index f60d3c1..edcf3a2 100644 --- a/src/ui/display.h +++ b/src/ui/display.h @@ -1,5 +1,12 @@ #pragma once +#include // bool + +/** + * Callback to reuse action with approve/reject in step FLOW. + */ +typedef void (*action_validate_cb)(bool); + void ui_display_address(); void ui_display_public_key(); void ui_display_sign_transaction(int flow); diff --git a/src/ui/display_bagl.c b/src/ui/display_bagl.c index f1b3606..dfdec13 100644 --- a/src/ui/display_bagl.c +++ b/src/ui/display_bagl.c @@ -2,6 +2,16 @@ #include "display.h" #include "response_setter.h" #include "contract.h" +#include "ui/action/validate.h" +#include "ui/menu.h" + +static action_validate_cb g_validate_callback; + +static void ui_action_validate_pubkey(bool choice) { + validate_pubkey(choice); + ui_main_menu(); +} + // Screens and flows UX_STEP_NOCB(ux_display_address_flow_1_step, pnn, @@ -45,14 +55,14 @@ UX_STEP_NOCB(ux_display_public_flow_1_step, }); UX_STEP_CB(ux_display_public_flow_2_step, pb, - send_response(0, false), + (*g_validate_callback)(false), { &C_icon_crossmark, "Reject", }); UX_STEP_CB(ux_display_public_flow_3_step, pb, - send_response(set_result_get_public_key(), true), + (*g_validate_callback)(true), { &C_icon_validate_14, "Approve", @@ -179,6 +189,7 @@ void ui_display_address() { } void ui_display_public_key() { + g_validate_callback = &ui_action_validate_pubkey; ux_flow_init(0, ux_display_public_flow, NULL); } diff --git a/src/utils.c b/src/utils.c index 45486f6..ca94f42 100644 --- a/src/utils.c +++ b/src/utils.c @@ -7,28 +7,17 @@ #ifndef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION -void get_public_key(uint32_t account_number, uint8_t* publicKeyArray) { +int get_public_key(uint32_t account_number, uint8_t* publicKeyArray) { cx_ecfp_private_key_t privateKey; cx_ecfp_public_key_t publicKey; - cx_err_t error; - - get_private_key(account_number, &privateKey); - BEGIN_TRY { - TRY { - error = cx_ecfp_generate_pair_no_throw(CX_CURVE_Ed25519, &publicKey, &privateKey, 1); - if (error != CX_OK) { - THROW(ERR_GENERATE_PAIR_FAILED); - } - } - CATCH_OTHER(e) { - explicit_bzero(&privateKey, sizeof(privateKey)); - THROW(e); - } - FINALLY { - explicit_bzero(&privateKey, sizeof(privateKey)); - } + if (get_private_key(account_number, &privateKey) != 0) { + return -1; + } + cx_err_t error = cx_ecfp_generate_pair_no_throw(CX_CURVE_Ed25519, &publicKey, &privateKey, 1); + if (error != CX_OK) { + return -2; } - END_TRY; + explicit_bzero(&privateKey, sizeof(privateKey)); for (int i = 0; i < 32; i++) { publicKeyArray[i] = publicKey.W[64 - i]; @@ -36,11 +25,19 @@ void get_public_key(uint32_t account_number, uint8_t* publicKeyArray) { if ((publicKey.W[32] & 1) != 0) { publicKeyArray[31] |= 0x80; } + return 0; } static const uint32_t HARDENED_OFFSET = 0x80000000; -void get_private_key(uint32_t account_number, cx_ecfp_private_key_t* privateKey) { +/** + * @brief Get the private key object + * + * @param account_number + * @param privateKey + * @return 0 on success, -1 on error + */ +int get_private_key(uint32_t account_number, cx_ecfp_private_key_t* privateKey) { const uint32_t derivePath[BIP32_PATH] = {44 | HARDENED_OFFSET, 396 | HARDENED_OFFSET, account_number | HARDENED_OFFSET, @@ -48,35 +45,23 @@ void get_private_key(uint32_t account_number, cx_ecfp_private_key_t* privateKey) 0 | HARDENED_OFFSET}; uint8_t privateKeyData[64]; - cx_err_t error; - BEGIN_TRY { - TRY { - error = os_derive_bip32_with_seed_no_throw(HDW_ED25519_SLIP10, - CX_CURVE_Ed25519, - derivePath, - BIP32_PATH, - privateKeyData, - NULL, - NULL, - 0); - if (error != CX_OK) { - THROW(ERR_DERIVE_PATH_FAILED); - } - error = - cx_ecfp_init_private_key_no_throw(CX_CURVE_Ed25519, privateKeyData, 32, privateKey); - if (error != CX_OK) { - THROW(ERR_INIT_PRIVATE_KEY_FAILED); - } - } - CATCH_OTHER(e) { - explicit_bzero(&privateKeyData, sizeof(privateKeyData)); - THROW(e); - } - FINALLY { - explicit_bzero(&privateKeyData, sizeof(privateKeyData)); - } + cx_err_t error = os_derive_bip32_with_seed_no_throw(HDW_ED25519_SLIP10, + CX_CURVE_Ed25519, + derivePath, + BIP32_PATH, + privateKeyData, + NULL, + NULL, + 0); + error = cx_ecfp_init_private_key_no_throw(CX_CURVE_Ed25519, privateKeyData, 32, privateKey); + + explicit_bzero(&privateKeyData, sizeof(privateKeyData)); + + if (error != CX_OK) { + return -1; } - END_TRY; + + return 0; } void send_response(uint8_t tx, bool approve) { diff --git a/src/utils.h b/src/utils.h index 552d025..e7f468c 100644 --- a/src/utils.h +++ b/src/utils.h @@ -11,8 +11,8 @@ #ifndef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION unsigned int ui_prepro(const bagl_element_t* element); -void get_public_key(uint32_t accountNumber, uint8_t* publicKeyArray); -void get_private_key(uint32_t accountNumber, cx_ecfp_private_key_t* privateKey); +int get_public_key(uint32_t accountNumber, uint8_t* publicKeyArray); +int get_private_key(uint32_t accountNumber, cx_ecfp_private_key_t* privateKey); void send_response(uint8_t tx, bool approve); #endif @@ -25,7 +25,7 @@ uint32_t readUint32BE(uint8_t* buffer); uint64_t readUint64BE(uint8_t* buffer); uint8_t leading_zeros(uint16_t value); -uint16_t format_hex(const uint8_t* in, size_t in_len, char* out, size_t out_len); +// uint16_t format_hex(const uint8_t* in, size_t in_len, char* out, size_t out_len); uint8_t convert_hex_amount_to_displayable(const uint8_t* amount, uint8_t decimals, uint8_t amount_length, diff --git a/tests/snapshots/nanosp/test_get_public_key_confirm_accepted/00000.png b/tests/snapshots/nanosp/test_get_public_key_confirm_accepted/00000.png index 0633ead3d2b5df3b86c3e77b3eb3c3e301f7bef6..a63f85f1db8b849a5dcbea69fdefdc20a1688f58 100644 GIT binary patch delta 881 zcmV-%1CIQq2Z#rdB!5pyL_t(|ob8-lZtNfoh109P_yd$|uIA!O|1gH1@)`g@uo z{1{9eb29C96-7}LMNt&RalVr6TWjOj`@V5aQDH1pE0Fz!X|0W2&7IE{juk}n0RJ+L zJ6o3HzVBVjN+NcT_}ZEG$5_*9Me?0#Y|(ACHq@p0OjI5xrhhsH*H^E)Hz+84Xmjkj z19-@3^!2iC3w87M$~`iC%H8O9Meo1)hFE2f0|FL+CVX#V{;joSK$y+IZp*VL1Raju z7Q&1kh<35Jw-2X7PzU&oaVMWRW%jJvYVU4)&;e?SMsA|MzHU?z$q65YaQL3f)j*ez zNZE714+kV&*ME-X%lGhF2s(+iK)a4FndZOw4#3;LD2k#$&j2-sV!co;Q592=KaBaS zs>bkzmz@pcBQ92fR15KZQ;4)T{6TbR>0elDR5N`m{Z|K?3mKcqv8>@N-bq8PO+m`* z2M(wf`4<2JM+@4nJ>jvi@cGu;f{m|VW*i3ybyo$P+JDuO)j5Rc+|B-|a$+uHAsCbt zHp0His-fhwhYae+d7QoG0M##kGT1lM37AE&fHVp+E-!+jb z52vASqAA95=fztH($FWKBE=f909fp#eDFTygEy(wf0J7MHje?l|tPb73 zifSGheN>Fth97T<57-iB6yE`{<>Ti$x0*FezPYGxeT|vN!w>XS2#QTLqgkGpZ?~}Q z05=ZKZ&bD{&6byL_-z^}?^mr%S~NfZ#43uSD2k#eiUs}yS`4C@Yg(;H{zMvEbXzTly0kT$DvtwG7k>uVSO0Z4C@6f$IdXOY z4>^oJU)Huzowrx+k>OMBM!#!!|H%!pO3ngoSOA*vy-nk9tpx*uGy^YNoSYE!a_qL4 z%;>4{?dnWl47$ z?QxG)mTsD3as0=4Y3W~2B%Jc@z&yqtvd|sNBWkE>#OQREUwk~sQi&}$951CWM-)xf z9<|z1w^tfOKl>Z67Y# zW_$+r2l!YbE4WdJ83F*<1FH4HwoCBbo`Y9hT0GeXX9)gS8?6*%A(sGw8DkFqRFVCmLSMOHlZ@%?Xb0% zk>zG~q@pPeaQ)YnUYH#~siEo(+)0r_CWG2aRRWlG;xkW~T~7^VzP%*VTI_2<%;b`R zLJiOx2Jq`G#R>P;vh$Sl%(G(L9s9@AFlsTn= zl1uDg=KLpHk+;LI%dr{Y;o**MD*3WYUKB-96h-k3m}D%qB-m=TxAqUW4!#|zz?h2X zAtgyRRYOL8kSV(*Lag=%%){kR{JZT{owZC@)!C6S<`3rrWycJFlncCucfwb zZ+~RxQ7K|uS5Xs1DKRnzxH+eq247mQiMKeThDLPCA0~341&{$zCDGC3ho1P3g^G!KqwJpBI l(nGi?ilQirq9_jV7b0~ft1^{xcK`qY00>D%PDHLkV1nrn!bt!C diff --git a/tests/snapshots/nanosp/test_get_public_key_confirm_accepted/00001.png b/tests/snapshots/nanosp/test_get_public_key_confirm_accepted/00001.png index b4c02b65f80583b2c7ad2771dc1587b83b208b68..9048fa409e843ae1dac7347bdf2d25e56529ea63 100644 GIT binary patch delta 531 zcmV+u0_^>h1gr#*B!BZsL_t(|ob8!Ga>F1DMQNuu@%@j)UApiL!+<1Y1SDzSTP2Q= zWl4MpP6+@2007`PUy;E%=lbh)UAARoP+t@coPMUsITu&uS%yK@HnoR2z9WO1Xo5~w zrPWE@Jz|#Y*bJNA{t-Ws!6GHlzFV~}OI>T%PbC({wikaj3V*EqGz=rof*Ih)`3xmr z+O%kzuC`B=EZoK8$qG=3HoVB+@15WlzP;d9PGHSo-vwTn<%B0-0>TcZi12$2(y zaj?K5M2>t9TfVe+%c2LRhP*s|piC=|!`6?gkl|u}^zDrz@ zLjMEa9And!7JsRE+{tSs=p)p1RTo)@ZH_U5ayP27fpaS66Ypop2@MdnTObxa|dI10c00000000000000000000006e}3*`Ic VLU$jlCky}p002ovPDHLkV1nMS_w4`x delta 505 zcmVJ*h?Qe!(@PjAOTOE|9fgZ z5Rpq%ObGx0066YzrE<<${(D`QU9u`54|WSUzuS$O!j*uT-vDvlt|* zTb<Gra0n^C4MKjmkoa#v|+J6p9`mYS(8uc|vRcKPnF#(w~7KMk9)E?@=tIj^Dg zm$odbNhixEkrw`r53}D2ZPEAz48V=k8&&+#s*BG#FJ=SJx{19BrH~YKICpERW|Tza z%qP_yd$|uIA!O|1gH1@)`g@uo z{1{9eb29C96-7}LMNt&RalVr6TWjOj`@V5aQDH1pE0Fz!X|0W2&7IE{juk}n0RJ+L zJ6o3HzVBVjN+NcT_}ZEG$5_*9Me?0#Y|(ACHq@p0OjI5xrhhsH*H^E)Hz+84Xmjkj z19-@3^!2iC3w87M$~`iC%H8O9Meo1)hFE2f0|FL+CVX#V{;joSK$y+IZp*VL1Raju z7Q&1kh<35Jw-2X7PzU&oaVMWRW%jJvYVU4)&;e?SMsA|MzHU?z$q65YaQL3f)j*ez zNZE714+kV&*ME-X%lGhF2s(+iK)a4FndZOw4#3;LD2k#$&j2-sV!co;Q592=KaBaS zs>bkzmz@pcBQ92fR15KZQ;4)T{6TbR>0elDR5N`m{Z|K?3mKcqv8>@N-bq8PO+m`* z2M(wf`4<2JM+@4nJ>jvi@cGu;f{m|VW*i3ybyo$P+JDuO)j5Rc+|B-|a$+uHAsCbt zHp0His-fhwhYae+d7QoG0M##kGT1lM37AE&fHVp+E-!+jb z52vASqAA95=fztH($FWKBE=f909fp#eDFTygEy(wf0J7MHje?l|tPb73 zifSGheN>Fth97T<57-iB6yE`{<>Ti$x0*FezPYGxeT|vN!w>XS2#QTLqgkGpZ?~}Q z05=ZKZ&bD{&6byL_-z^}?^mr%S~NfZ#43uSD2k#eiUs}yS`4C@Yg(;H{zMvEbXzTly0kT$DvtwG7k>uVSO0Z4C@6f$IdXOY z4>^oJU)Huzowrx+k>OMBM!#!!|H%!pO3ngoSOA*vy-nk9tpx*uGy^YNoSYE!a_qL4 z%;>4{?dnWl47$ z?QxG)mTsD3as0=4Y3W~2B%Jc@z&yqtvd|sNBWkE>#OQREUwk~sQi&}$951CWM-)xf z9<|z1w^tfOKl>Z67Y# zW_$+r2l!YbE4WdJ83F*<1FH4HwoCBbo`Y9hT0GeXX9)gS8?6*%A(sGw8DkFqRFVCmLSMOHlZ@%?Xb0% zk>zG~q@pPeaQ)YnUYH#~siEo(+)0r_CWG2aRRWlG;xkW~T~7^VzP%*VTI_2<%;b`R zLJiOx2Jq`G#R>P;vh$Sl%(G(L9s9@AFlsTn= zl1uDg=KLpHk+;LI%dr{Y;o**MD*3WYUKB-96h-k3m}D%qB-m=TxAqUW4!#|zz?h2X zAtgyRRYOL8kSV(*Lag=%%){kR{JZT{owZC@)!C6S<`3rrWycJFlncCucfwb zZ+~RxQ7K|uS5Xs1DKRnzxH+eq247mQiMKeThDLPCA0~341&{$zCDGC3ho1P3g^G!KqwJpBI l(nGi?ilQirq9_jV7b0~ft1^{xcK`qY00>D%PDHLkV1nrn!bt!C diff --git a/tests/snapshots/nanosp/test_get_public_key_confirm_refused/00001.png b/tests/snapshots/nanosp/test_get_public_key_confirm_refused/00001.png index b4c02b65f80583b2c7ad2771dc1587b83b208b68..9048fa409e843ae1dac7347bdf2d25e56529ea63 100644 GIT binary patch delta 531 zcmV+u0_^>h1gr#*B!BZsL_t(|ob8!Ga>F1DMQNuu@%@j)UApiL!+<1Y1SDzSTP2Q= zWl4MpP6+@2007`PUy;E%=lbh)UAARoP+t@coPMUsITu&uS%yK@HnoR2z9WO1Xo5~w zrPWE@Jz|#Y*bJNA{t-Ws!6GHlzFV~}OI>T%PbC({wikaj3V*EqGz=rof*Ih)`3xmr z+O%kzuC`B=EZoK8$qG=3HoVB+@15WlzP;d9PGHSo-vwTn<%B0-0>TcZi12$2(y zaj?K5M2>t9TfVe+%c2LRhP*s|piC=|!`6?gkl|u}^zDrz@ zLjMEa9And!7JsRE+{tSs=p)p1RTo)@ZH_U5ayP27fpaS66Ypop2@MdnTObxa|dI10c00000000000000000000006e}3*`Ic VLU$jlCky}p002ovPDHLkV1nMS_w4`x delta 505 zcmVJ*h?Qe!(@PjAOTOE|9fgZ z5Rpq%ObGx0066YzrE<<${(D`QU9u`54|WSUzuS$O!j*uT-vDvlt|* zTb<Gra0n^C4MKjmkoa#v|+J6p9`mYS(8uc|vRcKPnF#(w~7KMk9)E?@=tIj^Dg zm$odbNhixEkrw`r53}D2ZPEAz48V=k8&&+#s*BG#FJ=SJx{19BrH~YKICpERW|Tza z%q Date: Tue, 18 Feb 2025 19:38:39 +0100 Subject: [PATCH 27/67] refactor: add get address APDU command handler and UI flow This commit introduces the get address functionality with several key improvements: - Implement handleGetAddress function in get_address.c - Update dispatcher to support INS_GET_ADDRESS command - Add address validation and UI confirmation flow - Modify send_response helper to return int for consistent error handling - Update UI display logic to use a generic validation callback - Add validate_address function for address export and rejection --- src/apdu/dispatcher.c | 19 +++++++++- src/contract.c | 6 +-- src/handler/get_address.c | 35 +++++++----------- src/handler/get_address.h | 22 +++-------- src/helper/send_response.c | 13 ++++--- src/helper/send_response.h | 2 +- src/main.c | 20 ++++++++-- src/ui/action/validate.c | 8 ++++ src/ui/action/validate.h | 8 ++++ src/ui/display_bagl.c | 10 ++++- .../00001.png | Bin 915 -> 889 bytes .../00002.png | Bin 488 -> 498 bytes .../00001.png | Bin 915 -> 889 bytes .../00002.png | Bin 488 -> 498 bytes 14 files changed, 88 insertions(+), 55 deletions(-) diff --git a/src/apdu/dispatcher.c b/src/apdu/dispatcher.c index f330651..afca2ad 100644 --- a/src/apdu/dispatcher.c +++ b/src/apdu/dispatcher.c @@ -28,7 +28,7 @@ #include "handler/get_app_configuration.h" #include "handler/get_public_key.h" #include "handler/sign_transaction.h" - +#include "handler/get_address.h" int apdu_dispatcher(const command_t* cmd, volatile unsigned int* flags) { LEDGER_ASSERT(cmd != NULL, "NULL cmd"); @@ -65,6 +65,23 @@ int apdu_dispatcher(const command_t* cmd, volatile unsigned int* flags) { buf.offset = 0; return handleGetPublicKey(&buf, (bool) cmd->p1, flags); + case INS_GET_ADDRESS: + if (cmd->p1 > 1 || cmd->p2 > 0) { + return io_send_sw(ERR_WRONG_P1P2); + } + if (cmd->lc != sizeof(uint32_t) + sizeof(uint8_t)) { + return io_send_sw(ERR_WRONG_DATA_LENGTH); + } + + if (!cmd->data) { + return io_send_sw(ERR_NO_DATA); + } + + buf.ptr = cmd->data; + buf.size = cmd->lc; + buf.offset = 0; + + return handleGetAddress(&buf, (bool) cmd->p1, flags); // case SIGN_TX: // if ((cmd->p1 == P1_START && cmd->p2 != P2_MORE) || // // cmd->p1 > P1_MAX || // diff --git a/src/contract.c b/src/contract.c index e4434e2..2b2acdf 100644 --- a/src/contract.c +++ b/src/contract.c @@ -195,7 +195,7 @@ void compute_wallet_v3_address(uint32_t account_number, uint8_t* address) { // Pubkey uint8_t public_key[PUBLIC_KEY_LENGTH]; - get_public_key(account_number, public_key); + VALIDATE(get_public_key(account_number, public_key) == 0, ERR_GET_PUBLIC_KEY_FAILED); memcpy(hash_buffer + hash_buffer_offset, public_key, PUBLIC_KEY_LENGTH); hash_buffer_offset += PUBLIC_KEY_LENGTH; @@ -249,7 +249,7 @@ void compute_ever_wallet_address(uint32_t account_number, uint8_t* address) { // Pubkey uint8_t public_key[PUBLIC_KEY_LENGTH]; - get_public_key(account_number, public_key); + VALIDATE(get_public_key(account_number, public_key) == 0, ERR_GET_PUBLIC_KEY_FAILED); memcpy(hash_buffer + hash_buffer_offset, public_key, PUBLIC_KEY_LENGTH); hash_buffer_offset += PUBLIC_KEY_LENGTH; @@ -324,7 +324,7 @@ void compute_multisig_address(uint32_t account_number, memcpy(bc->public_key_cell_data, cell_data, cell_data_size); uint8_t* public_key = data_context.pk_context.public_key; - get_public_key(account_number, public_key); + VALIDATE(get_public_key(account_number, public_key) == 0, ERR_GET_PUBLIC_KEY_FAILED); uint8_t* data = bc->public_key_cell_data; SliceData_t slice; diff --git a/src/handler/get_address.c b/src/handler/get_address.c index e33a00f..396ec39 100644 --- a/src/handler/get_address.c +++ b/src/handler/get_address.c @@ -1,4 +1,5 @@ #include "format.h" +#include "read.h" #include "apdu_constants.h" #include "globals.h" #include "utils.h" @@ -7,37 +8,27 @@ #include "byte_stream.h" #include "response_setter.h" #include "ui/display.h" -void handleGetAddress(uint8_t p1, - uint8_t p2, - uint8_t* dataBuffer, - uint16_t dataLength, - volatile unsigned int* flags, - volatile unsigned int* tx) { - VALIDATE(p2 == 0 && dataLength == (sizeof(uint32_t) + sizeof(uint8_t)), ERR_INVALID_REQUEST); +#include "errors.h" +#include "io.h" +#include "helper/send_response.h" - size_t offset = 0; +int handleGetAddress(buffer_t* cdata, bool display, volatile unsigned int* flags) { + uint32_t account_number = read_u32_be(cdata->ptr, cdata->offset); + cdata->offset += sizeof(account_number); - uint32_t account_number = readUint32BE(dataBuffer + offset); - offset += sizeof(account_number); + uint8_t wallet_type = cdata->ptr[cdata->offset++]; - uint8_t wallet_type = dataBuffer[offset]; + AddressContext_t* context = &data_context.addr_context; + get_address(account_number, wallet_type, context->address); - get_address(account_number, wallet_type, data_context.addr_context.address); - - if (p1 == P1_NON_CONFIRM) { - *tx = set_result_get_address(); - THROW(SUCCESS); - } - if (p1 == P1_CONFIRM) { - AddressContext_t* context = &data_context.addr_context; + if (display) { format_hex(context->address, sizeof(context->address), context->address_str, sizeof(context->address_str)); ui_display_address(); *flags |= IO_ASYNCH_REPLY; - return; + return 0; } - - THROW(ERR_INVALID_REQUEST); + return helper_send_response_address(); } diff --git a/src/handler/get_address.h b/src/handler/get_address.h index 4a24cec..74dbf4e 100644 --- a/src/handler/get_address.h +++ b/src/handler/get_address.h @@ -1,22 +1,12 @@ -#ifndef __GET_ADDRESS_H__ -#define __GET_ADDRESS_H__ +#pragma once #include /** * Handles the get address command - * @param p1 parameter 1 - confirmation flag (P1_CONFIRM or P1_NON_CONFIRM) - * @param p2 parameter 2 (expected to be 0) - * @param dataBuffer input data buffer - * @param dataLength length of input data - * @param flags pointer to flags - * @param tx pointer to tx + * @param cdata command data + * @param display display flag + * @param flags flags + * @return 0 on success, error code on failure */ -void handleGetAddress(uint8_t p1, - uint8_t p2, - uint8_t* dataBuffer, - uint16_t dataLength, - volatile unsigned int* flags, - volatile unsigned int* tx); - -#endif // __GET_ADDRESS_H__ +int handleGetAddress(buffer_t* cdata, bool display, volatile unsigned int* flags); diff --git a/src/helper/send_response.c b/src/helper/send_response.c index 0603ac6..747a9a6 100644 --- a/src/helper/send_response.c +++ b/src/helper/send_response.c @@ -10,13 +10,14 @@ int helper_send_response_public_key() { return io_send_response_pointer(resp, offset, SUCCESS); } -uint8_t helper_send_response_address() { - uint8_t tx = 0; - G_io_apdu_buffer[tx++] = ADDRESS_LENGTH; - memmove(G_io_apdu_buffer + tx, data_context.addr_context.address, ADDRESS_LENGTH); - tx += ADDRESS_LENGTH; +int helper_send_response_address() { + uint8_t resp[1 + ADDRESS_LENGTH] = {0}; + size_t offset = 0; + resp[offset++] = ADDRESS_LENGTH; + memmove(resp + offset, data_context.addr_context.address, ADDRESS_LENGTH); + offset += ADDRESS_LENGTH; reset_app_context(); - return tx; + return io_send_response_pointer(resp, offset, SUCCESS); } uint8_t helper_send_response_sign_transaction() { diff --git a/src/helper/send_response.h b/src/helper/send_response.h index eba64b0..9d26f58 100644 --- a/src/helper/send_response.h +++ b/src/helper/send_response.h @@ -4,6 +4,6 @@ #include "io.h" int helper_send_response_public_key(); -uint8_t helper_send_response_address(); +int helper_send_response_address(); uint8_t helper_send_response_sign_transaction(); uint8_t helper_send_response_sign(); diff --git a/src/main.c b/src/main.c index a942a2f..8fc37df 100644 --- a/src/main.c +++ b/src/main.c @@ -229,11 +229,23 @@ void app_main(void) { cmd.lc, cmd.lc, cmd.data); - // Dispatch structured APDU command to handler - if (apdu_dispatcher(&cmd, &flags) < 0) { - PRINTF("=> apdu_dispatcher failure\n"); - return; + BEGIN_TRY { + TRY { + // Dispatch structured APDU command to handler + if (apdu_dispatcher(&cmd, &flags) < 0) { + PRINTF("=> apdu_dispatcher failure\n"); + return; + } + } + CATCH_OTHER(e) { + PRINTF("=> exception: %d\n", e); + io_send_sw(e); + return; + } + FINALLY { + } } + END_TRY; // volatile unsigned short sw = 0; // BEGIN_TRY { diff --git a/src/ui/action/validate.c b/src/ui/action/validate.c index 322847b..46a40cc 100644 --- a/src/ui/action/validate.c +++ b/src/ui/action/validate.c @@ -26,4 +26,12 @@ void validate_pubkey(bool choice) { } else { io_send_sw(ERR_USER_REJECTED); } +} + +void validate_address(bool choice) { + if (choice) { + helper_send_response_address(); + } else { + io_send_sw(ERR_USER_REJECTED); + } } \ No newline at end of file diff --git a/src/ui/action/validate.h b/src/ui/action/validate.h index 94ef27d..d7fc317 100644 --- a/src/ui/action/validate.h +++ b/src/ui/action/validate.h @@ -11,6 +11,14 @@ */ void validate_pubkey(bool choice); +/** + * Action for address validation and export. + * + * @param[in] choice + * User choice (either approved or rejectd). + * + */ +void validate_address(bool choice); /** * Action for transaction information validation. * diff --git a/src/ui/display_bagl.c b/src/ui/display_bagl.c index dfdec13..e0bb5ad 100644 --- a/src/ui/display_bagl.c +++ b/src/ui/display_bagl.c @@ -12,6 +12,11 @@ static void ui_action_validate_pubkey(bool choice) { ui_main_menu(); } +static void ui_action_validate_address(bool choice) { + validate_address(choice); + ui_main_menu(); +} + // Screens and flows UX_STEP_NOCB(ux_display_address_flow_1_step, pnn, @@ -28,14 +33,14 @@ UX_STEP_NOCB(ux_display_address_flow_2_step, }); UX_STEP_CB(ux_display_address_flow_3_step, pb, - send_response(0, false), + (*g_validate_callback)(false), { &C_icon_crossmark, "Reject", }); UX_STEP_CB(ux_display_address_flow_4_step, pb, - send_response(set_result_get_address(), true), + (*g_validate_callback)(true), { &C_icon_validate_14, "Approve", @@ -185,6 +190,7 @@ UX_FLOW(ux_sign_transaction_transfer_flow, // Display functions void ui_display_address() { + g_validate_callback = &ui_action_validate_address; ux_flow_init(0, ux_display_address_flow, NULL); } diff --git a/tests/snapshots/nanosp/test_get_address_wallet_v3_confirm_accepted/00001.png b/tests/snapshots/nanosp/test_get_address_wallet_v3_confirm_accepted/00001.png index 22d76bffbe0c12d657b0c4e004cff6cd552dc00b..b0fb95c2cfac3c69ca7b1d8de2628c54755efe3e 100644 GIT binary patch delta 866 zcmV-o1D*Vn2l)n&B!56jL_t(|ob8%f(%c{ngh?tl;r>VRUGm@xMWL<5;&JBh?`evW zEU{RIwo4&|5JCtc$)!dFUNjYK7P2q<@$%^zKh={E?T;DkB%vh9Bb9A*4qB< zfBRl5{Mmj*AGHta-B4?_1_E!H%fa#8&XGI7T5kP-4*$wN%YUU;YgGq&@Rcn?2x)*I zLvP{W9WZ1JuKl?y^aE32<+#>o0| zY>@f`GM(Ncr|y8h;0}$$;zDX`v$1xH(jbi6P`3bmh`#a3=kr&wUJp+nQ@)@7<*7gj zA>^m<%lczldw&_WYwD(R2!tG|)C&%2I6?j7{p+iFB0UZJ4uR;JgN>yisylAg0Qr$h zHEi(>oPMQ(N;V(FvI-2(HGvqX)`t?^oAM$PUd_ePd91pJr{Nesvp5oJs8#Gzj$yB4 zWoRW^l{fm9-bR-4=>ct*y;lSHrU86K;Y|QIUK1S~N`GqK!`@(pmGx^qZzqC=X*~T# z>}H}CeU^=s$)s z)ExbX;T(JtR-sQ43^M27C~|lqHMH2;9->XQM!Ek(G|p6u6RT)jMo^0dL*N>445ALI zW|oa=nSYWk=ZyUfLxFQHpHOOT9Q-h=@y>%Tt_B`WBPT^T<)!4$gwjP7VGteEkFI*D zy3NGlc9B4gYrmyf=4g`zSYJ}VL>P<_i3XQ(ROQvOblg*T6R@t|E_xl(=`1Z4M4i#; zRQIc)?^idoZ<7vb@;8&u0JRaX%j?3bwdIv{9Dk1`eeV`Te4Ue82_b|KLVhf!8rtw* z(<53!!A{GdCAi^pG*QP)UO&6PR8zJ372^w;s^$lZrlAt)1VUV_Or)b_hKIvbl}xIk zi^pBueJ&8_viE$nUklnB$#=KD|H0>}U1!BcH4Dp>pX&T@fwwSXfV<;$N&TJ5e>&o# zV_Q%Bb+p=|N{N1?&^;CCRqD!0s=);KlGbqblsX?KXIZ{&^vl|(uI2>D!Ntp5&3{0d sdK=|z4UuO+Dvh~Vgb+dqA%wh|zg$ITr-G)ukpKVy07*qoM6N<$f@trxc>n+a delta 892 zcmV-?1B3ke29pPnB!5~-L_t(|ob8%jlH4E+gh?tl;r>VBE_s*=#UiQI2=HuX^*wp8 zK(hEV?I|Tmk|arzBuPGr)>>}eyoKtp;nIqmPW=|ZtVf(!lqgWikI|F*N<&o=R2T>KF;*lnl6o*@da#{ z^@k)J-X^zZz_{Q}h11|-*4A!gy(vlq*KbFC1sGk7g-`C!AI1K9c>9?0`TQ@tLXsp& z@>BR_-3V(h(|_xlbpjY2F-Iy!+lifrdjLyP67Yq8F2m@WlMSyRT9Plg*bEia0wqj@ z%umT-ElBNWb%d6$lIIdugX3Lw7^)?VBhnZC$vhg0pbc0yYAt-t6ozfADvUAN!gDiV zY3ziN56~BA5P-D7&BlVc0qOvE|0HeHTIK5?ngmY#g0nXZ9aMNp)ubVX_b2 zNv=Zg#7T1Y!Bu2>O*OPvAO*$Og{u*&B}F^$FlSmUKw9lIPk&WCf(HSO@3J}}CWQp+ zDoZ7dv45q{OvbLVgd4{}u4c?X34_sH;Mr#>j@1CdO)*EXfJfXtpdG&hP-)5~Nf2?Ut8Rm&DfylY*!k$WYX}yrryS z-BQ~Rn7I+gLft(HO9heC`P90bmhuGT+PFckvKlJJ=>SVXWPFh7qh$#i#C}O#(^_+| z>UEAaJJsyG7PNE1X4FU3e&6+k^$o6jbX;28nJ@zSE`WUXNRlK;k|arz_wX0@fOf&- S=vuh|0000xyv3pMHFMlAvS5N|9hGU zCBzUzSSbJi0KnJSwr$%s|0Sb-RDZgA*?o|8lDhYk(P;Y^8SS4X<5+7gqwclkvQEb1 z{D!w^7(T#oCe~WDDELc;v`fyPhl_s$x`1|XL-%aM!lKOCVSk{z-^vp07H4TM%|%&n zK-XR8+@EWq4X!iXUA0q_BUZ{9P!bl^+9*dsw{Pv~*s|3tcmVc(x2fQn(`9APS6;srWPeTL>-0)V+qkjIETfI4_8s%?v_m0T;<+^ahtarE(q2m4|70CSypJoB zcfs6WdK|qo62*ShbNJ=ysdKhV006fNZUDtK_PZ{N-+Ed-jZi6hdsCnNjDlH#lMg5~>9COY|YhHO=mRa#Q zKjAeR)CW*UV$Qi01^*FM>y-2IaPc#s3TQPOs%KLVrpB061AkpzE045pF{(9b-n424 zRLymc{ka;-;5x%y6&o5Hv6id>X~CkJ3#k`$`_`U@ZCky9JK%12nF?MxT^9BXE<2ld z^N+vg=@!1}E4Dg2C#VZuYdLL==!r$xc=M@NdwDyfRqzVQhpTrg4;Rt_AuRy_;7{;t zsG-~VRUGm@xMWL<5;&JBh?`evW zEU{RIwo4&|5JCtc$)!dFUNjYK7P2q<@$%^zKh={E?T;DkB%vh9Bb9A*4qB< zfBRl5{Mmj*AGHta-B4?_1_E!H%fa#8&XGI7T5kP-4*$wN%YUU;YgGq&@Rcn?2x)*I zLvP{W9WZ1JuKl?y^aE32<+#>o0| zY>@f`GM(Ncr|y8h;0}$$;zDX`v$1xH(jbi6P`3bmh`#a3=kr&wUJp+nQ@)@7<*7gj zA>^m<%lczldw&_WYwD(R2!tG|)C&%2I6?j7{p+iFB0UZJ4uR;JgN>yisylAg0Qr$h zHEi(>oPMQ(N;V(FvI-2(HGvqX)`t?^oAM$PUd_ePd91pJr{Nesvp5oJs8#Gzj$yB4 zWoRW^l{fm9-bR-4=>ct*y;lSHrU86K;Y|QIUK1S~N`GqK!`@(pmGx^qZzqC=X*~T# z>}H}CeU^=s$)s z)ExbX;T(JtR-sQ43^M27C~|lqHMH2;9->XQM!Ek(G|p6u6RT)jMo^0dL*N>445ALI zW|oa=nSYWk=ZyUfLxFQHpHOOT9Q-h=@y>%Tt_B`WBPT^T<)!4$gwjP7VGteEkFI*D zy3NGlc9B4gYrmyf=4g`zSYJ}VL>P<_i3XQ(ROQvOblg*T6R@t|E_xl(=`1Z4M4i#; zRQIc)?^idoZ<7vb@;8&u0JRaX%j?3bwdIv{9Dk1`eeV`Te4Ue82_b|KLVhf!8rtw* z(<53!!A{GdCAi^pG*QP)UO&6PR8zJ372^w;s^$lZrlAt)1VUV_Or)b_hKIvbl}xIk zi^pBueJ&8_viE$nUklnB$#=KD|H0>}U1!BcH4Dp>pX&T@fwwSXfV<;$N&TJ5e>&o# zV_Q%Bb+p=|N{N1?&^;CCRqD!0s=);KlGbqblsX?KXIZ{&^vl|(uI2>D!Ntp5&3{0d sdK=|z4UuO+Dvh~Vgb+dqA%wh|zg$ITr-G)ukpKVy07*qoM6N<$f@trxc>n+a delta 892 zcmV-?1B3ke29pPnB!5~-L_t(|ob8%jlH4E+gh?tl;r>VBE_s*=#UiQI2=HuX^*wp8 zK(hEV?I|Tmk|arzBuPGr)>>}eyoKtp;nIqmPW=|ZtVf(!lqgWikI|F*N<&o=R2T>KF;*lnl6o*@da#{ z^@k)J-X^zZz_{Q}h11|-*4A!gy(vlq*KbFC1sGk7g-`C!AI1K9c>9?0`TQ@tLXsp& z@>BR_-3V(h(|_xlbpjY2F-Iy!+lifrdjLyP67Yq8F2m@WlMSyRT9Plg*bEia0wqj@ z%umT-ElBNWb%d6$lIIdugX3Lw7^)?VBhnZC$vhg0pbc0yYAt-t6ozfADvUAN!gDiV zY3ziN56~BA5P-D7&BlVc0qOvE|0HeHTIK5?ngmY#g0nXZ9aMNp)ubVX_b2 zNv=Zg#7T1Y!Bu2>O*OPvAO*$Og{u*&B}F^$FlSmUKw9lIPk&WCf(HSO@3J}}CWQp+ zDoZ7dv45q{OvbLVgd4{}u4c?X34_sH;Mr#>j@1CdO)*EXfJfXtpdG&hP-)5~Nf2?Ut8Rm&DfylY*!k$WYX}yrryS z-BQ~Rn7I+gLft(HO9heC`P90bmhuGT+PFckvKlJJ=>SVXWPFh7qh$#i#C}O#(^_+| z>UEAaJJsyG7PNE1X4FU3e&6+k^$o6jbX;28nJ@zSE`WUXNRlK;k|arz_wX0@fOf&- S=vuh|0000xyv3pMHFMlAvS5N|9hGU zCBzUzSSbJi0KnJSwr$%s|0Sb-RDZgA*?o|8lDhYk(P;Y^8SS4X<5+7gqwclkvQEb1 z{D!w^7(T#oCe~WDDELc;v`fyPhl_s$x`1|XL-%aM!lKOCVSk{z-^vp07H4TM%|%&n zK-XR8+@EWq4X!iXUA0q_BUZ{9P!bl^+9*dsw{Pv~*s|3tcmVc(x2fQn(`9APS6;srWPeTL>-0)V+qkjIETfI4_8s%?v_m0T;<+^ahtarE(q2m4|70CSypJoB zcfs6WdK|qo62*ShbNJ=ysdKhV006fNZUDtK_PZ{N-+Ed-jZi6hdsCnNjDlH#lMg5~>9COY|YhHO=mRa#Q zKjAeR)CW*UV$Qi01^*FM>y-2IaPc#s3TQPOs%KLVrpB061AkpzE045pF{(9b-n424 zRLymc{ka;-;5x%y6&o5Hv6id>X~CkJ3#k`$`_`U@ZCky9JK%12nF?MxT^9BXE<2ld z^N+vg=@!1}E4Dg2C#VZuYdLL==!r$xc=M@NdwDyfRqzVQhpTrg4;Rt_AuRy_;7{;t zsG-~ Date: Tue, 18 Feb 2025 20:39:57 +0100 Subject: [PATCH 28/67] feat: add sign message APDU command handler and UI flow This commit introduces the sign message functionality with several key improvements: - Implement handleSign function in sign.c with buffer-based input - Update dispatcher to support INS_SIGN command - Add sign validation and UI confirmation flow - Modify send_response helper to return int for sign response - Update UI display logic to use a generic validation callback - Add validate_sign function for message signing and rejection - Refactor sign handler to use new buffer and error handling approach --- src/apdu/dispatcher.c | 16 +++++++ src/handler/sign.c | 20 ++++----- src/handler/sign.h | 14 ++---- src/handler/sign_transaction.h | 8 ++-- src/helper/send_response.c | 36 ++++----------- src/helper/send_response.h | 2 +- src/ui/action/validate.c | 41 +++++++++++++++++- src/ui/action/validate.h | 9 +++- src/ui/display_bagl.c | 10 ++++- .../nanosp/test_sign_message/00001.png | Bin 487 -> 495 bytes .../nanosp/test_sign_message/00002.png | Bin 416 -> 416 bytes 11 files changed, 98 insertions(+), 58 deletions(-) diff --git a/src/apdu/dispatcher.c b/src/apdu/dispatcher.c index afca2ad..55101be 100644 --- a/src/apdu/dispatcher.c +++ b/src/apdu/dispatcher.c @@ -29,6 +29,8 @@ #include "handler/get_public_key.h" #include "handler/sign_transaction.h" #include "handler/get_address.h" +#include "handler/sign.h" + int apdu_dispatcher(const command_t* cmd, volatile unsigned int* flags) { LEDGER_ASSERT(cmd != NULL, "NULL cmd"); @@ -82,6 +84,20 @@ int apdu_dispatcher(const command_t* cmd, volatile unsigned int* flags) { buf.offset = 0; return handleGetAddress(&buf, (bool) cmd->p1, flags); + case INS_SIGN: + if (cmd->p1 != 1 || cmd->p2 > 0) { + return io_send_sw(ERR_WRONG_P1P2); + } + if (cmd->lc == 0) { + return io_send_sw(ERR_WRONG_DATA_LENGTH); + } + + buf.ptr = cmd->data; + buf.size = cmd->lc; + buf.offset = 0; + + return handleSign(&buf, flags); + // case SIGN_TX: // if ((cmd->p1 == P1_START && cmd->p2 != P2_MORE) || // // cmd->p1 > P1_MAX || // diff --git a/src/handler/sign.c b/src/handler/sign.c index bbde721..8ccf25e 100644 --- a/src/handler/sign.c +++ b/src/handler/sign.c @@ -1,25 +1,24 @@ #include "format.h" +#include "read.h" +#include "buffer.h" #include "apdu_constants.h" #include "utils.h" #include "errors.h" #include "ui/display.h" +#include "helper/send_response.h" static const char SIGN_MAGIC[] = {0xFF, 0xFF, 0xFF, 0xFF}; -void handleSign(uint8_t* dataBuffer, - __attribute__((unused)) uint16_t dataLength, - volatile unsigned int* flags) { +int handleSign(buffer_t* cdata, volatile unsigned int* flags) { SignContext_t* context = &data_context.sign_context; - size_t offset = 0; + VALIDATE(cdata->size >= sizeof(context->account_number), ERR_INVALID_REQUEST); + context->account_number = read_u32_be(cdata->ptr, cdata->offset); + cdata->offset += sizeof(context->account_number); - VALIDATE(dataLength >= offset + sizeof(context->account_number), ERR_INVALID_REQUEST); - context->account_number = readUint32BE(dataBuffer + offset); - offset += sizeof(context->account_number); - - VALIDATE(dataLength >= offset + TO_SIGN_LENGTH, ERR_INVALID_REQUEST); + VALIDATE(cdata->size >= cdata->offset + TO_SIGN_LENGTH, ERR_INVALID_REQUEST); memcpy(context->to_sign, SIGN_MAGIC, SIGN_MAGIC_LENGTH); - memcpy(context->to_sign + SIGN_MAGIC_LENGTH, dataBuffer + offset, TO_SIGN_LENGTH); + memcpy(context->to_sign + SIGN_MAGIC_LENGTH, cdata->ptr + cdata->offset, TO_SIGN_LENGTH); format_hex(context->to_sign, SIGN_MAGIC_LENGTH + TO_SIGN_LENGTH, context->to_sign_str, @@ -27,4 +26,5 @@ void handleSign(uint8_t* dataBuffer, ui_display_sign(); *flags |= IO_ASYNCH_REPLY; + return 0; } diff --git a/src/handler/sign.h b/src/handler/sign.h index 3826256..79a13ae 100644 --- a/src/handler/sign.h +++ b/src/handler/sign.h @@ -1,16 +1,10 @@ -#ifndef __SIGN_H__ -#define __SIGN_H__ +#pragma once #include - +#include "buffer.h" /** * Handles the sign command - * @param dataBuffer input data buffer - * @param dataLength length of input data + * @param cdata input data buffer * @param flags pointer to flags */ -void handleSign(uint8_t* dataBuffer, - uint16_t dataLength, - volatile unsigned int* flags); - -#endif // __SIGN_H__ +int handleSign(buffer_t* cdata, volatile unsigned int* flags); diff --git a/src/handler/sign_transaction.h b/src/handler/sign_transaction.h index b26b6d4..37d8c5f 100644 --- a/src/handler/sign_transaction.h +++ b/src/handler/sign_transaction.h @@ -12,7 +12,7 @@ * @param more indicates if more chunks are expected */ void handleSignTransaction(uint8_t* dataBuffer, - uint16_t dataLength, - volatile unsigned int* flags, - bool is_first_chunk, - bool more); + uint16_t dataLength, + volatile unsigned int* flags, + bool is_first_chunk, + bool more); diff --git a/src/helper/send_response.c b/src/helper/send_response.c index 747a9a6..a78f877 100644 --- a/src/helper/send_response.c +++ b/src/helper/send_response.c @@ -60,32 +60,12 @@ uint8_t helper_send_response_sign_transaction() { return tx; } -uint8_t helper_send_response_sign() { - cx_ecfp_private_key_t privateKey; - SignContext_t* context = &data_context.sign_context; - cx_err_t error; - BEGIN_TRY { - TRY { - get_private_key(context->account_number, &privateKey); - error = cx_eddsa_sign_no_throw(&privateKey, - CX_SHA512, - context->to_sign, - SIGN_MAGIC_LENGTH + TO_SIGN_LENGTH, - context->signature, - SIGNATURE_LENGTH); - if (error != CX_OK) { - THROW(ERR_SIGNING_FAILED); - } - } - FINALLY { - explicit_bzero(&privateKey, sizeof(privateKey)); - } - } - END_TRY; - - uint8_t tx = 0; - G_io_apdu_buffer[tx++] = SIGNATURE_LENGTH; - memmove(G_io_apdu_buffer + tx, context->signature, SIGNATURE_LENGTH); - tx += SIGNATURE_LENGTH; - return tx; +int helper_send_response_sign() { + uint8_t resp[1 + SIGNATURE_LENGTH] = {0}; + size_t offset = 0; + resp[offset++] = SIGNATURE_LENGTH; + memmove(resp + offset, data_context.sign_context.signature, SIGNATURE_LENGTH); + offset += SIGNATURE_LENGTH; + // reset_app_context(); + return io_send_response_pointer(resp, offset, SUCCESS); } diff --git a/src/helper/send_response.h b/src/helper/send_response.h index 9d26f58..ca67389 100644 --- a/src/helper/send_response.h +++ b/src/helper/send_response.h @@ -6,4 +6,4 @@ int helper_send_response_public_key(); int helper_send_response_address(); uint8_t helper_send_response_sign_transaction(); -uint8_t helper_send_response_sign(); +int helper_send_response_sign(); diff --git a/src/ui/action/validate.c b/src/ui/action/validate.c index 46a40cc..ea03f81 100644 --- a/src/ui/action/validate.c +++ b/src/ui/action/validate.c @@ -15,10 +15,12 @@ * limitations under the License. *****************************************************************************/ +#include "io.h" #include "validate.h" #include "errors.h" +#include "globals.h" +#include "utils.h" #include "helper/send_response.h" -#include "io.h" void validate_pubkey(bool choice) { if (choice) { @@ -34,4 +36,39 @@ void validate_address(bool choice) { } else { io_send_sw(ERR_USER_REJECTED); } -} \ No newline at end of file +} + +static int crypto_sign_message(void) { + cx_ecfp_private_key_t privateKey; + SignContext_t* context = &data_context.sign_context; + cx_err_t error; + + if (get_private_key(context->account_number, &privateKey) != 0) { + return -1; + } + error = cx_eddsa_sign_no_throw(&privateKey, + CX_SHA512, + context->to_sign, + SIGN_MAGIC_LENGTH + TO_SIGN_LENGTH, + context->signature, + SIGNATURE_LENGTH); + if (error != CX_OK) { + return -2; + } + + explicit_bzero(&privateKey, sizeof(privateKey)); + PRINTF("Signature: %.*H\n", SIGNATURE_LENGTH, context->signature); + return 0; +} + +void validate_sign(bool choice) { + if (choice) { + if (crypto_sign_message() != 0) { + io_send_sw(ERR_SIGNING_FAILED); + } else { + helper_send_response_sign(); + } + } else { + io_send_sw(ERR_USER_REJECTED); + } +} diff --git a/src/ui/action/validate.h b/src/ui/action/validate.h index d7fc317..82a9ecf 100644 --- a/src/ui/action/validate.h +++ b/src/ui/action/validate.h @@ -26,4 +26,11 @@ void validate_address(bool choice); * User choice (either approved or rejectd). * */ -void validate_transaction(bool choice); \ No newline at end of file +void validate_transaction(bool choice); + +/** + * Action for sign validation. + * + * @param[in] choice + */ +void validate_sign(bool choice); \ No newline at end of file diff --git a/src/ui/display_bagl.c b/src/ui/display_bagl.c index e0bb5ad..925bbee 100644 --- a/src/ui/display_bagl.c +++ b/src/ui/display_bagl.c @@ -17,6 +17,11 @@ static void ui_action_validate_address(bool choice) { ui_main_menu(); } +static void ui_action_validate_sign(bool choice) { + validate_sign(choice); + ui_main_menu(); +} + // Screens and flows UX_STEP_NOCB(ux_display_address_flow_1_step, pnn, @@ -93,7 +98,7 @@ UX_STEP_NOCB(ux_sign_flow_2_step, }); UX_STEP_CB(ux_sign_flow_3_step, pbb, - send_response(0, false), + (*g_validate_callback)(false), { &C_icon_crossmark, "Cancel", @@ -101,7 +106,7 @@ UX_STEP_CB(ux_sign_flow_3_step, }); UX_STEP_CB(ux_sign_flow_4_step, pbb, - send_response(set_result_sign(), true), + (*g_validate_callback)(true), { &C_icon_validate_14, "Sign", @@ -200,6 +205,7 @@ void ui_display_public_key() { } void ui_display_sign() { + g_validate_callback = &ui_action_validate_sign; ux_flow_init(0, ux_sign_flow, NULL); } diff --git a/tests/snapshots/nanosp/test_sign_message/00001.png b/tests/snapshots/nanosp/test_sign_message/00001.png index 35838d9c37a584b925b90214d8dc68ffcdc03d96..e17b3f663bddc3e30d5fc0d2b8226880fc662e68 100644 GIT binary patch delta 469 zcmV;`0V@9I1MdTnB!9L^L_t(|obB0Ba)clZfMMF%n|S{tahEo5=^mPio)@2O3z zV1ij?LjV8(0EYW9JXefy|6$voZZNcekN;z_F&pOl23GMt`=iP$Vw>AAN|d+ms`= z5a-b2mODUnOj=obr@gpmh{nUSs)#{D_610rkJyOHm7XSUUzlYoYn2caWR)-5b}zcC z1)b(S`;*dtbXljmI8EVfjX^8pT2S~dc4bj3k=kO+&L$3#jV>m%c5el#8P4-m?ItUU zQX%E2{&D-g>wi7KWaZi}f6F)F!D`Q=0Dwl-&w#SS`bNUp+wxN)t(50t$4I%i^Q=he zF^{3;B6?z^^q2yyO52LC+PgRW4q!c60p`Dd7eEVgmKR{a4)~j$q?hauP)#z~A4W(u z*&mD=c%ln=;&a&3we*(Xe-i1Bw3=-nagE4j<-tVyBTgx{BAihGXB5C01#m_I0000m znc4Oc*NC*5Z69%s$YrzbBd!ri@h0qy0yv`p&M1I03IG5A0KCs1zPFCmah)f400000 LNkvXXu0mjfb}{0X delta 461 zcmV;;0W$vY1Lp&fB!8|+L_t(|obA|Aa)lraKvCLxJ8}O@axeXG9>YM0P$FUQp0Ao# zzyv800ssI2Fx`(~TjzORKODzVi?}<_Gabw|!dgUpBHL&AHEe5rF`?pRlx9DxgmTya zd<@%)u4y6;G!2%|)*cB`B9uSYN1_bxX;a^TIH$x+We=Q2j(@LEBrg3My^CzMDSK=o zj$y~8;zCr;^fYnT#4J-;tAv;!t9;om_oAnk zpxeA>zf#s8UA9tn4pV5YF=%Dp5){6ZU76HMq&69|*2FHd-o=F0-mM@lhU@IA-DD+E zDx};s-tV|~eSZg-%v{^)Z}}xWS#3WG0I;ENHl|%}6X{bnH}f*9#|9BmbsHM*PaB$W z8KnKp9+7TdZ$K@$MU?q?hbZP)#z~pGHVE*`JIWcw!au z#Q$MWed&GfQ1H!>R_RF@5vxeI@@69AkrYP}&M1I03P#|J0yv`p00013%xdR|dqi5T zc8<75q}yuehhPn8=8F<{cB1ONa4 zO!pPomx$yK$8mU(EEJW&VQfqHqAA+>;O|4ac5`L z+3A;v3%BSrX?9iTNC+1{0d?^)3z1&wb>i~k)v5Gm!pzQKvPR}9u-u#ODnX}tZ@%i( zpT4G2y*W&ymD$OChe7;nsJR2olk?gk+z*<~^$5-8UKup+`i!lL< zF#(IU6Yz**{r@^iFWH~KO)}Y^#z-~UpNu(Ji7K=b=kQ9T7XSbN000000000000000 axXmvJU&8Ch!02dCw~Rpkak44AYb00000 z%l#Pk6=O^vj^k)W+{GAAhnM0hs6Le8Ix3|#qK>i* z$_E>dgtM$w7fY?L2Af-1x&!ipQZrROZ5cWK1d;dhn*J@y<$rudYtziRWe2G8h&wx@ z%uc^VOx&W=q}o-TBf*^g1eC=`Ektsqmx)V@SEjNx6KZw_lQl9=hUH#$R|z`Jd-YYP z{`6Iq>Yu|@TB)7fcNo~ehN?S2JvrwN;eJqUE=Q;~ZwkhBBGdNz9q>R*fHNk* z857{Fo`8p*@89Aiy<~rZW|GPNGD@n+{$k95C#sMq&S6ia7XSbN000000000000000 axXl~Cp0)T1vSBCy0000 Date: Wed, 19 Feb 2025 14:31:15 +0100 Subject: [PATCH 29/67] feat: implement sign transaction APDU command handler and UI flow This commit introduces the sign transaction functionality with several key improvements: - Implement handleSignTransaction function with buffer-based input and chunked data support - Update dispatcher to support INS_SIGN_TRANSACTION command with extended buffer handling - Add transaction validation and UI confirmation flow - Modify send_response helper to return int for sign transaction response - Add crypto_sign_transaction function for transaction signing - Update UI display logic to support transaction signing - Refactor sign transaction handler to use new buffer and error handling approach --- src/apdu/dispatcher.c | 40 +++++--- src/handler/sign_transaction.c | 91 +++++++++--------- src/handler/sign_transaction.h | 15 ++- src/helper/send_response.c | 83 +++++++++------- src/helper/send_response.h | 2 +- src/ui/action/validate.c | 42 ++++++++ src/ui/display_bagl.c | 6 ++ .../nanosp/test_sign_tx_confirm/00002.png | Bin 502 -> 518 bytes .../nanosp/test_sign_tx_transfer/00003.png | Bin 909 -> 872 bytes .../nanosp/test_sign_tx_transfer/00004.png | Bin 506 -> 518 bytes 10 files changed, 173 insertions(+), 106 deletions(-) diff --git a/src/apdu/dispatcher.c b/src/apdu/dispatcher.c index 55101be..14229c1 100644 --- a/src/apdu/dispatcher.c +++ b/src/apdu/dispatcher.c @@ -98,22 +98,30 @@ int apdu_dispatcher(const command_t* cmd, volatile unsigned int* flags) { return handleSign(&buf, flags); - // case SIGN_TX: - // if ((cmd->p1 == P1_START && cmd->p2 != P2_MORE) || // - // cmd->p1 > P1_MAX || // - // (cmd->p2 != P2_LAST && cmd->p2 != P2_MORE)) { - // return io_send_sw(SW_WRONG_P1P2); - // } - - // if (!cmd->data) { - // return io_send_sw(SW_WRONG_DATA_LENGTH); - // } - - // buf.ptr = cmd->data; - // buf.size = cmd->lc; - // buf.offset = 0; - - // return handler_sign_tx(&buf, cmd->p1, (bool) (cmd->p2 & P2_MORE)); + case INS_SIGN_TRANSACTION: + if (cmd->p1 != P1_CONFIRM || (cmd->p2 < 0 || cmd->p2 > 3)) { + return io_send_sw(ERR_WRONG_P1P2); + } + + if (!cmd->data) { + return io_send_sw(ERR_NO_DATA); + } + // P2_MORE is a signal for more apdu to receive in current chunk; + // P2_EXTEND is a signal for extended buffer and can't be in first chunk; + // P2_MORE && !P2_EXTEND = first chunk; + // P2_EXTEND && !P2_MORE = last chunk; + // P2_EXTEND && P2_MORE = ordinary request without chunks; + + // P2_EXTEND is set to signal that this APDU buffer extends, rather + // than replaces, the current message buffer + bool more = (bool) (cmd->p2 & P2_MORE); + bool first_data_chunk = !(cmd->p2 & P2_EXTEND); + + buf.ptr = cmd->data; + buf.size = cmd->lc; + buf.offset = 0; + + return handleSignTransaction(&buf, first_data_chunk, more, flags); default: return io_send_sw(ERR_INS_NOT_SUPPORTED); } diff --git a/src/handler/sign_transaction.c b/src/handler/sign_transaction.c index 9a3e15d..b6a7f61 100644 --- a/src/handler/sign_transaction.c +++ b/src/handler/sign_transaction.c @@ -1,5 +1,8 @@ #include "apdu_constants.h" +#include "buffer.h" +#include "read.h" #include "utils.h" +#include "io.h" #include "errors.h" #include "byte_stream.h" #include "message.h" @@ -7,52 +10,51 @@ #include "response_setter.h" #include "ui/display.h" -void handleSignTransaction(uint8_t* dataBuffer, - uint16_t dataLength, - volatile unsigned int* flags, - bool is_first_chunk, - bool more) { +int handleSignTransaction(buffer_t* cdata, + bool is_first_chunk, + bool more, + volatile unsigned int* flags) { if (is_first_chunk) { reset_app_context(); } SignTransactionContext_t* context = &data_context.sign_tr_context; - size_t offset = 0; - if (is_first_chunk) { - VALIDATE(dataLength >= offset + sizeof(context->account_number), ERR_INVALID_REQUEST); - context->account_number = readUint32BE(dataBuffer + offset); - offset += sizeof(context->account_number); + VALIDATE(cdata->size >= cdata->offset + sizeof(context->account_number), + ERR_INVALID_REQUEST); + context->account_number = read_u32_be(cdata->ptr, cdata->offset); + cdata->offset += sizeof(context->account_number); - VALIDATE(dataLength >= offset + sizeof(context->origin_wallet_type), ERR_INVALID_REQUEST); - context->origin_wallet_type = dataBuffer[offset]; - offset += sizeof(context->origin_wallet_type); + VALIDATE(cdata->size >= cdata->offset + sizeof(context->origin_wallet_type), + ERR_INVALID_REQUEST); + context->origin_wallet_type = cdata->ptr[cdata->offset]; + cdata->offset += sizeof(context->origin_wallet_type); - VALIDATE(dataLength >= offset + sizeof(context->decimals), ERR_INVALID_REQUEST); - context->decimals = dataBuffer[offset]; - offset += sizeof(context->decimals); + VALIDATE(cdata->size >= cdata->offset + sizeof(context->decimals), ERR_INVALID_REQUEST); + context->decimals = cdata->ptr[cdata->offset]; + cdata->offset += sizeof(context->decimals); - VALIDATE(dataLength >= offset + sizeof(uint8_t), ERR_INVALID_REQUEST); - uint8_t ticker_len = dataBuffer[offset]; - offset += sizeof(ticker_len); + VALIDATE(cdata->size >= cdata->offset + sizeof(uint8_t), ERR_INVALID_REQUEST); + uint8_t ticker_len = cdata->ptr[cdata->offset]; + cdata->offset += sizeof(ticker_len); VALIDATE(ticker_len != 0 && ticker_len <= MAX_TICKER_LEN, ERR_TICKER_LENGTH); - VALIDATE(dataLength >= offset + ticker_len, ERR_INVALID_REQUEST); - memcpy(context->ticker, dataBuffer + offset, ticker_len); - offset += ticker_len; + VALIDATE(cdata->size >= cdata->offset + ticker_len, ERR_INVALID_REQUEST); + memcpy(context->ticker, cdata->ptr + cdata->offset, ticker_len); + cdata->offset += ticker_len; - VALIDATE(dataLength >= offset + sizeof(uint8_t), ERR_INVALID_REQUEST); - uint8_t metadata = dataBuffer[offset]; - offset += sizeof(metadata); + VALIDATE(cdata->size >= cdata->offset + sizeof(uint8_t), ERR_INVALID_REQUEST); + uint8_t metadata = cdata->ptr[cdata->offset]; + cdata->offset += sizeof(metadata); // Read wallet type if present if (metadata & FLAG_WITH_WALLET_ID) { - VALIDATE(dataLength >= offset + sizeof(context->current_wallet_type), + VALIDATE(cdata->size >= cdata->offset + sizeof(context->current_wallet_type), ERR_INVALID_REQUEST); - context->current_wallet_type = dataBuffer[offset]; - offset += sizeof(context->current_wallet_type); + context->current_wallet_type = cdata->ptr[cdata->offset]; + cdata->offset += sizeof(context->current_wallet_type); } else { context->current_wallet_type = context->origin_wallet_type; } @@ -64,16 +66,16 @@ void handleSignTransaction(uint8_t* dataBuffer, // Read wc if present context->wc = DEFAULT_WORKCHAIN_ID; if (metadata & FLAG_WITH_WORKCHAIN_ID) { - VALIDATE(dataLength >= offset + sizeof(context->wc), ERR_INVALID_REQUEST); - context->wc = dataBuffer[offset]; - offset += sizeof(context->wc); + VALIDATE(cdata->size >= cdata->offset + sizeof(context->wc), ERR_INVALID_REQUEST); + context->wc = cdata->ptr[cdata->offset]; + cdata->offset += sizeof(context->wc); } // Read initial address if present if (metadata & FLAG_WITH_ADDRESS) { - VALIDATE(dataLength >= offset + sizeof(context->address), ERR_INVALID_REQUEST); - memcpy(context->prepend_address, dataBuffer + offset, ADDRESS_LENGTH); - offset += sizeof(context->address); + VALIDATE(cdata->size >= cdata->offset + sizeof(context->address), ERR_INVALID_REQUEST); + memcpy(context->prepend_address, cdata->ptr + cdata->offset, ADDRESS_LENGTH); + cdata->offset += sizeof(context->address); } else { memcpy(context->prepend_address, context->address, ADDRESS_LENGTH); } @@ -82,20 +84,20 @@ void handleSignTransaction(uint8_t* dataBuffer, if (metadata & FLAG_WITH_CHAIN_ID) { context->sign_with_chain_id = true; - VALIDATE(dataLength >= offset + sizeof(context->chain_id), ERR_INVALID_REQUEST); - memcpy(context->chain_id, dataBuffer + offset, CHAIN_ID_LENGTH); - offset += sizeof(context->chain_id); + VALIDATE(cdata->size >= cdata->offset + sizeof(context->chain_id), ERR_INVALID_REQUEST); + memcpy(context->chain_id, cdata->ptr + cdata->offset, CHAIN_ID_LENGTH); + cdata->offset += sizeof(context->chain_id); } else { context->sign_with_chain_id = false; } } - // offset is a pointer to dataBuffer, or the number of bytes we moved. here + offset means start - // of the message we need to save data to a context buffer and add msg_length to offset of this - // buffer - uint8_t* msg_begin = dataBuffer + offset; + // cdata->offset is a pointer to cdata->ptr, or the number of bytes we moved. here + + // cdata->offset means start of the message we need to save data to a context buffer and add + // msg_length to cdata->offset of this buffer + uint8_t* msg_begin = (uint8_t*) (cdata->ptr + cdata->offset); - // Since we check LC dataLength can not be manipulated - uint16_t msg_length = dataLength - offset; + // Since we check LC cdata->size can not be manipulated + uint16_t msg_length = cdata->size - cdata->offset; if (msg_begin && msg_length > 0) { // if data exists VALIDATE(context->data_offset + msg_length < sizeof(context->data), ERR_INVALID_DATA); @@ -104,7 +106,7 @@ void handleSignTransaction(uint8_t* dataBuffer, } if (more) { - THROW(SUCCESS); + return io_send_sw(SUCCESS); } // Handle transaction @@ -116,4 +118,5 @@ void handleSignTransaction(uint8_t* dataBuffer, ui_display_sign_transaction(flow); *flags |= IO_ASYNCH_REPLY; + return 0; } diff --git a/src/handler/sign_transaction.h b/src/handler/sign_transaction.h index 37d8c5f..635cb6b 100644 --- a/src/handler/sign_transaction.h +++ b/src/handler/sign_transaction.h @@ -5,14 +5,13 @@ /** * Handles the sign transaction command - * @param dataBuffer input data buffer - * @param dataLength length of input data - * @param flags pointer to flags + * @param cdata input data buffer * @param is_first_chunk indicates if this is the first chunk of data * @param more indicates if more chunks are expected + * @param flags pointer to flags + * @return 0 on success, -1 on error */ -void handleSignTransaction(uint8_t* dataBuffer, - uint16_t dataLength, - volatile unsigned int* flags, - bool is_first_chunk, - bool more); +int handleSignTransaction(buffer_t* cdata, + bool is_first_chunk, + bool more, + volatile unsigned int* flags); diff --git a/src/helper/send_response.c b/src/helper/send_response.c index a78f877..30cc407 100644 --- a/src/helper/send_response.c +++ b/src/helper/send_response.c @@ -20,45 +20,45 @@ int helper_send_response_address() { return io_send_response_pointer(resp, offset, SUCCESS); } -uint8_t helper_send_response_sign_transaction() { - cx_ecfp_private_key_t privateKey; - SignTransactionContext_t* context = &data_context.sign_tr_context; - cx_err_t error; +// uint8_t helper_send_response_sign_transaction() { +// cx_ecfp_private_key_t privateKey; +// SignTransactionContext_t* context = &data_context.sign_tr_context; +// cx_err_t error; - BEGIN_TRY { - TRY { - get_private_key(context->account_number, &privateKey); - if (!context->sign_with_chain_id) { - error = cx_eddsa_sign_no_throw(&privateKey, - CX_SHA512, - context->to_sign, - TO_SIGN_LENGTH, - context->signature, - SIGNATURE_LENGTH); - } else { - error = cx_eddsa_sign_no_throw(&privateKey, - CX_SHA512, - context->to_sign, - CHAIN_ID_LENGTH + TO_SIGN_LENGTH, - context->signature, - SIGNATURE_LENGTH); - } - if (error != CX_OK) { - THROW(ERR_SIGNING_FAILED); - } - } - FINALLY { - explicit_bzero(&privateKey, sizeof(privateKey)); - } - } - END_TRY; +// BEGIN_TRY { +// TRY { +// get_private_key(context->account_number, &privateKey); +// if (!context->sign_with_chain_id) { +// error = cx_eddsa_sign_no_throw(&privateKey, +// CX_SHA512, +// context->to_sign, +// TO_SIGN_LENGTH, +// context->signature, +// SIGNATURE_LENGTH); +// } else { +// error = cx_eddsa_sign_no_throw(&privateKey, +// CX_SHA512, +// context->to_sign, +// CHAIN_ID_LENGTH + TO_SIGN_LENGTH, +// context->signature, +// SIGNATURE_LENGTH); +// } +// if (error != CX_OK) { +// THROW(ERR_SIGNING_FAILED); +// } +// } +// FINALLY { +// explicit_bzero(&privateKey, sizeof(privateKey)); +// } +// } +// END_TRY; - uint8_t tx = 0; - G_io_apdu_buffer[tx++] = SIGNATURE_LENGTH; - memmove(G_io_apdu_buffer + tx, context->signature, SIGNATURE_LENGTH); - tx += SIGNATURE_LENGTH; - return tx; -} +// uint8_t tx = 0; +// G_io_apdu_buffer[tx++] = SIGNATURE_LENGTH; +// memmove(G_io_apdu_buffer + tx, context->signature, SIGNATURE_LENGTH); +// tx += SIGNATURE_LENGTH; +// return tx; +// } int helper_send_response_sign() { uint8_t resp[1 + SIGNATURE_LENGTH] = {0}; @@ -69,3 +69,12 @@ int helper_send_response_sign() { // reset_app_context(); return io_send_response_pointer(resp, offset, SUCCESS); } + +int helper_send_response_sign_transaction() { + uint8_t resp[1 + SIGNATURE_LENGTH] = {0}; + size_t offset = 0; + resp[offset++] = SIGNATURE_LENGTH; + memmove(resp + offset, data_context.sign_tr_context.signature, SIGNATURE_LENGTH); + offset += SIGNATURE_LENGTH; + return io_send_response_pointer(resp, offset, SUCCESS); +} diff --git a/src/helper/send_response.h b/src/helper/send_response.h index ca67389..5ca7d0a 100644 --- a/src/helper/send_response.h +++ b/src/helper/send_response.h @@ -5,5 +5,5 @@ int helper_send_response_public_key(); int helper_send_response_address(); -uint8_t helper_send_response_sign_transaction(); +int helper_send_response_sign_transaction(); int helper_send_response_sign(); diff --git a/src/ui/action/validate.c b/src/ui/action/validate.c index ea03f81..2d66aba 100644 --- a/src/ui/action/validate.c +++ b/src/ui/action/validate.c @@ -72,3 +72,45 @@ void validate_sign(bool choice) { io_send_sw(ERR_USER_REJECTED); } } + +static int crypto_sign_transaction(void) { + cx_ecfp_private_key_t privateKey; + SignTransactionContext_t* context = &data_context.sign_tr_context; + cx_err_t error; + + if (get_private_key(context->account_number, &privateKey) != 0) { + return -1; + } + if (!context->sign_with_chain_id) { + error = cx_eddsa_sign_no_throw(&privateKey, + CX_SHA512, + context->to_sign, + TO_SIGN_LENGTH, + context->signature, + SIGNATURE_LENGTH); + } else { + error = cx_eddsa_sign_no_throw(&privateKey, + CX_SHA512, + context->to_sign, + CHAIN_ID_LENGTH + TO_SIGN_LENGTH, + context->signature, + SIGNATURE_LENGTH); + } + if (error != CX_OK) { + return -2; + } + explicit_bzero(&privateKey, sizeof(privateKey)); + return 0; +} + +void validate_transaction(bool choice) { + if (choice) { + if (crypto_sign_transaction() != 0) { + io_send_sw(ERR_SIGNING_FAILED); + } else { + helper_send_response_sign_transaction(); + } + } else { + io_send_sw(ERR_USER_REJECTED); + } +} \ No newline at end of file diff --git a/src/ui/display_bagl.c b/src/ui/display_bagl.c index 925bbee..b8349cd 100644 --- a/src/ui/display_bagl.c +++ b/src/ui/display_bagl.c @@ -22,6 +22,11 @@ static void ui_action_validate_sign(bool choice) { ui_main_menu(); } +static void ui_action_validate_transaction(bool choice) { + validate_transaction(choice); + ui_main_menu(); +} + // Screens and flows UX_STEP_NOCB(ux_display_address_flow_1_step, pnn, @@ -210,6 +215,7 @@ void ui_display_sign() { } void ui_display_sign_transaction(int flow) { + g_validate_callback = &ui_action_validate_transaction; switch (flow) { case SIGN_TRANSACTION_FLOW_TRANSFER: ux_flow_init(0, ux_sign_transaction_transfer_flow, NULL); diff --git a/tests/snapshots/nanosp/test_sign_tx_confirm/00002.png b/tests/snapshots/nanosp/test_sign_tx_confirm/00002.png index 4668646d53df70e2628c6853fd15411d9d3c9b46..cc3d151dfdcadd1c20874bf522d917db45ba42ac 100644 GIT binary patch delta 492 zcmVdd5i&Ly^Ql_hGt9FM z4+u#}2><{9xb9woVkw7DhN$}Iy_|0)ti zPyDTS(ln_FKO`<3-t9Nx;Uoe%&300FMkQ0u59HQ$q+m%M(Y`hJ<3lZ?(q zwIQ|V&YFR+)PEd#sXd(2dGi&o+v1337^&upI>S=VUjsE)!mRGK;vZuEvy?W{zbLFj zx|J?X)r^Jtxenv3Q(R}RKT@@(3}qW~*7WDDkQ1Q(H|I9GzKM$~ zZ_}czdePsdshTTITm9)}an^c)ImnFuHOf#k`j;^WzlmMwHw^}vIXH^p1poj500000 i0000000000j`;@Fv)->{(Iwje0000D)_K7tKm$V)hA=Fm2=i3@nH$XHt`b`s43^1QYurX z&b!Q@x=gvQOE&8st(A9FlT^%B(Tdf&j?-yt(sy`7L3G?nTz@}%LDwyXt-7Uy>Q6;Q zk%_N`LEkuGTk>6Dzj;S-_459xHa z`|eOXEm@t|Jbww$C8GwwIXPzHM}>_%3lb-bw@NmjjGBj(*14&5z}d;66Q>zgS1%1M zI;v~S6_LL5=^*SXx%gg%L+3o`?!2ewSl4tjluyc}bOFL!@5<7VLo_hUS zC6}f#VB4{4%m9czx|6-X%-35#F;octg|7{H|kY? z$$tIW%uc5Fw`p`Wy}ub_@FaGjCtY+hW3Uw63jhEB000000000000000Eb|Kj^0000U3XUh*+Y2Z3EK40J1#I$tBk zfO#2Hb9GA*LI@#*5aOG-uIsuk{wrX=%OBibTXOxutGQf56LIi-fC<@Ii;qncz! z=kZX2Gj}&NelUG7og_UEqs6HO$eohJMl1fMon!O??0*SRi{zjjJxh8Fulum#d4B@N zw#Go&+N48`NtlUZ8+=cgVG8_^;0=fA&bwWLrIOzC0PZAf_8-HTYR&$`Xbs*(QRq#A zN!A)1Wt`qv4Q0|ktUmH8rdiT{<^ADF=o?m8!$FlMv+T@F_x5Jze>?C>z`03Cq@HnS zxkbX98h;cXCRTPm-h2u3Tf=<6y#8#y+4&OYyDY>5(hC|Z@*LyXY!_3`bnOH87|+=S z@T5MVPZsvkqjvbGmoeLSx3idvD0fGtC)Pt z>q-O*a5_q!Q#Wz@pkHz&cKtSxPeZ{k>0ufg24#?j&X$<%o8?|U+Brj-6=(K@5JCtc bgm|CduP0i=?|9U200000NkvXXu0mjfeAB1X delta 886 zcmV-+1Bv|T28{=hB!5&%L_t(|ob8-l5)>f}gwgUQ-2X^(7ayjiQY0iD{#Muio|MUu zOn?CGmZcCv2qAhYq~Z@=9goG z)E|)P@D@3>0%XDM8oSAb)YfJ*Iw@*{&~L*$0!SCK@#g;gRjk*;)7O;m=U>?s2qA?0 zFZ}QyBWEvp#((eZ!)vO%H0a*Cx3r}n+vxIv#1OjEZ|O$UCIP5uj?CV_YDve}ByhDZ zj4kU3@vqq2}TD{D1iYm|HjghPfVtnc1Rd!1^*e zC`Tjgs#^DB*pmICSAcv+mrGqq*Fknpq(z2=m^sHsBuL$e^c)Nc^`;99lg#X2!$>u= ze;JO!Ct(%(Bteon21n89h1AgEUVM<2)(HN9$3L!(qVl_Pj*?E;W=P2GZ?g=Q()>mu zfhi=I#(ybgahHl07PFz-hZ02X$I0*i;hl9%IV6%F$|IrLI@#* zNCGwVC8af*mZmn~OBbmV@aT}9RaG4u#4L4KM*+3Q6)DjXES(mle^69NiLZ`LD(siZ zn=r1HfKuW#qyBX}GM7{H-M0aO#5ldaM!yv6!g4A@*-?U0mB)!$UZKP9GOO-1kQ|Nt zsBb7GCF&0Ge_WgXZ1cr1r~Z(H9>XPaP>egRZjSnQ{31h$+l1jEX2<`ph*UIN`oADy zhTwi@_JGl**Pe#Kb(SfCb0wi&*#3byjJ7qJvF$vG5<&o#MH?y!geb!90IDc1{c$c`#dubl3dILnb z$-ckV!kpY>x<$2Honx<(IiM9xs(sR~k{(|=6WFoYYx4tm#XS!Ne`C6?oatQgXnr~V zCNhV01s7d zMJy=oN5LkjK6J82AKH%AZ>#wU>YaEuBl#`4e9M{f@D047!22B|7=p}yGmXzOvBedV z8+n;AFr(xRxYe_sH@mZ1wj{sb2?4(Hp#8aK&g{}?0HWdAUp!8_M`d2M>1C*yH` z!b>y^A7D5VYpq%o{3%1)CFkwo;%9&esF)4n*@lTl8MDJci+_9j6s?M*v`KSP)(jBM zb&mbD658N8!!5EM8XU1w_JESGsn$lB1>LUN)3D2Suiy^Y+ube&e`|W5*)zE8)qJ}C z_)A`H;YnYy#o24ZaHG??zp1=jNC$+p1OR}4!N<^@ zcJ`mXyS8r1_rhk5OZu#IK>Av9mC& z+CDRGAI_xxwd+tLA4&U+uKf}s{&h|u?H1?k8P?kt)u%kh@Hw>zdX^wNzIOTAC4V`2 z9gy`kG?uY*I&Uw{EVKqNgIeE|G1m z!G}!3d#kzmR%(!m{$&QCCi)kn4?c-i=#wTvrVmmPUH||9000000000000000Ak8nt Whw!{vzu52q0000 Date: Wed, 19 Feb 2025 14:31:36 +0100 Subject: [PATCH 30/67] test: generate golden snapshots for nanoX --- .../00001.png | Bin 915 -> 889 bytes .../00002.png | Bin 488 -> 498 bytes .../00001.png | Bin 915 -> 889 bytes .../00002.png | Bin 488 -> 498 bytes .../00000.png | Bin 933 -> 904 bytes .../00001.png | Bin 531 -> 556 bytes .../00000.png | Bin 933 -> 904 bytes .../00001.png | Bin 531 -> 556 bytes .../snapshots/nanox/test_sign_message/00001.png | Bin 487 -> 495 bytes .../snapshots/nanox/test_sign_message/00002.png | Bin 416 -> 416 bytes .../nanox/test_sign_tx_confirm/00002.png | Bin 502 -> 518 bytes .../nanox/test_sign_tx_transfer/00003.png | Bin 909 -> 872 bytes .../nanox/test_sign_tx_transfer/00004.png | Bin 506 -> 518 bytes 13 files changed, 0 insertions(+), 0 deletions(-) diff --git a/tests/snapshots/nanox/test_get_address_wallet_v3_confirm_accepted/00001.png b/tests/snapshots/nanox/test_get_address_wallet_v3_confirm_accepted/00001.png index 22d76bffbe0c12d657b0c4e004cff6cd552dc00b..b0fb95c2cfac3c69ca7b1d8de2628c54755efe3e 100644 GIT binary patch delta 866 zcmV-o1D*Vn2l)n&B!56jL_t(|ob8%f(%c{ngh?tl;r>VRUGm@xMWL<5;&JBh?`evW zEU{RIwo4&|5JCtc$)!dFUNjYK7P2q<@$%^zKh={E?T;DkB%vh9Bb9A*4qB< zfBRl5{Mmj*AGHta-B4?_1_E!H%fa#8&XGI7T5kP-4*$wN%YUU;YgGq&@Rcn?2x)*I zLvP{W9WZ1JuKl?y^aE32<+#>o0| zY>@f`GM(Ncr|y8h;0}$$;zDX`v$1xH(jbi6P`3bmh`#a3=kr&wUJp+nQ@)@7<*7gj zA>^m<%lczldw&_WYwD(R2!tG|)C&%2I6?j7{p+iFB0UZJ4uR;JgN>yisylAg0Qr$h zHEi(>oPMQ(N;V(FvI-2(HGvqX)`t?^oAM$PUd_ePd91pJr{Nesvp5oJs8#Gzj$yB4 zWoRW^l{fm9-bR-4=>ct*y;lSHrU86K;Y|QIUK1S~N`GqK!`@(pmGx^qZzqC=X*~T# z>}H}CeU^=s$)s z)ExbX;T(JtR-sQ43^M27C~|lqHMH2;9->XQM!Ek(G|p6u6RT)jMo^0dL*N>445ALI zW|oa=nSYWk=ZyUfLxFQHpHOOT9Q-h=@y>%Tt_B`WBPT^T<)!4$gwjP7VGteEkFI*D zy3NGlc9B4gYrmyf=4g`zSYJ}VL>P<_i3XQ(ROQvOblg*T6R@t|E_xl(=`1Z4M4i#; zRQIc)?^idoZ<7vb@;8&u0JRaX%j?3bwdIv{9Dk1`eeV`Te4Ue82_b|KLVhf!8rtw* z(<53!!A{GdCAi^pG*QP)UO&6PR8zJ372^w;s^$lZrlAt)1VUV_Or)b_hKIvbl}xIk zi^pBueJ&8_viE$nUklnB$#=KD|H0>}U1!BcH4Dp>pX&T@fwwSXfV<;$N&TJ5e>&o# zV_Q%Bb+p=|N{N1?&^;CCRqD!0s=);KlGbqblsX?KXIZ{&^vl|(uI2>D!Ntp5&3{0d sdK=|z4UuO+Dvh~Vgb+dqA%wh|zg$ITr-G)ukpKVy07*qoM6N<$f@trxc>n+a delta 892 zcmV-?1B3ke29pPnB!5~-L_t(|ob8%jlH4E+gh?tl;r>VBE_s*=#UiQI2=HuX^*wp8 zK(hEV?I|Tmk|arzBuPGr)>>}eyoKtp;nIqmPW=|ZtVf(!lqgWikI|F*N<&o=R2T>KF;*lnl6o*@da#{ z^@k)J-X^zZz_{Q}h11|-*4A!gy(vlq*KbFC1sGk7g-`C!AI1K9c>9?0`TQ@tLXsp& z@>BR_-3V(h(|_xlbpjY2F-Iy!+lifrdjLyP67Yq8F2m@WlMSyRT9Plg*bEia0wqj@ z%umT-ElBNWb%d6$lIIdugX3Lw7^)?VBhnZC$vhg0pbc0yYAt-t6ozfADvUAN!gDiV zY3ziN56~BA5P-D7&BlVc0qOvE|0HeHTIK5?ngmY#g0nXZ9aMNp)ubVX_b2 zNv=Zg#7T1Y!Bu2>O*OPvAO*$Og{u*&B}F^$FlSmUKw9lIPk&WCf(HSO@3J}}CWQp+ zDoZ7dv45q{OvbLVgd4{}u4c?X34_sH;Mr#>j@1CdO)*EXfJfXtpdG&hP-)5~Nf2?Ut8Rm&DfylY*!k$WYX}yrryS z-BQ~Rn7I+gLft(HO9heC`P90bmhuGT+PFckvKlJJ=>SVXWPFh7qh$#i#C}O#(^_+| z>UEAaJJsyG7PNE1X4FU3e&6+k^$o6jbX;28nJ@zSE`WUXNRlK;k|arz_wX0@fOf&- S=vuh|0000xyv3pMHFMlAvS5N|9hGU zCBzUzSSbJi0KnJSwr$%s|0Sb-RDZgA*?o|8lDhYk(P;Y^8SS4X<5+7gqwclkvQEb1 z{D!w^7(T#oCe~WDDELc;v`fyPhl_s$x`1|XL-%aM!lKOCVSk{z-^vp07H4TM%|%&n zK-XR8+@EWq4X!iXUA0q_BUZ{9P!bl^+9*dsw{Pv~*s|3tcmVc(x2fQn(`9APS6;srWPeTL>-0)V+qkjIETfI4_8s%?v_m0T;<+^ahtarE(q2m4|70CSypJoB zcfs6WdK|qo62*ShbNJ=ysdKhV006fNZUDtK_PZ{N-+Ed-jZi6hdsCnNjDlH#lMg5~>9COY|YhHO=mRa#Q zKjAeR)CW*UV$Qi01^*FM>y-2IaPc#s3TQPOs%KLVrpB061AkpzE045pF{(9b-n424 zRLymc{ka;-;5x%y6&o5Hv6id>X~CkJ3#k`$`_`U@ZCky9JK%12nF?MxT^9BXE<2ld z^N+vg=@!1}E4Dg2C#VZuYdLL==!r$xc=M@NdwDyfRqzVQhpTrg4;Rt_AuRy_;7{;t zsG-~VRUGm@xMWL<5;&JBh?`evW zEU{RIwo4&|5JCtc$)!dFUNjYK7P2q<@$%^zKh={E?T;DkB%vh9Bb9A*4qB< zfBRl5{Mmj*AGHta-B4?_1_E!H%fa#8&XGI7T5kP-4*$wN%YUU;YgGq&@Rcn?2x)*I zLvP{W9WZ1JuKl?y^aE32<+#>o0| zY>@f`GM(Ncr|y8h;0}$$;zDX`v$1xH(jbi6P`3bmh`#a3=kr&wUJp+nQ@)@7<*7gj zA>^m<%lczldw&_WYwD(R2!tG|)C&%2I6?j7{p+iFB0UZJ4uR;JgN>yisylAg0Qr$h zHEi(>oPMQ(N;V(FvI-2(HGvqX)`t?^oAM$PUd_ePd91pJr{Nesvp5oJs8#Gzj$yB4 zWoRW^l{fm9-bR-4=>ct*y;lSHrU86K;Y|QIUK1S~N`GqK!`@(pmGx^qZzqC=X*~T# z>}H}CeU^=s$)s z)ExbX;T(JtR-sQ43^M27C~|lqHMH2;9->XQM!Ek(G|p6u6RT)jMo^0dL*N>445ALI zW|oa=nSYWk=ZyUfLxFQHpHOOT9Q-h=@y>%Tt_B`WBPT^T<)!4$gwjP7VGteEkFI*D zy3NGlc9B4gYrmyf=4g`zSYJ}VL>P<_i3XQ(ROQvOblg*T6R@t|E_xl(=`1Z4M4i#; zRQIc)?^idoZ<7vb@;8&u0JRaX%j?3bwdIv{9Dk1`eeV`Te4Ue82_b|KLVhf!8rtw* z(<53!!A{GdCAi^pG*QP)UO&6PR8zJ372^w;s^$lZrlAt)1VUV_Or)b_hKIvbl}xIk zi^pBueJ&8_viE$nUklnB$#=KD|H0>}U1!BcH4Dp>pX&T@fwwSXfV<;$N&TJ5e>&o# zV_Q%Bb+p=|N{N1?&^;CCRqD!0s=);KlGbqblsX?KXIZ{&^vl|(uI2>D!Ntp5&3{0d sdK=|z4UuO+Dvh~Vgb+dqA%wh|zg$ITr-G)ukpKVy07*qoM6N<$f@trxc>n+a delta 892 zcmV-?1B3ke29pPnB!5~-L_t(|ob8%jlH4E+gh?tl;r>VBE_s*=#UiQI2=HuX^*wp8 zK(hEV?I|Tmk|arzBuPGr)>>}eyoKtp;nIqmPW=|ZtVf(!lqgWikI|F*N<&o=R2T>KF;*lnl6o*@da#{ z^@k)J-X^zZz_{Q}h11|-*4A!gy(vlq*KbFC1sGk7g-`C!AI1K9c>9?0`TQ@tLXsp& z@>BR_-3V(h(|_xlbpjY2F-Iy!+lifrdjLyP67Yq8F2m@WlMSyRT9Plg*bEia0wqj@ z%umT-ElBNWb%d6$lIIdugX3Lw7^)?VBhnZC$vhg0pbc0yYAt-t6ozfADvUAN!gDiV zY3ziN56~BA5P-D7&BlVc0qOvE|0HeHTIK5?ngmY#g0nXZ9aMNp)ubVX_b2 zNv=Zg#7T1Y!Bu2>O*OPvAO*$Og{u*&B}F^$FlSmUKw9lIPk&WCf(HSO@3J}}CWQp+ zDoZ7dv45q{OvbLVgd4{}u4c?X34_sH;Mr#>j@1CdO)*EXfJfXtpdG&hP-)5~Nf2?Ut8Rm&DfylY*!k$WYX}yrryS z-BQ~Rn7I+gLft(HO9heC`P90bmhuGT+PFckvKlJJ=>SVXWPFh7qh$#i#C}O#(^_+| z>UEAaJJsyG7PNE1X4FU3e&6+k^$o6jbX;28nJ@zSE`WUXNRlK;k|arz_wX0@fOf&- S=vuh|0000xyv3pMHFMlAvS5N|9hGU zCBzUzSSbJi0KnJSwr$%s|0Sb-RDZgA*?o|8lDhYk(P;Y^8SS4X<5+7gqwclkvQEb1 z{D!w^7(T#oCe~WDDELc;v`fyPhl_s$x`1|XL-%aM!lKOCVSk{z-^vp07H4TM%|%&n zK-XR8+@EWq4X!iXUA0q_BUZ{9P!bl^+9*dsw{Pv~*s|3tcmVc(x2fQn(`9APS6;srWPeTL>-0)V+qkjIETfI4_8s%?v_m0T;<+^ahtarE(q2m4|70CSypJoB zcfs6WdK|qo62*ShbNJ=ysdKhV006fNZUDtK_PZ{N-+Ed-jZi6hdsCnNjDlH#lMg5~>9COY|YhHO=mRa#Q zKjAeR)CW*UV$Qi01^*FM>y-2IaPc#s3TQPOs%KLVrpB061AkpzE045pF{(9b-n424 zRLymc{ka;-;5x%y6&o5Hv6id>X~CkJ3#k`$`_`U@ZCky9JK%12nF?MxT^9BXE<2ld z^N+vg=@!1}E4Dg2C#VZuYdLL==!r$xc=M@NdwDyfRqzVQhpTrg4;Rt_AuRy_;7{;t zsG-~P_yd$|uIA!O|1gH1@)`g@uo z{1{9eb29C96-7}LMNt&RalVr6TWjOj`@V5aQDH1pE0Fz!X|0W2&7IE{juk}n0RJ+L zJ6o3HzVBVjN+NcT_}ZEG$5_*9Me?0#Y|(ACHq@p0OjI5xrhhsH*H^E)Hz+84Xmjkj z19-@3^!2iC3w87M$~`iC%H8O9Meo1)hFE2f0|FL+CVX#V{;joSK$y+IZp*VL1Raju z7Q&1kh<35Jw-2X7PzU&oaVMWRW%jJvYVU4)&;e?SMsA|MzHU?z$q65YaQL3f)j*ez zNZE714+kV&*ME-X%lGhF2s(+iK)a4FndZOw4#3;LD2k#$&j2-sV!co;Q592=KaBaS zs>bkzmz@pcBQ92fR15KZQ;4)T{6TbR>0elDR5N`m{Z|K?3mKcqv8>@N-bq8PO+m`* z2M(wf`4<2JM+@4nJ>jvi@cGu;f{m|VW*i3ybyo$P+JDuO)j5Rc+|B-|a$+uHAsCbt zHp0His-fhwhYae+d7QoG0M##kGT1lM37AE&fHVp+E-!+jb z52vASqAA95=fztH($FWKBE=f909fp#eDFTygEy(wf0J7MHje?l|tPb73 zifSGheN>Fth97T<57-iB6yE`{<>Ti$x0*FezPYGxeT|vN!w>XS2#QTLqgkGpZ?~}Q z05=ZKZ&bD{&6byL_-z^}?^mr%S~NfZ#43uSD2k#eiUs}yS`4C@Yg(;H{zMvEbXzTly0kT$DvtwG7k>uVSO0Z4C@6f$IdXOY z4>^oJU)Huzowrx+k>OMBM!#!!|H%!pO3ngoSOA*vy-nk9tpx*uGy^YNoSYE!a_qL4 z%;>4{?dnWl47$ z?QxG)mTsD3as0=4Y3W~2B%Jc@z&yqtvd|sNBWkE>#OQREUwk~sQi&}$951CWM-)xf z9<|z1w^tfOKl>Z67Y# zW_$+r2l!YbE4WdJ83F*<1FH4HwoCBbo`Y9hT0GeXX9)gS8?6*%A(sGw8DkFqRFVCmLSMOHlZ@%?Xb0% zk>zG~q@pPeaQ)YnUYH#~siEo(+)0r_CWG2aRRWlG;xkW~T~7^VzP%*VTI_2<%;b`R zLJiOx2Jq`G#R>P;vh$Sl%(G(L9s9@AFlsTn= zl1uDg=KLpHk+;LI%dr{Y;o**MD*3WYUKB-96h-k3m}D%qB-m=TxAqUW4!#|zz?h2X zAtgyRRYOL8kSV(*Lag=%%){kR{JZT{owZC@)!C6S<`3rrWycJFlncCucfwb zZ+~RxQ7K|uS5Xs1DKRnzxH+eq247mQiMKeThDLPCA0~341&{$zCDGC3ho1P3g^G!KqwJpBI l(nGi?ilQirq9_jV7b0~ft1^{xcK`qY00>D%PDHLkV1nrn!bt!C diff --git a/tests/snapshots/nanox/test_get_public_key_confirm_accepted/00001.png b/tests/snapshots/nanox/test_get_public_key_confirm_accepted/00001.png index b4c02b65f80583b2c7ad2771dc1587b83b208b68..9048fa409e843ae1dac7347bdf2d25e56529ea63 100644 GIT binary patch delta 531 zcmV+u0_^>h1gr#*B!BZsL_t(|ob8!Ga>F1DMQNuu@%@j)UApiL!+<1Y1SDzSTP2Q= zWl4MpP6+@2007`PUy;E%=lbh)UAARoP+t@coPMUsITu&uS%yK@HnoR2z9WO1Xo5~w zrPWE@Jz|#Y*bJNA{t-Ws!6GHlzFV~}OI>T%PbC({wikaj3V*EqGz=rof*Ih)`3xmr z+O%kzuC`B=EZoK8$qG=3HoVB+@15WlzP;d9PGHSo-vwTn<%B0-0>TcZi12$2(y zaj?K5M2>t9TfVe+%c2LRhP*s|piC=|!`6?gkl|u}^zDrz@ zLjMEa9And!7JsRE+{tSs=p)p1RTo)@ZH_U5ayP27fpaS66Ypop2@MdnTObxa|dI10c00000000000000000000006e}3*`Ic VLU$jlCky}p002ovPDHLkV1nMS_w4`x delta 505 zcmVJ*h?Qe!(@PjAOTOE|9fgZ z5Rpq%ObGx0066YzrE<<${(D`QU9u`54|WSUzuS$O!j*uT-vDvlt|* zTb<Gra0n^C4MKjmkoa#v|+J6p9`mYS(8uc|vRcKPnF#(w~7KMk9)E?@=tIj^Dg zm$odbNhixEkrw`r53}D2ZPEAz48V=k8&&+#s*BG#FJ=SJx{19BrH~YKICpERW|Tza z%qP_yd$|uIA!O|1gH1@)`g@uo z{1{9eb29C96-7}LMNt&RalVr6TWjOj`@V5aQDH1pE0Fz!X|0W2&7IE{juk}n0RJ+L zJ6o3HzVBVjN+NcT_}ZEG$5_*9Me?0#Y|(ACHq@p0OjI5xrhhsH*H^E)Hz+84Xmjkj z19-@3^!2iC3w87M$~`iC%H8O9Meo1)hFE2f0|FL+CVX#V{;joSK$y+IZp*VL1Raju z7Q&1kh<35Jw-2X7PzU&oaVMWRW%jJvYVU4)&;e?SMsA|MzHU?z$q65YaQL3f)j*ez zNZE714+kV&*ME-X%lGhF2s(+iK)a4FndZOw4#3;LD2k#$&j2-sV!co;Q592=KaBaS zs>bkzmz@pcBQ92fR15KZQ;4)T{6TbR>0elDR5N`m{Z|K?3mKcqv8>@N-bq8PO+m`* z2M(wf`4<2JM+@4nJ>jvi@cGu;f{m|VW*i3ybyo$P+JDuO)j5Rc+|B-|a$+uHAsCbt zHp0His-fhwhYae+d7QoG0M##kGT1lM37AE&fHVp+E-!+jb z52vASqAA95=fztH($FWKBE=f909fp#eDFTygEy(wf0J7MHje?l|tPb73 zifSGheN>Fth97T<57-iB6yE`{<>Ti$x0*FezPYGxeT|vN!w>XS2#QTLqgkGpZ?~}Q z05=ZKZ&bD{&6byL_-z^}?^mr%S~NfZ#43uSD2k#eiUs}yS`4C@Yg(;H{zMvEbXzTly0kT$DvtwG7k>uVSO0Z4C@6f$IdXOY z4>^oJU)Huzowrx+k>OMBM!#!!|H%!pO3ngoSOA*vy-nk9tpx*uGy^YNoSYE!a_qL4 z%;>4{?dnWl47$ z?QxG)mTsD3as0=4Y3W~2B%Jc@z&yqtvd|sNBWkE>#OQREUwk~sQi&}$951CWM-)xf z9<|z1w^tfOKl>Z67Y# zW_$+r2l!YbE4WdJ83F*<1FH4HwoCBbo`Y9hT0GeXX9)gS8?6*%A(sGw8DkFqRFVCmLSMOHlZ@%?Xb0% zk>zG~q@pPeaQ)YnUYH#~siEo(+)0r_CWG2aRRWlG;xkW~T~7^VzP%*VTI_2<%;b`R zLJiOx2Jq`G#R>P;vh$Sl%(G(L9s9@AFlsTn= zl1uDg=KLpHk+;LI%dr{Y;o**MD*3WYUKB-96h-k3m}D%qB-m=TxAqUW4!#|zz?h2X zAtgyRRYOL8kSV(*Lag=%%){kR{JZT{owZC@)!C6S<`3rrWycJFlncCucfwb zZ+~RxQ7K|uS5Xs1DKRnzxH+eq247mQiMKeThDLPCA0~341&{$zCDGC3ho1P3g^G!KqwJpBI l(nGi?ilQirq9_jV7b0~ft1^{xcK`qY00>D%PDHLkV1nrn!bt!C diff --git a/tests/snapshots/nanox/test_get_public_key_confirm_refused/00001.png b/tests/snapshots/nanox/test_get_public_key_confirm_refused/00001.png index b4c02b65f80583b2c7ad2771dc1587b83b208b68..9048fa409e843ae1dac7347bdf2d25e56529ea63 100644 GIT binary patch delta 531 zcmV+u0_^>h1gr#*B!BZsL_t(|ob8!Ga>F1DMQNuu@%@j)UApiL!+<1Y1SDzSTP2Q= zWl4MpP6+@2007`PUy;E%=lbh)UAARoP+t@coPMUsITu&uS%yK@HnoR2z9WO1Xo5~w zrPWE@Jz|#Y*bJNA{t-Ws!6GHlzFV~}OI>T%PbC({wikaj3V*EqGz=rof*Ih)`3xmr z+O%kzuC`B=EZoK8$qG=3HoVB+@15WlzP;d9PGHSo-vwTn<%B0-0>TcZi12$2(y zaj?K5M2>t9TfVe+%c2LRhP*s|piC=|!`6?gkl|u}^zDrz@ zLjMEa9And!7JsRE+{tSs=p)p1RTo)@ZH_U5ayP27fpaS66Ypop2@MdnTObxa|dI10c00000000000000000000006e}3*`Ic VLU$jlCky}p002ovPDHLkV1nMS_w4`x delta 505 zcmVJ*h?Qe!(@PjAOTOE|9fgZ z5Rpq%ObGx0066YzrE<<${(D`QU9u`54|WSUzuS$O!j*uT-vDvlt|* zTb<Gra0n^C4MKjmkoa#v|+J6p9`mYS(8uc|vRcKPnF#(w~7KMk9)E?@=tIj^Dg zm$odbNhixEkrw`r53}D2ZPEAz48V=k8&&+#s*BG#FJ=SJx{19BrH~YKICpERW|Tza z%qo5=^mPio)@2O3z zV1ij?LjV8(0EYW9JXefy|6$voZZNcekN;z_F&pOl23GMt`=iP$Vw>AAN|d+ms`= z5a-b2mODUnOj=obr@gpmh{nUSs)#{D_610rkJyOHm7XSUUzlYoYn2caWR)-5b}zcC z1)b(S`;*dtbXljmI8EVfjX^8pT2S~dc4bj3k=kO+&L$3#jV>m%c5el#8P4-m?ItUU zQX%E2{&D-g>wi7KWaZi}f6F)F!D`Q=0Dwl-&w#SS`bNUp+wxN)t(50t$4I%i^Q=he zF^{3;B6?z^^q2yyO52LC+PgRW4q!c60p`Dd7eEVgmKR{a4)~j$q?hauP)#z~A4W(u z*&mD=c%ln=;&a&3we*(Xe-i1Bw3=-nagE4j<-tVyBTgx{BAihGXB5C01#m_I0000m znc4Oc*NC*5Z69%s$YrzbBd!ri@h0qy0yv`p&M1I03IG5A0KCs1zPFCmah)f400000 LNkvXXu0mjfb}{0X delta 461 zcmV;;0W$vY1Lp&fB!8|+L_t(|obA|Aa)lraKvCLxJ8}O@axeXG9>YM0P$FUQp0Ao# zzyv800ssI2Fx`(~TjzORKODzVi?}<_Gabw|!dgUpBHL&AHEe5rF`?pRlx9DxgmTya zd<@%)u4y6;G!2%|)*cB`B9uSYN1_bxX;a^TIH$x+We=Q2j(@LEBrg3My^CzMDSK=o zj$y~8;zCr;^fYnT#4J-;tAv;!t9;om_oAnk zpxeA>zf#s8UA9tn4pV5YF=%Dp5){6ZU76HMq&69|*2FHd-o=F0-mM@lhU@IA-DD+E zDx};s-tV|~eSZg-%v{^)Z}}xWS#3WG0I;ENHl|%}6X{bnH}f*9#|9BmbsHM*PaB$W z8KnKp9+7TdZ$K@$MU?q?hbZP)#z~pGHVE*`JIWcw!au z#Q$MWed&GfQ1H!>R_RF@5vxeI@@69AkrYP}&M1I03P#|J0yv`p00013%xdR|dqi5T zc8<75q}yuehhPn8=8F<{cB1ONa4 zO!pPomx$yK$8mU(EEJW&VQfqHqAA+>;O|4ac5`L z+3A;v3%BSrX?9iTNC+1{0d?^)3z1&wb>i~k)v5Gm!pzQKvPR}9u-u#ODnX}tZ@%i( zpT4G2y*W&ymD$OChe7;nsJR2olk?gk+z*<~^$5-8UKup+`i!lL< zF#(IU6Yz**{r@^iFWH~KO)}Y^#z-~UpNu(Ji7K=b=kQ9T7XSbN000000000000000 axXmvJU&8Ch!02dCw~Rpkak44AYb00000 z%l#Pk6=O^vj^k)W+{GAAhnM0hs6Le8Ix3|#qK>i* z$_E>dgtM$w7fY?L2Af-1x&!ipQZrROZ5cWK1d;dhn*J@y<$rudYtziRWe2G8h&wx@ z%uc^VOx&W=q}o-TBf*^g1eC=`Ektsqmx)V@SEjNx6KZw_lQl9=hUH#$R|z`Jd-YYP z{`6Iq>Yu|@TB)7fcNo~ehN?S2JvrwN;eJqUE=Q;~ZwkhBBGdNz9q>R*fHNk* z857{Fo`8p*@89Aiy<~rZW|GPNGD@n+{$k95C#sMq&S6ia7XSbN000000000000000 axXl~Cp0)T1vSBCy0000dd5i&Ly^Ql_hGt9FM z4+u#}2><{9xb9woVkw7DhN$}Iy_|0)ti zPyDTS(ln_FKO`<3-t9Nx;Uoe%&300FMkQ0u59HQ$q+m%M(Y`hJ<3lZ?(q zwIQ|V&YFR+)PEd#sXd(2dGi&o+v1337^&upI>S=VUjsE)!mRGK;vZuEvy?W{zbLFj zx|J?X)r^Jtxenv3Q(R}RKT@@(3}qW~*7WDDkQ1Q(H|I9GzKM$~ zZ_}czdePsdshTTITm9)}an^c)ImnFuHOf#k`j;^WzlmMwHw^}vIXH^p1poj500000 i0000000000j`;@Fv)->{(Iwje0000D)_K7tKm$V)hA=Fm2=i3@nH$XHt`b`s43^1QYurX z&b!Q@x=gvQOE&8st(A9FlT^%B(Tdf&j?-yt(sy`7L3G?nTz@}%LDwyXt-7Uy>Q6;Q zk%_N`LEkuGTk>6Dzj;S-_459xHa z`|eOXEm@t|Jbww$C8GwwIXPzHM}>_%3lb-bw@NmjjGBj(*14&5z}d;66Q>zgS1%1M zI;v~S6_LL5=^*SXx%gg%L+3o`?!2ewSl4tjluyc}bOFL!@5<7VLo_hUS zC6}f#VB4{4%m9czx|6-X%-35#F;octg|7{H|kY? z$$tIW%uc5Fw`p`Wy}ub_@FaGjCtY+hW3Uw63jhEB000000000000000Eb|Kj^0000U3XUh*+Y2Z3EK40J1#I$tBk zfO#2Hb9GA*LI@#*5aOG-uIsuk{wrX=%OBibTXOxutGQf56LIi-fC<@Ii;qncz! z=kZX2Gj}&NelUG7og_UEqs6HO$eohJMl1fMon!O??0*SRi{zjjJxh8Fulum#d4B@N zw#Go&+N48`NtlUZ8+=cgVG8_^;0=fA&bwWLrIOzC0PZAf_8-HTYR&$`Xbs*(QRq#A zN!A)1Wt`qv4Q0|ktUmH8rdiT{<^ADF=o?m8!$FlMv+T@F_x5Jze>?C>z`03Cq@HnS zxkbX98h;cXCRTPm-h2u3Tf=<6y#8#y+4&OYyDY>5(hC|Z@*LyXY!_3`bnOH87|+=S z@T5MVPZsvkqjvbGmoeLSx3idvD0fGtC)Pt z>q-O*a5_q!Q#Wz@pkHz&cKtSxPeZ{k>0ufg24#?j&X$<%o8?|U+Brj-6=(K@5JCtc bgm|CduP0i=?|9U200000NkvXXu0mjfeAB1X delta 886 zcmV-+1Bv|T28{=hB!5&%L_t(|ob8-l5)>f}gwgUQ-2X^(7ayjiQY0iD{#Muio|MUu zOn?CGmZcCv2qAhYq~Z@=9goG z)E|)P@D@3>0%XDM8oSAb)YfJ*Iw@*{&~L*$0!SCK@#g;gRjk*;)7O;m=U>?s2qA?0 zFZ}QyBWEvp#((eZ!)vO%H0a*Cx3r}n+vxIv#1OjEZ|O$UCIP5uj?CV_YDve}ByhDZ zj4kU3@vqq2}TD{D1iYm|HjghPfVtnc1Rd!1^*e zC`Tjgs#^DB*pmICSAcv+mrGqq*Fknpq(z2=m^sHsBuL$e^c)Nc^`;99lg#X2!$>u= ze;JO!Ct(%(Bteon21n89h1AgEUVM<2)(HN9$3L!(qVl_Pj*?E;W=P2GZ?g=Q()>mu zfhi=I#(ybgahHl07PFz-hZ02X$I0*i;hl9%IV6%F$|IrLI@#* zNCGwVC8af*mZmn~OBbmV@aT}9RaG4u#4L4KM*+3Q6)DjXES(mle^69NiLZ`LD(siZ zn=r1HfKuW#qyBX}GM7{H-M0aO#5ldaM!yv6!g4A@*-?U0mB)!$UZKP9GOO-1kQ|Nt zsBb7GCF&0Ge_WgXZ1cr1r~Z(H9>XPaP>egRZjSnQ{31h$+l1jEX2<`ph*UIN`oADy zhTwi@_JGl**Pe#Kb(SfCb0wi&*#3byjJ7qJvF$vG5<&o#MH?y!geb!90IDc1{c$c`#dubl3dILnb z$-ckV!kpY>x<$2Honx<(IiM9xs(sR~k{(|=6WFoYYx4tm#XS!Ne`C6?oatQgXnr~V zCNhV01s7d zMJy=oN5LkjK6J82AKH%AZ>#wU>YaEuBl#`4e9M{f@D047!22B|7=p}yGmXzOvBedV z8+n;AFr(xRxYe_sH@mZ1wj{sb2?4(Hp#8aK&g{}?0HWdAUp!8_M`d2M>1C*yH` z!b>y^A7D5VYpq%o{3%1)CFkwo;%9&esF)4n*@lTl8MDJci+_9j6s?M*v`KSP)(jBM zb&mbD658N8!!5EM8XU1w_JESGsn$lB1>LUN)3D2Suiy^Y+ube&e`|W5*)zE8)qJ}C z_)A`H;YnYy#o24ZaHG??zp1=jNC$+p1OR}4!N<^@ zcJ`mXyS8r1_rhk5OZu#IK>Av9mC& z+CDRGAI_xxwd+tLA4&U+uKf}s{&h|u?H1?k8P?kt)u%kh@Hw>zdX^wNzIOTAC4V`2 z9gy`kG?uY*I&Uw{EVKqNgIeE|G1m z!G}!3d#kzmR%(!m{$&QCCi)kn4?c-i=#wTvrVmmPUH||9000000000000000Ak8nt Whw!{vzu52q0000 Date: Wed, 19 Feb 2025 14:45:09 +0100 Subject: [PATCH 31/67] refactor: update sign transaction UI flow to use generic validation callback This commit modifies the sign transaction UI steps to use a generic validation callback, replacing direct send_response calls with a more flexible approach that allows for dynamic handling of transaction signing and rejection. --- src/ui/display_bagl.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ui/display_bagl.c b/src/ui/display_bagl.c index b8349cd..7b75ae3 100644 --- a/src/ui/display_bagl.c +++ b/src/ui/display_bagl.c @@ -155,7 +155,7 @@ UX_STEP_NOCB(ux_sign_transaction_transaction_id, }); UX_STEP_CB(ux_sign_transaction_accept, pbb, - send_response(set_result_sign_transaction(), true), + (*g_validate_callback)(true), { &C_icon_validate_14, "Accept", @@ -163,7 +163,7 @@ UX_STEP_CB(ux_sign_transaction_accept, }); UX_STEP_CB(ux_sign_transaction_reject, pb, - send_response(0, false), + (*g_validate_callback)(false), { &C_icon_crossmark, "Reject", From 68f169d6f03b4e889f05fb42e07f5b61406ea165 Mon Sep 17 00:00:00 2001 From: keiff3r Date: Wed, 19 Feb 2025 14:51:37 +0100 Subject: [PATCH 32/67] refactor: remove usused code, files and make changes accordingly --- src/example.c | 144 +++++++++++++ src/globals.c | 10 - src/handler/get_address.c | 1 - src/handler/get_public_key.c | 1 - src/handler/sign_transaction.c | 1 - src/main.c | 356 +-------------------------------- src/response_setter.c | 89 --------- src/response_setter.h | 8 - src/ui/display_bagl.c | 1 - src/ui/display_nbgl.c | 1 - src/utils.c | 48 ++--- src/utils.h | 1 - 12 files changed, 169 insertions(+), 492 deletions(-) create mode 100644 src/example.c delete mode 100644 src/globals.c delete mode 100644 src/response_setter.c delete mode 100644 src/response_setter.h diff --git a/src/example.c b/src/example.c new file mode 100644 index 0000000..739bc26 --- /dev/null +++ b/src/example.c @@ -0,0 +1,144 @@ + +// unsigned short sw = 0; + +// if (!flags || !tx) { +// THROW(0x6802); +// } + +// if (rx < 0) { +// THROW(0x6813); +// } + +// BEGIN_TRY { +// TRY { +// if (G_io_apdu_buffer[OFFSET_CLA] != CLA) { +// THROW(0x6E00); +// } +// // must at least hold the class and instruction +// if (rx <= OFFSET_INS) { +// THROW(0x6b00); +// } +// PRINTF("command: %d\n", G_io_apdu_buffer[OFFSET_INS]); +// switch (G_io_apdu_buffer[OFFSET_INS]) { +// case INS_GET_APP_CONFIGURATION: { +// if (G_io_apdu_buffer[OFFSET_P1] != 0 || G_io_apdu_buffer[OFFSET_P2] != 0) { +// THROW(0x6802); +// } + +// handleGetAppConfiguration(G_io_apdu_buffer[OFFSET_P1], +// G_io_apdu_buffer[OFFSET_P2], +// G_io_apdu_buffer + OFFSET_CDATA, +// G_io_apdu_buffer[OFFSET_LC], +// flags, +// tx); +// } break; + +// case INS_GET_PUBLIC_KEY: { +// if (G_io_apdu_buffer[OFFSET_LC] != rx - OFFSET_CDATA) { +// // the length of the APDU should match what's in the 5-byte header. +// // If not fail. Don't want to buffer overrun or anything. +// THROW(0x6985); +// } + +// handleGetPublicKey(G_io_apdu_buffer[OFFSET_P1], +// G_io_apdu_buffer[OFFSET_P2], +// G_io_apdu_buffer + OFFSET_CDATA, +// G_io_apdu_buffer[OFFSET_LC], +// flags, +// tx); +// } break; + +// case INS_GET_ADDRESS: { +// if (G_io_apdu_buffer[OFFSET_LC] != rx - OFFSET_CDATA) { +// // the length of the APDU should match what's in the 5-byte header. +// // If not fail. Don't want to buffer overrun or anything. +// THROW(0x6985); +// } + +// handleGetAddress(G_io_apdu_buffer[OFFSET_P1], +// G_io_apdu_buffer[OFFSET_P2], +// G_io_apdu_buffer + OFFSET_CDATA, +// G_io_apdu_buffer[OFFSET_LC], +// flags, +// tx); +// } break; + +// case INS_SIGN: { +// if (G_io_apdu_buffer[OFFSET_P1] != P1_CONFIRM || G_io_apdu_buffer[OFFSET_P2] != +// 0) { +// THROW(0x6802); +// } + +// if (G_io_apdu_buffer[OFFSET_LC] != rx - OFFSET_CDATA) { +// // the length of the APDU should match what's in the 5-byte header. +// // If not fail. Don't want to buffer overrun or anything. +// THROW(0x6985); +// } + +// handleSign(G_io_apdu_buffer + OFFSET_CDATA, G_io_apdu_buffer[OFFSET_LC], flags); +// } break; + +// case INS_SIGN_TRANSACTION: { +// if (G_io_apdu_buffer[OFFSET_LC] != rx - OFFSET_CDATA) { +// // the length of the APDU should match what's in the 5-byte header. +// // If not fail. Don't want to buffer overrun or anything. +// THROW(0x6985); +// } + +// uint8_t p1 = G_io_apdu_buffer[OFFSET_P1]; +// if (p1 == P1_NON_CONFIRM) { +// // Don't allow blind signing. +// THROW(0x6808); +// } + +// uint8_t p2 = G_io_apdu_buffer[OFFSET_P2]; +// bool more = (bool) (p2 & P2_MORE); + +// // P2_MORE is a signal for more apdu to receive in current chunk; +// // P2_EXTEND is a signal for extended buffer and can't be in first chunk; +// // P2_MORE && !P2_EXTEND = first chunk; +// // P2_EXTEND && !P2_MORE = last chunk; +// // P2_EXTEND && P2_MORE = ordinary request without chunks; + +// // P2_EXTEND is set to signal that this APDU buffer extends, rather +// // than replaces, the current message buffer +// bool first_data_chunk = !(p2 & P2_EXTEND); + +// handleSignTransaction(G_io_apdu_buffer + OFFSET_CDATA, +// G_io_apdu_buffer[OFFSET_LC], +// flags, +// first_data_chunk, +// more); +// } break; + +// default: +// THROW(0x6D00); +// break; +// } +// } +// CATCH(EXCEPTION_IO_RESET) { +// THROW(EXCEPTION_IO_RESET); +// } +// CATCH_OTHER(e) { +// switch (e & 0xF000) { +// case 0x6000: +// sw = e; +// break; +// case 0x9000: +// // All is well +// sw = e; +// break; +// default: +// // Internal error +// sw = 0x6800 | (e & 0x7FF); +// break; +// } +// // Unexpected exception => report +// G_io_apdu_buffer[*tx] = sw >> 8; +// G_io_apdu_buffer[*tx + 1] = sw; +// *tx += 2; +// } +// FINALLY { +// } +// } +// END_TRY; \ No newline at end of file diff --git a/src/globals.c b/src/globals.c deleted file mode 100644 index 9d0a7a4..0000000 --- a/src/globals.c +++ /dev/null @@ -1,10 +0,0 @@ -// #include "globals.h" -// #include "os.h" -// #include "ux.h" - -// ux_state_t G_ux; -// bolos_ux_params_t G_ux_params; - -// // display stepped screens -// unsigned int ux_step; -// unsigned int ux_step_count; diff --git a/src/handler/get_address.c b/src/handler/get_address.c index 396ec39..463269c 100644 --- a/src/handler/get_address.c +++ b/src/handler/get_address.c @@ -6,7 +6,6 @@ #include "contract.h" #include "slice_data.h" #include "byte_stream.h" -#include "response_setter.h" #include "ui/display.h" #include "errors.h" #include "io.h" diff --git a/src/handler/get_public_key.c b/src/handler/get_public_key.c index 95fadc0..a4c47d1 100644 --- a/src/handler/get_public_key.c +++ b/src/handler/get_public_key.c @@ -8,7 +8,6 @@ #include "apdu_constants.h" #include "errors.h" #include "ui/display.h" -#include "response_setter.h" #include "helper/send_response.h" int handleGetPublicKey(buffer_t* cdata, bool display, volatile unsigned int* flags) { diff --git a/src/handler/sign_transaction.c b/src/handler/sign_transaction.c index b6a7f61..2a3acdf 100644 --- a/src/handler/sign_transaction.c +++ b/src/handler/sign_transaction.c @@ -7,7 +7,6 @@ #include "byte_stream.h" #include "message.h" #include "contract.h" -#include "response_setter.h" #include "ui/display.h" int handleSignTransaction(buffer_t* cdata, diff --git a/src/main.c b/src/main.c index 8fc37df..92f8f5d 100644 --- a/src/main.c +++ b/src/main.c @@ -23,8 +23,6 @@ #include "ui/menu.h" #include "apdu/dispatcher.h" -// unsigned char G_io_seproxyhal_spi_buffer[IO_SEPROXYHAL_BUFFER_SIZE_B]; - BocContext_t boc_context; DataContext_t data_context; @@ -33,160 +31,7 @@ void reset_app_context() { memset(&data_context, 0, sizeof(data_context)); } -// void reset_spi_buffer() { -// memset(&G_io_seproxyhal_spi_buffer, 0, sizeof(G_io_seproxyhal_spi_buffer)); -// } - -// void handleApdu(volatile unsigned int* flags, volatile unsigned int* tx, int rx) { -// unsigned short sw = 0; - -// if (!flags || !tx) { -// THROW(0x6802); -// } - -// if (rx < 0) { -// THROW(0x6813); -// } - -// BEGIN_TRY { -// TRY { -// if (G_io_apdu_buffer[OFFSET_CLA] != CLA) { -// THROW(0x6E00); -// } -// // must at least hold the class and instruction -// if (rx <= OFFSET_INS) { -// THROW(0x6b00); -// } -// PRINTF("command: %d\n", G_io_apdu_buffer[OFFSET_INS]); -// switch (G_io_apdu_buffer[OFFSET_INS]) { -// case INS_GET_APP_CONFIGURATION: { -// if (G_io_apdu_buffer[OFFSET_P1] != 0 || G_io_apdu_buffer[OFFSET_P2] != 0) { -// THROW(0x6802); -// } - -// handleGetAppConfiguration(G_io_apdu_buffer[OFFSET_P1], -// G_io_apdu_buffer[OFFSET_P2], -// G_io_apdu_buffer + OFFSET_CDATA, -// G_io_apdu_buffer[OFFSET_LC], -// flags, -// tx); -// } break; - -// case INS_GET_PUBLIC_KEY: { -// if (G_io_apdu_buffer[OFFSET_LC] != rx - OFFSET_CDATA) { -// // the length of the APDU should match what's in the 5-byte header. -// // If not fail. Don't want to buffer overrun or anything. -// THROW(0x6985); -// } - -// handleGetPublicKey(G_io_apdu_buffer[OFFSET_P1], -// G_io_apdu_buffer[OFFSET_P2], -// G_io_apdu_buffer + OFFSET_CDATA, -// G_io_apdu_buffer[OFFSET_LC], -// flags, -// tx); -// } break; - -// case INS_GET_ADDRESS: { -// if (G_io_apdu_buffer[OFFSET_LC] != rx - OFFSET_CDATA) { -// // the length of the APDU should match what's in the 5-byte header. -// // If not fail. Don't want to buffer overrun or anything. -// THROW(0x6985); -// } - -// handleGetAddress(G_io_apdu_buffer[OFFSET_P1], -// G_io_apdu_buffer[OFFSET_P2], -// G_io_apdu_buffer + OFFSET_CDATA, -// G_io_apdu_buffer[OFFSET_LC], -// flags, -// tx); -// } break; - -// case INS_SIGN: { -// if (G_io_apdu_buffer[OFFSET_P1] != P1_CONFIRM || -// G_io_apdu_buffer[OFFSET_P2] != 0) { -// THROW(0x6802); -// } - -// if (G_io_apdu_buffer[OFFSET_LC] != rx - OFFSET_CDATA) { -// // the length of the APDU should match what's in the 5-byte header. -// // If not fail. Don't want to buffer overrun or anything. -// THROW(0x6985); -// } - -// handleSign(G_io_apdu_buffer + OFFSET_CDATA, G_io_apdu_buffer[OFFSET_LC], -// flags); -// } break; - -// case INS_SIGN_TRANSACTION: { -// if (G_io_apdu_buffer[OFFSET_LC] != rx - OFFSET_CDATA) { -// // the length of the APDU should match what's in the 5-byte header. -// // If not fail. Don't want to buffer overrun or anything. -// THROW(0x6985); -// } - -// uint8_t p1 = G_io_apdu_buffer[OFFSET_P1]; -// if (p1 == P1_NON_CONFIRM) { -// // Don't allow blind signing. -// THROW(0x6808); -// } - -// uint8_t p2 = G_io_apdu_buffer[OFFSET_P2]; -// bool more = (bool) (p2 & P2_MORE); - -// // P2_MORE is a signal for more apdu to receive in current chunk; -// // P2_EXTEND is a signal for extended buffer and can't be in first chunk; -// // P2_MORE && !P2_EXTEND = first chunk; -// // P2_EXTEND && !P2_MORE = last chunk; -// // P2_EXTEND && P2_MORE = ordinary request without chunks; - -// // P2_EXTEND is set to signal that this APDU buffer extends, rather -// // than replaces, the current message buffer -// bool first_data_chunk = !(p2 & P2_EXTEND); - -// handleSignTransaction(G_io_apdu_buffer + OFFSET_CDATA, -// G_io_apdu_buffer[OFFSET_LC], -// flags, -// first_data_chunk, -// more); -// } break; - -// default: -// THROW(0x6D00); -// break; -// } -// } -// CATCH(EXCEPTION_IO_RESET) { -// THROW(EXCEPTION_IO_RESET); -// } -// CATCH_OTHER(e) { -// switch (e & 0xF000) { -// case 0x6000: -// sw = e; -// break; -// case 0x9000: -// // All is well -// sw = e; -// break; -// default: -// // Internal error -// sw = 0x6800 | (e & 0x7FF); -// break; -// } -// // Unexpected exception => report -// G_io_apdu_buffer[*tx] = sw >> 8; -// G_io_apdu_buffer[*tx + 1] = sw; -// *tx += 2; -// } -// FINALLY { -// } -// } -// END_TRY; -// } - void app_main(void) { - volatile unsigned int rx = 0; - volatile unsigned int tx = 0; volatile unsigned int flags = 0; // Length of APDU command received in G_io_apdu_buffer @@ -246,204 +91,5 @@ void app_main(void) { } } END_TRY; - - // volatile unsigned short sw = 0; - // BEGIN_TRY { - // TRY { - // rx = tx; - // tx = 0; // ensure no race in catch_other if io_exchange throws - // // an error - // rx = io_exchange(CHANNEL_APDU | flags, rx); - // flags = 0; - - // // no apdu received, well, reset the session, and reset the - // // bootloader configuration - // if (rx == 0) { - // THROW(0x6982); - // } - - // PRINTF("New APDU received:\n%.*H\n", rx, G_io_apdu_buffer); - - // handleApdu(&flags, &tx, rx); - // } - // CATCH(EXCEPTION_IO_RESET) { - // THROW(EXCEPTION_IO_RESET); - // } - // CATCH_OTHER(e) { - // switch (e & 0xF000) { - // case 0x6000: - // sw = e; - // break; - // case 0x9000: - // // All is well - // sw = e; - // break; - // default: - // // Internal error - // sw = 0x6800 | (e & 0x7FF); - // break; - // } - // if (e != 0x9000) { - // flags &= ~IO_ASYNCH_REPLY; - // } - // // Unexpected exception => report - // G_io_apdu_buffer[tx] = sw >> 8; - // G_io_apdu_buffer[tx + 1] = sw; - // tx += 2; - // } - // FINALLY { - // } - // } - // END_TRY; } - // return_to_dashboard -} - -// This does not seem to be used -// // override point, but nothing more to do -// void io_seproxyhal_display(const bagl_element_t* element) { -// io_seproxyhal_display_default((bagl_element_t*) element); -// } - -// unsigned char io_event(unsigned char channel) { -// UNUSED(channel); - -// // nothing done with the event, throw an error on the transport layer if -// // needed - -// // can't have more than one tag in the reply, not supported yet. -// switch (G_io_seproxyhal_spi_buffer[0]) { -// case SEPROXYHAL_TAG_FINGER_EVENT: -// UX_FINGER_EVENT(G_io_seproxyhal_spi_buffer); -// break; - -// case SEPROXYHAL_TAG_BUTTON_PUSH_EVENT: -// UX_BUTTON_PUSH_EVENT(G_io_seproxyhal_spi_buffer); -// break; - -// case SEPROXYHAL_TAG_STATUS_EVENT: -// if (G_io_apdu_media == IO_APDU_MEDIA_USB_HID && -// !(U4BE(G_io_seproxyhal_spi_buffer, 3) & -// SEPROXYHAL_TAG_STATUS_EVENT_FLAG_USB_POWERED)) { -// THROW(EXCEPTION_IO_RESET); -// } -// // no break is intentional -// __attribute__((fallthrough)); -// default: -// UX_DEFAULT_EVENT(); -// break; - -// case SEPROXYHAL_TAG_DISPLAY_PROCESSED_EVENT: -// UX_DISPLAYED_EVENT({}); -// break; - -// case SEPROXYHAL_TAG_TICKER_EVENT: -// UX_TICKER_EVENT(G_io_seproxyhal_spi_buffer, { -// #ifndef TARGET_NANOX -// if (UX_ALLOWED) { -// if (ux_step_count) { -// // prepare next screen -// ux_step = (ux_step + 1) % ux_step_count; -// // redisplay screen -// UX_REDISPLAY(); -// } -// } -// #endif // TARGET_NANOX -// }); -// break; -// } - -// // close the event if not done previously (by a display or whatever) -// if (!io_seproxyhal_spi_is_status_sent()) { -// io_seproxyhal_general_status(); -// } - -// // command has been processed, DO NOT reset the current APDU transport -// return 1; -// } - -// unsigned short io_exchange_al(unsigned char channel, unsigned short tx_len) { -// switch (channel & ~(IO_FLAGS)) { -// case CHANNEL_KEYBOARD: -// break; - -// // multiplexed io exchange over a SPI channel and TLV encapsulated protocol -// case CHANNEL_SPI: -// if (tx_len) { -// io_seproxyhal_spi_send(G_io_apdu_buffer, tx_len); - -// if (channel & IO_RESET_AFTER_REPLIED) { -// reset(); -// } -// return 0; // nothing received from the master so far (it's a tx -// // transaction) -// } else { -// return io_seproxyhal_spi_recv(G_io_apdu_buffer, sizeof(G_io_apdu_buffer), 0); -// } - -// default: -// THROW(INVALID_PARAMETER); -// } -// return 0; -// } - -// /** -// * Exit the application and go back to the dashboard. -// */ -// void app_exit() { -// BEGIN_TRY_L(exit) { -// TRY_L(exit) { -// os_sched_exit(-1); -// } -// FINALLY_L(exit) { -// } -// } -// END_TRY_L(exit); -// } - -// void nv_app_state_init() { -// } - -// __attribute__((section(".boot"))) int main(void) { -// // exit critical section -// __asm volatile("cpsie i"); - -// // ensure exception will work as planned -// os_boot(); - -// for (;;) { -// UX_INIT(); - -// BEGIN_TRY { -// TRY { -// io_seproxyhal_init(); - -// nv_app_state_init(); - -// USB_power(0); -// USB_power(1); - -// ui_main_menu(); - -// #ifdef HAVE_BLE -// BLE_power(0, NULL); -// BLE_power(1, "Nano X"); -// #endif // HAVE_BLE - -// app_main(); -// } -// CATCH(EXCEPTION_IO_RESET) { -// // reset IO and UX before continuing -// continue; -// } -// CATCH_ALL { -// break; -// } -// FINALLY { -// } -// } -// END_TRY; -// } -// app_exit(); -// return 0; -// } +} \ No newline at end of file diff --git a/src/response_setter.c b/src/response_setter.c deleted file mode 100644 index 403d8f3..0000000 --- a/src/response_setter.c +++ /dev/null @@ -1,89 +0,0 @@ -#include "response_setter.h" - -uint8_t set_result_get_address() { - uint8_t tx = 0; - G_io_apdu_buffer[tx++] = ADDRESS_LENGTH; - memmove(G_io_apdu_buffer + tx, data_context.addr_context.address, ADDRESS_LENGTH); - tx += ADDRESS_LENGTH; - reset_app_context(); - return tx; -} - -uint8_t set_result_get_public_key() { - uint8_t tx = 0; - G_io_apdu_buffer[tx++] = PUBLIC_KEY_LENGTH; - memmove(G_io_apdu_buffer + tx, data_context.pk_context.public_key, PUBLIC_KEY_LENGTH); - tx += PUBLIC_KEY_LENGTH; - reset_app_context(); - return tx; -} - -uint8_t set_result_sign_transaction() { - cx_ecfp_private_key_t privateKey; - SignTransactionContext_t* context = &data_context.sign_tr_context; - cx_err_t error; - - BEGIN_TRY { - TRY { - get_private_key(context->account_number, &privateKey); - if (!context->sign_with_chain_id) { - error = cx_eddsa_sign_no_throw(&privateKey, - CX_SHA512, - context->to_sign, - TO_SIGN_LENGTH, - context->signature, - SIGNATURE_LENGTH); - } else { - error = cx_eddsa_sign_no_throw(&privateKey, - CX_SHA512, - context->to_sign, - CHAIN_ID_LENGTH + TO_SIGN_LENGTH, - context->signature, - SIGNATURE_LENGTH); - } - if (error != CX_OK) { - THROW(ERR_SIGNING_FAILED); - } - } - FINALLY { - explicit_bzero(&privateKey, sizeof(privateKey)); - } - } - END_TRY; - - uint8_t tx = 0; - G_io_apdu_buffer[tx++] = SIGNATURE_LENGTH; - memmove(G_io_apdu_buffer + tx, context->signature, SIGNATURE_LENGTH); - tx += SIGNATURE_LENGTH; - return tx; -} - -uint8_t set_result_sign() { - cx_ecfp_private_key_t privateKey; - SignContext_t* context = &data_context.sign_context; - cx_err_t error; - BEGIN_TRY { - TRY { - get_private_key(context->account_number, &privateKey); - error = cx_eddsa_sign_no_throw(&privateKey, - CX_SHA512, - context->to_sign, - SIGN_MAGIC_LENGTH + TO_SIGN_LENGTH, - context->signature, - SIGNATURE_LENGTH); - if (error != CX_OK) { - THROW(ERR_SIGNING_FAILED); - } - } - FINALLY { - explicit_bzero(&privateKey, sizeof(privateKey)); - } - } - END_TRY; - - uint8_t tx = 0; - G_io_apdu_buffer[tx++] = SIGNATURE_LENGTH; - memmove(G_io_apdu_buffer + tx, context->signature, SIGNATURE_LENGTH); - tx += SIGNATURE_LENGTH; - return tx; -} diff --git a/src/response_setter.h b/src/response_setter.h deleted file mode 100644 index 7ef7c5d..0000000 --- a/src/response_setter.h +++ /dev/null @@ -1,8 +0,0 @@ -#pragma once -#include "globals.h" -#include "utils.h" - -uint8_t set_result_get_address(); -uint8_t set_result_get_public_key(); -uint8_t set_result_sign_transaction(); -uint8_t set_result_sign(); diff --git a/src/ui/display_bagl.c b/src/ui/display_bagl.c index 7b75ae3..1b6b235 100644 --- a/src/ui/display_bagl.c +++ b/src/ui/display_bagl.c @@ -1,6 +1,5 @@ #ifdef HAVE_BAGL #include "display.h" -#include "response_setter.h" #include "contract.h" #include "ui/action/validate.h" #include "ui/menu.h" diff --git a/src/ui/display_nbgl.c b/src/ui/display_nbgl.c index 7d29b1d..492d2d7 100644 --- a/src/ui/display_nbgl.c +++ b/src/ui/display_nbgl.c @@ -1,6 +1,5 @@ #ifdef HAVE_NBGL #include "display.h" -#include "response_setter.h" #include "contract.h" // TODO: Implement this diff --git a/src/utils.c b/src/utils.c index ca94f42..5ff7652 100644 --- a/src/utils.c +++ b/src/utils.c @@ -64,31 +64,31 @@ int get_private_key(uint32_t account_number, cx_ecfp_private_key_t* privateKey) return 0; } -void send_response(uint8_t tx, bool approve) { - G_io_apdu_buffer[tx++] = approve ? 0x90 : 0x69; - G_io_apdu_buffer[tx++] = approve ? 0x00 : 0x85; - reset_app_context(); - // Send back the response, do not restart the event loop - io_exchange(CHANNEL_APDU | IO_RETURN_AFTER_TX, tx); - // Display back the original UX - ui_main_menu(); -} +// void send_response(uint8_t tx, bool approve) { +// G_io_apdu_buffer[tx++] = approve ? 0x90 : 0x69; +// G_io_apdu_buffer[tx++] = approve ? 0x00 : 0x85; +// reset_app_context(); +// // Send back the response, do not restart the event loop +// io_exchange(CHANNEL_APDU | IO_RETURN_AFTER_TX, tx); +// // Display back the original UX +// ui_main_menu(); +// } -unsigned int ui_prepro(const bagl_element_t* element) { - unsigned int display = 1; - if (element->component.userid > 0) { - display = (ux_step == element->component.userid - 1); - if (display) { - if (element->component.userid == 1) { - UX_CALLBACK_SET_INTERVAL(2000); - } else { - UX_CALLBACK_SET_INTERVAL( - MAX(3000, 1000 + bagl_label_roundtrip_duration_ms(element, 7))); - } - } - } - return display; -} +// unsigned int ui_prepro(const bagl_element_t* element) { +// unsigned int display = 1; +// if (element->component.userid > 0) { +// display = (ux_step == element->component.userid - 1); +// if (display) { +// if (element->component.userid == 1) { +// UX_CALLBACK_SET_INTERVAL(2000); +// } else { +// UX_CALLBACK_SET_INTERVAL( +// MAX(3000, 1000 + bagl_label_roundtrip_duration_ms(element, 7))); +// } +// } +// } +// return display; +// } #endif diff --git a/src/utils.h b/src/utils.h index e7f468c..0c2b934 100644 --- a/src/utils.h +++ b/src/utils.h @@ -25,7 +25,6 @@ uint32_t readUint32BE(uint8_t* buffer); uint64_t readUint64BE(uint8_t* buffer); uint8_t leading_zeros(uint16_t value); -// uint16_t format_hex(const uint8_t* in, size_t in_len, char* out, size_t out_len); uint8_t convert_hex_amount_to_displayable(const uint8_t* amount, uint8_t decimals, uint8_t amount_length, From adf1d3140a72dff453ce0e5a947f04de2bb29e46 Mon Sep 17 00:00:00 2001 From: keiff3r Date: Wed, 19 Feb 2025 14:57:35 +0100 Subject: [PATCH 33/67] refactor: use the output value of a function --- src/utils.c | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/src/utils.c b/src/utils.c index 5ff7652..d081b3e 100644 --- a/src/utils.c +++ b/src/utils.c @@ -45,15 +45,18 @@ int get_private_key(uint32_t account_number, cx_ecfp_private_key_t* privateKey) 0 | HARDENED_OFFSET}; uint8_t privateKeyData[64]; - cx_err_t error = os_derive_bip32_with_seed_no_throw(HDW_ED25519_SLIP10, - CX_CURVE_Ed25519, - derivePath, - BIP32_PATH, - privateKeyData, - NULL, - NULL, - 0); - error = cx_ecfp_init_private_key_no_throw(CX_CURVE_Ed25519, privateKeyData, 32, privateKey); + if (os_derive_bip32_with_seed_no_throw(HDW_ED25519_SLIP10, + CX_CURVE_Ed25519, + derivePath, + BIP32_PATH, + privateKeyData, + NULL, + NULL, + 0) != CX_OK) { + return -1; + } + cx_err_t error = + cx_ecfp_init_private_key_no_throw(CX_CURVE_Ed25519, privateKeyData, 32, privateKey); explicit_bzero(&privateKeyData, sizeof(privateKeyData)); From 0af4b935d7ee90f2c117f85ac5f1c8ef6a9a7b3f Mon Sep 17 00:00:00 2001 From: keiff3r Date: Wed, 19 Feb 2025 16:19:53 +0100 Subject: [PATCH 34/67] refactor: delete unused and commented out code --- src/utils.c | 26 -------------------------- src/utils.h | 2 -- 2 files changed, 28 deletions(-) diff --git a/src/utils.c b/src/utils.c index d081b3e..c967bb3 100644 --- a/src/utils.c +++ b/src/utils.c @@ -67,32 +67,6 @@ int get_private_key(uint32_t account_number, cx_ecfp_private_key_t* privateKey) return 0; } -// void send_response(uint8_t tx, bool approve) { -// G_io_apdu_buffer[tx++] = approve ? 0x90 : 0x69; -// G_io_apdu_buffer[tx++] = approve ? 0x00 : 0x85; -// reset_app_context(); -// // Send back the response, do not restart the event loop -// io_exchange(CHANNEL_APDU | IO_RETURN_AFTER_TX, tx); -// // Display back the original UX -// ui_main_menu(); -// } - -// unsigned int ui_prepro(const bagl_element_t* element) { -// unsigned int display = 1; -// if (element->component.userid > 0) { -// display = (ux_step == element->component.userid - 1); -// if (display) { -// if (element->component.userid == 1) { -// UX_CALLBACK_SET_INTERVAL(2000); -// } else { -// UX_CALLBACK_SET_INTERVAL( -// MAX(3000, 1000 + bagl_label_roundtrip_duration_ms(element, 7))); -// } -// } -// } -// return display; -// } - #endif void writeUint32BE(uint32_t val, uint8_t* bytes) { diff --git a/src/utils.h b/src/utils.h index 0c2b934..fe70505 100644 --- a/src/utils.h +++ b/src/utils.h @@ -10,10 +10,8 @@ #ifndef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION -unsigned int ui_prepro(const bagl_element_t* element); int get_public_key(uint32_t accountNumber, uint8_t* publicKeyArray); int get_private_key(uint32_t accountNumber, cx_ecfp_private_key_t* privateKey); -void send_response(uint8_t tx, bool approve); #endif From 8342afb4f2f3f4833527c99b31d1b1bb17a6571a Mon Sep 17 00:00:00 2001 From: keiff3r Date: Wed, 19 Feb 2025 16:30:26 +0100 Subject: [PATCH 35/67] build: add app load flags for Everscale application --- Makefile | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Makefile b/Makefile index b28a83a..c6c181c 100644 --- a/Makefile +++ b/Makefile @@ -27,6 +27,8 @@ include $(BOLOS_SDK)/Makefile.defines # Application name APPNAME = "Everscale" +APP_LOAD_FLAGS=--appFlags 0x200 + # Application version APPVERSION_M = 1 APPVERSION_N = 0 From 1a01d5da8e1c79254ba604f8253b8728cb0d8afe Mon Sep 17 00:00:00 2001 From: keiff3r Date: Wed, 19 Feb 2025 16:57:21 +0100 Subject: [PATCH 36/67] update: replace boilerplate icons with Everscale app icons --- Makefile | 8 ++++---- ...oilerplate_14px.gif => app_everscale_14px.gif} | Bin ...oilerplate_16px.gif => app_everscale_16px.gif} | Bin ...oilerplate_32px.gif => app_everscale_32px.gif} | Bin ...oilerplate_40px.gif => app_everscale_40px.gif} | Bin icons/app_everscale_64px.gif | Bin 0 -> 228 bytes 6 files changed, 4 insertions(+), 4 deletions(-) rename icons/{app_boilerplate_14px.gif => app_everscale_14px.gif} (100%) rename icons/{app_boilerplate_16px.gif => app_everscale_16px.gif} (100%) rename icons/{app_boilerplate_32px.gif => app_everscale_32px.gif} (100%) rename icons/{app_boilerplate_40px.gif => app_everscale_40px.gif} (100%) create mode 100644 icons/app_everscale_64px.gif diff --git a/Makefile b/Makefile index c6c181c..2ccc615 100644 --- a/Makefile +++ b/Makefile @@ -40,10 +40,10 @@ APP_SOURCE_PATH += src # Application icons following guidelines: # https://developers.ledger.com/docs/embedded-app/design-requirements/#device-icon -ICON_NANOX = icons/app_boilerplate_14px.gif -ICON_NANOSP = icons/app_boilerplate_14px.gif -ICON_STAX = icons/app_boilerplate_32px.gif -ICON_FLEX = icons/app_boilerplate_40px.gif +ICON_NANOX = icons/app_everscale_14px.gif +ICON_NANOSP = icons/app_everscale_14px.gif +ICON_STAX = icons/app_everscale_32px.gif +ICON_FLEX = icons/app_everscale_40px.gif # Application allowed derivation curves. # Possibles curves are: secp256k1, secp256r1, ed25519 and bls12381g1 diff --git a/icons/app_boilerplate_14px.gif b/icons/app_everscale_14px.gif similarity index 100% rename from icons/app_boilerplate_14px.gif rename to icons/app_everscale_14px.gif diff --git a/icons/app_boilerplate_16px.gif b/icons/app_everscale_16px.gif similarity index 100% rename from icons/app_boilerplate_16px.gif rename to icons/app_everscale_16px.gif diff --git a/icons/app_boilerplate_32px.gif b/icons/app_everscale_32px.gif similarity index 100% rename from icons/app_boilerplate_32px.gif rename to icons/app_everscale_32px.gif diff --git a/icons/app_boilerplate_40px.gif b/icons/app_everscale_40px.gif similarity index 100% rename from icons/app_boilerplate_40px.gif rename to icons/app_everscale_40px.gif diff --git a/icons/app_everscale_64px.gif b/icons/app_everscale_64px.gif new file mode 100644 index 0000000000000000000000000000000000000000..0125e6b45ca7127e161ad0fb4534a92b15b2e45a GIT binary patch literal 228 zcmVg}tsmtvTqnxxZ0Ic2# z^KW4uNJ3&(rp&3f$T_+yjLIo(-*laGJKqcag1#S+C@~(959N~Ca6X|5Db-}XI;1ge zl{@2#$Kx;gjD}s(Y;v>>S7PJzskzRs;PaZjyXYrJ5@^&ysOEBL2SP~X2USNE2|4MA z$Fzr;85C%_+0&SF2r3p(CJJV7nwa&H$||@PYd9-gNPF8 Date: Wed, 19 Feb 2025 17:00:00 +0100 Subject: [PATCH 37/67] fix: make compilation work on flex & stax --- src/ui/display_nbgl.c | 2 ++ src/ui/menu_nbgl.c | 17 ++++++++--------- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/src/ui/display_nbgl.c b/src/ui/display_nbgl.c index 492d2d7..f16cf66 100644 --- a/src/ui/display_nbgl.c +++ b/src/ui/display_nbgl.c @@ -1,6 +1,8 @@ #ifdef HAVE_NBGL #include "display.h" #include "contract.h" +#include "ui/action/validate.h" +#include "ui/menu.h" // TODO: Implement this void ui_display_address() { diff --git a/src/ui/menu_nbgl.c b/src/ui/menu_nbgl.c index d569931..bbd06f1 100644 --- a/src/ui/menu_nbgl.c +++ b/src/ui/menu_nbgl.c @@ -1,7 +1,9 @@ #ifdef HAVE_NBGL -#include "menu.h" #include "os.h" +#include "nbgl_content.h" +#include "nbgl_use_case.h" +#include "menu.h" // ----------------------------------------------------------- // --------------------- SETTINGS MENU ----------------------- @@ -18,12 +20,14 @@ static const nbgl_contentInfoList_t infoList = { // ----------------------------------------------------------- // ----------------------- HOME PAGE ------------------------- // ----------------------------------------------------------- +void app_quit(void) { + // exit app here + os_sched_exit(-1); +} void ui_main_menu(void) { - tx_state->currentInstruction = -1; - nbgl_useCaseHomeAndSettings(APPNAME, - &C_app_everscale_64px, + &C_app_everscale_40px, NULL, INIT_HOME_PAGE, NULL, @@ -32,9 +36,4 @@ void ui_main_menu(void) { app_quit); } -void app_quit(void) { - // exit app here - os_sched_exit(-1); -} - #endif \ No newline at end of file From 9f148b236cd1451560d5fcafe64fc50c0aff7990 Mon Sep 17 00:00:00 2001 From: keiff3r Date: Wed, 19 Feb 2025 17:30:32 +0100 Subject: [PATCH 38/67] chore: reorganize Everscale app icons for different device sizes --- icons/app_everscale_14px.gif | Bin 70 -> 97 bytes icons/app_everscale_16px.gif | Bin 66 -> 99 bytes icons/app_everscale_64px.gif | Bin 228 -> 0 bytes icons/nanos_app_everscale.gif | Bin 99 -> 0 bytes icons/nanox_app_everscale.gif | Bin 97 -> 0 bytes 5 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 icons/app_everscale_64px.gif delete mode 100644 icons/nanos_app_everscale.gif delete mode 100644 icons/nanox_app_everscale.gif diff --git a/icons/app_everscale_14px.gif b/icons/app_everscale_14px.gif index 7dedb19784df83ce976bd5aef8a768e942754aa8..66e5e2cd053b9509025f3d9552300e34e0f70730 100644 GIT binary patch literal 97 zcmZ?wbhEHbB&gM%`%*{=-HPACL s1wjTKkP?tS1}3SV{*~Pi-V4piJ(R4;U0(i8cj2cTx0E8yUHq)$ literal 70 zcmZ?wbhEHbOug}tsmtvTqnxxZ0Ic2# z^KW4uNJ3&(rp&3f$T_+yjLIo(-*laGJKqcag1#S+C@~(959N~Ca6X|5Db-}XI;1ge zl{@2#$Kx;gjD}s(Y;v>>S7PJzskzRs;PaZjyXYrJ5@^&ysOEBL2SP~X2USNE2|4MA z$Fzr;85C%_+0&SF2r3p(CJJV7nwa&H$||@PYd9-gNPF8B&gM%`%*{=-HPACL s1wjTKkP?tS1}3SV{*~Pi-V4piJ(R4;U0(i8cj2cTx0E8yUHq)$ From a47d54a90633c3fd473d5b723a675c8946400db7 Mon Sep 17 00:00:00 2001 From: keiff3r Date: Wed, 12 Feb 2025 16:25:36 +0100 Subject: [PATCH 39/67] feat: add Docker Compose and GDB debug script debug purposes - Create docker-compose.yml for Speculos emulator setup - Add gdb.sh script to simplify debugging workflow - Configure container with source, binary, and debug port mappings --- docker-compose.yml | 16 ++++++++++++++++ gdb.sh | 12 ++++++++++++ 2 files changed, 28 insertions(+) create mode 100644 docker-compose.yml create mode 100755 gdb.sh diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..73ecd1e --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,16 @@ +# version: "3.7" + +services: + nanosp: + image: ghcr.io/blooo-io/speculos:latest + volumes: + - ./bin:/speculos/apps + - ./src:/speculos/sources + - ./build:/speculos/build + ports: + - "5000:5000" # api + - "40000:40000" # apdu + environment: + - GDB_DIRECTORY_LIST="/speculos/sources:/speculos/sources/ui:/speculos/sources/handler:" + command: "-d --model nanosp build/nanos2/bin/app.elf --display headless --apdu-port 40000" + # Add `--vnc-password ""` for macos users to use built-in vnc client. \ No newline at end of file diff --git a/gdb.sh b/gdb.sh new file mode 100755 index 0000000..937fa2c --- /dev/null +++ b/gdb.sh @@ -0,0 +1,12 @@ +#!/bin/bash + +docker compose up -d + +# Wait for the container to start +until docker inspect -f '{{.State.Status}}' app-everscale-nanosp-1 | grep -q "running"; do + sleep 1 +done + +docker exec -it app-everscale-nanosp-1 ./tools/debug.sh apps/app.elf + +docker compose down \ No newline at end of file From 0e13fc6f326646776a710630ad403208002ff9b6 Mon Sep 17 00:00:00 2001 From: keiff3r Date: Thu, 20 Feb 2025 09:55:22 +0100 Subject: [PATCH 40/67] refactor: delete useless file --- src/example.c | 144 -------------------------------------------------- 1 file changed, 144 deletions(-) delete mode 100644 src/example.c diff --git a/src/example.c b/src/example.c deleted file mode 100644 index 739bc26..0000000 --- a/src/example.c +++ /dev/null @@ -1,144 +0,0 @@ - -// unsigned short sw = 0; - -// if (!flags || !tx) { -// THROW(0x6802); -// } - -// if (rx < 0) { -// THROW(0x6813); -// } - -// BEGIN_TRY { -// TRY { -// if (G_io_apdu_buffer[OFFSET_CLA] != CLA) { -// THROW(0x6E00); -// } -// // must at least hold the class and instruction -// if (rx <= OFFSET_INS) { -// THROW(0x6b00); -// } -// PRINTF("command: %d\n", G_io_apdu_buffer[OFFSET_INS]); -// switch (G_io_apdu_buffer[OFFSET_INS]) { -// case INS_GET_APP_CONFIGURATION: { -// if (G_io_apdu_buffer[OFFSET_P1] != 0 || G_io_apdu_buffer[OFFSET_P2] != 0) { -// THROW(0x6802); -// } - -// handleGetAppConfiguration(G_io_apdu_buffer[OFFSET_P1], -// G_io_apdu_buffer[OFFSET_P2], -// G_io_apdu_buffer + OFFSET_CDATA, -// G_io_apdu_buffer[OFFSET_LC], -// flags, -// tx); -// } break; - -// case INS_GET_PUBLIC_KEY: { -// if (G_io_apdu_buffer[OFFSET_LC] != rx - OFFSET_CDATA) { -// // the length of the APDU should match what's in the 5-byte header. -// // If not fail. Don't want to buffer overrun or anything. -// THROW(0x6985); -// } - -// handleGetPublicKey(G_io_apdu_buffer[OFFSET_P1], -// G_io_apdu_buffer[OFFSET_P2], -// G_io_apdu_buffer + OFFSET_CDATA, -// G_io_apdu_buffer[OFFSET_LC], -// flags, -// tx); -// } break; - -// case INS_GET_ADDRESS: { -// if (G_io_apdu_buffer[OFFSET_LC] != rx - OFFSET_CDATA) { -// // the length of the APDU should match what's in the 5-byte header. -// // If not fail. Don't want to buffer overrun or anything. -// THROW(0x6985); -// } - -// handleGetAddress(G_io_apdu_buffer[OFFSET_P1], -// G_io_apdu_buffer[OFFSET_P2], -// G_io_apdu_buffer + OFFSET_CDATA, -// G_io_apdu_buffer[OFFSET_LC], -// flags, -// tx); -// } break; - -// case INS_SIGN: { -// if (G_io_apdu_buffer[OFFSET_P1] != P1_CONFIRM || G_io_apdu_buffer[OFFSET_P2] != -// 0) { -// THROW(0x6802); -// } - -// if (G_io_apdu_buffer[OFFSET_LC] != rx - OFFSET_CDATA) { -// // the length of the APDU should match what's in the 5-byte header. -// // If not fail. Don't want to buffer overrun or anything. -// THROW(0x6985); -// } - -// handleSign(G_io_apdu_buffer + OFFSET_CDATA, G_io_apdu_buffer[OFFSET_LC], flags); -// } break; - -// case INS_SIGN_TRANSACTION: { -// if (G_io_apdu_buffer[OFFSET_LC] != rx - OFFSET_CDATA) { -// // the length of the APDU should match what's in the 5-byte header. -// // If not fail. Don't want to buffer overrun or anything. -// THROW(0x6985); -// } - -// uint8_t p1 = G_io_apdu_buffer[OFFSET_P1]; -// if (p1 == P1_NON_CONFIRM) { -// // Don't allow blind signing. -// THROW(0x6808); -// } - -// uint8_t p2 = G_io_apdu_buffer[OFFSET_P2]; -// bool more = (bool) (p2 & P2_MORE); - -// // P2_MORE is a signal for more apdu to receive in current chunk; -// // P2_EXTEND is a signal for extended buffer and can't be in first chunk; -// // P2_MORE && !P2_EXTEND = first chunk; -// // P2_EXTEND && !P2_MORE = last chunk; -// // P2_EXTEND && P2_MORE = ordinary request without chunks; - -// // P2_EXTEND is set to signal that this APDU buffer extends, rather -// // than replaces, the current message buffer -// bool first_data_chunk = !(p2 & P2_EXTEND); - -// handleSignTransaction(G_io_apdu_buffer + OFFSET_CDATA, -// G_io_apdu_buffer[OFFSET_LC], -// flags, -// first_data_chunk, -// more); -// } break; - -// default: -// THROW(0x6D00); -// break; -// } -// } -// CATCH(EXCEPTION_IO_RESET) { -// THROW(EXCEPTION_IO_RESET); -// } -// CATCH_OTHER(e) { -// switch (e & 0xF000) { -// case 0x6000: -// sw = e; -// break; -// case 0x9000: -// // All is well -// sw = e; -// break; -// default: -// // Internal error -// sw = 0x6800 | (e & 0x7FF); -// break; -// } -// // Unexpected exception => report -// G_io_apdu_buffer[*tx] = sw >> 8; -// G_io_apdu_buffer[*tx + 1] = sw; -// *tx += 2; -// } -// FINALLY { -// } -// } -// END_TRY; \ No newline at end of file From 6e42f364a60d861ed2c70088cdf47445841e8fbb Mon Sep 17 00:00:00 2001 From: keiff3r Date: Thu, 20 Feb 2025 09:55:43 +0100 Subject: [PATCH 41/67] chore: rename boilerplate to everscale --- src/apdu/dispatcher.c | 2 +- src/ui/action/validate.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/apdu/dispatcher.c b/src/apdu/dispatcher.c index 14229c1..738054e 100644 --- a/src/apdu/dispatcher.c +++ b/src/apdu/dispatcher.c @@ -1,5 +1,5 @@ /***************************************************************************** - * Ledger App Boilerplate. + * Ledger App Everscale. * (c) 2020 Ledger SAS. * * Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/src/ui/action/validate.c b/src/ui/action/validate.c index 2d66aba..d1b2e29 100644 --- a/src/ui/action/validate.c +++ b/src/ui/action/validate.c @@ -1,5 +1,5 @@ /***************************************************************************** - * Ledger App Boilerplate. + * Ledger App Everscale. * (c) 2020 Ledger SAS. * * Licensed under the Apache License, Version 2.0 (the "License"); From 8a86e5822536cc693e57871eb5db6040f101bdad Mon Sep 17 00:00:00 2001 From: keiff3r Date: Thu, 20 Feb 2025 10:07:43 +0100 Subject: [PATCH 42/67] chore: remove useless comments --- src/helper/send_response.c | 41 -------------------------------------- src/main.c | 9 --------- src/utils.c | 27 ------------------------- 3 files changed, 77 deletions(-) diff --git a/src/helper/send_response.c b/src/helper/send_response.c index 30cc407..a5a211f 100644 --- a/src/helper/send_response.c +++ b/src/helper/send_response.c @@ -20,53 +20,12 @@ int helper_send_response_address() { return io_send_response_pointer(resp, offset, SUCCESS); } -// uint8_t helper_send_response_sign_transaction() { -// cx_ecfp_private_key_t privateKey; -// SignTransactionContext_t* context = &data_context.sign_tr_context; -// cx_err_t error; - -// BEGIN_TRY { -// TRY { -// get_private_key(context->account_number, &privateKey); -// if (!context->sign_with_chain_id) { -// error = cx_eddsa_sign_no_throw(&privateKey, -// CX_SHA512, -// context->to_sign, -// TO_SIGN_LENGTH, -// context->signature, -// SIGNATURE_LENGTH); -// } else { -// error = cx_eddsa_sign_no_throw(&privateKey, -// CX_SHA512, -// context->to_sign, -// CHAIN_ID_LENGTH + TO_SIGN_LENGTH, -// context->signature, -// SIGNATURE_LENGTH); -// } -// if (error != CX_OK) { -// THROW(ERR_SIGNING_FAILED); -// } -// } -// FINALLY { -// explicit_bzero(&privateKey, sizeof(privateKey)); -// } -// } -// END_TRY; - -// uint8_t tx = 0; -// G_io_apdu_buffer[tx++] = SIGNATURE_LENGTH; -// memmove(G_io_apdu_buffer + tx, context->signature, SIGNATURE_LENGTH); -// tx += SIGNATURE_LENGTH; -// return tx; -// } - int helper_send_response_sign() { uint8_t resp[1 + SIGNATURE_LENGTH] = {0}; size_t offset = 0; resp[offset++] = SIGNATURE_LENGTH; memmove(resp + offset, data_context.sign_context.signature, SIGNATURE_LENGTH); offset += SIGNATURE_LENGTH; - // reset_app_context(); return io_send_response_pointer(resp, offset, SUCCESS); } diff --git a/src/main.c b/src/main.c index 92f8f5d..7789413 100644 --- a/src/main.c +++ b/src/main.c @@ -43,17 +43,8 @@ void app_main(void) { ui_main_menu(); - // Stores the information about the current command. Some commands expect - // multiple APDUs before they become complete and executed. reset_app_context(); - // reset_spi_buffer(); - // DESIGN NOTE: the bootloader ignores the way APDU are fetched. The only - // goal is to retrieve APDU. - // When APDU are to be fetched from multiple IOs, like NFC+USB+BLE, make - // sure the io_event is called with a - // switch event, before the apdu is replied to the bootloader. This avoid - // APDU injection faults. for (;;) { // Receive command bytes in G_io_apdu_buffer if ((input_len = io_recv_command()) < 0) { diff --git a/src/utils.c b/src/utils.c index c967bb3..abd623d 100644 --- a/src/utils.c +++ b/src/utils.c @@ -114,33 +114,6 @@ uint8_t leading_zeros(uint16_t value) { return lz; } -// uint16_t format_hex(const uint8_t* in, size_t in_len, char* out, size_t out_len) { -// if (out_len < 2 * in_len + 1) { -// return -1; -// } - -// const char hex[] = "0123456789abcdef"; -// size_t i = 0; -// int written = 0; - -// while (i < in_len && (i * 2 + (2 + 1)) <= out_len) { -// uint8_t high_nibble = (in[i] & 0xF0) >> 4; -// *out = hex[high_nibble]; -// out++; - -// uint8_t low_nibble = in[i] & 0x0F; -// *out = hex[low_nibble]; -// out++; - -// i++; -// written += 2; -// } - -// *out = '\0'; - -// return written + 1; -// } - #define SCRATCH_SIZE 37 uint8_t convert_hex_amount_to_displayable(const uint8_t* amount, uint8_t decimals, From 9479f156b1f606d5b71d72ab7628943d376c9221 Mon Sep 17 00:00:00 2001 From: keiff3r Date: Wed, 19 Feb 2025 18:11:00 +0100 Subject: [PATCH 43/67] feat: implement get_addres display for nbgl devices [LDG-659] --- src/ui/display_nbgl.c | 15 +++++++++++++++ .../00000.png | Bin 0 -> 9046 bytes .../00001.png | Bin 0 -> 19178 bytes .../00002.png | Bin 0 -> 5874 bytes .../00003.png | Bin 0 -> 11536 bytes .../00000.png | Bin 0 -> 9046 bytes .../00001.png | Bin 0 -> 19178 bytes .../00002.png | Bin 0 -> 7967 bytes .../00003.png | Bin 0 -> 11536 bytes 9 files changed, 15 insertions(+) create mode 100644 tests/snapshots/flex/test_get_address_wallet_v3_confirm_accepted/00000.png create mode 100644 tests/snapshots/flex/test_get_address_wallet_v3_confirm_accepted/00001.png create mode 100644 tests/snapshots/flex/test_get_address_wallet_v3_confirm_accepted/00002.png create mode 100644 tests/snapshots/flex/test_get_address_wallet_v3_confirm_accepted/00003.png create mode 100644 tests/snapshots/flex/test_get_address_wallet_v3_confirm_refused/00000.png create mode 100644 tests/snapshots/flex/test_get_address_wallet_v3_confirm_refused/00001.png create mode 100644 tests/snapshots/flex/test_get_address_wallet_v3_confirm_refused/00002.png create mode 100644 tests/snapshots/flex/test_get_address_wallet_v3_confirm_refused/00003.png diff --git a/src/ui/display_nbgl.c b/src/ui/display_nbgl.c index f16cf66..80da314 100644 --- a/src/ui/display_nbgl.c +++ b/src/ui/display_nbgl.c @@ -3,9 +3,24 @@ #include "contract.h" #include "ui/action/validate.h" #include "ui/menu.h" +static void review_choice_address(bool choice) { + // Answer, display a status page and go back to main + validate_address(choice); + if (choice) { + nbgl_useCaseReviewStatus(STATUS_TYPE_ADDRESS_VERIFIED, ui_main_menu); + } else { + nbgl_useCaseReviewStatus(STATUS_TYPE_ADDRESS_REJECTED, ui_main_menu); + } +} // TODO: Implement this void ui_display_address() { + nbgl_useCaseAddressReview(data_context.addr_context.address_str, + NULL, + &C_app_everscale_40px, + "Verify Address", + NULL, + review_choice_address); } // TODO: Implement this diff --git a/tests/snapshots/flex/test_get_address_wallet_v3_confirm_accepted/00000.png b/tests/snapshots/flex/test_get_address_wallet_v3_confirm_accepted/00000.png new file mode 100644 index 0000000000000000000000000000000000000000..f7d02912895780af5ab2884f92ac75480ad0c503 GIT binary patch literal 9046 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 literal 0 HcmV?d00001 diff --git a/tests/snapshots/flex/test_get_address_wallet_v3_confirm_accepted/00001.png b/tests/snapshots/flex/test_get_address_wallet_v3_confirm_accepted/00001.png new file mode 100644 index 0000000000000000000000000000000000000000..6b9235bd9d9be0e91a3887227becb5eb25671218 GIT binary patch literal 19178 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 LS3j3^P6C%xGCTb7ko~ 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

d35T<%ZLxEI zW+hOnrl`Lw6^D${zou}Bhw}>AcgNltFc0NKFQGW9Y`PN_2B3P2xr18xC-l_;Nd0TGJ=om}tB?WsXgO-TF zlwdgo5U`bm;1p4R!RJV=4nZbmakP#0%v)5^|HM2nLMmwKkMPlvUtvsVO%wTI5{S1S z^HX{6r1t9oW!|}gqcD1aXv^43j}a%yZosFO`VPW9sW8|u%;cRsZlZNb(j_kmxgm{& znnc$ZBEIE5tFIFV>Ovc)EXHiD2YQ}+)}Gh7kdol8pvTt&te0;TANnqkeX9TM0jcRG z@zZ_O7e(^1bbBr>$Axy(KS$X%?(ucm{i*BN{%!_0YoI(SGpIZrwqgZNJ zbs2wFNq$g^?dC2F;zNRaSa;~1{oN}Xt=52F7ZHwcGji&+iv%dHqUrMmhs(zxXuyne~yP z;X(ADUcRngrSfDGn#0ib@b3)O7nHv|pVmhQSgimR1Y>fY?ZBpn7ojZg?yjlJ=D5dL zrm2mSS=*z<4(PUGXTObB_MH~h!*JqZNiI@*in+X%TX5d>Ug~H^cMMerP2>3T>$wM} z(wxz+1C2YtyB&oRb!Du-KK?v4`1Br|W~?&rqUH85OcG#QonIjpzrP>SQL!rq46ym} z>D#c(LyAc4O}YPPN9M>Tn5WB{NGhAlZ7n!)RjR#2+@A#xi(@~wtZo%yoSY2T)5|Ps zvwG)K|4|*z6nBHV#t^%!{viB~HQX0q+hs_Ad|Y*X-1mK4dj7v}e$_Y!?-zouw+%3` Q%Z8kA_4=mv*rlug0an##761SM literal 0 HcmV?d00001 diff --git a/tests/snapshots/flex/test_get_address_wallet_v3_confirm_accepted/00003.png b/tests/snapshots/flex/test_get_address_wallet_v3_confirm_accepted/00003.png new file mode 100644 index 0000000000000000000000000000000000000000..a75ab7bd56bd95c6830461d08ad664c6dc32db3d GIT binary patch literal 11536 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 literal 0 HcmV?d00001 diff --git a/tests/snapshots/flex/test_get_address_wallet_v3_confirm_refused/00000.png b/tests/snapshots/flex/test_get_address_wallet_v3_confirm_refused/00000.png new file mode 100644 index 0000000000000000000000000000000000000000..f7d02912895780af5ab2884f92ac75480ad0c503 GIT binary patch literal 9046 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 literal 0 HcmV?d00001 diff --git a/tests/snapshots/flex/test_get_address_wallet_v3_confirm_refused/00001.png b/tests/snapshots/flex/test_get_address_wallet_v3_confirm_refused/00001.png new file mode 100644 index 0000000000000000000000000000000000000000..6b9235bd9d9be0e91a3887227becb5eb25671218 GIT binary patch literal 19178 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 LS3j3^P6? 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 lO&k6%577R>KfaaDIJ^JcaPsnv{{eL%0p9=s literal 0 HcmV?d00001 diff --git a/tests/snapshots/flex/test_get_address_wallet_v3_confirm_refused/00003.png b/tests/snapshots/flex/test_get_address_wallet_v3_confirm_refused/00003.png new file mode 100644 index 0000000000000000000000000000000000000000..a75ab7bd56bd95c6830461d08ad664c6dc32db3d GIT binary patch literal 11536 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 literal 0 HcmV?d00001 From 8bfd27e79c08a479c12e5ea6a816ab9d7a6b6d85 Mon Sep 17 00:00:00 2001 From: keiff3r Date: Wed, 19 Feb 2025 19:34:01 +0100 Subject: [PATCH 44/67] test: update sign transaction tests to support multiple device types - Add scenario navigator and firmware parameters to sign transaction tests - Modify navigation logic to handle different device types (Nano vs NBGL) - Ensure consistent test coverage across various device firmware --- tests/test_sign_cmd.py | 43 +++++++++++++++++++++++++++++++----------- 1 file changed, 32 insertions(+), 11 deletions(-) diff --git a/tests/test_sign_cmd.py b/tests/test_sign_cmd.py index c208eb2..159b595 100644 --- a/tests/test_sign_cmd.py +++ b/tests/test_sign_cmd.py @@ -18,6 +18,8 @@ def run_test( test_name: str, transaction: str, expected_signature: str, + scenario_navigator: NavigateWithScenario, + firmware, ) -> None: # Use the app interface instead of raw interface client = EverscaleCommandSender(backend) @@ -30,9 +32,16 @@ def run_test( # It will yield the result when the navigation is done with client.sign_tx(transaction_bytes): # Validate the on-screen request by performing the navigation appropriate for this device - navigate_until_text_and_compare( - backend.firmware, navigator, "Accept", default_screenshot_path, test_name - ) + if firmware.is_nano: + navigate_until_text_and_compare( + backend.firmware, + navigator, + "Accept", + default_screenshot_path, + test_name, + ) + else: + scenario_navigator.review_approve() # The device as yielded the result, parse it and ensure that the signature is correct response = client.get_async_response().data @@ -54,34 +63,42 @@ def test_sign_tx_burn_usdt( navigator: Navigator, default_screenshot_path: str, test_name: str, + scenario_navigator, + firmware, ) -> None: run_test( backend, navigator, default_screenshot_path, test_name, - "0000000001090455534454000101040100c9002161b3badb535d1b88d0e4d60d316567b1448568efafdf21846ecd0ba02e3adabf97000000ca7e2c951fb3d692b2a677323640012165801be2256b3d704f24c46aea3298c1a5ea8f8d1aa86ccc89474bc0570265e7898ac0000000000000000036d36956f8b969d03802216b562548ad00000000000000000000000049504f808015e4256b3d704f24c46aea3298c1a5ea8f8d1aa86ccc89474bc0570265e7898ad00328480101c03bf4894e22cdd500e450cbe5838b9938fda1e4d3727fe3b5385c5114b0293f0001", # Transaction - "a8b3ee327f6a64945e875d59ec49b12bea553b30170be65c541176f052156035428f8a0180e9f8802622b4f3339f2161076790b822e55c0d46f01b919f6de005", # Expected_signature + "0000000001090455534454000101040100c9002161b3badb535d1b88d0e4d60d316567b1448568efafdf21846ecd0ba02e3adabf97000000ca7e2c951fb3d692b2a677323640012165801be2256b3d704f24c46aea3298c1a5ea8f8d1aa86ccc89474bc0570265e7898ac0000000000000000036d36956f8b969d03802216b562548ad00000000000000000000000049504f808015e4256b3d704f24c46aea3298c1a5ea8f8d1aa86ccc89474bc0570265e7898ad00328480101c03bf4894e22cdd500e450cbe5838b9938fda1e4d3727fe3b5385c5114b0293f0001", # Transaction + "a8b3ee327f6a64945e875d59ec49b12bea553b30170be65c541176f052156035428f8a0180e9f8802622b4f3339f2161076790b822e55c0d46f01b919f6de005", # Expected_signature + scenario_navigator, + firmware, ) - + + @pytest.mark.active_test_scope def test_sign_tx_confirm( backend: BackendInterface, navigator: Navigator, default_screenshot_path: str, test_name: str, + scenario_navigator, + firmware, ) -> None: run_test( backend, navigator, default_screenshot_path, test_name, - "00000000020904455645520001010101003b000071b3badb535d1b88d0e4d60d316567b1448568efafdf21846ecd0ba02e3adabf97000000ca7e395aa2b3d695f78d53a076b24a0de621e6767fc0", # Transaction - "8a5a9435d8b85f37f0d0b6dd0cb39521c8acf3f04cff7d53a4fb83e05313baace8b63b0fc3d8e6d0f9dd1922bc65df11efbecb9c34e4c79ec2a7267d67613e0e", # Expected_signature + "00000000020904455645520001010101003b000071b3badb535d1b88d0e4d60d316567b1448568efafdf21846ecd0ba02e3adabf97000000ca7e395aa2b3d695f78d53a076b24a0de621e6767fc0", # Transaction + "8a5a9435d8b85f37f0d0b6dd0cb39521c8acf3f04cff7d53a4fb83e05313baace8b63b0fc3d8e6d0f9dd1922bc65df11efbecb9c34e4c79ec2a7267d67613e0e", # Expected_signature + scenario_navigator, + firmware, ) - # TODO: Add tests for the other transaction types @@ -91,14 +108,18 @@ def test_sign_tx_transfer( navigator: Navigator, default_screenshot_path: str, test_name: str, + scenario_navigator, + firmware, ) -> None: run_test( backend, navigator, default_screenshot_path, test_name, - "00000000010904455645520001010301006c000161b3badb535d1b88d0e4d60d316567b1448568efafdf21846ecd0ba02e3adabf97000000ca7cfb9642b3d6449ea677323640010165801be2256b3d704f24c46aea3298c1a5ea8f8d1aa86ccc89474bc0570265e7898ac0000000000000000036d36956f8b969d038020000", # Transaction - "a0396cd952160f068e0a7d6279ba2b61a2215a4dd997fcc1fe8905722341a20a86424dfdb2598b86855e73e47a1804023ff3f9afffd91825df0f58825dabd808", # Expected_signature + "00000000010904455645520001010301006c000161b3badb535d1b88d0e4d60d316567b1448568efafdf21846ecd0ba02e3adabf97000000ca7cfb9642b3d6449ea677323640010165801be2256b3d704f24c46aea3298c1a5ea8f8d1aa86ccc89474bc0570265e7898ac0000000000000000036d36956f8b969d038020000", # Transaction + "a0396cd952160f068e0a7d6279ba2b61a2215a4dd997fcc1fe8905722341a20a86424dfdb2598b86855e73e47a1804023ff3f9afffd91825df0f58825dabd808", # Expected_signature + scenario_navigator, + firmware, ) From 0efbdb94804fbb5be05872bda05064c177fd9008 Mon Sep 17 00:00:00 2001 From: keiff3r Date: Thu, 20 Feb 2025 10:51:40 +0100 Subject: [PATCH 45/67] feat: implement sign_transaction display for nbgl devices [LDG-661] --- src/ui/display_nbgl.c | 62 ++++++++++++++++++ .../flex/test_sign_tx_burn_usdt/00000.png | Bin 0 -> 9253 bytes .../flex/test_sign_tx_burn_usdt/00001.png | Bin 0 -> 8782 bytes .../flex/test_sign_tx_burn_usdt/00002.png | Bin 0 -> 9888 bytes .../flex/test_sign_tx_burn_usdt/00003.png | Bin 0 -> 6357 bytes .../flex/test_sign_tx_burn_usdt/00004.png | Bin 0 -> 11536 bytes .../flex/test_sign_tx_confirm/00000.png | Bin 0 -> 9253 bytes .../flex/test_sign_tx_confirm/00001.png | Bin 0 -> 10569 bytes .../flex/test_sign_tx_confirm/00002.png | Bin 0 -> 9888 bytes .../flex/test_sign_tx_confirm/00003.png | Bin 0 -> 6357 bytes .../flex/test_sign_tx_confirm/00004.png | Bin 0 -> 11536 bytes .../flex/test_sign_tx_transfer/00000.png | Bin 0 -> 9253 bytes .../flex/test_sign_tx_transfer/00001.png | Bin 0 -> 22617 bytes .../flex/test_sign_tx_transfer/00002.png | Bin 0 -> 9888 bytes .../flex/test_sign_tx_transfer/00003.png | Bin 0 -> 6357 bytes .../flex/test_sign_tx_transfer/00004.png | Bin 0 -> 11536 bytes 16 files changed, 62 insertions(+) create mode 100644 tests/snapshots/flex/test_sign_tx_burn_usdt/00000.png create mode 100644 tests/snapshots/flex/test_sign_tx_burn_usdt/00001.png create mode 100644 tests/snapshots/flex/test_sign_tx_burn_usdt/00002.png create mode 100644 tests/snapshots/flex/test_sign_tx_burn_usdt/00003.png create mode 100644 tests/snapshots/flex/test_sign_tx_burn_usdt/00004.png create mode 100644 tests/snapshots/flex/test_sign_tx_confirm/00000.png create mode 100644 tests/snapshots/flex/test_sign_tx_confirm/00001.png create mode 100644 tests/snapshots/flex/test_sign_tx_confirm/00002.png create mode 100644 tests/snapshots/flex/test_sign_tx_confirm/00003.png create mode 100644 tests/snapshots/flex/test_sign_tx_confirm/00004.png create mode 100644 tests/snapshots/flex/test_sign_tx_transfer/00000.png create mode 100644 tests/snapshots/flex/test_sign_tx_transfer/00001.png create mode 100644 tests/snapshots/flex/test_sign_tx_transfer/00002.png create mode 100644 tests/snapshots/flex/test_sign_tx_transfer/00003.png create mode 100644 tests/snapshots/flex/test_sign_tx_transfer/00004.png diff --git a/src/ui/display_nbgl.c b/src/ui/display_nbgl.c index 80da314..b4f4811 100644 --- a/src/ui/display_nbgl.c +++ b/src/ui/display_nbgl.c @@ -3,6 +3,11 @@ #include "contract.h" #include "ui/action/validate.h" #include "ui/menu.h" +#include "nbgl_use_case.h" + +static nbgl_contentTagValue_t pairs[10]; +static nbgl_contentTagValueList_t pairList; + static void review_choice_address(bool choice) { // Answer, display a status page and go back to main validate_address(choice); @@ -13,6 +18,16 @@ static void review_choice_address(bool choice) { } } +static void review_choice_transaction(bool choice) { + // Answer, display a status page and go back to main + validate_transaction(choice); + if (choice) { + nbgl_useCaseReviewStatus(STATUS_TYPE_TRANSACTION_SIGNED, ui_main_menu); + } else { + nbgl_useCaseReviewStatus(STATUS_TYPE_TRANSACTION_REJECTED, ui_main_menu); + } +} + // TODO: Implement this void ui_display_address() { nbgl_useCaseAddressReview(data_context.addr_context.address_str, @@ -29,19 +44,66 @@ void ui_display_public_key() { // TODO: Implement this void ui_display_sign_transaction(int flow) { + uint8_t pairIndex = 0; + + // Action line + const char* action = NULL; switch (flow) { case SIGN_TRANSACTION_FLOW_TRANSFER: + action = "Transfer"; break; case SIGN_TRANSACTION_FLOW_DEPLOY: + action = "Deploy"; break; case SIGN_TRANSACTION_FLOW_CONFIRM: + action = "Confirm"; break; case SIGN_TRANSACTION_FLOW_BURN: + action = "Burn"; break; default: THROW(ERR_INVALID_REQUEST); break; } + pairs[pairIndex].item = "Action"; + pairs[pairIndex].value = action; + pairIndex++; + + // Amount line + if (strcmp(action, "Transfer") == 0 || strcmp(action, "Burn") == 0) { + pairs[pairIndex].item = "Amount"; + pairs[pairIndex].value = (char*) data_context.sign_tr_context.amount_str; + pairIndex++; + } + + // Address line + if (strcmp(action, "Transfer") == 0 || strcmp(action, "Deploy") == 0) { + pairs[pairIndex].item = "Address"; + pairs[pairIndex].value = (char*) data_context.sign_tr_context.address_str; + pairIndex++; + } + + // Transaction id line + if (strcmp(action, "Confirm") == 0) { + pairs[pairIndex].item = "Transaction id"; + pairs[pairIndex].value = (char*) data_context.sign_tr_context.transaction_id_str; + pairIndex++; + } + + // Setup list + pairList.nbMaxLinesForValue = 0; + pairList.nbPairs = pairIndex; + pairList.pairs = pairs; + + // to signing screens. + // Setup the review screen + nbgl_useCaseReview(TYPE_TRANSACTION, + &pairList, + &C_app_everscale_40px, + "Review transaction", + NULL, // No subtitle + "Review transaction", + review_choice_transaction); } // TODO: Implement this diff --git a/tests/snapshots/flex/test_sign_tx_burn_usdt/00000.png b/tests/snapshots/flex/test_sign_tx_burn_usdt/00000.png new file mode 100644 index 0000000000000000000000000000000000000000..9203b53b55e8ad56274cdc3136c3cfded5d1544c GIT binary patch literal 9253 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 UPsf12D=dzNgdJ`>c;@PV1L0-a-2eap literal 0 HcmV?d00001 diff --git a/tests/snapshots/flex/test_sign_tx_burn_usdt/00004.png b/tests/snapshots/flex/test_sign_tx_burn_usdt/00004.png new file mode 100644 index 0000000000000000000000000000000000000000..a75ab7bd56bd95c6830461d08ad664c6dc32db3d GIT binary patch literal 11536 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 literal 0 HcmV?d00001 diff --git a/tests/snapshots/flex/test_sign_tx_confirm/00000.png b/tests/snapshots/flex/test_sign_tx_confirm/00000.png new file mode 100644 index 0000000000000000000000000000000000000000..9203b53b55e8ad56274cdc3136c3cfded5d1544c GIT binary patch literal 9253 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 literal 0 HcmV?d00001 diff --git a/tests/snapshots/flex/test_sign_tx_confirm/00002.png b/tests/snapshots/flex/test_sign_tx_confirm/00002.png new file mode 100644 index 0000000000000000000000000000000000000000..2fe6d4292fc3683a8ae5465285cf11da5a711216 GIT binary patch literal 9888 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 UPsf12D=dzNgdJ`>c;@PV1L0-a-2eap literal 0 HcmV?d00001 diff --git a/tests/snapshots/flex/test_sign_tx_confirm/00004.png b/tests/snapshots/flex/test_sign_tx_confirm/00004.png new file mode 100644 index 0000000000000000000000000000000000000000..a75ab7bd56bd95c6830461d08ad664c6dc32db3d GIT binary patch literal 11536 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 literal 0 HcmV?d00001 diff --git a/tests/snapshots/flex/test_sign_tx_transfer/00000.png b/tests/snapshots/flex/test_sign_tx_transfer/00000.png new file mode 100644 index 0000000000000000000000000000000000000000..9203b53b55e8ad56274cdc3136c3cfded5d1544c GIT binary patch literal 9253 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 literal 0 HcmV?d00001 diff --git a/tests/snapshots/flex/test_sign_tx_transfer/00002.png b/tests/snapshots/flex/test_sign_tx_transfer/00002.png new file mode 100644 index 0000000000000000000000000000000000000000..2fe6d4292fc3683a8ae5465285cf11da5a711216 GIT binary patch literal 9888 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 UPsf12D=dzNgdJ`>c;@PV1L0-a-2eap literal 0 HcmV?d00001 diff --git a/tests/snapshots/flex/test_sign_tx_transfer/00004.png b/tests/snapshots/flex/test_sign_tx_transfer/00004.png new file mode 100644 index 0000000000000000000000000000000000000000..a75ab7bd56bd95c6830461d08ad664c6dc32db3d GIT binary patch literal 11536 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 literal 0 HcmV?d00001 From f0f257ce567491456e632eca7aedbc68016956aa Mon Sep 17 00:00:00 2001 From: keiff3r Date: Thu, 20 Feb 2025 12:04:33 +0100 Subject: [PATCH 46/67] feat: implement sign_message's display for nbgl devices [LDG-660] --- src/ui/action/validate.c | 2 +- src/ui/action/validate.h | 2 +- src/ui/display_bagl.c | 6 ++-- src/ui/display_nbgl.c | 32 ++++++++++++++++-- .../flex/test_sign_message/00000.png | Bin 0 -> 8823 bytes .../flex/test_sign_message/00001.png | Bin 0 -> 6614 bytes .../flex/test_sign_message/00002.png | Bin 0 -> 9503 bytes .../flex/test_sign_message/00003.png | Bin 0 -> 6132 bytes .../flex/test_sign_message/00004.png | Bin 0 -> 11536 bytes tests/test_sign_message_cmd.py | 19 ++++++----- 10 files changed, 46 insertions(+), 15 deletions(-) create mode 100644 tests/snapshots/flex/test_sign_message/00000.png create mode 100644 tests/snapshots/flex/test_sign_message/00001.png create mode 100644 tests/snapshots/flex/test_sign_message/00002.png create mode 100644 tests/snapshots/flex/test_sign_message/00003.png create mode 100644 tests/snapshots/flex/test_sign_message/00004.png diff --git a/src/ui/action/validate.c b/src/ui/action/validate.c index d1b2e29..71e9a2a 100644 --- a/src/ui/action/validate.c +++ b/src/ui/action/validate.c @@ -61,7 +61,7 @@ static int crypto_sign_message(void) { return 0; } -void validate_sign(bool choice) { +void validate_message(bool choice) { if (choice) { if (crypto_sign_message() != 0) { io_send_sw(ERR_SIGNING_FAILED); diff --git a/src/ui/action/validate.h b/src/ui/action/validate.h index 82a9ecf..f835f80 100644 --- a/src/ui/action/validate.h +++ b/src/ui/action/validate.h @@ -33,4 +33,4 @@ void validate_transaction(bool choice); * * @param[in] choice */ -void validate_sign(bool choice); \ No newline at end of file +void validate_message(bool choice); \ No newline at end of file diff --git a/src/ui/display_bagl.c b/src/ui/display_bagl.c index 1b6b235..98411f8 100644 --- a/src/ui/display_bagl.c +++ b/src/ui/display_bagl.c @@ -16,8 +16,8 @@ static void ui_action_validate_address(bool choice) { ui_main_menu(); } -static void ui_action_validate_sign(bool choice) { - validate_sign(choice); +static void ui_action_validate_message(bool choice) { + validate_message(choice); ui_main_menu(); } @@ -209,7 +209,7 @@ void ui_display_public_key() { } void ui_display_sign() { - g_validate_callback = &ui_action_validate_sign; + g_validate_callback = &ui_action_validate_message; ux_flow_init(0, ux_sign_flow, NULL); } diff --git a/src/ui/display_nbgl.c b/src/ui/display_nbgl.c index b4f4811..92a5f64 100644 --- a/src/ui/display_nbgl.c +++ b/src/ui/display_nbgl.c @@ -28,6 +28,16 @@ static void review_choice_transaction(bool choice) { } } +static void review_choice_message(bool choice) { + // Answer, display a status page and go back to main + validate_message(choice); + if (choice) { + nbgl_useCaseReviewStatus(STATUS_TYPE_MESSAGE_SIGNED, ui_main_menu); + } else { + nbgl_useCaseReviewStatus(STATUS_TYPE_MESSAGE_REJECTED, ui_main_menu); + } +} + // TODO: Implement this void ui_display_address() { nbgl_useCaseAddressReview(data_context.addr_context.address_str, @@ -42,7 +52,6 @@ void ui_display_address() { void ui_display_public_key() { } -// TODO: Implement this void ui_display_sign_transaction(int flow) { uint8_t pairIndex = 0; @@ -106,8 +115,27 @@ void ui_display_sign_transaction(int flow) { review_choice_transaction); } -// TODO: Implement this void ui_display_sign() { + uint8_t pairIndex = 0; + + pairs[pairIndex].item = "Message"; + pairs[pairIndex].value = data_context.sign_context.to_sign_str; + pairIndex++; + + // Setup list + pairList.nbMaxLinesForValue = 0; + pairList.nbPairs = pairIndex; + pairList.pairs = pairs; + + // to signing screens. + // Setup the review screen + nbgl_useCaseReview(TYPE_MESSAGE, + &pairList, + &C_app_everscale_40px, + "Sign message", + NULL, // No subtitle + "Sign message.", + review_choice_message); } #endif \ No newline at end of file diff --git a/tests/snapshots/flex/test_sign_message/00000.png b/tests/snapshots/flex/test_sign_message/00000.png new file mode 100644 index 0000000000000000000000000000000000000000..9ea1d286f70d18eafe91e6b7f88d21041e22054e GIT binary patch literal 8823 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 H{`&s_ps~dj literal 0 HcmV?d00001 diff --git a/tests/snapshots/flex/test_sign_message/00001.png b/tests/snapshots/flex/test_sign_message/00001.png new file mode 100644 index 0000000000000000000000000000000000000000..4842bfefe0790bd6d90bca3d6f2be7dba6030ae4 GIT binary patch literal 6614 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 literal 0 HcmV?d00001 diff --git a/tests/snapshots/flex/test_sign_message/00002.png b/tests/snapshots/flex/test_sign_message/00002.png new file mode 100644 index 0000000000000000000000000000000000000000..36c94f3e0a3e6bc8a2036be94d870b0c03502efd GIT binary patch literal 9503 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 literal 0 HcmV?d00001 diff --git a/tests/snapshots/flex/test_sign_message/00004.png b/tests/snapshots/flex/test_sign_message/00004.png new file mode 100644 index 0000000000000000000000000000000000000000..a75ab7bd56bd95c6830461d08ad664c6dc32db3d GIT binary patch literal 11536 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 literal 0 HcmV?d00001 diff --git a/tests/test_sign_message_cmd.py b/tests/test_sign_message_cmd.py index 7910426..f92914f 100644 --- a/tests/test_sign_message_cmd.py +++ b/tests/test_sign_message_cmd.py @@ -19,7 +19,7 @@ # TODO: Add a valid raw message and a valid expected signature @pytest.mark.active_test_scope -def test_sign_message(backend: BackendInterface, navigator: Navigator, default_screenshot_path: str, test_name: str) -> None: +def test_sign_message(backend: BackendInterface, navigator: Navigator, default_screenshot_path: str, test_name: str, scenario_navigator, firmware) -> None: # Use the app interface instead of raw interface client = EverscaleCommandSender(backend) account_number = 0 @@ -36,13 +36,16 @@ def test_sign_message(backend: BackendInterface, navigator: Navigator, default_s # It will yield the result when the navigation is done with client.sign_message(payload=payload): # Validate the on-screen request by performing the navigation appropriate for this device - navigate_until_text_and_compare( - backend.firmware, - navigator, - "message.", - default_screenshot_path, - test_name - ) + if firmware.is_nano: + navigate_until_text_and_compare( + backend.firmware, + navigator, + "message.", + default_screenshot_path, + test_name + ) + else: + scenario_navigator.review_approve() # The device as yielded the result, parse it and ensure that the signature is correct response = client.get_async_response().data From 291658991c580ea6d9ca361eac6c5fab538e3056 Mon Sep 17 00:00:00 2001 From: keiff3r Date: Thu, 20 Feb 2025 12:28:14 +0100 Subject: [PATCH 47/67] fix: enable compilation on stax - Add 16px and 64px Everscale app icons for new devices - Update NBGL UI components to use 64px icon for address, transaction, and main menu screens --- glyphs/app_everscale_16px.gif | Bin 0 -> 99 bytes glyphs/app_everscale_64px.gif | Bin 0 -> 228 bytes src/ui/display_nbgl.c | 6 +++--- src/ui/menu_nbgl.c | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) create mode 100644 glyphs/app_everscale_16px.gif create mode 100644 glyphs/app_everscale_64px.gif diff --git a/glyphs/app_everscale_16px.gif b/glyphs/app_everscale_16px.gif new file mode 100644 index 0000000000000000000000000000000000000000..b362f69acad00b258b241bae853045223dd06d4c GIT binary patch literal 99 zcmZ?wbhEHb6krfw_`t{j1poj4SNzEWVlgQG=l0A^Oi%SqOwUZt=1Wh^%}um5&@(Xw tK?WU=5|BOyCYhf8m8Z`#D93DCl_hx2&+2h)qIj)irr)!j+u|7+tN~+~9mN0u literal 0 HcmV?d00001 diff --git a/glyphs/app_everscale_64px.gif b/glyphs/app_everscale_64px.gif new file mode 100644 index 0000000000000000000000000000000000000000..0125e6b45ca7127e161ad0fb4534a92b15b2e45a GIT binary patch literal 228 zcmVg}tsmtvTqnxxZ0Ic2# z^KW4uNJ3&(rp&3f$T_+yjLIo(-*laGJKqcag1#S+C@~(959N~Ca6X|5Db-}XI;1ge zl{@2#$Kx;gjD}s(Y;v>>S7PJzskzRs;PaZjyXYrJ5@^&ysOEBL2SP~X2USNE2|4MA z$Fzr;85C%_+0&SF2r3p(CJJV7nwa&H$||@PYd9-gNPF8 Date: Thu, 20 Feb 2025 12:43:34 +0100 Subject: [PATCH 48/67] test: modify `navigate_until_text_and_compare` to accept a list of confirmation instructions --- tests/utils.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/utils.py b/tests/utils.py index 000024b..c8bdc35 100644 --- a/tests/utils.py +++ b/tests/utils.py @@ -84,7 +84,7 @@ def navigate_until_text_and_compare( test_name: str, screen_change_before_first_instruction: bool = True, screen_change_after_last_instruction: bool = True, - nav_ins_confirm_instruction: NavInsID = NavInsID.USE_CASE_REVIEW_CONFIRM, + nav_ins_confirm_instruction: List[NavInsID] = [NavInsID.USE_CASE_REVIEW_CONFIRM], ): """Navigate through device screens until specified text is found and compare screenshots. @@ -112,7 +112,7 @@ def navigate_until_text_and_compare( """ if firmware.device.startswith(("stax", "flex")): go_right_instruction = NavInsID.SWIPE_CENTER_TO_LEFT - confirm_instructions = [nav_ins_confirm_instruction] + confirm_instructions = nav_ins_confirm_instruction else: go_right_instruction = NavInsID.RIGHT_CLICK confirm_instructions = [NavInsID.BOTH_CLICK] From 65ae2124459de9f25813bef7ec858aba54837b3d Mon Sep 17 00:00:00 2001 From: keiff3r Date: Thu, 20 Feb 2025 12:43:48 +0100 Subject: [PATCH 49/67] feat: implement get_public_key display for nbgl devices [LDG-658] --- src/ui/display_nbgl.c | 40 ++++++++++++++++++++++++++++++++++++++++ tests/test_pubkey_cmd.py | 16 ++++++++++++---- 2 files changed, 52 insertions(+), 4 deletions(-) diff --git a/src/ui/display_nbgl.c b/src/ui/display_nbgl.c index 598903f..5f810af 100644 --- a/src/ui/display_nbgl.c +++ b/src/ui/display_nbgl.c @@ -8,6 +8,16 @@ static nbgl_contentTagValue_t pairs[10]; static nbgl_contentTagValueList_t pairList; +static void review_choice_pubkey(bool choice) { + // Answer, display a status page and go back to main + validate_pubkey(choice); + if (choice) { + nbgl_useCaseReviewStatus(STATUS_TYPE_ADDRESS_VERIFIED, ui_main_menu); + } else { + nbgl_useCaseReviewStatus(STATUS_TYPE_ADDRESS_REJECTED, ui_main_menu); + } +} + static void review_choice_address(bool choice) { // Answer, display a status page and go back to main validate_address(choice); @@ -50,6 +60,36 @@ void ui_display_address() { // TODO: Implement this void ui_display_public_key() { + // Create the page content + + uint8_t pairIndex = 0; + pairs[pairIndex].item = "Public Key"; + pairs[pairIndex].value = (char*) data_context.pk_context.public_key_str; + pairIndex++; + + nbgl_contentTagValueList_t content; + content.nbPairs = pairIndex; + content.pairs = pairs; + content.smallCaseForValue = false; + content.nbMaxLinesForValue = 0; + content.startIndex = 0; + + // to signing screens. + // Setup the review screen + nbgl_useCaseReviewLight(TYPE_OPERATION, + &content, + &C_app_everscale_64px, + "Verify Public Key", + NULL, // No subtitle + "Approve", + review_choice_pubkey); + + // nbgl_useCaseAddressReview(data_context.pk_context.public_key_str, + // NULL, + // &C_app_everscale_40px, + // "Verify Public Key", + // NULL, + // review_choice_pubkey); } void ui_display_sign_transaction(int flow) { diff --git a/tests/test_pubkey_cmd.py b/tests/test_pubkey_cmd.py index e5f6fec..d22d804 100644 --- a/tests/test_pubkey_cmd.py +++ b/tests/test_pubkey_cmd.py @@ -3,8 +3,11 @@ from ragger.bip import calculate_public_key_and_chaincode, CurveChoice from ragger.error import ExceptionRAPDU from ragger.backend.interface import BackendInterface +from ragger.navigator import NavInsID from ragger.navigator.navigation_scenario import NavigateWithScenario +from utils import navigate_until_text_and_compare + from application_client.everscale_command_sender import EverscaleCommandSender, Errors from application_client.everscale_response_unpacker import unpack_get_public_key_response @@ -33,11 +36,11 @@ def test_get_public_key_no_confirm(backend: BackendInterface) -> None: # In this test we check that the GET_PUBLIC_KEY works in confirmation mode @pytest.mark.active_test_scope -def test_get_public_key_confirm_accepted(backend: BackendInterface, scenario_navigator: NavigateWithScenario) -> None: +def test_get_public_key_confirm_accepted(backend: BackendInterface, firmware, navigator, default_screenshot_path, test_name) -> None: client = EverscaleCommandSender(backend) account_number = 0 with client.get_public_key_with_confirmation(account_number=account_number): - scenario_navigator.address_review_approve() + navigate_until_text_and_compare(firmware, navigator, "Approve", default_screenshot_path, test_name, True, True, [NavInsID.USE_CASE_CHOICE_CONFIRM]) response = client.get_async_response().data _, public_key = unpack_get_public_key_response(response) @@ -48,13 +51,18 @@ def test_get_public_key_confirm_accepted(backend: BackendInterface, scenario_nav # In this test we check that the GET_PUBLIC_KEY in confirmation mode replies an error if the user refuses @pytest.mark.active_test_scope -def test_get_public_key_confirm_refused(backend: BackendInterface, scenario_navigator: NavigateWithScenario) -> None: +def test_get_public_key_confirm_refused(backend: BackendInterface, firmware, navigator, default_screenshot_path, test_name, scenario_navigator) -> None: client = EverscaleCommandSender(backend) account_number = 0 + + confirm_instructions = [NavInsID.USE_CASE_CHOICE_REJECT, NavInsID.USE_CASE_CHOICE_CONFIRM] with pytest.raises(ExceptionRAPDU) as e: with client.get_public_key_with_confirmation(account_number=account_number): - scenario_navigator.address_review_reject() + navigate_until_text_and_compare(firmware, navigator, "Approve", default_screenshot_path, test_name, True, True, confirm_instructions) + + # with client.get_public_key_with_confirmation(account_number=account_number): + # scenario_navigator.address_review_reject() # Assert that we have received a refusal assert e.value.status == Errors.SW_DENY From d236634ce26c7e4df84b1cc4c1e92d25e75f0302 Mon Sep 17 00:00:00 2001 From: keiff3r Date: Thu, 20 Feb 2025 12:44:26 +0100 Subject: [PATCH 50/67] build: add flex and stax to ledger_app.toml --- ledger_app.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ledger_app.toml b/ledger_app.toml index e6634a3..7794dab 100644 --- a/ledger_app.toml +++ b/ledger_app.toml @@ -1,7 +1,7 @@ [app] build_directory = "./" sdk = "C" -devices = ["nanos+", "nanox"] +devices = ["nanos+", "nanox", "flex", "stax"] [tests] pytest_directory = "./tests/" From 8f66f30c982e1603804f0e8fc0914333c4abceb2 Mon Sep 17 00:00:00 2001 From: keiff3r Date: Thu, 20 Feb 2025 12:45:07 +0100 Subject: [PATCH 51/67] test: generate golden snapshots --- .../00000.png | Bin 9046 -> 8815 bytes .../00003.png | Bin 11536 -> 11323 bytes .../00000.png | Bin 9046 -> 8815 bytes .../00003.png | Bin 11536 -> 11323 bytes .../00000.png | Bin 0 -> 8962 bytes .../00001.png | Bin 0 -> 16463 bytes .../00002.png | Bin 0 -> 7706 bytes .../00003.png | Bin 0 -> 5874 bytes .../00000.png | Bin 0 -> 8962 bytes .../00001.png | Bin 0 -> 16463 bytes .../00002.png | Bin 0 -> 7706 bytes .../00003.png | Bin 0 -> 10062 bytes .../00004.png | Bin 0 -> 7967 bytes .../flex/test_sign_message/00000.png | Bin 8823 -> 8592 bytes .../flex/test_sign_message/00002.png | Bin 9503 -> 9292 bytes .../flex/test_sign_message/00004.png | Bin 11536 -> 11323 bytes .../flex/test_sign_tx_burn_usdt/00000.png | Bin 9253 -> 9020 bytes .../flex/test_sign_tx_burn_usdt/00002.png | Bin 9888 -> 9674 bytes .../flex/test_sign_tx_burn_usdt/00004.png | Bin 11536 -> 11323 bytes .../flex/test_sign_tx_confirm/00000.png | Bin 9253 -> 9020 bytes .../flex/test_sign_tx_confirm/00002.png | Bin 9888 -> 9674 bytes .../flex/test_sign_tx_confirm/00004.png | Bin 11536 -> 11323 bytes .../flex/test_sign_tx_transfer/00000.png | Bin 9253 -> 9020 bytes .../flex/test_sign_tx_transfer/00002.png | Bin 9888 -> 9674 bytes .../flex/test_sign_tx_transfer/00004.png | Bin 11536 -> 11323 bytes .../00003.png | Bin 382 -> 356 bytes .../00004.png | Bin 0 -> 382 bytes .../00003.png | Bin 382 -> 356 bytes .../00004.png | Bin 0 -> 382 bytes .../00000.png | Bin 0 -> 8224 bytes .../00001.png | Bin 0 -> 17256 bytes .../00002.png | Bin 0 -> 5782 bytes .../00003.png | Bin 0 -> 9993 bytes .../00000.png | Bin 0 -> 8224 bytes .../00001.png | Bin 0 -> 17256 bytes .../00002.png | Bin 0 -> 7629 bytes .../00003.png | Bin 0 -> 9993 bytes .../00000.png | Bin 0 -> 8394 bytes .../00001.png | Bin 0 -> 14984 bytes .../00002.png | Bin 0 -> 7213 bytes .../00003.png | Bin 0 -> 5782 bytes .../00000.png | Bin 0 -> 8394 bytes .../00001.png | Bin 0 -> 14984 bytes .../00002.png | Bin 0 -> 7213 bytes .../00003.png | Bin 0 -> 9080 bytes .../00004.png | Bin 0 -> 7629 bytes .../stax/test_sign_message/00000.png | Bin 0 -> 8003 bytes .../stax/test_sign_message/00001.png | Bin 0 -> 6097 bytes .../stax/test_sign_message/00002.png | Bin 0 -> 8634 bytes .../stax/test_sign_message/00003.png | Bin 0 -> 5988 bytes .../stax/test_sign_message/00004.png | Bin 0 -> 9993 bytes .../stax/test_sign_tx_burn_usdt/00000.png | Bin 0 -> 8441 bytes .../stax/test_sign_tx_burn_usdt/00001.png | Bin 0 -> 8051 bytes .../stax/test_sign_tx_burn_usdt/00002.png | Bin 0 -> 9030 bytes .../stax/test_sign_tx_burn_usdt/00003.png | Bin 0 -> 6218 bytes .../stax/test_sign_tx_burn_usdt/00004.png | Bin 0 -> 9993 bytes .../stax/test_sign_tx_confirm/00000.png | Bin 0 -> 8441 bytes .../stax/test_sign_tx_confirm/00001.png | Bin 0 -> 9756 bytes .../stax/test_sign_tx_confirm/00002.png | Bin 0 -> 9030 bytes .../stax/test_sign_tx_confirm/00003.png | Bin 0 -> 6218 bytes .../stax/test_sign_tx_confirm/00004.png | Bin 0 -> 9993 bytes .../stax/test_sign_tx_transfer/00000.png | Bin 0 -> 8441 bytes .../stax/test_sign_tx_transfer/00001.png | Bin 0 -> 20788 bytes .../stax/test_sign_tx_transfer/00002.png | Bin 0 -> 9030 bytes .../stax/test_sign_tx_transfer/00003.png | Bin 0 -> 6218 bytes .../stax/test_sign_tx_transfer/00004.png | Bin 0 -> 9993 bytes 66 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 tests/snapshots/flex/test_get_public_key_confirm_accepted/00000.png create mode 100644 tests/snapshots/flex/test_get_public_key_confirm_accepted/00001.png create mode 100644 tests/snapshots/flex/test_get_public_key_confirm_accepted/00002.png create mode 100644 tests/snapshots/flex/test_get_public_key_confirm_accepted/00003.png create mode 100644 tests/snapshots/flex/test_get_public_key_confirm_refused/00000.png create mode 100644 tests/snapshots/flex/test_get_public_key_confirm_refused/00001.png create mode 100644 tests/snapshots/flex/test_get_public_key_confirm_refused/00002.png create mode 100644 tests/snapshots/flex/test_get_public_key_confirm_refused/00003.png create mode 100644 tests/snapshots/flex/test_get_public_key_confirm_refused/00004.png create mode 100644 tests/snapshots/nanosp/test_get_public_key_confirm_refused/00004.png create mode 100644 tests/snapshots/nanox/test_get_public_key_confirm_refused/00004.png create mode 100644 tests/snapshots/stax/test_get_address_wallet_v3_confirm_accepted/00000.png create mode 100644 tests/snapshots/stax/test_get_address_wallet_v3_confirm_accepted/00001.png create mode 100644 tests/snapshots/stax/test_get_address_wallet_v3_confirm_accepted/00002.png create mode 100644 tests/snapshots/stax/test_get_address_wallet_v3_confirm_accepted/00003.png create mode 100644 tests/snapshots/stax/test_get_address_wallet_v3_confirm_refused/00000.png create mode 100644 tests/snapshots/stax/test_get_address_wallet_v3_confirm_refused/00001.png create mode 100644 tests/snapshots/stax/test_get_address_wallet_v3_confirm_refused/00002.png create mode 100644 tests/snapshots/stax/test_get_address_wallet_v3_confirm_refused/00003.png create mode 100644 tests/snapshots/stax/test_get_public_key_confirm_accepted/00000.png create mode 100644 tests/snapshots/stax/test_get_public_key_confirm_accepted/00001.png create mode 100644 tests/snapshots/stax/test_get_public_key_confirm_accepted/00002.png create mode 100644 tests/snapshots/stax/test_get_public_key_confirm_accepted/00003.png create mode 100644 tests/snapshots/stax/test_get_public_key_confirm_refused/00000.png create mode 100644 tests/snapshots/stax/test_get_public_key_confirm_refused/00001.png create mode 100644 tests/snapshots/stax/test_get_public_key_confirm_refused/00002.png create mode 100644 tests/snapshots/stax/test_get_public_key_confirm_refused/00003.png create mode 100644 tests/snapshots/stax/test_get_public_key_confirm_refused/00004.png create mode 100644 tests/snapshots/stax/test_sign_message/00000.png create mode 100644 tests/snapshots/stax/test_sign_message/00001.png create mode 100644 tests/snapshots/stax/test_sign_message/00002.png create mode 100644 tests/snapshots/stax/test_sign_message/00003.png create mode 100644 tests/snapshots/stax/test_sign_message/00004.png create mode 100644 tests/snapshots/stax/test_sign_tx_burn_usdt/00000.png create mode 100644 tests/snapshots/stax/test_sign_tx_burn_usdt/00001.png create mode 100644 tests/snapshots/stax/test_sign_tx_burn_usdt/00002.png create mode 100644 tests/snapshots/stax/test_sign_tx_burn_usdt/00003.png create mode 100644 tests/snapshots/stax/test_sign_tx_burn_usdt/00004.png create mode 100644 tests/snapshots/stax/test_sign_tx_confirm/00000.png create mode 100644 tests/snapshots/stax/test_sign_tx_confirm/00001.png create mode 100644 tests/snapshots/stax/test_sign_tx_confirm/00002.png create mode 100644 tests/snapshots/stax/test_sign_tx_confirm/00003.png create mode 100644 tests/snapshots/stax/test_sign_tx_confirm/00004.png create mode 100644 tests/snapshots/stax/test_sign_tx_transfer/00000.png create mode 100644 tests/snapshots/stax/test_sign_tx_transfer/00001.png create mode 100644 tests/snapshots/stax/test_sign_tx_transfer/00002.png create mode 100644 tests/snapshots/stax/test_sign_tx_transfer/00003.png create mode 100644 tests/snapshots/stax/test_sign_tx_transfer/00004.png diff --git a/tests/snapshots/flex/test_get_address_wallet_v3_confirm_accepted/00000.png b/tests/snapshots/flex/test_get_address_wallet_v3_confirm_accepted/00000.png index f7d02912895780af5ab2884f92ac75480ad0c503..28a92efec6fe19fd60eef2b909f7258be6bbb967 100644 GIT binary patch literal 8815 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 literal 9046 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 diff --git a/tests/snapshots/flex/test_get_address_wallet_v3_confirm_accepted/00003.png b/tests/snapshots/flex/test_get_address_wallet_v3_confirm_accepted/00003.png index a75ab7bd56bd95c6830461d08ad664c6dc32db3d..295f8f713e06a7a75774601ad62dc89a632ebca7 100644 GIT binary patch delta 7953 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 delta 7937 zcmYj$c|6qL_dij1QxpjeQbG~RSjQGkQHE5LlqJcGv9F`Cy^ttdG7`fKktK>45);aj ztRq7hTM}cLNsMi*zgO?~=lgj4UVpqEulu<7p8LAzo^$T=JP+ko^6g}K?ty0~Px6=v zTq{Q`@;>{d1*|J|OjVT5+q~G5&c~fd_0^Z@s2EvTD^ulH7v3Y4ou|@qj6W{-LE!la zoJh~QNTB_d(HfPG$;I`#pIjQpau#(71-QV25xNJ#&hhbaCyDlkf%z48L7vX2h%buC z!w<3h3H6Y5E?%hNRT^}8>JuM0Nr3Jt_1`D3xH?zsH7=vlk#h6EN7x=I@3Jz@hu|k= z*TJ4ECv$cH!h0Ulx+D^ZFie>IP^RhJFdl+}?tZOMiOa2t7w-Hq@1yeyvoUv%OL}LE zL-V5WH~Dw~XsU{n1c{2?Bc=DPnY*r=;SXtDRTS;jodF_FCOP*?5)StCD97cp0Zyn6 zq*GDDQ2Bul#0;%;$=H+vMF__}ypi8Ujta_k5%!LZ_;S>Yc7p)>U3R|J*A97jHlf%5-&%>w|Are|;u3}%Pj(F=dU+l>ndNDW9pp}2(7qi7+wm z*oZHi91dquD7=rO`+uE!^NqbPe*4uduY8)6R(=5Eg^qP%DV~5t>*AE(v-$uA8%G|h zES&gX-&0z>oUqSuHWN$fPU@}n`%x#-^FR?;b-#IGoM&W7J$_VPI!5j-R+iC#M7ZHz6{- z%dKt%RQat0LVoe-rJn+;o7=&4X#fL9av5^(;Hh%`$;Fk=@5*&GP9e!rE@`r9!pHv{ zU7HKZKQkWnXYben1cWO`Ow%<0)azOM&sd7RM9i9n?UsvSTZIaOR^K8H2VG%m9LVgt zSiC#GLRWcNTwGr>SDUtU!CI`>3p)RyKc#pNoQr^uUo?JO0|2RDp& zT+S>IXu3L0Eb;y_Xdn9&++^wcg%=$ykSU#{*6#XYRwt7(>h<+@)G=2pAH!?|&W9ln zy(5{7nvCfHJt7s2zKGtS&Hge6dgaaa?*!`+^-p$Ibdp&Z!fKZU?|BkKySmhy&_+3s z9UZZAD`;OO@rkwA3Ic^jz&e->tFtPZqCKn{<`bBr&$4IZuR{*1FXXy5h-dZWa}O1Z&NNwEa4r7!yDaz#-rHS@v z2i}}wiYH(X;db0?7WE%hx)W9zShK46_gXL@XVYzn$UGE`N)>+&MHmDL!iLUhbZ2k< zC*Y+lG?Y2rw;k@i`x+xfTT?baR5)N`o3Tkj)m)I&JXTz>p{V@+o`}qz+ay~ zssPj30ECC{OY0%Ie}Ezo0`s*FZ*TVQ*G+P^QbWO@+m2kOP{ax8qQtf*oKAbbZT=b1 z>YX=}#+7W-%tvdK{=tcu8dmerXW2jcB>DDr4H63YoBjmoy}hX%qKkEL)C<>HYcDAWHoi4S9%cTiG97{{RLW+A_&riJPbn_mAdL(!taVKF zTK=*1s2*;)Cnv1>ewR=%Tlv|lNU-VRektu{UkLnJbI;;~R7hn>5vy>NsWeqmPkTzkccSGB@xmkWZN5~8apJ)RXnT6?afHWGOCvBH57 zRBQAFa$(qs^=c`dk9S&_KXnX=mP7>9NrGUq!9%ZKQOq8^Q#s@@9p>~r#h&jZzw3y? zTgcMFTgk;R}#zLM~Fa7RrzvLB~d2J+j z*mh7+qP%&Qjz3A&SF7js&am=dM{;aZuS7F5=jl>PlPKd$);EyPuQUJ8UA`F3g=zdV zto>#q=A}B_`s8GIrBMJ1BGbcqncH=1vztMrx&>j+W7ZO|?LYKaMB&f$4|t_10H!;c z0$I}!%O;Su%TQHo4Gr3=P95!aR<;;rQ$06QUp+@zO(V>O>81a1u?iiKPy zLcxI5Ex?z@vjj^yiHUWm&E^RF@$Rhv@z!7rf7)2(+DwdQVBWarYJ<=P-BOFe}Tdy~0lQ#d(omI79D? zHpqTxSID-~7e!pZAkaWS27fl)e7A%hASzVdi--LFPSZFS0T)?Hr1w56J265=tY_(|P7)1TMJ2C}&Fdqm46^P-FSHB1!LM`V zg_saBm*Ldc3wEkUbg%OP1ti_K#Nb%nm#jmCl&@{9 z8{yz??fRl^H*O&NGoBax&X6|`>1Wl+KQCDI`|^7~|by3vp2~ilvMe9`^+kiq3X!I37=jNRr@tgUN=Q+9|ff(z@ z#CG}3TsrfLJXm41)$&_#Ch}6VY!AgP1!7XplYFi@O42-&Aiv|{Z?y7hulu#vIT}UfsU6A z{&J|i4RD<@`fvT?dE$Onx<-dbnIt)?zvOr4I)}0W_gO8_L8He^&J{#A_jKh5z3Ip~ zljMA=f19jxKdQF$NIaauOA?ZH8LRUpn~A=6PcsD=Ca(rb4iT3()EchnWw@zAbu+m&=#uu8@M_2%sXMS&>Jpcf(v+~Hs$i=?u!6Ecn(Gl6tB&7a5?-9G# z?5CM1-Q^(F3sF@3^yR1p`*w~6?=s#@@ufa>YVLHLiR$~6U}>RE)_XhEDWNeBE%THM z*7xTgvWld<){VoOKxyeWTZX#owL9}vNtgo9f$i9x?nfgY>4fSbz_TLg6hq@+4;2-j zt%W#o0$MsSpK0?N6Z)pu?Zzu{_&4qJY&!wg?Y3xJ2r5co)~NYcoiC#WU|{^NZnuCYo(N?*}yJOy#xZ!_%&C}R5J$ivd2 zwvZ;a4KA9#y9F#(vTE5q;|(I$nc3OdtB(27fSIHW>%UDlJ$KoG zmS-E>2cQVXtg2BW>{4>Ndi)6?Qvu(Me9!V*D&m3~Z<=r6*Di|i4zu2~O=)+3W(56f zvS{1KH_AbnM3)?>KBKm%Iu$ClXJaB)Da8@+1ang?Hr3^n)7ks)WM11r5tF|kTOPd28hbYAno_nBF}7)mfK=}rgZ3BA$woP4-_4|so2PX1%_(&Lv_T>%pY_aB zR=u))PClg{U3JBFCpbx94@3lQYv&bu{x1;k;8#NpuQa@nH`mHc)Nd&~ozt4eCWlEM z;2XQfhN6sze6>S1%O4CJNl6ML=FU5-f}0R~@JcHjFkHj`Oy zzt@ZXQR)8r-x!0oH5;Z_oYyY0R)Ou*|=GEXD zGqQyUZ{Q94-L0*!!}xr;o&J{4Oh3c@2*@V}o8bh<b$xgGAQViap?lYr1wu1?)47iIb`v+4pQ$94@!Z-_)}einr>_ zTuf@s`-te~oEe8AY}2MSgTsO>?;rE=pU+XbLJr;SN-MyCBew21lrpm)m^pd)T{0{F zL~IIA8nq59DVnF_bOS=*R)cVvr>ceI_SmD<#-|Ob)7)>Y0~?6eHnYp)}lJP z!<8R(Q857IrcsT#&Q@vJ1!Rgm5zu7G<49Jjb6xSi%nWrmHN=PBP1RVKaF_o_!<@2# zk_1t2EFL#dn_-O2ugR1Civ(@c+8j%Y&pC$qLJBd2g4eom`r3ysCynYp=Iq1oAwNJ= zVH-{;uuaRyoX-9#7{hwfDn1=tCv$*rQ_LKo^=0WJ=vpD^A9C+wfmr@9;_c4*u57{FH?6P&5h6NVYC-CS)0K_smlJK- ztWleEIas^yiOri%mO+#acC>vTLttt--Dd;j5jfYy;3Us-BkjZ0^_NSXJ&Ya8Y;3(L zNgi6wx)A61xdw?#L;+{39gIya!%w23u51OxJ<6HF>Jjmyl2(A>ia)BY;*EblN>*=P z`p%8r7M(c@iI62LN-xnLRcgwHEQs~+DBsh5feAlQU8vpVwz~2i$5fnANqAGbpcLQ` znYV{tS-$$#q!g_vp4|{nx^DS2Go;G@Ou^u)(>d8ydq&DZQplk%$$ZGH{mfw>+f;mv zXxx9lC29%m7?PCh*nS^&d-Pjjf#jq8iVYY-uF@~VvaNw{xI05{8h;Bbw|Y=U!R!pP zeSh;GXD|OXgWEr$Pc4sGQG##EWd|8rZFSl&XZelgfs2~=ImCO!L%V~;1KE;Z!+-dY zo$Sk-+haR+mRjgFOI5e=7M(4N^!Z;6xcp%mU%*x7GF+Qt+ZSjr_6SmpTk|F{&Pg=| z|3wSEXr+#GR@9e~kIrsKqf|T@r}g2Q?k~Ep(Y~K^I#Ty4iz@f|#=y$G@|mo=cL@^C zvNz0W%M1qNfj$8%Lpy~Cf2?0x)I^PLQ`|MM*?{09+YFY9S_ANuZx1HiNz z1oYDC|8lZU62Gx9MuIF-Vn6k5SMQpCpK7p^Zg!L1SXpg1Sp{UWUeD7*Gt52p%nvDw zpw;I7XgD>t0lUw4mP|FiEAlS;)ucYG8}j%i21Pq<`dEs_IFUfYtV6&?>`@i~l6vda zH_sKTOPQcc)t*dHT&4B{jwqgt6FbEW^3+gbuF~pe-HqI-!Z6C&iGy(I2MQKCoP~y7 z$8gs#!J83U2zw;bVB$p?r|mm5F@aU%P}ZfZ{a*cCmuW+%%VCoLz!s*ojxi1oZs+JI z1Uua7gCb5!22t!CH!uGAk-I^SE?3-Dv8jzQ)o6!}$}{iNRbjx|hnkguLhK5nSYXK; zFYPSo>;|2Vc>U+9X&NJ*bFPinMYWnmxc6LoqO@vIfvc(=huI(L(#H18eV((uP04)4X~qq<>G!&=brP>i zkhhfLm`NoCdEt~z)}VA?jh%%x5eckk_k=X7E_ zzk2u{cQt=$E^9zWIgjm>jDbs6Q29s#d6qi@M{F1xr~IV}jH_ZjmgKs+JKHvo?MqTn zYW`YZtEUV=4q;8`-3!@({c7s()otcE`9HjaY<2@Roh}hA6)Byo3IR#?*g%i{uf-X^ zU<tuPh|~w`XRHOR%KgmCUIg{n*l8oxDdG z)NMxdN^lo@1jCnXs(HoOk+N?lB|Dk;O`}*H)ifM5XmF%ITDsri(Q@dV-A-Q6v(~(h zS;v)V8r2^eBy+Ry=QI$6HeTC*&DYA>+u?7Vv{u|5jPK~4!3=NSc8qO$xnNGR0Yf&1 zfH4^CB1T_YzUxl-0*xH~ct`WCdcne6a#!~Iyo+z|y|JczU3dw`#Lx{~`m>~!@n2ab zMWWr&6PH4nEmOFz`W3ml7OLP=Meg6hwfPRkg&u4)C$c zzO^*{AK`sDkx#zQuYe?Z?%Ke_q)1QCy{g+`VPS#wQ1NvlzpJa98j3VkNB@LAmcwm) z%InZQ5nNy}+M*H^vj55o^Ge+=tp zi^FyWe}jzkHC=qS>}dc@fxBx!k`yKjX1tDnJRBNWk0);_B&$WJbkIAr_s%H$Y);X@ zi&C0k`7G-Z48Hh;G&s_V+Z2%~Lu*_!t}Qk;>CV zkpJd?VVhR}Rv@}i8Xa-%70^J&cDR-CWcAA@Jd>#|H6RY8>8@vvf^=e9Al&-?j%T4i z4GQdl6_yMa`v{Z1oUV6Zve{cw;nLt2aVhTq$5 zQw4bbye>NL9KEpMjZg4}WK$W%#ULjR@)dTfu}yM9rW|+MG;*J3o>F^7!k7J9mZ0#y z#Rn=K*LKd#GA)t|Fp$=cscR;olu?u|>Nt#lk4A_Xe3fxt1d4DbWU^q1aO-s8CiT=d zrX`3&%tEVQ%sK_ffVAk9-&tQAssIBUNGq}0RIziJdaWByt7u9;_YQr;K)o zg20KRPxVKa>QjdWy{SJjTIB=%48NLJ7&=MY{17@m3u%LN(SFPa+S|W0i}6SWp8osd@xay0{M%&%1>6P*no391vB8D4LqmUUOqn9?L6z8I z%}8%;{^)e80#(KmPZ1zf^BN)^1oPN^?pB-2xfN8N!zXd*cST#(N1D)bZJtpx6|MGb{a4bE1MFH{eE!cy}?Rt&C? z)M1*gLgz*K_LaK>SmA#peZ2n7N@vMVMrOH;Zwa|d7HUcALNw?o3p>sI6?VjM;))q{ zO&prHFY%=Xqo%g>X=`3Uc=E)2eM7^;V_<2_Fq_)jWHGol&NOoy_$)i>;aPtJXjIqF zrsjD$W3l3uo7byfX#M?vDQHYZ2>tDVJN|rum9PB(m}#D69R&fX!5}lj%jnF~%%$7< zRzoAqH()YE6n|1%%IeB;0VhU$x#|nalq#?EFtgA`&~&*frDqy>@dl?!TOoe?gYUl3 zB)cglWfn-DE5aLGPSx+VySLM)y}lA{%XLJ!_-<+>Pe-7k(N6(|kaANHP|i>KDKCW@ zhQxUScjV1eKp4RQZ4x7>HhM5S#S6;K%>V^9Q| zARr)MfIy=nk_dqW2oXXU3=jf@At44x@;2V8`~HJ>>s8(TORCP=2vSv16yl?w#PuZ{060?$~i$?~>&?m)nJlG-mA7 z#7ASOM9AIRGEvUd+;NYOY#!gSLq@iL$2qCsJ0;=}iz_?je?BE9{bTkWiQP69yTnhH zh}}E*-`oFn%YQl@)~dHQxGYMoU-S5$xzz93xt9F3zTtNWJ>}oI%2)Lok`FcfCh_k~ z?v0Op{rmaTl05tG$&5|3!6&)z%x7PYi>7>^l)qX2=(E0R34i7n1D@@_Ci&ZRCq;ls z4jIuE+ml4CT#4oL$x)T-?}h||&F0$EcbBriZ;Y{zN;#LtO8vi)OX*YLz&zMH(|vu8$J ztt8F<(W<{xaQmV2;(U8?2>qhXtV6(?DZ}meu#S{eqhe28Tr&mF8t*h%e-YF!Cf1v5 zT=WjA>vdZ4npE)A#u=m5ueC4;@L4p<%r)g$Db{&seu@20XyWcM^4*%;lxO0Q_?f3u zuU|lTRu<9vaON{G=fuwZzt&lb@O{H6=W26P?tnQH@?E}GA;3t>c-${J1Hd*ZHHuzR zXYfC;L!pL$U9gZHbeD@bRF=lvu2#XVmwfQSJDu+R=Mr*I6pj=7P)`d_eLtC+bxW^+ z7Vhpk6lt)aYZ@sbM(bFND=rkQ z>At?c?V)Eyr6Kt++xeEIs7a=bi|f$UGe`DG==w25`N3U3TJmU{8yjBAsH*VE za{5=RG9nK53uD^(a9t9L86ld=|jhP0?~TzgOMKRLVSggIh3Y8XCfSr&gv2elk9 zvzD-Dtn=y_G?AxvYFZ~JpZ-VRH2Di)7 z7HR?@@(ic(zy?Fdn*$iS0j)E9%|RHboA;=D+TT^WpjS0$I84v>elIg7AN4p#_hZZ$64%jH6=EKL^qtHu(^4=rZdScsa*%cpg{&$wk&`7lKGwYR4d#Nh9Obb=?GtG-<2uCRC%(JqH0PZl+624qni@AMFhLtdKz$#> zr5wajOdBTpkD*x8yvwBMl}>d+of?4w!}>IZenj0j2|yX!QN=elHoinTwe2ndbnytS83u2g}(OvHaNGssv4I6WUN-nnwR|zJEy?my2<;DT*bnP z^8v~^H<=!Uf%&&MbH?bXca?5DGT&E@B6ZixM{0NiAdNi;V*h> zCZK5Bn`bL(`k?RvYTbtxQDUMeh(YwE;gy+%il>}yyAb^p*9#=XVVX7#9gVCfn>OR$ z`LoiGO6t$p;Nuzu^n%1cl@w&wp2PAs6JHU$udMc6DurcK&&BMzs ziuTPcX8jSz%6yJxQ)_GQPKay06+3YH{MU&tpNvSR@I_iigy`*`JvW}VTGvuo{%Hy8 z9_wT=C?yt3sVohbR~c-P&cCxM-K@1HcImUrs_GBP4`0A6c#lGpA5t8_p!BWmnS1{hmCm=ZrMVZllnOmu+tY4^ykYEr4I$y=mEvW z+Pl$zbpey0ezO+97j(Gt8yd!WJWMY$GjsEVb6@fH#;ZM(cNx!v?Mr>1LEH?Gdvu}n zna(O*Up^f?ZKFKNwJV`xs*N&OO=0O`@UM-Fs?~&F2*0KEf$y{hdm zFXxaHW=OMKIIXNn@TNQjkB);MV`$Tm$~x>HyXD97%MF$8Z%2AB@$MU0x2mDKMMF2{ z_aw4FK3RQ=xPAK*+I-)uRrzQ36_SLTc4QM1lgkz4)YMeJ4g|EV&h%5q%?9e%-J8qd zF_%4!SO@p08Cjx`URrXJrL!Z5rFdX7OlBdjmEM6gH#4)ZAg`XRD|16-?hShBaN!^# zFXgllDlwSzUY1lE0MbD7l=u0&4w?HG%mTWf{2^IEgdZKJ1z3CET&(VB3N0g4gHAKr zabIx@htheu`JA6fHSEW9g%`o956nhHM4-M`5DHaC3ypAy2@&0MIDgg5XQF!N1{*0E zr#36i)@Eh5c3fwE7`-neyx3eFfj5(qM6wxs`7RbB+=Su?k{lC?p_yA$qew-jCz2hz zR$|w8wQM5CS3ogu`H5F`!nt$)>FEXcD($I-N!qORITJ_1uSfRz`uTY)I1ej)o?Y8t zbsg^csiH7hW&xR}f%5+CEVJ<%fFV}gl-thCeC)}iq z>Pu{ot(3qjlIIVR7+-jM*@iVDDAlc!!<@4UVLC_ zLH`)o;8{yi&$q1_nzunQ;#z5oaUnz6o1YZbb;Xi*RSktUP+t;bq5CCLFqr)E9#jAs z0>VPikx6~ud9@$X3qW9e59(WwRhNH<>CBTURdJ5{&3x6eXegzDs#O*(Bww!^S&SQ9 zjBB8Bd}(z)+6Cq6l-tqFqt`{3rqm2pMt3QzhyQ+J(%rk-jrl&wECPBrrSoTG-op_A zte3v`;sYD04OSWak*q`Q^vc_uJ|>#k6ORmOrPb81T58O<$Z@UJ4{UN${KA_@x9m{I zlQ3uOx^M%*gQjjIFDL%5rVtmAmkm$NUKV2KOyPD4`k}rq-O@{M=OK2*6P)m^_0UF1y1TeV zEg_u|hRT`FKiFa)%Qn8395v*zZpi=$WmL3;>=2#T_9Wa_*s5f%g)63Cc-Zx#@aCB# z0IwB3haxtaC%BUuc;^0MJ>Z-=4;R-)A8qfBvTmh5hD%gZql*pxG#8y;#!c1^*0&?K zyl`4kBaT|NNbi$K0g!F>OPC(hCL9E>YDlB@_+j7%8ktN^jm1~K@d)=85bGLWdainv zlS6n)w?9gtaq~YFF*NeaJ*(aL%duOFYDsS&G(c~AFpD%YYW0*e$@e)N&R`wyT`42A_aL!7|ggj?pi$)7ahY=IA;E$MtcgRD|oYMm1CW zaEfjlW#WRN`If$8Z>eFxziS*$_QTWNfrcY654RIbsFJFz-)NibY&nolwEd*mf--|( z=*JML$`&n3mGAMKF~XnZUuyLaDYR;7*fn+h4ND;?-R{Bg+@CDnLTj+mab>Paz1JAd z;v8wvvKX*D^4WB?LQsjBoRI+Zz52GDB?+rcd|1A!jyaEFHWKrz zd^)MzcVzEL_b-Y`JFOREhn|O`Q%DjjK7+SSiZ82X_55;i{A88c$Z>b&Ic@L6FF9^2 zzoq675B4{Mq8QjfU0aJb<5nS|FGXAY2ISF~ny=foU_tZXg_?T^=B`C7eay6DaR)IW zTdo*`$rQYqpQ`EQt0~^>H2XFdc|}{O;_ae+*SCE>h5L!IB8a?c9`mpDGz^}jdw9~G z7~7Y@V)Eoc)k)5)N+IaNK>sd(t7R7-5reT`Z>eUrwEg;Z@{nZfaTn8c)1K;RwI+?^ z;2{FK?r&E0M#i>l8pLCMs#HYPJ_dbKLj*Q<_C$b11(E4sc!8XXXgJ}Qx2Y07)o?d4 z%a#7*=hPfIF(q4!v;D0&(I!p7+n zTA!|!Sy><($DS{ah+_}FKGY9aDm<`~m4|b4D&l5H3}{qJzeL&iH|Ycb^LQ#iIj87k8>e* zSr>UtdaB$*mt?b1aOEGz1kjKC+y<4SAxY3LjsYKDPJSBdID93>laOY`Fz(NBOMaI| zAAgv%*HcR_9-zQGR4ZK%5EDkWHzeoRI?yUC(z1$;=HvRf%0MX3qsXHLK z#^3s|*9hjeq;^|KPUtG+Cl#k&{i=}-!G|NK27)1IBH7`T-%z%%?*J|)4-vtyf9QX+ zQkX~_K}wH?bnD$VP*hH;x{z6AHp7WvcZKQQ#2t?{P%M5c&58A3KBT0Nd(<4?8r=L0 zAA~mqD6fv6Me;)~NZXW-mMjT@P4&b0Ly;j=N zu)@1^AoT#Q(sezGCC#+7SQ7wVZ5B@6}*hqpX@B-fu5ZCF%=k(Wtr zragN`(%z7YuLYYJNFKATpXNj~_^uYOS_)qrz)2uojrxTF)RBB7{X#619_PR0qFKbg zuCHeY)DD0+(=ViSPGDGH!kfV)N*~bgsA0oV1*K!YpjJQ`%4 z`G2aRu)t$CV2xg&BDVg;G{(>Mi{WVDDk>_OzqRYz0Wk4~8n&%F-hTfVdx@0LJX-Bm zRU7v4b7t@wzim^fPEIgTl#xg&4Ylj$yTI3PS+ST|)$XB9on4y2q?6+~c1PL@7vtR`2YVj%)uu+P;sD z4s&z!*?DYlplnAyS|>W5*+va>I!=idY;A3IiSa5!mwe*JiS_)X@qE?x`qeXm1=soy za<12%s;#3?D8u3a`qr>OC`|-)t$s^_{7{ZeamHr#7S=J*KoQ}w|LtalaF)XXNV0jf zY&fUY`mr%Ao>|Csy<4zuL58RlFIVp1RQhT&os9H6p%mta_8XfW9?P(p{yW+c?}$XA zWW}ZZp3HJoXeWNHJS3kP(}Fy!l74}}sBa68Z-vTi05gE5J4-~@69ys;fRHHZfFG=` zA2JUyQ0$vsOF29W$7!=oRkYC#SaOWAOlr6NsslAluQJGrAFxdZUOi$i#(B#fDk$#} zZAG5FQ0hpA&=-8t3kMGDGHNz-QQ@B1mT^C8I&@}ZCD~sKdS@mlC%Ihi#C5=CmW&+{ z{N?54_4VQW0HdOrz}#WZwmJdT$uK=%#sKck?4Ew#ktMSPDXMaC(^YhCqDf1n48~C) zcJneWdb`SfqlP-BB3)f+ydkD8!fT?jRl@iD*dqi2Ayl}Wpa4|5Ag$*n=^v+~Fj(#B z+8UP03Q*H-qCqR{xk1uU1;4OE)qy=dH|o)!fCeFnbb(Sp7v%G?LvZ2xdR$}`5UGzE zPu>(aM2?S-7mL*6r%eH2R{)l+d;<$?c=#$lR!$cV!pSI|&jS7L{ zv=&wItmax8?D=0O=jtm4jxtJIlnTvI&kg0%0WQw6If}*KMy|thU7C8)gr4n7W`GOS zo0t{!!X|NH1NO~~&{~^hy#j$yV0>#CWTj4Ki+Qggw`lWe@n--;!Ygf^94DB}%8>j) z2fmHMW8YXO+9j1%|DCy|)9X{#eQ!tRTkHe=1||+4^%SmMO(na;nXMB|2tZZms#QBh zLMhn4i;Zo8#$&=ph|~So;uT4Tt^qC=-~E~yhn=@x`Y8xhgw4M&!2+WflAM!XvDcvR z=|#%UW_e|Ds_rEo@srPq6``=Wy@&F#(@dG6fq1w1;|BLV8LNR8>;7_vBo&A2JH%%$ z&oFv@-{@{MDah76D19@!*cYyAUnFuym1YFZA~rvE%4N2_$yhvw{nj?Rh!AYV!toKq zmVJ$74J#iipRv8WF-A(jBnQ{Emd{9fr1GfXl4p;P! zkx(kd1I#d!C+`Aet^G8i)ovkm+cmh5G(f^W@a%FF@OrKr6)C@(^U#uGYzDxBi;sLI zxy$+_Tv*aK0YnFAPa=>J@dE@h3Mx}S_yb;c<0M``TKL8^k67c6yF*f^_*-=YURE@} zgd4pecc!T7wHUNrvnnKiyX3quNZA}1p-V;)uv-qbQ8L8fVp7gq4JDwMRq@Jsa!uY{|B6My*&C* z(}PkB1|Y|ct1pq-au5AizRaf;R$V0RwRN^Bk6EhIUE=c%-GhL1R=zv@&||`TP%aDi z41(^)W7C-d4nxRRYZMvPamrK^kh=nXPjQ|<%LwqU7$ZA28mKXR_t`T*hR3;BzN93( zh%{Ikv>(_vn^Wy(HDDI*u3RA8fBSa(MN#CLBQM3u87M$9JHDB8eERiLDF#k$;*iS5 z6atZMxg~g<2lK{xb^=NxPt zE5+8ZGSqw!`!^aNIx;p(jO|5K`ayDqrr&=0{{ilpvfTgx literal 9046 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 diff --git a/tests/snapshots/flex/test_get_address_wallet_v3_confirm_refused/00003.png b/tests/snapshots/flex/test_get_address_wallet_v3_confirm_refused/00003.png index a75ab7bd56bd95c6830461d08ad664c6dc32db3d..295f8f713e06a7a75774601ad62dc89a632ebca7 100644 GIT binary patch delta 7953 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 delta 7937 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 literal 0 HcmV?d00001 diff --git a/tests/snapshots/flex/test_get_public_key_confirm_accepted/00001.png b/tests/snapshots/flex/test_get_public_key_confirm_accepted/00001.png new file mode 100644 index 0000000000000000000000000000000000000000..7200206394092175164c3c02e73dee475637229e GIT binary patch literal 16463 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 literal 0 HcmV?d00001 diff --git a/tests/snapshots/flex/test_get_public_key_confirm_accepted/00002.png b/tests/snapshots/flex/test_get_public_key_confirm_accepted/00002.png new file mode 100644 index 0000000000000000000000000000000000000000..c792f5d8d000a1a6e208eb0c70b48a1e0dea3c16 GIT binary patch literal 7706 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 literal 0 HcmV?d00001 diff --git a/tests/snapshots/flex/test_get_public_key_confirm_accepted/00003.png b/tests/snapshots/flex/test_get_public_key_confirm_accepted/00003.png new file mode 100644 index 0000000000000000000000000000000000000000..4321e60181db1ab7e8a7538c25e72daba09d225c GIT binary patch literal 5874 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

d35T<%ZLxEI zW+hOnrl`Lw6^D${zou}Bhw}>AcgNltFc0NKFQGW9Y`PN_2B3P2xr18xC-l_;Nd0TGJ=om}tB?WsXgO-TF zlwdgo5U`bm;1p4R!RJV=4nZbmakP#0%v)5^|HM2nLMmwKkMPlvUtvsVO%wTI5{S1S z^HX{6r1t9oW!|}gqcD1aXv^43j}a%yZosFO`VPW9sW8|u%;cRsZlZNb(j_kmxgm{& znnc$ZBEIE5tFIFV>Ovc)EXHiD2YQ}+)}Gh7kdol8pvTt&te0;TANnqkeX9TM0jcRG z@zZ_O7e(^1bbBr>$Axy(KS$X%?(ucm{i*BN{%!_0YoI(SGpIZrwqgZNJ zbs2wFNq$g^?dC2F;zNRaSa;~1{oN}Xt=52F7ZHwcGji&+iv%dHqUrMmhs(zxXuyne~yP z;X(ADUcRngrSfDGn#0ib@b3)O7nHv|pVmhQSgimR1Y>fY?ZBpn7ojZg?yjlJ=D5dL zrm2mSS=*z<4(PUGXTObB_MH~h!*JqZNiI@*in+X%TX5d>Ug~H^cMMerP2>3T>$wM} z(wxz+1C2YtyB&oRb!Du-KK?v4`1Br|W~?&rqUH85OcG#QonIjpzrP>SQL!rq46ym} z>D#c(LyAc4O}YPPN9M>Tn5WB{NGhAlZ7n!)RjR#2+@A#xi(@~wtZo%yoSY2T)5|Ps zvwG)K|4|*z6nBHV#t^%!{viB~HQX0q+hs_Ad|Y*X-1mK4dj7v}e$_Y!?-zouw+%3` Q%Z8kA_4=mv*rlug0an##761SM literal 0 HcmV?d00001 diff --git a/tests/snapshots/flex/test_get_public_key_confirm_refused/00000.png b/tests/snapshots/flex/test_get_public_key_confirm_refused/00000.png new file mode 100644 index 0000000000000000000000000000000000000000..e91ba34d0de7a52134cbdce8a402ba24de940a18 GIT binary patch literal 8962 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 literal 0 HcmV?d00001 diff --git a/tests/snapshots/flex/test_get_public_key_confirm_refused/00001.png b/tests/snapshots/flex/test_get_public_key_confirm_refused/00001.png new file mode 100644 index 0000000000000000000000000000000000000000..7200206394092175164c3c02e73dee475637229e GIT binary patch literal 16463 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 literal 0 HcmV?d00001 diff --git a/tests/snapshots/flex/test_get_public_key_confirm_refused/00002.png b/tests/snapshots/flex/test_get_public_key_confirm_refused/00002.png new file mode 100644 index 0000000000000000000000000000000000000000..c792f5d8d000a1a6e208eb0c70b48a1e0dea3c16 GIT binary patch literal 7706 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 literal 0 HcmV?d00001 diff --git a/tests/snapshots/flex/test_get_public_key_confirm_refused/00003.png b/tests/snapshots/flex/test_get_public_key_confirm_refused/00003.png new file mode 100644 index 0000000000000000000000000000000000000000..f8feb4ce438fc21d8ec7cdc598e863d091882a37 GIT binary patch literal 10062 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 literal 0 HcmV?d00001 diff --git a/tests/snapshots/flex/test_get_public_key_confirm_refused/00004.png b/tests/snapshots/flex/test_get_public_key_confirm_refused/00004.png new file mode 100644 index 0000000000000000000000000000000000000000..45c08d4e74ed1b1568bbfb9dcb32b83caa13dc5d GIT binary patch literal 7967 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 lO&k6%577R>KfaaDIJ^JcaPsnv{{eL%0p9=s literal 0 HcmV?d00001 diff --git a/tests/snapshots/flex/test_sign_message/00000.png b/tests/snapshots/flex/test_sign_message/00000.png index 9ea1d286f70d18eafe91e6b7f88d21041e22054e..283f33a1c76e24f84aba1b7ad28bccfc007efad6 100644 GIT binary patch literal 8592 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 literal 8823 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 H{`&s_ps~dj diff --git a/tests/snapshots/flex/test_sign_message/00002.png b/tests/snapshots/flex/test_sign_message/00002.png index 36c94f3e0a3e6bc8a2036be94d870b0c03502efd..8f11aa55fb9e4cc96781ae45ac09c7684c930638 100644 GIT binary patch literal 9292 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 DlghcI literal 9503 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 delta 7937 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 literal 9888 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 delta 7937 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 literal 9888 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 delta 7937 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 literal 9888 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 delta 7937 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 WU1&>tINzR$AVE)8KbLh*2~7YB+nXZ* delta 355 zcmV-p0i6Ei0{#M!B!5LoL_t(|obB0Lj>8}fKv7h6C+vSo*-Jl=BFejIj2*b=t7QrS z431!&0{{R30000000000t2mD1&x+StxcuCugjtw2gZ3x=t=)mIIr82&3gasIFTM9k ztvJ}>Yq8eI6W5XNfa2$NVK)~Iw$m+~VCoJy*I=?9Z*2eG27f1*or0w2C%&Rd-3tH!000000001BFCQGdAO*0P-ogL?002ovPDHLkV1fq; Bt+oIF diff --git a/tests/snapshots/nanosp/test_get_public_key_confirm_refused/00004.png b/tests/snapshots/nanosp/test_get_public_key_confirm_refused/00004.png new file mode 100644 index 0000000000000000000000000000000000000000..a58590b988714545e7960f7f400f360ffc5de41f GIT binary patch literal 382 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h6`U|@9hba4!+nDh2#bl+hG9*4k? zQuR0Wo;SViCn%lTo!KM1sAjk5Y(@*V#~rbuHu`7A_H&AxgwHf8y4cdKvg$JbB4n%ez%sZ31aBYd&Oo@(7)_WJ(Znl2o8^PD` zFE`_Y-IS+Kdq0Q2-7r_C=}F(5ev`U`H~)QH|9$1FHE$YjoVax+e0xei%S`SAGlOm! zp7{T3NA-mVOYb&rdU8MdyIHo@@7cE*uj@I+Zu{2i)KMSV-E~oc;7H69f)5to41I{9)dDv9$~H zAFaq>V}Jt(9?R!*Hdl$M+gug?u{`3U_-~N~%jO4NI`?Es0_%*@84F%U?_d&%<$bg) z{~=d^^16lXe)rGFz2f|HsC*$v&UnF#M}4#ZIV`BR-dV8y&-}OF>XQ^}RWDs%%vN>9 zp{ez&Sky~D$#wog1W)@q3# z4)~MsTYG-~@5&ve5qGs;ia*ZcGCrQ4@JjGc-sXtg`_%Jme~GE|B($c6+?2dvmi>R$ z(yyudvwDB@ZEx!`_o*t?f8 WU1&>tINzR$AVE)8KbLh*2~7YB+nXZ* delta 355 zcmV-p0i6Ei0{#M!B!5LoL_t(|obB0Lj>8}fKv7h6C+vSo*-Jl=BFejIj2*b=t7QrS z431!&0{{R30000000000t2mD1&x+StxcuCugjtw2gZ3x=t=)mIIr82&3gasIFTM9k ztvJ}>Yq8eI6W5XNfa2$NVK)~Iw$m+~VCoJy*I=?9Z*2eG27f1*or0w2C%&Rd-3tH!000000001BFCQGdAO*0P-ogL?002ovPDHLkV1fq; Bt+oIF diff --git a/tests/snapshots/nanox/test_get_public_key_confirm_refused/00004.png b/tests/snapshots/nanox/test_get_public_key_confirm_refused/00004.png new file mode 100644 index 0000000000000000000000000000000000000000..a58590b988714545e7960f7f400f360ffc5de41f GIT binary patch literal 382 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h6`U|@9hba4!+nDh2#bl+hG9*4k? zQuR0Wo;SViCn%lTo!KM1sAjk5Y(@*V#~rbuHu`7A_H&AxgwHf8y4cdKvg$JbB4n%ez%sZ31aBYd&Oo@(7)_WJ(Znl2o8^PD` zFE`_Y-IS+Kdq0Q2-7r_C=}F(5ev`U`H~)QH|9$1FHE$YjoVax+e0xei%S`SAGlOm! zp7{T3NA-mVOYb&rdU8MdyIHo@@7cE*uj@I+Zu{2i)KMSV-E~oO|F6?DX;W#_m@RHOO=G2L<$|Kge8<#G)68&3w9I|U1rQYB;pTjxN;luNMmiPL4y?Aih z$!^b&hksO1P}pOC;rtZ^h3_6KC~PZH+6Ih(oja-(6tsEv=l^vzv1pz-j-0;Ge#-?3 z$-V{Nj!-h&4&H9QUFo|&ZtZnc+IxHFcYmDL$=};y7}|z@Wagm}zV@Z1F6s2X>E$cO zc5?l#unYuDVS>2XzOq9h?wH5#2XFsySLeUC|C-?c%P2slr+vG;qkdpN^83zTNsW=$ z=oC-2*rz4!g1Z`6jAcihKNGj-dd z-POC!?bRP+vDv~>RdM~E3H8ovWcAf)r}RF}efr96_9o@&N4IBOCneUGxoPNnpuX$^ zUpsu^z-=2{tk=&~FOGJ;sCIsz?lp+`V?Pq-%d#gnzXgMZR6hfj=EC~`|iXS)Q-;S^((bbp}AA)FeNoi z-0q74%Kd+~3>j^bESgQLd-F@@G&s|}%Ax7QkCMlJiw!ESLlt(w6HfJSdhLy@sMCMk z?pDm)jqg_)SbY0@e@u~I^h<~P4)?u^?CQ-%p~|ulwV=KFnWLC8*cs#Gt{}JGpKf>W zw7TvQ@X96u*bCNOjS3uUy2R2#db??)5ajRHs{>3)idnn}g9|(b^;8f3y%y@B}veb*93lMEyc!mY~l9FA$yu}wk48h^%)~q1cpEx}1 znc>HIsdfh&7dZab?w(H#?3$`a_E9JfWcKElJq}A{E~++oM*H-Sw8TX6TGf=`15cE| zVvD{X60EfOke@%y%gdv&ItT;;w`p~CmEQKw@ARjX7)Wxpas(^bxDACdH_q;x)yv}) zAM)P_JALp&VAHhl*<4o^r~BHI&5a+*@*DLjjUQa!(YX<(h0Tk7ti%)?7g)ACrd2k* zXELpRcmqxaNfIrs(46`BLS0R`TbcyL609TxC3ygPJ+5$-IaCulcxUyIH;=Q$8? zcLjogRi>iMe(yCZdDiO8Zj|PVV7Z)N<4~BA`_|8QI*&N-2x=NFJpqli%2y|dLo>R6 z5&i^h1p(6@GkNV}FnqiUhikSAH!VDsN12cJW*`p#J@2c_JU^JfuZ|(`N!J)g+56sP z1UB{QnIk^rGav_d@3`|X@UvECWFF;49x<81Im-ro1Uk68O`BnX7&XX>9kzGAHhiri z7>$EM5wjIBtG_^=l-<3Ad=oe8;V)X7To`Pd9Y`kC35Xf9pm-PqkH=G8ykQJJSi&hZ zG&i<(1eOTvJeq)`AXY;oyFy!%qAc$tEwc366Sfs9&uc=45?GBeE#8-px@XL+ZS%KmzZ`g7(g ziBO0qcly-Ti)LBUEytq`t9mtTb zJrsVCOadvv`Vz>uD%x*q=ih!Vv@Tx!W1jvvC)!GC|KY(Xam(s_=Nq1;+OLe%Bvad~ zYbEJy%zj{ME_p!{Lj;9>^6HS-f}2xkpZaN@bcp$^xmIdj5k}&PSr|(LX?=bBU~2&2 zZqcaobgB9!z!X`QOUwhnRAE`Nv!TR*LTp_-mPoA{CFvWlwd_ki+SM6+E0=TwLs>vQh_}n*XpqUUU5*#LClbrTR2g5-9pSQd-+~^X`bo z0b||6lG@}s_cw)2GXzcQ-4?D1b>o&Dot$tXv9D36sl{_B{#*Qgnr!G0G>sJ;q`#DX z$bWv&GWA^Qw25;n`Te03YUjHHuW%>XRhGDmJV!Mfmt2nh(Hib(Q%KyvQzz|9%9s^2 z%1nYxCBC3%zwxU5ExT{QefU5|_wexW%*@O}{rW>2^x2>`p*sVSWX*MDWziJ9y?St~ z>+8a0W8u|;hqD$V1;Z(?M$1&FflWlnB*JnOD`sT&C-1W>8w@tS*zJjDNRF0nm6#14 z4a>bO{$hhR=;|jHSipyUPHgf@@7Pfp;wq5%2iJGvl;jMNqO{7cY)RcD#s3DL`>NC& z0Y+<>n#YmGk5NboiA9FUeJUZCD{Rik3BZ0jjyuH;!mefEa%I=X@fQSRf~^-wzhU!*HkU~LkUvBII63veYT*&On!;q!Q~c`CH|)isjE)x z%rC3pp+P4P-OUM@`0QQmO} zD0zlbc+~ueP%L^?sZViDtuqw91qzQbgFV*X>{V-9<|0rnZ>!7NO!~l~#7DET^PO;G zO!3uRPQY1YN(ysh_)vx{Kt&{(P*F!eosVxH4Ij#!!r>NpIpVdod}Ygu;i@R2`GE}@ z93oBCNCr$L!$>m~{b?Sviu-D`fnGD)bpl0iA}glrk2@ zQBwWaPI}gWP&^Oksh>W!9YBx(INSn~|F+v2kFLI#cCF!4xas)(YoOulOE=I^D8oyV zL@cHT+PGLkAn-7Z#`K`FUA@y|UpDX*aw?{^1{Zqvxew>JT*?iv%_QQ&N|L)LuL?jk zp1JNdU(bC?u3VTJ6}S~t1bd*%{-qkxZTA&L_xS-7YSV|CmVhf?*z3FC3rupK`D z*ywmV4i_J_{1|0u)!}tGJRUAOq#iGGD^R(LzP;KXkTp?7%!=gS+HYP+1rF?@Dw1>{IsCYS_>%Ihb!woIRu+Ji+W#Cr76S5Yi}5uz9BE`m z1~qw#3ZT$EJMPT1R}6KWV1EY6-NGecEBv@I)Mn+*n4S|O3)43|Um`~rtLIr4(IrD& zLme@(swkP0W>Pc6XP$MV$#^=FsL-E$CAdMQI$QQ$&={*r-0oW3D7(l^M&`8!0MG-9 z#8Q%oT3J1{)fFc~$9jtDJfYB}1QYhD_MsJ#RM&9aOBC1?Qi}v*4Ae4I2;|npwgbSj zrY4{-AHD6}`}OqGueJJc!_bM9%I2goSIkEFz_q(0P%;~CkVoOfG>vL#yDldYf!gbf zFFf?VM~xvsklD_g{o0e-q&96@LD^sD) zh}G;rGJrq;&>hjk^#st){+U?>;1-5+S=DCFCD!zbEwsuc&0zB~nH}Y8bm@5dKc7x* zSUlS0CH!E#@+p!~y9i4Np@!6b?64$A*FMD(eJg)#R?~iDdxFmQH=l9y5*u#>vBYt& z_3Bnd#m}@a)H_{fte~uD+DnDhzy^=qX-8FRU$uN;}a{UeivQxV64QnI<^xs zQD1#u%~b6SGHY%LDPe#iW&CpS>?k3Iw)M8lcEJ_?TiJsD+O*IhD=zrNo|d8TGeZ0c zFip{UNGLXh+(Y02mnYoG!XmHABB(*^_vfS?x*WToYMg*f2YZJK)kB1T9l=~G=q^ld^v#8dGT;Q|Pzua-=63NHS8K;|mqBoCoZ&&%F# zKJR}UT3e1RxDh)V_q!1`BK7amGfrNyWB!Z|OHJhQRn5P{PZbB=tL+wD1rs-cjk*dy z-Wv)X*7^|F$I5mvOuf?UxYOdq7WQ3!jZ8|q2;V*~hi;Luai;YX-lnS8JGoKrh_0+?^(}ZZf*^`j z=eX!KZRb&hogVG=$G<;w10!P$+6=i3711r9x;4iVEaEV$PE(XFL|Vaa0{ zYqLG0(hiSYmvaa)bC|aC>+${~Sq)vhr-_19eG1UHg~{%!B|Z5rQY?G@>AXFe{x~~{ zRfoNrel(0Uk2fje^EB#?h=m-{z1(Em>T?}R7+kF2{^ zc|09Z9|Tl|wNDTmmyd`P0d=xTUu_r7kbVDz&VN)n(jJc_6jHf#Z$L*Rbzf`nF^D4W zFN$hsT7A1%9iF$ld0zSe>jIF)N>Yj-LIUQ?BMIZ)QN0MubLRkEg^9%#6=AXa;a^{Rb1TOVDmesTPLRN)l!p_~7okcJ6$< zg;rK9t{97@G|Fy10rVkX*$vNC=|+1}P5O&`8t(+O%CmX|hr<b6#z7trjkR{P?`RTdg;uJYuwn4zik zQ+IMI*Kc@|NTf{LvSl4W$--i>q8r7gBQNKM*>V~+S+1}f3wk(UT`VM?`oG`8hr z`Y-1$ZIRZ)DQ2z~v%N+nW~7KiP1S~bHyE9w4)-PRa*I}^wt3dS9*;P@`+&_EEG+^4 zdlj6|mJ~=J09Q=iSkF;zd70Y0dK=jB|A^QCIvx!N5E6P*zOlBp29QHwoM<;X{FiWQ zN(a9x7P4y#BVk6hMiIZG%j5wG-hivuH{>WQNK|V4SdM&o*;p&9a+rV9Oe3p@TB5I( zF?BQF_Y{DG%runKx>PE$8)$N!fJvb(@DIF+Xo`HTqL((=t7ieKmi$67%mBh=i+KZb z4^etKbyLo4o26kPKv1-f0fCgsG{xuoA^}%eVL^ryFn=!;5P&1-G{bmW%SpNPB-q~S zYhI5PU;jNIdomCwouE*nuOSxpJW|lrI#mjjha4k-_lZlr7ia}Eo{;buivyTLO4Uec z4nZc7Nap9~S5{2$KqR54bYI$F@bc2q&_t{Y0})G=Ox58+t+05v>cFIetSe|H13~nv z-IBBjE5K7@x9EFP8Vr-syi|_eWHFIMdP$FKT?#e^_=@pi6T>1JFJwD5+xTymO*jxepD%9lQ?il-?nML~qUh*4J!^p8AG%fD(DNE&)``?&ctR{Vs`5k_2pe2li-U_n0pI|ih(~X-sxQM?~$RyG%Z6jnM07JemtE5 zitw<~T(s+R=7_7Ii{e9UX#-%;o-Q+HMQae)C$W13{ggg&6O2KxKF9{`q8~G2#Rc93 zd&K6HktHSs?=HIU{i4@ErqNAAfq-7x&Xm5b8tNnworAS}d<3s!YSBx@12d7@HLj2n zAmZxKmUWVxlFSU*+b17&pwJ4t>+MW{HV8qzCzZ*k-#0o2o%TWd7;5$#P|gnI4HX!5 z;zySXf6&Xip_b8I>OUI?zV!W4Tp-LvwQK71RxN1$SqF(ib(9|gCR0pl8jUN8Sva@< zD1QFSshvO~%8v1(Mr*7MAEJJlx+lN_z}I>79Cmo%BW{GDalFH`e#ralWUVJpTHw;jX$|<6@7Qk>BHZ5hu#mr_@xF;a^Dkt2 zA)+Z|cg?LO7C(>1w{M7e&hoYQczFl8MDp23K70(R7!+m{*yIWR{&d<|;n3JQ-LH#_ zXD}X#eYtmYwg358GamV&rJTWH`Bk`g-;4UVeBD39s=`gXExJDD0YG5@Y3_=qTqY3- z7ce+V8dLp|9rb?94wh2q5~{A=y!# z?o<_hZnh4IC}h;caW8@sn!iO#-UiEhz3Tpp#UDFTK{e255j-priR=ri1CeX8pWQIW z(h9RPP*>go7P(%u?Co$s4fwye(ug@MPAo`$A7rG7VuvQ_}O~SJ3FF&gr?xgEiBIrUJ#b zY+%EukIkxw_3ugT^-qgBvH7?!A`GgehCO8>V99k=ivj@Sczy-OCS=ETAb+MP4^~{Q yz$6fu`#QH-x#e=sX$1Xe1e*VgfF5otuC!1=sr&q|1ONOh*xNXrulvLA_WuG~g|BM> literal 0 HcmV?d00001 diff --git a/tests/snapshots/stax/test_get_address_wallet_v3_confirm_accepted/00001.png b/tests/snapshots/stax/test_get_address_wallet_v3_confirm_accepted/00001.png new file mode 100644 index 0000000000000000000000000000000000000000..73fb8dfbaec86e6840fb88057e5f49a12594baff GIT binary patch literal 17256 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 I$|(5%0*wX{3;+NC literal 0 HcmV?d00001 diff --git a/tests/snapshots/stax/test_get_address_wallet_v3_confirm_accepted/00002.png b/tests/snapshots/stax/test_get_address_wallet_v3_confirm_accepted/00002.png new file mode 100644 index 0000000000000000000000000000000000000000..7a4947867f5b3ce9b2da5d34fd38df59167c1ab9 GIT binary patch literal 5782 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 literal 0 HcmV?d00001 diff --git a/tests/snapshots/stax/test_get_address_wallet_v3_confirm_accepted/00003.png b/tests/snapshots/stax/test_get_address_wallet_v3_confirm_accepted/00003.png new file mode 100644 index 0000000000000000000000000000000000000000..00975a1033f0e710869c2481456550a30b4c9df9 GIT binary patch literal 9993 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 ZTlNQYp_T3oeB#DpWMF=+@`_9J{{n6Fk{kd4 literal 0 HcmV?d00001 diff --git a/tests/snapshots/stax/test_get_address_wallet_v3_confirm_refused/00000.png b/tests/snapshots/stax/test_get_address_wallet_v3_confirm_refused/00000.png new file mode 100644 index 0000000000000000000000000000000000000000..acbe30c946027f56523dd21eab7144b2532fa27c GIT binary patch literal 8224 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 literal 0 HcmV?d00001 diff --git a/tests/snapshots/stax/test_get_address_wallet_v3_confirm_refused/00001.png b/tests/snapshots/stax/test_get_address_wallet_v3_confirm_refused/00001.png new file mode 100644 index 0000000000000000000000000000000000000000..73fb8dfbaec86e6840fb88057e5f49a12594baff GIT binary patch literal 17256 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 I$|(5%0*wX{3;+NC literal 0 HcmV?d00001 diff --git a/tests/snapshots/stax/test_get_address_wallet_v3_confirm_refused/00002.png b/tests/snapshots/stax/test_get_address_wallet_v3_confirm_refused/00002.png new file mode 100644 index 0000000000000000000000000000000000000000..94c91bb65f40ac848db9c9f43dfef3e446d7bbe8 GIT binary patch literal 7629 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 ZTlNQYp_T3oeB#DpWMF=+@`_9J{{n6Fk{kd4 literal 0 HcmV?d00001 diff --git a/tests/snapshots/stax/test_get_public_key_confirm_accepted/00000.png b/tests/snapshots/stax/test_get_public_key_confirm_accepted/00000.png new file mode 100644 index 0000000000000000000000000000000000000000..915fc728c32f9febd5831f060f359ae85df54595 GIT binary patch literal 8394 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⪙2c> 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 literal 0 HcmV?d00001 diff --git a/tests/snapshots/stax/test_get_public_key_confirm_accepted/00002.png b/tests/snapshots/stax/test_get_public_key_confirm_accepted/00002.png new file mode 100644 index 0000000000000000000000000000000000000000..0b6c305905abe87cf5e908110552d4bc7aa068d2 GIT binary patch literal 7213 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 z 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 literal 0 HcmV?d00001 diff --git a/tests/snapshots/stax/test_get_public_key_confirm_refused/00000.png b/tests/snapshots/stax/test_get_public_key_confirm_refused/00000.png new file mode 100644 index 0000000000000000000000000000000000000000..915fc728c32f9febd5831f060f359ae85df54595 GIT binary patch literal 8394 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⪙2c> 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 literal 0 HcmV?d00001 diff --git a/tests/snapshots/stax/test_get_public_key_confirm_refused/00002.png b/tests/snapshots/stax/test_get_public_key_confirm_refused/00002.png new file mode 100644 index 0000000000000000000000000000000000000000..0b6c305905abe87cf5e908110552d4bc7aa068d2 GIT binary patch literal 7213 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 z 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 RzNithw{iNt?xJ7v{{!uwOu+yE literal 0 HcmV?d00001 diff --git a/tests/snapshots/stax/test_get_public_key_confirm_refused/00004.png b/tests/snapshots/stax/test_get_public_key_confirm_refused/00004.png new file mode 100644 index 0000000000000000000000000000000000000000..94c91bb65f40ac848db9c9f43dfef3e446d7bbe8 GIT binary patch literal 7629 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 BGMxYb literal 0 HcmV?d00001 diff --git a/tests/snapshots/stax/test_sign_message/00001.png b/tests/snapshots/stax/test_sign_message/00001.png new file mode 100644 index 0000000000000000000000000000000000000000..4a1648e9ef6a831f995119872ca9e2c88d231667 GIT binary patch literal 6097 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 literal 0 HcmV?d00001 diff --git a/tests/snapshots/stax/test_sign_message/00003.png b/tests/snapshots/stax/test_sign_message/00003.png new file mode 100644 index 0000000000000000000000000000000000000000..cfee3aec2b96566ef135772ac1ad4ce169166f31 GIT binary patch literal 5988 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 NpP=tL{uOuSe*iQ6;hz8i literal 0 HcmV?d00001 diff --git a/tests/snapshots/stax/test_sign_message/00004.png b/tests/snapshots/stax/test_sign_message/00004.png new file mode 100644 index 0000000000000000000000000000000000000000..00975a1033f0e710869c2481456550a30b4c9df9 GIT binary patch literal 9993 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 ZTlNQYp_T3oeB#DpWMF=+@`_9J{{n6Fk{kd4 literal 0 HcmV?d00001 diff --git a/tests/snapshots/stax/test_sign_tx_burn_usdt/00000.png b/tests/snapshots/stax/test_sign_tx_burn_usdt/00000.png new file mode 100644 index 0000000000000000000000000000000000000000..1223e88c36f2685fc2678b8f9323fa9b3ba39ea2 GIT binary patch literal 8441 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 literal 0 HcmV?d00001 diff --git a/tests/snapshots/stax/test_sign_tx_burn_usdt/00001.png b/tests/snapshots/stax/test_sign_tx_burn_usdt/00001.png new file mode 100644 index 0000000000000000000000000000000000000000..4321aca88c68013b84e2a4f3babb3aeaecbe30d7 GIT binary patch literal 8051 zcmeHsX*iqd-?p~XYCE)@E~qWjjaDtKu|`BY#+a$1TWl3;F{-wTHH)saRn?)SXqXvA z#S*Fn*@}|U{39hLB_vW?BO-{1NbugB_kG@v?}zt!j_1Ss{`2KJj{CUpE7$e={jT$O zp6B)Of`_Z-PTieqYHFIl{_@i$HMLDo)zmisv3)b}1nfz!R#O9kfBos~m6R9aQ2}hm zk6Yh28w=5#c=q)2kEWa49vnNf!)Nm|HDIXt=F*)L?a%6Ipr~2v#m$FJw#%Uj>z6bR znFQ1w&6f7V;TU2xw>i4FXwe+KrVdXEnLx5$Rs!nJWchx|`r-C&GMtr=?j0trky?Zg6?u1sE)^=jHK7 z;v}U2-c~1Si_yvGv@n>{2#>_hQwYoG4IWrN=b+)tmm3>yZ)uInuJ4ZtVp}D`V~JdL zm#;Z?eCzwy=ap$)rMPwkk}vo4^mMuSF%h@T3(a?Oa>9nSCVyCq!@*$X**(MwrMXrX z<-T!V4+6Z#+pX3@u6|tK|9815WB&s@{!#Ka-_BDICnq^NupkTuON3X#|DL>An2Ytw z9lWsL1?->igqHM4!O}%E-vY}h<382u%?a4=!fl?`*l`<_l>eO<4|KkC5C{mG+w9Js zHB+cm5DjM-EUW7<|M~T%0D^Zl3L+25v3s2# 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 T>i}?>uJ)^o$4_-X2Hp7|&JR~- literal 0 HcmV?d00001 diff --git a/tests/snapshots/stax/test_sign_tx_burn_usdt/00002.png b/tests/snapshots/stax/test_sign_tx_burn_usdt/00002.png new file mode 100644 index 0000000000000000000000000000000000000000..d47e1c90adeda271a7fb60fc3e5879e5a3ce5bed GIT binary patch literal 9030 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 literal 0 HcmV?d00001 diff --git a/tests/snapshots/stax/test_sign_tx_burn_usdt/00003.png b/tests/snapshots/stax/test_sign_tx_burn_usdt/00003.png new file mode 100644 index 0000000000000000000000000000000000000000..392165d4fc71395ae212fb0ca017ebdd204c126b GIT binary patch literal 6218 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 literal 0 HcmV?d00001 diff --git a/tests/snapshots/stax/test_sign_tx_burn_usdt/00004.png b/tests/snapshots/stax/test_sign_tx_burn_usdt/00004.png new file mode 100644 index 0000000000000000000000000000000000000000..00975a1033f0e710869c2481456550a30b4c9df9 GIT binary patch literal 9993 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 ZTlNQYp_T3oeB#DpWMF=+@`_9J{{n6Fk{kd4 literal 0 HcmV?d00001 diff --git a/tests/snapshots/stax/test_sign_tx_confirm/00000.png b/tests/snapshots/stax/test_sign_tx_confirm/00000.png new file mode 100644 index 0000000000000000000000000000000000000000..1223e88c36f2685fc2678b8f9323fa9b3ba39ea2 GIT binary patch literal 8441 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 literal 0 HcmV?d00001 diff --git a/tests/snapshots/stax/test_sign_tx_confirm/00001.png b/tests/snapshots/stax/test_sign_tx_confirm/00001.png new file mode 100644 index 0000000000000000000000000000000000000000..f63f311bd79096361bf317c4bbf61fbd2c1dc058 GIT binary patch literal 9756 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 literal 0 HcmV?d00001 diff --git a/tests/snapshots/stax/test_sign_tx_confirm/00002.png b/tests/snapshots/stax/test_sign_tx_confirm/00002.png new file mode 100644 index 0000000000000000000000000000000000000000..d47e1c90adeda271a7fb60fc3e5879e5a3ce5bed GIT binary patch literal 9030 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 literal 0 HcmV?d00001 diff --git a/tests/snapshots/stax/test_sign_tx_confirm/00003.png b/tests/snapshots/stax/test_sign_tx_confirm/00003.png new file mode 100644 index 0000000000000000000000000000000000000000..392165d4fc71395ae212fb0ca017ebdd204c126b GIT binary patch literal 6218 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 literal 0 HcmV?d00001 diff --git a/tests/snapshots/stax/test_sign_tx_confirm/00004.png b/tests/snapshots/stax/test_sign_tx_confirm/00004.png new file mode 100644 index 0000000000000000000000000000000000000000..00975a1033f0e710869c2481456550a30b4c9df9 GIT binary patch literal 9993 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 ZTlNQYp_T3oeB#DpWMF=+@`_9J{{n6Fk{kd4 literal 0 HcmV?d00001 diff --git a/tests/snapshots/stax/test_sign_tx_transfer/00000.png b/tests/snapshots/stax/test_sign_tx_transfer/00000.png new file mode 100644 index 0000000000000000000000000000000000000000..1223e88c36f2685fc2678b8f9323fa9b3ba39ea2 GIT binary patch literal 8441 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 literal 0 HcmV?d00001 diff --git a/tests/snapshots/stax/test_sign_tx_transfer/00001.png b/tests/snapshots/stax/test_sign_tx_transfer/00001.png new file mode 100644 index 0000000000000000000000000000000000000000..7c1a8f728b172221c72bee6670b97d40441ec586 GIT binary patch literal 20788 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 T?`sAsfb4%Q6I%MpJA^Q5PH literal 0 HcmV?d00001 diff --git a/tests/snapshots/stax/test_sign_tx_transfer/00002.png b/tests/snapshots/stax/test_sign_tx_transfer/00002.png new file mode 100644 index 0000000000000000000000000000000000000000..d47e1c90adeda271a7fb60fc3e5879e5a3ce5bed GIT binary patch literal 9030 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 literal 0 HcmV?d00001 diff --git a/tests/snapshots/stax/test_sign_tx_transfer/00003.png b/tests/snapshots/stax/test_sign_tx_transfer/00003.png new file mode 100644 index 0000000000000000000000000000000000000000..392165d4fc71395ae212fb0ca017ebdd204c126b GIT binary patch literal 6218 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 literal 0 HcmV?d00001 diff --git a/tests/snapshots/stax/test_sign_tx_transfer/00004.png b/tests/snapshots/stax/test_sign_tx_transfer/00004.png new file mode 100644 index 0000000000000000000000000000000000000000..00975a1033f0e710869c2481456550a30b4c9df9 GIT binary patch literal 9993 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 ZTlNQYp_T3oeB#DpWMF=+@`_9J{{n6Fk{kd4 literal 0 HcmV?d00001 From 0e52c336aab3cc442ab018668a8ca27ce28e836a Mon Sep 17 00:00:00 2001 From: keiff3r Date: Thu, 20 Feb 2025 13:14:35 +0100 Subject: [PATCH 52/67] test: update reject public key test to use "Reject" instead of "Approve" --- tests/test_pubkey_cmd.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_pubkey_cmd.py b/tests/test_pubkey_cmd.py index d22d804..4082abe 100644 --- a/tests/test_pubkey_cmd.py +++ b/tests/test_pubkey_cmd.py @@ -59,7 +59,7 @@ def test_get_public_key_confirm_refused(backend: BackendInterface, firmware, nav with pytest.raises(ExceptionRAPDU) as e: with client.get_public_key_with_confirmation(account_number=account_number): - navigate_until_text_and_compare(firmware, navigator, "Approve", default_screenshot_path, test_name, True, True, confirm_instructions) + navigate_until_text_and_compare(firmware, navigator, "Reject", default_screenshot_path, test_name, True, True, confirm_instructions) # with client.get_public_key_with_confirmation(account_number=account_number): # scenario_navigator.address_review_reject() From e001cc07598255fad09ce367dcd455be56942c6c Mon Sep 17 00:00:00 2001 From: keiff3r Date: Thu, 20 Feb 2025 13:14:59 +0100 Subject: [PATCH 53/67] test: generate golden snapshots --- .../00001.png | Bin 16463 -> 10062 bytes .../00002.png | Bin 7706 -> 7967 bytes .../00003.png | Bin 356 -> 382 bytes .../00003.png | Bin 356 -> 382 bytes .../00004.png | Bin 382 -> 0 bytes .../00001.png | Bin 14984 -> 9080 bytes .../00002.png | Bin 7213 -> 7629 bytes 7 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 tests/snapshots/nanox/test_get_public_key_confirm_refused/00004.png diff --git a/tests/snapshots/flex/test_get_public_key_confirm_refused/00001.png b/tests/snapshots/flex/test_get_public_key_confirm_refused/00001.png index 7200206394092175164c3c02e73dee475637229e..f8feb4ce438fc21d8ec7cdc598e863d091882a37 100644 GIT binary patch literal 10062 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 literal 16463 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 diff --git a/tests/snapshots/flex/test_get_public_key_confirm_refused/00002.png b/tests/snapshots/flex/test_get_public_key_confirm_refused/00002.png index c792f5d8d000a1a6e208eb0c70b48a1e0dea3c16..45c08d4e74ed1b1568bbfb9dcb32b83caa13dc5d 100644 GIT binary patch literal 7967 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 lO&k6%577R>KfaaDIJ^JcaPsnv{{eL%0p9=s literal 7706 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 diff --git a/tests/snapshots/nanosp/test_get_public_key_confirm_refused/00003.png b/tests/snapshots/nanosp/test_get_public_key_confirm_refused/00003.png index 5fd127e517c190a1684db420b839a65dd8776a10..a58590b988714545e7960f7f400f360ffc5de41f 100644 GIT binary patch delta 355 zcmV-p0i6Ei0{#M!B!5LoL_t(|obB0Lj>8}fKv7h6C+vSo*-Jl=BFejIj2*b=t7QrS z431!&0{{R30000000000t2mD1&x+StxcuCugjtw2gZ3x=t=)mIIr82&3gasIFTM9k ztvJ}>Yq8eI6W5XNfa2$NVK)~Iw$m+~VCoJy*I=?9Z*2eG27f1*or0w2C%&Rd-3tH!000000001BFCQGdAO*0P-ogL?002ovPDHLkV1fq; Bt+oIF delta 329 zcmeyz^n_`GO1-wHi(^Q|oVPav`I;33TrXx`p1a|{>c;7H69f)5to41I{9)dDv9$~H zAFaq>V}Jt(9?R!*Hdl$M+gug?u{`3U_-~N~%jO4NI`?Es0_%*@84F%U?_d&%<$bg) z{~=d^^16lXe)rGFz2f|HsC*$v&UnF#M}4#ZIV`BR-dV8y&-}OF>XQ^}RWDs%%vN>9 zp{ez&Sky~D$#wog1W)@q3# z4)~MsTYG-~@5&ve5qGs;ia*ZcGCrQ4@JjGc-sXtg`_%Jme~GE|B($c6+?2dvmi>R$ z(yyudvwDB@ZEx!`_o*t?f8 WU1&>tINzR$AVE)8KbLh*2~7YB+nXZ* diff --git a/tests/snapshots/nanox/test_get_public_key_confirm_refused/00003.png b/tests/snapshots/nanox/test_get_public_key_confirm_refused/00003.png index 5fd127e517c190a1684db420b839a65dd8776a10..a58590b988714545e7960f7f400f360ffc5de41f 100644 GIT binary patch delta 355 zcmV-p0i6Ei0{#M!B!5LoL_t(|obB0Lj>8}fKv7h6C+vSo*-Jl=BFejIj2*b=t7QrS z431!&0{{R30000000000t2mD1&x+StxcuCugjtw2gZ3x=t=)mIIr82&3gasIFTM9k ztvJ}>Yq8eI6W5XNfa2$NVK)~Iw$m+~VCoJy*I=?9Z*2eG27f1*or0w2C%&Rd-3tH!000000001BFCQGdAO*0P-ogL?002ovPDHLkV1fq; Bt+oIF delta 329 zcmeyz^n_`GO1-wHi(^Q|oVPav`I;33TrXx`p1a|{>c;7H69f)5to41I{9)dDv9$~H zAFaq>V}Jt(9?R!*Hdl$M+gug?u{`3U_-~N~%jO4NI`?Es0_%*@84F%U?_d&%<$bg) z{~=d^^16lXe)rGFz2f|HsC*$v&UnF#M}4#ZIV`BR-dV8y&-}OF>XQ^}RWDs%%vN>9 zp{ez&Sky~D$#wog1W)@q3# z4)~MsTYG-~@5&ve5qGs;ia*ZcGCrQ4@JjGc-sXtg`_%Jme~GE|B($c6+?2dvmi>R$ z(yyudvwDB@ZEx!`_o*t?f8 WU1&>tINzR$AVE)8KbLh*2~7YB+nXZ* diff --git a/tests/snapshots/nanox/test_get_public_key_confirm_refused/00004.png b/tests/snapshots/nanox/test_get_public_key_confirm_refused/00004.png deleted file mode 100644 index a58590b988714545e7960f7f400f360ffc5de41f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 382 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 RzNithw{iNt?xJ7v{{!uwOu+yE literal 14984 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 diff --git a/tests/snapshots/stax/test_get_public_key_confirm_refused/00002.png b/tests/snapshots/stax/test_get_public_key_confirm_refused/00002.png index 0b6c305905abe87cf5e908110552d4bc7aa068d2..94c91bb65f40ac848db9c9f43dfef3e446d7bbe8 100644 GIT binary patch literal 7629 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 z zDZGm1MfD0Ao#sBgDtuym86_KN)3^A%_Kb&2TE|$L#r!5(w2#wrBR}cWsQ)s?_rN_Wu^39|mrL(WI`d)&#+6iVHQYe$h>_KA>5;E#R%~^Q`3qq7tNb^> zq$x1=t6&=x?S5BMQJQvcJ^40SmmAqk-?>Mv^M@4w?7uK;y(_cIR0aFkev!XJ`Oa|= z2%G{I9Vo1-h2FSZiu}eetj&kcWnZoRCl*dvfqRm3zrVjOex*Ndrh}W9pnc_KzYJ zy@#;%@D@LnrgD{67p-@epRWf%Jcm?ruJs}id>#x0HOqgJ)jU=ye3eglXRTFUzQi3g zZlGjpl78d12K__8*vw;SivDejY#qM4BM}mwU?K+*x;yWN!|P~2+Pq7I2-o;0b#}@B z8{W&mvakP>iKR*%4+Hcm%d^!`4Gaoy9&e#-`~ux>0lF4Kq|!8?`w^^#Xc}tc)|E7b zrL)7Rbet?KA*vA26BH&_^9V+I)FXV@djXOJXznZ0gYh&Joo&qEv$AXmFxmR5%WgY3 z93X$<{I^VwhsK6hw#UkVoLs=tP{14D8?}Qc1&bw8iNv-HP>5d3;J%Ui@Gn9!pq4Gj zBvO5SiF)g381<;3K7g4cAuF_yW4Vm)S@xW zxWvT75)(6BU0v0rBDE$Y8H$sJP+2u#GAZxU;pruyerejBAogjOHaJ6m0Yb(7Uj~H} zCe(#JKnbO1hVIjjHbnR%!=!Z{6@UZ=A(9ri{j;(F)yq<60^?*wPN_3^@Uu1H#lnwS zU2|8-U`GF~$4%Kh8ikvsTu2XP569OwX_OZod4~fg3~5|?`Idrl(?U|q5Z&c z7wNJv1z?wDQi)h1k??;&(RuMSY(hdX_?gkp_21LK=VGEmFv$2widCYMrnH_F+7wHu z^bV)8va+()cR1Q_S?%ZloHbED8ys3Nw6t?LjLOLOkh$P@ET$K|Bn8!ZgaReeA)p#j z(gDk?s`L_G)gCJ)^T|U&HXsWurg=Q98ZqOHfWtSejQtDoy$G*^LcT%E^04DK6XSAJgvM5K|{aDY4D0s+Ts zWyNiG2OzaGecA-1lZuw0d$8&_^i+I24Q&7U|UATeDQP* z7_bz|ik}MN37u{NI>OEwASAs3fT(Wvx-adluluqZwXX@|&@di`8+t>daYnWYEG|}_ zn;y@(@MlK{(w#}kS8U3#n2NA009=&rKb~~WOi$}wt;pn1|0rV=gxHTd>7s+y^Fo8& zC7-@2GZn3E+b;4s6Nyf+?xp)B1^K3Aj;O!V+d{Uo{MIOk^nw329zra;4`VIVFDaHE z&|DQ&qNizU%e4`h3&48GoUt+t$gYt9hD>MWi zwzKWl<6GUvBP`z&D*-M+@qX(>`FV+LvgF=`9S3SYJv@$IeWSfZ+;g!^9>#NJh6H$g zp0Ub9PalJR&0r1VXPKlgqmIJV#4m-$pAK26cj=BLBqTK3XmHms%fTNIC$~$a>#Kun z?xE<5l7|VBCST1G$`6iR6+6%UK2wilhYO zT=3pZocCPq^;}^#m$@Jm2M*s(sz&=iU&5dP7@rs{N+2SW^1?D}2MYSW%a?M)tkiP4 zXYvk~*gH&@e|Hp_N;qxsuVtaE!PlPTB0arw?NV9S8ELb-aLytVg`gfFlIULT>$jtQ z5zeoL*MrA(0uHS@?QTh$I!X%#E%|3q!&%d>QRE_qyD}wavQ&aD`X&fZH?{t?i=%cp#6F5FY z^zX&NOeFRnW97W{D@R1B-=E2f7Cba4kq)sisd-FYkaL)uMHaf@nti4-$_kP3&bWmCp8riW*#b2JknaoTDA=eC1i6 Date: Mon, 24 Feb 2025 12:32:03 +0100 Subject: [PATCH 54/67] fix: add a title screen for get public key on nano devices and generate golden snapshots --- src/ui/display_bagl.c | 14 +++++++++++--- .../00000.png | Bin 904 -> 426 bytes .../00001.png | Bin 556 -> 915 bytes .../00002.png | Bin 369 -> 556 bytes .../00003.png | Bin 356 -> 369 bytes .../00004.png | Bin 382 -> 356 bytes .../00005.png | Bin 0 -> 382 bytes .../00000.png | Bin 904 -> 426 bytes .../00001.png | Bin 556 -> 915 bytes .../00002.png | Bin 369 -> 556 bytes .../00003.png | Bin 382 -> 369 bytes .../00000.png | Bin 904 -> 426 bytes .../00001.png | Bin 556 -> 915 bytes .../00002.png | Bin 369 -> 556 bytes .../00003.png | Bin 356 -> 369 bytes .../00004.png | Bin 382 -> 356 bytes .../00005.png | Bin 0 -> 382 bytes .../00000.png | Bin 904 -> 426 bytes .../00001.png | Bin 556 -> 915 bytes .../00002.png | Bin 369 -> 556 bytes .../00003.png | Bin 382 -> 369 bytes .../00004.png | Bin 0 -> 382 bytes 22 files changed, 11 insertions(+), 3 deletions(-) create mode 100644 tests/snapshots/nanosp/test_get_public_key_confirm_accepted/00005.png create mode 100644 tests/snapshots/nanox/test_get_public_key_confirm_accepted/00005.png create mode 100644 tests/snapshots/nanox/test_get_public_key_confirm_refused/00004.png diff --git a/src/ui/display_bagl.c b/src/ui/display_bagl.c index 98411f8..61b935c 100644 --- a/src/ui/display_bagl.c +++ b/src/ui/display_bagl.c @@ -62,19 +62,26 @@ UX_FLOW(ux_display_address_flow, &ux_display_address_flow_4_step); UX_STEP_NOCB(ux_display_public_flow_1_step, + pnn, + { + &C_icon_eye, + "Verify", + "Public key", + }); +UX_STEP_NOCB(ux_display_public_flow_2_step, bnnn_paging, { .title = "Public key", .text = data_context.pk_context.public_key_str, }); -UX_STEP_CB(ux_display_public_flow_2_step, +UX_STEP_CB(ux_display_public_flow_3_step, pb, (*g_validate_callback)(false), { &C_icon_crossmark, "Reject", }); -UX_STEP_CB(ux_display_public_flow_3_step, +UX_STEP_CB(ux_display_public_flow_4_step, pb, (*g_validate_callback)(true), { @@ -85,7 +92,8 @@ UX_STEP_CB(ux_display_public_flow_3_step, UX_FLOW(ux_display_public_flow, &ux_display_public_flow_1_step, &ux_display_public_flow_2_step, - &ux_display_public_flow_3_step); + &ux_display_public_flow_3_step, + &ux_display_public_flow_4_step); UX_STEP_NOCB(ux_sign_flow_1_step, pnn, diff --git a/tests/snapshots/nanosp/test_get_public_key_confirm_accepted/00000.png b/tests/snapshots/nanosp/test_get_public_key_confirm_accepted/00000.png index a63f85f1db8b849a5dcbea69fdefdc20a1688f58..653262d29bdbdf303431b70d12a382ae1e3509c2 100644 GIT binary patch delta 401 zcmV;C0dD??2dV>*BYy#LNklglWM8Lyw=smbbpVs9 zM2E|JR3f71pZ;M8QAYsG9Np#-Z~qi`1XQ_>nEFk;T~J~h>VL#D9>f3u0D#-YcwlU! z9Em$hRnBc-U#e_QU+a^OFjy@}{v;AuoTJ%6*)ICr@#X3qg-Bi}w8PJBpQj<%skCFssr89c3Xrq6Qe?M|zhgN>(i zQJdw754n}u6tt|U&`xo#ZgcxJV8Iu)HKjFQJ;Ko%aG(A!P}^Ux>;i015yANkvXXu0mjfw^+JU delta 882 zcmV-&1C9Ku1BeHZBYy)=Nkl8GLwKmkH`Ak$ECx50o2G>`wx;H2&d}wp* zxdV8}Y4r87ZVPqu_R2jne9GPEcSY~N`G#0!j{^c0fF^uzV*ahQWI&kBz;4U4Cj=di z-4?=(9*B0ax3>?cLr@3!jBzKQIA!*%+G_7^d(Z)DibigtzP@f$5y=T3g>d+u%hf=a zk4V{bzz+u`U4Pe(<;(Z*S_nFcwLrU$FPY}Q`3}I_zbJ~LK+ga*hGM-?Em0LykUxz1 ztE$HEg_oTT<0CFsfm93ed{cAYg99REB#jonhP15$+4{AEZ#{&txZA7 z>jw^~7Wo$d0!Itlu07$gu<-fT+k%a+UuGN!2z6HloPXNYlGQnc=iJTysB&U1V<8xn z6gI-X$*Q5`vxt1rIEK+JdkqKcKv$}T8EYSTBNo8TTSmyl=2}Ud!WJg?N;VAz8{ajN zDG#TiZlWp1a_7Zc2-46eo+8B>u>e@?qg2h?yYZK3CM9LFiusIpEP7)|%%- zBU)M}Da<{$4yFUn%SLDX{q#U1%s_q`dT}BjE`I^Nk@+8!hGLV(OL;Yy&$C5gQ4~c{ z6h(2le;)vZKsV=OUW>0Liywa&^rSoYXmyDMzC4gzWYCLWW zTDi?#Eo6flN;(;+Is)bZ`D@NKKjnv69c%StT4T}@G2*TL^Mxe70|MviQR>;N|o&TmwNC+9bTwtK1#NShf z=Eq>#V~W`=B}tMbNs=TZVt=Y*aDDZu`+|bPLz`pI z8^A+Oqpg?qTBw`1Rc?{tQ|?B;vikmwFT^Z+9I#*kXu|g<=3i?K287WJ?6x?2LeS;d zZ6VBPfoKw3)NKW`Dgv0k(t_Hez zM2emRemEfMDt|kcFW$pzA?PO70_{4!M4JERHvn({BuSD4eFvy96zhd*iK>`_{GrcZ zRW*h$EOs`GkGNO`QZ2;u4I$FrKu9LpNc;+-_q+7zU` ze&K*>5x)QsI9kwl?Fo;Ch0nKc3pQTAj5rPu>aGenwSTK6vvXLUb2Iy+%89x3gDa=LA)xUS4)6r0pP zimSPNo-GQKBuSDaNs{9J`v4#Wx;Y!N4F9h)& zuy$~s?xn6>!prQ??W5>{(MQFIwfpgw_yb$QjN&_BZTa|lj;%(`l5Z~RTOZfV-&-Y) zkY!1H2u=wA0002sIA4*$Ip_N8bzQb)V^Cid4V-?a$vGES(~sN-u@9kk-;J*(7s!>E=yf&*H0xD#$N3B; zU)r>2ny$7_l`P!Xhw2wWn>2nF6ky`^#t^@^=HYYBK{fEqo3)EjS|UM*wOgYJqX>}` zk8!ZTB1a{tFd@giji(u(Hf&$Txd{F2DuB2@b9PY4?@(2morzzCdig3J>XkzbzP?Lb zkwX6i-W+4om46ngdECisBi4+A zqa-l~h8nyQROpoql1vS@LV5uJ000000000000000000000002C@eAbp WF1DMQNuu@%@j)UApiL!+<1Y1SDzSTP2Q= zWl4MpP6+@2007`PUy;E%=lbh)UAARoP+t@coPMUsITu&uS%yK@HnoR2z9WO1Xo5~w zrPWE@Jz|#Y*bJNA{t-Ws!6GHlzFV~}OI>T%PbC({wikaj3V*EqGz=rof*Ih)`3xmr z+O%kzuC`B=EZoK8$qG=3HoVB+@15WlzP;d9PGHSo-vwTn<%B0-0>TcZi12$2(y zaj?K5M2>t9TfVe+%c2LRhP*s|piC=|!`6?gkl|u}^zDrz@ zLjMEa9And!7JsRE+{tSs=p)p1RTo)@ZH_U5ayP27fpaS66Ypop2@MdnTObxa|dI10c00000000000000000000006e}3*`Ic VLU$jlCky}p002ovPDHLkV1k{L_(=c& delta 342 zcmV-c0jd711n~lpB!4(bL_t(|obA|K4#FT5gyExcC*A*&*ozM&q~W5pi84d}?@1#z zIER}=0000000000005AYQc5Y^`&83&bqDU~rfe5|W>$dXIP!}s?(()YaA8(}=+(eC z{fKz1?!Zm$g5#KeIL?5qirX~(@GZbLTnjMTgzZ=s;JoXO&VNNN{0h*Xd8}(t7eM?s zj82>`HTcp!@!rQ4R}sS=>UVt`ov2CwvltU@c<@59!JSB}ta=y`O^T(0HzzSnSa z$|?SL$9cg&3a`~2n9`jb)eQL1ru#IJsbf%pb6$A}x7l^uv_VTnpUD+qG_F72K(uYt zmYNZ{0_2g~4o~x$VcQONed^cIS98DgMFn!l(6Wxl+y*c&5BTeF@s0 o&=NF{Wdr~K000000002f-m{a~XDy^VWdHyG07*qoM6N<$g5Th#yZ`_I diff --git a/tests/snapshots/nanosp/test_get_public_key_confirm_accepted/00003.png b/tests/snapshots/nanosp/test_get_public_key_confirm_accepted/00003.png index 5fd127e517c190a1684db420b839a65dd8776a10..78530ed78893e8cde716b8c31d30c1cb56cec73a 100644 GIT binary patch delta 342 zcmV-c0jd7v0`UTnB!4(bL_t(|obA|K4#FT5gyExcC*A*&*ozM&q~W5pi84d}?@1#z zIER}=0000000000005AYQc5Y^`&83&bqDU~rfe5|W>$dXIP!}s?(()YaA8(}=+(eC z{fKz1?!Zm$g5#KeIL?5qirX~(@GZbLTnjMTgzZ=s;JoXO&VNNN{0h*Xd8}(t7eM?s zj82>`HTcp!@!rQ4R}sS=>UVt`ov2CwvltU@c<@59!JSB}ta=y`O^T(0HzzSnSa z$|?SL$9cg&3a`~2n9`jb)eQL1ru#IJsbf%pb6$A}x7l^uv_VTnpUD+qG_F72K(uYt zmYNZ{0_2g~4o~x$VcQONed^cIS98DgMFn!l(6Wxl+y*c&5BTeF@s0 o&=NF{Wdr~K000000002f-m{a~XDy^VWdHyG07*qoM6N<$f+!WH@&Et; delta 329 zcmey!^n_`GO1-wHi(^Q|oVPav`I;33TrXx`p1a|{>c;7H69f)5to41I{9)dDv9$~H zAFaq>V}Jt(9?R!*Hdl$M+gug?u{`3U_-~N~%jO4NI`?Es0_%*@84F%U?_d&%<$bg) z{~=d^^16lXe)rGFz2f|HsC*$v&UnF#M}4#ZIV`BR-dV8y&-}OF>XQ^}RWDs%%vN>9 zp{ez&Sky~D$#wog1W)@q3# z4)~MsTYG-~@5&ve5qGs;ia*ZcGCrQ4@JjGc-sXtg`_%Jme~GE|B($c6+?2dvmi>R$ z(yyudvwDB@ZEx!`_o*t?f8 WU1&>tINzR$AVE)8KbLh*2~7a{7n>FU diff --git a/tests/snapshots/nanosp/test_get_public_key_confirm_accepted/00004.png b/tests/snapshots/nanosp/test_get_public_key_confirm_accepted/00004.png index a58590b988714545e7960f7f400f360ffc5de41f..5fd127e517c190a1684db420b839a65dd8776a10 100644 GIT binary patch delta 329 zcmeyz^n_`GO1-wHi(^Q|oVPav`I;33TrXx`p1a|{>c;7H69f)5to41I{9)dDv9$~H zAFaq>V}Jt(9?R!*Hdl$M+gug?u{`3U_-~N~%jO4NI`?Es0_%*@84F%U?_d&%<$bg) z{~=d^^16lXe)rGFz2f|HsC*$v&UnF#M}4#ZIV`BR-dV8y&-}OF>XQ^}RWDs%%vN>9 zp{ez&Sky~D$#wog1W)@q3# z4)~MsTYG-~@5&ve5qGs;ia*ZcGCrQ4@JjGc-sXtg`_%Jme~GE|B($c6+?2dvmi>R$ z(yyudvwDB@ZEx!`_o*t?f8 WU1&>tINzR$AVE)8KbLh*2~7YB+nXZ* delta 355 zcmV-p0i6Ei0{#M!B!5LoL_t(|obB0Lj>8}fKv7h6C+vSo*-Jl=BFejIj2*b=t7QrS z431!&0{{R30000000000t2mD1&x+StxcuCugjtw2gZ3x=t=)mIIr82&3gasIFTM9k ztvJ}>Yq8eI6W5XNfa2$NVK)~Iw$m+~VCoJy*I=?9Z*2eG27f1*or0w2C%&Rd-3tH!000000001BFCQGdAO*0P-ogL?002ovPDHLkV1fq; Bt+oIF diff --git a/tests/snapshots/nanosp/test_get_public_key_confirm_accepted/00005.png b/tests/snapshots/nanosp/test_get_public_key_confirm_accepted/00005.png new file mode 100644 index 0000000000000000000000000000000000000000..a58590b988714545e7960f7f400f360ffc5de41f GIT binary patch literal 382 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h6`U|@9hba4!+nDh2#bl+hG9*4k? zQuR0Wo;SViCn%lTo!KM1sAjk5Y(@*V#~rbuHu`7A_H&AxgwHf8y4cdKvg$JbB4n%ez%sZ31aBYd&Oo@(7)_WJ(Znl2o8^PD` zFE`_Y-IS+Kdq0Q2-7r_C=}F(5ev`U`H~)QH|9$1FHE$YjoVax+e0xei%S`SAGlOm! zp7{T3NA-mVOYb&rdU8MdyIHo@@7cE*uj@I+Zu{2i)KMSV-E~o*BYy#LNklglWM8Lyw=smbbpVs9 zM2E|JR3f71pZ;M8QAYsG9Np#-Z~qi`1XQ_>nEFk;T~J~h>VL#D9>f3u0D#-YcwlU! z9Em$hRnBc-U#e_QU+a^OFjy@}{v;AuoTJ%6*)ICr@#X3qg-Bi}w8PJBpQj<%skCFssr89c3Xrq6Qe?M|zhgN>(i zQJdw754n}u6tt|U&`xo#ZgcxJV8Iu)HKjFQJ;Ko%aG(A!P}^Ux>;i015yANkvXXu0mjfw^+JU delta 882 zcmV-&1C9Ku1BeHZBYy)=Nkl8GLwKmkH`Ak$ECx50o2G>`wx;H2&d}wp* zxdV8}Y4r87ZVPqu_R2jne9GPEcSY~N`G#0!j{^c0fF^uzV*ahQWI&kBz;4U4Cj=di z-4?=(9*B0ax3>?cLr@3!jBzKQIA!*%+G_7^d(Z)DibigtzP@f$5y=T3g>d+u%hf=a zk4V{bzz+u`U4Pe(<;(Z*S_nFcwLrU$FPY}Q`3}I_zbJ~LK+ga*hGM-?Em0LykUxz1 ztE$HEg_oTT<0CFsfm93ed{cAYg99REB#jonhP15$+4{AEZ#{&txZA7 z>jw^~7Wo$d0!Itlu07$gu<-fT+k%a+UuGN!2z6HloPXNYlGQnc=iJTysB&U1V<8xn z6gI-X$*Q5`vxt1rIEK+JdkqKcKv$}T8EYSTBNo8TTSmyl=2}Ud!WJg?N;VAz8{ajN zDG#TiZlWp1a_7Zc2-46eo+8B>u>e@?qg2h?yYZK3CM9LFiusIpEP7)|%%- zBU)M}Da<{$4yFUn%SLDX{q#U1%s_q`dT}BjE`I^Nk@+8!hGLV(OL;Yy&$C5gQ4~c{ z6h(2le;)vZKsV=OUW>0Liywa&^rSoYXmyDMzC4gzWYCLWW zTDi?#Eo6flN;(;+Is)bZ`D@NKKjnv69c%StT4T}@G2*TL^Mxe70|MviQR>;N|o&TmwNC+9bTwtK1#NShf z=Eq>#V~W`=B}tMbNs=TZVt=Y*aDDZu`+|bPLz`pI z8^A+Oqpg?qTBw`1Rc?{tQ|?B;vikmwFT^Z+9I#*kXu|g<=3i?K287WJ?6x?2LeS;d zZ6VBPfoKw3)NKW`Dgv0k(t_Hez zM2emRemEfMDt|kcFW$pzA?PO70_{4!M4JERHvn({BuSD4eFvy96zhd*iK>`_{GrcZ zRW*h$EOs`GkGNO`QZ2;u4I$FrKu9LpNc;+-_q+7zU` ze&K*>5x)QsI9kwl?Fo;Ch0nKc3pQTAj5rPu>aGenwSTK6vvXLUb2Iy+%89x3gDa=LA)xUS4)6r0pP zimSPNo-GQKBuSDaNs{9J`v4#Wx;Y!N4F9h)& zuy$~s?xn6>!prQ??W5>{(MQFIwfpgw_yb$QjN&_BZTa|lj;%(`l5Z~RTOZfV-&-Y) zkY!1H2u=wA0002sIA4*$Ip_N8bzQb)V^Cid4V-?a$vGES(~sN-u@9kk-;J*(7s!>E=yf&*H0xD#$N3B; zU)r>2ny$7_l`P!Xhw2wWn>2nF6ky`^#t^@^=HYYBK{fEqo3)EjS|UM*wOgYJqX>}` zk8!ZTB1a{tFd@giji(u(Hf&$Txd{F2DuB2@b9PY4?@(2morzzCdig3J>XkzbzP?Lb zkwX6i-W+4om46ngdECisBi4+A zqa-l~h8nyQROpoql1vS@LV5uJ000000000000000000000002C@eAbp WF1DMQNuu@%@j)UApiL!+<1Y1SDzSTP2Q= zWl4MpP6+@2007`PUy;E%=lbh)UAARoP+t@coPMUsITu&uS%yK@HnoR2z9WO1Xo5~w zrPWE@Jz|#Y*bJNA{t-Ws!6GHlzFV~}OI>T%PbC({wikaj3V*EqGz=rof*Ih)`3xmr z+O%kzuC`B=EZoK8$qG=3HoVB+@15WlzP;d9PGHSo-vwTn<%B0-0>TcZi12$2(y zaj?K5M2>t9TfVe+%c2LRhP*s|piC=|!`6?gkl|u}^zDrz@ zLjMEa9And!7JsRE+{tSs=p)p1RTo)@ZH_U5ayP27fpaS66Ypop2@MdnTObxa|dI10c00000000000000000000006e}3*`Ic VLU$jlCky}p002ovPDHLkV1k{L_(=c& delta 342 zcmV-c0jd711n~lpB!4(bL_t(|obA|K4#FT5gyExcC*A*&*ozM&q~W5pi84d}?@1#z zIER}=0000000000005AYQc5Y^`&83&bqDU~rfe5|W>$dXIP!}s?(()YaA8(}=+(eC z{fKz1?!Zm$g5#KeIL?5qirX~(@GZbLTnjMTgzZ=s;JoXO&VNNN{0h*Xd8}(t7eM?s zj82>`HTcp!@!rQ4R}sS=>UVt`ov2CwvltU@c<@59!JSB}ta=y`O^T(0HzzSnSa z$|?SL$9cg&3a`~2n9`jb)eQL1ru#IJsbf%pb6$A}x7l^uv_VTnpUD+qG_F72K(uYt zmYNZ{0_2g~4o~x$VcQONed^cIS98DgMFn!l(6Wxl+y*c&5BTeF@s0 o&=NF{Wdr~K000000002f-m{a~XDy^VWdHyG07*qoM6N<$g5Th#yZ`_I diff --git a/tests/snapshots/nanosp/test_get_public_key_confirm_refused/00003.png b/tests/snapshots/nanosp/test_get_public_key_confirm_refused/00003.png index a58590b988714545e7960f7f400f360ffc5de41f..78530ed78893e8cde716b8c31d30c1cb56cec73a 100644 GIT binary patch delta 342 zcmV-c0jd7}0`UTnB!4(bL_t(|obA|K4#FT5gyExcC*A*&*ozM&q~W5pi84d}?@1#z zIER}=0000000000005AYQc5Y^`&83&bqDU~rfe5|W>$dXIP!}s?(()YaA8(}=+(eC z{fKz1?!Zm$g5#KeIL?5qirX~(@GZbLTnjMTgzZ=s;JoXO&VNNN{0h*Xd8}(t7eM?s zj82>`HTcp!@!rQ4R}sS=>UVt`ov2CwvltU@c<@59!JSB}ta=y`O^T(0HzzSnSa z$|?SL$9cg&3a`~2n9`jb)eQL1ru#IJsbf%pb6$A}x7l^uv_VTnpUD+qG_F72K(uYt zmYNZ{0_2g~4o~x$VcQONed^cIS98DgMFn!l(6Wxl+y*c&5BTeF@s0 o&=NF{Wdr~K000000002f-m{a~XDy^VWdHyG07*qoM6N<$f=bb+3;+NC delta 355 zcmV-p0i6Ev0{#M!B!5LoL_t(|obB0Lj>8}fKv7h6C+vSo*-Jl=BFejIj2*b=t7QrS z431!&0{{R30000000000t2mD1&x+StxcuCugjtw2gZ3x=t=)mIIr82&3gasIFTM9k ztvJ}>Yq8eI6W5XNfa2$NVK)~Iw$m+~VCoJy*I=?9Z*2eG27f1*or0w2C%&Rd-3tH!000000001BFCQGdAO*0P-ogL?002ovPDHLkV1gMC Bt-}BS diff --git a/tests/snapshots/nanox/test_get_public_key_confirm_accepted/00000.png b/tests/snapshots/nanox/test_get_public_key_confirm_accepted/00000.png index a63f85f1db8b849a5dcbea69fdefdc20a1688f58..653262d29bdbdf303431b70d12a382ae1e3509c2 100644 GIT binary patch delta 401 zcmV;C0dD??2dV>*BYy#LNklglWM8Lyw=smbbpVs9 zM2E|JR3f71pZ;M8QAYsG9Np#-Z~qi`1XQ_>nEFk;T~J~h>VL#D9>f3u0D#-YcwlU! z9Em$hRnBc-U#e_QU+a^OFjy@}{v;AuoTJ%6*)ICr@#X3qg-Bi}w8PJBpQj<%skCFssr89c3Xrq6Qe?M|zhgN>(i zQJdw754n}u6tt|U&`xo#ZgcxJV8Iu)HKjFQJ;Ko%aG(A!P}^Ux>;i015yANkvXXu0mjfw^+JU delta 882 zcmV-&1C9Ku1BeHZBYy)=Nkl8GLwKmkH`Ak$ECx50o2G>`wx;H2&d}wp* zxdV8}Y4r87ZVPqu_R2jne9GPEcSY~N`G#0!j{^c0fF^uzV*ahQWI&kBz;4U4Cj=di z-4?=(9*B0ax3>?cLr@3!jBzKQIA!*%+G_7^d(Z)DibigtzP@f$5y=T3g>d+u%hf=a zk4V{bzz+u`U4Pe(<;(Z*S_nFcwLrU$FPY}Q`3}I_zbJ~LK+ga*hGM-?Em0LykUxz1 ztE$HEg_oTT<0CFsfm93ed{cAYg99REB#jonhP15$+4{AEZ#{&txZA7 z>jw^~7Wo$d0!Itlu07$gu<-fT+k%a+UuGN!2z6HloPXNYlGQnc=iJTysB&U1V<8xn z6gI-X$*Q5`vxt1rIEK+JdkqKcKv$}T8EYSTBNo8TTSmyl=2}Ud!WJg?N;VAz8{ajN zDG#TiZlWp1a_7Zc2-46eo+8B>u>e@?qg2h?yYZK3CM9LFiusIpEP7)|%%- zBU)M}Da<{$4yFUn%SLDX{q#U1%s_q`dT}BjE`I^Nk@+8!hGLV(OL;Yy&$C5gQ4~c{ z6h(2le;)vZKsV=OUW>0Liywa&^rSoYXmyDMzC4gzWYCLWW zTDi?#Eo6flN;(;+Is)bZ`D@NKKjnv69c%StT4T}@G2*TL^Mxe70|MviQR>;N|o&TmwNC+9bTwtK1#NShf z=Eq>#V~W`=B}tMbNs=TZVt=Y*aDDZu`+|bPLz`pI z8^A+Oqpg?qTBw`1Rc?{tQ|?B;vikmwFT^Z+9I#*kXu|g<=3i?K287WJ?6x?2LeS;d zZ6VBPfoKw3)NKW`Dgv0k(t_Hez zM2emRemEfMDt|kcFW$pzA?PO70_{4!M4JERHvn({BuSD4eFvy96zhd*iK>`_{GrcZ zRW*h$EOs`GkGNO`QZ2;u4I$FrKu9LpNc;+-_q+7zU` ze&K*>5x)QsI9kwl?Fo;Ch0nKc3pQTAj5rPu>aGenwSTK6vvXLUb2Iy+%89x3gDa=LA)xUS4)6r0pP zimSPNo-GQKBuSDaNs{9J`v4#Wx;Y!N4F9h)& zuy$~s?xn6>!prQ??W5>{(MQFIwfpgw_yb$QjN&_BZTa|lj;%(`l5Z~RTOZfV-&-Y) zkY!1H2u=wA0002sIA4*$Ip_N8bzQb)V^Cid4V-?a$vGES(~sN-u@9kk-;J*(7s!>E=yf&*H0xD#$N3B; zU)r>2ny$7_l`P!Xhw2wWn>2nF6ky`^#t^@^=HYYBK{fEqo3)EjS|UM*wOgYJqX>}` zk8!ZTB1a{tFd@giji(u(Hf&$Txd{F2DuB2@b9PY4?@(2morzzCdig3J>XkzbzP?Lb zkwX6i-W+4om46ngdECisBi4+A zqa-l~h8nyQROpoql1vS@LV5uJ000000000000000000000002C@eAbp WF1DMQNuu@%@j)UApiL!+<1Y1SDzSTP2Q= zWl4MpP6+@2007`PUy;E%=lbh)UAARoP+t@coPMUsITu&uS%yK@HnoR2z9WO1Xo5~w zrPWE@Jz|#Y*bJNA{t-Ws!6GHlzFV~}OI>T%PbC({wikaj3V*EqGz=rof*Ih)`3xmr z+O%kzuC`B=EZoK8$qG=3HoVB+@15WlzP;d9PGHSo-vwTn<%B0-0>TcZi12$2(y zaj?K5M2>t9TfVe+%c2LRhP*s|piC=|!`6?gkl|u}^zDrz@ zLjMEa9And!7JsRE+{tSs=p)p1RTo)@ZH_U5ayP27fpaS66Ypop2@MdnTObxa|dI10c00000000000000000000006e}3*`Ic VLU$jlCky}p002ovPDHLkV1k{L_(=c& delta 342 zcmV-c0jd711n~lpB!4(bL_t(|obA|K4#FT5gyExcC*A*&*ozM&q~W5pi84d}?@1#z zIER}=0000000000005AYQc5Y^`&83&bqDU~rfe5|W>$dXIP!}s?(()YaA8(}=+(eC z{fKz1?!Zm$g5#KeIL?5qirX~(@GZbLTnjMTgzZ=s;JoXO&VNNN{0h*Xd8}(t7eM?s zj82>`HTcp!@!rQ4R}sS=>UVt`ov2CwvltU@c<@59!JSB}ta=y`O^T(0HzzSnSa z$|?SL$9cg&3a`~2n9`jb)eQL1ru#IJsbf%pb6$A}x7l^uv_VTnpUD+qG_F72K(uYt zmYNZ{0_2g~4o~x$VcQONed^cIS98DgMFn!l(6Wxl+y*c&5BTeF@s0 o&=NF{Wdr~K000000002f-m{a~XDy^VWdHyG07*qoM6N<$g5Th#yZ`_I diff --git a/tests/snapshots/nanox/test_get_public_key_confirm_accepted/00003.png b/tests/snapshots/nanox/test_get_public_key_confirm_accepted/00003.png index 5fd127e517c190a1684db420b839a65dd8776a10..78530ed78893e8cde716b8c31d30c1cb56cec73a 100644 GIT binary patch delta 342 zcmV-c0jd7v0`UTnB!4(bL_t(|obA|K4#FT5gyExcC*A*&*ozM&q~W5pi84d}?@1#z zIER}=0000000000005AYQc5Y^`&83&bqDU~rfe5|W>$dXIP!}s?(()YaA8(}=+(eC z{fKz1?!Zm$g5#KeIL?5qirX~(@GZbLTnjMTgzZ=s;JoXO&VNNN{0h*Xd8}(t7eM?s zj82>`HTcp!@!rQ4R}sS=>UVt`ov2CwvltU@c<@59!JSB}ta=y`O^T(0HzzSnSa z$|?SL$9cg&3a`~2n9`jb)eQL1ru#IJsbf%pb6$A}x7l^uv_VTnpUD+qG_F72K(uYt zmYNZ{0_2g~4o~x$VcQONed^cIS98DgMFn!l(6Wxl+y*c&5BTeF@s0 o&=NF{Wdr~K000000002f-m{a~XDy^VWdHyG07*qoM6N<$f+!WH@&Et; delta 329 zcmey!^n_`GO1-wHi(^Q|oVPav`I;33TrXx`p1a|{>c;7H69f)5to41I{9)dDv9$~H zAFaq>V}Jt(9?R!*Hdl$M+gug?u{`3U_-~N~%jO4NI`?Es0_%*@84F%U?_d&%<$bg) z{~=d^^16lXe)rGFz2f|HsC*$v&UnF#M}4#ZIV`BR-dV8y&-}OF>XQ^}RWDs%%vN>9 zp{ez&Sky~D$#wog1W)@q3# z4)~MsTYG-~@5&ve5qGs;ia*ZcGCrQ4@JjGc-sXtg`_%Jme~GE|B($c6+?2dvmi>R$ z(yyudvwDB@ZEx!`_o*t?f8 WU1&>tINzR$AVE)8KbLh*2~7a{7n>FU diff --git a/tests/snapshots/nanox/test_get_public_key_confirm_accepted/00004.png b/tests/snapshots/nanox/test_get_public_key_confirm_accepted/00004.png index a58590b988714545e7960f7f400f360ffc5de41f..5fd127e517c190a1684db420b839a65dd8776a10 100644 GIT binary patch delta 329 zcmeyz^n_`GO1-wHi(^Q|oVPav`I;33TrXx`p1a|{>c;7H69f)5to41I{9)dDv9$~H zAFaq>V}Jt(9?R!*Hdl$M+gug?u{`3U_-~N~%jO4NI`?Es0_%*@84F%U?_d&%<$bg) z{~=d^^16lXe)rGFz2f|HsC*$v&UnF#M}4#ZIV`BR-dV8y&-}OF>XQ^}RWDs%%vN>9 zp{ez&Sky~D$#wog1W)@q3# z4)~MsTYG-~@5&ve5qGs;ia*ZcGCrQ4@JjGc-sXtg`_%Jme~GE|B($c6+?2dvmi>R$ z(yyudvwDB@ZEx!`_o*t?f8 WU1&>tINzR$AVE)8KbLh*2~7YB+nXZ* delta 355 zcmV-p0i6Ei0{#M!B!5LoL_t(|obB0Lj>8}fKv7h6C+vSo*-Jl=BFejIj2*b=t7QrS z431!&0{{R30000000000t2mD1&x+StxcuCugjtw2gZ3x=t=)mIIr82&3gasIFTM9k ztvJ}>Yq8eI6W5XNfa2$NVK)~Iw$m+~VCoJy*I=?9Z*2eG27f1*or0w2C%&Rd-3tH!000000001BFCQGdAO*0P-ogL?002ovPDHLkV1fq; Bt+oIF diff --git a/tests/snapshots/nanox/test_get_public_key_confirm_accepted/00005.png b/tests/snapshots/nanox/test_get_public_key_confirm_accepted/00005.png new file mode 100644 index 0000000000000000000000000000000000000000..a58590b988714545e7960f7f400f360ffc5de41f GIT binary patch literal 382 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h6`U|@9hba4!+nDh2#bl+hG9*4k? zQuR0Wo;SViCn%lTo!KM1sAjk5Y(@*V#~rbuHu`7A_H&AxgwHf8y4cdKvg$JbB4n%ez%sZ31aBYd&Oo@(7)_WJ(Znl2o8^PD` zFE`_Y-IS+Kdq0Q2-7r_C=}F(5ev`U`H~)QH|9$1FHE$YjoVax+e0xei%S`SAGlOm! zp7{T3NA-mVOYb&rdU8MdyIHo@@7cE*uj@I+Zu{2i)KMSV-E~o*BYy#LNklglWM8Lyw=smbbpVs9 zM2E|JR3f71pZ;M8QAYsG9Np#-Z~qi`1XQ_>nEFk;T~J~h>VL#D9>f3u0D#-YcwlU! z9Em$hRnBc-U#e_QU+a^OFjy@}{v;AuoTJ%6*)ICr@#X3qg-Bi}w8PJBpQj<%skCFssr89c3Xrq6Qe?M|zhgN>(i zQJdw754n}u6tt|U&`xo#ZgcxJV8Iu)HKjFQJ;Ko%aG(A!P}^Ux>;i015yANkvXXu0mjfw^+JU delta 882 zcmV-&1C9Ku1BeHZBYy)=Nkl8GLwKmkH`Ak$ECx50o2G>`wx;H2&d}wp* zxdV8}Y4r87ZVPqu_R2jne9GPEcSY~N`G#0!j{^c0fF^uzV*ahQWI&kBz;4U4Cj=di z-4?=(9*B0ax3>?cLr@3!jBzKQIA!*%+G_7^d(Z)DibigtzP@f$5y=T3g>d+u%hf=a zk4V{bzz+u`U4Pe(<;(Z*S_nFcwLrU$FPY}Q`3}I_zbJ~LK+ga*hGM-?Em0LykUxz1 ztE$HEg_oTT<0CFsfm93ed{cAYg99REB#jonhP15$+4{AEZ#{&txZA7 z>jw^~7Wo$d0!Itlu07$gu<-fT+k%a+UuGN!2z6HloPXNYlGQnc=iJTysB&U1V<8xn z6gI-X$*Q5`vxt1rIEK+JdkqKcKv$}T8EYSTBNo8TTSmyl=2}Ud!WJg?N;VAz8{ajN zDG#TiZlWp1a_7Zc2-46eo+8B>u>e@?qg2h?yYZK3CM9LFiusIpEP7)|%%- zBU)M}Da<{$4yFUn%SLDX{q#U1%s_q`dT}BjE`I^Nk@+8!hGLV(OL;Yy&$C5gQ4~c{ z6h(2le;)vZKsV=OUW>0Liywa&^rSoYXmyDMzC4gzWYCLWW zTDi?#Eo6flN;(;+Is)bZ`D@NKKjnv69c%StT4T}@G2*TL^Mxe70|MviQR>;N|o&TmwNC+9bTwtK1#NShf z=Eq>#V~W`=B}tMbNs=TZVt=Y*aDDZu`+|bPLz`pI z8^A+Oqpg?qTBw`1Rc?{tQ|?B;vikmwFT^Z+9I#*kXu|g<=3i?K287WJ?6x?2LeS;d zZ6VBPfoKw3)NKW`Dgv0k(t_Hez zM2emRemEfMDt|kcFW$pzA?PO70_{4!M4JERHvn({BuSD4eFvy96zhd*iK>`_{GrcZ zRW*h$EOs`GkGNO`QZ2;u4I$FrKu9LpNc;+-_q+7zU` ze&K*>5x)QsI9kwl?Fo;Ch0nKc3pQTAj5rPu>aGenwSTK6vvXLUb2Iy+%89x3gDa=LA)xUS4)6r0pP zimSPNo-GQKBuSDaNs{9J`v4#Wx;Y!N4F9h)& zuy$~s?xn6>!prQ??W5>{(MQFIwfpgw_yb$QjN&_BZTa|lj;%(`l5Z~RTOZfV-&-Y) zkY!1H2u=wA0002sIA4*$Ip_N8bzQb)V^Cid4V-?a$vGES(~sN-u@9kk-;J*(7s!>E=yf&*H0xD#$N3B; zU)r>2ny$7_l`P!Xhw2wWn>2nF6ky`^#t^@^=HYYBK{fEqo3)EjS|UM*wOgYJqX>}` zk8!ZTB1a{tFd@giji(u(Hf&$Txd{F2DuB2@b9PY4?@(2morzzCdig3J>XkzbzP?Lb zkwX6i-W+4om46ngdECisBi4+A zqa-l~h8nyQROpoql1vS@LV5uJ000000000000000000000002C@eAbp WF1DMQNuu@%@j)UApiL!+<1Y1SDzSTP2Q= zWl4MpP6+@2007`PUy;E%=lbh)UAARoP+t@coPMUsITu&uS%yK@HnoR2z9WO1Xo5~w zrPWE@Jz|#Y*bJNA{t-Ws!6GHlzFV~}OI>T%PbC({wikaj3V*EqGz=rof*Ih)`3xmr z+O%kzuC`B=EZoK8$qG=3HoVB+@15WlzP;d9PGHSo-vwTn<%B0-0>TcZi12$2(y zaj?K5M2>t9TfVe+%c2LRhP*s|piC=|!`6?gkl|u}^zDrz@ zLjMEa9And!7JsRE+{tSs=p)p1RTo)@ZH_U5ayP27fpaS66Ypop2@MdnTObxa|dI10c00000000000000000000006e}3*`Ic VLU$jlCky}p002ovPDHLkV1k{L_(=c& delta 342 zcmV-c0jd711n~lpB!4(bL_t(|obA|K4#FT5gyExcC*A*&*ozM&q~W5pi84d}?@1#z zIER}=0000000000005AYQc5Y^`&83&bqDU~rfe5|W>$dXIP!}s?(()YaA8(}=+(eC z{fKz1?!Zm$g5#KeIL?5qirX~(@GZbLTnjMTgzZ=s;JoXO&VNNN{0h*Xd8}(t7eM?s zj82>`HTcp!@!rQ4R}sS=>UVt`ov2CwvltU@c<@59!JSB}ta=y`O^T(0HzzSnSa z$|?SL$9cg&3a`~2n9`jb)eQL1ru#IJsbf%pb6$A}x7l^uv_VTnpUD+qG_F72K(uYt zmYNZ{0_2g~4o~x$VcQONed^cIS98DgMFn!l(6Wxl+y*c&5BTeF@s0 o&=NF{Wdr~K000000002f-m{a~XDy^VWdHyG07*qoM6N<$g5Th#yZ`_I diff --git a/tests/snapshots/nanox/test_get_public_key_confirm_refused/00003.png b/tests/snapshots/nanox/test_get_public_key_confirm_refused/00003.png index a58590b988714545e7960f7f400f360ffc5de41f..78530ed78893e8cde716b8c31d30c1cb56cec73a 100644 GIT binary patch delta 342 zcmV-c0jd7}0`UTnB!4(bL_t(|obA|K4#FT5gyExcC*A*&*ozM&q~W5pi84d}?@1#z zIER}=0000000000005AYQc5Y^`&83&bqDU~rfe5|W>$dXIP!}s?(()YaA8(}=+(eC z{fKz1?!Zm$g5#KeIL?5qirX~(@GZbLTnjMTgzZ=s;JoXO&VNNN{0h*Xd8}(t7eM?s zj82>`HTcp!@!rQ4R}sS=>UVt`ov2CwvltU@c<@59!JSB}ta=y`O^T(0HzzSnSa z$|?SL$9cg&3a`~2n9`jb)eQL1ru#IJsbf%pb6$A}x7l^uv_VTnpUD+qG_F72K(uYt zmYNZ{0_2g~4o~x$VcQONed^cIS98DgMFn!l(6Wxl+y*c&5BTeF@s0 o&=NF{Wdr~K000000002f-m{a~XDy^VWdHyG07*qoM6N<$f=bb+3;+NC delta 355 zcmV-p0i6Ev0{#M!B!5LoL_t(|obB0Lj>8}fKv7h6C+vSo*-Jl=BFejIj2*b=t7QrS z431!&0{{R30000000000t2mD1&x+StxcuCugjtw2gZ3x=t=)mIIr82&3gasIFTM9k ztvJ}>Yq8eI6W5XNfa2$NVK)~Iw$m+~VCoJy*I=?9Z*2eG27f1*or0w2C%&Rd-3tH!000000001BFCQGdAO*0P-ogL?002ovPDHLkV1gMC Bt-}BS diff --git a/tests/snapshots/nanox/test_get_public_key_confirm_refused/00004.png b/tests/snapshots/nanox/test_get_public_key_confirm_refused/00004.png new file mode 100644 index 0000000000000000000000000000000000000000..a58590b988714545e7960f7f400f360ffc5de41f GIT binary patch literal 382 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h6`U|@9hba4!+nDh2#bl+hG9*4k? zQuR0Wo;SViCn%lTo!KM1sAjk5Y(@*V#~rbuHu`7A_H&AxgwHf8y4cdKvg$JbB4n%ez%sZ31aBYd&Oo@(7)_WJ(Znl2o8^PD` zFE`_Y-IS+Kdq0Q2-7r_C=}F(5ev`U`H~)QH|9$1FHE$YjoVax+e0xei%S`SAGlOm! zp7{T3NA-mVOYb&rdU8MdyIHo@@7cE*uj@I+Zu{2i)KMSV-E~o Date: Mon, 24 Feb 2025 12:44:10 +0100 Subject: [PATCH 55/67] fix(ui): put 'approve' screen before 'reject' screen on nano devices and make changes accordingly [LDG-681] - Create 'approve' and 'reject' screen and use them on relevant flows - Switch the position of 'reject step' and 'approve step' for all flows - Edit the sign_tx tests to look for 'Approve' instead of 'Accept' - Generate golden snapshots --- src/ui/display_bagl.c | 61 +++++------------- .../00003.png | Bin 369 -> 364 bytes .../00004.png | Bin 356 -> 382 bytes .../00003.png | Bin 369 -> 364 bytes .../00004.png | Bin 382 -> 367 bytes .../00005.png | Bin 0 -> 382 bytes .../00003.png | Bin 369 -> 364 bytes .../00004.png | Bin 356 -> 382 bytes .../00003.png | Bin 369 -> 364 bytes .../00004.png | Bin 382 -> 367 bytes .../00005.png | Bin 0 -> 382 bytes .../nanosp/test_sign_message/00003.png | Bin 503 -> 460 bytes .../nanosp/test_sign_message/00004.png | Bin 451 -> 382 bytes .../nanosp/test_sign_tx_burn_usdt/00003.png | Bin 472 -> 364 bytes .../nanosp/test_sign_tx_confirm/00003.png | Bin 472 -> 364 bytes .../nanosp/test_sign_tx_transfer/00005.png | Bin 472 -> 364 bytes .../00003.png | Bin 369 -> 364 bytes .../00004.png | Bin 356 -> 382 bytes .../00003.png | Bin 369 -> 364 bytes .../00004.png | Bin 382 -> 367 bytes .../00005.png | Bin 0 -> 382 bytes .../00003.png | Bin 369 -> 364 bytes .../00004.png | Bin 356 -> 382 bytes .../00003.png | Bin 369 -> 364 bytes .../00004.png | Bin 382 -> 367 bytes .../00005.png | Bin 0 -> 382 bytes .../nanox/test_sign_message/00003.png | Bin 503 -> 460 bytes .../nanox/test_sign_message/00004.png | Bin 451 -> 382 bytes .../nanox/test_sign_tx_burn_usdt/00003.png | Bin 472 -> 364 bytes .../nanox/test_sign_tx_confirm/00003.png | Bin 472 -> 364 bytes .../nanox/test_sign_tx_transfer/00005.png | Bin 472 -> 364 bytes tests/test_sign_cmd.py | 2 +- 32 files changed, 17 insertions(+), 46 deletions(-) create mode 100644 tests/snapshots/nanosp/test_get_address_wallet_v3_confirm_refused/00005.png create mode 100644 tests/snapshots/nanosp/test_get_public_key_confirm_refused/00005.png create mode 100644 tests/snapshots/nanox/test_get_address_wallet_v3_confirm_refused/00005.png create mode 100644 tests/snapshots/nanox/test_get_public_key_confirm_refused/00005.png diff --git a/src/ui/display_bagl.c b/src/ui/display_bagl.c index 61b935c..f089265 100644 --- a/src/ui/display_bagl.c +++ b/src/ui/display_bagl.c @@ -40,14 +40,14 @@ UX_STEP_NOCB(ux_display_address_flow_2_step, .title = "Address", .text = data_context.addr_context.address_str, }); -UX_STEP_CB(ux_display_address_flow_3_step, +UX_STEP_CB(ux_display_reject_step, pb, (*g_validate_callback)(false), { &C_icon_crossmark, "Reject", }); -UX_STEP_CB(ux_display_address_flow_4_step, +UX_STEP_CB(ux_display_approve_step, pb, (*g_validate_callback)(true), { @@ -58,8 +58,8 @@ UX_STEP_CB(ux_display_address_flow_4_step, UX_FLOW(ux_display_address_flow, &ux_display_address_flow_1_step, &ux_display_address_flow_2_step, - &ux_display_address_flow_3_step, - &ux_display_address_flow_4_step); + &ux_display_approve_step, + &ux_display_reject_step); UX_STEP_NOCB(ux_display_public_flow_1_step, pnn, @@ -74,26 +74,12 @@ UX_STEP_NOCB(ux_display_public_flow_2_step, .title = "Public key", .text = data_context.pk_context.public_key_str, }); -UX_STEP_CB(ux_display_public_flow_3_step, - pb, - (*g_validate_callback)(false), - { - &C_icon_crossmark, - "Reject", - }); -UX_STEP_CB(ux_display_public_flow_4_step, - pb, - (*g_validate_callback)(true), - { - &C_icon_validate_14, - "Approve", - }); UX_FLOW(ux_display_public_flow, &ux_display_public_flow_1_step, &ux_display_public_flow_2_step, - &ux_display_public_flow_3_step, - &ux_display_public_flow_4_step); + &ux_display_approve_step, + &ux_display_reject_step); UX_STEP_NOCB(ux_sign_flow_1_step, pnn, @@ -108,7 +94,7 @@ UX_STEP_NOCB(ux_sign_flow_2_step, .title = "Message", .text = data_context.sign_context.to_sign_str, }); -UX_STEP_CB(ux_sign_flow_3_step, +UX_STEP_CB(ux_sign_flow_4_step, pbb, (*g_validate_callback)(false), { @@ -116,7 +102,7 @@ UX_STEP_CB(ux_sign_flow_3_step, "Cancel", "signature", }); -UX_STEP_CB(ux_sign_flow_4_step, +UX_STEP_CB(ux_sign_flow_3_step, pbb, (*g_validate_callback)(true), { @@ -160,50 +146,35 @@ UX_STEP_NOCB(ux_sign_transaction_transaction_id, .title = "Transaction id", .text = data_context.sign_tr_context.transaction_id_str, }); -UX_STEP_CB(ux_sign_transaction_accept, - pbb, - (*g_validate_callback)(true), - { - &C_icon_validate_14, - "Accept", - "and send", - }); -UX_STEP_CB(ux_sign_transaction_reject, - pb, - (*g_validate_callback)(false), - { - &C_icon_crossmark, - "Reject", - }); UX_FLOW(ux_sign_transaction_burn_flow, &ux_sign_transaction_intro, &ux_sign_transaction_burn, &ux_sign_transaction_amount, - &ux_sign_transaction_accept, - &ux_sign_transaction_reject); + &ux_display_approve_step, + &ux_display_reject_step); UX_FLOW(ux_sign_transaction_deploy_flow, &ux_sign_transaction_intro, &ux_sign_transaction_deploy, &ux_sign_transaction_address, - &ux_sign_transaction_accept, - &ux_sign_transaction_reject); + &ux_display_approve_step, + &ux_display_reject_step); UX_FLOW(ux_sign_transaction_confirm_flow, &ux_sign_transaction_intro, &ux_sign_transaction_confirm, &ux_sign_transaction_transaction_id, - &ux_sign_transaction_accept, - &ux_sign_transaction_reject); + &ux_display_approve_step, + &ux_display_reject_step); UX_FLOW(ux_sign_transaction_transfer_flow, &ux_sign_transaction_intro, &ux_sign_transaction_transfer, &ux_sign_transaction_amount, &ux_sign_transaction_address, - &ux_sign_transaction_accept, - &ux_sign_transaction_reject); + &ux_display_approve_step, + &ux_display_reject_step); // Display functions void ui_display_address() { diff --git a/tests/snapshots/nanosp/test_get_address_wallet_v3_confirm_accepted/00003.png b/tests/snapshots/nanosp/test_get_address_wallet_v3_confirm_accepted/00003.png index 78530ed78893e8cde716b8c31d30c1cb56cec73a..53ae65195fbea5b281a1bc1a80351dbf1cd79ff8 100644 GIT binary patch delta 337 zcmey!^oD7IO1-hCi(^Q|oVPav`I;33TrXx`p1a|{>c;7H69f)1tnK}1_-)>Lv9$~H zAFaq>V}Jt(9?R!*Hdl$U+gug42wwA|`?tt~W%GkBoqIANfptddj0G>FcQA>>@;+LY z|Bx#{dELTxzx!w8UUB|8RK5@-XT0FWqrTby92V4D?=0B<=bPcZg8%A^GEXe2pXqpI zNxfm#0vGY1M^mM%nfq(KJ+E!cUpU>CY%99H$dXIP!}s?(()YaA8(}=+(eC z{fKz1?!Zm$g5#KeIL?5qirX~(@GZbLTnjMTgzZ=s;JoXO&VNNN{0h*Xd8}(t7eM?s zj82>`HTcp!@!rQ4R}sS=>UVt`ov2CwvltU@c<@59!JSB}ta=y`O^T(0HzzSnSa z$|?SL$9cg&3a`~2n9`jb)eQL1ru#IJsbf%pb6$A}x7l^uv_VTnpUD+qG_F72K(uYt zmYNZ{0_2g~4o~x$VcQONed^cIS98DgMFn!l(6Wxl+y*c&5BTeF@s0 o&=NF{Wdr~K000000002f-m{a~XDy^VWdHyG07*qoM6N<$f-=RX`Tzg` diff --git a/tests/snapshots/nanosp/test_get_address_wallet_v3_confirm_accepted/00004.png b/tests/snapshots/nanosp/test_get_address_wallet_v3_confirm_accepted/00004.png index 5fd127e517c190a1684db420b839a65dd8776a10..a58590b988714545e7960f7f400f360ffc5de41f 100644 GIT binary patch delta 355 zcmV-p0i6Ei0{#M!B!5LoL_t(|obB0Lj>8}fKv7h6C+vSo*-Jl=BFejIj2*b=t7QrS z431!&0{{R30000000000t2mD1&x+StxcuCugjtw2gZ3x=t=)mIIr82&3gasIFTM9k ztvJ}>Yq8eI6W5XNfa2$NVK)~Iw$m+~VCoJy*I=?9Z*2eG27f1*or0w2C%&Rd-3tH!000000001BFCQGdAO*0P-ogL?002ovPDHLkV1fq; Bt+oIF delta 329 zcmeyz^n_`GO1-wHi(^Q|oVPav`I;33TrXx`p1a|{>c;7H69f)5to41I{9)dDv9$~H zAFaq>V}Jt(9?R!*Hdl$M+gug?u{`3U_-~N~%jO4NI`?Es0_%*@84F%U?_d&%<$bg) z{~=d^^16lXe)rGFz2f|HsC*$v&UnF#M}4#ZIV`BR-dV8y&-}OF>XQ^}RWDs%%vN>9 zp{ez&Sky~D$#wog1W)@q3# z4)~MsTYG-~@5&ve5qGs;ia*ZcGCrQ4@JjGc-sXtg`_%Jme~GE|B($c6+?2dvmi>R$ z(yyudvwDB@ZEx!`_o*t?f8 WU1&>tINzR$AVE)8KbLh*2~7YB+nXZ* diff --git a/tests/snapshots/nanosp/test_get_address_wallet_v3_confirm_refused/00003.png b/tests/snapshots/nanosp/test_get_address_wallet_v3_confirm_refused/00003.png index 78530ed78893e8cde716b8c31d30c1cb56cec73a..53ae65195fbea5b281a1bc1a80351dbf1cd79ff8 100644 GIT binary patch delta 337 zcmey!^oD7IO1-hCi(^Q|oVPav`I;33TrXx`p1a|{>c;7H69f)1tnK}1_-)>Lv9$~H zAFaq>V}Jt(9?R!*Hdl$U+gug42wwA|`?tt~W%GkBoqIANfptddj0G>FcQA>>@;+LY z|Bx#{dELTxzx!w8UUB|8RK5@-XT0FWqrTby92V4D?=0B<=bPcZg8%A^GEXe2pXqpI zNxfm#0vGY1M^mM%nfq(KJ+E!cUpU>CY%99H$dXIP!}s?(()YaA8(}=+(eC z{fKz1?!Zm$g5#KeIL?5qirX~(@GZbLTnjMTgzZ=s;JoXO&VNNN{0h*Xd8}(t7eM?s zj82>`HTcp!@!rQ4R}sS=>UVt`ov2CwvltU@c<@59!JSB}ta=y`O^T(0HzzSnSa z$|?SL$9cg&3a`~2n9`jb)eQL1ru#IJsbf%pb6$A}x7l^uv_VTnpUD+qG_F72K(uYt zmYNZ{0_2g~4o~x$VcQONed^cIS98DgMFn!l(6Wxl+y*c&5BTeF@s0 o&=NF{Wdr~K000000002f-m{a~XDy^VWdHyG07*qoM6N<$f-=RX`Tzg` diff --git a/tests/snapshots/nanosp/test_get_address_wallet_v3_confirm_refused/00004.png b/tests/snapshots/nanosp/test_get_address_wallet_v3_confirm_refused/00004.png index a58590b988714545e7960f7f400f360ffc5de41f..c4c84cf4c1fba26083e9bc251f7411d894424174 100644 GIT binary patch delta 340 zcmeyz^qy&gO1+tx7xZO zaQ6d?FngJFheD0*nO_f^H{34ZP1wSDdm~T6{?~o==UnyvFlC&#xh5&YEbyOqvGDSI zHhIRBWk(Aa-S+IBH-DqF^>(MP*Oi;Uo=C7YI#4gTOM2J*8sqd+m+t-hvU0Iqz@NL5 zT@R*DTYpt{#-+J3?UDtTmQ|ZhT$wCzU|(D+$M&tSw`FqchW>KWYq+?>?!U3iZMWQ& zk`uWX^xP?%ah}KbcG-s4!TV+Z=HA`^YZ24V8}fKv7h6C+vSo*-Jl=BFejIj2*b=t7QrS z431!&0{{R30000000000t2mD1&x+StxcuCugjtw2gZ3x=t=)mIIr82&3gasIFTM9k ztvJ}>Yq8eI6W5XNfa2$NVK)~Iw$m+~VCoJy*I=?9Z*2eG27f1*or0w2C%&Rd-3tH!000000001BFCQGdAO*0P-ogL?002ovPDHLkV1gD( Bt-$~Q diff --git a/tests/snapshots/nanosp/test_get_address_wallet_v3_confirm_refused/00005.png b/tests/snapshots/nanosp/test_get_address_wallet_v3_confirm_refused/00005.png new file mode 100644 index 0000000000000000000000000000000000000000..a58590b988714545e7960f7f400f360ffc5de41f GIT binary patch literal 382 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h6`U|@9hba4!+nDh2#bl+hG9*4k? zQuR0Wo;SViCn%lTo!KM1sAjk5Y(@*V#~rbuHu`7A_H&AxgwHf8y4cdKvg$JbB4n%ez%sZ31aBYd&Oo@(7)_WJ(Znl2o8^PD` zFE`_Y-IS+Kdq0Q2-7r_C=}F(5ev`U`H~)QH|9$1FHE$YjoVax+e0xei%S`SAGlOm! zp7{T3NA-mVOYb&rdU8MdyIHo@@7cE*uj@I+Zu{2i)KMSV-E~oc;7H69f)1tnK}1_-)>Lv9$~H zAFaq>V}Jt(9?R!*Hdl$U+gug42wwA|`?tt~W%GkBoqIANfptddj0G>FcQA>>@;+LY z|Bx#{dELTxzx!w8UUB|8RK5@-XT0FWqrTby92V4D?=0B<=bPcZg8%A^GEXe2pXqpI zNxfm#0vGY1M^mM%nfq(KJ+E!cUpU>CY%99H$dXIP!}s?(()YaA8(}=+(eC z{fKz1?!Zm$g5#KeIL?5qirX~(@GZbLTnjMTgzZ=s;JoXO&VNNN{0h*Xd8}(t7eM?s zj82>`HTcp!@!rQ4R}sS=>UVt`ov2CwvltU@c<@59!JSB}ta=y`O^T(0HzzSnSa z$|?SL$9cg&3a`~2n9`jb)eQL1ru#IJsbf%pb6$A}x7l^uv_VTnpUD+qG_F72K(uYt zmYNZ{0_2g~4o~x$VcQONed^cIS98DgMFn!l(6Wxl+y*c&5BTeF@s0 o&=NF{Wdr~K000000002f-m{a~XDy^VWdHyG07*qoM6N<$f-=RX`Tzg` diff --git a/tests/snapshots/nanosp/test_get_public_key_confirm_accepted/00004.png b/tests/snapshots/nanosp/test_get_public_key_confirm_accepted/00004.png index 5fd127e517c190a1684db420b839a65dd8776a10..a58590b988714545e7960f7f400f360ffc5de41f 100644 GIT binary patch delta 355 zcmV-p0i6Ei0{#M!B!5LoL_t(|obB0Lj>8}fKv7h6C+vSo*-Jl=BFejIj2*b=t7QrS z431!&0{{R30000000000t2mD1&x+StxcuCugjtw2gZ3x=t=)mIIr82&3gasIFTM9k ztvJ}>Yq8eI6W5XNfa2$NVK)~Iw$m+~VCoJy*I=?9Z*2eG27f1*or0w2C%&Rd-3tH!000000001BFCQGdAO*0P-ogL?002ovPDHLkV1fq; Bt+oIF delta 329 zcmeyz^n_`GO1-wHi(^Q|oVPav`I;33TrXx`p1a|{>c;7H69f)5to41I{9)dDv9$~H zAFaq>V}Jt(9?R!*Hdl$M+gug?u{`3U_-~N~%jO4NI`?Es0_%*@84F%U?_d&%<$bg) z{~=d^^16lXe)rGFz2f|HsC*$v&UnF#M}4#ZIV`BR-dV8y&-}OF>XQ^}RWDs%%vN>9 zp{ez&Sky~D$#wog1W)@q3# z4)~MsTYG-~@5&ve5qGs;ia*ZcGCrQ4@JjGc-sXtg`_%Jme~GE|B($c6+?2dvmi>R$ z(yyudvwDB@ZEx!`_o*t?f8 WU1&>tINzR$AVE)8KbLh*2~7YB+nXZ* diff --git a/tests/snapshots/nanosp/test_get_public_key_confirm_refused/00003.png b/tests/snapshots/nanosp/test_get_public_key_confirm_refused/00003.png index 78530ed78893e8cde716b8c31d30c1cb56cec73a..53ae65195fbea5b281a1bc1a80351dbf1cd79ff8 100644 GIT binary patch delta 337 zcmey!^oD7IO1-hCi(^Q|oVPav`I;33TrXx`p1a|{>c;7H69f)1tnK}1_-)>Lv9$~H zAFaq>V}Jt(9?R!*Hdl$U+gug42wwA|`?tt~W%GkBoqIANfptddj0G>FcQA>>@;+LY z|Bx#{dELTxzx!w8UUB|8RK5@-XT0FWqrTby92V4D?=0B<=bPcZg8%A^GEXe2pXqpI zNxfm#0vGY1M^mM%nfq(KJ+E!cUpU>CY%99H$dXIP!}s?(()YaA8(}=+(eC z{fKz1?!Zm$g5#KeIL?5qirX~(@GZbLTnjMTgzZ=s;JoXO&VNNN{0h*Xd8}(t7eM?s zj82>`HTcp!@!rQ4R}sS=>UVt`ov2CwvltU@c<@59!JSB}ta=y`O^T(0HzzSnSa z$|?SL$9cg&3a`~2n9`jb)eQL1ru#IJsbf%pb6$A}x7l^uv_VTnpUD+qG_F72K(uYt zmYNZ{0_2g~4o~x$VcQONed^cIS98DgMFn!l(6Wxl+y*c&5BTeF@s0 o&=NF{Wdr~K000000002f-m{a~XDy^VWdHyG07*qoM6N<$f-=RX`Tzg` diff --git a/tests/snapshots/nanosp/test_get_public_key_confirm_refused/00004.png b/tests/snapshots/nanosp/test_get_public_key_confirm_refused/00004.png index a58590b988714545e7960f7f400f360ffc5de41f..c4c84cf4c1fba26083e9bc251f7411d894424174 100644 GIT binary patch delta 340 zcmeyz^qy&gO1+tx7xZO zaQ6d?FngJFheD0*nO_f^H{34ZP1wSDdm~T6{?~o==UnyvFlC&#xh5&YEbyOqvGDSI zHhIRBWk(Aa-S+IBH-DqF^>(MP*Oi;Uo=C7YI#4gTOM2J*8sqd+m+t-hvU0Iqz@NL5 zT@R*DTYpt{#-+J3?UDtTmQ|ZhT$wCzU|(D+$M&tSw`FqchW>KWYq+?>?!U3iZMWQ& zk`uWX^xP?%ah}KbcG-s4!TV+Z=HA`^YZ24V8}fKv7h6C+vSo*-Jl=BFejIj2*b=t7QrS z431!&0{{R30000000000t2mD1&x+StxcuCugjtw2gZ3x=t=)mIIr82&3gasIFTM9k ztvJ}>Yq8eI6W5XNfa2$NVK)~Iw$m+~VCoJy*I=?9Z*2eG27f1*or0w2C%&Rd-3tH!000000001BFCQGdAO*0P-ogL?002ovPDHLkV1gD( Bt-$~Q diff --git a/tests/snapshots/nanosp/test_get_public_key_confirm_refused/00005.png b/tests/snapshots/nanosp/test_get_public_key_confirm_refused/00005.png new file mode 100644 index 0000000000000000000000000000000000000000..a58590b988714545e7960f7f400f360ffc5de41f GIT binary patch literal 382 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h6`U|@9hba4!+nDh2#bl+hG9*4k? zQuR0Wo;SViCn%lTo!KM1sAjk5Y(@*V#~rbuHu`7A_H&AxgwHf8y4cdKvg$JbB4n%ez%sZ31aBYd&Oo@(7)_WJ(Znl2o8^PD` zFE`_Y-IS+Kdq0Q2-7r_C=}F(5ev`U`H~)QH|9$1FHE$YjoVax+e0xei%S`SAGlOm! zp7{T3NA-mVOYb&rdU8MdyIHo@@7cE*uj@I+Zu{2i)KMSV-E~oS~~yeUmGIr`VG&oqaR=S{=X{aTXHIzRBGIRhMqv>}!)-@_z#W0ALpjyFc|Jy*aaA z8m7Pe-wi(JRjH?YsJ)_xA5z)S*XV1s!=_NZmds5$57N9B)JB}pJT^~p+bd0&ch`pZ zY{uoRLF_-P>juZKZm4Jt+DR$7cxyhoPe@!wM=0hPYF~hC+EKrk=*<6b@2p#)iY{0s zpNQRwEsj_OV^5sZ{5bfwl$bP9yoD|i=``oizB^FTphf7??}hY4m+k9Hg4%! z5tF3M=bx898=u>BmUNRc-T`%JPX_hm$o!dse{y&Vd@El5j%m6n=)ckKh8{u36aWAK c0Dwe(0MttzAB|URvj6}907*qoM6N<$g2gG(s{jB1 delta 477 zcmV<30V4j)1NQ@vB!9k1L_t(|obB34lEWYjKv8v!#`&@lUi0Y3!mVF%)6EA9u=BuEo(YY40^~c?OWrl-K&C8f zIou5)w4>toWc6}$sql4qX82zWF1Y7yb?5jcR+J||dTFsX7_9cRcENHIRgjnR*lamS zv1==nUFP{YqJLHO^<>;s#U0lcd(I!ymTIm=`Sn(`+L_zoU5#*c2><{9{;wIP2XGB{ zxilDvtq+dW*Phks&yi7^I%F&FWzZB=m@B%rKJdXul4>A7U0v?|s4n^qiPQw42S5t}DmSds_6Wre{L zFw)}nUcxOeR69K7{@xPi`mM}UVyTL$yFTRsF5ixRlerdTq_YA8000000AAt`6k}jk T+6rkP00000NkvXXu0mjfV-M## diff --git a/tests/snapshots/nanosp/test_sign_message/00004.png b/tests/snapshots/nanosp/test_sign_message/00004.png index ec3c898971b106e94bacecb294a58f3b4cc7e05f..a58590b988714545e7960f7f400f360ffc5de41f 100644 GIT binary patch delta 355 zcmV-p0i6EB1O5V#B!5LoL_t(|obB0Lj>8}fKv7h6C+vSo*-Jl=BFejIj2*b=t7QrS z431!&0{{R30000000000t2mD1&x+StxcuCugjtw2gZ3x=t=)mIIr82&3gasIFTM9k ztvJ}>Yq8eI6W5XNfa2$NVK)~Iw$m+~VCoJy*I=?9Z*2eG27f1*or0w2C%&Rd-3tH!000000001BFCQGdAO*0P-ogL?002ovPDHLkV1nA2 Bt(E`) delta 425 zcmV;a0apJ00>cB4B!7xYL_t(|obB3CcETVKg<Q)CFn)Dz~W|M$|P zwGGZ-gqx%U0000000007lu}A5t4HyH+v)*)lUC`g>omZspL1S2l8=ZrVCxJcTKy!~ zfU4_(ZuOH~1FXbWbm{7+lzvtZ;0S*f60Lrc`vg>7xpk|rO@D654*&pwO)TtA_OcT$ zr3Bp6v~wcoTptD;=U>H~`B(DjZ zZpw2C0ssKJt$$eswSna@x%B(5W6z}R+vxUe@lLR8A7Fu{PcE%7!%F$v;@UKH_*cm# zrjtXQEL;@f@4EHBZF?}kJaFI;CkxjA<7awXxH@^a?veJD9VVs`Hg4gfh)GfA=byL# z)?c^jEJ>3hegf*$o=ob=GxKW(_R8TQ@O|+U({QJt{~|^^4c&vp6aWAK0DwRq(`Elz T1%8?A00000NkvXXu0mjfS^3cx diff --git a/tests/snapshots/nanosp/test_sign_tx_burn_usdt/00003.png b/tests/snapshots/nanosp/test_sign_tx_burn_usdt/00003.png index 570ce28d53e82ac396ba25c370110058f3a638f9..53ae65195fbea5b281a1bc1a80351dbf1cd79ff8 100644 GIT binary patch delta 337 zcmcb?{Dx_QO1-hCi(^Q|oVPav`I;33TrXx`p1a|{>c;7H69f)1tnK}1_-)>Lv9$~H zAFaq>V}Jt(9?R!*Hdl$U+gug42wwA|`?tt~W%GkBoqIANfptddj0G>FcQA>>@;+LY z|Bx#{dELTxzx!w8UUB|8RK5@-XT0FWqrTby92V4D?=0B<=bPcZg8%A^GEXe2pXqpI zNxfm#0vGY1M^mM%nfq(KJ+E!cUpU>CY%99H_th+EJ@M?a;sSP$R|y$S`5ehPO7RI6~ujecz5wtxHp008J>V>i`7cs)e_ z@w@x()p@w=B24`klR6(CLpxqtlZO|2IWjpO-F~*EHtLqUMt)Wc_@bMv^h#{CUFW0M z(vJ1P=5N1GhWcHM(-Xu*&bc@D4_o$^7Y|pL)I@*DzttR=&yLH#^{|TW)8Sp0qphw% zepiuSUG#WHT7NcqNRJ+amk%-{%X;;nhp_B9`AEr=dDw9t3i(CsNk{+yAcA?j8pHh( z4`E}k<5T9?EPU2iU;UyqSmD_`zrB>5?fE;*?tuI!eMUi-A4ckzs{)2>k)^r|JEVn*{XgJQwtW9;MFX{UJOON4frt$2Z+chHMhh=Kjd^-@j4hH{^Pz o?0mofTW&!B00000001%k0v=pBEoDz5?EnA(07*qoM6N<$f@P)FSpWb4 diff --git a/tests/snapshots/nanosp/test_sign_tx_confirm/00003.png b/tests/snapshots/nanosp/test_sign_tx_confirm/00003.png index 570ce28d53e82ac396ba25c370110058f3a638f9..53ae65195fbea5b281a1bc1a80351dbf1cd79ff8 100644 GIT binary patch delta 337 zcmcb?{Dx_QO1-hCi(^Q|oVPav`I;33TrXx`p1a|{>c;7H69f)1tnK}1_-)>Lv9$~H zAFaq>V}Jt(9?R!*Hdl$U+gug42wwA|`?tt~W%GkBoqIANfptddj0G>FcQA>>@;+LY z|Bx#{dELTxzx!w8UUB|8RK5@-XT0FWqrTby92V4D?=0B<=bPcZg8%A^GEXe2pXqpI zNxfm#0vGY1M^mM%nfq(KJ+E!cUpU>CY%99H_th+EJ@M?a;sSP$R|y$S`5ehPO7RI6~ujecz5wtxHp008J>V>i`7cs)e_ z@w@x()p@w=B24`klR6(CLpxqtlZO|2IWjpO-F~*EHtLqUMt)Wc_@bMv^h#{CUFW0M z(vJ1P=5N1GhWcHM(-Xu*&bc@D4_o$^7Y|pL)I@*DzttR=&yLH#^{|TW)8Sp0qphw% zepiuSUG#WHT7NcqNRJ+amk%-{%X;;nhp_B9`AEr=dDw9t3i(CsNk{+yAcA?j8pHh( z4`E}k<5T9?EPU2iU;UyqSmD_`zrB>5?fE;*?tuI!eMUi-A4ckzs{)2>k)^r|JEVn*{XgJQwtW9;MFX{UJOON4frt$2Z+chHMhh=Kjd^-@j4hH{^Pz o?0mofTW&!B00000001%k0v=pBEoDz5?EnA(07*qoM6N<$f@P)FSpWb4 diff --git a/tests/snapshots/nanosp/test_sign_tx_transfer/00005.png b/tests/snapshots/nanosp/test_sign_tx_transfer/00005.png index 570ce28d53e82ac396ba25c370110058f3a638f9..53ae65195fbea5b281a1bc1a80351dbf1cd79ff8 100644 GIT binary patch delta 337 zcmcb?{Dx_QO1-hCi(^Q|oVPav`I;33TrXx`p1a|{>c;7H69f)1tnK}1_-)>Lv9$~H zAFaq>V}Jt(9?R!*Hdl$U+gug42wwA|`?tt~W%GkBoqIANfptddj0G>FcQA>>@;+LY z|Bx#{dELTxzx!w8UUB|8RK5@-XT0FWqrTby92V4D?=0B<=bPcZg8%A^GEXe2pXqpI zNxfm#0vGY1M^mM%nfq(KJ+E!cUpU>CY%99H_th+EJ@M?a;sSP$R|y$S`5ehPO7RI6~ujecz5wtxHp008J>V>i`7cs)e_ z@w@x()p@w=B24`klR6(CLpxqtlZO|2IWjpO-F~*EHtLqUMt)Wc_@bMv^h#{CUFW0M z(vJ1P=5N1GhWcHM(-Xu*&bc@D4_o$^7Y|pL)I@*DzttR=&yLH#^{|TW)8Sp0qphw% zepiuSUG#WHT7NcqNRJ+amk%-{%X;;nhp_B9`AEr=dDw9t3i(CsNk{+yAcA?j8pHh( z4`E}k<5T9?EPU2iU;UyqSmD_`zrB>5?fE;*?tuI!eMUi-A4ckzs{)2>k)^r|JEVn*{XgJQwtW9;MFX{UJOON4frt$2Z+chHMhh=Kjd^-@j4hH{^Pz o?0mofTW&!B00000001%k0v=pBEoDz5?EnA(07*qoM6N<$f@P)FSpWb4 diff --git a/tests/snapshots/nanox/test_get_address_wallet_v3_confirm_accepted/00003.png b/tests/snapshots/nanox/test_get_address_wallet_v3_confirm_accepted/00003.png index 78530ed78893e8cde716b8c31d30c1cb56cec73a..53ae65195fbea5b281a1bc1a80351dbf1cd79ff8 100644 GIT binary patch delta 337 zcmey!^oD7IO1-hCi(^Q|oVPav`I;33TrXx`p1a|{>c;7H69f)1tnK}1_-)>Lv9$~H zAFaq>V}Jt(9?R!*Hdl$U+gug42wwA|`?tt~W%GkBoqIANfptddj0G>FcQA>>@;+LY z|Bx#{dELTxzx!w8UUB|8RK5@-XT0FWqrTby92V4D?=0B<=bPcZg8%A^GEXe2pXqpI zNxfm#0vGY1M^mM%nfq(KJ+E!cUpU>CY%99H$dXIP!}s?(()YaA8(}=+(eC z{fKz1?!Zm$g5#KeIL?5qirX~(@GZbLTnjMTgzZ=s;JoXO&VNNN{0h*Xd8}(t7eM?s zj82>`HTcp!@!rQ4R}sS=>UVt`ov2CwvltU@c<@59!JSB}ta=y`O^T(0HzzSnSa z$|?SL$9cg&3a`~2n9`jb)eQL1ru#IJsbf%pb6$A}x7l^uv_VTnpUD+qG_F72K(uYt zmYNZ{0_2g~4o~x$VcQONed^cIS98DgMFn!l(6Wxl+y*c&5BTeF@s0 o&=NF{Wdr~K000000002f-m{a~XDy^VWdHyG07*qoM6N<$f-=RX`Tzg` diff --git a/tests/snapshots/nanox/test_get_address_wallet_v3_confirm_accepted/00004.png b/tests/snapshots/nanox/test_get_address_wallet_v3_confirm_accepted/00004.png index 5fd127e517c190a1684db420b839a65dd8776a10..a58590b988714545e7960f7f400f360ffc5de41f 100644 GIT binary patch delta 355 zcmV-p0i6Ei0{#M!B!5LoL_t(|obB0Lj>8}fKv7h6C+vSo*-Jl=BFejIj2*b=t7QrS z431!&0{{R30000000000t2mD1&x+StxcuCugjtw2gZ3x=t=)mIIr82&3gasIFTM9k ztvJ}>Yq8eI6W5XNfa2$NVK)~Iw$m+~VCoJy*I=?9Z*2eG27f1*or0w2C%&Rd-3tH!000000001BFCQGdAO*0P-ogL?002ovPDHLkV1fq; Bt+oIF delta 329 zcmeyz^n_`GO1-wHi(^Q|oVPav`I;33TrXx`p1a|{>c;7H69f)5to41I{9)dDv9$~H zAFaq>V}Jt(9?R!*Hdl$M+gug?u{`3U_-~N~%jO4NI`?Es0_%*@84F%U?_d&%<$bg) z{~=d^^16lXe)rGFz2f|HsC*$v&UnF#M}4#ZIV`BR-dV8y&-}OF>XQ^}RWDs%%vN>9 zp{ez&Sky~D$#wog1W)@q3# z4)~MsTYG-~@5&ve5qGs;ia*ZcGCrQ4@JjGc-sXtg`_%Jme~GE|B($c6+?2dvmi>R$ z(yyudvwDB@ZEx!`_o*t?f8 WU1&>tINzR$AVE)8KbLh*2~7YB+nXZ* diff --git a/tests/snapshots/nanox/test_get_address_wallet_v3_confirm_refused/00003.png b/tests/snapshots/nanox/test_get_address_wallet_v3_confirm_refused/00003.png index 78530ed78893e8cde716b8c31d30c1cb56cec73a..53ae65195fbea5b281a1bc1a80351dbf1cd79ff8 100644 GIT binary patch delta 337 zcmey!^oD7IO1-hCi(^Q|oVPav`I;33TrXx`p1a|{>c;7H69f)1tnK}1_-)>Lv9$~H zAFaq>V}Jt(9?R!*Hdl$U+gug42wwA|`?tt~W%GkBoqIANfptddj0G>FcQA>>@;+LY z|Bx#{dELTxzx!w8UUB|8RK5@-XT0FWqrTby92V4D?=0B<=bPcZg8%A^GEXe2pXqpI zNxfm#0vGY1M^mM%nfq(KJ+E!cUpU>CY%99H$dXIP!}s?(()YaA8(}=+(eC z{fKz1?!Zm$g5#KeIL?5qirX~(@GZbLTnjMTgzZ=s;JoXO&VNNN{0h*Xd8}(t7eM?s zj82>`HTcp!@!rQ4R}sS=>UVt`ov2CwvltU@c<@59!JSB}ta=y`O^T(0HzzSnSa z$|?SL$9cg&3a`~2n9`jb)eQL1ru#IJsbf%pb6$A}x7l^uv_VTnpUD+qG_F72K(uYt zmYNZ{0_2g~4o~x$VcQONed^cIS98DgMFn!l(6Wxl+y*c&5BTeF@s0 o&=NF{Wdr~K000000002f-m{a~XDy^VWdHyG07*qoM6N<$f-=RX`Tzg` diff --git a/tests/snapshots/nanox/test_get_address_wallet_v3_confirm_refused/00004.png b/tests/snapshots/nanox/test_get_address_wallet_v3_confirm_refused/00004.png index a58590b988714545e7960f7f400f360ffc5de41f..c4c84cf4c1fba26083e9bc251f7411d894424174 100644 GIT binary patch delta 340 zcmeyz^qy&gO1+tx7xZO zaQ6d?FngJFheD0*nO_f^H{34ZP1wSDdm~T6{?~o==UnyvFlC&#xh5&YEbyOqvGDSI zHhIRBWk(Aa-S+IBH-DqF^>(MP*Oi;Uo=C7YI#4gTOM2J*8sqd+m+t-hvU0Iqz@NL5 zT@R*DTYpt{#-+J3?UDtTmQ|ZhT$wCzU|(D+$M&tSw`FqchW>KWYq+?>?!U3iZMWQ& zk`uWX^xP?%ah}KbcG-s4!TV+Z=HA`^YZ24V8}fKv7h6C+vSo*-Jl=BFejIj2*b=t7QrS z431!&0{{R30000000000t2mD1&x+StxcuCugjtw2gZ3x=t=)mIIr82&3gasIFTM9k ztvJ}>Yq8eI6W5XNfa2$NVK)~Iw$m+~VCoJy*I=?9Z*2eG27f1*or0w2C%&Rd-3tH!000000001BFCQGdAO*0P-ogL?002ovPDHLkV1gD( Bt-$~Q diff --git a/tests/snapshots/nanox/test_get_address_wallet_v3_confirm_refused/00005.png b/tests/snapshots/nanox/test_get_address_wallet_v3_confirm_refused/00005.png new file mode 100644 index 0000000000000000000000000000000000000000..a58590b988714545e7960f7f400f360ffc5de41f GIT binary patch literal 382 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h6`U|@9hba4!+nDh2#bl+hG9*4k? zQuR0Wo;SViCn%lTo!KM1sAjk5Y(@*V#~rbuHu`7A_H&AxgwHf8y4cdKvg$JbB4n%ez%sZ31aBYd&Oo@(7)_WJ(Znl2o8^PD` zFE`_Y-IS+Kdq0Q2-7r_C=}F(5ev`U`H~)QH|9$1FHE$YjoVax+e0xei%S`SAGlOm! zp7{T3NA-mVOYb&rdU8MdyIHo@@7cE*uj@I+Zu{2i)KMSV-E~oc;7H69f)1tnK}1_-)>Lv9$~H zAFaq>V}Jt(9?R!*Hdl$U+gug42wwA|`?tt~W%GkBoqIANfptddj0G>FcQA>>@;+LY z|Bx#{dELTxzx!w8UUB|8RK5@-XT0FWqrTby92V4D?=0B<=bPcZg8%A^GEXe2pXqpI zNxfm#0vGY1M^mM%nfq(KJ+E!cUpU>CY%99H$dXIP!}s?(()YaA8(}=+(eC z{fKz1?!Zm$g5#KeIL?5qirX~(@GZbLTnjMTgzZ=s;JoXO&VNNN{0h*Xd8}(t7eM?s zj82>`HTcp!@!rQ4R}sS=>UVt`ov2CwvltU@c<@59!JSB}ta=y`O^T(0HzzSnSa z$|?SL$9cg&3a`~2n9`jb)eQL1ru#IJsbf%pb6$A}x7l^uv_VTnpUD+qG_F72K(uYt zmYNZ{0_2g~4o~x$VcQONed^cIS98DgMFn!l(6Wxl+y*c&5BTeF@s0 o&=NF{Wdr~K000000002f-m{a~XDy^VWdHyG07*qoM6N<$f-=RX`Tzg` diff --git a/tests/snapshots/nanox/test_get_public_key_confirm_accepted/00004.png b/tests/snapshots/nanox/test_get_public_key_confirm_accepted/00004.png index 5fd127e517c190a1684db420b839a65dd8776a10..a58590b988714545e7960f7f400f360ffc5de41f 100644 GIT binary patch delta 355 zcmV-p0i6Ei0{#M!B!5LoL_t(|obB0Lj>8}fKv7h6C+vSo*-Jl=BFejIj2*b=t7QrS z431!&0{{R30000000000t2mD1&x+StxcuCugjtw2gZ3x=t=)mIIr82&3gasIFTM9k ztvJ}>Yq8eI6W5XNfa2$NVK)~Iw$m+~VCoJy*I=?9Z*2eG27f1*or0w2C%&Rd-3tH!000000001BFCQGdAO*0P-ogL?002ovPDHLkV1fq; Bt+oIF delta 329 zcmeyz^n_`GO1-wHi(^Q|oVPav`I;33TrXx`p1a|{>c;7H69f)5to41I{9)dDv9$~H zAFaq>V}Jt(9?R!*Hdl$M+gug?u{`3U_-~N~%jO4NI`?Es0_%*@84F%U?_d&%<$bg) z{~=d^^16lXe)rGFz2f|HsC*$v&UnF#M}4#ZIV`BR-dV8y&-}OF>XQ^}RWDs%%vN>9 zp{ez&Sky~D$#wog1W)@q3# z4)~MsTYG-~@5&ve5qGs;ia*ZcGCrQ4@JjGc-sXtg`_%Jme~GE|B($c6+?2dvmi>R$ z(yyudvwDB@ZEx!`_o*t?f8 WU1&>tINzR$AVE)8KbLh*2~7YB+nXZ* diff --git a/tests/snapshots/nanox/test_get_public_key_confirm_refused/00003.png b/tests/snapshots/nanox/test_get_public_key_confirm_refused/00003.png index 78530ed78893e8cde716b8c31d30c1cb56cec73a..53ae65195fbea5b281a1bc1a80351dbf1cd79ff8 100644 GIT binary patch delta 337 zcmey!^oD7IO1-hCi(^Q|oVPav`I;33TrXx`p1a|{>c;7H69f)1tnK}1_-)>Lv9$~H zAFaq>V}Jt(9?R!*Hdl$U+gug42wwA|`?tt~W%GkBoqIANfptddj0G>FcQA>>@;+LY z|Bx#{dELTxzx!w8UUB|8RK5@-XT0FWqrTby92V4D?=0B<=bPcZg8%A^GEXe2pXqpI zNxfm#0vGY1M^mM%nfq(KJ+E!cUpU>CY%99H$dXIP!}s?(()YaA8(}=+(eC z{fKz1?!Zm$g5#KeIL?5qirX~(@GZbLTnjMTgzZ=s;JoXO&VNNN{0h*Xd8}(t7eM?s zj82>`HTcp!@!rQ4R}sS=>UVt`ov2CwvltU@c<@59!JSB}ta=y`O^T(0HzzSnSa z$|?SL$9cg&3a`~2n9`jb)eQL1ru#IJsbf%pb6$A}x7l^uv_VTnpUD+qG_F72K(uYt zmYNZ{0_2g~4o~x$VcQONed^cIS98DgMFn!l(6Wxl+y*c&5BTeF@s0 o&=NF{Wdr~K000000002f-m{a~XDy^VWdHyG07*qoM6N<$f-=RX`Tzg` diff --git a/tests/snapshots/nanox/test_get_public_key_confirm_refused/00004.png b/tests/snapshots/nanox/test_get_public_key_confirm_refused/00004.png index a58590b988714545e7960f7f400f360ffc5de41f..c4c84cf4c1fba26083e9bc251f7411d894424174 100644 GIT binary patch delta 340 zcmeyz^qy&gO1+tx7xZO zaQ6d?FngJFheD0*nO_f^H{34ZP1wSDdm~T6{?~o==UnyvFlC&#xh5&YEbyOqvGDSI zHhIRBWk(Aa-S+IBH-DqF^>(MP*Oi;Uo=C7YI#4gTOM2J*8sqd+m+t-hvU0Iqz@NL5 zT@R*DTYpt{#-+J3?UDtTmQ|ZhT$wCzU|(D+$M&tSw`FqchW>KWYq+?>?!U3iZMWQ& zk`uWX^xP?%ah}KbcG-s4!TV+Z=HA`^YZ24V8}fKv7h6C+vSo*-Jl=BFejIj2*b=t7QrS z431!&0{{R30000000000t2mD1&x+StxcuCugjtw2gZ3x=t=)mIIr82&3gasIFTM9k ztvJ}>Yq8eI6W5XNfa2$NVK)~Iw$m+~VCoJy*I=?9Z*2eG27f1*or0w2C%&Rd-3tH!000000001BFCQGdAO*0P-ogL?002ovPDHLkV1gD( Bt-$~Q diff --git a/tests/snapshots/nanox/test_get_public_key_confirm_refused/00005.png b/tests/snapshots/nanox/test_get_public_key_confirm_refused/00005.png new file mode 100644 index 0000000000000000000000000000000000000000..a58590b988714545e7960f7f400f360ffc5de41f GIT binary patch literal 382 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h6`U|@9hba4!+nDh2#bl+hG9*4k? zQuR0Wo;SViCn%lTo!KM1sAjk5Y(@*V#~rbuHu`7A_H&AxgwHf8y4cdKvg$JbB4n%ez%sZ31aBYd&Oo@(7)_WJ(Znl2o8^PD` zFE`_Y-IS+Kdq0Q2-7r_C=}F(5ev`U`H~)QH|9$1FHE$YjoVax+e0xei%S`SAGlOm! zp7{T3NA-mVOYb&rdU8MdyIHo@@7cE*uj@I+Zu{2i)KMSV-E~oS~~yeUmGIr`VG&oqaR=S{=X{aTXHIzRBGIRhMqv>}!)-@_z#W0ALpjyFc|Jy*aaA z8m7Pe-wi(JRjH?YsJ)_xA5z)S*XV1s!=_NZmds5$57N9B)JB}pJT^~p+bd0&ch`pZ zY{uoRLF_-P>juZKZm4Jt+DR$7cxyhoPe@!wM=0hPYF~hC+EKrk=*<6b@2p#)iY{0s zpNQRwEsj_OV^5sZ{5bfwl$bP9yoD|i=``oizB^FTphf7??}hY4m+k9Hg4%! z5tF3M=bx898=u>BmUNRc-T`%JPX_hm$o!dse{y&Vd@El5j%m6n=)ckKh8{u36aWAK c0Dwe(0MttzAB|URvj6}907*qoM6N<$g2gG(s{jB1 delta 477 zcmV<30V4j)1NQ@vB!9k1L_t(|obB34lEWYjKv8v!#`&@lUi0Y3!mVF%)6EA9u=BuEo(YY40^~c?OWrl-K&C8f zIou5)w4>toWc6}$sql4qX82zWF1Y7yb?5jcR+J||dTFsX7_9cRcENHIRgjnR*lamS zv1==nUFP{YqJLHO^<>;s#U0lcd(I!ymTIm=`Sn(`+L_zoU5#*c2><{9{;wIP2XGB{ zxilDvtq+dW*Phks&yi7^I%F&FWzZB=m@B%rKJdXul4>A7U0v?|s4n^qiPQw42S5t}DmSds_6Wre{L zFw)}nUcxOeR69K7{@xPi`mM}UVyTL$yFTRsF5ixRlerdTq_YA8000000AAt`6k}jk T+6rkP00000NkvXXu0mjfV-M## diff --git a/tests/snapshots/nanox/test_sign_message/00004.png b/tests/snapshots/nanox/test_sign_message/00004.png index ec3c898971b106e94bacecb294a58f3b4cc7e05f..a58590b988714545e7960f7f400f360ffc5de41f 100644 GIT binary patch delta 355 zcmV-p0i6EB1O5V#B!5LoL_t(|obB0Lj>8}fKv7h6C+vSo*-Jl=BFejIj2*b=t7QrS z431!&0{{R30000000000t2mD1&x+StxcuCugjtw2gZ3x=t=)mIIr82&3gasIFTM9k ztvJ}>Yq8eI6W5XNfa2$NVK)~Iw$m+~VCoJy*I=?9Z*2eG27f1*or0w2C%&Rd-3tH!000000001BFCQGdAO*0P-ogL?002ovPDHLkV1nA2 Bt(E`) delta 425 zcmV;a0apJ00>cB4B!7xYL_t(|obB3CcETVKg<Q)CFn)Dz~W|M$|P zwGGZ-gqx%U0000000007lu}A5t4HyH+v)*)lUC`g>omZspL1S2l8=ZrVCxJcTKy!~ zfU4_(ZuOH~1FXbWbm{7+lzvtZ;0S*f60Lrc`vg>7xpk|rO@D654*&pwO)TtA_OcT$ zr3Bp6v~wcoTptD;=U>H~`B(DjZ zZpw2C0ssKJt$$eswSna@x%B(5W6z}R+vxUe@lLR8A7Fu{PcE%7!%F$v;@UKH_*cm# zrjtXQEL;@f@4EHBZF?}kJaFI;CkxjA<7awXxH@^a?veJD9VVs`Hg4gfh)GfA=byL# z)?c^jEJ>3hegf*$o=ob=GxKW(_R8TQ@O|+U({QJt{~|^^4c&vp6aWAK0DwRq(`Elz T1%8?A00000NkvXXu0mjfS^3cx diff --git a/tests/snapshots/nanox/test_sign_tx_burn_usdt/00003.png b/tests/snapshots/nanox/test_sign_tx_burn_usdt/00003.png index 570ce28d53e82ac396ba25c370110058f3a638f9..53ae65195fbea5b281a1bc1a80351dbf1cd79ff8 100644 GIT binary patch delta 337 zcmcb?{Dx_QO1-hCi(^Q|oVPav`I;33TrXx`p1a|{>c;7H69f)1tnK}1_-)>Lv9$~H zAFaq>V}Jt(9?R!*Hdl$U+gug42wwA|`?tt~W%GkBoqIANfptddj0G>FcQA>>@;+LY z|Bx#{dELTxzx!w8UUB|8RK5@-XT0FWqrTby92V4D?=0B<=bPcZg8%A^GEXe2pXqpI zNxfm#0vGY1M^mM%nfq(KJ+E!cUpU>CY%99H_th+EJ@M?a;sSP$R|y$S`5ehPO7RI6~ujecz5wtxHp008J>V>i`7cs)e_ z@w@x()p@w=B24`klR6(CLpxqtlZO|2IWjpO-F~*EHtLqUMt)Wc_@bMv^h#{CUFW0M z(vJ1P=5N1GhWcHM(-Xu*&bc@D4_o$^7Y|pL)I@*DzttR=&yLH#^{|TW)8Sp0qphw% zepiuSUG#WHT7NcqNRJ+amk%-{%X;;nhp_B9`AEr=dDw9t3i(CsNk{+yAcA?j8pHh( z4`E}k<5T9?EPU2iU;UyqSmD_`zrB>5?fE;*?tuI!eMUi-A4ckzs{)2>k)^r|JEVn*{XgJQwtW9;MFX{UJOON4frt$2Z+chHMhh=Kjd^-@j4hH{^Pz o?0mofTW&!B00000001%k0v=pBEoDz5?EnA(07*qoM6N<$f@P)FSpWb4 diff --git a/tests/snapshots/nanox/test_sign_tx_confirm/00003.png b/tests/snapshots/nanox/test_sign_tx_confirm/00003.png index 570ce28d53e82ac396ba25c370110058f3a638f9..53ae65195fbea5b281a1bc1a80351dbf1cd79ff8 100644 GIT binary patch delta 337 zcmcb?{Dx_QO1-hCi(^Q|oVPav`I;33TrXx`p1a|{>c;7H69f)1tnK}1_-)>Lv9$~H zAFaq>V}Jt(9?R!*Hdl$U+gug42wwA|`?tt~W%GkBoqIANfptddj0G>FcQA>>@;+LY z|Bx#{dELTxzx!w8UUB|8RK5@-XT0FWqrTby92V4D?=0B<=bPcZg8%A^GEXe2pXqpI zNxfm#0vGY1M^mM%nfq(KJ+E!cUpU>CY%99H_th+EJ@M?a;sSP$R|y$S`5ehPO7RI6~ujecz5wtxHp008J>V>i`7cs)e_ z@w@x()p@w=B24`klR6(CLpxqtlZO|2IWjpO-F~*EHtLqUMt)Wc_@bMv^h#{CUFW0M z(vJ1P=5N1GhWcHM(-Xu*&bc@D4_o$^7Y|pL)I@*DzttR=&yLH#^{|TW)8Sp0qphw% zepiuSUG#WHT7NcqNRJ+amk%-{%X;;nhp_B9`AEr=dDw9t3i(CsNk{+yAcA?j8pHh( z4`E}k<5T9?EPU2iU;UyqSmD_`zrB>5?fE;*?tuI!eMUi-A4ckzs{)2>k)^r|JEVn*{XgJQwtW9;MFX{UJOON4frt$2Z+chHMhh=Kjd^-@j4hH{^Pz o?0mofTW&!B00000001%k0v=pBEoDz5?EnA(07*qoM6N<$f@P)FSpWb4 diff --git a/tests/snapshots/nanox/test_sign_tx_transfer/00005.png b/tests/snapshots/nanox/test_sign_tx_transfer/00005.png index 570ce28d53e82ac396ba25c370110058f3a638f9..53ae65195fbea5b281a1bc1a80351dbf1cd79ff8 100644 GIT binary patch delta 337 zcmcb?{Dx_QO1-hCi(^Q|oVPav`I;33TrXx`p1a|{>c;7H69f)1tnK}1_-)>Lv9$~H zAFaq>V}Jt(9?R!*Hdl$U+gug42wwA|`?tt~W%GkBoqIANfptddj0G>FcQA>>@;+LY z|Bx#{dELTxzx!w8UUB|8RK5@-XT0FWqrTby92V4D?=0B<=bPcZg8%A^GEXe2pXqpI zNxfm#0vGY1M^mM%nfq(KJ+E!cUpU>CY%99H_th+EJ@M?a;sSP$R|y$S`5ehPO7RI6~ujecz5wtxHp008J>V>i`7cs)e_ z@w@x()p@w=B24`klR6(CLpxqtlZO|2IWjpO-F~*EHtLqUMt)Wc_@bMv^h#{CUFW0M z(vJ1P=5N1GhWcHM(-Xu*&bc@D4_o$^7Y|pL)I@*DzttR=&yLH#^{|TW)8Sp0qphw% zepiuSUG#WHT7NcqNRJ+amk%-{%X;;nhp_B9`AEr=dDw9t3i(CsNk{+yAcA?j8pHh( z4`E}k<5T9?EPU2iU;UyqSmD_`zrB>5?fE;*?tuI!eMUi-A4ckzs{)2>k)^r|JEVn*{XgJQwtW9;MFX{UJOON4frt$2Z+chHMhh=Kjd^-@j4hH{^Pz o?0mofTW&!B00000001%k0v=pBEoDz5?EnA(07*qoM6N<$f@P)FSpWb4 diff --git a/tests/test_sign_cmd.py b/tests/test_sign_cmd.py index 159b595..faf8e57 100644 --- a/tests/test_sign_cmd.py +++ b/tests/test_sign_cmd.py @@ -36,7 +36,7 @@ def run_test( navigate_until_text_and_compare( backend.firmware, navigator, - "Accept", + "Approve", default_screenshot_path, test_name, ) From d1ff8d116e92bc6f06399df4f14a081133fb9d86 Mon Sep 17 00:00:00 2001 From: keiff3r Date: Mon, 24 Feb 2025 15:23:01 +0100 Subject: [PATCH 56/67] docs: Update README with comprehensive development and testing guide [LDG-686] --- README.md | 291 ++++++++++++++++++++++++++++------------------------- doc/api.md | 81 ++++++++------- 2 files changed, 196 insertions(+), 176 deletions(-) diff --git a/README.md b/README.md index b81cb7b..85ea906 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,9 @@

-![Build Status](https://github.com/broxus/ledger-app-everscale/actions/workflows/ci.yml/badge.svg?branch=master) +[![Ensure compliance with Ledger guidelines](https://github.com/blooo-io/app-everscale/actions/workflows/guidelines_enforcer.yml/badge.svg)](https://github.com/blooo-io/app-everscale/actions/workflows/guidelines_enforcer.yml) + +[![Build and run functional tests using ragger through reusable workflow](https://github.com/blooo-io/app-everscale/actions/workflows/build_and_functional_tests.yml/badge.svg)](https://github.com/blooo-io/app-everscale/actions/workflows/build_and_functional_tests.yml) # Everscale app for Ledger Wallet @@ -13,188 +15,207 @@ This app adds support for the Everscale tokens to Ledger hardware wallets. Current Features: + - Pubkey queries - Address queries - Sign transaction hash -- Parse, display and sign Everscale transaction +- Parse, display and sign Everscale transaction -## Build and load application -* [Install Docker](https://docs.docker.com/get-docker/) -* For Linux hosts, install the Ledger [udev rules](https://github.com/LedgerHQ/udev-rules) +## Quick start guide -1. Pull the default image -``` -docker pull ghcr.io/ledgerhq/ledger-app-builder/ledger-app-builder:latest -``` +### With VSCode -2. Compile your app in the container -* For Nano S -```bash -$ docker run --rm -ti -v "$(realpath .):/app" --user $(id -u $USER):$(id -g $USER) ghcr.io/ledgerhq/ledger-app-builder/ledger-app-builder:latest -root@656be163fe84:/app# BOLOS_SDK=$NANOS_SDK make -``` +You can quickly setup a convenient environment to build and test your application +by using [Ledger's VSCode developer tools extension](https://marketplace.visualstudio.com/items?itemName=LedgerHQ.ledger-dev-tools) +which leverages the [ledger-app-dev-tools](https://github.com/LedgerHQ/ledger-app-builder/pkgs/container/ledger-app-builder%2Fledger-app-dev-tools) +docker image. -* For Nano X -```bash -$ docker run --rm -ti -v "$(realpath .):/app" --user $(id -u $USER):$(id -g $USER) ghcr.io/ledgerhq/ledger-app-builder/ledger-app-builder:latest -root@656be163fe84:/app# BOLOS_SDK=$NANOX_SDK make -``` +It will allow you, whether you are developing on macOS, Windows or Linux to quickly **build** your apps, +**test** them on **Speculos** and **load** them on any supported device. -* For Nano S+ -```bash -$ docker run --rm -ti -v "$(realpath .):/app" --user $(id -u $USER):$(id -g $USER) ghcr.io/ledgerhq/ledger-app-builder/ledger-app-builder:latest -root@656be163fe84:/app# BOLOS_SDK=$NANOSP_SDK make -``` +- Install and run [Docker](https://www.docker.com/products/docker-desktop/). +- Make sure you have an X11 server running : + - On Ubuntu Linux, it should be running by default. + - On macOS, install and launch [XQuartz](https://www.xquartz.org/) + (make sure to go to XQuartz > Preferences > Security and check "Allow client connections"). + - On Windows, install and launch [VcXsrv](https://sourceforge.net/projects/vcxsrv/) + (make sure to configure it to disable access control). +- Install [VScode](https://code.visualstudio.com/download) and add [Ledger's extension](https://marketplace.visualstudio.com/items?itemName=LedgerHQ.ledger-dev-tools). +- Open a terminal and clone `app-everscale` with `git clone git@github.com:blooo-io/app-everscale.git`. +- Open the `app-everscale` folder with VSCode. +- Use Ledger extension's sidebar menu or open the tasks menu with `ctrl + shift + b` + (`command + shift + b` on a Mac) to conveniently execute actions : + - Build the app for the device model of your choice with `Build`. + - Test your binary on [Speculos](https://github.com/LedgerHQ/speculos) with `Run with Speculos`. + - You can also run functional tests, load the app on a physical device, and more. -3. Code static analysis -The Docker images include the [Clang Static Analyzer](https://clang-analyzer.llvm.org/), which can be invoked with: -```bash -$ docker run --rm -ti -v "$(realpath .):/app" --user $(id -u $USER):$(id -g $USER) ghcr.io/ledgerhq/ledger-app-builder/ledger-app-builder:latest -root@656be163fe84:/app# BOLOS_SDK=$NANOS_SDK make scan-build -``` +:information_source: The terminal tab of VSCode will show you what commands the extension runs behind the scene. -4. Load the app on a physical device +### With a terminal -:warning: Only Nano S and Nano S+ devices allow application side-loading. This section will not work with a Nano X. +The [ledger-app-dev-tools](https://github.com/LedgerHQ/ledger-app-builder/pkgs/container/ledger-app-builder%2Fledger-app-dev-tools) +docker image contains all the required tools and libraries to **build**, **test** and **load** an application. -To load the app from the container, you will need additional docker arguments in order to allow Docker to access your USB port. -Your physical device must be connected, unlocked and the screen showing the dashboard (not inside an application). Same as for compilation, `BOLOS_SDK` variable is used to specify the target device. Use the following docker command to load the app (here for Nano S device) : +You can download it from the ghcr.io docker repository: -```bash -$ docker run --rm -ti -v "$(realpath .):/app" --privileged -v "/dev/bus/usb:/dev/bus/usb" --user $(id -u $USER):$(id -g $USER) ghcr.io/ledgerhq/ledger-app-builder/ledger-app-builder:latest -root@656be163fe84:/app# BOLOS_SDK=$NANOS_SDK make load +```shell +sudo docker pull ghcr.io/ledgerhq/ledger-app-builder/ledger-app-dev-tools:latest ``` -## Fuzzing +You can then enter this development environment by executing the following command +from the directory of the application `git` repository: -* Build docker image -```bash -cd fuzz && docker build -t ledger-app-fuzzer . -``` +#### Linux (Ubuntu) -* Build fuzzer -```bash -docker run --rm -ti -v "$(realpath .):/app" ledger-app-fuzzer:latest -root@72edae7503e3:/# cd /app/fuzz && ./build.sh +```shell +sudo docker run --rm -ti --user "$(id -u):$(id -g)" --privileged -v "/dev/bus/usb:/dev/bus/usb" -v "$(realpath .):/app" ghcr.io/ledgerhq/ledger-app-builder/ledger-app-dev-tools:latest ``` -* Run fuzzer -```bash -root@72edae7503e3:/app/fuzz/cmake-build-fuzz# cd cmake-build-fuzz && mkdir out && ./fuzzer +#### macOS + +```shell +sudo docker run --rm -ti --user "$(id -u):$(id -g)" --privileged -v "$(pwd -P):/app" ghcr.io/ledgerhq/ledger-app-builder/ledger-app-dev-tools:latest ``` -## Example of Ledger wallet functionality +#### Windows (with PowerShell) -**Install Rust to compile client to interact with Everscale Ledger app** -```bash -curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh +```shell +docker run --rm -ti --privileged -v "$(Get-Location):/app" ghcr.io/ledgerhq/ledger-app-builder/ledger-app-dev-tools:latest ``` -**List of Everscale wallets** -```bash -cargo run --manifest-path client/Cargo.toml get-wallets -``` +The application's code will be available from inside the docker container, +you can proceed to the following compilation steps to build your app. -**Request public key** -```bash -cargo run --manifest-path client/Cargo.toml get-pubkey --account ${LEDGER_ACCOUNT_NUMBER} -``` +## Compilation and load -```bash -# Example -cargo run --manifest-path client/Cargo.toml get-pubkey --account 0 -``` +To easily setup a development environment for compilation and loading on a physical device, +you can use the [VSCode integration](#with-vscode) whether you are on Linux, macOS or Windows. -**Request address** -```bash -cargo run --manifest-path client/Cargo.toml get-address --account ${LEDGER_ACCOUNT_NUMBER} --wallet ${WALLET_TYPE} -# send some EVER's to the this address (about 1 should be enough) -``` +If you prefer using a terminal to perform the steps manually, you can use the guide below. -```bash -# Example -cargo run --manifest-path client/Cargo.toml get-address --account 0 --wallet EverWallet -``` +### Compilation -**Check balance** -```bash -cargo run --manifest-path client/Cargo.toml get-balance --account ${LEDGER_ACCOUNT_NUMBER} --wallet ${WALLET_TYPE} -``` +Setup a compilation environment by following the [shell with docker approach](#with-a-terminal). -```bash -# Example -cargo run --manifest-path client/Cargo.toml get-balance --account 0 --wallet EverWallet -``` +From inside the container, use the following command to build the app : -**Deploy wallet** -It only applies to Multisig wallets -```bash -cargo run --manifest-path client/Cargo.toml deploy --account ${LEDGER_ACCOUNT_NUMBER} -wallet ${WALLET_TYPE} +```shell +make DEBUG=1 # compile optionally with PRINTF ``` -```bash -# Example -cargo run --manifest-path client/Cargo.toml deploy --account 0 --wallet Multisig2_1 -``` +You can choose which device to compile and load for by setting the `BOLOS_SDK` environment variable +to the following values : -**Send EVER transaction** -```bash -cargo run --manifest-path client/Cargo.toml send-transaction \ - --account ${LEDGER_ACCOUNT_NUMBER} \ - --wallet ${WALLET_TYPE} \ - --amount ${AMOUNT} \ - --address ${RECIPIENT_ADDRESS} -``` +- `BOLOS_SDK=$NANOX_SDK` +- `BOLOS_SDK=$NANOSP_SDK` +- `BOLOS_SDK=$STAX_SDK` +- `BOLOS_SDK=$FLEX_SDK` + +By default this variable is set to build/load for Nano S+. + +### Loading on a physical device + +This step will vary slightly depending on your platform. + +:information_source: Your physical device must be connected, unlocked and the screen showing the dashboard +(not inside an application). + +#### Linux (Ubuntu) + +First make sure you have the proper udev rules added on your host : -```bash -# Example -cargo run --manifest-path client/Cargo.toml send-transaction \ - --account 0 \ - --wallet Multisig2_1 \ - --amount 0.1 \ - --address 0:7094fc3cb69fa1b7bde8e830e2cd74bc9455d93561ce2c562182215686eb45e2 +```shell +# Run these commands on your host, from the app's source folder. +sudo cp .vscode/20-ledger.ledgerblue.rules /etc/udev/rules.d/ +sudo udevadm control --reload-rules +sudo udevadm trigger ``` -**Get list of supported tokens** -```bash -cargo run --manifest-path client/Cargo.toml get-tokens +Then once you have [opened a terminal](#with-a-terminal) in the `app-builder` image and [built the app](#compilation-and-load) +for the device you want, run the following command : + +```shell +# Run this command from the app-builder container terminal. +make load # load the app on a Nano S+ by default ``` -**Check token balance** -```bash -cargo run --manifest-path client/Cargo.toml get-token-balance --account ${LEDGER_ACCOUNT_NUMBER} --wallet ${WALLET_TYPE} --token ${TOKEN_NAME} +[Setting the BOLOS_SDK environment variable](#compilation-and-load) will allow you to load on whichever supported +device you want. + +#### macOS / Windows (with PowerShell) + +:information_source: It is assumed you have [Python](https://www.python.org/downloads/) installed on your computer. + +Run these commands on your host from the app's source folder once you have [built the app](#compilation-and-load) +for the device you want : + +```shell +# Install Python virtualenv +python3 -m pip install virtualenv +# Create the 'ledger' virtualenv +python3 -m virtualenv ledger ``` -```bash -# Example -cargo run --manifest-path client/Cargo.toml get-token-balance --account 0 --wallet EverWallet --token WEVER +Enter the Python virtual environment + +- macOS : `source ledger/bin/activate` +- Windows : `.\ledger\Scripts\Activate.ps1` + +```shell +# Install Ledgerblue (tool to load the app) +python3 -m pip install ledgerblue +# Load the app. +python3 -m ledgerblue.runScript --scp --fileName bin/app.apdu --elfFile bin/app.elf ``` -**Send token transaction** -```bash -cargo run --manifest-path client/Cargo.toml send-token-transaction \ - --account ${LEDGER_ACCOUNT_NUMBER} \ - --wallet ${WALLET_TYPE} \ - --amount ${AMOUNT} \ - --address ${RECIPIENT_ADDRESS} \ - --token ${TOKEN_NAME} +## Test + +The Everscale app comes with functional tests implemented with Ledger's [Ragger](https://github.com/LedgerHQ/ragger) +test framework. + +### macOS / Windows + +To test your app on macOS or Windows, it is recommended to use [Ledger's VS Code extension](#with-vscode) +to quickly setup a working test environment. + +You can use the following sequence of tasks and commands (all accessible in the **extension sidebar menu**) : + +- `Select build target` +- `Build app` + +Then you can choose to execute the functional tests : + +- Use `Run tests`. + +Or simply run the app on the Speculos emulator : + +- `Run with Speculos`. + +### Linux (Ubuntu) + +On Linux, you can use [Ledger's VS Code extension](#with-vscode) to run the tests. +If you prefer not to, open a terminal and follow the steps below. + +Install the tests requirements : + +```shell +pip install -r tests/requirements.txt ``` -```bash -# Example -cargo run --manifest-path client/Cargo.toml send-token-transaction \ - --account 0 \ - --wallet EverWallet \ - --amount 1.5 \ - --address 0:ed7439e12d67d23fcaf701ff3bd4e30d390c1e8e14f6f40d52089590e28d9c70 \ - --token WEVER +Then you can : + +Run the functional tests (here for nanos+ but available for any device once you have built the binaries) : + +```shell +pytest tests/ --tb=short -v --device nanosp ``` -## Tests -Some tests require interactive approval on the ledger -```bash -cargo run --manifest-path tests/Cargo.toml +Or run your app directly with Speculos + +```shell +speculos --model nanosp build/nanos2/bin/app.elf ``` ## Documentation + This follows the specification available in the [`api.md`](doc/api.md) diff --git a/doc/api.md b/doc/api.md index 49ee42f..0177390 100644 --- a/doc/api.md +++ b/doc/api.md @@ -16,7 +16,7 @@ The application interface can be accessed over HID or BLE ## Command APDU | Field name | Length (bytes) | Description | -| ---------- |----------------| --------------------------------------------------------------------- | +| ---------- | -------------- | --------------------------------------------------------------------- | | CLA | 1 | Instruction class - indicates the type of command | | INS | 1 | Instruction code - indicates the specific command | | P1 | 1 | Instruction parameter 1 for the command | @@ -37,7 +37,7 @@ _This command returns specific application configuration_ ##### Command | _CLA_ | _INS_ | _P1_ | _P2_ | _Lc_ | _CData_ | -| ----- |:-----:| ---: | ---- |:----:|---------:| +| ----- | :---: | ---: | ---- | :--: | -------: | | E0 | 01 | 00 | 00 | 00 | variable | ##### Input data @@ -60,21 +60,20 @@ _This command returns a public key for the given account number_ ##### Command -| _CLA_ | _INS_ | _P1_ | _P2_ | _Lc_ | _CData_ | -| ----- |:-----:|:---------------------------------------------------------------------------------|------| :------: |----------:| -| E0 | 02 | 00 : return public key
01 : display public key and confirm before returning | 00 | variable | variable | +| _CLA_ | _INS_ | _P1_ | _P2_ | _Lc_ | _CData_ | +| ----- | :---: | :------------------------------------------------------------------------------ | ---- | :------: | -------: | +| E0 | 02 | 00 : return public key
01 : display public key and confirm before returning | 00 | variable | variable | ##### Input data -| _Description_ | _Length_ | -|-------------------------------------|:--------:| -| An account number to retrieve | 4 | - +| _Description_ | _Length_ | +| ----------------------------- | :------: | +| An account number to retrieve | 4 | ##### Output data | _Description_ | _Length_ | -| ------------- |:--------:| +| ------------- | :------: | | Pubkey length | 1 | | Pubkey | 32 | @@ -89,20 +88,20 @@ To avoid blindly signing message hash the application adds a 4-byte prefix [0xFF ##### Command | _CLA_ | _INS_ | _P1_ | _P2_ | _Lc_ | _CData_ | -| ----- |:-----:| ---: | ---- | :------: |---------:| +| ----- | :---: | ---: | ---- | :------: | -------: | | E0 | 03 | 01 | 00 | variable | variable | ##### Input data -| _Description_ | _Length_ | -|------------------------------------------|:--------:| -| An account number to retrieve | 4 | -| A bytes to sign | 32 | +| _Description_ | _Length_ | +| ----------------------------- | :------: | +| An account number to retrieve | 4 | +| A bytes to sign | 32 | ##### Output data | _Description_ | _Length_ | -|------------------| :------: | +| ---------------- | :------: | | Signature length | 1 | | Signature | 64 | @@ -115,20 +114,20 @@ _This command returns an address for the given account number_ ##### Command | _CLA_ | _INS_ | _P1_ | _P2_ | _Lc_ | _CData_ | -| ----- |:-----:|:--------------------------------------------------------------------------|------| :------: |---------:| +| ----- | :---: | :------------------------------------------------------------------------ | ---- | :------: | -------: | | E0 | 04 | 00 : return address
01 : display address and confirm before returning | 00 | variable | variable | ##### Input data | _Description_ | _Length_ | -|-------------------------------|:--------:| +| ----------------------------- | :------: | | An account number to retrieve | 4 | | Wallet number to retrieve | 1 | ##### Output data | _Description_ | _Length_ | -|----------------|:--------:| +| -------------- | :------: | | Address length | 1 | | Address | 32 | @@ -140,14 +139,14 @@ _This command signs a transaction message_ ##### Command -| _CLA_ | _INS_ | _P1_ | _P2_ | _Lc_ | _CData_ | -| ----- |:-----:| ---: | ---- | :------: |---------------:| -| E0 | 05 | 01 | 0x01 (last chunk)
0x02 (first chunk)
0x00 (single chunk)
0x03 (intermediate chunk) | variable | variable | +| _CLA_ | _INS_ | _P1_ | _P2_ | _Lc_ | _CData_ | +| ----- | :---: | ---: | ------------------------------------------------------------------------------------------------- | :------: | -------: | +| E0 | 05 | 01 | 0x01 (last chunk)
0x02 (first chunk)
0x00 (single chunk)
0x03 (intermediate chunk) | variable | variable | ##### Input data | _Description_ | _Length_ | -|--------------------------------------------------------------------------------|:--------:| +| ------------------------------------------------------------------------------ | :------: | | An account number to retrieve | 4 | | Original wallet number to derive address | 1 | | Decimals | 1 | @@ -162,10 +161,24 @@ _This command signs a transaction message_ ##### Output data -| _Description_ | _Length_ | -|-----------------| :------: | -| Address length | 1 | -| Signature | 64 | +| _Description_ | _Length_ | +| -------------- | :------: | +| Address length | 1 | +| Signature | 64 | + +## Status Words + +The following standard Status Words are returned for all APDUs - some specific Status Words can be used for specific commands and are mentioned in the command description. + +##### Status Words + +| _SW_ | _Description_ | +| ---- | :-----------------------------------------------: | +| 6700 | Incorrect length | +| 6985 | Canceled by user | +| 6B0x | Invalid request | +| 6Fxx | Technical problem (Internal error, please report) | +| 9000 | Normal ending of the command | ## Transport protocol @@ -214,17 +227,3 @@ The application acts as a GATT server defining service UUID D973F2E0-B19E-11E2-9 When using this service, the client sends requests to the characteristic D973F2E2-B19E-11E2-9E96-0800200C9A66, and gets notified on the characteristic D973F2E1-B19E-11E2-9E96-0800200C9A66 after registering for it. Requests are encoded using the standard BLE 20 bytes MTU size - -## Status Words - -The following standard Status Words are returned for all APDUs - some specific Status Words can be used for specific commands and are mentioned in the command description. - -##### Status Words - -| _SW_ | _Description_ | -| ---- |:--------------------------------------------------:| -| 6700 | Incorrect length | -| 6982 | Security status not satisfied (Canceled by user) | -| 6B0x | Invalid request | -| 6Fxx | Technical problem (Internal error, please report) | -| 9000 | Normal ending of the command | From 0b1ce5b1fff8c9c1ffc0fd5bc6af68e74c4de353 Mon Sep 17 00:00:00 2001 From: keiff3r Date: Mon, 24 Feb 2025 15:24:10 +0100 Subject: [PATCH 57/67] chore: bump app version --- Makefile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index 2ccc615..86af904 100644 --- a/Makefile +++ b/Makefile @@ -31,8 +31,8 @@ APP_LOAD_FLAGS=--appFlags 0x200 # Application version APPVERSION_M = 1 -APPVERSION_N = 0 -APPVERSION_P = 10 +APPVERSION_N = 1 +APPVERSION_P = 0 APPVERSION = "$(APPVERSION_M).$(APPVERSION_N).$(APPVERSION_P)" # Application source files From 859afce7eb9c363cb215539df174da52d5fcb84d Mon Sep 17 00:00:00 2001 From: n4l5u0r <59141606+n4l5u0r@users.noreply.github.com> Date: Mon, 24 Feb 2025 17:20:53 +0100 Subject: [PATCH 58/67] chore: remove old test suite and related files This commit removes the entire `old-tests` directory, which contained a legacy test suite for the Ledger app. The directory included Rust and Python test files, Speculos screenshot tests, and various configuration and client-side testing utilities. --- old-tests/.gitignore | 1 - old-tests/Cargo.lock | 2097 ----------------- old-tests/Cargo.toml | 30 - old-tests/python/apps/__init__.py | 0 old-tests/speculos/conftest.py | 40 - old-tests/speculos/ledger_client/__init__.py | 0 .../ledger_client/exception/__init__.py | 35 - .../exception/device_exception.py | 38 - .../ledger_client/exception/errors.py | 58 - .../speculos/ledger_client/ledger_cmd.py | 155 -- .../ledger_client/ledger_cmd_builder.py | 243 -- .../speculos/ledger_client/transaction.py | 96 - old-tests/speculos/ledger_client/utils.py | 115 - old-tests/speculos/requirements.txt | 6 - .../get_pubkey/approve/nanos/00000.png | Bin 349 -> 0 bytes .../get_pubkey/approve/nanos/00001.png | Bin 499 -> 0 bytes .../get_pubkey/approve/nanos/00002.png | Bin 486 -> 0 bytes .../get_pubkey/approve/nanos/00003.png | Bin 441 -> 0 bytes .../get_pubkey/approve/nanos/00004.png | Bin 343 -> 0 bytes .../get_pubkey/approve/nanos/00005.png | Bin 333 -> 0 bytes .../get_pubkey/approve/nanosp/00000.png | Bin 382 -> 0 bytes .../get_pubkey/approve/nanosp/00001.png | Bin 524 -> 0 bytes .../get_pubkey/approve/nanosp/00002.png | Bin 368 -> 0 bytes .../get_pubkey/approve/nanosp/00003.png | Bin 356 -> 0 bytes .../get_pubkey/approve/nanox/00000.png | Bin 381 -> 0 bytes .../get_pubkey/approve/nanox/00001.png | Bin 524 -> 0 bytes .../get_pubkey/approve/nanox/00002.png | Bin 370 -> 0 bytes .../get_pubkey/approve/nanox/00003.png | Bin 356 -> 0 bytes .../get_pubkey/reject/nanos/00000.png | Bin 349 -> 0 bytes .../get_pubkey/reject/nanos/00001.png | Bin 499 -> 0 bytes .../get_pubkey/reject/nanos/00002.png | Bin 486 -> 0 bytes .../get_pubkey/reject/nanos/00003.png | Bin 441 -> 0 bytes .../get_pubkey/reject/nanos/00004.png | Bin 343 -> 0 bytes .../get_pubkey/reject/nanosp/00000.png | Bin 382 -> 0 bytes .../get_pubkey/reject/nanosp/00001.png | Bin 524 -> 0 bytes .../get_pubkey/reject/nanosp/00002.png | Bin 368 -> 0 bytes .../get_pubkey/reject/nanox/00000.png | Bin 381 -> 0 bytes .../get_pubkey/reject/nanox/00001.png | Bin 524 -> 0 bytes .../get_pubkey/reject/nanox/00002.png | Bin 370 -> 0 bytes .../sign/sign_message/nanos/00000.png | Bin 349 -> 0 bytes .../sign/sign_message/nanos/00001.png | Bin 465 -> 0 bytes .../sign/sign_message/nanos/00002.png | Bin 501 -> 0 bytes .../sign/sign_message/nanos/00003.png | Bin 495 -> 0 bytes .../sign/sign_message/nanos/00004.png | Bin 464 -> 0 bytes .../sign/sign_message/nanos/00005.png | Bin 444 -> 0 bytes .../sign/sign_message/nanos/00006.png | Bin 403 -> 0 bytes .../sign/sign_message/nanosp/00000.png | Bin 382 -> 0 bytes .../sign/sign_message/nanosp/00001.png | Bin 875 -> 0 bytes .../sign/sign_message/nanosp/00002.png | Bin 544 -> 0 bytes .../sign/sign_message/nanosp/00003.png | Bin 503 -> 0 bytes .../sign/sign_message/nanosp/00004.png | Bin 456 -> 0 bytes .../sign/sign_message/nanosp/00005.png | Bin 456 -> 0 bytes .../sign/sign_message/nanosp/00006.png | Bin 456 -> 0 bytes .../sign/sign_message/nanox/00000.png | Bin 381 -> 0 bytes .../sign/sign_message/nanox/00001.png | Bin 875 -> 0 bytes .../sign/sign_message/nanox/00002.png | Bin 544 -> 0 bytes .../sign/sign_message/nanox/00003.png | Bin 503 -> 0 bytes .../sign/sign_message/nanox/00004.png | Bin 449 -> 0 bytes .../sign/sign_message/nanox/00005.png | Bin 456 -> 0 bytes .../sign/sign_message/nanox/00006.png | Bin 456 -> 0 bytes .../sign/sign_reject/nanos/00000.png | Bin 349 -> 0 bytes .../sign/sign_reject/nanos/00001.png | Bin 465 -> 0 bytes .../sign/sign_reject/nanos/00002.png | Bin 501 -> 0 bytes .../sign/sign_reject/nanos/00003.png | Bin 495 -> 0 bytes .../sign/sign_reject/nanos/00004.png | Bin 464 -> 0 bytes .../sign/sign_reject/nanos/00005.png | Bin 444 -> 0 bytes .../sign/sign_reject/nanosp/00000.png | Bin 382 -> 0 bytes .../sign/sign_reject/nanosp/00001.png | Bin 875 -> 0 bytes .../sign/sign_reject/nanosp/00002.png | Bin 544 -> 0 bytes .../sign/sign_reject/nanosp/00003.png | Bin 503 -> 0 bytes .../sign/sign_reject/nanox/00000.png | Bin 381 -> 0 bytes .../sign/sign_reject/nanox/00001.png | Bin 875 -> 0 bytes .../sign/sign_reject/nanox/00002.png | Bin 544 -> 0 bytes .../sign/sign_reject/nanox/00003.png | Bin 503 -> 0 bytes .../sign_tx/burn_reject/nanos/00000.png | Bin 349 -> 0 bytes .../sign_tx/burn_reject/nanos/00001.png | Bin 288 -> 0 bytes .../sign_tx/burn_reject/nanos/00002.png | Bin 329 -> 0 bytes .../sign_tx/burn_reject/nanos/00003.png | Bin 414 -> 0 bytes .../sign_tx/burn_reject/nanos/00004.png | Bin 340 -> 0 bytes .../sign_tx/burn_reject/nanosp/00000.png | Bin 382 -> 0 bytes .../sign_tx/burn_reject/nanosp/00001.png | Bin 341 -> 0 bytes .../sign_tx/burn_reject/nanosp/00002.png | Bin 387 -> 0 bytes .../sign_tx/burn_reject/nanosp/00003.png | Bin 472 -> 0 bytes .../sign_tx/burn_reject/nanosp/00004.png | Bin 365 -> 0 bytes .../sign_tx/burn_reject/nanox/00000.png | Bin 381 -> 0 bytes .../sign_tx/burn_reject/nanox/00001.png | Bin 341 -> 0 bytes .../sign_tx/burn_reject/nanox/00002.png | Bin 387 -> 0 bytes .../sign_tx/burn_reject/nanox/00003.png | Bin 472 -> 0 bytes .../sign_tx/burn_reject/nanox/00004.png | Bin 366 -> 0 bytes .../sign_tx/burn_tx/nanos/00000.png | Bin 349 -> 0 bytes .../sign_tx/burn_tx/nanos/00001.png | Bin 288 -> 0 bytes .../sign_tx/burn_tx/nanos/00002.png | Bin 329 -> 0 bytes .../sign_tx/burn_tx/nanos/00003.png | Bin 414 -> 0 bytes .../sign_tx/burn_tx/nanosp/00000.png | Bin 382 -> 0 bytes .../sign_tx/burn_tx/nanosp/00001.png | Bin 341 -> 0 bytes .../sign_tx/burn_tx/nanosp/00002.png | Bin 387 -> 0 bytes .../sign_tx/burn_tx/nanosp/00003.png | Bin 472 -> 0 bytes .../sign_tx/burn_tx/nanox/00000.png | Bin 381 -> 0 bytes .../sign_tx/burn_tx/nanox/00001.png | Bin 341 -> 0 bytes .../sign_tx/burn_tx/nanox/00002.png | Bin 387 -> 0 bytes .../sign_tx/burn_tx/nanox/00003.png | Bin 472 -> 0 bytes .../sign_tx/sign_confirm_tx/nanos/00000.png | Bin 349 -> 0 bytes .../sign_tx/sign_confirm_tx/nanos/00001.png | Bin 292 -> 0 bytes .../sign_tx/sign_confirm_tx/nanos/00002.png | Bin 446 -> 0 bytes .../sign_tx/sign_confirm_tx/nanos/00003.png | Bin 414 -> 0 bytes .../sign_tx/sign_confirm_tx/nanosp/00000.png | Bin 382 -> 0 bytes .../sign_tx/sign_confirm_tx/nanosp/00001.png | Bin 354 -> 0 bytes .../sign_tx/sign_confirm_tx/nanosp/00002.png | Bin 537 -> 0 bytes .../sign_tx/sign_confirm_tx/nanosp/00003.png | Bin 472 -> 0 bytes .../sign_tx/sign_confirm_tx/nanox/00000.png | Bin 381 -> 0 bytes .../sign_tx/sign_confirm_tx/nanox/00001.png | Bin 354 -> 0 bytes .../sign_tx/sign_confirm_tx/nanox/00002.png | Bin 537 -> 0 bytes .../sign_tx/sign_confirm_tx/nanox/00003.png | Bin 472 -> 0 bytes .../sign_tx/sign_reject_tx/nanos/00000.png | Bin 349 -> 0 bytes .../sign_tx/sign_reject_tx/nanos/00001.png | Bin 292 -> 0 bytes .../sign_tx/sign_reject_tx/nanos/00002.png | Bin 446 -> 0 bytes .../sign_tx/sign_reject_tx/nanos/00003.png | Bin 414 -> 0 bytes .../sign_tx/sign_reject_tx/nanos/00004.png | Bin 340 -> 0 bytes .../sign_tx/sign_reject_tx/nanosp/00000.png | Bin 382 -> 0 bytes .../sign_tx/sign_reject_tx/nanosp/00001.png | Bin 354 -> 0 bytes .../sign_tx/sign_reject_tx/nanosp/00002.png | Bin 537 -> 0 bytes .../sign_tx/sign_reject_tx/nanosp/00003.png | Bin 472 -> 0 bytes .../sign_tx/sign_reject_tx/nanosp/00004.png | Bin 365 -> 0 bytes .../sign_tx/sign_reject_tx/nanox/00000.png | Bin 381 -> 0 bytes .../sign_tx/sign_reject_tx/nanox/00001.png | Bin 354 -> 0 bytes .../sign_tx/sign_reject_tx/nanox/00002.png | Bin 537 -> 0 bytes .../sign_tx/sign_reject_tx/nanox/00003.png | Bin 472 -> 0 bytes .../sign_tx/sign_reject_tx/nanox/00004.png | Bin 366 -> 0 bytes old-tests/speculos/setup.cfg | 20 - old-tests/speculos/test_address.py | 34 - old-tests/speculos/test_configuration.py | 10 - old-tests/speculos/test_pubkey.py | 80 - old-tests/speculos/test_sign_message.py | 144 -- old-tests/speculos/test_sign_tx.py | 243 -- old-tests/src/main.rs | 513 ---- 135 files changed, 3958 deletions(-) delete mode 100644 old-tests/.gitignore delete mode 100644 old-tests/Cargo.lock delete mode 100644 old-tests/Cargo.toml delete mode 100644 old-tests/python/apps/__init__.py delete mode 100644 old-tests/speculos/conftest.py delete mode 100644 old-tests/speculos/ledger_client/__init__.py delete mode 100644 old-tests/speculos/ledger_client/exception/__init__.py delete mode 100644 old-tests/speculos/ledger_client/exception/device_exception.py delete mode 100644 old-tests/speculos/ledger_client/exception/errors.py delete mode 100644 old-tests/speculos/ledger_client/ledger_cmd.py delete mode 100644 old-tests/speculos/ledger_client/ledger_cmd_builder.py delete mode 100644 old-tests/speculos/ledger_client/transaction.py delete mode 100644 old-tests/speculos/ledger_client/utils.py delete mode 100644 old-tests/speculos/requirements.txt delete mode 100644 old-tests/speculos/screenshots/get_pubkey/approve/nanos/00000.png delete mode 100644 old-tests/speculos/screenshots/get_pubkey/approve/nanos/00001.png delete mode 100644 old-tests/speculos/screenshots/get_pubkey/approve/nanos/00002.png delete mode 100644 old-tests/speculos/screenshots/get_pubkey/approve/nanos/00003.png delete mode 100644 old-tests/speculos/screenshots/get_pubkey/approve/nanos/00004.png delete mode 100644 old-tests/speculos/screenshots/get_pubkey/approve/nanos/00005.png delete mode 100644 old-tests/speculos/screenshots/get_pubkey/approve/nanosp/00000.png delete mode 100644 old-tests/speculos/screenshots/get_pubkey/approve/nanosp/00001.png delete mode 100644 old-tests/speculos/screenshots/get_pubkey/approve/nanosp/00002.png delete mode 100644 old-tests/speculos/screenshots/get_pubkey/approve/nanosp/00003.png delete mode 100644 old-tests/speculos/screenshots/get_pubkey/approve/nanox/00000.png delete mode 100644 old-tests/speculos/screenshots/get_pubkey/approve/nanox/00001.png delete mode 100644 old-tests/speculos/screenshots/get_pubkey/approve/nanox/00002.png delete mode 100644 old-tests/speculos/screenshots/get_pubkey/approve/nanox/00003.png delete mode 100644 old-tests/speculos/screenshots/get_pubkey/reject/nanos/00000.png delete mode 100644 old-tests/speculos/screenshots/get_pubkey/reject/nanos/00001.png delete mode 100644 old-tests/speculos/screenshots/get_pubkey/reject/nanos/00002.png delete mode 100644 old-tests/speculos/screenshots/get_pubkey/reject/nanos/00003.png delete mode 100644 old-tests/speculos/screenshots/get_pubkey/reject/nanos/00004.png delete mode 100644 old-tests/speculos/screenshots/get_pubkey/reject/nanosp/00000.png delete mode 100644 old-tests/speculos/screenshots/get_pubkey/reject/nanosp/00001.png delete mode 100644 old-tests/speculos/screenshots/get_pubkey/reject/nanosp/00002.png delete mode 100644 old-tests/speculos/screenshots/get_pubkey/reject/nanox/00000.png delete mode 100644 old-tests/speculos/screenshots/get_pubkey/reject/nanox/00001.png delete mode 100644 old-tests/speculos/screenshots/get_pubkey/reject/nanox/00002.png delete mode 100644 old-tests/speculos/screenshots/sign/sign_message/nanos/00000.png delete mode 100644 old-tests/speculos/screenshots/sign/sign_message/nanos/00001.png delete mode 100644 old-tests/speculos/screenshots/sign/sign_message/nanos/00002.png delete mode 100644 old-tests/speculos/screenshots/sign/sign_message/nanos/00003.png delete mode 100644 old-tests/speculos/screenshots/sign/sign_message/nanos/00004.png delete mode 100644 old-tests/speculos/screenshots/sign/sign_message/nanos/00005.png delete mode 100644 old-tests/speculos/screenshots/sign/sign_message/nanos/00006.png delete mode 100644 old-tests/speculos/screenshots/sign/sign_message/nanosp/00000.png delete mode 100644 old-tests/speculos/screenshots/sign/sign_message/nanosp/00001.png delete mode 100644 old-tests/speculos/screenshots/sign/sign_message/nanosp/00002.png delete mode 100644 old-tests/speculos/screenshots/sign/sign_message/nanosp/00003.png delete mode 100644 old-tests/speculos/screenshots/sign/sign_message/nanosp/00004.png delete mode 100644 old-tests/speculos/screenshots/sign/sign_message/nanosp/00005.png delete mode 100644 old-tests/speculos/screenshots/sign/sign_message/nanosp/00006.png delete mode 100644 old-tests/speculos/screenshots/sign/sign_message/nanox/00000.png delete mode 100644 old-tests/speculos/screenshots/sign/sign_message/nanox/00001.png delete mode 100644 old-tests/speculos/screenshots/sign/sign_message/nanox/00002.png delete mode 100644 old-tests/speculos/screenshots/sign/sign_message/nanox/00003.png delete mode 100644 old-tests/speculos/screenshots/sign/sign_message/nanox/00004.png delete mode 100644 old-tests/speculos/screenshots/sign/sign_message/nanox/00005.png delete mode 100644 old-tests/speculos/screenshots/sign/sign_message/nanox/00006.png delete mode 100644 old-tests/speculos/screenshots/sign/sign_reject/nanos/00000.png delete mode 100644 old-tests/speculos/screenshots/sign/sign_reject/nanos/00001.png delete mode 100644 old-tests/speculos/screenshots/sign/sign_reject/nanos/00002.png delete mode 100644 old-tests/speculos/screenshots/sign/sign_reject/nanos/00003.png delete mode 100644 old-tests/speculos/screenshots/sign/sign_reject/nanos/00004.png delete mode 100644 old-tests/speculos/screenshots/sign/sign_reject/nanos/00005.png delete mode 100644 old-tests/speculos/screenshots/sign/sign_reject/nanosp/00000.png delete mode 100644 old-tests/speculos/screenshots/sign/sign_reject/nanosp/00001.png delete mode 100644 old-tests/speculos/screenshots/sign/sign_reject/nanosp/00002.png delete mode 100644 old-tests/speculos/screenshots/sign/sign_reject/nanosp/00003.png delete mode 100644 old-tests/speculos/screenshots/sign/sign_reject/nanox/00000.png delete mode 100644 old-tests/speculos/screenshots/sign/sign_reject/nanox/00001.png delete mode 100644 old-tests/speculos/screenshots/sign/sign_reject/nanox/00002.png delete mode 100644 old-tests/speculos/screenshots/sign/sign_reject/nanox/00003.png delete mode 100644 old-tests/speculos/screenshots/sign_tx/burn_reject/nanos/00000.png delete mode 100644 old-tests/speculos/screenshots/sign_tx/burn_reject/nanos/00001.png delete mode 100644 old-tests/speculos/screenshots/sign_tx/burn_reject/nanos/00002.png delete mode 100644 old-tests/speculos/screenshots/sign_tx/burn_reject/nanos/00003.png delete mode 100644 old-tests/speculos/screenshots/sign_tx/burn_reject/nanos/00004.png delete mode 100644 old-tests/speculos/screenshots/sign_tx/burn_reject/nanosp/00000.png delete mode 100644 old-tests/speculos/screenshots/sign_tx/burn_reject/nanosp/00001.png delete mode 100644 old-tests/speculos/screenshots/sign_tx/burn_reject/nanosp/00002.png delete mode 100644 old-tests/speculos/screenshots/sign_tx/burn_reject/nanosp/00003.png delete mode 100644 old-tests/speculos/screenshots/sign_tx/burn_reject/nanosp/00004.png delete mode 100644 old-tests/speculos/screenshots/sign_tx/burn_reject/nanox/00000.png delete mode 100644 old-tests/speculos/screenshots/sign_tx/burn_reject/nanox/00001.png delete mode 100644 old-tests/speculos/screenshots/sign_tx/burn_reject/nanox/00002.png delete mode 100644 old-tests/speculos/screenshots/sign_tx/burn_reject/nanox/00003.png delete mode 100644 old-tests/speculos/screenshots/sign_tx/burn_reject/nanox/00004.png delete mode 100644 old-tests/speculos/screenshots/sign_tx/burn_tx/nanos/00000.png delete mode 100644 old-tests/speculos/screenshots/sign_tx/burn_tx/nanos/00001.png delete mode 100644 old-tests/speculos/screenshots/sign_tx/burn_tx/nanos/00002.png delete mode 100644 old-tests/speculos/screenshots/sign_tx/burn_tx/nanos/00003.png delete mode 100644 old-tests/speculos/screenshots/sign_tx/burn_tx/nanosp/00000.png delete mode 100644 old-tests/speculos/screenshots/sign_tx/burn_tx/nanosp/00001.png delete mode 100644 old-tests/speculos/screenshots/sign_tx/burn_tx/nanosp/00002.png delete mode 100644 old-tests/speculos/screenshots/sign_tx/burn_tx/nanosp/00003.png delete mode 100644 old-tests/speculos/screenshots/sign_tx/burn_tx/nanox/00000.png delete mode 100644 old-tests/speculos/screenshots/sign_tx/burn_tx/nanox/00001.png delete mode 100644 old-tests/speculos/screenshots/sign_tx/burn_tx/nanox/00002.png delete mode 100644 old-tests/speculos/screenshots/sign_tx/burn_tx/nanox/00003.png delete mode 100644 old-tests/speculos/screenshots/sign_tx/sign_confirm_tx/nanos/00000.png delete mode 100644 old-tests/speculos/screenshots/sign_tx/sign_confirm_tx/nanos/00001.png delete mode 100644 old-tests/speculos/screenshots/sign_tx/sign_confirm_tx/nanos/00002.png delete mode 100644 old-tests/speculos/screenshots/sign_tx/sign_confirm_tx/nanos/00003.png delete mode 100644 old-tests/speculos/screenshots/sign_tx/sign_confirm_tx/nanosp/00000.png delete mode 100644 old-tests/speculos/screenshots/sign_tx/sign_confirm_tx/nanosp/00001.png delete mode 100644 old-tests/speculos/screenshots/sign_tx/sign_confirm_tx/nanosp/00002.png delete mode 100644 old-tests/speculos/screenshots/sign_tx/sign_confirm_tx/nanosp/00003.png delete mode 100644 old-tests/speculos/screenshots/sign_tx/sign_confirm_tx/nanox/00000.png delete mode 100644 old-tests/speculos/screenshots/sign_tx/sign_confirm_tx/nanox/00001.png delete mode 100644 old-tests/speculos/screenshots/sign_tx/sign_confirm_tx/nanox/00002.png delete mode 100644 old-tests/speculos/screenshots/sign_tx/sign_confirm_tx/nanox/00003.png delete mode 100644 old-tests/speculos/screenshots/sign_tx/sign_reject_tx/nanos/00000.png delete mode 100644 old-tests/speculos/screenshots/sign_tx/sign_reject_tx/nanos/00001.png delete mode 100644 old-tests/speculos/screenshots/sign_tx/sign_reject_tx/nanos/00002.png delete mode 100644 old-tests/speculos/screenshots/sign_tx/sign_reject_tx/nanos/00003.png delete mode 100644 old-tests/speculos/screenshots/sign_tx/sign_reject_tx/nanos/00004.png delete mode 100644 old-tests/speculos/screenshots/sign_tx/sign_reject_tx/nanosp/00000.png delete mode 100644 old-tests/speculos/screenshots/sign_tx/sign_reject_tx/nanosp/00001.png delete mode 100644 old-tests/speculos/screenshots/sign_tx/sign_reject_tx/nanosp/00002.png delete mode 100644 old-tests/speculos/screenshots/sign_tx/sign_reject_tx/nanosp/00003.png delete mode 100644 old-tests/speculos/screenshots/sign_tx/sign_reject_tx/nanosp/00004.png delete mode 100644 old-tests/speculos/screenshots/sign_tx/sign_reject_tx/nanox/00000.png delete mode 100644 old-tests/speculos/screenshots/sign_tx/sign_reject_tx/nanox/00001.png delete mode 100644 old-tests/speculos/screenshots/sign_tx/sign_reject_tx/nanox/00002.png delete mode 100644 old-tests/speculos/screenshots/sign_tx/sign_reject_tx/nanox/00003.png delete mode 100644 old-tests/speculos/screenshots/sign_tx/sign_reject_tx/nanox/00004.png delete mode 100644 old-tests/speculos/setup.cfg delete mode 100644 old-tests/speculos/test_address.py delete mode 100644 old-tests/speculos/test_configuration.py delete mode 100644 old-tests/speculos/test_pubkey.py delete mode 100644 old-tests/speculos/test_sign_message.py delete mode 100644 old-tests/speculos/test_sign_tx.py delete mode 100644 old-tests/src/main.rs diff --git a/old-tests/.gitignore b/old-tests/.gitignore deleted file mode 100644 index b83d222..0000000 --- a/old-tests/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/target/ diff --git a/old-tests/Cargo.lock b/old-tests/Cargo.lock deleted file mode 100644 index 8bb05ac..0000000 --- a/old-tests/Cargo.lock +++ /dev/null @@ -1,2097 +0,0 @@ -# This file is automatically @generated by Cargo. -# It is not intended for manual editing. -version = 3 - -[[package]] -name = "addr2line" -version = "0.21.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" -dependencies = [ - "gimli", -] - -[[package]] -name = "adler" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" - -[[package]] -name = "aead" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d122413f284cf2d62fb1b7db97e02edb8cda96d769b16e443a4f6195e35662b0" -dependencies = [ - "crypto-common", - "generic-array", -] - -[[package]] -name = "ahash" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcb51a0695d8f838b1ee009b3fbf66bda078cd64590202a864a8f3e8c4315c47" -dependencies = [ - "getrandom", - "once_cell", - "version_check", -] - -[[package]] -name = "ahash" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c99f64d1e06488f620f932677e24bc6e2897582980441ae90a671415bd7ec2f" -dependencies = [ - "cfg-if", - "getrandom", - "once_cell", - "version_check", -] - -[[package]] -name = "anstream" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1f58811cfac344940f1a400b6e6231ce35171f614f26439e80f8c1465c5cc0c" -dependencies = [ - "anstyle", - "anstyle-parse", - "anstyle-query", - "anstyle-wincon", - "colorchoice", - "utf8parse", -] - -[[package]] -name = "anstyle" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b84bf0a05bbb2a83e5eb6fa36bb6e87baa08193c35ff52bbf6b38d8af2890e46" - -[[package]] -name = "anstyle-parse" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "938874ff5980b03a87c5524b3ae5b59cf99b1d6bc836848df7bc5ada9643c333" -dependencies = [ - "utf8parse", -] - -[[package]] -name = "anstyle-query" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ca11d4be1bab0c8bc8734a9aa7bf4ee8316d462a08c6ac5052f888fef5b494b" -dependencies = [ - "windows-sys 0.48.0", -] - -[[package]] -name = "anstyle-wincon" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58f54d10c6dfa51283a066ceab3ec1ab78d13fae00aa49243a45e4571fb79dfd" -dependencies = [ - "anstyle", - "windows-sys 0.48.0", -] - -[[package]] -name = "anyhow" -version = "1.0.75" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4668cab20f66d8d020e1fbc0ebe47217433c1b6c8f2040faf858554e394ace6" - -[[package]] -name = "arrayref" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b4930d2cb77ce62f89ee5d5289b4ac049559b1c45539271f5ed4fdc7db34545" - -[[package]] -name = "arrayvec" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" - -[[package]] -name = "async-trait" -version = "0.1.73" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc00ceb34980c03614e35a3a4e218276a0a824e911d07651cd0d858a51e8c0f0" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.32", -] - -[[package]] -name = "autocfg" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" - -[[package]] -name = "backtrace" -version = "0.3.69" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2089b7e3f35b9dd2d0ed921ead4f6d318c27680d4a5bd167b3ee120edb105837" -dependencies = [ - "addr2line", - "cc", - "cfg-if", - "libc", - "miniz_oxide", - "object", - "rustc-demangle", -] - -[[package]] -name = "base58" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5024ee8015f02155eee35c711107ddd9a9bf3cb689cf2a9089c97e79b6e1ae83" - -[[package]] -name = "base64" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" - -[[package]] -name = "base64" -version = "0.21.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ba43ea6f343b788c8764558649e08df62f86c6ef251fdaeb1ffd010a9ae50a2" - -[[package]] -name = "base64ct" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a32fd6af2b5827bce66c29053ba0e7c42b9dcab01835835058558c10851a46b" - -[[package]] -name = "bigdecimal" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "454bca3db10617b88b566f205ed190aedb0e0e6dd4cad61d3988a72e8c5594cb" -dependencies = [ - "autocfg", - "libm", - "num-bigint", - "num-integer", - "num-traits", -] - -[[package]] -name = "bitflags" -version = "1.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" - -[[package]] -name = "bitflags" -version = "2.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4682ae6287fcf752ecaabbfcc7b6f9b72aa33933dc23a554d853aea8eea8635" - -[[package]] -name = "bitvec" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" -dependencies = [ - "funty", - "radium", - "tap", - "wyz", -] - -[[package]] -name = "block-buffer" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" -dependencies = [ - "generic-array", -] - -[[package]] -name = "borsh" -version = "0.10.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4114279215a005bc675e386011e594e1d9b800918cea18fcadadcce864a2046b" -dependencies = [ - "borsh-derive", - "hashbrown 0.13.2", -] - -[[package]] -name = "borsh-derive" -version = "0.10.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0754613691538d51f329cce9af41d7b7ca150bc973056f1156611489475f54f7" -dependencies = [ - "borsh-derive-internal", - "borsh-schema-derive-internal", - "proc-macro-crate", - "proc-macro2", - "syn 1.0.109", -] - -[[package]] -name = "borsh-derive-internal" -version = "0.10.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "afb438156919598d2c7bad7e1c0adf3d26ed3840dbc010db1a882a65583ca2fb" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "borsh-schema-derive-internal" -version = "0.10.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "634205cc43f74a1b9046ef87c4540ebda95696ec0f315024860cad7c5b0f5ccd" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "bytecheck" -version = "0.6.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b6372023ac861f6e6dc89c8344a8f398fb42aaba2b5dbc649ca0c0e9dbcb627" -dependencies = [ - "bytecheck_derive", - "ptr_meta", - "simdutf8", -] - -[[package]] -name = "bytecheck_derive" -version = "0.6.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7ec4c6f261935ad534c0c22dbef2201b45918860eb1c574b972bd213a76af61" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "byteorder" -version = "1.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" - -[[package]] -name = "bytes" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223" - -[[package]] -name = "cc" -version = "1.0.83" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" -dependencies = [ - "libc", -] - -[[package]] -name = "cfg-if" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" - -[[package]] -name = "chacha20" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3613f74bd2eac03dad61bd53dbe620703d4371614fe0bc3b9f04dd36fe4e818" -dependencies = [ - "cfg-if", - "cipher", - "cpufeatures", -] - -[[package]] -name = "chacha20poly1305" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10cd79432192d1c0f4e1a0fef9527696cc039165d729fb41b3f4f4f354c2dc35" -dependencies = [ - "aead", - "chacha20", - "cipher", - "poly1305", - "zeroize", -] - -[[package]] -name = "cipher" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" -dependencies = [ - "crypto-common", - "inout", - "zeroize", -] - -[[package]] -name = "clap" -version = "4.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a13b88d2c62ff462f88e4a121f17a82c1af05693a2f192b5c38d14de73c19f6" -dependencies = [ - "clap_builder", - "clap_derive", -] - -[[package]] -name = "clap_builder" -version = "4.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2bb9faaa7c2ef94b2743a21f5a29e6f0010dff4caa69ac8e9d6cf8b6fa74da08" -dependencies = [ - "anstream", - "anstyle", - "clap_lex", - "strsim", -] - -[[package]] -name = "clap_derive" -version = "4.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0862016ff20d69b84ef8247369fabf5c008a7417002411897d40ee1f4532b873" -dependencies = [ - "heck", - "proc-macro2", - "quote", - "syn 2.0.32", -] - -[[package]] -name = "clap_lex" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd7cc57abe963c6d3b9d8be5b06ba7c8957a930305ca90304f24ef040aa6f961" - -[[package]] -name = "colorchoice" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" - -[[package]] -name = "console" -version = "0.15.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c926e00cc70edefdc64d3a5ff31cc65bb97a3460097762bd23afb4d8145fccf8" -dependencies = [ - "encode_unicode", - "lazy_static", - "libc", - "unicode-width", - "windows-sys 0.45.0", -] - -[[package]] -name = "countme" -version = "3.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7704b5fdd17b18ae31c4c1da5a2e0305a2bf17b5249300a9ee9ed7b72114c636" - -[[package]] -name = "cpufeatures" -version = "0.2.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a17b76ff3a4162b0b27f354a0c87015ddad39d35f9c0c36607a3bdd175dde1f1" -dependencies = [ - "libc", -] - -[[package]] -name = "crc" -version = "3.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86ec7a15cbe22e59248fc7eadb1907dab5ba09372595da4d73dd805ed4417dfe" -dependencies = [ - "crc-catalog", -] - -[[package]] -name = "crc-catalog" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cace84e55f07e7301bae1c519df89cdad8cc3cd868413d3fdbdeca9ff3db484" - -[[package]] -name = "crunchy" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" - -[[package]] -name = "crypto-common" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" -dependencies = [ - "generic-array", - "rand_core", - "typenum", -] - -[[package]] -name = "crypto-mac" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b584a330336237c1eecd3e94266efb216c56ed91225d634cb2991c5f3fd1aeab" -dependencies = [ - "generic-array", - "subtle", -] - -[[package]] -name = "crypto-mac" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1d1a86f49236c215f271d40892d5fc950490551400b02ef360692c29815c714" -dependencies = [ - "generic-array", - "subtle", -] - -[[package]] -name = "curve25519-dalek-ng" -version = "4.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c359b7249347e46fb28804470d071c921156ad62b3eef5d34e2ba867533dec8" -dependencies = [ - "byteorder", - "digest", - "rand_core", - "subtle-ng", - "zeroize", -] - -[[package]] -name = "dashmap" -version = "5.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "978747c1d849a7d2ee5e8adc0159961c48fb7e5db2f06af6723b80123bb53856" -dependencies = [ - "cfg-if", - "hashbrown 0.14.0", - "lock_api", - "once_cell", - "parking_lot_core", -] - -[[package]] -name = "dialoguer" -version = "0.10.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59c6f2989294b9a498d3ad5491a79c6deb604617378e1cdc4bfc1c1361fe2f87" -dependencies = [ - "console", - "shell-words", - "tempfile", - "zeroize", -] - -[[package]] -name = "digest" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" -dependencies = [ - "generic-array", -] - -[[package]] -name = "downcast-rs" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ea835d29036a4087793836fa931b08837ad5e957da9e23886b29586fb9b6650" - -[[package]] -name = "dyn-clone" -version = "1.0.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bbfc4744c1b8f2a09adc0e55242f60b1af195d88596bd8700be74418c056c555" - -[[package]] -name = "ed25519" -version = "1.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91cff35c70bba8a626e3185d8cd48cc11b5437e1a5bcd15b9b5fa3c64b6dfee7" -dependencies = [ - "signature", -] - -[[package]] -name = "ed25519-dalek" -version = "1.0.1" -source = "git+https://github.com/broxus/ed25519-dalek.git#e5d68fd1490a7f6a0d473c6c1b1acef868960471" -dependencies = [ - "curve25519-dalek-ng", - "ed25519", - "rand", - "serde", - "sha2", - "zeroize", -] - -[[package]] -name = "either" -version = "1.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" - -[[package]] -name = "encode_unicode" -version = "0.3.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831f" - -[[package]] -name = "errno" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "136526188508e25c6fef639d7927dfb3e0e3084488bf202267829cf7fc23dbdd" -dependencies = [ - "errno-dragonfly", - "libc", - "windows-sys 0.48.0", -] - -[[package]] -name = "errno-dragonfly" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf" -dependencies = [ - "cc", - "libc", -] - -[[package]] -name = "everscale-ledger-wallet" -version = "0.1.0" -source = "git+https://github.com/broxus/everscale-ledger-wallet.git#3e8b56fd9238c46b7da62bc8c58cb62c7d80fa8d" -dependencies = [ - "anyhow", - "console", - "dialoguer", - "ed25519-dalek", - "hex", - "hidapi", - "log", - "num-derive", - "num-traits", - "parking_lot", - "qstring", - "semver", - "thiserror", - "uriparse", -] - -[[package]] -name = "fastrand" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6999dc1837253364c2ebb0704ba97994bd874e8f195d665c50b7548f6ea92764" - -[[package]] -name = "fnv" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" - -[[package]] -name = "form_urlencoded" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a62bc1cf6f830c2ec14a513a9fb124d0a213a629668a4186f329db21fe045652" -dependencies = [ - "percent-encoding", -] - -[[package]] -name = "funty" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" - -[[package]] -name = "futures-core" -version = "0.3.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4bca583b7e26f571124fe5b7561d49cb2868d79116cfa0eefce955557c6fee8c" - -[[package]] -name = "futures-macro" -version = "0.3.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.32", -] - -[[package]] -name = "futures-task" -version = "0.3.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76d3d132be6c0e6aa1534069c705a74a5997a356c0dc2f86a47765e5617c5b65" - -[[package]] -name = "futures-util" -version = "0.3.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26b01e40b772d54cf6c6d721c1d1abd0647a0106a12ecaa1c186273392a69533" -dependencies = [ - "futures-core", - "futures-macro", - "futures-task", - "pin-project-lite", - "pin-utils", - "slab", -] - -[[package]] -name = "generic-array" -version = "0.14.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" -dependencies = [ - "typenum", - "version_check", -] - -[[package]] -name = "getrandom" -version = "0.2.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be4136b2a15dd319360be1c07d9933517ccf0be8f16bf62a3bee4f0d618df427" -dependencies = [ - "cfg-if", - "libc", - "wasi", -] - -[[package]] -name = "gimli" -version = "0.28.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fb8d784f27acf97159b40fc4db5ecd8aa23b9ad5ef69cdd136d3bc80665f0c0" - -[[package]] -name = "hashbrown" -version = "0.12.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" -dependencies = [ - "ahash 0.7.6", -] - -[[package]] -name = "hashbrown" -version = "0.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" -dependencies = [ - "ahash 0.8.3", -] - -[[package]] -name = "hashbrown" -version = "0.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2c6201b9ff9fd90a5a3bac2e56a830d0caa509576f0e503818ee82c181b3437a" - -[[package]] -name = "heck" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" - -[[package]] -name = "hermit-abi" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "443144c8cdadd93ebf52ddb4056d257f5b52c04d3c804e657d19eb73fc33668b" - -[[package]] -name = "hex" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" - -[[package]] -name = "hidapi" -version = "2.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "723777263b0dcc5730aec947496bd8c3940ba63c15f5633b288cc615f4f6af79" -dependencies = [ - "cc", - "libc", - "pkg-config", - "winapi", -] - -[[package]] -name = "hmac" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "126888268dcc288495a26bf004b38c5fdbb31682f992c84ceb046a1f0fe38840" -dependencies = [ - "crypto-mac 0.8.0", - "digest", -] - -[[package]] -name = "hmac" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a2a2320eb7ec0ebe8da8f744d7812d9fc4cb4d09344ac01898dbcb6a20ae69b" -dependencies = [ - "crypto-mac 0.11.1", - "digest", -] - -[[package]] -name = "hmac-drbg" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17ea0a1394df5b6574da6e0c1ade9e78868c9fb0a4e5ef4428e32da4676b85b1" -dependencies = [ - "digest", - "generic-array", - "hmac 0.8.1", -] - -[[package]] -name = "idna" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d20d6b07bfbc108882d88ed8e37d39636dcc260e15e30c45e6ba089610b917c" -dependencies = [ - "unicode-bidi", - "unicode-normalization", -] - -[[package]] -name = "inout" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0c10553d664a4d0bcff9f4215d0aac67a639cc68ef660840afe309b807bc9f5" -dependencies = [ - "generic-array", -] - -[[package]] -name = "itoa" -version = "1.0.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38" - -[[package]] -name = "lazy_static" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" - -[[package]] -name = "ledger-app-everscale-tests" -version = "0.1.0" -dependencies = [ - "anyhow", - "base64 0.21.4", - "bigdecimal", - "clap", - "ed25519-dalek", - "everscale-ledger-wallet", - "hex", - "nekoton", - "nekoton-abi", - "nekoton-contracts", - "nekoton-utils", - "rust_decimal", - "tokio", - "ton_block", - "ton_types", - "url", -] - -[[package]] -name = "libc" -version = "0.2.147" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3" - -[[package]] -name = "libm" -version = "0.2.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7012b1bbb0719e1097c47611d3898568c546d597c2e74d66f6087edd5233ff4" - -[[package]] -name = "libsecp256k1" -version = "0.7.0" -source = "git+https://github.com/broxus/libsecp256k1.git#fae765aa1a0de4f0c7b7b386d0d46475943291b2" -dependencies = [ - "arrayref", - "base64 0.13.1", - "digest", - "hmac-drbg", - "libsecp256k1-core", - "libsecp256k1-gen-ecmult", - "libsecp256k1-gen-genmult", - "rand", - "serde", - "sha2", - "typenum", -] - -[[package]] -name = "libsecp256k1-core" -version = "0.3.0" -source = "git+https://github.com/broxus/libsecp256k1.git#fae765aa1a0de4f0c7b7b386d0d46475943291b2" -dependencies = [ - "crunchy", - "digest", - "subtle", -] - -[[package]] -name = "libsecp256k1-gen-ecmult" -version = "0.3.0" -source = "git+https://github.com/broxus/libsecp256k1.git#fae765aa1a0de4f0c7b7b386d0d46475943291b2" -dependencies = [ - "libsecp256k1-core", -] - -[[package]] -name = "libsecp256k1-gen-genmult" -version = "0.3.0" -source = "git+https://github.com/broxus/libsecp256k1.git#fae765aa1a0de4f0c7b7b386d0d46475943291b2" -dependencies = [ - "libsecp256k1-core", -] - -[[package]] -name = "linux-raw-sys" -version = "0.4.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a9bad9f94746442c783ca431b22403b519cd7fbeed0533fdd6328b2f2212128" - -[[package]] -name = "lock_api" -version = "0.4.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1cc9717a20b1bb222f333e6a92fd32f7d8a18ddc5a3191a11af45dcbf4dcd16" -dependencies = [ - "autocfg", - "scopeguard", -] - -[[package]] -name = "log" -version = "0.4.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f" - -[[package]] -name = "lru" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6e8aaa3f231bb4bd57b84b2d5dc3ae7f350265df8aa96492e0bc394a1571909" -dependencies = [ - "hashbrown 0.12.3", -] - -[[package]] -name = "memchr" -version = "2.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f232d6ef707e1956a43342693d2a31e72989554d58299d7a88738cc95b0d35c" - -[[package]] -name = "memzero" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93c0d11ac30a033511ae414355d80f70d9f29a44a49140face477117a1ee90db" - -[[package]] -name = "miniz_oxide" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7" -dependencies = [ - "adler", -] - -[[package]] -name = "nekoton" -version = "0.13.1" -source = "git+https://github.com/broxus/nekoton.git#d70dd09d4d482987541f1816fd3bce970710178c" -dependencies = [ - "anyhow", - "async-trait", - "base64 0.13.1", - "chacha20poly1305", - "curve25519-dalek-ng", - "downcast-rs", - "dyn-clone", - "ed25519-dalek", - "futures-util", - "getrandom", - "hex", - "hmac 0.11.0", - "log", - "lru", - "nekoton-abi", - "nekoton-contracts", - "nekoton-utils", - "num-bigint", - "once_cell", - "parking_lot", - "pbkdf2", - "quick_cache", - "rand", - "secstr", - "serde", - "serde_json", - "sha2", - "thiserror", - "tiny-bip39", - "tiny-hderive", - "tokio", - "ton_abi", - "ton_block", - "ton_executor", - "ton_types", - "zeroize", -] - -[[package]] -name = "nekoton-abi" -version = "0.13.0" -source = "git+https://github.com/broxus/nekoton.git#d70dd09d4d482987541f1816fd3bce970710178c" -dependencies = [ - "anyhow", - "base64 0.13.1", - "ed25519-dalek", - "hex", - "log", - "nekoton-derive", - "nekoton-utils", - "num-bigint", - "num-traits", - "once_cell", - "rustc-hash", - "serde", - "serde_json", - "smallvec", - "thiserror", - "ton_abi", - "ton_block", - "ton_executor", - "ton_types", - "ton_vm", -] - -[[package]] -name = "nekoton-contracts" -version = "0.13.0" -source = "git+https://github.com/broxus/nekoton.git#d70dd09d4d482987541f1816fd3bce970710178c" -dependencies = [ - "anyhow", - "nekoton-abi", - "once_cell", - "thiserror", - "ton_abi", - "ton_block", - "ton_types", -] - -[[package]] -name = "nekoton-derive" -version = "0.13.0" -source = "git+https://github.com/broxus/nekoton.git#d70dd09d4d482987541f1816fd3bce970710178c" -dependencies = [ - "either", - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "nekoton-utils" -version = "0.13.0" -source = "git+https://github.com/broxus/nekoton.git#d70dd09d4d482987541f1816fd3bce970710178c" -dependencies = [ - "anyhow", - "base64 0.13.1", - "chacha20poly1305", - "ed25519-dalek", - "hex", - "hmac 0.11.0", - "pbkdf2", - "secstr", - "serde", - "sha2", - "thiserror", - "ton_block", - "ton_types", - "zeroize", -] - -[[package]] -name = "num" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b05180d69e3da0e530ba2a1dae5110317e49e3b7f3d41be227dc5f92e49ee7af" -dependencies = [ - "num-bigint", - "num-complex", - "num-integer", - "num-iter", - "num-rational", - "num-traits", -] - -[[package]] -name = "num-bigint" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "608e7659b5c3d7cba262d894801b9ec9d00de989e8a82bd4bef91d08da45cdc0" -dependencies = [ - "autocfg", - "num-integer", - "num-traits", -] - -[[package]] -name = "num-complex" -version = "0.4.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ba157ca0885411de85d6ca030ba7e2a83a28636056c7c699b07c8b6f7383214" -dependencies = [ - "num-traits", -] - -[[package]] -name = "num-derive" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "876a53fff98e03a936a674b29568b0e605f06b29372c2489ff4de23f1949743d" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "num-integer" -version = "0.1.45" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" -dependencies = [ - "autocfg", - "num-traits", -] - -[[package]] -name = "num-iter" -version = "0.1.43" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d03e6c028c5dc5cac6e2dec0efda81fc887605bb3d884578bb6d6bf7514e252" -dependencies = [ - "autocfg", - "num-integer", - "num-traits", -] - -[[package]] -name = "num-rational" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0638a1c9d0a3c0914158145bc76cff373a75a627e6ecbfb71cbe6f453a5a19b0" -dependencies = [ - "autocfg", - "num-bigint", - "num-integer", - "num-traits", -] - -[[package]] -name = "num-traits" -version = "0.2.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f30b0abd723be7e2ffca1272140fac1a2f084c77ec3e123c192b66af1ee9e6c2" -dependencies = [ - "autocfg", -] - -[[package]] -name = "num_cpus" -version = "1.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" -dependencies = [ - "hermit-abi", - "libc", -] - -[[package]] -name = "object" -version = "0.32.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cf5f9dd3933bd50a9e1f149ec995f39ae2c496d31fd772c1fd45ebc27e902b0" -dependencies = [ - "memchr", -] - -[[package]] -name = "once_cell" -version = "1.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" -dependencies = [ - "parking_lot_core", -] - -[[package]] -name = "opaque-debug" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" - -[[package]] -name = "parking_lot" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" -dependencies = [ - "lock_api", - "parking_lot_core", -] - -[[package]] -name = "parking_lot_core" -version = "0.9.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93f00c865fe7cabf650081affecd3871070f26767e7b2070a3ffae14c654b447" -dependencies = [ - "cfg-if", - "libc", - "redox_syscall", - "smallvec", - "windows-targets 0.48.5", -] - -[[package]] -name = "password-hash" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d791538a6dcc1e7cb7fe6f6b58aca40e7f79403c45b2bc274008b5e647af1d8" -dependencies = [ - "base64ct", - "rand_core", - "subtle", -] - -[[package]] -name = "pbkdf2" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f05894bce6a1ba4be299d0c5f29563e08af2bc18bb7d48313113bed71e904739" -dependencies = [ - "crypto-mac 0.11.1", - "hmac 0.11.0", - "password-hash", - "sha2", -] - -[[package]] -name = "percent-encoding" -version = "2.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94" - -[[package]] -name = "pin-project-lite" -version = "0.2.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58" - -[[package]] -name = "pin-utils" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" - -[[package]] -name = "pkg-config" -version = "0.3.27" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26072860ba924cbfa98ea39c8c19b4dd6a4a25423dbdf219c1eca91aa0cf6964" - -[[package]] -name = "poly1305" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8159bd90725d2df49889a078b54f4f79e87f1f8a8444194cdca81d38f5393abf" -dependencies = [ - "cpufeatures", - "opaque-debug", - "universal-hash", -] - -[[package]] -name = "ppv-lite86" -version = "0.2.17" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" - -[[package]] -name = "proc-macro-crate" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d6ea3c4595b96363c13943497db34af4460fb474a95c43f4446ad341b8c9785" -dependencies = [ - "toml", -] - -[[package]] -name = "proc-macro2" -version = "1.0.66" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18fb31db3f9bddb2ea821cde30a9f70117e3f119938b5ee630b7403aa6e2ead9" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "ptr_meta" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0738ccf7ea06b608c10564b31debd4f5bc5e197fc8bfe088f68ae5ce81e7a4f1" -dependencies = [ - "ptr_meta_derive", -] - -[[package]] -name = "ptr_meta_derive" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "16b845dbfca988fa33db069c0e230574d15a3088f147a87b64c7589eb662c9ac" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "qstring" -version = "0.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d464fae65fff2680baf48019211ce37aaec0c78e9264c84a3e484717f965104e" -dependencies = [ - "percent-encoding", -] - -[[package]] -name = "quick_cache" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5253a3a0d56548d5b0be25414171dc780cc6870727746d05bd2bde352eee96c5" -dependencies = [ - "ahash 0.8.3", - "hashbrown 0.13.2", - "parking_lot", -] - -[[package]] -name = "quote" -version = "1.0.33" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae" -dependencies = [ - "proc-macro2", -] - -[[package]] -name = "radium" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" - -[[package]] -name = "rand" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" -dependencies = [ - "libc", - "rand_chacha", - "rand_core", -] - -[[package]] -name = "rand_chacha" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" -dependencies = [ - "ppv-lite86", - "rand_core", -] - -[[package]] -name = "rand_core" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" -dependencies = [ - "getrandom", -] - -[[package]] -name = "redox_syscall" -version = "0.3.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" -dependencies = [ - "bitflags 1.3.2", -] - -[[package]] -name = "rend" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "581008d2099240d37fb08d77ad713bcaec2c4d89d50b5b21a8bb1996bbab68ab" -dependencies = [ - "bytecheck", -] - -[[package]] -name = "rkyv" -version = "0.7.42" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0200c8230b013893c0b2d6213d6ec64ed2b9be2e0e016682b7224ff82cff5c58" -dependencies = [ - "bitvec", - "bytecheck", - "hashbrown 0.12.3", - "ptr_meta", - "rend", - "rkyv_derive", - "seahash", - "tinyvec", - "uuid", -] - -[[package]] -name = "rkyv_derive" -version = "0.7.42" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2e06b915b5c230a17d7a736d1e2e63ee753c256a8614ef3f5147b13a4f5541d" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "rust_decimal" -version = "1.32.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4c4216490d5a413bc6d10fa4742bd7d4955941d062c0ef873141d6b0e7b30fd" -dependencies = [ - "arrayvec", - "borsh", - "bytes", - "num-traits", - "rand", - "rkyv", - "serde", - "serde_json", -] - -[[package]] -name = "rustc-demangle" -version = "0.1.23" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" - -[[package]] -name = "rustc-hash" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" - -[[package]] -name = "rustix" -version = "0.38.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7db8590df6dfcd144d22afd1b83b36c21a18d7cbc1dc4bb5295a8712e9eb662" -dependencies = [ - "bitflags 2.4.0", - "errno", - "libc", - "linux-raw-sys", - "windows-sys 0.48.0", -] - -[[package]] -name = "ryu" -version = "1.0.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741" - -[[package]] -name = "scopeguard" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" - -[[package]] -name = "seahash" -version = "4.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c107b6f4780854c8b126e228ea8869f4d7b71260f962fefb57b996b8959ba6b" - -[[package]] -name = "secstr" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e04f657244f605c4cf38f6de5993e8bd050c8a303f86aeabff142d5c7c113e12" -dependencies = [ - "libc", - "serde", -] - -[[package]] -name = "semver" -version = "1.0.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0293b4b29daaf487284529cc2f5675b8e57c61f70167ba415a463651fd6a918" - -[[package]] -name = "serde" -version = "1.0.188" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf9e0fcba69a370eed61bcf2b728575f726b50b55cba78064753d708ddc7549e" -dependencies = [ - "serde_derive", -] - -[[package]] -name = "serde_derive" -version = "1.0.188" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4eca7ac642d82aa35b60049a6eccb4be6be75e599bd2e9adb5f875a737654af2" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.32", -] - -[[package]] -name = "serde_json" -version = "1.0.106" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2cc66a619ed80bf7a0f6b17dd063a84b88f6dea1813737cf469aef1d081142c2" -dependencies = [ - "itoa", - "ryu", - "serde", -] - -[[package]] -name = "sha2" -version = "0.9.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800" -dependencies = [ - "block-buffer", - "cfg-if", - "cpufeatures", - "digest", - "opaque-debug", -] - -[[package]] -name = "shell-words" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24188a676b6ae68c3b2cb3a01be17fbf7240ce009799bb56d5b1409051e78fde" - -[[package]] -name = "signature" -version = "1.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74233d3b3b2f6d4b006dc19dee745e73e2a6bfb6f93607cd3b02bd5b00797d7c" - -[[package]] -name = "simdutf8" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f27f6278552951f1f2b8cf9da965d10969b2efdea95a6ec47987ab46edfe263a" - -[[package]] -name = "slab" -version = "0.4.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" -dependencies = [ - "autocfg", -] - -[[package]] -name = "smallvec" -version = "1.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62bb4feee49fdd9f707ef802e22365a35de4b7b299de4763d44bfea899442ff9" - -[[package]] -name = "strsim" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" - -[[package]] -name = "subtle" -version = "2.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601" - -[[package]] -name = "subtle-ng" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "734676eb262c623cec13c3155096e08d1f8f29adce39ba17948b18dad1e54142" - -[[package]] -name = "syn" -version = "1.0.109" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "syn" -version = "2.0.32" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "239814284fd6f1a4ffe4ca893952cdd93c224b6a1571c9a9eadd670295c0c9e2" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "tap" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" - -[[package]] -name = "tempfile" -version = "3.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb94d2f3cc536af71caac6b6fcebf65860b347e7ce0cc9ebe8f70d3e521054ef" -dependencies = [ - "cfg-if", - "fastrand", - "redox_syscall", - "rustix", - "windows-sys 0.48.0", -] - -[[package]] -name = "thiserror" -version = "1.0.48" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d6d7a740b8a666a7e828dd00da9c0dc290dff53154ea77ac109281de90589b7" -dependencies = [ - "thiserror-impl", -] - -[[package]] -name = "thiserror-impl" -version = "1.0.48" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49922ecae66cc8a249b77e68d1d0623c1b2c514f0060c27cdc68bd62a1219d35" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.32", -] - -[[package]] -name = "tiny-bip39" -version = "0.8.0" -source = "git+https://github.com/broxus/tiny-bip39.git#d2a73124c2fbead4f969f8a5e075ee22040f63cc" -dependencies = [ - "anyhow", - "hmac 0.11.0", - "once_cell", - "pbkdf2", - "rand", - "rustc-hash", - "sha2", - "thiserror", - "unicode-normalization", - "zeroize", -] - -[[package]] -name = "tiny-hderive" -version = "0.3.0" -source = "git+https://github.com/broxus/tiny-hderive.git#050986d85711497076ba552ce53806885274a4d2" -dependencies = [ - "base58", - "hmac 0.11.0", - "libsecp256k1", - "memzero", - "sha2", -] - -[[package]] -name = "tinyvec" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" -dependencies = [ - "tinyvec_macros", -] - -[[package]] -name = "tinyvec_macros" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" - -[[package]] -name = "tokio" -version = "1.32.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17ed6077ed6cd6c74735e21f37eb16dc3935f96878b1fe961074089cc80893f9" -dependencies = [ - "backtrace", - "num_cpus", - "pin-project-lite", - "tokio-macros", -] - -[[package]] -name = "tokio-macros" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "630bdcf245f78637c13ec01ffae6187cca34625e8c63150d424b59e55af2675e" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.32", -] - -[[package]] -name = "toml" -version = "0.5.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234" -dependencies = [ - "serde", -] - -[[package]] -name = "ton_abi" -version = "2.1.0" -source = "git+https://github.com/broxus/ton-labs-abi#b8834529ef8fa121d534fca6554c0e95d4019998" -dependencies = [ - "anyhow", - "base64 0.13.1", - "byteorder", - "ed25519", - "ed25519-dalek", - "hex", - "num-bigint", - "num-traits", - "serde", - "serde_json", - "sha2", - "smallvec", - "thiserror", - "ton_block", - "ton_types", -] - -[[package]] -name = "ton_block" -version = "1.9.73" -source = "git+https://github.com/broxus/ton-labs-block#66b3ccb8e6187e6d9f611f6541c0f59d3eb77cbf" -dependencies = [ - "anyhow", - "base64 0.13.1", - "crc", - "ed25519", - "ed25519-dalek", - "hex", - "log", - "num", - "num-traits", - "rand", - "rustc-hash", - "sha2", - "smallvec", - "thiserror", - "ton_types", -] - -[[package]] -name = "ton_executor" -version = "1.15.54" -source = "git+https://github.com/broxus/ton-labs-executor#2a38890d53f9c3dad84b3fb9a58e3bb62ba20f44" -dependencies = [ - "anyhow", - "log", - "thiserror", - "ton_block", - "ton_types", - "ton_vm", -] - -[[package]] -name = "ton_types" -version = "1.10.2" -source = "git+https://github.com/broxus/ton-labs-types#3324562d7ff1ebec66d996128573966c1b53862b" -dependencies = [ - "anyhow", - "base64 0.13.1", - "countme", - "crc", - "dashmap", - "hex", - "log", - "num", - "num-derive", - "num-traits", - "rand", - "rustc-hash", - "sha2", - "smallvec", - "thiserror", -] - -[[package]] -name = "ton_vm" -version = "1.8.29" -source = "git+https://github.com/broxus/ton-labs-vm.git#497865fb3aabf02afea610f9c16f265b492c23a6" -dependencies = [ - "anyhow", - "ed25519", - "ed25519-dalek", - "hex", - "lazy_static", - "log", - "num", - "num-traits", - "rand", - "sha2", - "smallvec", - "thiserror", - "ton_block", - "ton_types", -] - -[[package]] -name = "typenum" -version = "1.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba" - -[[package]] -name = "unicode-bidi" -version = "0.3.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460" - -[[package]] -name = "unicode-ident" -version = "1.0.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "301abaae475aa91687eb82514b328ab47a211a533026cb25fc3e519b86adfc3c" - -[[package]] -name = "unicode-normalization" -version = "0.1.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" -dependencies = [ - "tinyvec", -] - -[[package]] -name = "unicode-width" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0edd1e5b14653f783770bce4a4dabb4a5108a5370a5f5d8cfe8710c361f6c8b" - -[[package]] -name = "universal-hash" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc1de2c688dc15305988b563c3854064043356019f97a4b46276fe734c4f07ea" -dependencies = [ - "crypto-common", - "subtle", -] - -[[package]] -name = "uriparse" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0200d0fc04d809396c2ad43f3c95da3582a2556eba8d453c1087f4120ee352ff" -dependencies = [ - "fnv", - "lazy_static", -] - -[[package]] -name = "url" -version = "2.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "143b538f18257fac9cad154828a57c6bf5157e1aa604d4816b5995bf6de87ae5" -dependencies = [ - "form_urlencoded", - "idna", - "percent-encoding", -] - -[[package]] -name = "utf8parse" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" - -[[package]] -name = "uuid" -version = "1.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79daa5ed5740825c40b389c5e50312b9c86df53fccd33f281df655642b43869d" - -[[package]] -name = "version_check" -version = "0.9.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" - -[[package]] -name = "wasi" -version = "0.11.0+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" - -[[package]] -name = "winapi" -version = "0.3.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" -dependencies = [ - "winapi-i686-pc-windows-gnu", - "winapi-x86_64-pc-windows-gnu", -] - -[[package]] -name = "winapi-i686-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" - -[[package]] -name = "winapi-x86_64-pc-windows-gnu" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" - -[[package]] -name = "windows-sys" -version = "0.45.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" -dependencies = [ - "windows-targets 0.42.2", -] - -[[package]] -name = "windows-sys" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" -dependencies = [ - "windows-targets 0.48.5", -] - -[[package]] -name = "windows-targets" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" -dependencies = [ - "windows_aarch64_gnullvm 0.42.2", - "windows_aarch64_msvc 0.42.2", - "windows_i686_gnu 0.42.2", - "windows_i686_msvc 0.42.2", - "windows_x86_64_gnu 0.42.2", - "windows_x86_64_gnullvm 0.42.2", - "windows_x86_64_msvc 0.42.2", -] - -[[package]] -name = "windows-targets" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" -dependencies = [ - "windows_aarch64_gnullvm 0.48.5", - "windows_aarch64_msvc 0.48.5", - "windows_i686_gnu 0.48.5", - "windows_i686_msvc 0.48.5", - "windows_x86_64_gnu 0.48.5", - "windows_x86_64_gnullvm 0.48.5", - "windows_x86_64_msvc 0.48.5", -] - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" - -[[package]] -name = "windows_aarch64_gnullvm" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" - -[[package]] -name = "windows_aarch64_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" - -[[package]] -name = "windows_i686_gnu" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" - -[[package]] -name = "windows_i686_gnu" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" - -[[package]] -name = "windows_i686_msvc" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" - -[[package]] -name = "windows_i686_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" - -[[package]] -name = "windows_x86_64_gnu" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" - -[[package]] -name = "windows_x86_64_gnullvm" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.42.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" - -[[package]] -name = "windows_x86_64_msvc" -version = "0.48.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" - -[[package]] -name = "wyz" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" -dependencies = [ - "tap", -] - -[[package]] -name = "zeroize" -version = "1.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a0956f1ba7c7909bfb66c2e9e4124ab6f6482560f6628b5aaeba39207c9aad9" -dependencies = [ - "zeroize_derive", -] - -[[package]] -name = "zeroize_derive" -version = "1.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.32", -] diff --git a/old-tests/Cargo.toml b/old-tests/Cargo.toml deleted file mode 100644 index fe7989b..0000000 --- a/old-tests/Cargo.toml +++ /dev/null @@ -1,30 +0,0 @@ -[package] -name = "ledger-app-everscale-tests" -version = "0.1.0" -edition = "2021" -description = "Ledger-app integration tests using Everscale tools" -authors = ["Broxus team"] - -[dependencies] -anyhow = "1.0" -base64 = "0.21.3" -bigdecimal = "0.4.1" -clap = { version = "4.0.18", features = ["derive"] } -hex = "0.4.3" -rust_decimal = "1" -tokio = { version = "1.21.2", features = ["sync", "rt-multi-thread", "macros"] } -url = { version = "2.3.1" } - -# Basic types -ed25519-dalek = { git = "https://github.com/broxus/ed25519-dalek.git" } -ton_block = { git = "https://github.com/broxus/ton-labs-block" } -ton_types = { git = "https://github.com/broxus/ton-labs-types" } - -# Ledger wallet -everscale-ledger-wallet = { git = "https://github.com/broxus/everscale-ledger-wallet.git" } - -# Nekoton SDK -nekoton = { git = "https://github.com/broxus/nekoton.git", default-features = false } -nekoton-abi = { git = "https://github.com/broxus/nekoton.git" } -nekoton-utils = { git = "https://github.com/broxus/nekoton.git" } -nekoton-contracts = { git = "https://github.com/broxus/nekoton.git" } diff --git a/old-tests/python/apps/__init__.py b/old-tests/python/apps/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/old-tests/speculos/conftest.py b/old-tests/speculos/conftest.py deleted file mode 100644 index 469d05b..0000000 --- a/old-tests/speculos/conftest.py +++ /dev/null @@ -1,40 +0,0 @@ -from pathlib import Path -import pytest - -from speculos.client import SpeculosClient - -from ledger_client.ledger_cmd import LedgerCommand - - -SCRIPT_DIR = Path(__file__).absolute().parent -API_URL = "http://127.0.0.1:5000" -#http://10.66.66.8:5000 - - -def pytest_addoption(parser): - # nanos, nanox, nanosp - parser.addoption("--model", action="store", default="nanos") - # qt: default, requires a X server - # headless: nothing is displayed - parser.addoption("--display", action="store", default="qt") - - path: str = SCRIPT_DIR.parent.parent / "bin" / "app.elf" - parser.addoption("--path", action="store", default=path) - -@pytest.fixture() -def client(pytestconfig): - file_path = pytestconfig.getoption("path") - model = pytestconfig.getoption("model") - - args = ['--log-level', 'speculos:DEBUG','--model', model, '--display', pytestconfig.getoption("display")] - with SpeculosClient(app=str(file_path), args=args) as client: - yield client - - -@pytest.fixture() -def cmd(client, pytestconfig): - yield LedgerCommand( - client=client, - debug=True, - model=pytestconfig.getoption("model"), - ) \ No newline at end of file diff --git a/old-tests/speculos/ledger_client/__init__.py b/old-tests/speculos/ledger_client/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/old-tests/speculos/ledger_client/exception/__init__.py b/old-tests/speculos/ledger_client/exception/__init__.py deleted file mode 100644 index acb2bb8..0000000 --- a/old-tests/speculos/ledger_client/exception/__init__.py +++ /dev/null @@ -1,35 +0,0 @@ -from .device_exception import DeviceException -from .errors import (UnknownDeviceError, - DenyError, - WrongP1P2Error, - WrongDataLengthError, - InsNotSupportedError, - ClaNotSupportedError, - WrongResponseLengthError, - DisplayBip32PathFailError, - DisplayAddressFailError, - DisplayAmountFailError, - WrongTxLengthError, - TxParsingFailError, - TxHashFail, - BadStateError, - SignatureFailError) - -__all__ = [ - "DeviceException", - "DenyError", - "UnknownDeviceError", - "WrongP1P2Error", - "WrongDataLengthError", - "InsNotSupportedError", - "ClaNotSupportedError", - "WrongResponseLengthError", - "DisplayBip32PathFailError", - "DisplayAddressFailError", - "DisplayAmountFailError", - "WrongTxLengthError", - "TxParsingFailError", - "TxHashFail", - "BadStateError", - "SignatureFailError" -] diff --git a/old-tests/speculos/ledger_client/exception/device_exception.py b/old-tests/speculos/ledger_client/exception/device_exception.py deleted file mode 100644 index 7cd26f2..0000000 --- a/old-tests/speculos/ledger_client/exception/device_exception.py +++ /dev/null @@ -1,38 +0,0 @@ -import enum -from typing import Dict, Any, Union - -from .errors import * - - -class DeviceException(Exception): # pylint: disable=too-few-public-methods - exc: Dict[int, Any] = { - 0x6985: DenyError, - 0x6A86: WrongP1P2Error, - 0x6A87: WrongDataLengthError, - 0x6D00: InsNotSupportedError, - 0x6E00: ClaNotSupportedError, - 0xB000: WrongResponseLengthError, - 0xB001: DisplayBip32PathFailError, - 0xB002: DisplayAddressFailError, - 0xB003: DisplayAmountFailError, - 0xB004: WrongTxLengthError, - 0xB005: TxParsingFailError, - 0xB006: TxHashFail, - 0xB007: BadStateError, - 0xB008: SignatureFailError - } - - def __new__(cls, - error_code: int, - ins: Union[int, enum.IntEnum, None] = None, - message: str = "" - ) -> Any: - error_message: str = (f"Error in {ins!r} command" - if ins else "Error in command") - - if error_code in DeviceException.exc: - return DeviceException.exc[error_code](hex(error_code), - error_message, - message) - - return UnknownDeviceError(hex(error_code), error_message, message) diff --git a/old-tests/speculos/ledger_client/exception/errors.py b/old-tests/speculos/ledger_client/exception/errors.py deleted file mode 100644 index a9a853d..0000000 --- a/old-tests/speculos/ledger_client/exception/errors.py +++ /dev/null @@ -1,58 +0,0 @@ -class UnknownDeviceError(Exception): - pass - - -class DenyError(Exception): - pass - - -class WrongP1P2Error(Exception): - pass - - -class WrongDataLengthError(Exception): - pass - - -class InsNotSupportedError(Exception): - pass - - -class ClaNotSupportedError(Exception): - pass - - -class WrongResponseLengthError(Exception): - pass - - -class DisplayBip32PathFailError(Exception): - pass - - -class DisplayAddressFailError(Exception): - pass - - -class DisplayAmountFailError(Exception): - pass - - -class WrongTxLengthError(Exception): - pass - - -class TxParsingFailError(Exception): - pass - - -class TxHashFail(Exception): - pass - - -class BadStateError(Exception): - pass - - -class SignatureFailError(Exception): - pass diff --git a/old-tests/speculos/ledger_client/ledger_cmd.py b/old-tests/speculos/ledger_client/ledger_cmd.py deleted file mode 100644 index b732c32..0000000 --- a/old-tests/speculos/ledger_client/ledger_cmd.py +++ /dev/null @@ -1,155 +0,0 @@ -from ast import List -from contextlib import contextmanager -import struct -from time import sleep -from typing import Tuple - -from speculos.client import SpeculosClient, ApduException - -from ledger_client.ledger_cmd_builder import LedgerCommandBuilder, InsType, WalletType -from ledger_client.exception import DeviceException - - -class LedgerCommand: - def __init__(self, - client: SpeculosClient, - debug: bool = False, - model: str = "nanos") -> None: - self.client = client - self.builder = LedgerCommandBuilder(debug=debug) - self.debug = debug - self.model = model - - def get_configuration(self) -> Tuple[ int, int, int]: - try: - response = self.client._apdu_exchange( - self.builder.get_configuration() - ) # type: int, bytes - except ApduException as error: - raise DeviceException(error_code=error.sw, ins=InsType.INS_GET_VERSION) - # response = MAJOR (1) || MINOR (1) || PATCH (1) - assert len(response) == 3 - major, minor, patch = struct.unpack( - "BBB", - response - ) # type: int, int, int - - return major, minor, patch - - def get_public_key(self, account: int, display: bool = False) -> str: - try: - response = self.client._apdu_exchange( - self.builder.get_public_key(account=account, display=display) - ) # type: bytes - - except ApduException as error: - raise DeviceException(error_code=error.sw, ins=InsType.INS_GET_PUBLIC_KEY) - - # response = pub_key_len (1) || - # pub_key (var) - offset: int = 0 - - pub_key_len: int = response[offset] - - offset += 1 - pubkey = response[offset:].hex() - - assert len(response) == 1 + pub_key_len - - return pubkey - - @contextmanager - def get_public_key_with_display(self, account: int, result: List, display: bool = False) -> Tuple[bytes, bytes]: - - try: - chunk: bytes = self.builder.get_public_key(account=account, display=display) - - with self.client.apdu_exchange_nowait(cla=chunk[0], ins=chunk[1], - p1=chunk[2], p2=chunk[3], - data=chunk[5:]) as exchange: - yield exchange - - response: bytes = exchange.receive() - except ApduException as error: - raise DeviceException(error_code=error.sw, ins=InsType.INS_GET_PUBLIC_KEY) - offset: int = 0 - - pub_key_len: int = response[offset] - - offset += 1 - pubkey = response[offset:].hex() - assert len(response) == 1 + pub_key_len - print("PUBKEY", pubkey) - result.append(pubkey) - - def get_address(self, account: int, wallet_type: int, display: bool = False) -> str: - try: - response = self.client._apdu_exchange( - self.builder.get_address(account=account, wallet_type=wallet_type, display=display) - ) # type: bytes - except ApduException as error: - raise DeviceException(error_code=error.sw, ins=InsType.INS_GET_ADDRESS) - - offset: int = 0 - - addr_len: int = response[offset] - - offset += 1 - address = response[offset:].hex() - - assert len(response) == 1 + addr_len - - return address - - @contextmanager - def sign_message(self, res: List, account: int, message: bytes) -> Tuple[bytes]: - try: - chunk: bytes = self.builder.sign_message(account=account, message=message) - - with self.client.apdu_exchange_nowait(cla=chunk[0], ins=chunk[1], - p1=chunk[2], p2=chunk[3], - data=chunk[5:]) as exchange: - yield exchange - - response: bytes = exchange.receive() - - except ApduException as error: - raise DeviceException(error_code=error.sw, ins=InsType.INS_SIGN) - - offset: int = 0 - signature_len: int = response[offset] - assert signature_len == 64 - - offset += 1 - signature = response[offset:] - assert len(response) == 1 + signature_len - - res.append(signature) - - - @contextmanager - def sign_tx(self, res: List, account: int, wallet_type: int, decimals: int, ticker: str, meta: struct, data: bytes) -> Tuple[bytes]: - try: - chunk: bytes = self.builder.sign_tx( - account=account, wallet_type=wallet_type, decimals=decimals, ticker=ticker, meta=meta, data=data) - - with self.client.apdu_exchange_nowait(cla=chunk[0], ins=chunk[1], - p1=chunk[2], p2=chunk[3], - data=chunk[5:]) as exchange: - yield exchange - - response: bytes = exchange.receive() - - except ApduException as error: - raise DeviceException(error_code=error.sw, ins=InsType.INS_SIGN_TX) - - offset: int = 0 - signature_len: int = response[offset] - assert signature_len == 64 - - offset += 1 - signature = response[offset:] - assert len(response) == 1 + signature_len - - res.append(signature) - diff --git a/old-tests/speculos/ledger_client/ledger_cmd_builder.py b/old-tests/speculos/ledger_client/ledger_cmd_builder.py deleted file mode 100644 index 238acc6..0000000 --- a/old-tests/speculos/ledger_client/ledger_cmd_builder.py +++ /dev/null @@ -1,243 +0,0 @@ -import enum -import logging -import struct -from typing import List, Tuple, Union, Iterator, cast - -from ledger_client.transaction import EIP712, PersonalTransaction, Transaction -#from ethereum_client.plugin import ERC20Information, Plugin -from ledger_client.utils import packed_bip32_path_from_string - -MAX_APDU_LEN: int = 255 - -def chunked(size, source): - for i in range(0, len(source), size): - yield source[i:i+size] - -def chunkify(data: bytes, chunk_len: int) -> Iterator[Tuple[bool, bytes]]: - size: int = len(data) - - if size <= chunk_len: - yield True, data - return - - chunk: int = size // chunk_len - remaining: int = size % chunk_len - offset: int = 0 - - for i in range(chunk): - yield False, data[offset:offset + chunk_len] - offset += chunk_len - - if remaining: - yield True, data[offset:] - -class InsType(enum.IntEnum): - INS_GET_PUBLIC_KEY = 0x02 - INS_GET_CONFIGURATION = 0x01 - INS_SIGN = 0x03 - INS_GET_ADDRESS = 0x04 - INS_SIGN_TX = 0x05 - - -class WalletType(enum.IntEnum): - WalletV3 = 0, - EverWallet = 1, - SafeMultisig = 2, - SafeMultisig24h = 3, - SetcodeMultisig = 4, - BridgeMultisig = 5, - Surf = 6, - Multisig2 = 7, - Multisig2_1 = 8, - - -class LedgerCommandBuilder: - """APDU command builder for the Boilerplate application. - - Parameters - ---------- - debug: bool - Whether you want to see logging or not. - - Attributes - ---------- - debug: bool - Whether you want to see logging or not. - - """ - CLA: int = 0xE0 - - def __init__(self, debug: bool = False): - """Init constructor.""" - self.debug = debug - - def serialize(self, - cla: int, - ins: Union[int, enum.IntEnum], - p1: int = 0, - p2: int = 0, - cdata: bytes = b"") -> bytes: - """Serialize the whole APDU command (header + data). - - Parameters - ---------- - cla : int - Instruction class: CLA (1 byte) - ins : Union[int, IntEnum] - Instruction code: INS (1 byte) - p1 : int - Instruction parameter 1: P1 (1 byte). - p2 : int - Instruction parameter 2: P2 (1 byte). - cdata : bytes - Bytes of command data. - - Returns - ------- - bytes - Bytes of a complete APDU command. - - """ - ins = cast(int, ins.value) if isinstance(ins, enum.IntEnum) else cast(int, ins) - - header: bytes = struct.pack("BBBBB", - cla, - ins, - p1, - p2, - len(cdata)) # add Lc to APDU header - - if self.debug: - logging.info("header: %s", header.hex()) - logging.info("cdata: %s", cdata.hex()) - - print("serialize INS=", ins) - print("serialize DATA= ", cdata.hex()) - return header + cdata - - def get_configuration(self) -> bytes: - """Command builder for GET_CONFIGURATON - - Returns - ------- - bytes - APDU command for GET_CONFIGURATON - - """ - return self.serialize(cla=self.CLA, - ins=InsType.INS_GET_CONFIGURATION, - p1=0x00, - p2=0x00, - cdata=b"") - - - def get_public_key(self, account: int, display: bool = False) -> bytes: - """Command builder for GET_PUBLIC_KEY. - - Parameters - ---------- - bip32_path: str - String representation of BIP32 path. - display : bool - Whether you want to display the address on the device. - - Returns - ------- - bytes - APDU command for GET_PUBLIC_KEY. - - """ - cdata = account.to_bytes(4, byteorder='big') - print("cdata= ", cdata) - return self.serialize(cla=self.CLA, - ins=InsType.INS_GET_PUBLIC_KEY, - p1=0x01 if display else 0x00, - p2=0x00, - cdata=cdata) - - def get_address(self, account: int, wallet_type: int, display: bool) -> bytes: - """Command builder for GET_ADDRESS. - - Parameters - ---------- - account: int - Account identifier. - wallet_type: int - Wallet type. - display : bool - Whether you want to display the address on the device. - - Returns - ------- - bytes - APDU command for GET_ADDRESS. - - """ - - #account_num = account.to_bytes(4, byteorder='big') - - #wallet = wallet_type.to_bytes(1, byteorder='big') - - cdata = (account.to_bytes(4, byteorder='big') + wallet_type.to_bytes(1, byteorder='big')) - #cdata = (account_num + wallet) - - return self.serialize(cla=self.CLA, - ins=InsType.INS_GET_ADDRESS, - p1=0x01 if display else 0x00, - p2=0x00, - cdata=cdata) - - def sign_message(self, account: int, message: bytes) -> bytes: - """Command builder for SIGN_MESSAGE. - - Parameters - ---------- - account: int - Account identifier. - message: str - Message hash. - display : bool - Whether you want to display the address on the device. - - Returns - ------- - bytes - APDU command for SIGN_MESSAGE. - - """ - - cdata = (account.to_bytes(4, byteorder='big') + message) - - return self.serialize(cla=self.CLA, - ins=InsType.INS_SIGN, - p1=0x01, - p2=0x00, - cdata=cdata) - - def sign_tx(self, account: int, wallet_type: int, decimals: int, ticker: str, meta: struct, data: bytes) -> bytes: - """Command builder for INS_SIGN_TX. - - Parameters - ---------- - bip32_path : str - String representation of BIP32 path. - transaction : Transaction - Representation of the transaction to be signed. - - Yields - ------- - bytes - APDU command chunk for INS_SIGN_TX. - - """ - meta_data = 0 - cdata = (account.to_bytes(4, byteorder='big') + wallet_type.to_bytes(1, byteorder='big') - + decimals.to_bytes(1, byteorder='big') + len(ticker).to_bytes(1, byteorder='big') - + bytes(ticker, 'UTF-8') + meta_data.to_bytes(1, byteorder='big') + data) - - return self.serialize(cla=self.CLA, - ins=InsType.INS_SIGN_TX, - p1=0x01, - p2=0x00, - cdata=cdata) - diff --git a/old-tests/speculos/ledger_client/transaction.py b/old-tests/speculos/ledger_client/transaction.py deleted file mode 100644 index 8186cec..0000000 --- a/old-tests/speculos/ledger_client/transaction.py +++ /dev/null @@ -1,96 +0,0 @@ -from typing import Union - -from ledger_client.utils import write_varint, UINT64_MAX - - -class TransactionError(Exception): - pass - -EIP2930 = 1 -EIP1559 = 2 - -class PersonalTransaction: - def __init__(self, msg: Union[str, bytes]) -> None: - # If you want to send bytes directly you have to put "0x" before the string - if msg[0:2] == "0x": - self.msg: bytes = bytes.fromhex(msg[2:]) - else: - self.msg: bytes = bytes(msg, "utf-8") - - def serialize(self) -> bytes: - return b"".join([ - len(self.msg).to_bytes(4, byteorder="big"), - self.msg, - ]) - -class Transaction: - def __init__(self, txType: int, nonce: int, gasPrice: int, gasLimit: int, to: Union[str, bytes], value: int, data: Union[str, bytes] = "", chainID: int = -1) -> None: - self.txType: int = txType - self.nonce: int = nonce - self.gasPrice: int = gasPrice - self.gasLimit: int = gasLimit - self.to: bytes = bytes.fromhex(to[2:]) if isinstance(to, str) else to - self.value: int = value - self.data: bytes = bytes(data, "utf-8") - self.chainID = b'' - - if not (0 <= self.nonce <= UINT64_MAX): - raise TransactionError(f"Bad nonce: '{self.nonce}'!") - - if not (0 <= self.value <= UINT64_MAX): - raise TransactionError(f"Bad value: '{self.value}'!") - - if len(self.to) != 20: - raise TransactionError(f"Bad address: '{self.to}'!") - - self.lenNonce = int((len(hex(self.nonce)) - 1) / 2) - self.lenGP = int((len(hex(self.gasPrice)) - 1) / 2) - self.lenGL = int((len(hex(self.gasLimit)) - 1) / 2) - self.lenValue = int((len(hex(self.value)) - 1) / 2) - - self.lenChainID = int((len(hex(chainID)) - 1) / 2) - - if chainID != -1: - self.chainID = b"".join([ - b'' if self.lenChainID == 1 else (self.lenChainID + 0x80).to_bytes(1, byteorder="big"), - chainID.to_bytes(self.lenChainID, byteorder="big"), - write_varint(0 + 0x80), - write_varint(0 + 0x80), - ]) - - def serialize(self) -> bytes: - return b"".join([ - self.txType.to_bytes(1, byteorder="big"), - - b'' if self.lenNonce == 1 else write_varint(self.lenNonce + 0x80), - self.nonce.to_bytes(self.lenNonce, byteorder="big"), - - write_varint(self.lenGP + 0x80), - self.gasPrice.to_bytes(self.lenGP, byteorder="big"), - - write_varint(self.lenGL + 0x80), - self.gasLimit.to_bytes(self.lenGL, byteorder="big"), - - write_varint(len(self.to) + 0x80), - self.to, - - write_varint(self.lenValue + 0x80), - self.value.to_bytes(self.lenValue, byteorder="big"), - - write_varint(len(self.data) + 0x80), - self.data, - - self.chainID, - - ]) - -class EIP712: - def __init__(self, domain_hash: str, msg_hash: str) -> None: - self.domain_hash = bytes.fromhex(domain_hash) - self.msg_hash = bytes.fromhex(msg_hash) - - def serialize(self) -> bytes: - return b"".join([ - self.domain_hash, - self.msg_hash - ]) \ No newline at end of file diff --git a/old-tests/speculos/ledger_client/utils.py b/old-tests/speculos/ledger_client/utils.py deleted file mode 100644 index 7cef3dd..0000000 --- a/old-tests/speculos/ledger_client/utils.py +++ /dev/null @@ -1,115 +0,0 @@ -from io import BytesIO -from typing import List, Optional, Literal, Tuple -import PIL.Image as Image - -import speculos.client - -UINT64_MAX: int = 18446744073709551615 -UINT32_MAX: int = 4294967295 -UINT16_MAX: int = 65535 - -# Association tableau si écran nanos ou nanox -PATH_IMG = {"nanos": "nanos", "nanox": "nanox", "nanosp": "nanosp"} - -def save_screenshot(cmd, path: str): - screenshot = cmd.client.get_screenshot() - img = Image.open(BytesIO(screenshot)) - img.save(path) - - -def compare_screenshot(cmd, path: str): - screenshot = cmd.client.get_screenshot() - assert speculos.client.screenshot_equal(path, BytesIO(screenshot)) - - -def parse_sign_response(response : bytes) -> Tuple[bytes, bytes, bytes]: - assert len(response) == 65 - - offset: int = 0 - - v: bytes = response[offset] - offset += 1 - - r: bytes = response[offset:offset + 32] - offset += 32 - - s: bytes = response[offset:] - - return (v, r, s) - - -def bip32_path_from_string(path: str) -> List[bytes]: - splitted_path: List[str] = path.split("/") - - if not splitted_path: - raise Exception(f"BIP32 path format error: '{path}'") - - if "m" in splitted_path and splitted_path[0] == "m": - splitted_path = splitted_path[1:] - - return [int(p).to_bytes(4, byteorder="big") if "'" not in p - else (0x80000000 | int(p[:-1])).to_bytes(4, byteorder="big") - for p in splitted_path] - - -def packed_bip32_path_from_string(path: str) -> bytes: - bip32_paths = bip32_path_from_string(path) - - return b"".join([ - len(bip32_paths).to_bytes(1, byteorder="big"), - *bip32_paths - ]) - - -def write_varint(n: int) -> bytes: - if n < 0xFC: - return n.to_bytes(1, byteorder="little") - - if n <= UINT16_MAX: - return b"\xFD" + n.to_bytes(2, byteorder="little") - - if n <= UINT32_MAX: - return b"\xFE" + n.to_bytes(4, byteorder="little") - - if n <= UINT64_MAX: - return b"\xFF" + n.to_bytes(8, byteorder="little") - - raise ValueError(f"Can't write to varint: '{n}'!") - - -def read_varint(buf: BytesIO, - prefix: Optional[bytes] = None) -> int: - b: bytes = prefix if prefix else buf.read(1) - - if not b: - raise ValueError(f"Can't read prefix: '{b}'!") - - n: int = {b"\xfd": 2, b"\xfe": 4, b"\xff": 8}.get(b, 1) # default to 1 - - b = buf.read(n) if n > 1 else b - - if len(b) != n: - raise ValueError("Can't read varint!") - - return int.from_bytes(b, byteorder="little") - - -def read(buf: BytesIO, size: int) -> bytes: - b: bytes = buf.read(size) - - if len(b) < size: - raise ValueError(f"Can't read {size} bytes in buffer!") - - return b - - -def read_uint(buf: BytesIO, - bit_len: int, - byteorder: Literal['big', 'little'] = 'little') -> int: - size: int = bit_len // 8 - b: bytes = buf.read(size) - - if len(b) < size: - raise ValueError(f"Can't read u{bit_len} in buffer!") - - return int.from_bytes(b, byteorder) diff --git a/old-tests/speculos/requirements.txt b/old-tests/speculos/requirements.txt deleted file mode 100644 index 343948d..0000000 --- a/old-tests/speculos/requirements.txt +++ /dev/null @@ -1,6 +0,0 @@ -speculos -ed25519 -pytest>=6.1.1,<7.0.0 -ledgercomm>=1.1.0,<1.2.0 -ecdsa>=0.16.1,<0.17.0 -pysha3>=1.0.0,<2.0.0 diff --git a/old-tests/speculos/screenshots/get_pubkey/approve/nanos/00000.png b/old-tests/speculos/screenshots/get_pubkey/approve/nanos/00000.png deleted file mode 100644 index ce795f34e8569e986af689fded3b59c9a8af2961..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 349 zcmV-j0iyniP)O41}p;-~WL<=z+0=1Om1tEU@3H#qtw22}5*_5JCvCo4!52c$FXo$VhXU?0M$^Bekqgf%Ka;M*^X|4 zEs9YCQ(xfJKmNC#+8dY%2&wT+>D^<3C%}_*k1^mvtO~`RE00000NkvXXu0mjf-kqOA diff --git a/old-tests/speculos/screenshots/get_pubkey/approve/nanos/00001.png b/old-tests/speculos/screenshots/get_pubkey/approve/nanos/00001.png deleted file mode 100644 index fdc04e7f974044e2bf6c12c5082d21732b4b78ac..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 499 zcmVyN}@5X)s|27xZo70`hjf~R#*wG3BR6nMxDTu z05k2F+j|RJA6~EW8uxk@$XEA$t~I}kg>r4D&T_=o1FZcZBhF zGisLLUXVBf-c9nv2JzaNjJp|T*!k&hXlV0eNjq~8Rfd`{RT>y6>i#nIpI$|7=hdu( pFOTZeiIJm*JV}xyNs{CU`~d|IggU5_<1_#O002ovPDHLkV1kFk>~8=7 diff --git a/old-tests/speculos/screenshots/get_pubkey/approve/nanos/00002.png b/old-tests/speculos/screenshots/get_pubkey/approve/nanos/00002.png deleted file mode 100644 index a1e51e9305b391f71a5309d1c70c934745a12f1c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 486 zcmV@P)yuPDWUWFc?ypk*b^hV^wv zWA!YeUe+t2KY@T!i2?5;Xt!+is_{A~HYK~Z>Fa&iH()fkXXz~Wsf&F!CN|yymo>`F zYRSdc{+VBgvF*&}UXqBxH~EWG=(JRvtjW|h)k^)SR&8u`h?T+90ResK3E14!UXd;y zuokIMBV_}v+JJeueMGO>(T#~1y`<(dZM{@Ry4r5HUderuHr9Y@(%YR3N@J_qbjr<{ za9&1lg3UQ-j;b-Bn!cVZcssCCVz zl{bZ<&Mep7s@8fqytUaMXL1E8$vIxaM2Q4`D1Ua0~DB=J~0MaxGx2!bF8 cg5W=S0f%{srh9VU>Hq)$07*qoM6N<$f+42oX#fBK diff --git a/old-tests/speculos/screenshots/get_pubkey/approve/nanos/00003.png b/old-tests/speculos/screenshots/get_pubkey/approve/nanos/00003.png deleted file mode 100644 index 7a7214ca73b9a8637449b7db2fa4f1077b31082f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 441 zcmV;q0Y?6bP)s;wIu zcVkg$WnM|`7Ko9mS{WLGwmDh*i)o1P^>>>yz?x~1W@>n}*h#A08JRwYE`TTH8kD^W zE==B4Q^m;iVZQ+Qq{RjzW7<(kAVXT&Fie@{Ti!6a({Sa-2hOtl2Km;V$v3OyNxpya zcTuKy@fkmlSc5ZpeiXVg|3;paZliNpB<5w}n9mGnig;A*71V(>NjoE)ljeX557Tl; z4^wc)dK@Fcwf_l|djbsH_C$g%pASTt;;muo&*g2|sOkZA@0!|D&u$^s0Iwae#Xb=P zcMAigo>B90$M}N`My)D~mT7VNV6ufN^{b8<=bZs(yPm|p@Tuap0BU`hDPamvWa`X} jW>QZO1VIo4L14oNP+octA)*XjVq>8ea9 zy+UQc@%eseWj#+I)Eu`!QoV2_;!HO$W5!huo|!toCbJ@Fd>8n z)Tgf37x7>W0DlwP^Kg0aBS`Rf(7Ud85o5UtyFubdzs)G36DLdP+mIftgt!WA0QWh} zPRff0(lD;hj>vdN*E0`-z$ks>{~AiXR`tC)fEeA)(d>YSHQlFSY#jyzYP~dtt#;it zR%j&Y6+8pHynem|+cjXN#skj)&0L%2k+ikR4iEe|dQ|tJKLUW)hL$=mu>&@K2-i;* p8i#nSIIFF^??Tcm%oo*S;1qaa4A?`Qx3002ovPDHLkV1gz*n1%oV diff --git a/old-tests/speculos/screenshots/get_pubkey/approve/nanos/00005.png b/old-tests/speculos/screenshots/get_pubkey/approve/nanos/00005.png deleted file mode 100644 index e7a5819d8f6944f4d516e7a78b5f45b293249edd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 333 zcmV-T0kZyyP)?phMX)+}BF5FlZA%qY@2>F@wkn=znF~$R3!2if5 zePI;?RQ+v-)-g;f16m1_R((lkK*4#CS$#=nfJ&^QCs$uYHgo~w#1u-azEpO={AUR# zcV_hi^Q*5UJo0~HwcnEqs*i^r;GqY2=m8fNfl7lMu;F)Fm^{|BHe#Az*AZSJ9? zZ-NK{N-#kq54QtsSjR@c<;yH;jl@KnKz9WlL8?VR-1~!WHTU4{&zvBI=A$agqDrB6 f!0n*{sAjk5Y(@*V#~rbuHu`7A_H&AxgwHf8y4cdKvg$JbB4n%ez%sZ31aBYd&Oo@(7)_WJ(Znl2o8^PD` zFE`_Y-IS+Kdq0Q2-7r_C=}F(5ev`U`H~)QH|9$1FHE$YjoVax+e0xei%S`SAGlOm! zp7{T3NA-mVOYb&rdU8MdyIHo@@7cE*uj@I+Zu{2i)KMSV-E~oP>S0BXO55MnV=~V}gM;`ft^ygdt!|>bWie003aSugUvUO7hqHzU`Jp z19`F8z}e3;DW%*`evs}6WgFSUGv6~eXCc#Z-*-qqPBL_wvn&T@w5i(<`I)&{lgC;| zs}^Wi725K_nhRsMZ~j$VVC{N$4D(`kfS>a*@_cFAqKG@${t}ttb6tyr`8m}#jbF?H zJQ#s-i@&$x`BO?WbK%)EfhW*MObXhWyA8!Kaw78Zw46-$O}kT2W~`ZKIsGqALor(~ z;j`iSEnI-+E1ENi^89wQO7U{y%tCeU%0I|sqd9W<5#br>ZH)DpJTRgpvM+hWcsV-mD#I{p>utmsCTe zJT68S+e<6SHE$d$VEiXqWNERfU2OKF73hZ|-QGisY}x^`K3tTAyXoH3Pt*cos<^a}oc8LM1?MV~$T^<>?~=*PIr_zv<&A+s~R?>zng z7$W O0000mf!2qC zcRauEU-IT?y94LWD_a7J{eJFOKN@jt=E=s%QR$`HJ3^5R*H?8&?Qg=bo^ zv1)vt8olFeY`M?ujFnf?i&!PTe*MVnV(pf@QgWiU!@E1%&ZghmmRnZ)>iWg>&vmc5 zxt{bb{B0#yEdAz>T8y1#jn)$H4?dNRzl2x<&u7%byw7mwJ@=nOx2DwGJCy(u^K|ud JS?83{1OUrapQ8W( diff --git a/old-tests/speculos/screenshots/get_pubkey/approve/nanosp/00003.png b/old-tests/speculos/screenshots/get_pubkey/approve/nanosp/00003.png deleted file mode 100644 index 5fd127e517c190a1684db420b839a65dd8776a10..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 356 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h6`U|`htba4!+nDh2#AYZeBfa}G~ z%X2sUSKT3Q%6Ru-)(e8M#-Se-4!|1j!jMc=4!j z_CJRO);kNf|C#^xTYZvZt?H%gi`lBKIP^;~T)*|9>>tm^$s6J??VLTmiitVa@RZl# z9D}7HW~IBg#_v|Osdspo)b@#I##$}$!vTL1erwOq|6RGGG~%xIOYz59T*k-q6J81a z$=e)pd!KrK?JqHvo`lxakeiYh%(DN_TKY9re^&30zAaAgrtV<9s?#_7_s4|tE$2+UT~i!DCi)dVeekXbfGQn;e2~0fU4`s1;0 z?{f>9Zfbf|_00eLCwPudd#p2Mzfg8-=Z~Y&(Z3(6-dSPln_e}2 z&8bJe=5=w3_V0Wxpw!uqXV@ zTyg#0l&4R7|Ayyoo}1J3WZRs6lez;p_x-s3`O4ERHjEo5Zk@S4@1z`Oka)v{pj(C~ z>TB;CrkB0D2@>;k^>bP0l+XkKqsFS~ diff --git a/old-tests/speculos/screenshots/get_pubkey/approve/nanox/00001.png b/old-tests/speculos/screenshots/get_pubkey/approve/nanox/00001.png deleted file mode 100644 index f445d038d87b1671a3a2602d9b8e46a698a13699..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 524 zcmV+n0`vWeP)P>S0BXO55MnV=~V}gM;`ft^ygdxU2>bWie003aSugUvUO7hqHzU`Jp z19`F8z}e3;DW%*`evs}6WgFSUGv6~eXCdLZ?>nR)Cz(3UD9eEvZR++zer9gg@(=RZXpUTdMEH*MHpYBR9vD%b9NU79i%MJ4 zUlo$$0Pte7)lfgJbmK4n*!^7M<pvM+hWcsV-mD#I{p>utmsCTe zJT68S%S$WCHE$d$VEiXqW@)*pU2OKF73haD-CjeBY+3=bK3tTAyW72|pQ!Qdck(~s z`r+#J|L!GFCYOi#~hw>&d!}(T{PL@g3xmLS`qt?>zng z7&XX5f15_AiT-BH!Aa~wCv}3%94tk60RR9100000000000001hWqtt$DzrcstvWXV O0000b)bfSL`HXDiwatIa9oAeW{Zsz!3)Xs#J!R$zS1Sullowc6+5M^1G%B%S zvY3_=b@|fSV6W#+-c$Dl@FZN>>b}|iJKNTkX)cBhmnyyW^X|>Ji&!7aWMI+vZ`Hfk z{+$7L+Vs|KysvlYtk9!L6Z8(+K4oPKzOXmb*Rgws8!QAEHoW02D!H0&#<=t(NX*mK K&t;ucLK6U71Dr7c diff --git a/old-tests/speculos/screenshots/get_pubkey/approve/nanox/00003.png b/old-tests/speculos/screenshots/get_pubkey/approve/nanox/00003.png deleted file mode 100644 index 5fd127e517c190a1684db420b839a65dd8776a10..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 356 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h6`U|`htba4!+nDh2#AYZeBfa}G~ z%X2sUSKT3Q%6Ru-)(e8M#-Se-4!|1j!jMc=4!j z_CJRO);kNf|C#^xTYZvZt?H%gi`lBKIP^;~T)*|9>>tm^$s6J??VLTmiitVa@RZl# z9D}7HW~IBg#_v|Osdspo)b@#I##$}$!vTL1erwOq|6RGGG~%xIOYz59T*k-q6J81a z$=e)pd!KrK?JqHvo`lxakeiYh%(DN_TKY9re^&30zAaAgrtV<9s?#_7_s4|tE$2+UT~i!DCi)dVeekXbfGQn;e2~0fO41}p;-~WL<=z+0=1Om1tEU@3H#qtw22}5*_5JCvCo4!52c$FXo$VhXU?0M$^Bekqgf%Ka;M*^X|4 zEs9YCQ(xfJKmNC#+8dY%2&wT+>D^<3C%}_*k1^mvtO~`RE00000NkvXXu0mjf-kqOA diff --git a/old-tests/speculos/screenshots/get_pubkey/reject/nanos/00001.png b/old-tests/speculos/screenshots/get_pubkey/reject/nanos/00001.png deleted file mode 100644 index fdc04e7f974044e2bf6c12c5082d21732b4b78ac..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 499 zcmVyN}@5X)s|27xZo70`hjf~R#*wG3BR6nMxDTu z05k2F+j|RJA6~EW8uxk@$XEA$t~I}kg>r4D&T_=o1FZcZBhF zGisLLUXVBf-c9nv2JzaNjJp|T*!k&hXlV0eNjq~8Rfd`{RT>y6>i#nIpI$|7=hdu( pFOTZeiIJm*JV}xyNs{CU`~d|IggU5_<1_#O002ovPDHLkV1kFk>~8=7 diff --git a/old-tests/speculos/screenshots/get_pubkey/reject/nanos/00002.png b/old-tests/speculos/screenshots/get_pubkey/reject/nanos/00002.png deleted file mode 100644 index a1e51e9305b391f71a5309d1c70c934745a12f1c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 486 zcmV@P)yuPDWUWFc?ypk*b^hV^wv zWA!YeUe+t2KY@T!i2?5;Xt!+is_{A~HYK~Z>Fa&iH()fkXXz~Wsf&F!CN|yymo>`F zYRSdc{+VBgvF*&}UXqBxH~EWG=(JRvtjW|h)k^)SR&8u`h?T+90ResK3E14!UXd;y zuokIMBV_}v+JJeueMGO>(T#~1y`<(dZM{@Ry4r5HUderuHr9Y@(%YR3N@J_qbjr<{ za9&1lg3UQ-j;b-Bn!cVZcssCCVz zl{bZ<&Mep7s@8fqytUaMXL1E8$vIxaM2Q4`D1Ua0~DB=J~0MaxGx2!bF8 cg5W=S0f%{srh9VU>Hq)$07*qoM6N<$f+42oX#fBK diff --git a/old-tests/speculos/screenshots/get_pubkey/reject/nanos/00003.png b/old-tests/speculos/screenshots/get_pubkey/reject/nanos/00003.png deleted file mode 100644 index 7a7214ca73b9a8637449b7db2fa4f1077b31082f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 441 zcmV;q0Y?6bP)s;wIu zcVkg$WnM|`7Ko9mS{WLGwmDh*i)o1P^>>>yz?x~1W@>n}*h#A08JRwYE`TTH8kD^W zE==B4Q^m;iVZQ+Qq{RjzW7<(kAVXT&Fie@{Ti!6a({Sa-2hOtl2Km;V$v3OyNxpya zcTuKy@fkmlSc5ZpeiXVg|3;paZliNpB<5w}n9mGnig;A*71V(>NjoE)ljeX557Tl; z4^wc)dK@Fcwf_l|djbsH_C$g%pASTt;;muo&*g2|sOkZA@0!|D&u$^s0Iwae#Xb=P zcMAigo>B90$M}N`My)D~mT7VNV6ufN^{b8<=bZs(yPm|p@Tuap0BU`hDPamvWa`X} jW>QZO1VIo4L14oNP+octA)*XjVq>8ea9 zy+UQc@%eseWj#+I)Eu`!QoV2_;!HO$W5!huo|!toCbJ@Fd>8n z)Tgf37x7>W0DlwP^Kg0aBS`Rf(7Ud85o5UtyFubdzs)G36DLdP+mIftgt!WA0QWh} zPRff0(lD;hj>vdN*E0`-z$ks>{~AiXR`tC)fEeA)(d>YSHQlFSY#jyzYP~dtt#;it zR%j&Y6+8pHynem|+cjXN#skj)&0L%2k+ikR4iEe|dQ|tJKLUW)hL$=mu>&@K2-i;* p8i#nSIIFF^??Tcm%oo*S;1qaa4A?`Qx3002ovPDHLkV1gz*n1%oV diff --git a/old-tests/speculos/screenshots/get_pubkey/reject/nanosp/00000.png b/old-tests/speculos/screenshots/get_pubkey/reject/nanosp/00000.png deleted file mode 100644 index a58590b988714545e7960f7f400f360ffc5de41f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 382 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h6`U|@9hba4!+nDh2#bl+hG9*4k? zQuR0Wo;SViCn%lTo!KM1sAjk5Y(@*V#~rbuHu`7A_H&AxgwHf8y4cdKvg$JbB4n%ez%sZ31aBYd&Oo@(7)_WJ(Znl2o8^PD` zFE`_Y-IS+Kdq0Q2-7r_C=}F(5ev`U`H~)QH|9$1FHE$YjoVax+e0xei%S`SAGlOm! zp7{T3NA-mVOYb&rdU8MdyIHo@@7cE*uj@I+Zu{2i)KMSV-E~oP>S0BXO55MnV=~V}gM;`ft^ygdt!|>bWie003aSugUvUO7hqHzU`Jp z19`F8z}e3;DW%*`evs}6WgFSUGv6~eXCc#Z-*-qqPBL_wvn&T@w5i(<`I)&{lgC;| zs}^Wi725K_nhRsMZ~j$VVC{N$4D(`kfS>a*@_cFAqKG@${t}ttb6tyr`8m}#jbF?H zJQ#s-i@&$x`BO?WbK%)EfhW*MObXhWyA8!Kaw78Zw46-$O}kT2W~`ZKIsGqALor(~ z;j`iSEnI-+E1ENi^89wQO7U{y%tCeU%0I|sqd9W<5#br>ZH)DpJTRgpvM+hWcsV-mD#I{p>utmsCTe zJT68S+e<6SHE$d$VEiXqWNERfU2OKF73hZ|-QGisY}x^`K3tTAyXoH3Pt*cos<^a}oc8LM1?MV~$T^<>?~=*PIr_zv<&A+s~R?>zng z7$W O0000mf!2qC zcRauEU-IT?y94LWD_a7J{eJFOKN@jt=E=s%QR$`HJ3^5R*H?8&?Qg=bo^ zv1)vt8olFeY`M?ujFnf?i&!PTe*MVnV(pf@QgWiU!@E1%&ZghmmRnZ)>iWg>&vmc5 zxt{bb{B0#yEdAz>T8y1#jn)$H4?dNRzl2x<&u7%byw7mwJ@=nOx2DwGJCy(u^K|ud JS?83{1OUrapQ8W( diff --git a/old-tests/speculos/screenshots/get_pubkey/reject/nanox/00000.png b/old-tests/speculos/screenshots/get_pubkey/reject/nanox/00000.png deleted file mode 100644 index 657887225857cf48be8a8daed2cb3e89d4b29ece..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 381 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h6`U|@9dba4!+nDh2#G~Xcw0f)e( zJDk7cg{nU`wU4`s1;0 z?{f>9Zfbf|_00eLCwPudd#p2Mzfg8-=Z~Y&(Z3(6-dSPln_e}2 z&8bJe=5=w3_V0Wxpw!uqXV@ zTyg#0l&4R7|Ayyoo}1J3WZRs6lez;p_x-s3`O4ERHjEo5Zk@S4@1z`Oka)v{pj(C~ z>TB;CrkB0D2@>;k^>bP0l+XkKqsFS~ diff --git a/old-tests/speculos/screenshots/get_pubkey/reject/nanox/00001.png b/old-tests/speculos/screenshots/get_pubkey/reject/nanox/00001.png deleted file mode 100644 index f445d038d87b1671a3a2602d9b8e46a698a13699..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 524 zcmV+n0`vWeP)P>S0BXO55MnV=~V}gM;`ft^ygdxU2>bWie003aSugUvUO7hqHzU`Jp z19`F8z}e3;DW%*`evs}6WgFSUGv6~eXCdLZ?>nR)Cz(3UD9eEvZR++zer9gg@(=RZXpUTdMEH*MHpYBR9vD%b9NU79i%MJ4 zUlo$$0Pte7)lfgJbmK4n*!^7M<pvM+hWcsV-mD#I{p>utmsCTe zJT68S%S$WCHE$d$VEiXqW@)*pU2OKF73haD-CjeBY+3=bK3tTAyW72|pQ!Qdck(~s z`r+#J|L!GFCYOi#~hw>&d!}(T{PL@g3xmLS`qt?>zng z7&XX5f15_AiT-BH!Aa~wCv}3%94tk60RR9100000000000001hWqtt$DzrcstvWXV O0000b)bfSL`HXDiwatIa9oAeW{Zsz!3)Xs#J!R$zS1Sullowc6+5M^1G%B%S zvY3_=b@|fSV6W#+-c$Dl@FZN>>b}|iJKNTkX)cBhmnyyW^X|>Ji&!7aWMI+vZ`Hfk z{+$7L+Vs|KysvlYtk9!L6Z8(+K4oPKzOXmb*Rgws8!QAEHoW02D!H0&#<=t(NX*mK K&t;ucLK6U71Dr7c diff --git a/old-tests/speculos/screenshots/sign/sign_message/nanos/00000.png b/old-tests/speculos/screenshots/sign/sign_message/nanos/00000.png deleted file mode 100644 index ce795f34e8569e986af689fded3b59c9a8af2961..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 349 zcmV-j0iyniP)O41}p;-~WL<=z+0=1Om1tEU@3H#qtw22}5*_5JCvCo4!52c$FXo$VhXU?0M$^Bekqgf%Ka;M*^X|4 zEs9YCQ(xfJKmNC#+8dY%2&wT+>D^<3C%}_*k1^mvtO~`RE00000NkvXXu0mjf-kqOA diff --git a/old-tests/speculos/screenshots/sign/sign_message/nanos/00001.png b/old-tests/speculos/screenshots/sign/sign_message/nanos/00001.png deleted file mode 100644 index d369d6c856a874acef68fb26bc3f297dbb1576ec..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 465 zcmV;?0WSWDP)7P(1#36F1Hla_!V4%;eale74W;(9 z@r($FHSrFOMWz20(*%>!EXFTDh-KP%#osX2EkJzAX%1m0rt%Op@DLVOQ8~-=($p?Tf9VO?=vS|4A>(|~pVu8nKY>); z?y~m-{)Kko+jTX-;O%_a9b1EyyeA9o$oC{4;AhyDN@~FgB4@Y!czjQFO(9pnRLK>% z@R2f;Cv7>6ob5L z0eUg9CG*r2l=L-)j|wvIR4mH=Tx*t^#Pwng!!QiPFbu*!?bdt|jsTOk00000NkvXX Hu0mjf+I`jo diff --git a/old-tests/speculos/screenshots/sign/sign_message/nanos/00002.png b/old-tests/speculos/screenshots/sign/sign_message/nanos/00002.png deleted file mode 100644 index 174376140c7e4be36da5c75d7c298c0ae7b939d8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 501 zcmVfnXbj%?j4OY8^*I)Cx<4i)GFrc-bxYWs#nRCa(xmKO5GQy|tGjHXSZrR_->OEXiZAM!{vx=6N^d~Hm*|E rNySrbiA-VeUx>rua5x+e$FuPPtc!NFD2TG+00000NkvXXu0mjfMd9Mc diff --git a/old-tests/speculos/screenshots/sign/sign_message/nanos/00003.png b/old-tests/speculos/screenshots/sign/sign_message/nanos/00003.png deleted file mode 100644 index 56201e2463635c99001306416bfff51397380a2f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 495 zcmVL zi5Cv{juwC27&ifBma`<`q-!q!Dh{MlZ%>`GZS5CaPv?Cfj59)M1O zSPLWdGVPb748XUorO$h>SP06^unWt4Xt!lvhH`OADZ*IM)S?YtOcIsR7*c2D3&^g= zX3w}<5MR7v8w*>vLF3|RnqfIRNIb~5!Td&Dghqf^xTq?Q0WbcEP)U1fAP53y-e-EBLeETNG@X3U7~_u- zN;iOv_2VVT4B$Co44UFzc3asbds=TXLqA?Zd^Iw+CYxRyAe-a^*~I;qRcXYmR&{WL z9RPda%7sm(=a&P7^Uo{>Pe9ql*uAQ!4;nYZ3PzLLSV=-}5MtM@2+Tz@|o{cU}jZt#cKQB6q{sr!@ z?G|glknhzCZ`VB#Ht*=h*2EmFvM9*OInEy>j3v*vz>A$_?;x)uwK6 zsVK<{FquSYRm(QfhD&&tBKp^+7vvhh#j^dvdjfjukyRCFL{(C$VPZvKdNEF4Yn)q^ zT!rfd;CdwUJpiN34`ew74}{NK#yl%~f2|CHAP9mWSkDJj9DRhc1Xt4l0000{Uy diff --git a/old-tests/speculos/screenshots/sign/sign_message/nanos/00005.png b/old-tests/speculos/screenshots/sign/sign_message/nanos/00005.png deleted file mode 100644 index f4fd25b3d1fa6bf192b0aa7fe89316aba6584916..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 444 zcmV;t0Ym=13_!uD_dl=;yU;-z0>to1ta;Ex(h7)!NiI37 zs;5f>6|8C&3O>kGLj)tHu~#x3X%C?6c-746aHHIgopw(PRVSEAcLp^WAk#ms4-|x; mccb8cK?Tq+GlpRpMkl_{Kkb{|P)gb+vaB^u>~<8+A?SW}F_*ViAlM0~s~?Ln)z!ba z{D?-~4UpygtkCBBMeHHyk`HBQ;b`iYa&E?zt%GAQQ$L$?5-wW@?5)v=L94@NXrBj! ztxdMaNq1^xPaqyMQ#ON-(LpZ=6A#TmXc$&08Uw?=Df=%Vy;b28P3Z4D0HGxo{gu|i zSvty}XhO#ZK&YpO!g=S76~t6ob{DBvL39v;VhEzh@#p8T^n^!`zE^;EZNaI9C-Uh6 xzR7;Vs86rG)s92Z9BA(YS~5Xz)i4Yrix22bsww28^V0wT002ovPDHLkV1gk+vPA#@ diff --git a/old-tests/speculos/screenshots/sign/sign_message/nanosp/00000.png b/old-tests/speculos/screenshots/sign/sign_message/nanosp/00000.png deleted file mode 100644 index a58590b988714545e7960f7f400f360ffc5de41f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 382 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h6`U|@9hba4!+nDh2#bl+hG9*4k? zQuR0Wo;SViCn%lTo!KM1sAjk5Y(@*V#~rbuHu`7A_H&AxgwHf8y4cdKvg$JbB4n%ez%sZ31aBYd&Oo@(7)_WJ(Znl2o8^PD` zFE`_Y-IS+Kdq0Q2-7r_C=}F(5ev`U`H~)QH|9$1FHE$YjoVax+e0xei%S`SAGlOm! zp7{T3NA-mVOYb&rdU8MdyIHo@@7cE*uj@I+Zu{2i)KMSV-E~o=IB2y*ZG^~MzRqRVa z$IoPUCbd&CnvBAl*@S4_4CrWW9ab`YpI!B1h#_%C$hm91-E}_e98fZIYo~wZNq94( z{U{-X5Rmv8AU0mxE=@PW+xt4x%B3UgnuX!McK-R~%ZK+}`fjumUr<}$FFK}h<9{S$iFUv&ITYbS*(yb>P^AOo$)taT zfD34XKXnoYpSp{h7oE;e={6|Ct((Pk|4+&gIm$z4b)J*`3p;&onNYsa3l2w-;pOl z@f88Fu+)lHIkX0e=!J`Q!f#U+aDzVUE?wlbpv`Br_2~4gB%F-?;R`urwa<8<-dBw4 zGl{w8MEVjx0qV=IGphcLkghp0Xy!nH>1{|b0En&8k`HHr?qt~3Tqm8Tap@%#Fy>tH z1_0^pXp&~5zY^I!`jr+?TkE1Q)rERBbRznnO#Djn$UL~rLQ~7c<;JW_NVQPQ^e@AX zk6Iyw5JCtc7wG>3CU)*A39}VCifL9u)fG}otz#DSq;d~BcR&sAO(~`+%YFr?-BeEz zJHEjgEeKQ%??!8!V)B9_DBjk(9Zhf&)(aC<4Uga9KqO3rKANV+DXQrvknzw{N)K>V zdf6dIgF+jksv_^a5NAdcW#p~49NGc>dF*`vqJ~Z^k!%_SCr9W8vUf0f-`|FQh+-PN z4=|S=s2Vn^RMnInuoa{PkwU>uGa-Z!LI@#m!G8*GN_dn3Ps9KK002ovPDHLkV1joc BmIwd< diff --git a/old-tests/speculos/screenshots/sign/sign_message/nanosp/00002.png b/old-tests/speculos/screenshots/sign/sign_message/nanosp/00002.png deleted file mode 100644 index 7a4bd198b695c083380950782886a310e771fbee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 544 zcmV+*0^j|KP)lGsZ=s91!4fY{(na?jTk0}2hciYWmA007&41Rg8rTz(wKVU;{C z=iKdHDKCZUpaO^U8Fiqya7Hs3Q9jk>vW~1j?JMd)wX#OkUe<+jVB;mJ7qzCcWc@YR zJj&K9;9O8@q?*yzCC85>;$GMBPf;)DJFJUl&XOxYb@te~GV18~DPrOjPLt-Ua&8IX z;wPX^K58P8E4>a}S-dio)=a3;84T9QJO!qE)v6TKjeGN#lYe|orn=ZorImV+bvJ|f z$58bOQ16^`H(|d}Z7zGLHn-BCdfwN0uzp6)xw*j(=9Bv=CFCHd|MeaawQK{Ie`E^U z%t}E3fK9rO1Wtvk@2h^f`dl>r#8SWd$%Y}Lh}S*0vo~-lG~K~FKL%Ov*yoQ$6EMFO zQFrU=2Y@WLORcvjSu@=jv+Ul;q13TFx$vz{46a9ik#=kP6`V{m*ek1V-9F3--i*7y zHlwI({3Vv{Z^0ALeH&`>X|6u+HCr@J&2`-iJlCLo-vbJn-|yFaYwZNw8EUf+nv5+* z%V2)6zAK70z}J!-{_0Tk97eKYAYO%(HD!#`&@lUi0Y3 z!mVF%)6EA9u=BuEo(YY40^~c?OWrl-K&C8fIou5)w4>toWc6}$sql4qX82zWF1Y7y zb?5jcR+J||dTFsX7_9cRcENHIRgjnR*lamSv1==nUFP{YqE+?vWZYE69oH6n&L7g2 zYOY23^;WdnncLxAjc|1d0002~uNkHXa1D34G#H4j502E=p4I8kkx`pEWGnAxK51(9 zUQqc~p?b91XlGHvhcx5c^_$Cg#PhW$C!LO2wokdo`6+>uk*dONRdE?4psY-KldqfU zxn!cWD%JU$9AHxgZB`MRCtO&P2fk&6!4ojj;`Ls_EiY6%Jmvo066X4?%u`~iimAIk t;s!WZ{{ft4cZ5xKbG4#+SS`Q zI2uw)u9|(yV|4>&nmck-|P+E%t3nl9hFd5j_^MVZe(FaNDQx>?TY9Z-h$WKd6DnI9YI yZ+0(%_j4YadYpp(mDp+ML4>9N00000c<}{l0k2sA0000;s!WZ{{ft4cZ5xKbG4#+SS`Q zI2uw)u9|(yV|4>&nmck-|P+E%t3nl9hFd5j_^MVZe(FaNDQx>?TY9Z-h$WKd6DnI9YI yZ+0(%_j4YadYpp(mDp+ML4>9N00000c<}{l0k2sA0000;s!WZ{{ft4cZ5xKbG4#+SS`Q zI2uw)u9|(yV|4>&nmck-|P+E%t3nl9hFd5j_^MVZe(FaNDQx>?TY9Z-h$WKd6DnI9YI yZ+0(%_j4YadYpp(mDp+ML4>9N00000c<}{l0k2sA0000U4`s1;0 z?{f>9Zfbf|_00eLCwPudd#p2Mzfg8-=Z~Y&(Z3(6-dSPln_e}2 z&8bJe=5=w3_V0Wxpw!uqXV@ zTyg#0l&4R7|Ayyoo}1J3WZRs6lez;p_x-s3`O4ERHjEo5Zk@S4@1z`Oka)v{pj(C~ z>TB;CrkB0D2@>;k^>bP0l+XkKqsFS~ diff --git a/old-tests/speculos/screenshots/sign/sign_message/nanox/00001.png b/old-tests/speculos/screenshots/sign/sign_message/nanox/00001.png deleted file mode 100644 index 4e2a9978058d5fba50b7b4893d1a99e6df5d2e23..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 875 zcmV-x1C;!UP)=IB2y*ZG^~MzRqRVa z$IoPUCbd&CnvBAl*@S4_4CrWW9ab`YpI!B1h#_%C$hm91-E}_e98fZIYo~wZNq94( z{U{-X5Rmv8AU0mxE=@PW+xt4x%B3UgnuX!McK-R~%ZK+}`fjumUr<}$FFK}h<9{S$iFUv&ITYbS*(yb>P^AOo$)taT zfD34XKXnoYpSp{h7oE;e={6|Ct((Pk|4+&gIm$z4b)J*`3p;&onNYsa3l2w-;pOl z@f88Fu+)lHIkX0e=!J`Q!f#U+aDzVUE?wlbpv`Br_2~4gB%F-?;R`urwa<8<-dBw4 zGl{w8MEVjx0qV=IGphcLkghp0Xy!nH>1{|b0En&8k`HHr?qt~3Tqm8Tap@%#Fy>tH z1_0^pXp&~5zY^I!`jr+?TkE1Q)rERBbRznnO#Djn$UL~rLQ~7c<;JW_NVQPQ^e@AX zk6Iyw5JCtc7wG>3CU)*A39}VCifL9u)fG}otz#DSq;d~BcR&sAO(~`+%YFr?-BeEz zJHEjgEeKQ%??!8!V)B9_DBjk(9Zhf&)(aC<4Uga9KqO3rKANV+DXQrvknzw{N)K>V zdf6dIgF+jksv_^a5NAdcW#p~49NGc>dF*`vqJ~Z^k!%_SCr9W8vUf0f-`|FQh+-PN z4=|S=s2Vn^RMnInuoa{PkwU>uGa-Z!LI@#m!G8*GN_dn3Ps9KK002ovPDHLkV1joc BmIwd< diff --git a/old-tests/speculos/screenshots/sign/sign_message/nanox/00002.png b/old-tests/speculos/screenshots/sign/sign_message/nanox/00002.png deleted file mode 100644 index 7a4bd198b695c083380950782886a310e771fbee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 544 zcmV+*0^j|KP)lGsZ=s91!4fY{(na?jTk0}2hciYWmA007&41Rg8rTz(wKVU;{C z=iKdHDKCZUpaO^U8Fiqya7Hs3Q9jk>vW~1j?JMd)wX#OkUe<+jVB;mJ7qzCcWc@YR zJj&K9;9O8@q?*yzCC85>;$GMBPf;)DJFJUl&XOxYb@te~GV18~DPrOjPLt-Ua&8IX z;wPX^K58P8E4>a}S-dio)=a3;84T9QJO!qE)v6TKjeGN#lYe|orn=ZorImV+bvJ|f z$58bOQ16^`H(|d}Z7zGLHn-BCdfwN0uzp6)xw*j(=9Bv=CFCHd|MeaawQK{Ie`E^U z%t}E3fK9rO1Wtvk@2h^f`dl>r#8SWd$%Y}Lh}S*0vo~-lG~K~FKL%Ov*yoQ$6EMFO zQFrU=2Y@WLORcvjSu@=jv+Ul;q13TFx$vz{46a9ik#=kP6`V{m*ek1V-9F3--i*7y zHlwI({3Vv{Z^0ALeH&`>X|6u+HCr@J&2`-iJlCLo-vbJn-|yFaYwZNw8EUf+nv5+* z%V2)6zAK70z}J!-{_0Tk97eKYAYO%(HD!#`&@lUi0Y3 z!mVF%)6EA9u=BuEo(YY40^~c?OWrl-K&C8fIou5)w4>toWc6}$sql4qX82zWF1Y7y zb?5jcR+J||dTFsX7_9cRcENHIRgjnR*lamSv1==nUFP{YqE+?vWZYE69oH6n&L7g2 zYOY23^;WdnncLxAjc|1d0002~uNkHXa1D34G#H4j502E=p4I8kkx`pEWGnAxK51(9 zUQqc~p?b91XlGHvhcx5c^_$Cg#PhW$C!LO2wokdo`6+>uk*dONRdE?4psY-KldqfU zxn!cWD%JU$9AHxgZB`MRCtO&P2fk&6!4ojj;`Ls_EiY6%Jmvo066X4?%u`~iimAIk tN*Lq=;xf*w&X2h3D_E8M5CYN5>RzH(2ahQOMr#gf-W8Xl+tZ=1CH>c zkZAOi+!auD;nt15Hn}N30000sF|j+@(@MCM5^zz|_KBQxeHyTxzZJ9ZUw*Z9uMaW% z{!n`b42webx2P29eriE&ivyas%|hJPN`uGUJc@BKbKvXG7xPpN70rS4-}1eCuJ|() z+idy-MAOYd=kJlugr07ODmr16+!4DH$vt7yb$Ny$006MtvRP1Dvm6#L{Sxfhk+gj$ z-JVt6Ut75ju$rYWURq*?k@9!OwFS}Pr;;n0PEK*Ah@}XBCha3TESfG~yG1NTOoB2We_npA-?~{Y=oL`A_M}r!j?A|W?483?;PZkP rO(PCL|B7}sbSH|Y0000007UT(;?4Ri)ZmAR00000NkvXXu0mjfOAych diff --git a/old-tests/speculos/screenshots/sign/sign_message/nanox/00005.png b/old-tests/speculos/screenshots/sign/sign_message/nanox/00005.png deleted file mode 100644 index fdc3d3b9b1f0b5199e43016d996b14538b0deeef..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 456 zcmV;(0XP1MP);s!WZ{{ft4cZ5xKbG4#+SS`Q zI2uw)u9|(yV|4>&nmck-|P+E%t3nl9hFd5j_^MVZe(FaNDQx>?TY9Z-h$WKd6DnI9YI yZ+0(%_j4YadYpp(mDp+ML4>9N00000c<}{l0k2sA0000;s!WZ{{ft4cZ5xKbG4#+SS`Q zI2uw)u9|(yV|4>&nmck-|P+E%t3nl9hFd5j_^MVZe(FaNDQx>?TY9Z-h$WKd6DnI9YI yZ+0(%_j4YadYpp(mDp+ML4>9N00000c<}{l0k2sA0000O41}p;-~WL<=z+0=1Om1tEU@3H#qtw22}5*_5JCvCo4!52c$FXo$VhXU?0M$^Bekqgf%Ka;M*^X|4 zEs9YCQ(xfJKmNC#+8dY%2&wT+>D^<3C%}_*k1^mvtO~`RE00000NkvXXu0mjf-kqOA diff --git a/old-tests/speculos/screenshots/sign/sign_reject/nanos/00001.png b/old-tests/speculos/screenshots/sign/sign_reject/nanos/00001.png deleted file mode 100644 index d369d6c856a874acef68fb26bc3f297dbb1576ec..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 465 zcmV;?0WSWDP)7P(1#36F1Hla_!V4%;eale74W;(9 z@r($FHSrFOMWz20(*%>!EXFTDh-KP%#osX2EkJzAX%1m0rt%Op@DLVOQ8~-=($p?Tf9VO?=vS|4A>(|~pVu8nKY>); z?y~m-{)Kko+jTX-;O%_a9b1EyyeA9o$oC{4;AhyDN@~FgB4@Y!czjQFO(9pnRLK>% z@R2f;Cv7>6ob5L z0eUg9CG*r2l=L-)j|wvIR4mH=Tx*t^#Pwng!!QiPFbu*!?bdt|jsTOk00000NkvXX Hu0mjf+I`jo diff --git a/old-tests/speculos/screenshots/sign/sign_reject/nanos/00002.png b/old-tests/speculos/screenshots/sign/sign_reject/nanos/00002.png deleted file mode 100644 index 174376140c7e4be36da5c75d7c298c0ae7b939d8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 501 zcmVfnXbj%?j4OY8^*I)Cx<4i)GFrc-bxYWs#nRCa(xmKO5GQy|tGjHXSZrR_->OEXiZAM!{vx=6N^d~Hm*|E rNySrbiA-VeUx>rua5x+e$FuPPtc!NFD2TG+00000NkvXXu0mjfMd9Mc diff --git a/old-tests/speculos/screenshots/sign/sign_reject/nanos/00003.png b/old-tests/speculos/screenshots/sign/sign_reject/nanos/00003.png deleted file mode 100644 index 56201e2463635c99001306416bfff51397380a2f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 495 zcmVL zi5Cv{juwC27&ifBma`<`q-!q!Dh{MlZ%>`GZS5CaPv?Cfj59)M1O zSPLWdGVPb748XUorO$h>SP06^unWt4Xt!lvhH`OADZ*IM)S?YtOcIsR7*c2D3&^g= zX3w}<5MR7v8w*>vLF3|RnqfIRNIb~5!Td&Dghqf^xTq?Q0WbcEP)U1fAP53y-e-EBLeETNG@X3U7~_u- zN;iOv_2VVT4B$Co44UFzc3asbds=TXLqA?Zd^Iw+CYxRyAe-a^*~I;qRcXYmR&{WL z9RPda%7sm(=a&P7^Uo{>Pe9ql*uAQ!4;nYZ3PzLLSV=-}5MtM@2+Tz@|o{cU}jZt#cKQB6q{sr!@ z?G|glknhzCZ`VB#Ht*=h*2EmFvM9*OInEy>j3v*vz>A$_?;x)uwK6 zsVK<{FquSYRm(QfhD&&tBKp^+7vvhh#j^dvdjfjukyRCFL{(C$VPZvKdNEF4Yn)q^ zT!rfd;CdwUJpiN34`ew74}{NK#yl%~f2|CHAP9mWSkDJj9DRhc1Xt4l0000{Uy diff --git a/old-tests/speculos/screenshots/sign/sign_reject/nanos/00005.png b/old-tests/speculos/screenshots/sign/sign_reject/nanos/00005.png deleted file mode 100644 index f4fd25b3d1fa6bf192b0aa7fe89316aba6584916..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 444 zcmV;t0Ym=13_!uD_dl=;yU;-z0>to1ta;Ex(h7)!NiI37 zs;5f>6|8C&3O>kGLj)tHu~#x3X%C?6c-746aHHIgopw(PRVSEAcLp^WAk#ms4-|x; mccb8cK?Tq+GlpRpMkl_{Kkb{|sAjk5Y(@*V#~rbuHu`7A_H&AxgwHf8y4cdKvg$JbB4n%ez%sZ31aBYd&Oo@(7)_WJ(Znl2o8^PD` zFE`_Y-IS+Kdq0Q2-7r_C=}F(5ev`U`H~)QH|9$1FHE$YjoVax+e0xei%S`SAGlOm! zp7{T3NA-mVOYb&rdU8MdyIHo@@7cE*uj@I+Zu{2i)KMSV-E~o=IB2y*ZG^~MzRqRVa z$IoPUCbd&CnvBAl*@S4_4CrWW9ab`YpI!B1h#_%C$hm91-E}_e98fZIYo~wZNq94( z{U{-X5Rmv8AU0mxE=@PW+xt4x%B3UgnuX!McK-R~%ZK+}`fjumUr<}$FFK}h<9{S$iFUv&ITYbS*(yb>P^AOo$)taT zfD34XKXnoYpSp{h7oE;e={6|Ct((Pk|4+&gIm$z4b)J*`3p;&onNYsa3l2w-;pOl z@f88Fu+)lHIkX0e=!J`Q!f#U+aDzVUE?wlbpv`Br_2~4gB%F-?;R`urwa<8<-dBw4 zGl{w8MEVjx0qV=IGphcLkghp0Xy!nH>1{|b0En&8k`HHr?qt~3Tqm8Tap@%#Fy>tH z1_0^pXp&~5zY^I!`jr+?TkE1Q)rERBbRznnO#Djn$UL~rLQ~7c<;JW_NVQPQ^e@AX zk6Iyw5JCtc7wG>3CU)*A39}VCifL9u)fG}otz#DSq;d~BcR&sAO(~`+%YFr?-BeEz zJHEjgEeKQ%??!8!V)B9_DBjk(9Zhf&)(aC<4Uga9KqO3rKANV+DXQrvknzw{N)K>V zdf6dIgF+jksv_^a5NAdcW#p~49NGc>dF*`vqJ~Z^k!%_SCr9W8vUf0f-`|FQh+-PN z4=|S=s2Vn^RMnInuoa{PkwU>uGa-Z!LI@#m!G8*GN_dn3Ps9KK002ovPDHLkV1joc BmIwd< diff --git a/old-tests/speculos/screenshots/sign/sign_reject/nanosp/00002.png b/old-tests/speculos/screenshots/sign/sign_reject/nanosp/00002.png deleted file mode 100644 index 7a4bd198b695c083380950782886a310e771fbee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 544 zcmV+*0^j|KP)lGsZ=s91!4fY{(na?jTk0}2hciYWmA007&41Rg8rTz(wKVU;{C z=iKdHDKCZUpaO^U8Fiqya7Hs3Q9jk>vW~1j?JMd)wX#OkUe<+jVB;mJ7qzCcWc@YR zJj&K9;9O8@q?*yzCC85>;$GMBPf;)DJFJUl&XOxYb@te~GV18~DPrOjPLt-Ua&8IX z;wPX^K58P8E4>a}S-dio)=a3;84T9QJO!qE)v6TKjeGN#lYe|orn=ZorImV+bvJ|f z$58bOQ16^`H(|d}Z7zGLHn-BCdfwN0uzp6)xw*j(=9Bv=CFCHd|MeaawQK{Ie`E^U z%t}E3fK9rO1Wtvk@2h^f`dl>r#8SWd$%Y}Lh}S*0vo~-lG~K~FKL%Ov*yoQ$6EMFO zQFrU=2Y@WLORcvjSu@=jv+Ul;q13TFx$vz{46a9ik#=kP6`V{m*ek1V-9F3--i*7y zHlwI({3Vv{Z^0ALeH&`>X|6u+HCr@J&2`-iJlCLo-vbJn-|yFaYwZNw8EUf+nv5+* z%V2)6zAK70z}J!-{_0Tk97eKYAYO%(HD!#`&@lUi0Y3 z!mVF%)6EA9u=BuEo(YY40^~c?OWrl-K&C8fIou5)w4>toWc6}$sql4qX82zWF1Y7y zb?5jcR+J||dTFsX7_9cRcENHIRgjnR*lamSv1==nUFP{YqE+?vWZYE69oH6n&L7g2 zYOY23^;WdnncLxAjc|1d0002~uNkHXa1D34G#H4j502E=p4I8kkx`pEWGnAxK51(9 zUQqc~p?b91XlGHvhcx5c^_$Cg#PhW$C!LO2wokdo`6+>uk*dONRdE?4psY-KldqfU zxn!cWD%JU$9AHxgZB`MRCtO&P2fk&6!4ojj;`Ls_EiY6%Jmvo066X4?%u`~iimAIk tU4`s1;0 z?{f>9Zfbf|_00eLCwPudd#p2Mzfg8-=Z~Y&(Z3(6-dSPln_e}2 z&8bJe=5=w3_V0Wxpw!uqXV@ zTyg#0l&4R7|Ayyoo}1J3WZRs6lez;p_x-s3`O4ERHjEo5Zk@S4@1z`Oka)v{pj(C~ z>TB;CrkB0D2@>;k^>bP0l+XkKqsFS~ diff --git a/old-tests/speculos/screenshots/sign/sign_reject/nanox/00001.png b/old-tests/speculos/screenshots/sign/sign_reject/nanox/00001.png deleted file mode 100644 index 4e2a9978058d5fba50b7b4893d1a99e6df5d2e23..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 875 zcmV-x1C;!UP)=IB2y*ZG^~MzRqRVa z$IoPUCbd&CnvBAl*@S4_4CrWW9ab`YpI!B1h#_%C$hm91-E}_e98fZIYo~wZNq94( z{U{-X5Rmv8AU0mxE=@PW+xt4x%B3UgnuX!McK-R~%ZK+}`fjumUr<}$FFK}h<9{S$iFUv&ITYbS*(yb>P^AOo$)taT zfD34XKXnoYpSp{h7oE;e={6|Ct((Pk|4+&gIm$z4b)J*`3p;&onNYsa3l2w-;pOl z@f88Fu+)lHIkX0e=!J`Q!f#U+aDzVUE?wlbpv`Br_2~4gB%F-?;R`urwa<8<-dBw4 zGl{w8MEVjx0qV=IGphcLkghp0Xy!nH>1{|b0En&8k`HHr?qt~3Tqm8Tap@%#Fy>tH z1_0^pXp&~5zY^I!`jr+?TkE1Q)rERBbRznnO#Djn$UL~rLQ~7c<;JW_NVQPQ^e@AX zk6Iyw5JCtc7wG>3CU)*A39}VCifL9u)fG}otz#DSq;d~BcR&sAO(~`+%YFr?-BeEz zJHEjgEeKQ%??!8!V)B9_DBjk(9Zhf&)(aC<4Uga9KqO3rKANV+DXQrvknzw{N)K>V zdf6dIgF+jksv_^a5NAdcW#p~49NGc>dF*`vqJ~Z^k!%_SCr9W8vUf0f-`|FQh+-PN z4=|S=s2Vn^RMnInuoa{PkwU>uGa-Z!LI@#m!G8*GN_dn3Ps9KK002ovPDHLkV1joc BmIwd< diff --git a/old-tests/speculos/screenshots/sign/sign_reject/nanox/00002.png b/old-tests/speculos/screenshots/sign/sign_reject/nanox/00002.png deleted file mode 100644 index 7a4bd198b695c083380950782886a310e771fbee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 544 zcmV+*0^j|KP)lGsZ=s91!4fY{(na?jTk0}2hciYWmA007&41Rg8rTz(wKVU;{C z=iKdHDKCZUpaO^U8Fiqya7Hs3Q9jk>vW~1j?JMd)wX#OkUe<+jVB;mJ7qzCcWc@YR zJj&K9;9O8@q?*yzCC85>;$GMBPf;)DJFJUl&XOxYb@te~GV18~DPrOjPLt-Ua&8IX z;wPX^K58P8E4>a}S-dio)=a3;84T9QJO!qE)v6TKjeGN#lYe|orn=ZorImV+bvJ|f z$58bOQ16^`H(|d}Z7zGLHn-BCdfwN0uzp6)xw*j(=9Bv=CFCHd|MeaawQK{Ie`E^U z%t}E3fK9rO1Wtvk@2h^f`dl>r#8SWd$%Y}Lh}S*0vo~-lG~K~FKL%Ov*yoQ$6EMFO zQFrU=2Y@WLORcvjSu@=jv+Ul;q13TFx$vz{46a9ik#=kP6`V{m*ek1V-9F3--i*7y zHlwI({3Vv{Z^0ALeH&`>X|6u+HCr@J&2`-iJlCLo-vbJn-|yFaYwZNw8EUf+nv5+* z%V2)6zAK70z}J!-{_0Tk97eKYAYO%(HD!#`&@lUi0Y3 z!mVF%)6EA9u=BuEo(YY40^~c?OWrl-K&C8fIou5)w4>toWc6}$sql4qX82zWF1Y7y zb?5jcR+J||dTFsX7_9cRcENHIRgjnR*lamSv1==nUFP{YqE+?vWZYE69oH6n&L7g2 zYOY23^;WdnncLxAjc|1d0002~uNkHXa1D34G#H4j502E=p4I8kkx`pEWGnAxK51(9 zUQqc~p?b91XlGHvhcx5c^_$Cg#PhW$C!LO2wokdo`6+>uk*dONRdE?4psY-KldqfU zxn!cWD%JU$9AHxgZB`MRCtO&P2fk&6!4ojj;`Ls_EiY6%Jmvo066X4?%u`~iimAIk tO41}p;-~WL<=z+0=1Om1tEU@3H#qtw22}5*_5JCvCo4!52c$FXo$VhXU?0M$^Bekqgf%Ka;M*^X|4 zEs9YCQ(xfJKmNC#+8dY%2&wT+>D^<3C%}_*k1^mvtO~`RE00000NkvXXu0mjf-kqOA diff --git a/old-tests/speculos/screenshots/sign_tx/burn_reject/nanos/00001.png b/old-tests/speculos/screenshots/sign_tx/burn_reject/nanos/00001.png deleted file mode 100644 index 308a1abf687837eb918a67027fed9ac258cda658..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 288 zcmV+*0pI?KP)cm>cq zs;E6yFGsmU*@R7J-Df?~XWV3sc$xkHry(=_VVtO${$Q-ZOk9O#dJj1{kD*@R%$$H4 z+XZOxwqf7o{0{FR*27$X>T{V?H%QnsZiNE$A8yU5xcnTr1}hX`ktnZ$ypFyT7GSa! mmLT`#C*m6s5fKs5eY^kA%qZ;&$?vqU}Sdn!(spv>}U1{ z>S&Fo`TaP}) z01yCOIpvjwy0x)bmgP?TK#TBT2QZqByi`Acs>oD7jDpluKN!X!6K0`I&LU5R*D;-0 ztqZ&|^U=j~f|{k#}B z4)Di%0(GQh%XXzDG$sKK-Q2JkKR-`QsiPFD-4d_!i{fwH;J|_aEL%ZYNu#B0FJ7G| z;=_VQWOA9;dQ4Y9)LpKCV=ri`X({49JagUwO3&5UdSK)wEJxPN%9wG}45n;lzK(aC zKtbL$y*-#9uSql`7 zENOEh^0jsFWbV&<+yj5)WEX_aERLO-`${sQhD#B5ZCio#Fr4qHlr^7X|9DL69eFa= z#kf#}$Pcl(QEE=tNl8Pt$o;~Fk*8r@j8mpwSGW8d!1&11FbzPh@^gWj=oh7f%f7G)4s^6#xJL07*qo IM6N<$g02I(Gynhq diff --git a/old-tests/speculos/screenshots/sign_tx/burn_reject/nanos/00004.png b/old-tests/speculos/screenshots/sign_tx/burn_reject/nanos/00004.png deleted file mode 100644 index 9c7e7049cb3e9bcfb1601ec510ee465d38229d4d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 340 zcmV-a0jvIrP)b=%MgRq*37h4eRxPbkJCLY|1VIo49_}P}TKpH4$L<8?X{t;p zy+UQc_4@p%0?~E_&igM#?#L~IOHR(-<@sYotiy&C*Y&GII0yeh-p3zW9cv$Q0k>6Y_)5~SfP=m zSMUtz)%Ex|-o}7!H9hbQ(8{%C?kQVa?C`*Uj-J(h>P7(Y#?ZWvi?6}@n{fGLp>YTp myqR(V_$?>^<%seR_VWh!sAjk5Y(@*V#~rbuHu`7A_H&AxgwHf8y4cdKvg$JbB4n%ez%sZ31aBYd&Oo@(7)_WJ(Znl2o8^PD` zFE`_Y-IS+Kdq0Q2-7r_C=}F(5ev`U`H~)QH|9$1FHE$YjoVax+e0xei%S`SAGlOm! zp7{T3NA-mVOYb&rdU8MdyIHo@@7cE*uj@I+Zu{2i)KMSV-E~o>=5`jjNzMlT@h zzae7@N*=PmmFN!W3v{U6=P$CIoUrWl5+z{O*Y_}3zl4#8 zS9qDnBmjVyl&%>Ugr`i8m3IrxoPjI3NXAygp?-VZj{A-D$)0uw6C~h#4|%(JE?JwP z%>)UUC6v!e*9-b@Bw(;uf)d{5J1--ra}eH1ztvoR46^9o=0T`M|7LP9k}5RPL6GI( nQo;)W00000000000GIg$)?uOm8>e-)00000NkvXXu0mjfI1rXX diff --git a/old-tests/speculos/screenshots/sign_tx/burn_reject/nanosp/00002.png b/old-tests/speculos/screenshots/sign_tx/burn_reject/nanosp/00002.png deleted file mode 100644 index 96a5caeb32a1bfacfd54f0948eccd45612dd33fe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 387 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h6`U|{s}ba4!+nDh3=ZQjEQJPv_T zrNZCjPwxK0%o)kTw1n5}lx@68tBp@Vg8)ePaUns$jr+Kn^IuDID7MJ_O09jce82rQ z^9w3UhQ~yf#dti8Sy<(=UF%%%9Ix=rN%l-#=7IlxHePOB6!mX=HRoNM>B&9YF7nG+ zDa`CTYWT?S(@EC2pbPs1|4jVIabe}p8F!-ll8@RbUpN0szqo2f-nMHpzt^chTXNiPesljD^DW;d9?RbLN6P)Nkl`l1;k+@4An6g^M6kcbtxu@7*hfO000000DuchDWw$aQJnB& zJ%BsK3VrpQ1hnYqoNY&PO0WdV>i`7cs)e_@w@x()p@w=B24`klR6(CLpxqtlZO|2 zIWjpO-F~*EHtLqUMt)Wc_@bMv^h#{CUFW0M(vJ1P=5N1GhWcHM(-Xu*&bc@D4_o$^ z7Y|pL)I@*DzttR=&yLH#^{|TW)8Sp0qphw%epiuSUG#WHS~ht|j~;`U4>BXmdi9@& zuz>%00000G5i7^TsbXePb2LB O0000MjqtrV%Nn6esuj!jIMi}Btw`sohxwi1&U@}K{{10Q-!s%eVxF#kF6*2U FngGM>p?d%T diff --git a/old-tests/speculos/screenshots/sign_tx/burn_reject/nanox/00000.png b/old-tests/speculos/screenshots/sign_tx/burn_reject/nanox/00000.png deleted file mode 100644 index 657887225857cf48be8a8daed2cb3e89d4b29ece..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 381 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h6`U|@9dba4!+nDh2#G~Xcw0f)e( zJDk7cg{nU`wU4`s1;0 z?{f>9Zfbf|_00eLCwPudd#p2Mzfg8-=Z~Y&(Z3(6-dSPln_e}2 z&8bJe=5=w3_V0Wxpw!uqXV@ zTyg#0l&4R7|Ayyoo}1J3WZRs6lez;p_x-s3`O4ERHjEo5Zk@S4@1z`Oka)v{pj(C~ z>TB;CrkB0D2@>;k^>bP0l+XkKqsFS~ diff --git a/old-tests/speculos/screenshots/sign_tx/burn_reject/nanox/00001.png b/old-tests/speculos/screenshots/sign_tx/burn_reject/nanox/00001.png deleted file mode 100644 index c26449c146394f5bc84965c15224e2ebaff940a9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 341 zcmV-b0jmCqP)>=5`jjNzMlT@h zzae7@N*=PmmFN!W3v{U6=P$CIoUrWl5+z{O*Y_}3zl4#8 zS9qDnBmjVyl&%>Ugr`i8m3IrxoPjI3NXAygp?-VZj{A-D$)0uw6C~h#4|%(JE?JwP z%>)UUC6v!e*9-b@Bw(;uf)d{5J1--ra}eH1ztvoR46^9o=0T`M|7LP9k}5RPL6GI( nQo;)W00000000000GIg$)?uOm8>e-)00000NkvXXu0mjfI1rXX diff --git a/old-tests/speculos/screenshots/sign_tx/burn_reject/nanox/00002.png b/old-tests/speculos/screenshots/sign_tx/burn_reject/nanox/00002.png deleted file mode 100644 index 96a5caeb32a1bfacfd54f0948eccd45612dd33fe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 387 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h6`U|{s}ba4!+nDh3=ZQjEQJPv_T zrNZCjPwxK0%o)kTw1n5}lx@68tBp@Vg8)ePaUns$jr+Kn^IuDID7MJ_O09jce82rQ z^9w3UhQ~yf#dti8Sy<(=UF%%%9Ix=rN%l-#=7IlxHePOB6!mX=HRoNM>B&9YF7nG+ zDa`CTYWT?S(@EC2pbPs1|4jVIabe}p8F!-ll8@RbUpN0szqo2f-nMHpzt^chTXNiPesljD^DW;d9?RbLN6P)Nkl`l1;k+@4An6g^M6kcbtxu@7*hfO000000DuchDWw$aQJnB& zJ%BsK3VrpQ1hnYqoNY&PO0WdV>i`7cs)e_@w@x()p@w=B24`klR6(CLpxqtlZO|2 zIWjpO-F~*EHtLqUMt)Wc_@bMv^h#{CUFW0M(vJ1P=5N1GhWcHM(-Xu*&bc@D4_o$^ z7Y|pL)I@*DzttR=&yLH#^{|TW)8Sp0qphw%epiuSUG#WHS~ht|j~;`U4>BXmdi9@& zuz>%00000G5i7^TsbXePb2LB O0000j&LwL#RobX?V zbQiII^4uMl|Z~1l7yy12MZ$b&j z?TtJM^{@JVDT&uHZn5nzWh-TPv_J7m;jgq0f(|YbTZHdAM)myZxO-=(=&Jp4l55=A zUQcBF*M05wg}=Y7bG1(&{&siyl(&8#-KTdql}}rLm3hWhy}m5glJN5fpDsOd=_5x% z{HDvZre)46&g0e%{pDoXaPf-VTe-XJSGLU(Jj!tDNp8H)+;exzHoZ2kko_Ba_xXNR zr;WUGZIbufwyah@qN*6%Wc!qrE&9UV%v{IGH{4)eXE1ondwSC@^_ATTjUX{kS3j3^ HP6O41}p;-~WL<=z+0=1Om1tEU@3H#qtw22}5*_5JCvCo4!52c$FXo$VhXU?0M$^Bekqgf%Ka;M*^X|4 zEs9YCQ(xfJKmNC#+8dY%2&wT+>D^<3C%}_*k1^mvtO~`RE00000NkvXXu0mjf-kqOA diff --git a/old-tests/speculos/screenshots/sign_tx/burn_tx/nanos/00001.png b/old-tests/speculos/screenshots/sign_tx/burn_tx/nanos/00001.png deleted file mode 100644 index 308a1abf687837eb918a67027fed9ac258cda658..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 288 zcmV+*0pI?KP)cm>cq zs;E6yFGsmU*@R7J-Df?~XWV3sc$xkHry(=_VVtO${$Q-ZOk9O#dJj1{kD*@R%$$H4 z+XZOxwqf7o{0{FR*27$X>T{V?H%QnsZiNE$A8yU5xcnTr1}hX`ktnZ$ypFyT7GSa! mmLT`#C*m6s5fKs5eY^kA%qZ;&$?vqU}Sdn!(spv>}U1{ z>S&Fo`TaP}) z01yCOIpvjwy0x)bmgP?TK#TBT2QZqByi`Acs>oD7jDpluKN!X!6K0`I&LU5R*D;-0 ztqZ&|^U=j~f|{k#}B z4)Di%0(GQh%XXzDG$sKK-Q2JkKR-`QsiPFD-4d_!i{fwH;J|_aEL%ZYNu#B0FJ7G| z;=_VQWOA9;dQ4Y9)LpKCV=ri`X({49JagUwO3&5UdSK)wEJxPN%9wG}45n;lzK(aC zKtbL$y*-#9uSql`7 zENOEh^0jsFWbV&<+yj5)WEX_aERLO-`${sQhD#B5ZCio#Fr4qHlr^7X|9DL69eFa= z#kf#}$Pcl(QEE=tNl8Pt$o;~Fk*8r@j8mpwSGW8d!1&11FbzPh@^gWj=oh7f%f7G)4s^6#xJL07*qo IM6N<$g02I(Gynhq diff --git a/old-tests/speculos/screenshots/sign_tx/burn_tx/nanosp/00000.png b/old-tests/speculos/screenshots/sign_tx/burn_tx/nanosp/00000.png deleted file mode 100644 index a58590b988714545e7960f7f400f360ffc5de41f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 382 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h6`U|@9hba4!+nDh2#bl+hG9*4k? zQuR0Wo;SViCn%lTo!KM1sAjk5Y(@*V#~rbuHu`7A_H&AxgwHf8y4cdKvg$JbB4n%ez%sZ31aBYd&Oo@(7)_WJ(Znl2o8^PD` zFE`_Y-IS+Kdq0Q2-7r_C=}F(5ev`U`H~)QH|9$1FHE$YjoVax+e0xei%S`SAGlOm! zp7{T3NA-mVOYb&rdU8MdyIHo@@7cE*uj@I+Zu{2i)KMSV-E~o>=5`jjNzMlT@h zzae7@N*=PmmFN!W3v{U6=P$CIoUrWl5+z{O*Y_}3zl4#8 zS9qDnBmjVyl&%>Ugr`i8m3IrxoPjI3NXAygp?-VZj{A-D$)0uw6C~h#4|%(JE?JwP z%>)UUC6v!e*9-b@Bw(;uf)d{5J1--ra}eH1ztvoR46^9o=0T`M|7LP9k}5RPL6GI( nQo;)W00000000000GIg$)?uOm8>e-)00000NkvXXu0mjfI1rXX diff --git a/old-tests/speculos/screenshots/sign_tx/burn_tx/nanosp/00002.png b/old-tests/speculos/screenshots/sign_tx/burn_tx/nanosp/00002.png deleted file mode 100644 index 96a5caeb32a1bfacfd54f0948eccd45612dd33fe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 387 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h6`U|{s}ba4!+nDh3=ZQjEQJPv_T zrNZCjPwxK0%o)kTw1n5}lx@68tBp@Vg8)ePaUns$jr+Kn^IuDID7MJ_O09jce82rQ z^9w3UhQ~yf#dti8Sy<(=UF%%%9Ix=rN%l-#=7IlxHePOB6!mX=HRoNM>B&9YF7nG+ zDa`CTYWT?S(@EC2pbPs1|4jVIabe}p8F!-ll8@RbUpN0szqo2f-nMHpzt^chTXNiPesljD^DW;d9?RbLN6P)Nkl`l1;k+@4An6g^M6kcbtxu@7*hfO000000DuchDWw$aQJnB& zJ%BsK3VrpQ1hnYqoNY&PO0WdV>i`7cs)e_@w@x()p@w=B24`klR6(CLpxqtlZO|2 zIWjpO-F~*EHtLqUMt)Wc_@bMv^h#{CUFW0M(vJ1P=5N1GhWcHM(-Xu*&bc@D4_o$^ z7Y|pL)I@*DzttR=&yLH#^{|TW)8Sp0qphw%epiuSUG#WHS~ht|j~;`U4>BXmdi9@& zuz>%00000G5i7^TsbXePb2LB O0000U4`s1;0 z?{f>9Zfbf|_00eLCwPudd#p2Mzfg8-=Z~Y&(Z3(6-dSPln_e}2 z&8bJe=5=w3_V0Wxpw!uqXV@ zTyg#0l&4R7|Ayyoo}1J3WZRs6lez;p_x-s3`O4ERHjEo5Zk@S4@1z`Oka)v{pj(C~ z>TB;CrkB0D2@>;k^>bP0l+XkKqsFS~ diff --git a/old-tests/speculos/screenshots/sign_tx/burn_tx/nanox/00001.png b/old-tests/speculos/screenshots/sign_tx/burn_tx/nanox/00001.png deleted file mode 100644 index c26449c146394f5bc84965c15224e2ebaff940a9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 341 zcmV-b0jmCqP)>=5`jjNzMlT@h zzae7@N*=PmmFN!W3v{U6=P$CIoUrWl5+z{O*Y_}3zl4#8 zS9qDnBmjVyl&%>Ugr`i8m3IrxoPjI3NXAygp?-VZj{A-D$)0uw6C~h#4|%(JE?JwP z%>)UUC6v!e*9-b@Bw(;uf)d{5J1--ra}eH1ztvoR46^9o=0T`M|7LP9k}5RPL6GI( nQo;)W00000000000GIg$)?uOm8>e-)00000NkvXXu0mjfI1rXX diff --git a/old-tests/speculos/screenshots/sign_tx/burn_tx/nanox/00002.png b/old-tests/speculos/screenshots/sign_tx/burn_tx/nanox/00002.png deleted file mode 100644 index 96a5caeb32a1bfacfd54f0948eccd45612dd33fe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 387 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h6`U|{s}ba4!+nDh3=ZQjEQJPv_T zrNZCjPwxK0%o)kTw1n5}lx@68tBp@Vg8)ePaUns$jr+Kn^IuDID7MJ_O09jce82rQ z^9w3UhQ~yf#dti8Sy<(=UF%%%9Ix=rN%l-#=7IlxHePOB6!mX=HRoNM>B&9YF7nG+ zDa`CTYWT?S(@EC2pbPs1|4jVIabe}p8F!-ll8@RbUpN0szqo2f-nMHpzt^chTXNiPesljD^DW;d9?RbLN6P)Nkl`l1;k+@4An6g^M6kcbtxu@7*hfO000000DuchDWw$aQJnB& zJ%BsK3VrpQ1hnYqoNY&PO0WdV>i`7cs)e_@w@x()p@w=B24`klR6(CLpxqtlZO|2 zIWjpO-F~*EHtLqUMt)Wc_@bMv^h#{CUFW0M(vJ1P=5N1GhWcHM(-Xu*&bc@D4_o$^ z7Y|pL)I@*DzttR=&yLH#^{|TW)8Sp0qphw%epiuSUG#WHS~ht|j~;`U4>BXmdi9@& zuz>%00000G5i7^TsbXePb2LB O0000O41}p;-~WL<=z+0=1Om1tEU@3H#qtw22}5*_5JCvCo4!52c$FXo$VhXU?0M$^Bekqgf%Ka;M*^X|4 zEs9YCQ(xfJKmNC#+8dY%2&wT+>D^<3C%}_*k1^mvtO~`RE00000NkvXXu0mjf-kqOA diff --git a/old-tests/speculos/screenshots/sign_tx/sign_confirm_tx/nanos/00001.png b/old-tests/speculos/screenshots/sign_tx/sign_confirm_tx/nanos/00001.png deleted file mode 100644 index 235fddd69bbcda243e068dffb5a58b21f5a1e86e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 292 zcmV+<0o(qGP)tV$$p$_Ru*6xjI870ssJTr{w#4!d0BCk=J7TE|B?LVNKzIwji=*G)>0zGv{^X?AK>k$+^_sZ)6bWiYz{4Id2 zs3dBvJdU_SEyAj^?DIU)cbu_Fyhwk8(~yz=Hl3)E{$^MMOE`rrIjzGbe?QB^>$6)< z=eC@C9sXF!dICh$ynM-aHn`gCwy2-fol=DNwR?59@Y;RnwDVw~1(&y>{{#zQ%*_Hg qI1NnrxDDm1s0t%WB>(^bKwKYk&XoT4vo3M~0000L>O}Ww7L&wWV>}Fm~*&K%TRH z##24c5&xbcs*?ja&Ra0Yd3&1gR6|0W^73+F=~z;wh^7BYsHw4R%BSkha1z^Q8RE;cPe30qJ6%`@F=Q*PAdS0Zh2 zHq`#T@7lj0NH4R$05i$V{xXzQGy98S4R*p+XeV9!u+!j_U4gKXpbDyORR2;Hf6$Bd zhjd2mh@d!wWrD0BVf~!WOlXM=N5GY3)Q#>&9K^164S29>J=&B}Imf7`V_mWvuDG&{ zk7P6m)D^%H)<_s>X7t>{LS9NaboWmNFi7L}LMDU)}1upe}R12G$@wd0#xgUGY{Ny6!W|cjisdkdCv)5;@wB5-x=j~f|{k#}B z4)Di%0(GQh%XXzDG$sKK-Q2JkKR-`QsiPFD-4d_!i{fwH;J|_aEL%ZYNu#B0FJ7G| z;=_VQWOA9;dQ4Y9)LpKCV=ri`X({49JagUwO3&5UdSK)wEJxPN%9wG}45n;lzK(aC zKtbL$y*-#9uSql`7 zENOEh^0jsFWbV&<+yj5)WEX_aERLO-`${sQhD#B5ZCio#Fr4qHlr^7X|9DL69eFa= z#kf#}$Pcl(QEE=tNl8Pt$o;~Fk*8r@j8mpwSGW8d!1&11FbzPh@^gWj=oh7f%f7G)4s^6#xJL07*qo IM6N<$g02I(Gynhq diff --git a/old-tests/speculos/screenshots/sign_tx/sign_confirm_tx/nanosp/00000.png b/old-tests/speculos/screenshots/sign_tx/sign_confirm_tx/nanosp/00000.png deleted file mode 100644 index a58590b988714545e7960f7f400f360ffc5de41f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 382 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h6`U|@9hba4!+nDh2#bl+hG9*4k? zQuR0Wo;SViCn%lTo!KM1sAjk5Y(@*V#~rbuHu`7A_H&AxgwHf8y4cdKvg$JbB4n%ez%sZ31aBYd&Oo@(7)_WJ(Znl2o8^PD` zFE`_Y-IS+Kdq0Q2-7r_C=}F(5ev`U`H~)QH|9$1FHE$YjoVax+e0xei%S`SAGlOm! zp7{T3NA-mVOYb&rdU8MdyIHo@@7cE*uj@I+Zu{2i)KMSV-E~oq z+M3y2)wY&DZVGHbP#55RN*S$|OIDf|DGuQM=U!cu9 zmS~*aG1Yd*zoJUUr*DgA%g;W!{NHn#N1PG6(r5en{@j|keWtpDzWHUQZLYSZQD>ih zE-0|rx%qEaktG3V{f=)5-yJPw(q z<%j-FKN9y#FxDmajl`pXtya&o+deYqd=OYJ0@TIO@VF*LGHY$;#Hj3PA9L45=AKVk z_3y&7-CM4esQtUaQWX2=w2{futzp@3qtoV;-*;T>BY%BT@LeP8%G4W6lD2c{Pb<$o z{_*RC^CjI(f;+ek>s%dQmnC{{XV3T(s?jy`$X@GLoqMX8^tP2x5Z%O^9sISz6E;$_}lj;~)|*H z-7B8?e=pL#RBpI7Q%ZNS?&~P?t$VJV_#El&@Tbsb-`U+~UpuQzDSUkJPQ+x(1B-=J zR?QQ3@h)nvaM(J1N}b=Ms8feoI(9ugqpUacXmwoCbtT~k5o=!Y&UgL8^&-YO|G((* z@A3ck9oq1vx@MRt46&==}EIgKnUL=SO;yo(M# ZNX6gne$JpRn+Zw;44$rjF6*2UngBLd_JjZc diff --git a/old-tests/speculos/screenshots/sign_tx/sign_confirm_tx/nanosp/00003.png b/old-tests/speculos/screenshots/sign_tx/sign_confirm_tx/nanosp/00003.png deleted file mode 100644 index 570ce28d53e82ac396ba25c370110058f3a638f9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 472 zcmV;}0Vn>6P)Nkl`l1;k+@4An6g^M6kcbtxu@7*hfO000000DuchDWw$aQJnB& zJ%BsK3VrpQ1hnYqoNY&PO0WdV>i`7cs)e_@w@x()p@w=B24`klR6(CLpxqtlZO|2 zIWjpO-F~*EHtLqUMt)Wc_@bMv^h#{CUFW0M(vJ1P=5N1GhWcHM(-Xu*&bc@D4_o$^ z7Y|pL)I@*DzttR=&yLH#^{|TW)8Sp0qphw%epiuSUG#WHS~ht|j~;`U4>BXmdi9@& zuz>%00000G5i7^TsbXePb2LB O0000U4`s1;0 z?{f>9Zfbf|_00eLCwPudd#p2Mzfg8-=Z~Y&(Z3(6-dSPln_e}2 z&8bJe=5=w3_V0Wxpw!uqXV@ zTyg#0l&4R7|Ayyoo}1J3WZRs6lez;p_x-s3`O4ERHjEo5Zk@S4@1z`Oka)v{pj(C~ z>TB;CrkB0D2@>;k^>bP0l+XkKqsFS~ diff --git a/old-tests/speculos/screenshots/sign_tx/sign_confirm_tx/nanox/00001.png b/old-tests/speculos/screenshots/sign_tx/sign_confirm_tx/nanox/00001.png deleted file mode 100644 index 0186ef4ba122924fb34895fd2c48ff6042a6ce9e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 354 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h6`U|`hrba4!+nDh2VAYYRKPs78^ zJ)Ga|FTHzo*eQ7T#zrpP5B2_5=9{)$NDKyPnhq z+M3y2)wY&DZVGHbP#55RN*S$|OIDf|DGuQM=U!cu9 zmS~*aG1Yd*zoJUUr*DgA%g;W!{NHn#N1PG6(r5en{@j|keWtpDzWHUQZLYSZQD>ih zE-0|rx%qEaktG3V{f=)5-yJPw(q z<%j-FKN9y#FxDmajl`pXtya&o+deYqd=OYJ0@TIO@VF*LGHY$;#Hj3PA9L45=AKVk z_3y&7-CM4esQtUaQWX2=w2{futzp@3qtoV;-*;T>BY%BT@LeP8%G4W6lD2c{Pb<$o z{_*RC^CjI(f;+ek>s%dQmnC{{XV3T(s?jy`$X@GLoqMX8^tP2x5Z%O^9sISz6E;$_}lj;~)|*H z-7B8?e=pL#RBpI7Q%ZNS?&~P?t$VJV_#El&@Tbsb-`U+~UpuQzDSUkJPQ+x(1B-=J zR?QQ3@h)nvaM(J1N}b=Ms8feoI(9ugqpUacXmwoCbtT~k5o=!Y&UgL8^&-YO|G((* z@A3ck9oq1vx@MRt46&==}EIgKnUL=SO;yo(M# ZNX6gne$JpRn+Zw;44$rjF6*2UngBLd_JjZc diff --git a/old-tests/speculos/screenshots/sign_tx/sign_confirm_tx/nanox/00003.png b/old-tests/speculos/screenshots/sign_tx/sign_confirm_tx/nanox/00003.png deleted file mode 100644 index 570ce28d53e82ac396ba25c370110058f3a638f9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 472 zcmV;}0Vn>6P)Nkl`l1;k+@4An6g^M6kcbtxu@7*hfO000000DuchDWw$aQJnB& zJ%BsK3VrpQ1hnYqoNY&PO0WdV>i`7cs)e_@w@x()p@w=B24`klR6(CLpxqtlZO|2 zIWjpO-F~*EHtLqUMt)Wc_@bMv^h#{CUFW0M(vJ1P=5N1GhWcHM(-Xu*&bc@D4_o$^ z7Y|pL)I@*DzttR=&yLH#^{|TW)8Sp0qphw%epiuSUG#WHS~ht|j~;`U4>BXmdi9@& zuz>%00000G5i7^TsbXePb2LB O0000O41}p;-~WL<=z+0=1Om1tEU@3H#qtw22}5*_5JCvCo4!52c$FXo$VhXU?0M$^Bekqgf%Ka;M*^X|4 zEs9YCQ(xfJKmNC#+8dY%2&wT+>D^<3C%}_*k1^mvtO~`RE00000NkvXXu0mjf-kqOA diff --git a/old-tests/speculos/screenshots/sign_tx/sign_reject_tx/nanos/00001.png b/old-tests/speculos/screenshots/sign_tx/sign_reject_tx/nanos/00001.png deleted file mode 100644 index 235fddd69bbcda243e068dffb5a58b21f5a1e86e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 292 zcmV+<0o(qGP)tV$$p$_Ru*6xjI870ssJTr{w#4!d0BCk=J7TE|B?LVNKzIwji=*G)>0zGv{^X?AK>k$+^_sZ)6bWiYz{4Id2 zs3dBvJdU_SEyAj^?DIU)cbu_Fyhwk8(~yz=Hl3)E{$^MMOE`rrIjzGbe?QB^>$6)< z=eC@C9sXF!dICh$ynM-aHn`gCwy2-fol=DNwR?59@Y;RnwDVw~1(&y>{{#zQ%*_Hg qI1NnrxDDm1s0t%WB>(^bKwKYk&XoT4vo3M~0000L>O}Ww7L&wWV>}Fm~*&K%TRH z##24c5&xbcs*?ja&Ra0Yd3&1gR6|0W^73+F=~z;wh^7BYsHw4R%BSkha1z^Q8RE;cPe30qJ6%`@F=Q*PAdS0Zh2 zHq`#T@7lj0NH4R$05i$V{xXzQGy98S4R*p+XeV9!u+!j_U4gKXpbDyORR2;Hf6$Bd zhjd2mh@d!wWrD0BVf~!WOlXM=N5GY3)Q#>&9K^164S29>J=&B}Imf7`V_mWvuDG&{ zk7P6m)D^%H)<_s>X7t>{LS9NaboWmNFi7L}LMDU)}1upe}R12G$@wd0#xgUGY{Ny6!W|cjisdkdCv)5;@wB5-x=j~f|{k#}B z4)Di%0(GQh%XXzDG$sKK-Q2JkKR-`QsiPFD-4d_!i{fwH;J|_aEL%ZYNu#B0FJ7G| z;=_VQWOA9;dQ4Y9)LpKCV=ri`X({49JagUwO3&5UdSK)wEJxPN%9wG}45n;lzK(aC zKtbL$y*-#9uSql`7 zENOEh^0jsFWbV&<+yj5)WEX_aERLO-`${sQhD#B5ZCio#Fr4qHlr^7X|9DL69eFa= z#kf#}$Pcl(QEE=tNl8Pt$o;~Fk*8r@j8mpwSGW8d!1&11FbzPh@^gWj=oh7f%f7G)4s^6#xJL07*qo IM6N<$g02I(Gynhq diff --git a/old-tests/speculos/screenshots/sign_tx/sign_reject_tx/nanos/00004.png b/old-tests/speculos/screenshots/sign_tx/sign_reject_tx/nanos/00004.png deleted file mode 100644 index 9c7e7049cb3e9bcfb1601ec510ee465d38229d4d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 340 zcmV-a0jvIrP)b=%MgRq*37h4eRxPbkJCLY|1VIo49_}P}TKpH4$L<8?X{t;p zy+UQc_4@p%0?~E_&igM#?#L~IOHR(-<@sYotiy&C*Y&GII0yeh-p3zW9cv$Q0k>6Y_)5~SfP=m zSMUtz)%Ex|-o}7!H9hbQ(8{%C?kQVa?C`*Uj-J(h>P7(Y#?ZWvi?6}@n{fGLp>YTp myqR(V_$?>^<%seR_VWh!sAjk5Y(@*V#~rbuHu`7A_H&AxgwHf8y4cdKvg$JbB4n%ez%sZ31aBYd&Oo@(7)_WJ(Znl2o8^PD` zFE`_Y-IS+Kdq0Q2-7r_C=}F(5ev`U`H~)QH|9$1FHE$YjoVax+e0xei%S`SAGlOm! zp7{T3NA-mVOYb&rdU8MdyIHo@@7cE*uj@I+Zu{2i)KMSV-E~oq z+M3y2)wY&DZVGHbP#55RN*S$|OIDf|DGuQM=U!cu9 zmS~*aG1Yd*zoJUUr*DgA%g;W!{NHn#N1PG6(r5en{@j|keWtpDzWHUQZLYSZQD>ih zE-0|rx%qEaktG3V{f=)5-yJPw(q z<%j-FKN9y#FxDmajl`pXtya&o+deYqd=OYJ0@TIO@VF*LGHY$;#Hj3PA9L45=AKVk z_3y&7-CM4esQtUaQWX2=w2{futzp@3qtoV;-*;T>BY%BT@LeP8%G4W6lD2c{Pb<$o z{_*RC^CjI(f;+ek>s%dQmnC{{XV3T(s?jy`$X@GLoqMX8^tP2x5Z%O^9sISz6E;$_}lj;~)|*H z-7B8?e=pL#RBpI7Q%ZNS?&~P?t$VJV_#El&@Tbsb-`U+~UpuQzDSUkJPQ+x(1B-=J zR?QQ3@h)nvaM(J1N}b=Ms8feoI(9ugqpUacXmwoCbtT~k5o=!Y&UgL8^&-YO|G((* z@A3ck9oq1vx@MRt46&==}EIgKnUL=SO;yo(M# ZNX6gne$JpRn+Zw;44$rjF6*2UngBLd_JjZc diff --git a/old-tests/speculos/screenshots/sign_tx/sign_reject_tx/nanosp/00003.png b/old-tests/speculos/screenshots/sign_tx/sign_reject_tx/nanosp/00003.png deleted file mode 100644 index 570ce28d53e82ac396ba25c370110058f3a638f9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 472 zcmV;}0Vn>6P)Nkl`l1;k+@4An6g^M6kcbtxu@7*hfO000000DuchDWw$aQJnB& zJ%BsK3VrpQ1hnYqoNY&PO0WdV>i`7cs)e_@w@x()p@w=B24`klR6(CLpxqtlZO|2 zIWjpO-F~*EHtLqUMt)Wc_@bMv^h#{CUFW0M(vJ1P=5N1GhWcHM(-Xu*&bc@D4_o$^ z7Y|pL)I@*DzttR=&yLH#^{|TW)8Sp0qphw%epiuSUG#WHS~ht|j~;`U4>BXmdi9@& zuz>%00000G5i7^TsbXePb2LB O0000MjqtrV%Nn6esuj!jIMi}Btw`sohxwi1&U@}K{{10Q-!s%eVxF#kF6*2U FngGM>p?d%T diff --git a/old-tests/speculos/screenshots/sign_tx/sign_reject_tx/nanox/00000.png b/old-tests/speculos/screenshots/sign_tx/sign_reject_tx/nanox/00000.png deleted file mode 100644 index 657887225857cf48be8a8daed2cb3e89d4b29ece..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 381 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h6`U|@9dba4!+nDh2#G~Xcw0f)e( zJDk7cg{nU`wU4`s1;0 z?{f>9Zfbf|_00eLCwPudd#p2Mzfg8-=Z~Y&(Z3(6-dSPln_e}2 z&8bJe=5=w3_V0Wxpw!uqXV@ zTyg#0l&4R7|Ayyoo}1J3WZRs6lez;p_x-s3`O4ERHjEo5Zk@S4@1z`Oka)v{pj(C~ z>TB;CrkB0D2@>;k^>bP0l+XkKqsFS~ diff --git a/old-tests/speculos/screenshots/sign_tx/sign_reject_tx/nanox/00001.png b/old-tests/speculos/screenshots/sign_tx/sign_reject_tx/nanox/00001.png deleted file mode 100644 index 0186ef4ba122924fb34895fd2c48ff6042a6ce9e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 354 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!2~2@x4h6`U|`hrba4!+nDh2VAYYRKPs78^ zJ)Ga|FTHzo*eQ7T#zrpP5B2_5=9{)$NDKyPnhq z+M3y2)wY&DZVGHbP#55RN*S$|OIDf|DGuQM=U!cu9 zmS~*aG1Yd*zoJUUr*DgA%g;W!{NHn#N1PG6(r5en{@j|keWtpDzWHUQZLYSZQD>ih zE-0|rx%qEaktG3V{f=)5-yJPw(q z<%j-FKN9y#FxDmajl`pXtya&o+deYqd=OYJ0@TIO@VF*LGHY$;#Hj3PA9L45=AKVk z_3y&7-CM4esQtUaQWX2=w2{futzp@3qtoV;-*;T>BY%BT@LeP8%G4W6lD2c{Pb<$o z{_*RC^CjI(f;+ek>s%dQmnC{{XV3T(s?jy`$X@GLoqMX8^tP2x5Z%O^9sISz6E;$_}lj;~)|*H z-7B8?e=pL#RBpI7Q%ZNS?&~P?t$VJV_#El&@Tbsb-`U+~UpuQzDSUkJPQ+x(1B-=J zR?QQ3@h)nvaM(J1N}b=Ms8feoI(9ugqpUacXmwoCbtT~k5o=!Y&UgL8^&-YO|G((* z@A3ck9oq1vx@MRt46&==}EIgKnUL=SO;yo(M# ZNX6gne$JpRn+Zw;44$rjF6*2UngBLd_JjZc diff --git a/old-tests/speculos/screenshots/sign_tx/sign_reject_tx/nanox/00003.png b/old-tests/speculos/screenshots/sign_tx/sign_reject_tx/nanox/00003.png deleted file mode 100644 index 570ce28d53e82ac396ba25c370110058f3a638f9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 472 zcmV;}0Vn>6P)Nkl`l1;k+@4An6g^M6kcbtxu@7*hfO000000DuchDWw$aQJnB& zJ%BsK3VrpQ1hnYqoNY&PO0WdV>i`7cs)e_@w@x()p@w=B24`klR6(CLpxqtlZO|2 zIWjpO-F~*EHtLqUMt)Wc_@bMv^h#{CUFW0M(vJ1P=5N1GhWcHM(-Xu*&bc@D4_o$^ z7Y|pL)I@*DzttR=&yLH#^{|TW)8Sp0qphw%epiuSUG#WHS~ht|j~;`U4>BXmdi9@& zuz>%00000G5i7^TsbXePb2LB O0000j&LwL#RobX?V zbQiII^4uMl|Z~1l7yy12MZ$b&j z?TtJM^{@JVDT&uHZn5nzWh-TPv_J7m;jgq0f(|YbTZHdAM)myZxO-=(=&Jp4l55=A zUQcBF*M05wg}=Y7bG1(&{&siyl(&8#-KTdql}}rLm3hWhy}m5glJN5fpDsOd=_5x% z{HDvZre)46&g0e%{pDoXaPf-VTe-XJSGLU(Jj!tDNp8H)+;exzHoZ2kko_Ba_xXNR zr;WUGZIbufwyah@qN*6%Wc!qrE&9UV%v{IGH{4)eXE1ondwSC@^_ATTjUX{kS3j3^ HP6 (Rc, PublicKey) { - let wallet_manager = initialize_wallet_manager().expect("Couldn't start wallet manager"); - - // Update device list - const NO_DEVICE_HELP: &str = "No Ledger found, make sure you have a unlocked Ledger connected with the Ledger Wallet Everscale running"; - wallet_manager.update_devices().expect(NO_DEVICE_HELP); - assert!( - !wallet_manager.list_devices().is_empty(), - "{}", - NO_DEVICE_HELP - ); - - // Fetch the device path and base pubkey of a connected ledger device - let (base_pubkey, device_path) = wallet_manager - .list_devices() - .iter() - .find(|d| d.manufacturer == Manufacturer::Ledger) - .cloned() - .map(|d| (d.pubkey, d.host_device_path)) - .expect("No ledger device detected"); - - let ledger = wallet_manager.get_ledger(&device_path).expect("get device"); - - (ledger, base_pubkey) -} - -fn test_ledger_pubkey() -> anyhow::Result<()> { - let (ledger, _) = get_ledger(); - - let pubkey = ledger.get_pubkey(0, false)?; - assert_eq!( - hex::encode(pubkey.as_bytes()), - "6775b6a6ba3711a1c9ac1a62cacf62890ad1df5fbe4308dd9a17405c75b57f2e" - ); - - let pubkey = ledger.get_pubkey(1, false)?; - assert_eq!( - hex::encode(pubkey.as_bytes()), - "874dbbeb87f22f7c687cf5bfc33dc103d78c4a9c1e63dde53869202458ca7009" - ); - - let pubkey = ledger.get_pubkey(2, false)?; - assert_eq!( - hex::encode(pubkey.as_bytes()), - "3ca0c86c268d5e27f80e234cb66dc811afcd277f5882c3208466e1f3c9395b87" - ); - - Ok(()) -} - -fn test_ledger_address() -> anyhow::Result<()> { - let (ledger, _) = get_ledger(); - - let wallet_v3 = ledger.get_address(0, WalletType::WalletV3, false)?; - assert_eq!( - hex::encode(wallet_v3), - "ed7439e12d67d23fcaf701ff3bd4e30d390c1e8e14f6f40d52089590e28d9c70" - ); - - let ever_wallet = ledger.get_address(0, WalletType::EverWallet, false)?; - assert_eq!( - hex::encode(ever_wallet), - "3b94dd326f32f5ab14caef0a61d23e716271b20d7e273fc315ea3cfd0023c431" - ); - - let safe_multisig = ledger.get_address(0, WalletType::SafeMultisig, false)?; - assert_eq!( - hex::encode(safe_multisig), - "aafa193fdf6c11cd20a0831ae2a33f7ff4a5add95db7b7b30e7ceef6538e2621" - ); - - let safe_multisig_24 = ledger.get_address(0, WalletType::SafeMultisig24h, false)?; - assert_eq!( - hex::encode(safe_multisig_24), - "b4f9941d96904c22613581a4d905051f37ef41c5c0b995a60d5ebfc254e57a1a" - ); - - let setcode_multisig = ledger.get_address(0, WalletType::SetcodeMultisig, false)?; - assert_eq!( - hex::encode(setcode_multisig), - "7c75e3bff88ec399edc5ee3a31189ccff6fd564ad2708f3e7208d5c899077f9a" - ); - - let bridge_multisig = ledger.get_address(0, WalletType::BridgeMultisig, false)?; - assert_eq!( - hex::encode(bridge_multisig), - "95daf2ffc6c780ca4d4ef63495cf86f8a5f011d3e9fa10edb462ecdc64275136" - ); - - let surf = ledger.get_address(0, WalletType::Surf, false)?; - assert_eq!( - hex::encode(surf), - "a1297485df8e1608109ef009b02fab5668d16b6eec7f8c763bd4ec6474be40c5" - ); - - let multisig2 = ledger.get_address(0, WalletType::Multisig2, false)?; - assert_eq!( - hex::encode(multisig2), - "2bb06296f9c0be8d4290517d33018ea903b5de40504192953bf631f2e8b56b0b" - ); - - let multisig2_1 = ledger.get_address(0, WalletType::Multisig2_1, false)?; - assert_eq!( - hex::encode(multisig2_1), - "bcac3b0b6d2b65b29b18c48b72f76eed1d8dfc86b462086e2731948f1a2550b8" - ); - - Ok(()) -} - -// This test requires interactive approval of message signing on the ledger. -fn test_ledger_sign_message() -> anyhow::Result<()> { - let (ledger, _) = get_ledger(); - - let account = 0; - - // Get public key - let public_key = ledger.get_pubkey(account, false)?; - - // Transfer parameters - let flags = 3; - let bounce = true; - let amount = 123_456_785_012_345_678; - let destination = MsgAddressInt::from_str( - "0:df112b59eb82792623575194c60d2f547c68d54366644a3a5e02b8132f3c4c56", - )?; - - let gift = Gift { - flags, - bounce, - destination, - amount, - body: None, - state_init: None, - }; - let expiration = Expiration::Timeout(DEFAULT_EXPIRATION_TIMEOUT); - - let init_data = InitData::from_key(&public_key).with_wallet_id(WALLET_ID); - let (hash, _) = - init_data.make_transfer_payload(vec![gift], expiration.timestamp(&SimpleClock))?; - - let signature = ledger.sign_message(account, hash.as_slice())?; - - let mut message = Vec::with_capacity(SIGN_MAGIC.len() + hash.as_slice().len()); - message.extend(SIGN_MAGIC.to_vec()); - message.extend(hash.into_vec()); - - assert!(public_key.verify(message.as_slice(), &signature).is_ok()); - - Ok(()) -} - -// This test requires interactive approval of message signing on the ledger. -fn test_ledger_sign_send_transaction() -> anyhow::Result<()> { - let (ledger, _) = get_ledger(); - - let account = 0; - let wallet_type = WalletType::EverWallet; - - // Get public key - let public_key = ledger.get_pubkey(account, false)?; - - // Get address - let address_bytes = ledger.get_address(account, wallet_type, false)?; - let address = MsgAddressInt::with_standart( - None, - ton_block::BASE_WORKCHAIN_ID as i8, - AccountId::from(UInt256::from_be_bytes(&address_bytes)), - )?; - - // Prepare message - let message = ton_block::Message::with_ext_in_header(ton_block::ExternalInboundMessageHeader { - dst: address, - ..Default::default() - }); - - // Transfer parameters - let flags: u8 = 3; - let bounce = true; - let amount: u64 = 123_456_785_012_345_678; - let destination = MsgAddressInt::from_str( - "0:df112b59eb82792623575194c60d2f547c68d54366644a3a5e02b8132f3c4c56", - )?; - let body: ton_types::Cell = ton_types::deserialize_tree_of_cells(&mut base64::engine::general_purpose::STANDARD - .decode("te6ccgEBAwEAYAABa0ap1+wAAAAAAAAAAAAAAABJUE+AgBXkJWs9cE8kxGrqMpjBpeqPjRqobMyJR0vAVwJl54mK0AEBQ4AX5CVrPXBPJMRq6jKYwaXqj40aqGzMiUdLwFcCZeeJisgCAAA=")?.as_slice())?; - - let expiration = Expiration::Timeout(DEFAULT_EXPIRATION_TIMEOUT); - - let (function, input) = - MessageBuilder::new(nekoton_contracts::wallets::ever_wallet::send_transaction()) - .arg(destination) - .arg(BigUint128(amount.into())) - .arg(bounce) - .arg(flags) - .arg(body) - .build(); - - // Create unsigned message - let unsigned_message = make_labs_unsigned_message( - &SimpleClock, - message, - expiration, - &public_key, - Cow::Borrowed(function), - input, - )?; - let message_hash = unsigned_message.hash(); - - // Fake sign - let signature: Signature = [0_u8; 64]; - let signed = unsigned_message.sign_with_pruned_payload(&signature, 2)?; - - // Extract message body - let mut data = signed.message.body().trust_me(); - - let bit = data.get_next_bit()?; - assert!(bit); - - // Strip empty signature - data.move_by(SIGNATURE_LENGTH * 8)?; - - let meta = SignTransactionMeta::default(); - - let cell = data.into_cell(); - let boc = ton_types::serialize_toc(&cell)?; - - let signature = ledger.sign_transaction( - account, - wallet_type, - EVER_DECIMALS, - EVER_TICKER, - meta, - &boc, - )?; - assert!(public_key.verify(message_hash, &signature).is_ok()); - - Ok(()) -} - -// This test requires interactive approval of message signing on the ledger. -fn test_ledger_sign_send_msig_transaction() -> anyhow::Result<()> { - let (ledger, _) = get_ledger(); - - let account = 0; - let wallet_type = WalletType::SafeMultisig; - - // Get public key - let public_key = ledger.get_pubkey(account, false)?; - - // Get address - let address_bytes = ledger.get_address(account, wallet_type, false)?; - let address = MsgAddressInt::with_standart( - None, - ton_block::BASE_WORKCHAIN_ID as i8, - AccountId::from(UInt256::from_be_bytes(&address_bytes)), - )?; - - // Prepare message - let message = ton_block::Message::with_ext_in_header(ton_block::ExternalInboundMessageHeader { - dst: address, - ..Default::default() - }); - - // Transfer parameters - let flags: u8 = 3; - let bounce = true; - let amount: u64 = 123_456_785_012_345_678; - let destination = MsgAddressInt::from_str( - "0:df112b59eb82792623575194c60d2f547c68d54366644a3a5e02b8132f3c4c56", - )?; - let body: ton_types::Cell = ton_types::deserialize_tree_of_cells(&mut base64::engine::general_purpose::STANDARD - .decode("te6ccgEBAwEAYAABa0ap1+wAAAAAAAAAAAAAAABJUE+AgBXkJWs9cE8kxGrqMpjBpeqPjRqobMyJR0vAVwJl54mK0AEBQ4AX5CVrPXBPJMRq6jKYwaXqj40aqGzMiUdLwFcCZeeJisgCAAA=")?.as_slice())?; - - let expiration = Expiration::Timeout(DEFAULT_EXPIRATION_TIMEOUT); - - let (function, input) = - MessageBuilder::new(nekoton_contracts::wallets::multisig::send_transaction()) - .arg(destination) - .arg(BigUint128(amount.into())) - .arg(bounce) - .arg(flags) - .arg(body) - .build(); - - // Create unsigned message - let unsigned_message = make_labs_unsigned_message( - &SimpleClock, - message, - expiration, - &public_key, - Cow::Borrowed(function), - input, - )?; - let message_hash = unsigned_message.hash(); - - // Fake sign - let signature: Signature = [0_u8; 64]; - let signed = unsigned_message.sign_with_pruned_payload(&signature, 2)?; - - // Extract message body - let mut data = signed.message.body().trust_me(); - - let bit = data.get_next_bit()?; - assert!(bit); - - // Strip empty signature - data.move_by(SIGNATURE_LENGTH * 8)?; - - let meta = SignTransactionMeta::default(); - - let cell = data.into_cell(); - let boc = ton_types::serialize_toc(&cell)?; - - let signature = ledger.sign_transaction( - account, - wallet_type, - EVER_DECIMALS, - EVER_TICKER, - meta, - &boc, - )?; - assert!(public_key.verify(message_hash, &signature).is_ok()); - - Ok(()) -} - -// This test requires interactive approval of message signing on the ledger. -fn test_ledger_sign_confirm_transaction() -> anyhow::Result<()> { - // let boc = base64::decode("te6ccgEBAQEAOwAAcbO621NdG4jQ5NYNMWVnsUSFaO+v3yGEbs0LoC462r+XAAAAxHGVwt0ySiJcDVOgdrJKDeYh5nYAwA==")?; - - let boc = base64::engine::general_purpose::STANDARD - .decode("te6ccgEBAQEAOwAAcfDmnGpQVUZxL24fHgfUfLGp2/wzR+YWmZukQraxETyqAAAAxHF5r4KyShssDVOgdrJKGvzpVh6gwA==")?; - - let cell = ton_types::deserialize_tree_of_cells(&mut boc.as_slice())?; - - let message_hash = cell.repr_hash(); - - let (ledger, _) = get_ledger(); - - let account = 0; - let wallet_type = WalletType::SafeMultisig; - - // Get public key - let public_key = ledger.get_pubkey(account, false)?; - - let meta = SignTransactionMeta::default(); - - let signature = ledger.sign_transaction( - account, - wallet_type, - EVER_DECIMALS, - EVER_TICKER, - meta, - &boc, - )?; - assert!(public_key.verify(message_hash.as_slice(), &signature).is_ok()); - - Ok(()) -} - -// This test requires interactive approval of message signing on the ledger. -fn test_ledger_sign_submit_transaction() -> anyhow::Result<()> { - let boc = base64::engine::general_purpose::STANDARD - .decode("te6ccgEBBQEAyQABYbO621NdG4jQ5NYNMWVnsUSFaO+v3yGEbs0LoC462r+XAAAAxHGlca+ySiZfiY7BZsABAWOAG+Ilaz1wTyTEauoymMGl6o+NGqhszIlHS8BXAmXniYrAAAAAAAAAAAA202lAb5VWNAIBa0ap1+wAAAAAAAAAAAAAAABJUE+AgBXkJWs9cE8kxGrqMpjBpeqPjRqobMyJR0vAVwJl54mK0AMBQ4AX5CVrPXBPJMRq6jKYwaXqj40aqGzMiUdLwFcCZeeJisgEAAA=")?; - let cell = ton_types::deserialize_tree_of_cells(&mut boc.as_slice())?; - - let message_hash = cell.repr_hash(); - - let (ledger, _) = get_ledger(); - - let account = 0; - let wallet_type = WalletType::SafeMultisig; - - // Get public key - let public_key = ledger.get_pubkey(account, false)?; - - let meta = SignTransactionMeta::default(); - - let signature = ledger.sign_transaction( - account, - wallet_type, - USDT_DECIMALS, - USDT_TICKER, - meta, - &boc, - )?; - assert!(public_key.verify(message_hash.as_slice(), &signature).is_ok()); - - Ok(()) -} - -// This test requires interactive approval of message signing on the ledger. -fn test_ledger_sign_burn_transaction() -> anyhow::Result<()> { - let boc = base64::engine::general_purpose::STANDARD - .decode("te6ccgEBBQEAyQABYbO621NdG4jQ5NYNMWVnsUSFaO+v3yGEbs0LoC462r+XAAAAxHGxjJEySil5CY7BZsABAWOAG+Ilaz1wTyTEauoymMGl6o+NGqhszIlHS8BXAmXniYrAAAAAAAAAAAA202lAb5VWNAIBa1YlSK0AAAAAAAAAAAAAAABJUE+AgBXkJWs9cE8kxGrqMpjBpeqPjRqobMyJR0vAVwJl54mK0AMBQ4AX5CVrPXBPJMRq6jKYwaXqj40aqGzMiUdLwFcCZeeJitAEAAA=")?; - - let cell = ton_types::deserialize_tree_of_cells(&mut boc.as_slice())?; - - let message_hash = cell.repr_hash(); - - let (ledger, _) = get_ledger(); - - let account = 0; - let wallet_type = WalletType::SafeMultisig; - - // Get public key - let public_key = ledger.get_pubkey(account, false)?; - - let meta = SignTransactionMeta::default(); - - let signature = ledger.sign_transaction( - account, - wallet_type, - USDT_DECIMALS, - USDT_TICKER, - meta, - &boc, - )?; - assert!(public_key.verify(message_hash.as_slice(), &signature).is_ok()); - - Ok(()) -} - -// This test requires interactive approval of message signing on the ledger. -// Chunks test -fn test_ledger_sign_create_token_transaction() -> anyhow::Result<()> { - let boc = base64::engine::general_purpose::STANDARD - .decode("te6ccgECBgEAASwAIWHw5pxqUFVGcS9uHx4H1Hyxqdv8M0fmFpmbpEK2sRE8qgAAAMVB8+fysn958qZ3MjZAASFlgBpSNW8J55zSsfWhyOd5rDEjZgefz1LcWODp5B1bqgHogAAAAAAAAAAAAAAAJUC+QBA4AiOVEMgafQAACAoJgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACBQQDKEgBAUZsZIPd9xkGAco8YjJOBZgvCE3wlneY/Wx25kfOjumaAAAoSAEB1IDh09lVWihGkWEM9d9w01WXUrJVmfTd7p+dAZMyU/oAAChIAQGQCROE6sQnHzRREUyjfCGGj+o03d7B++Lo06vNLc44JgAA")?; - - let cell = ton_types::deserialize_tree_of_cells(&mut boc.as_slice())?; - - let message_hash = cell.hash(0); // pruned hash - - let (ledger, _) = get_ledger(); - - let account = 0; - let wallet_type = WalletType::SafeMultisig; - - // Get public key - let public_key = ledger.get_pubkey(account, false)?; - - let meta = SignTransactionMeta::default(); - - let signature = ledger.sign_transaction( - account, - wallet_type, - EVER_DECIMALS, - EVER_TICKER, - meta, - &boc, - )?; - assert!(public_key.verify(message_hash.as_slice(), &signature).is_ok()); - - Ok(()) -} - -fn main() { - if let Err(e) = do_run_tests() { - panic!("{:?}", e) - } -} - -macro_rules! run { - ($test:ident) => { - println!(" >>> Running {} <<<", stringify!($test)); - $test()?; - }; -} - -fn do_run_tests() -> anyhow::Result<()> { - run!(test_ledger_pubkey); - run!(test_ledger_address); - run!(test_ledger_sign_message); - run!(test_ledger_sign_send_transaction); - run!(test_ledger_sign_send_msig_transaction); - run!(test_ledger_sign_confirm_transaction); - run!(test_ledger_sign_submit_transaction); - run!(test_ledger_sign_burn_transaction); - run!(test_ledger_sign_create_token_transaction); - - Ok(()) -} From 65094f05a9a169278b36d978b7b5dad7b9f5eb97 Mon Sep 17 00:00:00 2001 From: n4l5u0r <59141606+n4l5u0r@users.noreply.github.com> Date: Mon, 24 Feb 2025 17:21:09 +0100 Subject: [PATCH 59/67] chore: update Everscale app icons and glyphs Update binary images for Everscale app icons in 32px and 40px sizes, and glyph in 64px size --- glyphs/app_everscale_64px.gif | Bin 228 -> 349 bytes icons/app_everscale_32px.gif | Bin 116 -> 186 bytes icons/app_everscale_40px.gif | Bin 497 -> 231 bytes 3 files changed, 0 insertions(+), 0 deletions(-) diff --git a/glyphs/app_everscale_64px.gif b/glyphs/app_everscale_64px.gif index 0125e6b45ca7127e161ad0fb4534a92b15b2e45a..5347c2c6fa5363f378fd96314c075bde8a4cf539 100644 GIT binary patch literal 349 zcmV-j0iym#Nk%w1VL$*t0P_F<|Ns9H5fS+K`0?@a@9*#9M)j$}13 zL8`87>%Jv5G;eL&u{7U&pXNKCuoeprkF1gr$qbN|P2>m~J&LH+VF;TQg1BAZ2OREs z$Yov!oxX9{ZJY)kCuZn%7zUqr?P+~c7X%K0RTc+@hJqCZ3ki^sl9QB`lnabGAp)72 z9|oPC9iUC3Af!yDpP{N5s8X#QuU4@evs$$pw_drfti2PvV!#)|X2cf8YRDDJZp;+U zH4Mg}tsmtvTqnxxZ0Ic2# z^KW4uNJ3&(rp&3f$T_+yjLIo(-*laGJKqcag1#S+C@~(959N~Ca6X|5Db-}XI;1ge zl{@2#$Kx;gjD}s(Y;v>>S7PJzskzRs;PaZjyXYrJ5@^&ysOEBL2SP~X2USNE2|4MA z$Fzr;85C%_+0&SF2r3p(CJJV7nwa&H$||@PYd9-gNPF8_;)XZGybGiT16K7IP6Ns}f_n9$$f-_z66 z-Q8VXU7eMcB_t#SRIK=ug@pkKbU*~i3$_WB!4Zav`V&;HqR mO2B%1uJ5~rr-wV_{=Pf;+I!~8x-drWCQ&9v-nKkJ25SHz{!OC* literal 116 zcmZ?wbhEHbRA5kGXkY+=|NsB%fM}2i15KIUBc02Qn~N0|4sJF$(|y diff --git a/icons/app_everscale_40px.gif b/icons/app_everscale_40px.gif index 497acdda52f82624832e11a552902670058f11a4..2c61a3d4bb9f91e6305968419c122a3635a525f4 100644 GIT binary patch literal 231 zcmV*>8#V(SQ<;1r_Go-l~q%Pqqu}|#oRRkZheiZ-YzUTtC9jXtlb&dWSdrLu>0`g z0%o*^EpO|59beCNkm1&S_iqE=c<)wNsE5*`hBZISw z#|_Vh#w^+Xj@=gdj*T59911rY7C5XANpot-Q1MuHl=lzI*@TykCsr$~+m;v_IGoul zkg?%|*QT@0ri^ORUcVcP92i;b?e};DG^p6*S&1 Date: Mon, 24 Feb 2025 17:23:08 +0100 Subject: [PATCH 60/67] test: update Flex device test snapshots Regenerate golden snapshots for Flex device UI tests, including scenarios for address wallet, public key, message signing, and transaction signing flows --- .../00000.png | Bin 8815 -> 8726 bytes .../00003.png | Bin 11323 -> 11236 bytes .../00000.png | Bin 8815 -> 8726 bytes .../00003.png | Bin 11323 -> 11236 bytes .../00000.png | Bin 8962 -> 8874 bytes .../00002.png | Bin 7706 -> 7620 bytes .../00000.png | Bin 8962 -> 8874 bytes .../flex/test_sign_message/00000.png | Bin 8592 -> 8503 bytes .../flex/test_sign_message/00002.png | Bin 9292 -> 9205 bytes .../flex/test_sign_message/00004.png | Bin 11323 -> 11236 bytes .../flex/test_sign_tx_burn_usdt/00000.png | Bin 9020 -> 8929 bytes .../flex/test_sign_tx_burn_usdt/00002.png | Bin 9674 -> 9589 bytes .../flex/test_sign_tx_burn_usdt/00004.png | Bin 11323 -> 11236 bytes .../flex/test_sign_tx_confirm/00000.png | Bin 9020 -> 8929 bytes .../flex/test_sign_tx_confirm/00002.png | Bin 9674 -> 9589 bytes .../flex/test_sign_tx_confirm/00004.png | Bin 11323 -> 11236 bytes .../flex/test_sign_tx_transfer/00000.png | Bin 9020 -> 8929 bytes .../flex/test_sign_tx_transfer/00002.png | Bin 9674 -> 9589 bytes .../flex/test_sign_tx_transfer/00004.png | Bin 11323 -> 11236 bytes 19 files changed, 0 insertions(+), 0 deletions(-) diff --git a/tests/snapshots/flex/test_get_address_wallet_v3_confirm_accepted/00000.png b/tests/snapshots/flex/test_get_address_wallet_v3_confirm_accepted/00000.png index 28a92efec6fe19fd60eef2b909f7258be6bbb967..271e83705fbfd3522154d6a998385cf0ce9aace3 100644 GIT binary patch literal 8726 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 YbPHZ{=UF89-b3cpNtkWz@vC?K3&s|UMF0Q* literal 8815 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 diff --git a/tests/snapshots/flex/test_get_address_wallet_v3_confirm_accepted/00003.png b/tests/snapshots/flex/test_get_address_wallet_v3_confirm_accepted/00003.png index 295f8f713e06a7a75774601ad62dc89a632ebca7..ed74cf147c87b585c57c686281fbdc6be7510914 100644 GIT binary patch literal 11236 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 GFa8(v^YEkq literal 11323 zcmeHtc{r49+$fPHYmt3P36&6ICtGL|UTV@PgcxI+vW$HwqAUqD)pExtnCp4&=e~dUZ@Yi%{o*e(V~!I-C+O(t zIKbDhS<=zbPtegFyUTJ67*TG?F{Y!FJqEs}ciTUMGDdk*TszY8c-FRn9?5$57&`2{ z!ubcR)=zI8Lua4YWwk!``po(5(8pt%mo#-5uQm8IX7R%)Q!Ct=sAleO1Cx)g6G3!z zGStvAIXb#*VR{a_8z;NzvU&eYANqb{Gm6v_LzpGy&-2_^yU7Tmi;I*j4@Gmex*Zb= zI~!7?CFy|)=sIjfSn_n!*_L5Ccr5!uXlEQ? zzVjyiysT}b1OPiASeNKM;wGHS>O!Zq{V|_hmF#|op5uXv_?-|w`B51FNW;~}9obA= z>hIYPH=qD6EG~3@wAP?-5BZvV*L4}fEP-$HDDVbU3wH{j;^>`D#!#0bWzMP+@m#vv z3qTKg`zw;&LBZcVsn|=Zlj7*OV7y1L?H|QQ) z->4NbnY>_UE*IuM9HI|k6{IE>KSJ5;&-1@{^j5gA({Jdna`bpT@nQ7{1zBgsKOHdV z%sip}_hXTk$J~s#g17%3>Td-971Mux5TLY`%@Swf1_?(v{|7D2->%$Z&7zebJ0?W; z+TpVW9b$H?elQ)N;|0q8QcIFu^FRFfL;sRhrI%Js$hkAw^tzV;R7ByIqh`%P2oOb=2A%PQ~QAOQ$|zDX$8u1*~gMrw$zKWZ(Jky%{y;h zK)YV4cDZQJivW~~ktvGS5DjKvZj_?n2d#Wl){Q@NK>H!fp!LFqYrnNo@Pi750RZAX zDEL7#pOPqZlYEBdAjp@VZjWzMyJ?rb?Qzq|FtfCT+M{fk9_kM&OoY$S;}=Knf7vMpox`&TA+T!HII56)(< zs^1(-y#cz)@NZTvj%yO+*4_Su3t;@eXx9{vkBSR0=4bq8Y+Ov)DHzb-tk}iod*=Wh zxo}KqIZi|IssMc)m+{l7kUy3(PSuDakQEo!Og`7Lnh)^nuU|MTemY!Vl3S%;=~7?= z9&+k|n(J?UjT`XK)tDDPeOf#+thuA!aHYXeVztO6y!jG%Z+_894>UDXs5iC2YxMTp z*-8Gh*>9f~>)wV4>^U=nDn8qm2_;$>2-4~48YJ`2<|ZOozMRQ^i#M@Mbcxhw1c3s* zoX|dzW{jZqKz+~N_w-#XE`^)j>yl}2Md&#wV!XNUl-AE>uQE9!o}a<2@*QCs9oCF^ z=e^GLMNfB1o4aWH**}BwhHpf6PImh{Bfj0GnA{y37U{~s&?oplJn)Fsan%EYE$r*D0EedgA6KA>g;!m;~cg4RsAJm~RB=PwX&Y?r_ds)1B%Xy(OA|F>VXk!K1VHN_cFu zutfG-i@GlR<_8q^Kx_4EZu&UYmFKSV5cr(2u0dVP`3r&^GXTks*20-9pzMYdz#I;G zj=W50L*7LW%+B* zSIpgwJ3h%)FPf%Cr+dM*dv23Tb*y~~SY8G8<<#=Mj^IQmXj*6BVyWzC_^GA+1tK_faxCOT0PoH#uzA75L#wcGH% z0-mP8?lfMr;~YEYyDbB3A8qbabHCH#<&^*8V%-?NvvGtH`Tji1(@n+#Vp~#tdRM;p zr-00Kcyx{$#ta{eUpKVyPXvKa5zu^wlNapKPMIF�o_78J0CIT#auC@#eViwj|?v zORZ8iaTozvxfZlQ}hT6D(>GBZ?*4{L-COeS%6 zi!U66H4e4gm*vm6mKdfxJ>#g~2*!Nz#Xm?2Eq8XA^Tj@s3jkNsCx@VY0v>@61pY`2bLRXRAzfid9 z!#+^l{O%jc7sQ2y;Hw=v87jA;#tt4hKOVGW@IYn^?XP$$masK-W23bQT!0=t67U+p zE7-Rq(B>^-13pKKK==~*Q|QNWOeK2v*1(M07wgi866 z%VlTu*lDAjE(L_}TQCs;kfU4LS@xzJnL8zK8bs>K{tduE@@6es*s?Pbn&hdF<(8=S+CzD=Sh6651P6Vl2s6p|y8c+fEmM-*JC zmF?(vRh~{jOH_?~u&I6nYtJ)0|I%@2?-Rm=n?UjfEN8O^6zx$x^2K##r2@ftIF3s^ zc{%fz8O)bV4X7JSdxt)GdAbalW9lMbMGP3X%Bg=epeK>0_9$JH=TukbX50kHbz;Ty zG&W}HvrIHz3OJIc68rQXq@5)5#mmF)D%8f0H`+?WPcec#lkRZRwpRUpJiq$l9d?2; z2r%;4QaL0D!{QALr&{Rf#!58!0%#m#~E3z6E6q$HGC?#F`b zln-_PrjNm4n;)-YOq8^mUfCXo^qE=OEQT92R=;C6p=nz6_le9#(&W}Ok280n1sX|B!yhfVE4@cuS zqwuj!47J*~D+Jw0w0bI(f|rw_WcHW|W)z?R*|dD^>V4Q6s`Lcgi#M2h@38g{q(yp4 zpV5BqM7rYWBK;5AC6vFeT~r)1MG)MiGl#OH-y4~!XUx_P+Wl%)a8@he&k1we3~LMw z9S)if7*AEk7|f+YjXt!(6F!~?dwJ{P8&BoKf5A7eEdTUUx#3)+KAWI)-77Y|bO zY8#M(eTIh9Ee(L;>MP}0js-j>of|KP`DL**J?i5TalRfmSN6p1HK*j}t&6#XT-{ry zD-kx#fBZD+KZ}9?V^sWqe&i@w_@b0SAlH^Mn~4}&h_tLNm&>N-znD^s&Uu0@yHi4? z)epI=q<6h8|9RzCtz3sIC2Effg*HoL0` zE9FkFc~%R5&H*eN8*9_bmGq}CrbV7l`EScQ#y2vRX)vf$#iyn8NKJAQfW>{e@H4H{;PKef;$nE(){aH2`P%PE zCqIMLbnq7SKT7br_`RY1XrcA{on6fe?7K_K;0`daAx7Gb2x^(KI1p`Ft!NJ-g7PIZ z>uk-ycrupuuo)Wps`tjmMQ|cs+xu$P3~F%@!Zj*PshQSo)t-d6DL$+lc4J@CTvz4) zsl&kFMoK#mGCil+Z96e|uD52qEy~wlU1t>W89eB`1kW&&COn)~v4B7*-Z|a_8)Hxn zj2Y$p-;aZ9?nmBv2gJ7eSh z7QCkoACt#FB2HBygkaDg)v6kZQ=FvIg_}{RZGElpcobWLMG zbMoWM%VgNOZ06$?d*_b)J%#$dVN1iDNSuFY_8DY~l{F#WzRKG4XyTbQ%Zl0 zrsZSKw^8pOoHVpRJ0T6rFgJLdSJgx~H;<$9i&!gVqBA}qk(F3q$~k2uA|(tR8euQc z@)+&3sjsnRq&aWoF(4a->eJte_Gm=EYeZDpGzN}*Ro#5fP}s z+S6186YpbOm%Wu??>NmWd8N-AF{p!DC4(uB>AGVnOh zKSY|5UZ3)&z@BRORYJ?CHiHG;09TiGkDqC2JxuA1prp-o$6H^o8_fSfvT`RzcH82A zQ}u)`^$tLlYTbwiLNHzBYd+jlPOtPR`6ew#-PE~H1UW(5KTz;3L%U)k9}(|KIxz-f ziB;lh2>D`fbqq1xda%pJ&l}-iOKQDi(zbhZuoTLPM1K3Rb=fYNr*= zId8ECWOjTMTi6I}ur;ZEE88Kp&X;)Qykw*&lhXqmCXdG=CPhnG-z9kZd>ih{YDlj< zoRgt0#ibjjeYC-f>}c|z{l2+=>~?P`&8D4plW|=s!u~F#A6cg@7T=553ck9$wX4AH zS2y-0P|s$7L?W57gWo)QptW%sxe4uL+%o86R27QCrD4>XG-g|GfaS^=QtLmnfs z%N*3g7+4y7#P{$m&RarNIDggynZEc3J8UYcz?9g^61T9iGYfGQ5-%whI$h)h-Q<{+ zw$iV=qiD|;mHI$`hwDlJVl-ftRAWQr+}~%r5)QCr9z^WzrcS7qN8OUv`j-6Pyt`y_ z!M+u|Mcgvd_#YA`Y~x6<<9ktPw!xr-bQ_x383N)h*Le*y%97}uK& zEhKTnjW`@-Q7wybiqC*)A)(!n2r_E~@{xYm8M|F%T_uARO30+PlGy>HVv>II&OqfJ zyJ}X4w6D#8uXaFddRx#r_NLlWAP^T_a&`prjgT{v8yW8eDvuNZ%I9EIefPtil73el z2@o~~xl1NwmCJ7U*d5Ww#Z~MtMaA99^=3xm9Z=Csp(ET~ryO}O4bI2T}!K8h23(MpeSFYqk}%}X3gd{OFriXu@B+^~jCtAzc%>B4`G4Jp%| zE9`u9&Px3E9yxRJ$<_GpR~||5w9|%I=3tELm2RMN1$L~gu<|=-&};b@5}~?w9}+;< z5+yNQeWoej%ZiJU;l7EIl(DOmH^eGc7kd^n1e+8VMd+4y5Ju)B|5)EWY0A7$B1#^d z2)Ma`Xmf~eJYaTrHAFb;^Jd|lVO3v69f#YO=O%t2M!q`$A*yF}lDlHb%N^qrnF<}c zigF)s!7<;zH1w!C)}0ug4X|ik`6H}XRaseC6y&8ht2JmE%d#b2u%~OO$QfKHk*e5H z4C^Egc@L#jsTy_7we3%iD0krNVG@~Tf{@$^oQZl?czVPa@}&;1Pj`Kg5rqqZI1;nQ z)8*eX2d&WFZM|LhN^nj+!}6;Z2+k9#rA-X>N@8d#Gr>Y>YGDLvKh3<*Pm-9+M}amd z)@M}?_~6uaPd@`PA>z2<2f|=+?UCk4F!DO6c4 z+%ir$$qvL3WkO{WJrBd4H(H&!dfR3|)y`TV^6eoc8i%gufGw(3)b8QwcXbj2*uItt z_3W|k8BFN(y^^;k_cJQk`cKT}6uxk*vfE$D`)Zv zukz#8?xzPz;Q(&TL0vTX3;_x}0RDCeAHlH_90VQzgGw6)DgO{6nK0rs?Grgvy%m{#Qs zwaz3%AnIgOAd*=w^~BwRp6I4I%vwAHymo~=5H(O{xJVWlKf~x87sOL+bOGgTym2z| zifdWbz$yQ-Y>B9TbI((pxP?m=ZzREFJ5xzmU1@Do^UmGYc?zFNKX@RHZ!(Gi1Hnlyy2Rkn-2km5U zh;0KQ20AMrj&_2lwM(x(wGaCF=~<0!Sya>4tA;=hSYXC$xVgr>RJbV!zaxPVt&EYR zq!UIB#p2~)1(QLLgGpZ5xi**Gk5b^D>hHxI88isqP($)s*J&Sfi+%p7K_&a`w$O&D z8#q{yor$3?+fYv?LSOwNrKC?pqM-R9UINA!1mFA$6alE$J5;NbJ_Xc-t1B0rZociB zfmm+*#y(_$7aXcS;axk@pC!GRbJbj?pe2I1?4!|^l_Rs}9zLIw2eE>eDpd+z`qgDCB^%nyuf5%MJJu;ab=J})N*xA%7Fp7-sk6f^nW$L- z^_~g1tHQj}!|IeUxgB-vL+FnhS1cE1I<|&i#4~Mre3oqoH?bOS*v01JBUq(F#R+f51Jp-DT{5RIwL@{g zl1Ly^DB3H_>R@56{)77+`>m)qj#XoxTf6%esPd3!SE_4v#V$WiGnRf;V542~ilCV# zjhdAUG*e&hso^6^x|SJM84AI)V`^#a)gIg77iR2rEXLwsmggtaE5M1LtzsEVBq1t)lLUj*WE1c?v5Et z&P``*!maL%XOt#&Q-R2UOmcvn^nHMz2OkC&CP>z8h2LCQFg1;mk;^%7P;e^8!lR0+W`7Vd!~Lp7Qmr^sWbEbGqMj6Csh9gG9a`1M7f35PDXUF| zX$d$sm&iOR_wIRPP&};%uf-2~8+&M?wC6dTTK^90uVaDk0s)OtGtS>JGwNA{(1X4C z`n>K^qNz-5M*aw;YQF%mvwqeZq3oO_5OB_Q(=6Lgyk~Bb5~z%^y^EJ{hF@oG`m4$i z)mMF)FXp>L5C2UpOVeMcpbm0#taAY|8k;u-eAftGd2VW;skwP(53_6}|Mx~?m9jfq zK?Msrv}R6g?Yr70ZhlFiEHy68RAXyOW)05?N3^(M!r0?}pFV^iPP8spE;;5xG4{kE zPhkAuku549RS=hliKzn_tl-2!w)e&Dw|_?ZbgOU`-?qh2haH`KuCgnBC^XoleNnRS zYtxzh`72n;sT44r(Z`12Rn>kahbKO{L3$UR@JzI-dTF2ll1ab07G64eyqRy-RU5~< zM_KxXE0tO-%#m4C97*q1kM1(?OK8dMn7=|>PnsVYNFaX%k_33GJQE>&!a46iTHfe% zKTfqdlQq}u;1hrHywjYl2O8M1_Qq5!pYzqNES`Y{WrBBss4i!}EPV(?DBA?3k2E3_ zeoNs%knFea-{wKy4m#aSE%K(tkN>7Jw4cXJhX5H1xQmHSCt>KvRIh*6Hf#vE@=}|} z2(#xXFQ=JX;IZr$BFY)nC>>y%cVzPOHy)_^of7K_{{R;vG9sy-{T1I*8cPgRLWf@p zRYrd@qMXG=p^1)b^JIG?jUS;&-laKaYCMtRs{qzyWrKFExaKe>I>r-0kLl=tU%8>O0*f{Sq__^M6zsKz9qwqTTDzhH9VL|}30XAM+I@5&!CsvR+rDGBg(M}f* z0bTQKeB&gzULS&|@@XEjE&ZxRTdE^6mt^nq8Y+GTOoh{Uut|nH;?Y)&;OafG+@J*oAD@n?@_n1;H3oLB=(`cVgvT8&b@R@)or9JmvxgT@n)BOp(LC08}@LT z7F@^cb4E4I`?&IVVo#)&V>`b*0zG~Zkq-v~Xj-rt5oCG`TnnIR0Q)($`q}!!G^GQa z_zr&Y1<+Fm0&ut++O^V#!~8(;@RGNBM{=6)1BeyJ?gs+pEQSCJh`|m;0L$*mcHS!# z1&mwGeWoM2`#x*e6&}?xPc!PFodPn0@)(o^7c_RnzW?-x3_~vE(BLvF8XK;Wo;c_uPnHtX9;l_X8jv~=Oh%R`K;^? zQnO^m-M8*`zF>q;^L?O@%K}fUS}sVfVj*7Z2E|qAq%0!ym)$Do&Joj9;wBJSBVNPu z6EF+KypT&}a3OdEP^O~H7+Xl{k)ZEnJ9d`N3IU+d9G%a@nprSiW%+4vp{M7?^S=MU zW+1V?;xDWDgs?FLTLg1;pVNp%BB+xu_Wg;JLed?}S3tOl_A|q+>0TMQ|*% z=Dy+=ok*a^$*uU*lAF;9Dwk|hq!=0!a+!~#+H0EOqbvTwlRBQKuta0&=4r1 zb&KgUt{f$OTZiu%_HOcW*02F}U#;f-?z1%JSSC<*x@e~T?d9hR?BwFkK<=*Ycqz`K zCM{ry{xoL)|HJ=7-1vn%!}79asw9S zJ67bwffyQvLmXaUZ|ZW!4!Ju+dw`_b7idSB>rPd_eZepVbQyqHE*1Zkv}pU`4)*<} z=(ALWCMG?fMjap!2(k;ucypNIPX4L|z5*869O&%`XlD^-spYcC9W(PjwcftJTe;}G zimbuV@(#M-i>}=Qle@bkl8z!R1;nD_;-fb3=lgO|O%m(|v;|slW}c_;QE40GIpGJu zehUbJ7K{!x(a_|12N!Bt^{RQzP4cXUqElNrpML2SGfdbI;AR9ipLO0fbA+O2n}C+M zV%;rcDEbtM;uM&YDPh6emZ(|q$;yLpy5%vM(#?vcy9)G3Pq05A1AYCFBnnbfX~?r$ zDa#7tbd^9IO}zxPn!k-;{nJbreK%_E%K=`EY?}D@&{Y)U@SFRp;8W6p?nwTZQ>)u6i5zzZHXJ_9$tHr*f&%ZA-MK_A>lHy1cVat_sR3^C z4D$V``$@CJYx%0FSCfH8LYSoIEIb9y+$dAHuo|#ICA>W9$_QHdIO8`MKE%P7G7R`SeUjc_RlXG);kR!kCBIh+2VQ&zPXSYZ(Ws#`oorcbN1Z93o(sjDfU& z%b1&S^AM>51vYRwmwiR2%K)b4!R7=VU*sGd@^^4(C|y7nECOuwsL*rduCu&9u(2ZM zI4pE;Yc~XnUc1}%<@Ms|-QA{qct%%-0$aC{t|PZ}_C8N~){4EruNQCkQMfVBk+-sA zCCkvYh@m1qN0u}-h37WA*r2~!!@Pm~;nUsgSsc51r?lgpUpv7AA4k}y=j(x(l?4_uf+C}*2K%1pIT<+A0%czMY>FNF|I zt(&3leJVur@hGV4l^$l%B4;{*k6O_9wM@G6*k}L0j_0zA+%2WjPMRwW#fSox3>)#} zdkMhR2q5bp0nVoufvQEKAkFT56ui`ATgkcwFl%dUe0L(3 z?Mi~9a|BLzQ#6BA#V;(n-TjEIQ_7}lE$>+?a^Y@f9$(3Q!H_!>fYQJW(?1+AqKI!- z6&Gg&t~+Bt5d*S;GSp;2IDNICc|nrWYYe-*>hx~DHWcjyTne#H0+3Z}}VNQx40>Vwtnm zx1=m4ON*H)W@Z>>){O1B`#rzc>-qP2{&{}?{O&)t*Xwh*KcDNmuj_riulN0Vcn)U2 z@ehqZWMpJEo^r6gAR{9?DkCH3x=s!pIo$Q!UPfjo%K3E%wPzY?18P(uZF&R8 zRw;Zw|GIIN%(@Awdz`$?k+U}P3VTas?`-OmIkr9^sZ_z#=A4|yj{UM5|IAHVyYBRV zPXEU(|Ne0JN}`R(9O)Vx8w+Y!CJwZdNGN*C4%NQllGfH%1|n+aWm1}R=iBt`-W5%` z!YjMbqVo!-<|iP0>bd|#GIBz3Q{S)*=QCwb=|dQV@3TJOcuw!ib-BW(aue&~q<#B2 z8{`Tfl$%_XD@-ak*&|ozT5bZ)+LW8*Dwv*k@Sps%@9qxtHB8dPa=D4-p3-Jx&W5gE z+VG}IFH&MdNE~>4X>MtA1~H_jB#}tAT~c_rsn6ZsgI4xs za_EZev#Ot?JnXJ}+y2jq2R(>};oH}*fE0yQaWC719~e>GXg?6Ky1cw>C9Rg3cD{4} zUAc*iPU#OB&RGRHjh1qgW9tHbsc_C}%4tZfIcN8SKW)xgQ#lRXX^86Mq_v#0=i~}8 zFoj2TLDF&b?(wu4BYSzS$_6C*rGZEc$Lq`_dKC!S91 zVLs{_D<~-74Skjd(22v3D+AZMN4Lns;c!}n2hGKOoizW zYGY!`_{QfU}(Y;0`%{^@#H=e@a{s${JZB%}x9QVpjxn-w`q zEVVKfM=E!I_9N6k@`A(lHo^AgR0liN`hEJw6~KuKhPE~;_zjaie$LQj%sIQ5=DVQ; zSAz?q-y+&w4VHBFj~V3^GXFX7g7FR%|B7LO%iyM_KV_}jT58F-r22sP&ylS?_uf_p z)?V1RJ+mt`G}Oq*2>dFh&52+p8tDrM##042F^k1O&~%;OIjZ(;J%pj~+0f3G9fEBU z9+_QZ$xq{&iB0_6xSHV-NyOesa~5Y{!Urr6aFJu&g|pD|?U9^5lg(WGCL z?%4d1f(5gpo`;vyV5=WE%8^CZ3+7Y~()g)nbp^FfTU;>4_Y4l=2?nS)HlM4`cJACJPaA%Xhl@ zzihWM7N)Ju++q%ChtHYyow~i+tPG2>vnjZS{Q3L<%@_?6Pk%`8bzoUtn*E?saI-}{ z(o{pRe$vRWT>5MfBYA&X1rdbFwpHX6_)|XaP*_|e(A6klRrQ1G~f^ugYb%F3hE^ zt*zMgIQIJ$njjwPWw0f!bC*9NM&-yq`nk z_4qH`&rmLBz`ABub(te0ki2FwbwhoYBxOQ)ll|sxP?nF1Hn8)Y!lG}2>x-3}cT|iX zGo_A{UUX@WoX#IFy;LT{3X>Z&S$eRq&X`E=Ou?tL1;c*A@vBmya(xzGxksICy!3^<$+& zU7VE1KKHm6nyusVU4$?9g{)PL5M2pMclG_&E|DxDOAHtA1^6~g-tV+*T%57sN z84<4y`PY0Ew7uAB09cVNlleQt=DZE_rC#Hc$Cw)g1YyXaRy>e5~8p& zu<+}7^K_M|;kDf(!&sAf+fd@ME&WUy<@TrRk5#%6jjbe7XrUiK7Q3?f==kSKj6oCQ z&9Vu%az5?Z>JLDtBf!buu|I}jOX2cccx6vuSlu*g+Ve2mB~d#z!qY2i?%1=l}BS|=2 zH;ulW)_S7*E7WRQjEr5XxvhSECw60)a=H1n?R0+iz|`z)?S`Lt5YV}$Muu?b%4j{s zUF;@{Lv5{Xf7_RRsk?P!JMF-i@)YL9J7lohjDW1=bm&q_LP1Py%Z~V6TNK?KP$$sx zj@0r*ZcJY!78XMo9A+|knP)BH>^fjJs1y$Jaz}v=$ffuZBf?cnt*-cNX~%qY@ePZ9 zb5^xpuUL)UUWsV;EI1Fp&)@`G&C`CHIm)(a&YFo7|N7-xQe4zC@m;UCB%4t6^Ov&k z(?e?<)y;KaTw^7~i;W4SOFGgK0{%x>CR*Y|?0$A1eLPB}EnkvI9(^c&3j&Atoc$)i zG&UwiH`9gEl}qp+cUD+5|AY;To$YlQO2OmFR@E1DvV3wv8tDT;5#D!rxg!S)pm-V= z+AxD{2)QD8O;ys3;z;<>F)2sBjeaA}aQ16n-?^GFujz2~TEpe-^b(&u*nek>xvmih z@SzpayEl6H+k?T8uiC)%3xrH#+n1 zXnFMI>0Vu$`Yp-Q(vm=3JvB)J72jh~c@GU|yygPeeNItoyJRDk@ZQXhxBX!FqQj&v z2I%P4zPHjzBHwXP=f@~-b@@0{t&c>ysXR>zgd852)h_Kl!vX8`?8VPtP_ZmSYR!uV zfbO0u9>}h`D#$yac?oOybNUB^z44gkdGdLhfXlt%@6#Qd-03}k4gPtDk|>uzxxH%S z%nHN$?Q35O$Wm8-v}rMF>T6hh?O6yCVcFvcEVH2j* z`dLFlB_0@jQCrTd!0BP$2uY}~Bnn;+p$G=UcZ5#Wt<409=-pLfwcASwx-dfJcX~f@ z2GMxtUPDW5QRR9%l+UH%hcgz%q=)MEgJl!bZwHeN%1QWQd687@EPu&p0%Nt?U$xJ@ z8x-?ZxaFF6>R*qA>vBl)PMhTbttm{~AE$`1YTK50g!l8RgKtH6Wte<#nL^LiZoBf} zI@kTscQLu8>Sx&z7LL@>bNry)G!#_&#nxdY5|-tgdXok3^|ISqFbEb^sl!~Yn2Br!xLqllbE3}>_4MG%iOmcI-#j68uIg`7HQ|S`TT<6kH%_s- z7W>Yv2I?{}M;!ZzAyiXE;R#gCc`NfKHjZizEN}e@JO9 z_e(%7dnnk9b9&YlPXlhl@7hX@Y-NCsE+wM7>a{E43cstaq1c>g_~&fRa~w_(i{`3A!5b{PcdD z(tcfr;?21%wI@(o1o}clIIH-tK1K2Zr#qN#W@Ig-LBAspX=PF?6YI8~u6=FsOCf8B zi#ss@Rjk+uZF=$PI$)YuYG6hizGnGqntM#CICv&->*Y?N<|XJE8!ynH@%)ZtFwz!p@Qb3{E21UxH!rwabaceQ640n?`t=%aOT&Izoi>N|9waE5=3D!ioAU&!!b)= z_Nc5C8b*!F4fBb`8ifP}f9_;Et)V{rP|=H7@HSdTO0T8+*Q!cynn16_Kt^%zhOCE~ z;jSWs^t(*G2)6@Fzec>~mp+j*;uMpY-={8J7$i@-+VC2mu<|@#AG5~SQr{Vo-<6R% zULbA5cBwQ?aUr*`ga4XDcJ<|g@6G9-6jXPD$!UvwLi_cVuAgKRJ`~L3+j5pu%hz|Gu~Jz# zD>WR8Cl6*mGVL&&d136`e{+0_qO^axhV}mW!uHAI)zBaBL$z%??im!2O*bD*U+WGS zg;S=iivEf7imQxDYM_QN+pcW8L1Sd>grDv`m9G010)6?+p%?3}k(?KEf z_Xs?AJt!aCEza!E`Bcs}8^6s9ob$AJ^fK7UQND&BikEEQb46T8+EnnIKVn~Ntg<8c{pNLBBxmU)U_fG0Rp|Gi(#qSS5oxk;S&2|fYp{k{n)8^gl zUH9?C!7#Pc8orIz^U;=`23t5fx%i;dM)*mumb0YB_`%M)hKtg6|7p_wnb$tsEH%=V zJK#QV;M(EKjVj(yOq6FfL?azGy!Jk%WuLi!+sqU#YT~n#Bpl_A*nd2*QB(XM@f8ti?Ljp~ zvB-NzjdqlxTAWr4BF8d$3`hO|Yzd%*vF5_vmkqt5}l9#w3UctY)8YnuBRQD(!#6=x+sJA&Wq;)VDhttUHitzA4 zdH@x(;WBGT1PCIA64%@MTL%oG6KlDZfk4jbGz)hCBx(SYrk__SmX7nHLL2FzsrE_dh0vi;D8j4=2#=v72Yg^Sv^i_ zs?do})I|&RPiSdtQ>`ZU$+fg(Kgysx`~np5QaaE|eh;7pfk7f!TU)cIntS|IN%fe} z@NiBW;6=O49r-IOD?PHps-Ri-$Pr3?r}vkq`#S0u4*C^c>)W&#)@*>UqtR%+3IMqS z3qjXuxmwriHM?3Ew5VK?A%3~id_K-pBf(XrNn9oxTU-P#Z=_dz%PVro+7=ehDc%Ub zU9@CFCu*0>Rmm(?c^YyqK+N2zrkwYZ?j;mqlr>o@>oIZ{gTbi4aJKozY_LVqh$x8l z7>R?rLos1x902Ya=y6Ovu#%FxK&}h~;-oqi5Oo7RVn~rx^urHOF=B|cKKyW)o&AQ% z;fZqzU*82o&=V$j%QemuT5UOiF9L&s^~q@GUi9`GdjvMQ#u(&}ey4 z?MIe2MRhGhHo4z1xp>CgUo*j&Ip+y9>-k_UBDC!l-I^&zBoNhJYa1!wp zQr-H%T)&6B(N2UNSQx2tWm~$@mNb+6b0u~_(HU?rn5UUKmi(HTc}Z{rnj{i3vso2X z#O72OVH^ozIE{mdO11`}2%6oMmEk}uR9xKACOC*^|LMEDzs6T$;^N{YWy9%>lb~HU zetLFa4lsn$YmA|Qmll#RFswM-5laOU_Q+l$55)M(8(9?|Cu3HX8?JQh_g>#J9f-8E z*bi64QhWn4y2escQZ9CXgntkd3JB%(Arg1k(%f7Y^lOAieixe`W7t-3V2DF>pMh6V z*nF^yQn4{HK3;SDyb#;WsOO*S&vEmhHCGs(I(fURtBV-oY|T;%v56fx6|p;EI%BT8zTzuFuoVy$MT)=&x)#vr4N{LI|7E0REM4fvA%{|qE zvYXI&2qeu##||^)rTP6X^Qt2$2WzxTdg14lk9@nI4SPk7sQu`a;$jr4{5|*!#4@UpI_*wYU zXCT%q`vdkOyusA~Q5SQt>A~K~g;O(an^<7Siz$^9v<&8LH%WoqhSFCUsFm3e!Ory3 z>6Y0DilT?1c>&pX=r_y3$HeQ#`A1AGlDyt;Lb~0xw3>)$WlZ>Ib$Vy}4F{VwSGydBqS&S+8vcq@-PdFhfW3IeyzCaZtbR7Ne`bol&i!Lgl9^?T2n)kD_{_>_Wpg| zHZGmqbzrk3wjFw@Io~rs7s@6Z^O!Jcsw`{QsVV;!QY!4PqfY0{b{gkumwe#_TW0_5 ztNQVrK9J`F>p(Y;x2Pzq2v;MdmM!ygI)lxQx_+s1HzW(m<9(KgKKj1c*R=3xI5fJr z#}6n^%L1;;?DGPwQLE2UDiKa}r5M@Kwj{|H#qoM(;OBd7XGZ#(F>V#3lHEAK_Dqg_nh| zVloI)SUlKv0o5leN(j`K6{Kg4-hTy5X4bjJB~B~t5^@hoVcT>L@KVAsuV&LY19a9RAvSD;bQ z@Ln8WrvX%}LjkpbwBJe};7PT)n}X1X3z^`Hg3ZqGFi$CLkqi6aOKxmd>Vw6W%qb^d zMqTS@$js6!j{8aFNgU48%L|B1POnwJMWEL{$@l7I^H+ZIS9W#nNylkir}v*J2)i*Z zL2;HA7A}-ja?%}QmRGS~Oo426V!`T^bh0GT&yE)HyP-jO=Jn1k8fL7}o*`x|K7#W5 z@C@hv+V^%awqCHBJ(yr&dAUW3%$Ja=7ja<60zCRC6BK}j1>Zr&{rw4zTbULy1qSfrX)cxs=5tNnb&e87X z*BCci_Jau(hAqTpzWT^$ur;AJS%q;L;v!c_Dtc5ocE7)QQ{RdJqMpD=|IyNY?T>lt z?*j@JW$jbrDdgn!h+XJvdeEM`gh2D%z}uWPL9~%9&)m}67}llV_sU%RcYFjPK*_3o YbPHZ{=UF89-b3cpNtkWz@vC?K3&s|UMF0Q* literal 8815 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 diff --git a/tests/snapshots/flex/test_get_address_wallet_v3_confirm_refused/00003.png b/tests/snapshots/flex/test_get_address_wallet_v3_confirm_refused/00003.png index 295f8f713e06a7a75774601ad62dc89a632ebca7..ed74cf147c87b585c57c686281fbdc6be7510914 100644 GIT binary patch literal 11236 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 GFa8(v^YEkq literal 11323 zcmeHtc{r49+$fPHYmt3P36&6ICtGL|UTV@PgcxI+vW$HwqAUqD)pExtnCp4&=e~dUZ@Yi%{o*e(V~!I-C+O(t zIKbDhS<=zbPtegFyUTJ67*TG?F{Y!FJqEs}ciTUMGDdk*TszY8c-FRn9?5$57&`2{ z!ubcR)=zI8Lua4YWwk!``po(5(8pt%mo#-5uQm8IX7R%)Q!Ct=sAleO1Cx)g6G3!z zGStvAIXb#*VR{a_8z;NzvU&eYANqb{Gm6v_LzpGy&-2_^yU7Tmi;I*j4@Gmex*Zb= zI~!7?CFy|)=sIjfSn_n!*_L5Ccr5!uXlEQ? zzVjyiysT}b1OPiASeNKM;wGHS>O!Zq{V|_hmF#|op5uXv_?-|w`B51FNW;~}9obA= z>hIYPH=qD6EG~3@wAP?-5BZvV*L4}fEP-$HDDVbU3wH{j;^>`D#!#0bWzMP+@m#vv z3qTKg`zw;&LBZcVsn|=Zlj7*OV7y1L?H|QQ) z->4NbnY>_UE*IuM9HI|k6{IE>KSJ5;&-1@{^j5gA({Jdna`bpT@nQ7{1zBgsKOHdV z%sip}_hXTk$J~s#g17%3>Td-971Mux5TLY`%@Swf1_?(v{|7D2->%$Z&7zebJ0?W; z+TpVW9b$H?elQ)N;|0q8QcIFu^FRFfL;sRhrI%Js$hkAw^tzV;R7ByIqh`%P2oOb=2A%PQ~QAOQ$|zDX$8u1*~gMrw$zKWZ(Jky%{y;h zK)YV4cDZQJivW~~ktvGS5DjKvZj_?n2d#Wl){Q@NK>H!fp!LFqYrnNo@Pi750RZAX zDEL7#pOPqZlYEBdAjp@VZjWzMyJ?rb?Qzq|FtfCT+M{fk9_kM&OoY$S;}=Knf7vMpox`&TA+T!HII56)(< zs^1(-y#cz)@NZTvj%yO+*4_Su3t;@eXx9{vkBSR0=4bq8Y+Ov)DHzb-tk}iod*=Wh zxo}KqIZi|IssMc)m+{l7kUy3(PSuDakQEo!Og`7Lnh)^nuU|MTemY!Vl3S%;=~7?= z9&+k|n(J?UjT`XK)tDDPeOf#+thuA!aHYXeVztO6y!jG%Z+_894>UDXs5iC2YxMTp z*-8Gh*>9f~>)wV4>^U=nDn8qm2_;$>2-4~48YJ`2<|ZOozMRQ^i#M@Mbcxhw1c3s* zoX|dzW{jZqKz+~N_w-#XE`^)j>yl}2Md&#wV!XNUl-AE>uQE9!o}a<2@*QCs9oCF^ z=e^GLMNfB1o4aWH**}BwhHpf6PImh{Bfj0GnA{y37U{~s&?oplJn)Fsan%EYE$r*D0EedgA6KA>g;!m;~cg4RsAJm~RB=PwX&Y?r_ds)1B%Xy(OA|F>VXk!K1VHN_cFu zutfG-i@GlR<_8q^Kx_4EZu&UYmFKSV5cr(2u0dVP`3r&^GXTks*20-9pzMYdz#I;G zj=W50L*7LW%+B* zSIpgwJ3h%)FPf%Cr+dM*dv23Tb*y~~SY8G8<<#=Mj^IQmXj*6BVyWzC_^GA+1tK_faxCOT0PoH#uzA75L#wcGH% z0-mP8?lfMr;~YEYyDbB3A8qbabHCH#<&^*8V%-?NvvGtH`Tji1(@n+#Vp~#tdRM;p zr-00Kcyx{$#ta{eUpKVyPXvKa5zu^wlNapKPMIF�o_78J0CIT#auC@#eViwj|?v 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 K7i!PldiX!xeFa_s literal 8962 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 diff --git a/tests/snapshots/flex/test_get_public_key_confirm_accepted/00002.png b/tests/snapshots/flex/test_get_public_key_confirm_accepted/00002.png index c792f5d8d000a1a6e208eb0c70b48a1e0dea3c16..7bc85c6199ef35d0fd21a600684fb6fdc70a44c7 100644 GIT binary patch literal 7620 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 diff --git a/tests/snapshots/flex/test_get_public_key_confirm_refused/00000.png b/tests/snapshots/flex/test_get_public_key_confirm_refused/00000.png index e91ba34d0de7a52134cbdce8a402ba24de940a18..1a0afc1f74d58e54b639d685a77e9d660f567a64 100644 GIT binary patch literal 8874 zcmeHtSyWTm+ASc09Z*Us1=5sS1)@l_=$nAp&?p2!5S30vS_vQ|M4BWVDMb&R3W78t zAYB0p0!oBHFoGap5+Fc?5L!bBAv6gAk`VIms)sx7(;ef!+;bmJUUtS_d+f2+`qnqU zIp?>ZUV%6$?a|mHBO{~a-XE;-HJ4s>JrL#Nae=nAO zc%Wa#?!UwT-Io6kj)Q3Ot(pvZmB(xFF|0GiPqw4|p?=SHhb&QMXJ;dDc!B$;+^aKF zWXE8XvMdSwoV;~hE+2mcBMg-{-mtUe?*JZ6g3SdV=)a(c5!TBampBEZ{*ZO?8O+mx zoK?++Dag897*szY>vDEb{eY~C!Js-Y`s<+jCAs|LWk#@FA?Kcv-?^TRNf=aDKF~k@ z3idc)>-8So+R93Q6ZdVd+{3}-In%MGm*l8?ZDX^>n{O9d2%po&nvn7FEuYh-8sv>} zZZyHI(;o%yXG1P&CZhM~kL&;6=G#g}&)sOw#i^77{ZW^EX>$4A_iaPWt7|zl8jZ76 zEwe~Xe%w)JWTsaPwcYFOn44 z&R68}u@FnuoTNF2Eb;~2VqtTc5pj12>Nwju5g2l`j8T&}w#|Ue`Rxip9b$je+TXwR z>tLSvXt7Yg%n0FdmM`JPTCu-@5A-LZU8s)1OV1~N`yo~(jq8K|L)h~7X-NXrGa?j| ziFgn_+!W8Kt*$2C>SqboX#8VIs`6`YbgrpXQUc~Kn)!9c;(;)Q(VJ>H{_Q9&?<6*? z#jlRuM9SQk(gEB-3TDcelLHo7YB{2?zLmUD=2K%AYFstTA?m))%{sDTefyz5-`#w> z9pyNBR~%UmL?fDyVjs}<=px=a{b0jn^iKWeLZDb8Mqo`XG|~yRH*)$;YowD4zTT-f zuV;u7<<-1uX?P*e_}-n(>Q-v08?2fw=R*;OD7*h{9Y8+9}g2qc{Bxy#$yO6*`x%gZ7?)cXra6>k&@ zuh_>~JgUhf1?fj|T9#nhF9h)zDWt6($R_EwM7-z2BbCtzoQjId#;bv4l)Tyd(eSR> z``ZX}%^Zgv7fKb79=^0>;;#r(vjP$x`HdUvoueB$sHdfz5*ZoE-ZxDAMw&DR9zZ|x zvBdyeANFCv`XeKP#(@hD@>W(>SQISBa4fh@ynnnm0+$dU-z)WFz1e{+QAA#fn>WK! zCXvWzB70vNuu_<%mn?a&NrJmT$mPCGypc!SnCWzgItiucAX&s)zhY)p`zy13r?|1= zh?lc-g7oE*(ENrN2CL>d0t^N-JM7qrpltJrGn&dV?VGTdrB^4-!5_o;UZ}f&{Qhg0f66VwvqkprV~1TagIwBqKEL>o$7&xfI8 zQ9ExRrml-u#f>d!-^Jgv)K@cNOv39CWAThc8xa4Vu?7aY54Lj5e6@EddhkqVl)0vI zikj_5eQI-c^>ElQpD(&{UTN?F;b6xilaz%khZg*PCBXOiV!PrU(J4INNVa z-{V?|x2}+Juy}Qm!8ChyAgkxcTGuGz4n0uwn4W@ct$3~z_pU~O$|2zU>qUrbRnvd?7UIOns!2ecjXwAETj5xr>Z*^~pmUoH^vmpi)_-hT z;8OcO0!Poy%~kDa>`mSnB21pjpusUM@IYj-$a~~?`3~-T!_cT{B3yr?9#q|w+p~Ew z4Eixt)DQB6m-=zxuw>j)NP?A2TP8{Yh`weclg?r@dW_( ziqZ@$@g-fM){`j*y79dd{`Y^yjgm8fC?TRDvxlj?U2Q@d%% z+R~GV<^YFz<_pb4qMhWjCMMrmdN2{Od!q&{7W_#*{X(LaSkdVgG_vimvc7(eP#kPA zLn(pMEtDR-iEmmqQW9`9D3r3!RRZzWGZkE>r^STUEu4=bUv`$y=cBrhFmOkt-m$mW z1=d%jtFM^-2Ei(4#&vk( z{1nGMw)4G8lEdJuFZAQn!pUK|JF|)z(mO?H9*`-^j@Trc${gXNchb zoq!Dc($>=)f#_%f*ev;vuj|Nd9!CP&Ec&uWF&jE*T!cM;cH>1vZsFKcES~%R>mS7` z6;7j>^XSow6g)cd5rA_lzE=TWe8J4E{ZkJiAhdA5|BuGw;&(Llw$qx*0337I z*=+WjKwmBNFIuRz?Vm|YK*GJ;V17-A#GY>=4+K&w&~&jpv;HK8y6RzDWKMBo`69p~eJ^HqyEsty|dXYEQR^Mnkzyl5YqaNB<~oEhP>USE=WJ8F!&(dq-PqV>cU`JXhPU*`E`?+}%6v0dMYnu!29;c>;?Wmb>Z<)(Ss}SE17y>|w%!8|sLDJ6nnR&b zh9H`aTN=URykwz^AG2#-<(0E86KV1HE6z7XZ$QkvH(MUH76Y+U@t_`yL-I}jKyYEx zudOMu&k3>WclGSqK6mXgk=esxg5`GU+zr=CYBK8x==+s+f2)-O29sqVE>eF9iRwwuQRICvRySo8k47=BB8MA?e_Y z0JE9D2ti-%EHJ9Hqu?$0omHC?N_AvuM)z#8KO{HouQP`!jQ#yOS5d-Tv(z{o3BLX< zS!_>l0-%V>URzyV#iF-`YoGnj`qlAt_bsCiBdf?$|CSgmjcd=pXGX`ptNGrHlaz<` zGpA+(8V!@h4H(jwJ8q~bX8GgMorl9db;Y2^Q)f$+mui6OhT2GHlJg)9xs=$YrSHu# z=O~A-w2FH(w<`ohadwg9SiepSV}3X0d%m-7-9Nw7FGsXpn>gG3h+UVbfwi^vfN zlTedKlt2lHhqyiSwh5uv1!7and3RaK(n=<8r=FapuNyMnT``iBcsiapg4*a9lXmv; z*4P``R5U%dR$}qMwxaQHSohAu|G>*_u`EOC#o36Y68zbz>oFHFyHcYbEfK9W0~<%* zNbT0bK3F1Ww~~!cMA|{8+kTNGCOd-hl*mtszPx&@kNMnp3_F2<+j9AwDlx408Wz zJYIjoYr@%NPNwQIw5u`2IdLv^dJW1wy6JpAee%IWfc9%KulOi>CqC)oJIUo=o#V&F zoq?GeM_bX3W&O~xg?A_c{tZM{6(Yyb{vvBV98=Fd%K zrhK+ZXEp3=oJ~qBz`feh{=|8<`B!j=^2gLwbZ6PB&ohnxhdOxyjq{V4zyUP1z=huA z={XE%7?YyRw^~NqT3Z)m@zYV}dCr6gL)iDlMb-WisA&Pf=3Y0y_c3e_ah(7p5yOyl z)7>YXM7EQ&tYt`*|ngKvZK) z4CH{q2OmSK4sZq=sUvWV&Ntu1z5}Xew;QP?idr7k0fpvMTIu!}7(`l;%#;8e3SSWl z9IFlBpZCFwFOyXOcCh7$HB79ouh5=}GGD}A2sNx)E>za2ZV$e+;a}+2-vp%^E8@;$ zxXf55?uwHB?NNF6+yKD;8ZCuA|C))RonuMVb2;9ExK((NrNo7+~=R z_j%9ZsNW>MH29@q$gf59Xzj(m%6B1jQ&-zen$3g90l?}nN`4&APW*;Cy*OC)d7W`%hnvi{dXd$Icx&zDN;<0U zlu8BU;4p90NI5c-+ap|Ul~z8*J}F6LxKM8BWP442f4Y>+=%OkYc~}R)qx%uc27~L% zSNY(`ieWEPU~`m2HrdP!>&{bx(!REPz@!voEIuwCHF3#0@g*>L;e2okB<)E^e#N&( ziJ?8j+rJDyss;DxDYzPVib}8MfFtd7d@=8deWVxmve&xX-E1tVbrCW?dD?3jb>$R5 z6A0gURU)oQ7zblqO}W@me=e*}gkXyLZo6&Y@8205|GC^yVjc;PW>!)|xfb)At$7no zvQanU`w{vtf2LY=thdt?b5rUqln1X?CA=)^P1p={AhLe%LAP2#W-t3L6il@aJJ}W5 z-zi(w)9LNx2gTDBJ_YWcFXkmR1%ST7dmv{kW&NsXP3V0EygQAfKgu?*=7Ne~9cUm(P(4*tvi2&eLPBNkNT1hJE-^Zr?y-donXi z%$$Y_Jq*)O#t|7i*S33Ftf`UbxfNjb2BGVf8C3+#?g@R(k(vL zn=n*AUiI&Ro85Aj8?;``Y39WVTZ%an9rdR_;niz{`;ZJ@po9UZueo z7%YdeCX$*a;*hS^*GjeQj!3>qFLar%!|EK>87K_Hhn|0_wFP?wyE&JdeS_kMS#z5s zY^j%$Z7r#F_kh4@z^-KV{HCRbgBJ8^iR*wMDkhu_)wBMHzJ~6;=^3mw0nk7X;&`|z zMzjpz+_#gy`|`+_NI){i-)}kPh8523outB(nJ?i?;UEl(@Y`5eKKNM2my`^wDA8zp z;mv_{bt6fO!l##PyKceOmUW)9^3p~95=h~_UOW@^kX1>>qry!Km^HT1^Uk_i$$O17 zmHB~G=GS+y$+T@P`g;NsX_`SQ7cC>Y?$m#ra(dV3r3a#`BZd4R5gfpoX#9ZqnS^}2R1=q_AAb)+5dbgLD z^}4(U`d7h)GN0|xY;&3aWg`z2v&%#CYZ%kJ9OaGM)}-81m>o9?|y8c#RlxM+lH=jT^l9Um9hoSJs1 z-da4h7ja}iIXe#SvIf=xEe~17|nB)g+0I{3X5|IzEr_^ud zP|TDzRdX=9P;!$mD^Wc?H<`8J>frzlwSjIaW&kR29zG`WN%=4v<F6$v{9bYvVXf@?T0`OaP6KE&ItY3^( zlgwM~ou7{SUS$oS=IVpO{IQ_M(Qs2NdrMhiM>#72fnXPoK|MXIE<6jvdliUNddHjR z$DLT!)sH)-*X#CzW^$im2M~w)#qM`)!QgUqZXc7F^bZZMh0EEVz12)p^>I3Pkdw7P8jg9uF06&* zi;n|FIB@OLxsS0GJvpp3-lC;Lv|=Wg{H#d|)?R-E4&Ky?@5glIN+HOJH3Zc-tEVh9 zpAi8#WK@8juhQvsJeQZoE>qS0+rNI1vCT^cC_F}%64=cXguWTv;8Z7K#4fDV@7&m` z+2cQ52=LGQ6Y=`-F?hIkn%KJB5J>#c%Wu@!Sz90D4-R# z8v~!ctjXFK1X=-cmr>P)Q-GE)A_FFTf+c!;t0%$Hmj-BkrUCCN(;Fq-#sq^4NH*_6 zBTk(Y$0a0qOFSdER)Y0)Q=o%dI>6!Fqu_wzIuK%<=L~Uv8$QUy+fXMCrGB|n59rHK zcSTmTfA8m@Kf$Zy`2N7)rs`_IH+DVg<>{%M>0L)_4sP?mQ9ue}&*UO%G=rTheac3| zM=WwQ)9u;bqWs{6_IjNO1kkvE(uXFLwWG_gKJqvI_?r3{1TW%0ek~|nHYl!X_vRKy z{{*wp4nS9)a^*mAbXC1N$}5Qahf^$k5A@+Oc_x_@slKSQKxNQs$ful?K6kELsK(j;S*VL){32Tx=I^^)w;Vou!l{zD z&K&uc5NZiRtor~&bm?7Ljr<1xoSL`+^}xPzJ@)9MKK^kt|5smMm&d>}f6s8Y_`wH6 z)Yb&~_RS(DWzg+9HhIRV;_BSy_LB`ZOawG6faYFv(lg5OxFi0)(yn#Q`ni^vt(_cp#Vr20QfsPI@oON84S;c!}RT~ zmim2)eq$T4$%sQm+gIwwzhnNu7y93o@gcmOCz1+SaD>C@Gt_30f-G1gJzArd#%ahZ zxZH(jEKN@zLGs&MTdl3Fe-P}kt}|)u?BN9<3jy?BeXzB;`6_Z@C=L*gai;*opykY( z7UQ776Pz>ep!;A*(Tq|X&GaGJ?{c>VPsSf9AK zxSrAyDkhDm)w!V}Lk;v;hDd>gyp0x~66fyT5(#RkeaC4>C&9yQuC@!oBc)e$D>|LK zpTm7~JHQ|ljUz56NJl4shf8;=<bXmILRz&Amshcx4knA3R}i+gtF+MlG4Fz7%n7N)kP6sM^TO0I4?`8 zvu(xw(KzIXDYlR2Frf4oAdwL~H?|FVcvWmrxyN3VAdM}RRK~2F5~BK-37dr47y#+c z&?&A2`K|L@t`X03E--z`uhW&akdSR2ACIfg2}lnWzZ?IY92A-$(y7iFMq~l;OewKJZ6XwA7 zVcRX=%bzo{Re~5}P-{@N$Mh4R3s11*mr3M7ZWmQ+65c?_D;!WxLwz(JDR0Sw)n=PF zq;7@j-S*|SsuRJsw!p#@gw-R-3aFd}Cl>HE#-IO*uQ7(CI}M2MbO>@W1Hd;ZGENsE K7i!PldiX!xeFa_s literal 8962 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 diff --git a/tests/snapshots/flex/test_sign_message/00000.png b/tests/snapshots/flex/test_sign_message/00000.png index 283f33a1c76e24f84aba1b7ad28bccfc007efad6..65ad8cbb7a63889e3c7ae1039362088bb158d9c6 100644 GIT binary patch literal 8503 zcmeHNX*gSJyQW*|s8w36ac^3k3>^@S3LQ`sZ8e6HusfJz3?T@+cB`!+ZA~>Kw2GoA zDnW#!s8(u9kP=BsN<>Ji62y2`_mA`c`*Xf?UFTc*k?UH+wchuAp8I+3`+nEsYYx`C zcc|=;l9JkObLH|4DJki1Qc_!7w`~E=72A5-Lg zsn#lNRHf#ytt`SdU!QG#nlL4Q#Rqd#+8#;G@wBs0%tcOt6#F}l;3ShWh8Jvn_V!;s zjC;AaU*<6G4~6~?E!-c9{W4m(m%yzLkPkJa?YB`68E^Luas;0n?|ql-d2>8V zLqlVfKo&b&T)WjjX2l>-4=vK}PkF=P@b22?ix&_Kh?yDe>Kv2q2|kM3 zZfCJjVdJBv*uMs+=6sVeY|TLGK!8h!ag95-e9m@lpbNjEfXGSRf^2KN{uFAQhr?k9WMLsG0 z^J`s7k53mT)OLY@=;F)+>)c7)-=F|f1D(>qYHDf{OTw=!+0(vo7veY9QS_Y&o);}V z88jL#tZ~-N6*@HR667rkG`7>@*XsJzjXW^k_sGJ+b0`)f^cMIUqT}N?7r1?0U0ns{ z@ep%!idjw6!m@!K8Vp+#W!Oo8yFZ!gmgNc5_Dj1=5;lCx@xE8^;t~~(7|0+ zMc2`B)iLP$Ta%wOQmshCG{Rh16)N{9f5nD#u7zxZ`-3m56nr)8S(fgR4kE5xP1k%yaAX52mzPN9j?fZc>;;$u-R;L2!!x) z`0g2-YPR_P`(^xn7Mr~!a~r+9=VXQp@#FAfweyZNV36#D54 zi;Kfd9_`rz%u`mhaWaYbh#AqaxCQArHhW_IN2>W@g~bfGl4VnEQ)>oHHnDB^UQEG& zGZcyoZ8Kxvhs9|9%y3*2sc>G&h@cUBI?KyhELIEY;kq<4zy=C6T0N=xk;#d6wBQ;u zLrgq$4*(OY%Uog#UkFy5z@Yd$s@O2znvEPy_bB?e6g^jqpG|aa93akWN26#P7R-|>O?vX&n7*y?Y zxq6h8M>I-l`V+mlm1umOBwV5dXJ|v_%}a+4X6qDIBj~)lP-xM>GzELd(E_FFL_(jB zv7X&XV2xS`>T4aNg`PpIVUy`8%j)Zrd)GE3!EeN8YGTd>@nhoS<26&Q%KnPZ+DiMh zgxnrV=Y6WGTn`sGu02xWP-R5BV@JsDba7QlH!$w1a7XUvahMuu_^D@Iy;B7C(nO*A z9(T`vvw7jr4G?K5(2D3b8rPgx$DWA;quVZh$41l<95*{0-=5a*F_~69xJwp5W*M~J zsLZ8eh{NF^!Ry2R3l{GUJN)Ss`R2`#KFUvHl$<<)4HYSmjlB?~naEk2cAEJ-Eg;2C zv7ZRQk?QsE)v+wfWGtkw3*KbSdFsAj-rQqPU-Bw7z)RzW3A320#Bg+UWcrZKx);aX zHC_-*Z(T?(rTIOXx_DEd8?^?cRP zMh^%C5}CLx+FDBEwYOhtl7uXb0M%qgd8W$I!`%d;H~r{9vSo`82*<^Y7z~)DED=L7 z{+hQz4}rx0>+Ds8b08GzH->8QBhkh0Z&l*)cw-Vi%{2s!i)>Ax#f_J_+&y*hHA?j3 z$GZp$5RE?Q9gnnx7CekzL@4Kj3$!(llDEFap~>rA#iMrR*^-6Z zH6|gWsozD8YqLflM|cwr_^vbq&)Cb3o~V#cd}sX3o_ZuB(I+08*!B&;g=(Q(@0kXl zHi4CcPI_>0c-X{I%zz3x26lSKRB`5PSU_kL{|OD9W@cMZP=J~fAQ+K(U!hR- zD7R`xQp2rEW9-*Kxs_DC77$aVx3!9qUJhEt6;lGAF4p#IUQT~ z@QR`^7}iQu7?47?siC_ChnsU*U$$FbPq8W@5{XEx5GZCqNt;^VLN@JaF>3RKMF1^AU>Nm#PLH?WL$;#vT2RJ4$;L*Dt1jW8LsR?4`g&YIA7-ZTD|Eqc zUq$7Df(F@ZhCVuWh>8jO)=yM4pLg<4N&Z>EB4$j%eHq5QG>8|8W`+fV*W z@&S}Pf>BbieDaCbdN+G~h@pPr86-DZ|3z>hk5wFYfW6Y;Sa!O%H}wP&pig3<{4zBB zc^*V0>S51aB-m0Xsq0r2G zZc3I6g5*jNBl1j6KC!>e>sr=51_6M0a{#0h8w~sSHZsV;LT-qFu;rGQ>!jP*a@Pi9 zA;G!cWO%i6MI8zSG*tlVM_3-@Pg*MpV=_?@I}tOH_j zI#jV7r=d4pc*Fc7UXe8(^3{$j3I@BeJltu904s!wC!K(yP9w_$<3h-AuC=`1hf>J! z;KjH6l^=&~i(eDM!G6a!;K!MpGPc>!2oNgt;XT584(j#p%F!5%{;vh>yj@dY7_=mq(q_sfwf{Ne z#jCpODEu+Z&(B*ocCSa6YG6T{>{#v6jOWEmCTj8(<+*)acMAAjp~&qf)F`jVc&C4^ zHyC$dvyxajgt`2(R4CQ)GFki0VE$+2rPlf@!uhfOAO->TwDf=*d~xsbt=+Y1yJVxw zhWs-XEBRt^M5D))R@lO+BZJv--DQ7`FbOl&u;SO2VaGZ1%RhEp%`LGJ7VA>ripxKU z=~>-FBsV=C_R^Vo(gQeJ?prQ0RK`e6p7zWb=ddS`IT(SH?;MPzU{Tnw0Phr(|9lzq zE%T#jg|!Hf<3Y{<>Gp`Bz3nUbr87i107}EM-Y)1i{KDg)dNWZbG3mNohC&*xR)LHMas%=1^Y(%2_sqjNC(o=E~Cuew3Q*EkPB zI0l65Mr9Cz9bP1UdUehDC4EG?K}TBM1x5#0sOEVd=EHo{c?~S;hy$dq7yG)EQhT** zbZ3WlT3;nXqI3Ykm=bg6N8PJKfY}?1JFXv-X=rwr@6nWc7pdVi!;6#$d0-g-|s{O5q{n!48d+FEl?P+leB{0p%7O=N-Dgea2! zEMK#)EB=-Qf3SOrspcwjmgvnk^^@yI8rZ|hPpq49Y9g{?^3Ba8kwnAAH}tc5!bzH3 zoMsbKJ^GQmzcmV5)l@}GY&30PTrMv^Ayxu78@mbo-skdVD3s~(iI^3r{_uJ}kCh(# zXGouOu{oMq+qGZBB&MHecGvS$@~T-?o$R=1K>jV{-mQLANfrO|-RIS4@hzWD_NCLr zyR`Y7v?2Jy%#V_>@i159=GU2&2ZGQlck{Fu(?)J7-PbIne?Ig9D^l)T^ZP>KjhP!) z>AM)4EX^^q)Sl3%c-x)|(M`yQKGPkLV4DpNB~(Q@qAK`4hvl$i!f>BrI%Ndc6XcYJ@A*yFb4-Y5MHY0c7qL_G zVAAC18hvH-%aM!dPDG^muq16paVL0X4%tQg?p|X6o1O$hch$l=1N#Qn=!CQinAQJoQhH6)T~N4eWU_4`%l>Vpb}Io&?lwYpAxh&h#jXc=!Hp5|SK zkPA)MjM+tF8t2zT9rAk=ddh-9(3`}+3ItCb7_nJF!$oX|m1E)V8;`DY*?OWdQz@5{ zJ>WM0j(U?B1be1>UUeBC9kBD5`rq!@z6qgg#l#yLqs{9n`jkrrw0e_R#fQ7`ygwnK z{*Z#;Mdebz$MVNP>}9+_b(ZBuC&P0EbG<_Ha!k@Viaq80Yf6XWLvJcCDm;J($$jg7 zU&zV5s#7%J%fFtn&%dv}B-S-ZCkivuu-fHa=hm{Soz&}VINEeN0>)*OkhI&W&4-de zfwa}R-nyEKjEPqEAwc=0D7U3yOrsfTz7$QDe^&f6vS{fKtc*#>wz(0pPVtvJF?%#+ zpZ3bO#H6v)_xU^S_CQ2(>Y8z+V;QQ{&QQ&uObSWunS#&fj7nuoQkC;{(BmtOYmDg$ zssC{|sd7CR%FCNZcUfC#6`uPv-U{29pR6zcAG`BkwWR+4n#AkX$DRP4&OKOGDsJ=S zliMb0EcDq1m+I>3Ma_o2FtvZj$}G6QN5t^$fB##Ij^o>#WF$ zIJF=Fr}(s$BvBhX;5s;P=uLEDwU0THn2$&%c^|`NCcmA&kgWIphIr9evHNW`O~!vo;(L@@fMe;GqiS50 zENeXUlV4q_Z_5Qf%6tsVoI1BF6)eDXU%a2l6Qxo69Lbqv6< z@5z^bxp2kWD*mMdfs9BH zbuo*>ja5>6sWn;tg$Tyr19AXJe}hoiYTA7S${T*7zDpJb+IAw!iXCU6yg6sU8aoHD zeeOcE&^_+dL4c351YZq%IGj5xB!;D!DZcC1KRKmUH=-LHPV8^KiN0%`_h8gzfr(cN?(lWbFa?nEAL7pb|WWlB2SZ`tn_VksA{Uxm^k zipK=o$~J`a?+s>++6(&c3+7@a!oex~co(RVN@{sIz@{5LN-XgO1%Rd4GG>5vb!_r_ zzNwyS#hW!SH_^b-_Wu~0`x+OgQXyK%J&_&W%8NZPXbiY%u&buGz}9SEm4HCM#n=MB!Qq$O~FSsixb-liB~Y? zqz_muwi(}fJ5+?;Sd*kj_+aAt`m_ z)v;lIM9W(sYfw>Re11TXTkzuB9`8Ej0wtTQX8pF5WK%ct7Nrje8yZn$R6V%q)!IA< z+|D5Q#WT>|nfm+Tz9E*unh<(Kuj-TGw3fOA{f*&KXXb@|=KR4tImA*e3-HOp=T{zy zk?rVk3txZa?1?nt$|TPNc_Yk){b5qp<+XatdO)K`OG`_ycU{cv!(Q|uy~4i2Dt_nf z0W(N=9nmj0enaBZS8Gq3-9D{7OhXK45+otb0Ar=^{2BV}BN|^b9TYWr`Y?@mQ}Mfp zAXuquwpx&wr&zBBSrBeybt>>bC$II&GBYO)=!Tcq395>;2$dZXu+nA+d)~>6s6ROK z4Ka#q2+&mTt^W4$Q}KRStD>Z&B&Fm9Ni$042B0-0O!KDj&2MYk!|BS;lwF>-Y$egm zR^hXaqd4s{)psb)P#mv#p+_!k%*_H-JR)@?8>te=uI!1;DB*`$XNPs5!xE1$k2K^c z=YHjiDQCfR!7(=)V$>(6R2ALcBlQI}$wd{W-@|`7X~ggsk<~wac)GJs(>E16A#tOJeJDbq*EoBLt(!~KRBs1li*4e##PI`frmo)l2*>+Vn zs8$}F2G}hE^%~AE83QB}I$fs85L0OOVIF zQ0FRva)XYI1#%TY=a+P__`q?>nbu@LZt6U2DROJOzg&L^SKTWX%s4E?D{qo5zbP?S zUy{r_pF120cSD_K`W`UGC6fe+y?_(B@i~)+%(cE$nv?Q#*F@gY1fFrZ0X@D0O?}te z{AmiY1u*x?&Q?pX?;}nmB`t%fy$Z|NVk_uF45JUcW_@07`vya4pBZthMn;HfNABYc@PihDDTY|Vu zp`R3a-Zp@r+e<8y&^PtE5hl~fDQL4_y4x}7YEnz6-Y!e%@oH{BpiMTUEBsHfPW0>9D zLaaFri;bnltT8t;V+X#MKEL1h@%{7r*Z1?!=lbK?<8kfU`+e>8e!gC>=kxi#o?UXb z+p=-rMmagTEf+7?T$YoQ|1Kw|aDBZ3aOGrsp`D!EA8r?I&Ro5lJ3SH-IcE=2{NBVG zR{XZ}@`kHtkKDJH+pu5$P~xKlZ!YNWOn!9!ELjsj>OM4fsmr2=C$_z>w!VX!(Q#YM znVv4E^LERv6_7nE<>W9M0uu|?8lS$Tuy4Pv{Fd#RiHhs(Pp?_4RUrRhXOG;O|9t(Q zu>9NM5Tl#0EL{?Cy36SbUFUv3PK+8c>Y9yU&woRg`Y`ZhNZ|N)`St%F&^dM=tInL$ zQxZA<{sr;g5kHMri4*A^aDL8jlp|REUo4KwQy*r0XBz#+{sj61Iwn*hr(LI=cm>Fa z_X%*4g7mUmMX(E$DH4f@gKHN`9;{{v0u+5UW3(4HcVn%wDMIyAw5nc5QJ*5!pm;H5 zh;r5#fjANfH@dM)5vmpchrHAJHwwr4JO2T)t#EO98U5n(dh2GD1{#y=Wt5fidfA-iB>@%0s2&Jyk z?SEj2n|^04HEb7Rep}#<9;Q-yr_rI`nJc|)AMr!Ehbe!vbLRhD@!p7dpxk4lbAG9I zt?{;2g9jEn<*Doo+}KO!^}3%qo>m^tlONt!c21poYkLoqlo}pd5TKEmIMF=qJQjD{ zLr>}EhQJ@<@HjcJAt=x;kwCsHtd8-GwXTLmEz20W1G*jD3-U*rQaCxuO9fh1b5g{$R z`HG>2XZ4hN*9Sgm@Q(rRc(=L+Jy99;nZ0Y@{*L{>t2#A1P{!v5OXZ+U>pJiIEO^!R zvTLOc6)A0pFpkq>(|ahoU}9iCl(~Kw6wIDnHgXl z;9OZ*$wdxt=Jhj~x#u8|{QP|2B5;O4yut?Vmr4W+3xhl%oV1VJns1#j$5!`T=5m8- zJ&M~~#x50aCTDCEqjG8y5QuraDraF`oj<+RH!E__xMwYO6zXPC#%~|Lm{vjy3Z8Oy zd6!2Yft$)|LZ@!d6-`Ln+2P{Aa-rJRr1EXG*Y*AJ?xQGKJef5!gRgJ(S$Yi&&gm?f zZt^IfOO9+D@vaozBDWRkK+CUjZ@q(OW1V&4Lhi+XV>izVUsji3@(oE_+uUrgJE zXz50i>8D?=G|$rN_NZzVRN`WEv;3Bpm*XeZqLh%OFON_nq;6KvG3^3$V%JHpN;<~5 zgvLdZI?d-z->7bbo2dcUgaUq3z4Xbo0uhQNw5{PYfr)6`dD-egs(mW_5~Aon zeCb2oR}LqjG}wCspeCGMwLAl3mph--(D2&SgXga-q z@|t6rW-<>licU1#r}M>~cf+dYDV$1v_0h-2r+hs>s5^AK!R3yj-e|_+khPVSSQdZeX!r4(zn1b0|A3pT z4-p6~&T?DYH(zK@V)K1XOmr!3_!@3%{p5s2v~k`P>vI)s>yjl11d0Bpvo(itlMTwz zSuQW{|H@Y{?bUa{bekd;3I)N?27BRglztz;bthBi>fd`H6G0muG+hq%s3A!X-#Wo$KIYYB7Se)r?G?!>ZKI)sW zoF&!?&s-6rNKBu*wH~CVrnlc6NaX0y0RZ?uug4>Z!QaxKlq9fA!j2g_oo0F0F`Te_ zlMDZ(`e$?;(!9sjNR5L-zOCFDu{Pp6l>Ws$5uS6U_z!}Qw|7pZi5pHX1+`%uqt#EiD#SBBu%g@K0 zi4{L8>Ye0r50AvwF9%oB&1FiF4ATk~w97j6ULf;CQ||;!O@>xZ(ky=;$Ca@ibF60T{<5o zh5jqY@YAUN^AN~5;%D3ub@>sd0tAA!QVBt5m#-vd814!6{JgAeLW==o`KPANM~F@1 z7Yy2lf_~KJah_sU_rjB#H3#b(srHzw8 zBhOwT?4f^m{<}0NHTTjkTQVylA;Cqo7#|lG7aLo~GU{nKH&yWIW#54|b~u@3jr{ml zogEqqa{pl``D#tR$?$5WI@QFJ{R9L3O+B%-Cm(t9;BD71p}bMvVB9ZiL$}n);Lfw2`xf-1+j!&XT))b#a5pj z6W3+%P2I_;!C|y@ z5@N|1z&`fp2~AAlnNj=kj|FnonKn*>?=rG!VpuM&%$OAxZgHSq)2H!7_Q zaVV9E`jp?ve@eT~Oxr46ohcWqjZV5u7v4S|gF+35JDN1!u>SSeMRHP@^b_&I;?bNf zXzs8~e9yxzqk{Z0H$6-`7WCt;TF?uu#pga6?aD9itFG%b>J2J5r2A9&dWz}tKhQ(5 zy4-h_al>kw%X8n2#y|<7!v&i5CA6VqN5U^>jY}krw}i(Q+cYs7#W#yxpQVshXRpv7 z;5W;;I5y9=9|X8#-)H&%I~6GA4C?*W4M5zt>OHSPH`%%5N|ql4lI_V1H1;UJ27w4A zGK#@t6$~~~0bJASdn~{Eim@rxAHPYxgEAfg&=gyT>ye=ZV=wWL>xJa;ayv$~|U>KtWiv9Vq!wAfiYLs%W2 zG#)X;MLub{sfXVxHj~9$!%7DgyYWY&2tMj{J$h4e(AOKm@2m9%_iL`}d;9nRJ*eU> z!Kr$-^CsBpidvcKrPlb1>E$aPKlLe(Z@#QRROC;TM7=EReHWVyohDSgn;0LA#8%ex zgDf;E-7=Hnb88@Uo(NjQ&v>R}Fb_7DqaP|@<8Z-X?8HNz5f?Ln>p%QN_}mdNxb%9y zp2mH96}Iljj&@F)ht*?SFM7-}k-X5Rrv`x(LoBOQ?X3b>d!o3PZ&q>35|UC?htP{= zL9hC>>L)O??(4w^he_IY`tuuq&vMRzGYs(Fr9l1VsC1wec)8RGaR$-voDFbPw=^@- zNYo(?M=+c3-+b`NT%74WLsXG;2f=G{^tuV3FkARzho+8F9Pjf1*h<`RY?^0ac!zqT z9!)V$Gl!~9O!34OVeH%>5N-!kjj5mBS?y@hO7;C!PZ1FgPIKHoGl2Ca)%6NN`mTuK8+@U+?RO{D3qf5m(#n7JH$*^$1P zw=$~9v`D3fzwovnhoBB?j&Y{f<i%I#TMcFeeSd?F==Q%3Z(qY%q}69sdUh5#4^wi?fv_4 zE}m9;h0aB;Bfql34^0V$k#=i*D~6M6QRRCl&7aH-y#vtp%gXu+J+gVMzVg1ypM8ymmKpySMb%@Y{Y?^M3F`t}B|l;d!gTYJ%JK&$S!OM*z8UyS`WQ;-13P(Bp+EkB65hnn{xAH5UTbB;~Q| z-aZiZn734cXlsHN`+=*Ub}wZ&8r-oSUJM=aI#{*R_vyd{T} z=@(PG1D$Ad8lNp&i8i=nm}4gQA3ya!HuL||UKhH!?h-6X2TSEoGpuc0=TRijN<~qy zRX!u(`&r{~xqpK_PYrXW3(MW^ZwK6)a<`j43OPPE0k)))G7uce+dbB%ozWo>2yP!I z3X`X7PYV`-27e@n{~q~cr%Fm|pz)DpU*mlvw&yoZ62>FA(8cthNW#7q2@ccrG$EpO=cRTdk1L2>71)sF1MS-z69N$*}(33)4z)W)8^&w|;<)9BM zZtXlEq0nxC6?ezXB2Legp{tY8!C)|+o%l)MAHxRV-R(Jrx}DWcfv-M#lzV91hCn2a z*H_tk(8)<7m6U4zcJ}Nkx7p)--6G95&x$H|y@B&HlDxo}TfJJ6niLn74xJj72oUi1<5DL7ojbgp;9Bsiaf1d~z- zXvzBmJW~6W20*kzjVgFzp->3eHkNqPmR}lYTSR+DyuhZLI5=E| zGA$_Eye9pqpF0=^bFROxe>tQh)PypmI^@;g8?DjUP=vJ$W{yN$Ht&$HZ5S30E2=H^~5 z=TiMaYfwaJ#i|hsgcAMGWX5xqzlMu)U1+~5=PD;kf$rcYII(2v&j5dH0VWun5q0-{ z%p#ojqJP+Mj{%2D%L}$mkH0kGwrycdN6l0yU;XEKvn0`Qnc>~kjQGkCblmO}LuOVD zteRSLU@Aar&espwL{7$5_j4oSUe4alr4xxg77&!bg+|h_+mA*X65#p)!~>-3`V)c} z-gaF|gqfPjE#OH_Fi_fV^88}^zy*V@lFDG+^b_J8hCBI3_oV`ykKRoL@C^W&FnTZG zb@z>=(r( z4TWYkKj8V?uudt6oCmNQeK!Vnk2ESSrS1=j&yCHDY8)9nv{XE?+1lD#5DPT@UIAbx zcG+Dhp)ED@)V;EyJL(=Bl=?^vGeBNnS*; z!(-K7(B9#s?ntcQN#VdMXj@t31XsK=5^vomKEr4#tAiRwLz}F8t*9TpXSU}gqhTrR zOJoad%6WTuh-W>NlU&n6PXL7CQmmCm+Dz46aEM<`qSZqj?j0>iu=v$)Cb(7%>?omw zfW$;6t`3wOPaa5Ok8gSikioQ+e!Ad!3jB#1|J?C?shRsZ5eX!-wuF=UP|f##E9nW* zZYsbMy3CnxYS5!tSA0kj!`!sr@pf$l*m{$5@%-+ryMH|VR1l*qg}F_19hvm5%ucA0 z$d&=wp4f_`S9P0)e~!&59{{#K05}5K z1Ds zZ>zYFX=7RZ3g9}CqAt8{T-ojm03O&KX$+;)7X$)?EEZ4akw~PIpqY3V`Mcg^Jh}ph zi(v#ibFS*;R=L*eQ|8HT9sEp3IF0Zb zJd-k-fNNy*-V$SB>K(faPZ8Up&in(|l=i?MW+{M3ma@jkoEz~s$oTSynj;QiRWk0u zX!(#HvFRUjBPTc>p-w#?o!RwxBg)G?t3(=dr!Z)sx6W%Xyfo(ESt-(REi&r~$mL+O zUbTi}SD?;$GV~YkGV>x>HOH(PFQq&G-7p+^;sI!D5(F|rajD(7Z_$gdh1~?~z-IkB e-ac4S^3;qAiXnTb0dHE!U9@$!sW^M%!G8hcraj~U diff --git a/tests/snapshots/flex/test_sign_message/00002.png b/tests/snapshots/flex/test_sign_message/00002.png index 8f11aa55fb9e4cc96781ae45ac09c7684c930638..b48c0c2dcfedd532f21dd4ccd5cf5ca1843922f7 100644 GIT binary patch literal 9205 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 literal 9292 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 DlghcI diff --git a/tests/snapshots/flex/test_sign_message/00004.png b/tests/snapshots/flex/test_sign_message/00004.png index 295f8f713e06a7a75774601ad62dc89a632ebca7..ed74cf147c87b585c57c686281fbdc6be7510914 100644 GIT binary patch literal 11236 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 GFa8(v^YEkq literal 11323 zcmeHtc{r49+$fPHYmt3P36&6ICtGL|UTV@PgcxI+vW$HwqAUqD)pExtnCp4&=e~dUZ@Yi%{o*e(V~!I-C+O(t zIKbDhS<=zbPtegFyUTJ67*TG?F{Y!FJqEs}ciTUMGDdk*TszY8c-FRn9?5$57&`2{ z!ubcR)=zI8Lua4YWwk!``po(5(8pt%mo#-5uQm8IX7R%)Q!Ct=sAleO1Cx)g6G3!z zGStvAIXb#*VR{a_8z;NzvU&eYANqb{Gm6v_LzpGy&-2_^yU7Tmi;I*j4@Gmex*Zb= zI~!7?CFy|)=sIjfSn_n!*_L5Ccr5!uXlEQ? zzVjyiysT}b1OPiASeNKM;wGHS>O!Zq{V|_hmF#|op5uXv_?-|w`B51FNW;~}9obA= z>hIYPH=qD6EG~3@wAP?-5BZvV*L4}fEP-$HDDVbU3wH{j;^>`D#!#0bWzMP+@m#vv z3qTKg`zw;&LBZcVsn|=Zlj7*OV7y1L?H|QQ) z->4NbnY>_UE*IuM9HI|k6{IE>KSJ5;&-1@{^j5gA({Jdna`bpT@nQ7{1zBgsKOHdV z%sip}_hXTk$J~s#g17%3>Td-971Mux5TLY`%@Swf1_?(v{|7D2->%$Z&7zebJ0?W; z+TpVW9b$H?elQ)N;|0q8QcIFu^FRFfL;sRhrI%Js$hkAw^tzV;R7ByIqh`%P2oOb=2A%PQ~QAOQ$|zDX$8u1*~gMrw$zKWZ(Jky%{y;h zK)YV4cDZQJivW~~ktvGS5DjKvZj_?n2d#Wl){Q@NK>H!fp!LFqYrnNo@Pi750RZAX zDEL7#pOPqZlYEBdAjp@VZjWzMyJ?rb?Qzq|FtfCT+M{fk9_kM&OoY$S;}=Knf7vMpox`&TA+T!HII56)(< zs^1(-y#cz)@NZTvj%yO+*4_Su3t;@eXx9{vkBSR0=4bq8Y+Ov)DHzb-tk}iod*=Wh zxo}KqIZi|IssMc)m+{l7kUy3(PSuDakQEo!Og`7Lnh)^nuU|MTemY!Vl3S%;=~7?= z9&+k|n(J?UjT`XK)tDDPeOf#+thuA!aHYXeVztO6y!jG%Z+_894>UDXs5iC2YxMTp z*-8Gh*>9f~>)wV4>^U=nDn8qm2_;$>2-4~48YJ`2<|ZOozMRQ^i#M@Mbcxhw1c3s* zoX|dzW{jZqKz+~N_w-#XE`^)j>yl}2Md&#wV!XNUl-AE>uQE9!o}a<2@*QCs9oCF^ z=e^GLMNfB1o4aWH**}BwhHpf6PImh{Bfj0GnA{y37U{~s&?oplJn)Fsan%EYE$r*D0EedgA6KA>g;!m;~cg4RsAJm~RB=PwX&Y?r_ds)1B%Xy(OA|F>VXk!K1VHN_cFu zutfG-i@GlR<_8q^Kx_4EZu&UYmFKSV5cr(2u0dVP`3r&^GXTks*20-9pzMYdz#I;G zj=W50L*7LW%+B* zSIpgwJ3h%)FPf%Cr+dM*dv23Tb*y~~SY8G8<<#=Mj^IQmXj*6BVyWzC_^GA+1tK_faxCOT0PoH#uzA75L#wcGH% z0-mP8?lfMr;~YEYyDbB3A8qbabHCH#<&^*8V%-?NvvGtH`Tji1(@n+#Vp~#tdRM;p zr-00Kcyx{$#ta{eUpKVyPXvKa5zu^wlNapKPMIF�o_78J0CIT#auC@#eViwj|?v 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 AL;wH) literal 9020 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 diff --git a/tests/snapshots/flex/test_sign_tx_burn_usdt/00004.png b/tests/snapshots/flex/test_sign_tx_burn_usdt/00004.png index 295f8f713e06a7a75774601ad62dc89a632ebca7..ed74cf147c87b585c57c686281fbdc6be7510914 100644 GIT binary patch literal 11236 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 GFa8(v^YEkq literal 11323 zcmeHtc{r49+$fPHYmt3P36&6ICtGL|UTV@PgcxI+vW$HwqAUqD)pExtnCp4&=e~dUZ@Yi%{o*e(V~!I-C+O(t zIKbDhS<=zbPtegFyUTJ67*TG?F{Y!FJqEs}ciTUMGDdk*TszY8c-FRn9?5$57&`2{ z!ubcR)=zI8Lua4YWwk!``po(5(8pt%mo#-5uQm8IX7R%)Q!Ct=sAleO1Cx)g6G3!z zGStvAIXb#*VR{a_8z;NzvU&eYANqb{Gm6v_LzpGy&-2_^yU7Tmi;I*j4@Gmex*Zb= zI~!7?CFy|)=sIjfSn_n!*_L5Ccr5!uXlEQ? zzVjyiysT}b1OPiASeNKM;wGHS>O!Zq{V|_hmF#|op5uXv_?-|w`B51FNW;~}9obA= z>hIYPH=qD6EG~3@wAP?-5BZvV*L4}fEP-$HDDVbU3wH{j;^>`D#!#0bWzMP+@m#vv z3qTKg`zw;&LBZcVsn|=Zlj7*OV7y1L?H|QQ) z->4NbnY>_UE*IuM9HI|k6{IE>KSJ5;&-1@{^j5gA({Jdna`bpT@nQ7{1zBgsKOHdV z%sip}_hXTk$J~s#g17%3>Td-971Mux5TLY`%@Swf1_?(v{|7D2->%$Z&7zebJ0?W; z+TpVW9b$H?elQ)N;|0q8QcIFu^FRFfL;sRhrI%Js$hkAw^tzV;R7ByIqh`%P2oOb=2A%PQ~QAOQ$|zDX$8u1*~gMrw$zKWZ(Jky%{y;h zK)YV4cDZQJivW~~ktvGS5DjKvZj_?n2d#Wl){Q@NK>H!fp!LFqYrnNo@Pi750RZAX zDEL7#pOPqZlYEBdAjp@VZjWzMyJ?rb?Qzq|FtfCT+M{fk9_kM&OoY$S;}=Knf7vMpox`&TA+T!HII56)(< zs^1(-y#cz)@NZTvj%yO+*4_Su3t;@eXx9{vkBSR0=4bq8Y+Ov)DHzb-tk}iod*=Wh zxo}KqIZi|IssMc)m+{l7kUy3(PSuDakQEo!Og`7Lnh)^nuU|MTemY!Vl3S%;=~7?= z9&+k|n(J?UjT`XK)tDDPeOf#+thuA!aHYXeVztO6y!jG%Z+_894>UDXs5iC2YxMTp z*-8Gh*>9f~>)wV4>^U=nDn8qm2_;$>2-4~48YJ`2<|ZOozMRQ^i#M@Mbcxhw1c3s* zoX|dzW{jZqKz+~N_w-#XE`^)j>yl}2Md&#wV!XNUl-AE>uQE9!o}a<2@*QCs9oCF^ z=e^GLMNfB1o4aWH**}BwhHpf6PImh{Bfj0GnA{y37U{~s&?oplJn)Fsan%EYE$r*D0EedgA6KA>g;!m;~cg4RsAJm~RB=PwX&Y?r_ds)1B%Xy(OA|F>VXk!K1VHN_cFu zutfG-i@GlR<_8q^Kx_4EZu&UYmFKSV5cr(2u0dVP`3r&^GXTks*20-9pzMYdz#I;G zj=W50L*7LW%+B* zSIpgwJ3h%)FPf%Cr+dM*dv23Tb*y~~SY8G8<<#=Mj^IQmXj*6BVyWzC_^GA+1tK_faxCOT0PoH#uzA75L#wcGH% z0-mP8?lfMr;~YEYyDbB3A8qbabHCH#<&^*8V%-?NvvGtH`Tji1(@n+#Vp~#tdRM;p zr-00Kcyx{$#ta{eUpKVyPXvKa5zu^wlNapKPMIF�o_78J0CIT#auC@#eViwj|?v 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 AL;wH) literal 9020 zcmeI2c~p{X_xCj|vs2nRo%Cpir_s#92Ghi`I^|JQ%R)_2%W}Z65Y!aGMzc~Y2NK00 zHA@0cnvtMbSvioRl9B`Bgop$<;DCy}w>@h;>;2;3Dup5GtOy;!Uz_qDG3+V|eq zzCQcAO*!N0uwkA4Iu#X_4UT{R<*uTlI-sJm%4_W^;Flu}&m2@#cBnc2b?kgxo|r2} z4MBR%FS6({YJIzo?t1jw->uxLyyfC}uP2sSGZ&v;JR2eH=r_$zTucp4MQ1#|-Z7Rn!Ly`*B&Fs&t(*JXh z>V}P(No&?R{rC2NU(0_w99pPTA`ZpB4&zJHxeEFjoh@^Z7h56iXzhQ;>S%7rhOj^Q z16wx!JCb?Fq)B(rYLN*)137v|mMJHzoAGjfjF$f^)HyDOIZ>zWr&}Dal5zhU^jVfB z?*|4I7zmtJ1})Q(tLKXt?>rL%u3?v#EInNYuEzg-0(kiTLW$>jC__)RK;0j(7qTVQ!0Go0>$b!r|dhJV{{I{w0bJyZ{KNY&+cV4jpm4}Tq3NlDtB z{mba(M?2K7tioRfKY8*jCrRDx*TieV9*|8LNxR9WjV|^2f9)>R6rW?CGuxDxw43I3 z|E%yddKKQ}>gVBquPSn_;ShqU$02J)Y)}q;Gd`EIX|~GzQDO5 zZ$RCwJ>@KBpK1$rNaq-1lPd5kJLD(yNC~dMBHFapw{_J+WW{ojx|t`%BF$zjC(7PF zntS)${G*5F&Bwe};otSAww{>sw8M*b6;?YL>VJ6D4l`DDIitoE>{u0hv@I2}F(YZT zIj>`DSJo(PZ3y|xh224oA>?~WyPrv(*6ZD>vKRx#JW3i}hdxF1^u*5tOG@;6(j0Pg zQ`_wfhb@eO$oCa%iw*wTQK&g?LZ{L?KFN5cCMprSDb9K>_WyeQ|EW~PxkBgq(bg@& z@I208CPY9Wt!qMoJ|T{Byn3Q>Lb-!;|wJM}{=om%w~Zd~LpK z8IJs=EDS%2RW9=AhPkJAXEcpWPEP((F55<>Qmd7RKLnBQBZ?wB*$3mbD= zf-1XTc@X&s%be3-UxHLBms=_hg3?7aMtC4*U)^z-Xl8+>J+U|^O^?jM;c(8J1!YZ5 zP06oMk!jb3<9QD9V&Fl}o`Ph^i06EEi*)bOClJz?1FVm40*_me%db~?^L2q`W0cEV zuUw2jlv7h%8$s=zj58>4S~9@%N|!z*k;}_bAl$M=sx6PpY3~ z^xT%+wcow}t{zHHPZz=jgM-^B1HHXIv2wr>Ro>zl`qD35D4U$qz>^qz0V~SN%4+cN z=u%y_`rXO6yuC4vmYDLGa(gHg<(u9xEJQ9y)T?%c_WQ_U=v;9O%D0SC=D}SUxmNd) z-a@Gwf?KL_KrA}HF4r*b@jqnIpf;`y5fv51)vjSMwBEEgG&D#&bsn5tejo7qXh}X4 z%I7ezz`(d#p3O54ex!0?p-1sPz80)I1$bzOPDd5xiR1N`<*-S>RT6cIWQ~FC@gKeM zfyXEmN*z|&k27A(egyb${q6SmRc*y#emXX7Du6K;Fn4Z@TGR~HrV3c{w@cKWg$e65 zkWr=;fz}`@1G<}Ozqs z^gej7CNI&k-KRdg-(Q)Dj}_Iq5mnb?=TE3|A&;a!ll>2Enb}IRIx@W?uh+w|tXSS2;)b)-*s7rkJg z+cx_CnK>zsui-6Nl%^rppGU-LTb6q8w_TbK$$X>Z7elb^$=1@G^JqBW@)$jr!HvFS zhh5HWD3{zQ_i3Bx8jBPlG;4jiiDmjmT}!M2JN`iU+@A}xvmThjDpk7$6Qn14{yQ6D zIffaK?N_F1j$wg~l9l>$bFox%gLKo|s+W%1gR?t>B;LsPBHp;YKYh;y6CP8m)q!sA zpe}p=2e7)jbID=WAStnlk=nL@jGHkTsg+&(xt~(UU_4KYu-MLmPWPjg(^1so&5w=N zAiFWMiM6Q6cJBr@b;)9OlNznO9GCVvpq((<9cmJ2hb(+mQOAxCE2Kk~B=13p08;aQ zb`L5#5r|0J$f`60IbEt{fJ!vecjX;s9(yvpPTz}nsE~!BbM0H0YYv==)c+OlS|->q zmUs)n?U-&@12JrfkVpMUUL)H^i?FFXa+NgdCV1AspnA6;~>-h>svbESLhpwP~6bLRAEi(Hp(V$1Yt;*fh&ayHh9)Nw_C=#Q08@G8j(|LN5UuDn1aU9RlTjQxnmhvW%lnxg2(zjd(E}>W7&ZNr(5O%cP(i z&5L!mRBv9RTTQ2x?{09GXT7^=#UiO+H~q}rD7|LOA6jmL=+5$o4`HQw`}kkWWDev| zlTW6RwgtStz7nf$npBI&iqR1k9bd$J=nO?AB>3!(i$~%z|m-f8nUNaZh`+aq-1&*vo zds*}y>N2#gsoS3&+)jA-HoIHm(b3UL;^Qw3*~~zOu-cmSqCB*+yAQCDz4zv~rL~6R zl>(j3(-$|fwKt5BGuwsI-|cJNYMeXjH>810(&eLP(}urTw0aQ@7*J?da5u_VKsaD( zO}O&cmL%|Da>A`I920DsIL4}g#XOwe5|qKSDIFyhm7OzD91EP@0(v*!c5!XDo59dn zrxO)jWn^OY3(2ZvI47-d3Mc_Sur)mk1@^#$=*^_Zg zQ&SyQG*mzf6YCs(w2(?-M}AJ+t7PT6)H2-~NQn;3u^Kni zh}WyXM>cGy%ZX^~L1DAbp^3QuDbiZC0MB8K)?1*b|6B-iiFFOJ#6|O5{1-tE9Cs}p z?Y>)&HhkS|<4KBdplH0cj~UqXBc6ZfM{a$>z|L;OPzysoKzckkyspP$3-#4|2JiJ; zK8qdJk4Jv9Qqsb|bE~ZQo*`NNi!UB|gxR47OA9Quz3rt6uP7hWU~t)V*A%x)%}zsN zAgsL>G~ky$cnY2EjjE^4y(M=AyVj7123vAkf`skI`3FZQwm_S`t8BaD^&LAF7K8`e zX`ln>6VZBCR+3zuyw|%C$VxuL=ed-Ed6P^gMMQg;=^=#j24VKv8`~mCU0n)$>8FSN zy2(VDgupM2-7lHjRq$`Kdy>D>I5ww>+eIP~qWTB-Wk=;xfUJ0g?`?@^q_1aed`RBG+O>v} z;^Z>_2}kyp)?NprNQd`}pXX0xqs;A4? zH>^U+qnFkJ0418CQOkwPTRCgeC&Fs|dapV-TOdoiPr|o<`fQYUhtx^OKX*jgChB`I zY)Wc4!w<5~nF6c2F=t399hJjDGyaAPl9amRdu>d2HXc?XuN2+Q8#Vq{6ye{nII@bg zR~(bu@*IvYFF#d$)|UeS>-7CxmH>dQLpfiADp@9XbaDw`)vY~2mDe#C*LIjU$)n(n zQ53b88;QH0{k#8{pfX%iT3D5Lgn6zk)|XS<{-V76IeaR=&#Yy5c=-A+ThkkW-{APk zICTH6f}!3y@a4!Du&cdBr!_IgUngMYf=?YFe{re0p3H{n{w_JEWr zU5uFAQUDfdWDyNBM-s>QY`(R()-;mZyVShRci!v^KK>qH>%>l{(h^2A1pZ>#&sdB( znpg2`E zbKaWJggOKk>ksV=G4lr4aCKHao$J}GTgHa#Uo_S|bO6$qK&Z5eWE0_dfO91x?qMS~>pX%*9Q15A!XcE;g339|5JV`O!FRR?5;@`B<;S5`7CWcST zm)`fcTsh=O4;ZHd*lRN@msi8i_oK9HI-c6{%2@#A>raOGzU~vp7^iq|ZR#^b$H$M0 zFJ^aWtZ6lBc5em+N=j{QY*6%6wYR;1%i_`K@W8HQ51<$*jp*zdxPG>CV7~L(9n3Mc zfd|548c+_Z|FL;)i$bA5+p=t4Ci)9&5l?4XziV){&ZE5CuW*Y`wpR2VJl%n6mB2Cj zMlbIldAeOJn0Dq#kjdz*V#@XTIoo-E-B6EOjI-qv=XD zY?NTcb(^19x&AS|HkE_I>{8h1r@EKFT{U@6QAsr|`1lNtuUWG8r_Zfx0PKg_T+?x~ z4VG@8BVYbAZY45oOL#24*Xam#!VNTQm(_de@6abV{rb}k6V0)EJmsK+%3*>pukQz9fsx++i`#ZIP&u zi>LnbzY1lTb{U&5OY%$6rXsve8!dyI4zx;G@5 zKG#SL1d7z*;meHi&T#@18~eF0!(}nJ$J2*PtfwQAnU~Hkw~HR$(K^Z@88(nyL2@|C zTRRVlh85u=RPt~j8Pw^-eIfqRv{dnd4-ZefCG!~fE2U0>F#Q)Ms&~uNV+C+@dGuDz zG#|q6pWwSs;jvRir>)6tOmmf1XM2q-qc`G3dk`*sH4;CN6(7Nk{+_7|)PP2xlNX+< zMc?;{;(x}3YKXZvejx7F3s-M_o%iMg`%BaC7LESj5U`?x9+mlkyGOV8gqssP%h7mW z&$N7rR<@}GS4QRgT)!wQzE){kNY@o1iV9?J9(i2j7Ul2colOil=0I_^tlP!Aujsym z@dLt7bL`#}sLC|9Jm75?BdJwUg)lmO{qY=Y2bee4I>EF!mwCdVHlw)G%>U}e)!JqU zd?^-1Y0Xf=2+uW7;*ds8>sH{ zP8|S{J8UWTP|llXCyNu$iSBN0ZrsTsnb)%u%`Fy;vc)w_D^atkRM;=6k#zE`*4xqW zwP}8Yr31_3FSh;Iu})F5=DjZaR+?yX@|t<>jO3(o(Him*KDQ!wKu#K#82aqfkxSAI zAb^BHJp>%2JagaH_0Fu8qcxXvyQt{aFAVo`Y`PwkKlM=e128d+x?^FgVe^U&l#y%2 zoNX-iqgU67yQ@G>If7Y`?S?-I8_+U?x?Q`zz1NwqDBDsHh$25b18&^dfO>ZxERFu_ zRNk(0@uv5)8Q~{0?)_ot7s8)E<|_P6#?;t9s#AB`s6(A*u9|XKxw*i2oQ02z!;@3ZIuQNCGk=s431G zgGO6V(Ba?qB*vQQyX?*&ey?Hj0q*V$g+ig@E{2R|e<@_u!tyd^MOc;1&&MrzfE)G{ zS6`sURODcoLybg7Wfl+VVHQkCD_c)Hb7xrfvS=_)!3sjuh5)hXZQlJ{`fU zA;G(650|x07`U*%3Z|6`Db`5KCDW?@#{L-?{<)mzKj}s%f9x!s{>fC9ggSdCfKPQE ze2!m{v62n60phH$Kd}O$Mj4J0t1_x>RjZ%^2BrkO8ivHTU4UdbVJ%$FrRiF@L}Rha zsVRi)Bfyl2iQGu)Pdv;oq8VNqSbRtZ6PRh!R}RVXPhDLk#kX!7Gdtj6^3OnRe9GB_ z2yJCFlAjqS2C4$$rS}f)+?LVhW!ocFEBbG^t8gi;;qnO5`FS=C!!-m&qRey^gU z!_Mq0L4)8Ugh4y69O_<1jqb(Z=kBG4WZ+qCsOj-d4t;rljLX&7R$2{^h5$$Idw5eN(i*n*475}pIZNFI-SW0K8iDO z5scruwSLjs&Q72i4PStJhhKLw)#X4kL^f2b<2}oqxE|eE{9x?ZF{-}*venFWHV@^? z3aX@$0j(#r%E`aFt`3`!kU;eXz0N~^*r}9;n>z<%<(~m6N3OQkw#qJWi_T*Bd-A7Y zQILYq04mqs_P|=UtbbWPE)*KiY$Dd};6kA`*4Ab&(?!)RHNdkAnvCUDix_{A_J042QUQ_+x%tpv_ptVIOEGpseGvh~<0B8i3p-$VbIqiFoZ*lI!2Um47tA zGB67e5JfNqgz&sr=IQrR`2`clt6nMG+!I7Ld?(yGJ2>JbaYKO!B3OM=W|!U5|wGZ-iTIKa>z zQEYFSvA*0M7{|BVIW33jj=;!KIt@dVsn3#I-dflx=~dRyJ^lz~>8lo3m#M)qJE^G1 zN)d)Z)&U&CM~ypSkEIlh3=S66Xf9V|RabyyNJxu@xH~*1Iyxg@5=bMc-R>Net$b@f z*V5WjxiVMd1Jg%oH~GW)TXlUHKUyD~t^ZD&9H+hMkPmILB=0M97Q$8Fe?wf}no@)M zo!O}BVrR<$%j)_klHY!e-T{hH#l%Bbam1f@n4&$pl+#z*JF014wxzjS@}q4Fa1COE z=X~h$KEj=?2zT@+M6-dkH4YmW_pW;7f^+Q~jhl_4m*2cjLyWphHCp48jrH~QKq>V8 z&O)rlr}}kITRW>XkTY{n!rb5HPT`k<(jqK9F>d90S6f?KU9IQ0{43MApwiE_^wq-L zn(RcyHMTTuI^!_pNPB;FMganot$9`c`dMwR1rCJ@K5&p-y|6~rhTs~lZ)<0VBlKBc zsR4F(WMs!<>`&=(gz;rt-6vp92O`iv0=B(WDg}BY(Y)`6i-WOX*F#z3*3+6RFy=}6vwyKH(zL)F;Yg)p>qoQ(w}oSmqwRr zaG{(TW2M>A_BRXdIMR9?wEx~lJA#QSp|l~j%!nbnl6cs%nDB?x#MQ&dExNQZ=?6j3Pxp+i8VN)ZU10D^*|1VyDcsfPf9gd*KT zj-Unz9Rh~HK?o%Q5kg4_x!d!;|G<04xZ{p*eD|k4$6jTwwf0rH zKp+sW*-ayB5Qt?S1Y&jIVg=r)_m`T2Ko`JfMuxUg1r)+UZmAx9Z($(pP}KeQr&A5= z3M{~*iT$eKt>IJU?3WF1y*#zdJcnBz;&{QuB}CJPkyX~E-K67rW$wpYRM}+8o&ZS? zF!S3%AOlraQPAUaB`gMV|7ZMvw+OW0HP%GMhz{2*ud=T1jCd(ZGblN+?@%Ed+o(|W zo;6ChT}xTDT(z5%C0$#la0|-iJHWB}BKU@Zr{qnaI2l$^RRf(x-IK#Fk?_8$b0spO zK%t4j4aHFr7&0-%s$A8;;KsR85i52z_H%_S>4_-{<*M!i!vc@t90BZV<|6$4Qp-XRn4noj)`_bI0$4gDq4&{7j-%Q;AAC3U$-xQ^r}fi(xv2Nz%d# zPf#eQI=l0o0?G=kqGMc1(rKmDH6Ww1=WN9pNWlR?7GBWxlfxkC|I`4#s$3nvFn{~x zaH6FEJG)wCZ`|;w8-@Zd^;027D3FyYx2Ug)j%O&l+HfK~1*kB8u26=Zh4(NSo+8e! z_EW!H)kvn~5i)>0XY@v!NyP6(M zIHg>5`Du^YQ=F-qXQi(pTO!~A#AR&ozi;dm2pX$|AK!Nqk6)w%5!PpuRY7Vs6ks=0 zc2cRAPrKLb1cjbq|8ptyS*h<@+D~Jx!^&U4XU&w&ZGX{PgIdEC>styvU(`Y_QX+J( zn<+UeW>+#!8IMq73R@)O&hYhA$KB;_PY2_+!MH|p6u2)09Ijow8K<`{RVsG^^Kj-~ z_u0)Pm#VSVJ?`(Dd-i(+OQE^#Ys@wm#dc1UVowX#A!V}W1>|Bi_P{!D?nwst(0f75 zdDuhPO;Lz`k^n*I6{8hY`QO{s&>4#5o;t|IS&E&Yv7qtwTfKYpKl8t7ax__g)6N)U zPITdFCce2?3^d-cNPr8l@3gzii^soq&mrjdDuX36mU|+SML{OJ6<2*Tw2&C(@${8O z1?q5V--Yd-f%ATO7tKaL9xgmo=G|t*Z)#fxxLm`9gN|cz+gK0@Fpio$bc@VO3~Hsh_@MDQyq$y~DmB|H*UQl{YgvK^ zql{csGnaa6EBG03kzXB|9dE_&{EW3`|>edqvVdJ}*vX-2Gg#XdGRq?!3 z4ttH~1_O?;)x8}ND^w&IKa{dgjd~B^>mcb53c1PhV1|1d5b}{7gf(uLdV8EoJ0WP@ z62H0U{fH4ythA_j6aC$yZ*gmS|2rQPFGXLcI>F}QI`}JX#7zl1>%Bj24tCpm1@A9~ zR`dTvZ5l8&|0?V9=^3WRbP+c*t}Ts-Her|kK7Jn8JUsMvR*9kw8da0{;rdfN{)jgi z92K8ByDjxBF=(EDrO&SXeA+pZV?<-ri3aoog`{pJNDlf{vH2?dgY*%(;W zrIK~-*&1qGOJF(?YH??OYFqBI=oPqHHyt5gKgE0+2HF>jzg$wN^vhIiE@vc}d|+v8 zpxMBGlJqjv>ET^LiHv^iQfQk?0rnXcm+8}-!XUV}nlOrA>Ol`8pKov7%>2u-WY(%} zY!$9kSTMHxx*`NK$Oo*wxeX!Qvwm_8;~^Z>It%pCK|uDGZJRGL=hV3`nT3KS*DZtN zI1ACmT1aZmIxBf*Egi4-mO0rioFsj7%+`K`d_OiL{GX5DA-u6i?|ZB14QE1_e{%U| zBWkCzn=ED4P1hLltwIln_KJ5yqtbQ~uG4J25-#lbq^tQXMU1UZcvhQ#)aAVaG5WQd zNez2KB*N$&s3T)&f(&!+k4>Lg-gI+WfON&(TCgW@+B;c zc6og1`_Vga()V6`-%;#QGQ!i~N`<02ozbl~Fs5xsj`)MrOx{IqU$G3EU^?S2mHR+< zi$e6;D~lNM!QHI|!F=1_t0YXr>rHMjEh`CTqm(D$*$13E^R2Vd@~!+J-1?g2J6W?7 z-WAirP^!J=^Jq~i!tNm_eKawsEWS1$7X5zWa8fY_OnV!aL({)hWOj@ME%vX z+=xrgjMgJMp5xu6Gch}S-i|FUiWGLui}juP@AL$te%y8*ws7|BAk4IyZbo#_8WQN2 z?+U6TAO2CJnZ5I-!}|!#@MxKJR8luiMai3;k{F~BQK&oCIlIk{CO8?d;>g=vD}*4Q zVuO{Ans8!LZgSuUht3Wjf_?;8a?l*N8=Yb;kK3N`_u{V+u#V-PYqK}4l_L?AN+`R(?<@L00%W#iUZP-@54gp=hjZRP;#S@$NDY9 z4BI#mS5Q#-;j$&}<7C@%Ys}7plt#YjRDDmYB*I3I!nJ1C)-@A@>2)~tvb3BoMm&zH zBsC{ocy}W}qx+$Flh3EhLUpRjyIqGNQ%wXU4>{x!c{X;#P#NqAd;ru3<_wziMV9Kc z`n4<3YALNt(vGq7gJoOu7P#0}p%^vMDaH8_`g9b|hxx70&@_Fqp2F7A9gdhgMw$?- zIuU~0-M!L^AZhus(iZNe_qRhr9gACMdcrRr?tIrCjaqy`a^q(jf^R~pKLb1Ku#T0a zK-UQ3&AiGOe;K-NB_mxv0y>mA6d;?oy>q0p;KKitI2^#~i2Ihn9EAB?*rO9xt5Et~ zqz?CbeV!Y-)&=(V<}ea_6DJEL6xl*!O=nXTmD(h)-x5 zI_eM7%>`Izl7TBpzg$#Ioex*5nKD-X3pa7FBQ04jPfDKo*r2){%v`KG!pDcBqA)$2 z1qb9p65pxQfy>E3hqu;k+P0d4r_ioIhgIjJB_-s6;R+oWn|Af4u1o%dJbz!O??%H^ zVD(c~Y+`GtsS$ON4X6TiYTuJWoClLzFD42jjk)`N>H#9I+*&@Zbe5vg>tH}YZ>^yG z#QSLw6x09ZH_NKAGB#j&G=Uv^YmD71a~2-7e?k=gB%JdaLwV>cZBbyQ|3uZfO+oY1xNy=XHjJ{)~YCJgj1 z$UX9z<-do!|F6}5%2fWJTe0zkTh-eK;BXNTXbLc8%_nOii!g6P| zZshyElWLkDtLP`Sz8A~1^`Uc>Km*Tw`Mh;?t_;6ELpI^JkKr0dXKVn*`03{T%6C61 z)vf|HUgi#^4EzEd1z%D<5@&rbTf)+r{b@ed$f=rLEm1S`Y_#Pw`J6wNWU0Et?Xy&ol zzj`iIhe>KEOtkID9`P5=luS5kIS>6;UnpNI=o$LLfFjmP+Itz8WYl_dSq zMe(knx$DWk-6ssO85|CGGvU}FT!+z3WW;OM3mcE*7yZgy-141F084h%{fOwueJg8r zE#OHn{@Ec?lj~QPc7c(Y4}Zo~l1bV2L2bg*(iI7xC_pKg;{96yr)w$7 zChyUyF?AhUyL86*l6wGbw&z{?7}n6BtV|0T-0FN+@U9>NO43ypWfdhHGZg6G8i#@g z?{G(Urz2AEEc*r#OiWz8Py9`89o+WzflF3}#0k+o|ZM zvb3M#U9ZK^Gm)F5=*W-)9BC=kul0sRbdgdv7KLiBOXzX~5LO>-bylstt|hrO$ghY5 zkk_7HpYLt0`PE#01oX+faz_Z@fr1NUvIT1CN}O?lx$rgsIsU*uWK^I+7> z!*#FV!nWT{I6mxhgF%G!#QBy5-7cSDH_WSCcA>}V=^pF+0oTzE&*NO5Yp;L;G*+#h z`Dg9nL#>tj3fNFIewx?02ea^!)MkS|(#C}m7Dqxib44>{N2X*cb7v~Xz0vRL+13_E z9jmn?L#9ccL&qEA+Y?xrA~b;Q=>Mc{JfEd3%U(~_Jx&P>Ae#u^zs(>s8VEs*`lFR+ zLwrrGH6O}pPlGLmQXAWiUaV97l?+V#zl`gK$G&~_JZ`5HlUH)APAmpuUs~_ATD++B zzLg9Fty_J<(cuVlurZ*A*cyD_%hB87Q<)s9H4vi=F0?qm6WSSjn}SD**2fiDR4HKH z+DAt8uKLzG65o!+Z%$Zpm&)k?gkRLNh*bFm=}2cp?igb)K7=5Bh!K;0!G@7m!G^P# z;QFccvZ-eMCOTv8=xxujzzj2Bw`5EPEA3XEg)^^G(ZwtHQ5_s#Q`vX4MeG>(sxJ`92)kS6p|7l9fe+B-BFEQ# z^?9oc^(gw7-OM9_=sofL%{l7|+f3QYvJwUCgnxw%lwWN_xwGAQF!65j^51)guzsH^ zbe?PpMma#W)dC95V4aaHqN*A8DyuCDIN43de~rZH?`>R#-de>MP&Vcp6(|-z)XX7! z@5Y0l*%Ke-+r$;o=O)k)`a+AY0g?-4k z6(utt^|8c_vn3QyEYg@sBO(IV2+mGbrk_{e2~Dj}SokB7zmBO33=3Q3KS(Lg`|U!4 z{gK%tFb*>4K=N+cUDp(G6@22u*zEqgPjFrnGJX|gm2XO>?}5pGo;lL}5^MLg`i1tJ z!Q!6NmD^mp9$74PM-nazW@dDICEjP~sm(S!?dyL5!Gmoa-+QhL+JwVRIWt69P9I)cPQx5BGn_w^@oWqBRD)jnF?G-R@1eG!K{K|5$-k=Ampno$z0ZTe|P) z-Twf~LLP!$9%v+!NPxs7&X+pqjdrSo>ugUs{LCy)Fn1l2Th?_P-R#*r@gU-F;q+EL z%{fF6v5`EGU9O!m{rU+0ae}@_)U8XWk*_0K#&NmfHyMG+Q?QXR&4@)8<0CbG%y5x8 zed6tdjEkYYT;Sl1Y+;W}xaMPZu8KmJOxNryfQ-eWxPhU-xKyMCX+3Obns)$@nwV}M z7q=WTdSmoWimy_~>{$!dr*xl=sRim!{Q*!vDZ;CAQ#VzSBU2f6{#2nAghfH#8F8Rrs9^XPu<{7h_39TQJ*@{i?zT+i)i9d6$vKei&US7N)XE zr&W8NXm6tjLSWmeB6YDoyRPCd&2Zt(4hrDQ0sN*Of6JC^ggFhr#7Hi8I@O6X@9!@> zYzTfYg1RBKFUzi$Qgta)Bdl2QEH@;`a?ckCSg%|{V~{FC;XbX`4XKh^A2(!t{i!u{ zBD5`F3_Gy&XWRJ_Vyd2Rr?CKgk#=RXGLKR=_bNCNrY;@xBfa8SdMkF@1;#(l>kqM# zH9Muq6aQk<&nQEDc*k&&A{s2-f9W8zXk`m`X60`X=-oe9W4~y{OyebhO)esrkt7af`MZzgP&qnIK$VN{E?))bss9FUm1(PvMracQww%!%6-b%y zBrx(Z)sX{ad6BE47$Bz`a@<)vSZ*{lV0-!H*_1{!gXI|+7~8-n(vx7Z7s>ycl0e$O z=k~v79NF9|#F478Akas^ykK@MTqLJv`(R*;t@F66_AN=#>+kk%4BAL;s03f;aWNEIywItU*#iQiX6tH(XWYbD_ zb^UuAJ4TjrBbuU(Dx=wVV!Cz@HMo)}5wlEmHX!?$K*af~#;QptRO;Hw!=TVq%%6UP zOVN@k3-LV(do|f!tMI}8knhXS#9kzbOgq+a!j?O`$cD%lu1}AHydX)pf_nqJO z+Z~-b@?y52qqMI&f_Uutkd2%|x(7zZrufnG-GN)%X!^PXcCcFCF<2bL^6-L$)|@(Wzg-{lvSw zk7a#!F1g6=Oj9D(sqOJCP{GfkZE>Da-ar=5m}JbdCO1Kk*5!YO`vDIN}4URhqW%j;BH zLz7?^&RwF)Rap9$cg~V3!m_+{R%c-KlbR|u zPO(5h5Q3`S=!o<6FW%Mn<-i1L%e^d;yt2XwEq|~CLT4%fb9vb5smjrTv@bK+Wsd*!x*6U(rcMFeMBp+C`?`TaX)L1SM)jpP5;zw^{ zfv9O}oI!{0O8drwO%Ot}+0?YspDryM4U)RG>veAdLTI5nLInDt#cDwlyc{F+iudS< z{3DmwnHjXRb3ih|63?nFVs5}Mja&q3Z{8XsU&a0+k@~m4H!46_2p*7#=iROciPpF9 zFlBG$J^)T_rw1wW=sA6g)7g27oBMoZS=_jw*>hK%-b3bGw`pqX;ad;3fjeYGfBPZf zK>Q?r99X^A8<`o44xGgZL}^Ay9(Qs!q}x9AanHnn)38})PW`%?xzO_`$j_LC`GUC= z58vHJ=Cu+g1Xzx3LG9#ly_|Srcz^a$scr zr$##>WSabE5s(l(>eKM>--O>NPG}Z+H3!TaIc3?dnLl{%gM-4^A>PL;fTBM1p&mew zwNnpp;hR+uYzid4I^+?{rj$rSfHr$2IxiN;u#mY=?w<7A{F@p>Vc+sb;{!B+MAZj} z{VAdcBnA$!GwiikflLG&wrp1mv)P{OX_9}SEhcutJLy-J$2*}1;P?R)hX_bB0DtPs z9Um$SOQGyDGtBlufM%$9c8Fuv^Uv24NC4~ne9yy4Byi}7Zf*ZYom-t9;HAq=Df_l+ z_3Q07(p&>}Kce4XN-6pr=UzIXST-m(07&{w^V10L${uX8v~To-XKgy9?-O;KOgrYB zoOBiW>oaqoigDa3JTt+jQiPZ#YsR=m0Jdo4#^;cLjFh3q0oBNlXpO=invYLodG_Sk z^5tyoXFu$;^Si-&?wbd3SrLcge4Js57ZRlM=nZ14v#hgwXSBk2*bUwJX#p3F9bC%&1xykan$-H3JfSYd(28 zOBBx-q|l!ia_n_=fK;mKodT_~g#5pwz}y-|^?C4(29yf6DD5ZQF3iu6zxR&d zPv0UhOKw^PRZZ{n04D>!5KSPRYdBUnSR+xFJKIcAtRHgIS)&QJkVn2)`lzpaMAXO7 zIHt>zX1>3oj^1ufn0&z(@^x8jH)uLhOeU{6dZ|(4Ioz&zLuu`9M?~4&ip}O(XGNB$j?Av*&|s{UrK}}ema&B*WEpOznNdR7 zh9<*cNMekcA;yqpcs}m?`|t0%et$jJb6w9f|IC?l&Ybi9ywCfb^LoABpJz8MP56$8 z9sz+se5Tj0-U5Nxet3q}iNu%w*5%Kxi!A`?Kym zci3~|&-(H>KF*Z_zHU9vmO6W#hwENIC=n4*l zq=eY`Kv(`6&gZFidg97I0Q&dmL4Eq=H}v7sJdWEY1|0D>In~c)=Bh5F#P<}vAmyw7 z8%iocEiY6&In}*0ID5nX`e(Fso{EQQk!MO(;(lqJOF5WtPYeZ$e*4G?DdD!fx!KlW z7Qf(Y_|J$vDrFj!1heh|!C{d>na9D$jPKSjKIzF1+x;r;WvK2M)>5jX_sClAy-c(; zyXfhsN3L3T|0w)x`1#MxP5UdVW^dSrxqZK=-qky@l?38t7yX%*m338(^K_~7NN2jk zw^OP>*MRt`*G?Q+e+>)LD=4PwMq2Em-(uvhnfiP&G4N!EuRN71R^j1P2XPx4%!z$1 zVsYFT9L_&{`h?rle|;5wzTnsM%=jKo!Ky!&|LGSsqMUr6Q~mXsYpY1Wn@8HX?^+&s z)soz%TCi|g=1i%yV;AV*IcljydZbjTN+j~Zz*Ss68@nie!D{y0DGMd8&w!C*{fmKF z*p>69%%t5-@(vhh*$@?PIlPXJ8FpahBhfEw(aU7U|s=TuJ+ zZHl~cTU3>$31f>7$o^ZVLRwJ47bN)48gc&*DJ-7<%7~^N`;FGxP1>9pKg3%tcLW#w zM2h>d`}@1oIpi&W54eAaZ6v!cb$*_850x&{>T=Yn{w=T^CJ*l~wkFNfSJ3MDLME`k=auoBX~C|NFd zr0f3FU5xO`V`nmBYxAfsI5T{6fC-mCE$z3vHgs@ZEAh;5vDBw&p3RtR?BBX&F`eiD zj(zz%U13p~w_&W7^>i75aaQyzDB!ZM9i3Yh{H7w&yUL2iF?3T-OP`&MIhGX_`Fh@1-bP<#(Z4Uz?j9?xHNrkF{1FSeEnAzsmK8 zU}p;V35qYt?OW$k=l=d$T1to2?n(T~_j(mO?C=adiy~Q;Py^eXnjdZMpgZ=;<-Vya zqA}5=?wHl#b_%=K*_NIXQ)AH*l3BSbM^6HM>G)wdlF}BW9Bs!HVH;k$FZPo--R!mqLqWiqKCjjS`6iffX2J`yqc63Op0^_r!rQrXMJ`k zCEaXiY(?vp6yrCVD`8!O{JdTFn~96{Vo}HqFn`zmwn>+Uu^m>dc5zX#=>BHCgO+I) zo?;UNr|T>hu|7X|=jL+KeatRs0QPpbZLM37^P_k3NREyUaoUqUotT&GCX$rgRR)_! zo+8EIa3XB1x)@`+F`H>(f8zB*I(X5#VB7^*_Bhs(FOMwcfb zu0q5TGs#yJUZ|nKK7sFLMd*e-xtLP!lcPJyGkOvpsp>jth(g}kS)Zg=iM5VCrPZ!Y zMDMfOh_hGk^~SemmiSnO4=EG{(J*8m+QA-sSf?eq9b$A;T#wfL5rx^+5w=k_m0UWLa~S&9 zIJ!mwCwm>RRJt0v8RZSpr>3RT4f<&K12Cz46W z*x}fjNm;?|Wq(qe`+~cZyl{!4(Pn0`rEDm^IR;Ud-PaTdJX_a=1e@tkPC>BHt6z7U zUQmFQH}h%PbKts3PYW+VOqDVNUg^2v`$y{IDtc?o|6Hh~HPe)N2a|{2IhWkKPK|F> ztA{`7`Aus(gJZB_gG(asIe5oTR)$nl-v*2XHwoy+^>#ZIODkg`LKplqJv4=j zG^|s{RQ0KM0>`i;p0<{nVL=f1PjGXZA9GS#PdI8a97S5B(4Lkr!qJ2c=)-qYdrk#= z@vRNo80N7(`!)d{tITBdE6%V`&h`CqlBh$jZKkK%;%QtcF4+*byx`Ee*L7vcjmP(e zJle)9?%Ox@OOmqHet~^>wR&XzRs|wvZ)dP-f=OMe^O?z3(s?{#3vFnfc&{uRN5mh8 z`AAA5D3NqG(?!9;G$nB^`l4wxa*XM?n^6TlISK;6IbjOpb>M0yYMXvBsdVVXfihxiOz)BgnQbk;*%fD=5D zIq~*NQ3ZOdFKFg6e?fd~#~pejG}DtR2F*XuC-mC;_=osQ$gN5%SrXlBQX6}18MdJ>`8k}n}W3bJZID7~8 z=x9)wKf%9HinE0axRc_pk81dfBOHQxt4-%iY8mr}Q#WjfxR5XppM{y_UMprZYuRQs zDNaC(LDa#~&z>t7;Bwi?AykIUdCk=Opnw6DOxARDY`A>|6psm<&)9tzmr^(DyE=qOMk9c+6WnM?!?45 z#&`J45pD5W8O$gfmaS4w36AW;WsoI<(DAjAT=~R=LrQSS%B7v~zct1`0c_K|7g-g& zI9!psZt!%3tLRzXQe~6;!$DHA$E!&rS`_54w*Z>^ap^3}1Z@NLW^nJrsqGRohgeJA zXRj=P^8ewc<*6M1ySUl^aq|CfJ>t!N_N}~rFPbU{R1XwQv(j7+gF1~*avds_%NKuW!iU>7ymPvCSuc}(L`{NZ6Wo)JRoh-Ly%tR69{bDM+m zv+#nE=SXfq-|>(1e`W^?zL*U++B=O-PzC|Bs>+wsv;V zC+J7|*?+|)gDAIApn2-vzs)122(o7$Xn=4(ZWJYVgk>biX(;%CDO71Al2mf>ZGWFr z;F#{ONQ`4$UlZ@+A8_{G)0+p>08P`fM{Q|yT&KC)}F(^6kHXYU^i%7^GW9~DI^=B4gQr<7Y2odxA9vct{2 z9O}mcSfS#*W7LOJ@aYgOaRL>&{1X6*o_SBoVuJRQG|ZK_*wS-$b%! zo$lPeEhjk*#d`q_<-3}~6h&j>lsA`q5^XP;;)*LWJ*wT`)IWbqC=t9aoa7d_bX)MvLp8w#kFu zjKKWj=_rR>;-NyckH%$Qqo}-v$XH!46IYEl4KG{dVt%2@rK~66QIBgV=b8eRx@Z8A zk}dqH1$07M1!@f}6XzS`QoxxeR1etR0Z|3FwLGITm)s(m=Ph7An$ahd%IXQaz@><& z+x?d~%_G65pDF5^tSlzI+raNcPPm8zJFVS$f_@VKg8lPN^8GNX+W`l`Y}jvWq{C{1 zW-FWuyomnDwT9@%J0DOJqyEgml@rFRc1T3f47AO!0OKUKP$Sxlr^nm9T>klmF_mV0 z8z78-69dC^F7~T3%0?aTqe#<`lX~FH1tHh-Ck|MP3V9;0zx(_T1u}#97O#7UIijG@ z|81{ogeBlT-#ce5>uD`CNhd(ZwS$BH+(9qrn)^!7}~O5wkdmuc6}Cs0NU%cM=1eRP7*H2{CoWVd`#QTNF8uVJE zUI|`3hI-9pr=_&jJI3CUfwqSz02nSz`&B@iL+&eK?Q`_anURxxg`J~Xi0DZNG0Y*- z7385H0W6vX#kr2{4TJf)cI@|rTOj9V;b=W4EP6cIahTNh9T!{fbE8&QXE-ASr%ktD zw3I@02=d31JQ#f=q}t5DCx(4h!bvNQ6s(`IRd$4=u zB_<=Xx>@vWX_s=KYMZ4)E{=Tyj9{u7eo|JS6BM-@kN#?f)8C{h*qTv@MfBw#<#II3 zUx2*PE>Kw$X`mJ*iSWxBX}0pYG~$GI$_#*hlssJmp13rSyX2RNC?>r2>u^@oe{ebb z(SzT=Hy=hDY1ckGyzV4P6OPm9cKtRZ$_k5*h2Kb5=4B>gsLT#xV2y;%ws&q)ZB4FC zs(#)ftj{UdS<1U}qQi9dmdHS2thEs3Ff#HpCJxsHcAmvP`QVu- z(*N9uxVxouS6kry@pGq!mu5bmKxDVXF$vGLqF9K49FD64)om?uM`EylnuGjQvWM%5 zynj7V56t9Piadh*oBqz?QYk%ZdSfRhNNo_o|4Cn}tq-c9jW-jSq_=uXwvh7HXwmx> zPL4v|cN_22*-g?n9I_@F#@|~_fh#?&D*W}ee%aj4f8;NW(<>egmWH3&5=*lArhIzt#GOLTPtvM>*UBbl$k`{i9NR#HrQd+Nx8ZF;D&^U$OP%H z+R?tPK2!YnjIkt+@nY<){3;3#hx_NOnWV#zj+C&4hQ=QX`un1&B17}=rq?rZD<=rF z&no`GG4<%3DU28Km6B;FxKWnn_n>xj1sm=tHcCwF2z*nPKMGZ+EaG@ zz)5A0!VT2LF@(jh1h$CjDJ7LoON9SXN0e)WWrj_ISuu`0aXJ36)Em9!q9J?oVxw3- zpoZ+A?*p({G;uUGP0?wox`9(WpdKa|tWmfSn(kkXrw}Df;lD1;mCDll)!_MqB`|}F zmGxuPt>}7)1L6FS_MV4Y;=mo`b0;4V{NnSTt>u#Qr zgdgd1e_$wd;ZOkrYZF`w(-H@6pobmSAX|MhBQpL}+~J$Km8Xu8OY9ekcov`b&V{Mu zWoyO$Z{Jtk-u35h6ZsfY+BTDPYaalH7hM%Dk ze^frhA6dhCISYu0nD(j${up;a#$LCwk_lSSbCDN@Pa&2^h8VgQw^3fCd)p3Q))Ud< zM*MECaK=}j-pZX1X%GC?KQRCC?U_>jWIf;LtAd<}%T>q&DfA*m_o3S*Dfo}{%0uay z{Y~a>0^j-kAva}Ak16sF^=zt_bMgCbm##iQYG!y^VqVL_|AZdu&;lLgr~s@na~#rl z_}DOLTV*Z{9Dx6iIz3$Ipiyozbp|KH{L81_>G6k^tE4^Q zS4Q3e=0oN?R~((bGQSp0ZB|2uxr3rM+0y*S=ru?9c%n=PMQS`p3OMAZMVMC36bJYd$(3GW&;3FF}$2e@KELI#s^EN0BW;fGxe@ zJqZfP>#GssD8aOMaw!MMt9v|A{fdF-Uh8B~L6zBCR%{7*Ykb~a9T3Afq;L$=d+KcT zKE?<6{>EB^U~}z@mHf#@LdJ81Gj`TOkqF$*QF(6mP>}iQihVIu{53#iqR$x$CU}S> zc_=mf6Y1Yqh;-Q8OI;32?G+g60d-X_<#fL)NsIfjRK^^JpO&|#YlZ*ba-&?%A5(En z9wp&|@G~hixmR$_pkXZFAcX;_R3v=>+Pw*SCb!`|>rU`(^~teAH=b~+3&tYcEz0uNx*cJ}p0 zn^61NMXzwpXR!6p?AjTg)nw`ZCMLX20048OB8z4YTqBfq0 zON=9875Z=O6LjxlJQ1UyOrFZ-s?6jGj`Jzy1kaT9=V?vy%=X>pCl0J2L+bn>HN$q} zcY@FQFAhi6q?EqI!Ie+@@4&?e4b z<-KD(*t~w`<(HGz=kkU+sI4;(y&Yif&P4)OM3PXXp$v*Hj$SLVol>&5H9x;~6!Up|V4CaoB5G&4kBbXWYOq z6bKbcIr;ks!tAsU7?5eUC)&U-Uypg`j#XqYe80ZcvQ-&cP^C>NaBCoFs??fAwacZj zVjHrx!I=PS(Dyyu71TD_BtIj%GZjp{@+Hs&CtXTcfoyn`378$|J#CYNx|m72aBAWZ zffc*ImQddfALyh@aRb;lvKo*W0mt!)lU(W>o=|J2;jbcp^*{H1IRwAB?!^=H{KM!g z_iJ`qUC$p1uWarJ@YOHgX%%NbSmq#2@0?qah{B_NX6K_KiXf6^mmUMDs-fXLw73Gn zGcQa_yr}t$jOjYt;4go4zJ+#epL8QJu%Or3A@`hkEq1i}x1^}^NM)ekYcC+$93AMy z3sHhC5O76DD!m^LpejYDwmX>;gi%5tB}}#Y)gn}b@@@}oIq&9I;HsDh0P)xQW3PWT zV-j(IS+`mZEUz6OhCH476Q)f>eN&H0E&sE%wW`}Dcf`s77>HCJY^PV6eQV=n+Nre0 znU%umio&B$aKg$Z{E(l`p^f|a%D_Js!9u;WN;@BygcJrFy0#~UfG0ty!np{V$|j#; zu_btywFlzVAI%L`VJhaKWt&aOo6FCCXBON!s%?6V@eoZ61pJ)QJ-518G@az(yV10- zTDlMMZ3HufE1E3YUNbLI}A#d zzLZh%i)eSIU8|?4Dy9HXb#Y~v6^p$iZ+@}jYy16F<~Vw^cGSP!892M@ zd_+ucY_XAH54H99)RS+LvU>d<8Zv!fz?NEt7KI zl{3%Xkq)GknUX3GewyzGrQj*+b_3lH0%tz>e{1iqNs^C}|Acq2s60eEs%G8U9GMGI zSZpKQ-VsuhT<=e;epr&)Dcqt_2W#<$jmdT$!vA>Q<7c84v09kpb-66euBDVOrt+fc zu~&H?h7B09(lM|0oN#b&_btjhZr_Tn=Q`#i(6-dM{IDMPG0P~!lU$fXl(etX h|8w3_db7{P;+NAw7G1axyrTs&HMYE3f5rXre*unhs*C^t diff --git a/tests/snapshots/flex/test_sign_tx_confirm/00004.png b/tests/snapshots/flex/test_sign_tx_confirm/00004.png index 295f8f713e06a7a75774601ad62dc89a632ebca7..ed74cf147c87b585c57c686281fbdc6be7510914 100644 GIT binary patch literal 11236 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 GFa8(v^YEkq literal 11323 zcmeHtc{r49+$fPHYmt3P36&6ICtGL|UTV@PgcxI+vW$HwqAUqD)pExtnCp4&=e~dUZ@Yi%{o*e(V~!I-C+O(t zIKbDhS<=zbPtegFyUTJ67*TG?F{Y!FJqEs}ciTUMGDdk*TszY8c-FRn9?5$57&`2{ z!ubcR)=zI8Lua4YWwk!``po(5(8pt%mo#-5uQm8IX7R%)Q!Ct=sAleO1Cx)g6G3!z zGStvAIXb#*VR{a_8z;NzvU&eYANqb{Gm6v_LzpGy&-2_^yU7Tmi;I*j4@Gmex*Zb= zI~!7?CFy|)=sIjfSn_n!*_L5Ccr5!uXlEQ? zzVjyiysT}b1OPiASeNKM;wGHS>O!Zq{V|_hmF#|op5uXv_?-|w`B51FNW;~}9obA= z>hIYPH=qD6EG~3@wAP?-5BZvV*L4}fEP-$HDDVbU3wH{j;^>`D#!#0bWzMP+@m#vv z3qTKg`zw;&LBZcVsn|=Zlj7*OV7y1L?H|QQ) z->4NbnY>_UE*IuM9HI|k6{IE>KSJ5;&-1@{^j5gA({Jdna`bpT@nQ7{1zBgsKOHdV z%sip}_hXTk$J~s#g17%3>Td-971Mux5TLY`%@Swf1_?(v{|7D2->%$Z&7zebJ0?W; z+TpVW9b$H?elQ)N;|0q8QcIFu^FRFfL;sRhrI%Js$hkAw^tzV;R7ByIqh`%P2oOb=2A%PQ~QAOQ$|zDX$8u1*~gMrw$zKWZ(Jky%{y;h zK)YV4cDZQJivW~~ktvGS5DjKvZj_?n2d#Wl){Q@NK>H!fp!LFqYrnNo@Pi750RZAX zDEL7#pOPqZlYEBdAjp@VZjWzMyJ?rb?Qzq|FtfCT+M{fk9_kM&OoY$S;}=Knf7vMpox`&TA+T!HII56)(< zs^1(-y#cz)@NZTvj%yO+*4_Su3t;@eXx9{vkBSR0=4bq8Y+Ov)DHzb-tk}iod*=Wh zxo}KqIZi|IssMc)m+{l7kUy3(PSuDakQEo!Og`7Lnh)^nuU|MTemY!Vl3S%;=~7?= z9&+k|n(J?UjT`XK)tDDPeOf#+thuA!aHYXeVztO6y!jG%Z+_894>UDXs5iC2YxMTp z*-8Gh*>9f~>)wV4>^U=nDn8qm2_;$>2-4~48YJ`2<|ZOozMRQ^i#M@Mbcxhw1c3s* zoX|dzW{jZqKz+~N_w-#XE`^)j>yl}2Md&#wV!XNUl-AE>uQE9!o}a<2@*QCs9oCF^ z=e^GLMNfB1o4aWH**}BwhHpf6PImh{Bfj0GnA{y37U{~s&?oplJn)Fsan%EYE$r*D0EedgA6KA>g;!m;~cg4RsAJm~RB=PwX&Y?r_ds)1B%Xy(OA|F>VXk!K1VHN_cFu zutfG-i@GlR<_8q^Kx_4EZu&UYmFKSV5cr(2u0dVP`3r&^GXTks*20-9pzMYdz#I;G zj=W50L*7LW%+B* zSIpgwJ3h%)FPf%Cr+dM*dv23Tb*y~~SY8G8<<#=Mj^IQmXj*6BVyWzC_^GA+1tK_faxCOT0PoH#uzA75L#wcGH% z0-mP8?lfMr;~YEYyDbB3A8qbabHCH#<&^*8V%-?NvvGtH`Tji1(@n+#Vp~#tdRM;p zr-00Kcyx{$#ta{eUpKVyPXvKa5zu^wlNapKPMIF�o_78J0CIT#auC@#eViwj|?v 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 AL;wH) literal 9020 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 diff --git a/tests/snapshots/flex/test_sign_tx_transfer/00004.png b/tests/snapshots/flex/test_sign_tx_transfer/00004.png index 295f8f713e06a7a75774601ad62dc89a632ebca7..ed74cf147c87b585c57c686281fbdc6be7510914 100644 GIT binary patch literal 11236 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 GFa8(v^YEkq literal 11323 zcmeHtc{r49+$fPHYmt3P36&6ICtGL|UTV@PgcxI+vW$HwqAUqD)pExtnCp4&=e~dUZ@Yi%{o*e(V~!I-C+O(t zIKbDhS<=zbPtegFyUTJ67*TG?F{Y!FJqEs}ciTUMGDdk*TszY8c-FRn9?5$57&`2{ z!ubcR)=zI8Lua4YWwk!``po(5(8pt%mo#-5uQm8IX7R%)Q!Ct=sAleO1Cx)g6G3!z zGStvAIXb#*VR{a_8z;NzvU&eYANqb{Gm6v_LzpGy&-2_^yU7Tmi;I*j4@Gmex*Zb= zI~!7?CFy|)=sIjfSn_n!*_L5Ccr5!uXlEQ? zzVjyiysT}b1OPiASeNKM;wGHS>O!Zq{V|_hmF#|op5uXv_?-|w`B51FNW;~}9obA= z>hIYPH=qD6EG~3@wAP?-5BZvV*L4}fEP-$HDDVbU3wH{j;^>`D#!#0bWzMP+@m#vv z3qTKg`zw;&LBZcVsn|=Zlj7*OV7y1L?H|QQ) z->4NbnY>_UE*IuM9HI|k6{IE>KSJ5;&-1@{^j5gA({Jdna`bpT@nQ7{1zBgsKOHdV z%sip}_hXTk$J~s#g17%3>Td-971Mux5TLY`%@Swf1_?(v{|7D2->%$Z&7zebJ0?W; z+TpVW9b$H?elQ)N;|0q8QcIFu^FRFfL;sRhrI%Js$hkAw^tzV;R7ByIqh`%P2oOb=2A%PQ~QAOQ$|zDX$8u1*~gMrw$zKWZ(Jky%{y;h zK)YV4cDZQJivW~~ktvGS5DjKvZj_?n2d#Wl){Q@NK>H!fp!LFqYrnNo@Pi750RZAX zDEL7#pOPqZlYEBdAjp@VZjWzMyJ?rb?Qzq|FtfCT+M{fk9_kM&OoY$S;}=Knf7vMpox`&TA+T!HII56)(< zs^1(-y#cz)@NZTvj%yO+*4_Su3t;@eXx9{vkBSR0=4bq8Y+Ov)DHzb-tk}iod*=Wh zxo}KqIZi|IssMc)m+{l7kUy3(PSuDakQEo!Og`7Lnh)^nuU|MTemY!Vl3S%;=~7?= z9&+k|n(J?UjT`XK)tDDPeOf#+thuA!aHYXeVztO6y!jG%Z+_894>UDXs5iC2YxMTp z*-8Gh*>9f~>)wV4>^U=nDn8qm2_;$>2-4~48YJ`2<|ZOozMRQ^i#M@Mbcxhw1c3s* zoX|dzW{jZqKz+~N_w-#XE`^)j>yl}2Md&#wV!XNUl-AE>uQE9!o}a<2@*QCs9oCF^ z=e^GLMNfB1o4aWH**}BwhHpf6PImh{Bfj0GnA{y37U{~s&?oplJn)Fsan%EYE$r*D0EedgA6KA>g;!m;~cg4RsAJm~RB=PwX&Y?r_ds)1B%Xy(OA|F>VXk!K1VHN_cFu zutfG-i@GlR<_8q^Kx_4EZu&UYmFKSV5cr(2u0dVP`3r&^GXTks*20-9pzMYdz#I;G zj=W50L*7LW%+B* zSIpgwJ3h%)FPf%Cr+dM*dv23Tb*y~~SY8G8<<#=Mj^IQmXj*6BVyWzC_^GA+1tK_faxCOT0PoH#uzA75L#wcGH% z0-mP8?lfMr;~YEYyDbB3A8qbabHCH#<&^*8V%-?NvvGtH`Tji1(@n+#Vp~#tdRM;p zr-00Kcyx{$#ta{eUpKVyPXvKa5zu^wlNapKPMIF�o_78J0CIT#auC@#eViwj|?v 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 Date: Mon, 24 Feb 2025 17:25:19 +0100 Subject: [PATCH 61/67] test: update Stax device test snapshots Update golden snapshots for Stax device UI tests, covering various scenarios including address wallet, public key, message signing, and transaction signing flows --- .../00000.png | Bin 8224 -> 8138 bytes .../00003.png | Bin 9993 -> 9910 bytes .../00000.png | Bin 8224 -> 8138 bytes .../00003.png | Bin 9993 -> 9910 bytes .../00000.png | Bin 8394 -> 8308 bytes .../00002.png | Bin 7213 -> 7131 bytes .../00000.png | Bin 8394 -> 8308 bytes .../stax/test_sign_message/00000.png | Bin 8003 -> 7916 bytes .../stax/test_sign_message/00002.png | Bin 8634 -> 8544 bytes .../stax/test_sign_message/00004.png | Bin 9993 -> 9910 bytes .../stax/test_sign_tx_burn_usdt/00000.png | Bin 8441 -> 8356 bytes .../stax/test_sign_tx_burn_usdt/00002.png | Bin 9030 -> 8941 bytes .../stax/test_sign_tx_burn_usdt/00004.png | Bin 9993 -> 9910 bytes .../stax/test_sign_tx_confirm/00000.png | Bin 8441 -> 8356 bytes .../stax/test_sign_tx_confirm/00002.png | Bin 9030 -> 8941 bytes .../stax/test_sign_tx_confirm/00004.png | Bin 9993 -> 9910 bytes .../stax/test_sign_tx_transfer/00000.png | Bin 8441 -> 8356 bytes .../stax/test_sign_tx_transfer/00002.png | Bin 9030 -> 8941 bytes .../stax/test_sign_tx_transfer/00004.png | Bin 9993 -> 9910 bytes 19 files changed, 0 insertions(+), 0 deletions(-) diff --git a/tests/snapshots/stax/test_get_address_wallet_v3_confirm_accepted/00000.png b/tests/snapshots/stax/test_get_address_wallet_v3_confirm_accepted/00000.png index acbe30c946027f56523dd21eab7144b2532fa27c..a736b6770125f9b2ac8a4ec4aa18190863efae84 100644 GIT binary patch literal 8138 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:kT4J|#CZ|cjNx1QhS^9gMteICE1EJ;%bR0M5pZ70lz zJ0LeXfn7R6sUuiJC$wtyBnS)Ow5h2nN^m;}1VXFV6jR+;X4nV^Bml0EMPk%zL#SCc zgyX>3I<2L!r}O-QU`tm-a^>}IDyMv@ySsZa$pP<~**THqV3ywCYYNOC{{U-T|1Den z-I>w5oz~T8UNgNVc#Pw9ix3=p+?z|CxtOdMpr78e403;j+ai|@d-tm5^8dd{^%ZNncUka5& z4UH^^*tYkr-?JwuN9~8f8voX@pmQRr}q2wW?op> zyw2zu{ut`~f>jnk;o2j++oE_4_W*fvrSYfnaj+4#H?3s}oBFYax>mJ~Rd^U}qO4OT z1CDK*N^yemnjwo;Z1Lc*CEhHxdj$P}J$ws{M=#yYv)TFX^x^UN>$kvuap)_!jt>}g|0-xzOAqICB*t+8FsVCiY~Z1pe6fPk|ij}iLZ z_AH$~xZr9qXyuW78X(lMt*T^uzoCi!6@d1*ty3XV42tJyNK>-4`svvUQezNp~P zXTJKQ*`=Pu@JxpwKOgAOEnD{{k_2pU_B@cnWaIN3EAfwlNNc0rb}R7v4@HTKxtc@G zQ5(7P!pL{!`ws`7PZFvCGUa$Vae!-;4{lm3-FMe!CyaK^Dh;fa*~#oL@gyp*wa2@S zwpdj52_7Ux&e2Wj}+ivKU>?`y10gg;4bzlpB#aXbsotAG)o3;kY{ zmaFjhBI*2%4YfTcRoLWYXns5xFTv1`7`~q~eF;R+M`PyVjI%$Ts|obtCp&ji{BmE* zSVbiXyt^p#a6a!~Z6hqOwY1gaxFz;twC!SEK|d%*^RF#tlp9 z+i9~WZs#b0xg8-7;EVB>Zh-$qFuTD<&Z>TT=Ih|-Se18{B|MewD#zaO-h@0WGS66* zwZW-_1t#LrH?rl%TyL&=+G|w|ydcd}YcS$V*8~Jsp?Jo`OM}d`-cbn<-2BmH&s>v%7y&~r>x8nVWWgz!F+PCvVIMh z^^jb+{DoKdm-1jB>6k&jKd=)r`KtFmQ{rzO->}Aqm2c2hjFJwz} sjbshPw$$Cb_1^{pK5g`J^Rr{Z-%_-Ee$N8_qt|f#(eo_%Ovvs30QNVvv;Y7A literal 8224 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 diff --git a/tests/snapshots/stax/test_get_address_wallet_v3_confirm_accepted/00003.png b/tests/snapshots/stax/test_get_address_wallet_v3_confirm_accepted/00003.png index 00975a1033f0e710869c2481456550a30b4c9df9..f0e072df64b88159733a333905b6e3a28bd7ee82 100644 GIT binary patch literal 9910 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 BP&WVo literal 9993 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 ZTlNQYp_T3oeB#DpWMF=+@`_9J{{n6Fk{kd4 diff --git a/tests/snapshots/stax/test_get_address_wallet_v3_confirm_refused/00000.png b/tests/snapshots/stax/test_get_address_wallet_v3_confirm_refused/00000.png index acbe30c946027f56523dd21eab7144b2532fa27c..a736b6770125f9b2ac8a4ec4aa18190863efae84 100644 GIT binary patch literal 8138 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:kT4J|#CZ|cjNx1QhS^9gMteICE1EJ;%bR0M5pZ70lz zJ0LeXfn7R6sUuiJC$wtyBnS)Ow5h2nN^m;}1VXFV6jR+;X4nV^Bml0EMPk%zL#SCc zgyX>3I<2L!r}O-QU`tm-a^>}IDyMv@ySsZa$pP<~**THqV3ywCYYNOC{{U-T|1Den z-I>w5oz~T8UNgNVc#Pw9ix3=p+?z|CxtOdMpr78e403;j+ai|@d-tm5^8dd{^%ZNncUka5& z4UH^^*tYkr-?JwuN9~8f8voX@pmQRr}q2wW?op> zyw2zu{ut`~f>jnk;o2j++oE_4_W*fvrSYfnaj+4#H?3s}oBFYax>mJ~Rd^U}qO4OT z1CDK*N^yemnjwo;Z1Lc*CEhHxdj$P}J$ws{M=#yYv)TFX^x^UN>$kvuap)_!jt>}g|0-xzOAqICB*t+8FsVCiY~Z1pe6fPk|ij}iLZ z_AH$~xZr9qXyuW78X(lMt*T^uzoCi!6@d1*ty3XV42tJyNK>-4`svvUQezNp~P zXTJKQ*`=Pu@JxpwKOgAOEnD{{k_2pU_B@cnWaIN3EAfwlNNc0rb}R7v4@HTKxtc@G zQ5(7P!pL{!`ws`7PZFvCGUa$Vae!-;4{lm3-FMe!CyaK^Dh;fa*~#oL@gyp*wa2@S zwpdj52_7Ux&e2Wj}+ivKU>?`y10gg;4bzlpB#aXbsotAG)o3;kY{ zmaFjhBI*2%4YfTcRoLWYXns5xFTv1`7`~q~eF;R+M`PyVjI%$Ts|obtCp&ji{BmE* zSVbiXyt^p#a6a!~Z6hqOwY1gaxFz;twC!SEK|d%*^RF#tlp9 z+i9~WZs#b0xg8-7;EVB>Zh-$qFuTD<&Z>TT=Ih|-Se18{B|MewD#zaO-h@0WGS66* zwZW-_1t#LrH?rl%TyL&=+G|w|ydcd}YcS$V*8~Jsp?Jo`OM}d`-cbn<-2BmH&s>v%7y&~r>x8nVWWgz!F+PCvVIMh z^^jb+{DoKdm-1jB>6k&jKd=)r`KtFmQ{rzO->}Aqm2c2hjFJwz} sjbshPw$$Cb_1^{pK5g`J^Rr{Z-%_-Ee$N8_qt|f#(eo_%Ovvs30QNVvv;Y7A literal 8224 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 diff --git a/tests/snapshots/stax/test_get_address_wallet_v3_confirm_refused/00003.png b/tests/snapshots/stax/test_get_address_wallet_v3_confirm_refused/00003.png index 00975a1033f0e710869c2481456550a30b4c9df9..f0e072df64b88159733a333905b6e3a28bd7ee82 100644 GIT binary patch literal 9910 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 BP&WVo literal 9993 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 ZTlNQYp_T3oeB#DpWMF=+@`_9J{{n6Fk{kd4 diff --git a/tests/snapshots/stax/test_get_public_key_confirm_accepted/00000.png b/tests/snapshots/stax/test_get_public_key_confirm_accepted/00000.png index 915fc728c32f9febd5831f060f359ae85df54595..5bd92dd4f9516aa551752bdbaf20c9799dd11181 100644 GIT binary patch literal 8308 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 bnR-NmTVMVj83z2DV1tu`+gZ|Y!FT=(x__Sn literal 8394 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⪙2c> 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 vz|zWeJ)>C( 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 y{M6w=_mn*N6Y^WhaXh3@7L?K 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 z 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 bnR-NmTVMVj83z2DV1tu`+gZ|Y!FT=(x__Sn literal 8394 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⪙2c> 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 BGMxYb diff --git a/tests/snapshots/stax/test_sign_message/00002.png b/tests/snapshots/stax/test_sign_message/00002.png index bfd07c9a5130c6c0d27ae430e89f1b5c878a44f3..9dadee788da58c0d9baaa951a880525bbe502a00 100644 GIT binary patch literal 8544 zcmeHtXH*m2+BOO*0s>~6iqh!S8!=5=Wigoww`XaHR=BjYIc2W+N=JiDa zukQN&T=LU&Iz8eQoe z2izB3srh?AjV48(mn(m}=l_Syu;h2clX}BapqWzf50@^w=mvox%UvL_4TH?e!xt(w z=Q=iHIv8BRDcKO?5=NNGC(T>l(~kMDpyEMGDegBUo)OmH7_#|SW+idz-r)<={PsF) zE35fruX?JU6w~73WP$Hv3^As|Q>UP;SpxM0jh=~WV}vPVGkgOjXEv0(sxcQwueq?Z z4eiN2kD!)sw*Soe$l-KEAdXz>f4)u1JBOBT#4OhGs|mh=tXPy4+q1r z!3`5TF5QLnY?`X%@tGXAZKq^Ok@+ybwd2d7vxh{xj`^l~MrTg9hKKurNI}IhVN;DA z`^Xz_2Qy}oN#w*>*$Nb}$J>%i&J|e(FD>dnPU#22j*;At3QOPeJ z9)90gqnXKD3BjLt+DFqp=ZzUKIP3IgoHGcloDilB`*j>@XjuMHx-aL3upXM<_RuGP z&|{$hf%DpL6N&TEEy!}ujM+zLybdZJyAa`B_v6(Lm9JqjhQceC03V9TU~K4s*Xk_6 zXY{gtjEwMDmV2ZrsPEeoUDt)!n)UZF1P6{qtK_K*4-8c-)&|Px8X?)dsJ7NaK`!r; zZYfs}WDvWp(70=J8&ZZzqVs!O_J;4+oBq^-ry6%B)HXn^@6nHmSk9Cp%2%v9RTzY@ zae6}w+1@hwYg_+@G&ak>mC!EQJ(pdzj$g7wrV4M1KK!`if@LjmTEr8TQ|HBuEA=kl z=5o3HGoQ=9?NIr-zMhElYSLzVY-{oj{(HITf1f=*6BVQz4E=3hE%VfwjZ!{2RA2=- za#9wn+}E!1<_$QzR|4RPoYqFD`1QqJxX;ncC*C&ermGvV{=vE=#)?WSkr>a)RaR_ zKMs{eQ00{Fq< z4#ptJzKO}@*haK@VE+NWUqdT0S;i<$*h7coQw;Qsjrm0UmuYr%}70ALcKZ!O29{<9u_k zn(U}4xev-C)z{be@d$IC@gaXgMipVXoyVP;mg2lb4tz)x?k$@|&ThYtMn|U(o4Wo} zG}}wV%fM1$zdFT9$J9Z7YSI7Ov2-?7$(s`X*sIDhIve{bE#5YI% z-iaPgVL(g8#`KTT4Y2|klG>ujyzLu^MPTc%2Lfr=F_RuWeMO*M3&@Df?$xkF9+kZ`6=4dJ zCTf7&lXIryu;Vaj%Q%NVu6zhNsh)ES28FBmIa20JUS%+w3kL3W==A)sldY*L(V!`F z+!C4XotLK9eESndhEta;zh;V;?e9`3A1^D&Y7?l7cFa|3DwV$?{r+n4Zlylsnxjpc zNv5Dxyj)Om@pQ^UA{-HPOS^xB-E66HV;Q7&JcBruU==%vUAhTGt3_;4Q4uZov_d+3 zoUe49jlK*kfpYJ3=~R1>5HFt;Fj)k2f@* z03xs%?yQ>q2F!uoj{Yhzhe!IGDy?7H1~RYNV_qw~BRfFZ3Dku$_0pQ544;*+lnQH> zYUiQTanz%I$ENn7(W}6*y!_q5t%q@HFp^R}>B-xz%+Qz&%Rc|$E#q(k&WmB+bf`Wk zZRcVg@(!fuu6BW)V3IiaFkXoi>>ty49q;=%;voO@S+vs(B z9T};zK)VAEFjGF&+1tUA`As{jZ~vEy{Fj3LN2q5u;goEt!^^geEh51NloBt;te^024>bM9;CVu0VBA+r;C2 z(dHF2Y{+iylb?lGhLhxy8-W@6L(kFcnO4`be72mZa)bznXUXy;-z`e4+Q&v*J=dPC z39}c_HH!P2fng`hy|xCr{TxOl8R@R&zdE&ByX$H>^+RFYJu%6}`)6yj|H`jW^jZ9uBQBr5`Qt;J;IOQAm!$O*=RS9h+kb?Cl$G_u zUajfGhiCq11YHA3qhBBYsJeUbkDB1)U>ybAMtZ*ckFcOuqS_e;>rB|X^EZ=VV_&h` z|Bx*3%+luGOfZFP{opW?Q$~7){*Z8-sFz*&eIla(7PPV3#z`SvSMh-ikdl)KGAN%W z+I&n$TSltd@-}vAUxjtD*9xKfUE{p)hIB@1BC90Us)E8F1fb^;(ep!Jz`n&*GGO|- zVC*>V8rZ7UtA4>E3FkGdvKvpZT&{TFz)Ca7*(6h&euAyb98SsJ_WeHFW2cbrt1z~W zQt{^79cFr{E9C=kEe@=bXZ!HDH4G|GiUg6M`D9D^xQl*I^N!Sbt6z9fsmW5=wgwAc zT3_d^drscEmvBl&w$A&@_~|H0u%kTtIqSw4#ltBAmP zSz}D059mkYNk^5|7u&MnHA^U6+Ev}LKS^<)#39x~| zy@+Q;nz65tzwUGlSEOa?RUMpu?3QEC?+3}(>jcCG*&!M>Z9 z2N4P|4eVN==7Ft`6IaUt+|F;>Majn_{j8MvjyXs_Vn7&oe$rnUoSb?~hVtmB@@O@y zgiw9^hG%k85fv|yCy(^SzDzW!cmCUAMY#rGMg*In;&RGt|IC$rz3`?6 z0aT|T_5cp&Ry)5=M#$SlT2+v@zN1p9%K?(a#ROn`XP0hp z1BjnD3^F9g%C=WYX(CjOf=R^ z;^(hN4HfP$4$&j(t}3Xy?5svNYVBUw-#0T6CLr(9?EhRh_Ul02f({Dz!J?`+{RzS# zpGGo)hb({<4O(vfh{jhkUc5Utb#1KrMvh7|?|H+~Wr}jD9OHBB;al-fPBN|H1ay{u zNfKT7>%h6iZ%_A>P3RvtJ_v&*B_z~1SCgb0V=X?LwCMAm*XMByD_Vn|KoqrHmyVW{%CQPW{dIgiL)RaR@bckL0xRiT63h(dc;j}N*xJ0}EQYW25 zXJsae()*SUs0HiZxkD|6Gd%(dtLld(HAYB2ZOSP-a%Wq-f9fm8GK9Y@XA3Q(1vg1= ze%-Bnr72PJ6tBZHGOnmEO4V0Fe)eoRks#$fnNYBLu#pkQA&^4+rHLO~x=NGic!~u| zuJfiF8hyh3_3sGbMo>=_TeR>`J45qL_76=GtaIB)KeZiGVKR@=Xf)0Y-oY62-oU4# z$NKm4%WrsMDX9PmYs=bo76K{La;7-irP6Fh+dc;fRJKo>FQ|O)@X!$manK!xj#lt9 z3VMHq*N=QO%{H(fVuWF7A@n16rVLIGgl!BO{5_8dGgj{C9m9b>EFWSh+lCjO8Blu2 z8-4RD^5wzYX+~H9tcdn&LHZd_owHXYz5di(dBte#^LVDB4IlU2V#j2Gav{fhKr5ga z`x{16l+6iKoNBxw9-gRtw^Fm+s~({Ch*C~}KUnX$Xu8Rb<}9-Wq$2hr2WpF%2$-~A z)AzCFxyVwW&fsv`i?(y5sy;>*4{UUe7p6@0L>mNU4{?(DXxSX z3b?{*%ZEC-(=G?h%vj%Vld52oa-kryoNWcN#eqNP1~=l*P&P}}Q)(woa51N@9C9tZ zzkcP16EdTMQBzRQzlpneC$<_r$7Zvqr>EKMYM%5$?s*4z-@N!peT;e8fKw1@x*_uE zxAr;$9zU<|m$>P^3;fTH@SDk`=M5K^$BlGI3o6d6iRA%@ol?Tr*VDM-@^-F-vUup~ zBolc$#}4LHja|Jj2@NmS1jI(M&5ew^{A6#1HKDbF)g~e3t%7y9I#BbiX^z1o!hA*O z5wYJG$!l5Py>Y@^9jM*CGJzu<8n^x>+2@_ty=Jc$huXGm^9DL3RpPT{;{NrKYobS8 zQ}S*X8_itaDL?twUAR5?JTRr72e-EdqqfD7$Km7?7{U1y`7*tST~iAGX_`5M1{wwDi;uc*JpZ8Pnt~C)`muil{eyb}(?1j1 z*5)7CU{Wfc-7nE!|JiwYmzd;o!y7-t?EqN$_cRsym}=qUlgBjw8Y>p~nfc{UOGtd2dXxI5h!L~`0^xi&zW z{=sGg`k0}8lXiTrn&6)7V^cR=(_uHyKB(sOU~xKk)<%2KkWmLzBbK}gu>MUC0sKTymF6R?NnW< z39mSQ!;>qB=NUtht8ZFG1t}4-UWQCGg=pYxd;BR)E7b(zqmN zKQ6Ut7V&d}}a$?;- z;tZ#0oESJnE3*>N7u$U{R^6tlJF8U3iSY1z?`{c{+NwtGG{CC?K*51Pme#)%lIQY5 z$3UB-faJMAYyDKm**u*za%@?k((H0=K$nKI(-&1$7BEy-F2r$0Cqh|p7?f{`t<)Uw zsniVK9NxHMlztQErOa)hjm=EVMwk{_10Tip7cMB;e42^~B%CDz%LP|;zI(*w&O|k+ z&HyGY5+x1@$Cu-z=*TA8^IS6g>b^AG89=4(55t!DgzUAbpwO(Z;_G7VTtmyOKS3ag z2?>T+o5#YiL`Tz&1{hRFKC91?tb_7yeV9~;?RO>)lvu!*$n(q9=nwOq#=`n) z^cYvb-|IIbHQz+*z{Q6Qm4ur0^N!T8mx43qHXaoX3x5m4$1}eIilm+SERRO7MeMx( z&7V+~X3^w=*UV&uQ44PX;z)wk_zR4oJ!Q5@c$inrT8DVFtZr;rfu!NP`$E2h;Q6({ zR>wc{d>*CIrkTmNWSY0MT_Tju^!n~f{LuI&!=jL>!{bi>2#ir`w{-!swQ27DEE`!d zz$MRNeAoQ*NY5;R|RHQWeHxH+&V zPA~4u@G@y^8>4RrpzEpvJ~q`=ZtG8AN)DsRNr%HGUN#+Ixvy5)Py6>7>&7x7Q0t;z zy1t4rvGus#s^>WM_pCn9@aLqKA9>9PrVb7I{9>_Zqg9y$>*Px`TFKgHSIaw&b&;}n zv-k3?hV^3;+xlD7D2RtrO`IpZK?;bF#A`5iwbFek1n3Kpkq|YTehsp2?=B7*Uf6^9 z2#4l#ysOgjj)2a?5>Manu#EFB$?`lRb#$d_Sxy`AHf05CxoZ(9JKX0$Ghx;0pvf$Q zOd3lALbr3hb-Al%=h(y2=3-dP%41m3>X|&P6w+y5YX|Ep?gvWS4|{X>RStBG$E9%5D{yf;RiL@qK9l`AC!-5gDcaa{pF-82{QSU{E-tjX2tAwg&UjTD9(JqD7)>jX0}gq!@TmI_^#nQMr78#5%D5dO}hN z*C4)jYlUD>uF2xa1o(2?8p-dQOqsQJKXRp$`Oza~xhNpc+rC_Nykz-ub=M}OC!oez ztK$$CTgIGC?Q2)3Vn5D!tzDmxYpeii3o2FdoPd=hAx8_+Qsuu3<57TmU3`#;9y z;fgJqi|>c#S6nw&c>nOmqY6+>-|jtySsCMb>T??Pd$un7{-=H?SW{i~7J1&^nX?A` QIU#bv#^G$;X&==8050TwN&o-= literal 8634 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 diff --git a/tests/snapshots/stax/test_sign_message/00004.png b/tests/snapshots/stax/test_sign_message/00004.png index 00975a1033f0e710869c2481456550a30b4c9df9..f0e072df64b88159733a333905b6e3a28bd7ee82 100644 GIT binary patch literal 9910 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 BP&WVo literal 9993 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 ZTlNQYp_T3oeB#DpWMF=+@`_9J{{n6Fk{kd4 diff --git a/tests/snapshots/stax/test_sign_tx_burn_usdt/00000.png b/tests/snapshots/stax/test_sign_tx_burn_usdt/00000.png index 1223e88c36f2685fc2678b8f9323fa9b3ba39ea2..5c40f61f4ece2fb80c5d27a5785ecf4bbdddfbfe 100644 GIT binary patch literal 8356 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 diff --git a/tests/snapshots/stax/test_sign_tx_burn_usdt/00002.png b/tests/snapshots/stax/test_sign_tx_burn_usdt/00002.png index d47e1c90adeda271a7fb60fc3e5879e5a3ce5bed..06e0ce9b5fdac5cb442f38c6c8ec330c9c727b3f 100644 GIT binary patch literal 8941 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 diff --git a/tests/snapshots/stax/test_sign_tx_burn_usdt/00004.png b/tests/snapshots/stax/test_sign_tx_burn_usdt/00004.png index 00975a1033f0e710869c2481456550a30b4c9df9..f0e072df64b88159733a333905b6e3a28bd7ee82 100644 GIT binary patch literal 9910 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 BP&WVo literal 9993 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 ZTlNQYp_T3oeB#DpWMF=+@`_9J{{n6Fk{kd4 diff --git a/tests/snapshots/stax/test_sign_tx_confirm/00000.png b/tests/snapshots/stax/test_sign_tx_confirm/00000.png index 1223e88c36f2685fc2678b8f9323fa9b3ba39ea2..5c40f61f4ece2fb80c5d27a5785ecf4bbdddfbfe 100644 GIT binary patch literal 8356 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 diff --git a/tests/snapshots/stax/test_sign_tx_confirm/00002.png b/tests/snapshots/stax/test_sign_tx_confirm/00002.png index d47e1c90adeda271a7fb60fc3e5879e5a3ce5bed..06e0ce9b5fdac5cb442f38c6c8ec330c9c727b3f 100644 GIT binary patch literal 8941 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 diff --git a/tests/snapshots/stax/test_sign_tx_confirm/00004.png b/tests/snapshots/stax/test_sign_tx_confirm/00004.png index 00975a1033f0e710869c2481456550a30b4c9df9..f0e072df64b88159733a333905b6e3a28bd7ee82 100644 GIT binary patch literal 9910 zcmeHtXH-*Nw=QBVARtXZL_nlUL`0+)5s@NAKuSO7%XgmnWB~25v3Q(<4_D;5`bdn%Z z5YsWux0)zcX^=9ANkcP?6%j@4ir~y#s^-f%RiV>U&?M$_=#K0^k<&)g1G2zo(9vovRcv&3nJ-CHSCVvfAJ4Lu%iq+ zM%UiI5zww2UyVy)w?q-vbxY?UTnJkb*IOG~!`;Hf8#TM$S$$e|$6{1%)P0<;pGi9c zUu`-Kz9phuj^L4WGOpV%`pgx6LYz`i>hm=vgUcFd`X#8Kzo}vDF(2347t>raF2-sz*C8M}z+ zm(AotKwQW>_dbZgaI_l$5M0_?R?+g#z;NK$f(CZ-02pYP1lLwn{mC3DhJ60n_(2D| zr=&D+KeF}9TaqfXCh!1g#6@H#3FzuKc6Olx_dD2Ys-Lj^3E}gs5dAH^_J$N-hQEUaB$Eo1M@DvjC_6;ro!JmNt!AOV4**= z<7H;{?a|AUOThIE;XaS%oHkAjz^#B(!n_KGAobbz|3bL*3yZEx@JoopH@g43iLBG9 z&sr$(vG{V&G5ofv#IP71q<;PZPnU(;MT6Uax1s0b!Rt>exf`Jjf0`94SFJ8(t2Kw= zZ)iCQnD+%PTmH@Xq`MN!o^%9?ga1Ou^5xmmCmnM+cLA0-%Wn`>@v*|cNyvcw#lh

%d*`3U3rSSce55CZS*;kaD>LU?Td#lTn($EgidKXB=goh1WXjZ7mtf1B6L& zoQmxSn`Um~g#?k$wXCh2zGa#p^Za%!9piFg@aCrdOey;?lJ4Sa`Do5FYbr0{qQqV1 zGxvKs{dW)(>3MPYc!u@tj`g>THKlWzMWE;(xb~W_$35}p%|SB}@Ppe1=mypwVuQ{@(=Lv*6jaY;Gw?f99f&B$y-o1h-4%XCdUeE%5Jrc;u0`mHpgl@V>whBf6JEn+>F~PR4f? zyDUka@H%y~5?}4YJH%*pzvs4>0$;aua8FEjF{B3PY00K`E_`b;(w?VxW2%U*{k!ld z+V}NOFa7~H9l;Ap|Mmzp5QmCjvFBm8oP}H77i8+8?Cv8&0)+S@PdNb-QVxZ)ck z;!)i`$>v_HmX_i}jP4+=^w$ly#put(YFfQJ8y@L+sY?1esyiadoae5cy@ZbBl$M=6 z0M?EmQd)h85pfzk5Z4f)PJhN%s7jhKJaQa(Fc#IVq9dt)%g+8};kn{V$aRmxbE21# z>uP3Z$>sr|@W}1xg4Ye*mjjBGXI_WD$2`UcrnrQ3ZX9c zYB}R0_B?luWntdZY~eRc>cH|j@q|w};u}f#IubNUh5v=14tCQ^Vc-#;{+(3T=e)zn zbRpf8Ifhc3W1vx!T*H!zX#aH#97fsTO_SG>ID#!rKm)MJ5 z9FjHQiSp(vap8@!Ck*x1RhC~l9U&f5xZH{-qwCzVMGdfEbnbFu@B2-!QyQ$j-ke%4 z*({z9u(FPjY#B5dX8q9-Vk5;ZkyH81PBJ)d;%er{Ij;})qFTn8$LG{DmPs)MPbXwa zui0F(NBvci4YCF`xQe_Km+T2s>IqX$EgZ42rXgfeH>J?CxO%` z8lX=9%n(bD?v%vCRC5@hZFvXqN4TE(mLCcpwz*I{#rjFy(RA`-(h$(~!}t~b*3Kuj z&D~j!3dmv-SGxd!olCfX+qC}W&wZD#Cq1P)W;u@U23HgJ0y`$yzIRR-*!2bWNb6%8 z#A6D?4NFq>>nBMA?1e&3j1EFBc6}PG!n!^ReAPJOvR@r~{sB9wDz@OKpOS7`F2*^C zn9C9LzXlRhMpnPbJ^yVHH~!;>L=u4ZivD*V0%d%^Njzro#K{AH=2Sh>oewrOqU2Tg z+V>@S?Nm=v{qW0s&JmlD^SA5_X8xKkwMb^5<-ux2=|$%}-0rv5VdWsWhq)=bWrBoS zd3K)p4u%9J#y#SYGDJ4vh@2m)i9K`QA?&7q_!a~UB1Or6O}j7LpXhmR;v5H!(ppW9 zN+@Ggq-4+Xe0Y3nA_RsTfwAkgRo+rD@GdTL!zvKh+uhnU5(I zE>Cp$&R5FAyV57r-)B7$H|Nxn$#!|G!f{gRjU!xz{~KLxAEM5BT`tZKcO^!M!^A1A zcsFtCYtWNjj_Lu*Zu=xDceAW~B|s%KB&5o`;#ALPPPay@Dje}3lnlP#y|H1&RC7>- z?v-}6jL9<3bUBxe;yt|5h}q^Ud9({h5a3dmMBbCWoeOPwI7)0R(=qh0tinCRCd3wq zqhusA}^HNxaD$^)X%LX*CjtT{) z55FTmXB~Pee2sa+6?8X9D(F_3Y!=Bqx5;`v6f~NPV7G*xxU^m>gAWG z+}qduWZ~%7Cu7X7Ozn`pv|hyFnxsnZ`BPs;yF8j_y?^JDJfn2~jxEgpF^n7zK6>t* z(CdJeg^At6$};r`o~F`5SV53q2TA*V~R?~c?^Le~}xVF;~fEO@a4qJ8FXyS;vfqhpQ^#<_Y#Y;d0 zsKb*}g=^KBB2YJQaVnUcVul{+gn0rdrvS-ajLErJ6Jn?M(NBdxf5_`}4^lklm0lEn z;qP};OUugzPZ!$%NUFZRyz7b)30qWh<{OnYFf%(&=}#d=zYzRM^Hp;F(I%B~j}>Ih z>F?3lp_yHrEbwX@H62d^qZ)pl<(>&x7-PmLdv!OQjSrcfs6R`dp~i>`WX}mLzpXfn z_EzAF5Y$O2q%=d-Uz^@UQ`$ZCtPupN#v64Q!cj7&Tk+M9tbeQLlMa*6l9ZomUaOyu zue3s)j8YZ?JDPCkdc7av2CIov$JH(b)$bu=3Xm{2Ji(q2D8M6B{%Hsqg;*b zluqPIOqOWzL{ZIzU#Tjy&ObUr(#IN zabE{d^|omiQO#_-sn;=HTh1;h#)@&1Y>;xm?F8_)uqi(9l%TZpeF5 z*GU3Bl=Y>a44qZ;BcO29M}rCp@5Rf@_4f3{jNFv@6E%p26-j3u>78py{)*Pup$^KY z@^p^%*9Er&L$vi#X0F=g5Z3Zk$S;Mi;t6<>T&SdQOo6a&e;p8BbW=Wg=N2!I(I6QD zBZ-~<{-FrrzR<2~=pn;WV~%Dt2k7HQfSXujn!5ry3hv?dox>7#^m2#$Fxf#KJ`=8t zaL_)XhNh3*{D3)I*=JaSg|@xn6i5G}(Uea|s9+4ZQO^%Tj}8vpZ5x*K0_>v?R63X( z9Ptn7u!${5QrE-d@x-mbfa>2F93N1?%cj8kUJAvw#}t$X>EzFfbI3v8{_@{m`E_l-0eB~yvafy~*_dWqTl;XWK)!JQ z{HZ(Yd4@RRO{N~`saKjO@!VRMN@&xu_fLv9sb@^QGz}8CS=-aV(jD5P<$j^9R>SD( z@|xg~OQb;1swn1}QrDgw>43|!u$Rqpy1X0+GlRAz;xWN{cNUvT&oIkF{D*J+PHGts zd)$i89vdC6mnz)7A?=yZaAC4VC@WOZ>);GvPB|(yY3-_>SlLMu)GofJ9wnrjfLdw7 zljU>1In~#ySC;EZ#mzlT!t0Inh@*#gKQ)cJt*Qr_ne}OEDP1ssFWU6k8~o@Vi8SFR z2S9S$$zaTq!hC<8NUU(lmNm$`_{`SjFfwdm%m86=*QviL^TAcLPlpX=t7Gv5*D`}z zD4#jur|_G*_gZ)`y+1^otL5lQ$m6Dso)h`g^V zhg!zM&U5R>dF~plLfZR`WPU!JSpU+b`m5n2rn_s+h51k_1MS)vGd~tw?+HBvP7(WJ zKP|r-+%b7(jmN)H{qTNs$wFF3L+zR1!hHlW@W}b9Y-k!R>+3@U?AJsiIP2oH+2lgmMPtrJy!=h%snzc7 zH}$?*A0_331E^x@y^x(!39=M?_O;5>ozg!3&_b0ET*T2F1%fNZ22ET+kc&br^Um7c zG@6w&DoH<8^3~I*BsHr;oYC2$N#M|(%LLa*8H*lt4j{li$oNj}5L%^G15VNiv4uZQ z@`#|yqzZfQwb(Sw<=GhX=N#Giq)+Wi)2P1qRN;-)+izZkHsABMli7U}0@+O?tToQU zccL(Ndye{7R20R?Grb*h$OUH9&_z2N%^&T1ml7PtVJ_LlF0L#o2WmWU)i}6AOg$sy z_3#{4wvk8~9Mu(TmWW=aKodF$<(@|e{M^nXKIuEF;Z*ds0hv7R=CK?~3^RE%=9hxX zwn=ueJ&zI@?Ja|b*BhogI_c#rUqFP5IKQTpBPNZ0O`IC8SLwk;5a!x~)5tuoO;)PxtNS+vBVVd?q3uJC+ryAJmx?vz zXP(X0*~KOu%_W-*mEn&4Sp?ZMMBAKujW}k#_2ghGHATdBZH+LAd9(De$h{6FtUDw{ zlE|Zc+Wp?8a{Tv1De4!rA3@Z@V3Ro%B}$?nnb>gQ!#Fc3&&j7P!^cc+I~+Lt@4z-R~VAdV*# zQh0F&x~RPTC!vGN(T{~+4d7Qhs`nm#v)B@2+_uejPhiw**Z3f_UHp9U!}KC1YO)36 z*{P1sHrL&Smb01s0V8j7y*Q|-G3GFTc=1NdIgyObjR3!D(rigCqUdT&fp02F<_V-} z+G8;UQlKieFR{3x66}Ea!eB944<&0ld9qV)hD^%K3~*nbxMoBRW2^RU7WvtVU1)KI zbQ;;dKjKen+`MY4CsGw<;TAAS?8nN@sd&%KhHMAjfZ5K?jlXiN8PsRHtl5*-wu*-oRQT9(^tUEPUhRKAcNyjYG71*q*)vvW*G`ZmPUn&_c z;*kf44@zZt-3lZnsN3io1~o@fxggL|H`5-Zd{q`%NU52=A0~Y9&roUT_|Y#pd+qL# z*;zl?zc!x?277=ZmC3zB5BT=r%@Mfs;_i@iXc)Hs3B=rNWFsIgQaNb;PoNRb^Or3~ zX)w=M@|*Tq;lg?Ou%=1nQ%hOoPlm*v6ulbkfCpY?+ji?)5Z`F2s%CXsoC{#`rQkafgRt|CPb~Tm zhUdIz3aX!tL%jJW-&Y8%`ej_HIDdUg(P|=Wq`BI7HqRken-pGq8J*ua7h+?KP;vW&7JQ*1nS-WRcWe$8)NC0NaQz7%VnF1js}Ul$~>U5qLxPPk=` z@65dz=I?#L8M!Z!$!7_@eun_7Q?YPQU#5_%jDzfkVcUogb0G*DMEJRQC8G&ItJtf{ zd5BW8R+T(cDqTbox4 z?%Yy?jv#Dp1R768w1W#aS0alpA*JukR7t}m9-5iC%jJ-u$}o*}4-i-2BdLrL*T!+T zC8^WvVSg#80tGI-w9o2?deRWW|O z_p%6O%>v8Q+Y6qA+9}YHr=`$^S1Y;Q(YJp5rTxF*^H0rdEY9+xs#O_rtbss zx~(umFbS9D3`s98n~s(uX|zQu+^2JqQ#$d1rgz;cqKh%avMct^z(#;9#Nn%|2FAVs zk`8b;zabv}0noM%`~bM8t?RgykxzE>$la+87jGK+*N^L%rst|a5{hh$$xO;y1XDVlpD)+h6b0?Yt8MiOS6+9 zbqebi231UlpW7d185c|MRl)~{Sta)-uIF0 zne*P4x{1c+Zfq{CuJAdly8>A>-RnVHe-@9V>kZVq8aDyP;utGit3`4O#QW>O7+hE{6oFfZ!(8lnUQV-(RElK=0{^qg#(| z_a#tQ{U7DXdavAR&fh2?UCE5&CV>+nl>``r_KEae#=lBq)Kh8`uHpy0Qj~l=+Pv9VabgzYZJE z=1EiDOcY3#LH(0c{dI$S%C4K0voWWLE}&ZiqRDTlYr$w?-Qubumu$h)1Ko?gop_dO z&L1v~+Zdaf8D;UbUSxT7A+3Tq!S@}zJggXB=3M0BswUfEMSax`Mtc6}Gjm$_A<-W@Z&5D-s-gA#%K1ny+u^Jpc6d!NRlumk)K+uVrzLY0 zs5Vs-iCeCZ{o1CRoX5%A8ECD&`PK4qr+ROz_YPuFCZJIwEAm;Gcah?Vm3**v^#mI0{>39z>5 zIj?o{uf&3{otMu?z1ywL^LQ^BWilnQAMey2GAjEGI70JK%IBJ=f?n?0F3NSR$(irw z^)w-*ng(C*&>J-`$LwU#$By)QVsJ=E{K_wZbCpbwcbK2Dhtiw2Am{D6@JF<5Ok7Aa zS$NRL-Ba#@#0%Ncn1ZD1r%2h!*URg3fi3NG-chlnLC>;V?s6B-XQw$rAn7u#2S6H9 zGw7FK3ah4;Z1yYbKSlsM{wp?Z-A_Bej3u-fb7)GqS_*UrcX@WM*8Ex z&0P#nBQz0fc4`^+8<-Ker0)*=rkUBe{7!c9b@iqjPlrE!k4at==wXUxj1Y_|kTs|W z`>x24dfboX46w2WJ<<)6aZde%_8ZiIZ50eq&67mv#;af!Qvtiujz0fpE$$trPCv?g zeDd)ZY+^Rg1e>M6=fTP*>b9qcDjr#@?q=k2t@qIUyO)w*wGKaSgxk_38)}}gY6&3M z@LqSvm<1>^czHdRj1emH07|S>1Eu97IkR$Urr3h@Fn&#*C_}BXnj!mey@oEO1-9!D|n9 zN~7OhgfXb6oBAr|89G&(I~Of|tYtZ@H~LB6Y@L9~<7s8J?27aaWBvYG4LBfkzo(mB z_x(tHmLf0;wIsxpfi68-^wPibP}V=@oQ}>s%j%N-RB)vOIFClBt7Ukn`nFxfe*lMG BP&WVo literal 9993 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 ZTlNQYp_T3oeB#DpWMF=+@`_9J{{n6Fk{kd4 diff --git a/tests/snapshots/stax/test_sign_tx_transfer/00000.png b/tests/snapshots/stax/test_sign_tx_transfer/00000.png index 1223e88c36f2685fc2678b8f9323fa9b3ba39ea2..5c40f61f4ece2fb80c5d27a5785ecf4bbdddfbfe 100644 GIT binary patch literal 8356 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 diff --git a/tests/snapshots/stax/test_sign_tx_transfer/00002.png b/tests/snapshots/stax/test_sign_tx_transfer/00002.png index d47e1c90adeda271a7fb60fc3e5879e5a3ce5bed..06e0ce9b5fdac5cb442f38c6c8ec330c9c727b3f 100644 GIT binary patch literal 8941 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 diff --git a/tests/snapshots/stax/test_sign_tx_transfer/00004.png b/tests/snapshots/stax/test_sign_tx_transfer/00004.png index 00975a1033f0e710869c2481456550a30b4c9df9..f0e072df64b88159733a333905b6e3a28bd7ee82 100644 GIT binary patch literal 9910 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 BP&WVo literal 9993 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 ZTlNQYp_T3oeB#DpWMF=+@`_9J{{n6Fk{kd4 From 63abec3ed2e3ed921b3e879f7bc783be5da1cf08 Mon Sep 17 00:00:00 2001 From: n4l5u0r <59141606+n4l5u0r@users.noreply.github.com> Date: Wed, 12 Mar 2025 17:10:35 +0100 Subject: [PATCH 62/67] feat: add support for Venom variant in Makefile and update README for building instructions - Updated Makefile to include configuration for Venom variant, setting application name and icons accordingly. - Enhanced README with detailed instructions for building both Everscale and Venom variants of the application. --- Makefile | 15 ++++++++++++++- README.md | 45 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 59 insertions(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 86af904..9f3bbf3 100644 --- a/Makefile +++ b/Makefile @@ -25,7 +25,11 @@ include $(BOLOS_SDK)/Makefile.defines # Mandatory configuration # ######################################## # Application name +ifeq ($(COIN),VENOM) +APPNAME = "Venom" +else APPNAME = "Everscale" +endif APP_LOAD_FLAGS=--appFlags 0x200 @@ -40,10 +44,17 @@ APP_SOURCE_PATH += src # Application icons following guidelines: # https://developers.ledger.com/docs/embedded-app/design-requirements/#device-icon +ifeq ($(COIN),VENOM) +ICON_NANOX = icons/app_venom_14px.gif +ICON_NANOSP = icons/app_venom_14px.gif +ICON_STAX = icons/app_venom_32px.gif +ICON_FLEX = icons/app_venom_40px.gif +else ICON_NANOX = icons/app_everscale_14px.gif ICON_NANOSP = icons/app_everscale_14px.gif ICON_STAX = icons/app_everscale_32px.gif ICON_FLEX = icons/app_everscale_40px.gif +endif # Application allowed derivation curves. # Possibles curves are: secp256k1, secp256r1, ed25519 and bls12381g1 @@ -67,7 +78,9 @@ PATH_APP_LOAD_PARAMS = "44'/396'" # purpose=coin(44) / coin_type=Testnet(1) # * It must at least contains one value. # * Values can be the app ticker or anything else but should be unique. VARIANT_PARAM = COIN -VARIANT_VALUES = EVER + + +VARIANT_VALUES = EVER VENOM # Enabling DEBUG flag will enable PRINTF and disable optimizations DEBUG = 1 diff --git a/README.md b/README.md index 85ea906..57f58a6 100644 --- a/README.md +++ b/README.md @@ -219,3 +219,48 @@ speculos --model nanosp build/nanos2/bin/app.elf ## Documentation This follows the specification available in the [`api.md`](doc/api.md) + +## Building the application + +### Prerequisites + +- Install [Node.js](https://nodejs.org) (lts version) +- Install [Docker](https://docs.docker.com/get-docker/) +- Setup the Ledger development environment by following the [official documentation](https://developers.ledger.com/docs/nano-app/introduction/) +- Make sure the Ledger SDK environment variable is properly set: + ``` + export BOLOS_SDK=/path/to/your/sdk + ``` + +### Building + +This application can be built in two variants: + +- **Everscale** (default) +- **Venom** + +#### Building the Everscale variant (default) + +```bash +# Build with default configuration (Everscale) +make + +# Or explicitly specify Everscale +make COIN=EVER +``` + +#### Building the Venom variant + +```bash +# Build the Venom variant +make COIN=VENOM +``` + +### Loading the application on your device + +```bash +# Connect your Ledger device and run +make load +``` + +When building the application, the appropriate icons and application name will be used based on the selected variant. From 53100ead92ac93218f39977442050f4d63dbc4f3 Mon Sep 17 00:00:00 2001 From: n4l5u0r <59141606+n4l5u0r@users.noreply.github.com> Date: Wed, 12 Mar 2025 17:20:49 +0100 Subject: [PATCH 63/67] chore: update Makefile for Venom variant and increment app version - Incremented application version from 1.1.0 to 1.1.1. - Modified Makefile to conditionally set VARIANT_VALUES based on COIN variable, ensuring proper configuration for Venom and Ever variants. - Added new glyph and icon files for Venom variant in various sizes. --- Makefile | 8 ++++++-- .../app_venom_16px.gif | Bin glyphs/app_venom_64px.gif | Bin 0 -> 545 bytes icons/{nanox_app_venom.gif => app_venom_14px.gif} | Bin icons/app_venom_16px.gif | Bin 0 -> 98 bytes icons/app_venom_32px.gif.gif | Bin 0 -> 289 bytes icons/app_venom_40px.gif | Bin 0 -> 368 bytes 7 files changed, 6 insertions(+), 2 deletions(-) rename icons/nanos_app_venom.gif => glyphs/app_venom_16px.gif (100%) create mode 100644 glyphs/app_venom_64px.gif rename icons/{nanox_app_venom.gif => app_venom_14px.gif} (100%) create mode 100644 icons/app_venom_16px.gif create mode 100644 icons/app_venom_32px.gif.gif create mode 100644 icons/app_venom_40px.gif diff --git a/Makefile b/Makefile index 9f3bbf3..d5dac0d 100644 --- a/Makefile +++ b/Makefile @@ -36,7 +36,7 @@ APP_LOAD_FLAGS=--appFlags 0x200 # Application version APPVERSION_M = 1 APPVERSION_N = 1 -APPVERSION_P = 0 +APPVERSION_P = 1 APPVERSION = "$(APPVERSION_M).$(APPVERSION_N).$(APPVERSION_P)" # Application source files @@ -80,7 +80,11 @@ PATH_APP_LOAD_PARAMS = "44'/396'" # purpose=coin(44) / coin_type=Testnet(1) VARIANT_PARAM = COIN -VARIANT_VALUES = EVER VENOM +ifeq ($(COIN),VENOM) +VARIANT_VALUES = VENOM +else +VARIANT_VALUES = EVER +endif # Enabling DEBUG flag will enable PRINTF and disable optimizations DEBUG = 1 diff --git a/icons/nanos_app_venom.gif b/glyphs/app_venom_16px.gif similarity index 100% rename from icons/nanos_app_venom.gif rename to glyphs/app_venom_16px.gif diff --git a/glyphs/app_venom_64px.gif b/glyphs/app_venom_64px.gif new file mode 100644 index 0000000000000000000000000000000000000000..add495098684567de7561e5aa048bf9921a3c06e GIT binary patch literal 545 zcmZ?wbhEHbbYO5`_{;zT+}zya;^I0wI?2h&ix)4xaN)wsmoLA3`SSn&f3Q3Xq4<*p z%+~>tATt8E^JfhGM)Pw)3@Zxt78dg?D&<|eP6BE)6Y8b=Nj+iBX907{AoP?e1?<4JmHAW z>YBRB8cW7JmsZOT(d^b9nZB9{!jlT8NU?S?%;22W%2*%R)t(<**j(CJzDR^)T5?5c zY$40c<>}iL*tetyq}J?G*buT*n*E61+ym*1EP660&aPdYeC~qmiPe596{_NxSZ~O2 zM1JX7~PZ&dh6tM9M?wdyA1?WeSnI6VR!w2JeBmgU&eIDsEiX-S z=T#~FGiRpp{PtPh6_4&5d->REI!oZTJJ+>OS}f%>id(Dj_C&xuS4NpzQ3BI^)^PF| zhzX}aDrio1()7 e9!uwa;BnZ&YuR_urE#}bgu#5jy;Wa17_0$T72!hw literal 0 HcmV?d00001 diff --git a/icons/nanox_app_venom.gif b/icons/app_venom_14px.gif similarity index 100% rename from icons/nanox_app_venom.gif rename to icons/app_venom_14px.gif diff --git a/icons/app_venom_16px.gif b/icons/app_venom_16px.gif new file mode 100644 index 0000000000000000000000000000000000000000..c98d29206d992ac553365b35265228a74eaa64c3 GIT binary patch literal 98 zcmZ?wbhEHb6krfw_`t{j1poj4SNzEWVlgQG=l0A^Oi%SqOwUZt=1ot`%}um5&@(YL vF*Rk-0jU6KV_=f$>0f#JZGJ;fv8ThvwcB6*$e4ea!y_gprmwG`l9Doe_UsE6EU+Hdb&Gko1}$b~J1 zQ@>Ryp+K8uin}+TMuX+T87uV|l*JZLO_|uKU1XS~5aHSy$-}fjcWLaWp#9hOELTnc z#K6L#$Prv;Tgjs6Y~L;#*Qb~iD#7OO*sWAJ!^3)}h-H`f!ucXe6FK7&=1+4A(wVYU z$Zi8`Gbcy5_x4SkwJa*r8~3Jq>8@Uy>6LzDa!y_&(uBWG$l$5k!!Ga4HEVimq~MII`~GF?3_86SnWBz;*d?TPOuJ!LVi&t@vxAM?%=H(Cjv)ZsqVuIm%(=3Co_Lj4UjxWpe@H%wZz<=NFlP>uex?>+4 zDz*{3bfE1z=l(sf*mk@YS$RNHX7}Y!-Z_?xtACyTk@!=cUv@U*wJ(YX#699!tHO72 zCW~BL$m?Cp!IW}i$&8~c0 Date: Fri, 7 Mar 2025 01:37:00 +0100 Subject: [PATCH 64/67] fix: fuzzing build --- fuzz/CMakeLists.txt | 57 ---------------------------------- fuzz/Dockerfile | 38 ----------------------- fuzz/build.sh | 14 --------- fuzz/ux.h | 4 --- fuzzing/CMakeLists.txt | 60 ++++++++++++++++++++++++++++++++++++ fuzzing/Dockerfile | 19 ++++++++++++ fuzzing/README.md | 34 ++++++++++++++++++++ fuzzing/extra/TxParser.cmake | 37 ++++++++++++++++++++++ {fuzz => fuzzing}/fuzzer.c | 0 {fuzz => fuzzing}/os_mocks.c | 0 src/utils.c | 3 -- src/utils.h | 3 +- 12 files changed, 152 insertions(+), 117 deletions(-) delete mode 100644 fuzz/CMakeLists.txt delete mode 100644 fuzz/Dockerfile delete mode 100755 fuzz/build.sh delete mode 100644 fuzz/ux.h create mode 100644 fuzzing/CMakeLists.txt create mode 100644 fuzzing/Dockerfile create mode 100644 fuzzing/README.md create mode 100644 fuzzing/extra/TxParser.cmake rename {fuzz => fuzzing}/fuzzer.c (100%) rename {fuzz => fuzzing}/os_mocks.c (100%) diff --git a/fuzz/CMakeLists.txt b/fuzz/CMakeLists.txt deleted file mode 100644 index 64f22c4..0000000 --- a/fuzz/CMakeLists.txt +++ /dev/null @@ -1,57 +0,0 @@ -cmake_minimum_required(VERSION 3.10) - -project(NeoFuzzer VERSION 0.1.9 LANGUAGES C) - -set(CMAKE_C_STANDARD 11) - -# BOLOS SDK -set(BOLOS_SDK $ENV{BOLOS_SDK}) -add_compile_definitions(IO_HID_EP_LENGTH=64) - -find_package(OpenSSL REQUIRED) - -# add_compile_definitions(HAVE_HASH HAVE_SHA256) -include_directories(. - ../src - "${BOLOS_SDK}/include" - "${BOLOS_SDK}/lib_cxng/include" -) - -add_compile_options(-g -O0 -DFUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION) - -# Build with code coverage generation -if(CODE_COVERAGE) - if(CMAKE_C_COMPILER_ID MATCHES "(Apple)?[Cc]lang") - add_compile_options(-fprofile-instr-generate -fcoverage-mapping) - add_link_options(-fprofile-instr-generate -fcoverage-mapping) - elseif(CMAKE_C_COMPILER_ID MATCHES "GNU") - add_compile_options(-fprofile-arcs -ftest-coverage) - link_libraries(gcov) - else() - message(FATAL_ERROR "Unsupported compiler used with code coverage generation") - endif() -endif() - -# Fuzzer target -set(APP_SRC_DIR "../src") - -set(APP_SOURCES - ${APP_SRC_DIR}/byte_stream.c - ${APP_SRC_DIR}/message.c - ${APP_SRC_DIR}/slice_data.c - ${APP_SRC_DIR}/contract.c - ${APP_SRC_DIR}/cell.c - ${APP_SRC_DIR}/hashmap_label.c - ${APP_SRC_DIR}/utils.c -) - -add_executable(fuzzer - fuzzer.c - os_mocks.c - ${APP_SOURCES} -) - -target_include_directories(fuzzer PUBLIC ../src) -target_compile_options(fuzzer PUBLIC -fsanitize=fuzzer,address,undefined -fno-sanitize-recover=undefined) -target_link_options(fuzzer PUBLIC -fsanitize=fuzzer,address,undefined -fno-sanitize-recover=undefined) -target_link_libraries(fuzzer OpenSSL::SSL) diff --git a/fuzz/Dockerfile b/fuzz/Dockerfile deleted file mode 100644 index a54477a..0000000 --- a/fuzz/Dockerfile +++ /dev/null @@ -1,38 +0,0 @@ -FROM ubuntu:22.04 - -RUN apt update -RUN apt install -y git cmake clang libssl-dev - -# Clone the repository. -# WARNING: use the latest version of the app and integrate the fuzzer -RUN git clone https://github.com/qbLedger/ledger-app-everscale.git -RUN cd ledger-app-everscale && git checkout pr_ready - -# Get the sdk -RUN git clone https://github.com/LedgerHQ/nanos-secure-sdk.git - -# Patch the sdk -RUN echo -e 'diff --git a/include/os_seed.h b/include/os_seed.h\n\ -index 63b12ee..633346b 100644\n\ ---- a/include/os_seed.h\n\ -+++ b/include/os_seed.h\n\ -@@ -4,6 +4,8 @@\n\ - ''#include "decorators.h"\n\ - ''#include "lcx_ecfp.h"\n\ - ''#include "os_types.h"\n\ -+#include "ox_ec.h"\n\ -+#include "exceptions.h"\n\ - \n\ - /* ----------------------------------------------------------------------- */\n\ - /* - SEED FEATURE - */\n' > os_seed-fix.patch -RUN cat /os_seed-fix.patch -RUN patch -p1 -i /os_seed-fix.patch -d /nanos-secure-sdk/ - -# Set the BOLOS_SDK env var -ENV BOLOS_SDK /nanos-secure-sdk/ - -# Build the fuzzer -RUN cd ledger-app-everscale/fuzz && ./build.sh - -# Run the fuzzer. Here you can specify a pre-existing corpus -#RUN cd ledger-app-everscale/fuzz/cmake-build-fuzz && mkdir corpus && ./fuzzer corpus/ diff --git a/fuzz/build.sh b/fuzz/build.sh deleted file mode 100755 index c6ecbd2..0000000 --- a/fuzz/build.sh +++ /dev/null @@ -1,14 +0,0 @@ -#!/bin/bash -set -e - -SCRIPTDIR="$(cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd)" -BUILDDIR="$SCRIPTDIR/cmake-build-fuzz" - -# Compile fuzzer -rm -rf "$BUILDDIR" -mkdir "$BUILDDIR" -cd "$BUILDDIR" - -cmake -DCMAKE_C_COMPILER=clang .. -make clean -make fuzzer \ No newline at end of file diff --git a/fuzz/ux.h b/fuzz/ux.h deleted file mode 100644 index af11ba5..0000000 --- a/fuzz/ux.h +++ /dev/null @@ -1,4 +0,0 @@ -#pragma once - -#define bagl_element_t int -#define cx_ecfp_private_key_t int diff --git a/fuzzing/CMakeLists.txt b/fuzzing/CMakeLists.txt new file mode 100644 index 0000000..e7f72a5 --- /dev/null +++ b/fuzzing/CMakeLists.txt @@ -0,0 +1,60 @@ +cmake_minimum_required(VERSION 3.10) + +if(${CMAKE_VERSION} VERSION_LESS 3.10) + cmake_policy(VERSION ${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION}) +endif() + +# project information +project(FuzzTxParser + VERSION 1.0 + DESCRIPTION "Fuzzing of transaction parser" + LANGUAGES C) + +find_package(OpenSSL REQUIRED) + +# guard against bad build-type strings +if (NOT CMAKE_BUILD_TYPE) + set(CMAKE_BUILD_TYPE "Debug") +endif() + +if (NOT CMAKE_C_COMPILER_ID MATCHES "Clang") + message(FATAL_ERROR "Fuzzer needs to be built with Clang") +endif() + +if (NOT DEFINED BOLOS_SDK) + message(FATAL_ERROR "BOLOS_SDK environment variable not found.") +endif() + +if (NOT DEFINED TARGET_DEVICE) + message(FATAL_ERROR "TARGET_DEVICE environment variable not found.") +endif() + +# guard against in-source builds +if(${CMAKE_SOURCE_DIR} STREQUAL ${CMAKE_BINARY_DIR}) + message(FATAL_ERROR "In-source builds not allowed. Please make a new directory (called a build directory) and run CMake from there. You may need to remove CMakeCache.txt. ") +endif() + +# compatible with ClusterFuzzLite +if (NOT DEFINED ENV{LIB_FUZZING_ENGINE}) + set(COMPILATION_FLAGS_ "-g -Wall -fsanitize=fuzzer,address,undefined") +else() + set(COMPILATION_FLAGS_ "$ENV{LIB_FUZZING_ENGINE} $ENV{CXXFLAGS}") +endif() + +add_compile_options(-DFUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION=1) + +set(CMAKE_EXPORT_COMPILE_COMMANDS ON) + +add_compile_definitions(IO_HID_EP_LENGTH=64 USB_SEGMENT_SIZE=64 BLE_SEGMENT_SIZE=32) + +string(REPLACE " " ";" COMPILATION_FLAGS ${COMPILATION_FLAGS_}) + +include(extra/TxParser.cmake) + +add_executable(fuzzer fuzzer.c os_mocks.c) + +target_include_directories(fuzzer PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/../src) + +target_compile_options(fuzzer PUBLIC ${COMPILATION_FLAGS}) +target_link_options(fuzzer PUBLIC ${COMPILATION_FLAGS}) +target_link_libraries(fuzzer PUBLIC txparser OpenSSL::SSL) diff --git a/fuzzing/Dockerfile b/fuzzing/Dockerfile new file mode 100644 index 0000000..ea9f967 --- /dev/null +++ b/fuzzing/Dockerfile @@ -0,0 +1,19 @@ +FROM ghcr.io/ledgerhq/ledger-app-builder/ledger-app-builder-legacy:latest + +RUN apt update && apt install -y libssl-dev + +# Patch SDK +RUN cd /opt/ledger-secure-sdk && echo -e 'diff --git a/include/os_seed.h b/include/os_seed.h\n\ +index da35f4c5..1f4a224f 100644\n\ +--- a/include/os_seed.h\n\ ++++ b/include/os_seed.h\n\ +@@ -6,6 +6,8 @@\n\ + ''#include "decorators.h"\n\ + ''#include "lcx_ecfp.h"\n\ + ''#include "os_types.h"\n\ ++#include "ox_ec.h"\n\ ++#include "exceptions.h"\n\ + \n\ + /* ----------------------------------------------------------------------- */\n\ + /* - SEED FEATURE - */\n' > os_seed-fix.patch && \ +patch -p1 < os_seed-fix.patch diff --git a/fuzzing/README.md b/fuzzing/README.md new file mode 100644 index 0000000..49c3e32 --- /dev/null +++ b/fuzzing/README.md @@ -0,0 +1,34 @@ +# Fuzzing on transaction parser + +## Compilation + +* Build docker image + +``` +pushd fuzzing && docker build -t ledger-app-fuzzer . && popd +``` + +* Run docker container + +``` +docker run --rm -ti --user "$(id -u):$(id -g)" -v "$(realpath .):/app" ledger-app-fuzzer:latest + +``` + +* Build fuzzer inside the container + +``` +cd /app/fuzzing && cmake -DBOLOS_SDK=/opt/ledger-secure-sdk -DTARGET_DEVICE=nanos -DCMAKE_C_COMPILER=/usr/bin/clang -Bbuild -H. +``` + +then + +``` +make -C build +``` + +## Run + +``` +./build/fuzzer +``` diff --git a/fuzzing/extra/TxParser.cmake b/fuzzing/extra/TxParser.cmake new file mode 100644 index 0000000..ec74ef3 --- /dev/null +++ b/fuzzing/extra/TxParser.cmake @@ -0,0 +1,37 @@ +# project information +project(TxParser + VERSION 1.0 + DESCRIPTION "Transaction parser of Everscale app" + LANGUAGES C) + +# specify C standard +set(CMAKE_C_STANDARD 11) +set(CMAKE_C_STANDARD_REQUIRED True) +set(CMAKE_C_FLAGS_DEBUG + "${CMAKE_C_FLAGS_DEBUG} -Wall -Wextra -Wno-unused-function -DFUZZ -pedantic -g -O0" +) + +add_library(txparser + ${BOLOS_SDK}/lib_standard_app/format.c + ${BOLOS_SDK}/lib_standard_app/buffer.c + ${BOLOS_SDK}/lib_standard_app/read.c + ${BOLOS_SDK}/lib_standard_app/write.c + ${CMAKE_CURRENT_SOURCE_DIR}/../src/byte_stream.c + ${CMAKE_CURRENT_SOURCE_DIR}/../src/cell.c + ${CMAKE_CURRENT_SOURCE_DIR}/../src/contract.c + ${CMAKE_CURRENT_SOURCE_DIR}/../src/hashmap_label.c + ${CMAKE_CURRENT_SOURCE_DIR}/../src/message.c + ${CMAKE_CURRENT_SOURCE_DIR}/../src/slice_data.c + ${CMAKE_CURRENT_SOURCE_DIR}/../src/utils.c +) + +set_target_properties(txparser PROPERTIES SOVERSION 1) + +target_include_directories(txparser PUBLIC + ${BOLOS_SDK}/include + ${BOLOS_SDK}/lib_cxng/include + ${BOLOS_SDK}/lib_standard_app + ${BOLOS_SDK}/target/${TARGET_DEVICE}/include + ${CMAKE_CURRENT_SOURCE_DIR}/../src + ${CMAKE_CURRENT_SOURCE_DIR}/../src/ui +) diff --git a/fuzz/fuzzer.c b/fuzzing/fuzzer.c similarity index 100% rename from fuzz/fuzzer.c rename to fuzzing/fuzzer.c diff --git a/fuzz/os_mocks.c b/fuzzing/os_mocks.c similarity index 100% rename from fuzz/os_mocks.c rename to fuzzing/os_mocks.c diff --git a/src/utils.c b/src/utils.c index abd623d..d8868b1 100644 --- a/src/utils.c +++ b/src/utils.c @@ -1,7 +1,4 @@ -#include "os.h" -#include "cx.h" #include "utils.h" -#include "menu.h" #include diff --git a/src/utils.h b/src/utils.h index fe70505..be9306d 100644 --- a/src/utils.h +++ b/src/utils.h @@ -2,7 +2,6 @@ #define _UTILS_H_ #include "os.h" -#include "cx.h" #include "globals.h" #include @@ -10,6 +9,8 @@ #ifndef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION +#include "cx.h" + int get_public_key(uint32_t accountNumber, uint8_t* publicKeyArray); int get_private_key(uint32_t accountNumber, cx_ecfp_private_key_t* privateKey); From 56343893086e4705025e850205a9ef794bb1738e Mon Sep 17 00:00:00 2001 From: Alexey Pashinov Date: Mon, 10 Mar 2025 17:12:36 +0100 Subject: [PATCH 65/67] rust integration tests --- client/Cargo.lock | 184 ++++++++++++++---- client/Cargo.toml | 6 +- client/src/main.rs | 7 +- client/tests/get_address.rs | 23 +++ client/tests/get_pubkey.rs | 16 ++ client/tests/sign_message.rs | 57 ++++++ client/tests/sign_transaction.rs | 307 +++++++++++++++++++++++++++++++ client/tests/utils/mod.rs | 48 +++++ 8 files changed, 613 insertions(+), 35 deletions(-) create mode 100644 client/tests/get_address.rs create mode 100644 client/tests/get_pubkey.rs create mode 100644 client/tests/sign_message.rs create mode 100644 client/tests/sign_transaction.rs create mode 100644 client/tests/utils/mod.rs diff --git a/client/Cargo.lock b/client/Cargo.lock index 518c0bd..6272886 100644 --- a/client/Cargo.lock +++ b/client/Cargo.lock @@ -1,6 +1,6 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. -version = 3 +version = 4 [[package]] name = "addr2line" @@ -197,6 +197,12 @@ version = "0.21.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "604178f6c5c21f02dc555784810edfb88d34ac2c73b2eae109655649ee73ce3d" +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + [[package]] name = "base64ct" version = "1.0.1" @@ -224,9 +230,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.3.3" +version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "630be753d4e58660abd17930c71b647fe46c27ea6b63cc59e1e3851406972e42" +checksum = "5c8214115b7bf84099f1309324e63141d4c5d7cc26862f97a0a857dbefe165bd" [[package]] name = "bitvec" @@ -427,6 +433,7 @@ name = "client" version = "0.1.0" dependencies = [ "anyhow", + "base64 0.22.1", "bigdecimal", "clap", "ed25519-dalek", @@ -438,6 +445,7 @@ dependencies = [ "nekoton-contracts", "nekoton-utils", "rust_decimal", + "serial_test", "tokio", "ton_block", "ton_types", @@ -583,13 +591,14 @@ dependencies = [ [[package]] name = "dialoguer" -version = "0.10.4" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59c6f2989294b9a498d3ad5491a79c6deb604617378e1cdc4bfc1c1361fe2f87" +checksum = "658bce805d770f407bc62102fca7c2c64ceef2fbcb2b8bd19d2765ce093980de" dependencies = [ "console", "shell-words", "tempfile", + "thiserror", "zeroize", ] @@ -681,19 +690,17 @@ dependencies = [ [[package]] name = "everscale-ledger-wallet" version = "0.1.0" -source = "git+https://github.com/broxus/everscale-ledger-wallet.git#a481b2fa884e5015e0823c92f7d30489e26b8430" +source = "git+https://github.com/broxus/everscale-ledger-wallet.git#c3819438b2ba5c054220cab7def1e1ea82ab6c40" dependencies = [ "anyhow", "console", "dialoguer", "ed25519-dalek", - "hex", "hidapi", "log", - "num-derive", + "num-derive 0.4.2", "num-traits", "parking_lot", - "qstring", "semver", "thiserror", "uriparse", @@ -1172,9 +1179,9 @@ dependencies = [ [[package]] name = "lazy_static" -version = "1.4.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" [[package]] name = "libc" @@ -1492,6 +1499,17 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "num-derive" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.27", +] + [[package]] name = "num-integer" version = "0.1.45" @@ -1555,9 +1573,9 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.18.0" +version = "1.20.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" +checksum = "945462a4b81e43c4e3ba96bd7b49d834c6f61198356aa858733bc4acf3cbe62e" dependencies = [ "parking_lot_core", ] @@ -1614,9 +1632,9 @@ dependencies = [ [[package]] name = "parking_lot" -version = "0.12.1" +version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" +checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" dependencies = [ "lock_api", "parking_lot_core", @@ -1624,15 +1642,15 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.9.8" +version = "0.9.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93f00c865fe7cabf650081affecd3871070f26767e7b2070a3ffae14c654b447" +checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" dependencies = [ "cfg-if", "libc", - "redox_syscall", + "redox_syscall 0.5.10", "smallvec", - "windows-targets 0.48.1", + "windows-targets 0.52.6", ] [[package]] @@ -1760,15 +1778,6 @@ dependencies = [ "syn 1.0.109", ] -[[package]] -name = "qstring" -version = "0.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d464fae65fff2680baf48019211ce37aaec0c78e9264c84a3e484717f965104e" -dependencies = [ - "percent-encoding", -] - [[package]] name = "quick_cache" version = "0.3.0" @@ -1834,6 +1843,15 @@ dependencies = [ "bitflags 1.3.2", ] +[[package]] +name = "redox_syscall" +version = "0.5.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b8c0c260b63a8219631167be35e6a988e9554dbd323f8bd08439c8ed1302bd1" +dependencies = [ + "bitflags 2.9.0", +] + [[package]] name = "rend" version = "0.4.0" @@ -1946,7 +1964,7 @@ version = "0.38.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0a962918ea88d644592894bc6dc55acc6c0956488adcebbfb6e273506b7fd6e5" dependencies = [ - "bitflags 2.3.3", + "bitflags 2.9.0", "errno", "libc", "linux-raw-sys", @@ -1965,6 +1983,15 @@ version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741" +[[package]] +name = "scc" +version = "2.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea091f6cac2595aa38993f04f4ee692ed43757035c36e67c180b6828356385b1" +dependencies = [ + "sdd", +] + [[package]] name = "schannel" version = "0.1.22" @@ -1980,6 +2007,12 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" +[[package]] +name = "sdd" +version = "3.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "584e070911c7017da6cb2eb0788d09f43d789029b5877d3e5ecc8acf86ceee21" + [[package]] name = "seahash" version = "4.1.0" @@ -2068,6 +2101,31 @@ dependencies = [ "serde", ] +[[package]] +name = "serial_test" +version = "3.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b258109f244e1d6891bf1053a55d63a5cd4f8f4c30cf9a1280989f80e7a1fa9" +dependencies = [ + "futures", + "log", + "once_cell", + "parking_lot", + "scc", + "serial_test_derive", +] + +[[package]] +name = "serial_test_derive" +version = "3.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d69265a08751de7844521fd15003ae0a888e035773ba05695c5c759a6f89eef" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.27", +] + [[package]] name = "sha2" version = "0.9.9" @@ -2187,7 +2245,7 @@ checksum = "5486094ee78b2e5038a6382ed7645bc084dc2ec433426ca4c3cb61e2007b8998" dependencies = [ "cfg-if", "fastrand", - "redox_syscall", + "redox_syscall 0.3.5", "rustix", "windows-sys 0.48.0", ] @@ -2390,7 +2448,7 @@ dependencies = [ "hex", "log", "num", - "num-derive", + "num-derive 0.3.3", "num-traits", "rand", "rustc-hash", @@ -2720,6 +2778,22 @@ dependencies = [ "windows_x86_64_msvc 0.48.0", ] +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", + "windows_i686_gnullvm", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", +] + [[package]] name = "windows_aarch64_gnullvm" version = "0.42.2" @@ -2732,6 +2806,12 @@ version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc" +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + [[package]] name = "windows_aarch64_msvc" version = "0.42.2" @@ -2744,6 +2824,12 @@ version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3" +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + [[package]] name = "windows_i686_gnu" version = "0.42.2" @@ -2756,6 +2842,18 @@ version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241" +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + [[package]] name = "windows_i686_msvc" version = "0.42.2" @@ -2768,6 +2866,12 @@ version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00" +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + [[package]] name = "windows_x86_64_gnu" version = "0.42.2" @@ -2780,6 +2884,12 @@ version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1" +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + [[package]] name = "windows_x86_64_gnullvm" version = "0.42.2" @@ -2792,6 +2902,12 @@ version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953" +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + [[package]] name = "windows_x86_64_msvc" version = "0.42.2" @@ -2804,6 +2920,12 @@ version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + [[package]] name = "winreg" version = "0.10.1" diff --git a/client/Cargo.toml b/client/Cargo.toml index a662402..b315765 100644 --- a/client/Cargo.toml +++ b/client/Cargo.toml @@ -28,4 +28,8 @@ everscale-ledger-wallet = { git = "https://github.com/broxus/everscale-ledger-wa nekoton = { git = "https://github.com/broxus/nekoton.git", default-features = false } nekoton-abi = { git = "https://github.com/broxus/nekoton.git" } nekoton-utils = { git = "https://github.com/broxus/nekoton.git" } -nekoton-contracts = { git = "https://github.com/broxus/nekoton.git" } \ No newline at end of file +nekoton-contracts = { git = "https://github.com/broxus/nekoton.git" } + +[dev-dependencies] +base64 = "0.22" +serial_test = "3.2.0" diff --git a/client/src/main.rs b/client/src/main.rs index b4318de..4a8901f 100644 --- a/client/src/main.rs +++ b/client/src/main.rs @@ -1,6 +1,6 @@ use bigdecimal::BigDecimal; +use std::rc::Rc; use std::str::FromStr; -use std::sync::Arc; use bigdecimal::num_bigint::ToBigInt; use clap::Parser; @@ -224,7 +224,7 @@ impl Token { } } -fn get_ledger() -> (Arc, PublicKey) { +fn get_ledger() -> (Rc, PublicKey) { let wallet_manager = initialize_wallet_manager().expect("Couldn't start wallet manager"); // Update device list @@ -523,7 +523,8 @@ async fn main() -> anyhow::Result<()> { match contract { Some(contract) => { let mut balance = - Decimal::from_u128(contract.account.storage.balance.grams.as_u128()).trust_me(); + Decimal::from_u128(contract.account.storage.balance.grams.as_u128()) + .trust_me(); balance.set_scale(EVER_DECIMALS as u32)?; println!("Balance: {} EVER", balance); } diff --git a/client/tests/get_address.rs b/client/tests/get_address.rs new file mode 100644 index 0000000..a163078 --- /dev/null +++ b/client/tests/get_address.rs @@ -0,0 +1,23 @@ +use everscale_ledger_wallet::ledger::WalletType; +use everscale_ledger_wallet::remote_wallet::RemoteWallet; + +use crate::utils::get_ledger; + +mod utils; + +#[test] +fn ledger_get_address() -> anyhow::Result<()> { + let (ledger, _) = get_ledger(); + + ledger.get_address(0, WalletType::WalletV3, false)?; + ledger.get_address(0, WalletType::EverWallet, false)?; + ledger.get_address(0, WalletType::SafeMultisig, false)?; + ledger.get_address(0, WalletType::SafeMultisig24h, false)?; + ledger.get_address(0, WalletType::SetcodeMultisig, false)?; + ledger.get_address(0, WalletType::BridgeMultisig, false)?; + ledger.get_address(0, WalletType::Surf, false)?; + ledger.get_address(0, WalletType::Multisig2, false)?; + ledger.get_address(0, WalletType::Multisig2_1, false)?; + + Ok(()) +} diff --git a/client/tests/get_pubkey.rs b/client/tests/get_pubkey.rs new file mode 100644 index 0000000..4d7442a --- /dev/null +++ b/client/tests/get_pubkey.rs @@ -0,0 +1,16 @@ +use everscale_ledger_wallet::remote_wallet::RemoteWallet; + +use crate::utils::get_ledger; + +mod utils; + +#[test] +fn ledger_get_pubkey() -> anyhow::Result<()> { + let (ledger, _) = get_ledger(); + + ledger.get_pubkey(0, false)?; + ledger.get_pubkey(1, false)?; + ledger.get_pubkey(2, false)?; + + Ok(()) +} diff --git a/client/tests/sign_message.rs b/client/tests/sign_message.rs new file mode 100644 index 0000000..302a23f --- /dev/null +++ b/client/tests/sign_message.rs @@ -0,0 +1,57 @@ +use std::str::FromStr; + +use ed25519_dalek::Verifier; +use everscale_ledger_wallet::ledger::SIGN_MAGIC; +use everscale_ledger_wallet::remote_wallet::RemoteWallet; +use nekoton::core::models::Expiration; +use nekoton::core::ton_wallet::wallet_v3::InitData; +use nekoton::core::ton_wallet::Gift; +use nekoton_utils::SimpleClock; +use ton_block::MsgAddressInt; + +use crate::utils::{get_ledger, DEFAULT_EXPIRATION_TIMEOUT, WALLET_ID}; + +mod utils; + +// This test requires interactive approval of message signing on the ledger. +#[test] +fn ledger_sign_message() -> anyhow::Result<()> { + let (ledger, _) = get_ledger(); + + let account = 0; + + // Get public key + let public_key = ledger.get_pubkey(account, false)?; + + // Transfer parameters + let flags = 3; + let bounce = true; + let amount = 123_456_785_012_345_678; + let destination = MsgAddressInt::from_str( + "0:df112b59eb82792623575194c60d2f547c68d54366644a3a5e02b8132f3c4c56", + )?; + + let gift = Gift { + flags, + bounce, + destination, + amount, + body: None, + state_init: None, + }; + let expiration = Expiration::Timeout(DEFAULT_EXPIRATION_TIMEOUT); + + let init_data = InitData::from_key(&public_key).with_wallet_id(WALLET_ID); + let (hash, _) = + init_data.make_transfer_payload(vec![gift], expiration.timestamp(&SimpleClock))?; + + let signature = ledger.sign_message(account, hash.as_slice())?; + + let mut message = Vec::with_capacity(SIGN_MAGIC.len() + hash.as_slice().len()); + message.extend(SIGN_MAGIC.to_vec()); + message.extend(hash.into_vec()); + + assert!(public_key.verify(message.as_slice(), &signature).is_ok()); + + Ok(()) +} diff --git a/client/tests/sign_transaction.rs b/client/tests/sign_transaction.rs new file mode 100644 index 0000000..0729ac6 --- /dev/null +++ b/client/tests/sign_transaction.rs @@ -0,0 +1,307 @@ +use std::borrow::Cow; +use std::str::FromStr; + +use base64::Engine; +use ed25519_dalek::{Verifier, SIGNATURE_LENGTH}; +use everscale_ledger_wallet::ledger::{SignTransactionMeta, WalletType}; +use everscale_ledger_wallet::remote_wallet::RemoteWallet; +use nekoton::core::models::Expiration; +use nekoton::core::utils::make_labs_unsigned_message; +use nekoton::crypto::Signature; +use nekoton_abi::{BigUint128, MessageBuilder}; +use nekoton_utils::{SimpleClock, TrustMe}; +use serial_test::serial; +use ton_block::MsgAddressInt; +use ton_types::{AccountId, UInt256}; + +use crate::utils::{ + get_ledger, DEFAULT_EXPIRATION_TIMEOUT, EVER_DECIMALS, EVER_TICKER, USDT_DECIMALS, USDT_TICKER, +}; + +mod utils; + +// This test requires interactive approval of message signing on the ledger. +#[test] +#[serial] +fn ledger_sign_send_transaction() -> anyhow::Result<()> { + let (ledger, _) = get_ledger(); + + let account = 0; + let wallet_type = WalletType::EverWallet; + + // Get public key + let public_key = ledger.get_pubkey(account, false)?; + + // Get address + let address_bytes = ledger.get_address(account, wallet_type, false)?; + let address = MsgAddressInt::with_standart( + None, + ton_block::BASE_WORKCHAIN_ID as i8, + AccountId::from(UInt256::from_be_bytes(&address_bytes)), + )?; + + // Prepare message + let message = ton_block::Message::with_ext_in_header(ton_block::ExternalInboundMessageHeader { + dst: address, + ..Default::default() + }); + + // Transfer parameters + let flags: u8 = 3; + let bounce = true; + let amount: u64 = 123_456_785_012_345_678; + let destination = MsgAddressInt::from_str( + "0:df112b59eb82792623575194c60d2f547c68d54366644a3a5e02b8132f3c4c56", + )?; + let body: ton_types::Cell = Default::default(); + let expiration = Expiration::Timeout(DEFAULT_EXPIRATION_TIMEOUT); + + let (function, input) = + MessageBuilder::new(nekoton_contracts::wallets::ever_wallet::send_transaction()) + .arg(destination) + .arg(BigUint128(amount.into())) + .arg(bounce) + .arg(flags) + .arg(body) + .build(); + + // Create unsigned message + let unsigned_message = make_labs_unsigned_message( + &SimpleClock, + message, + expiration, + &public_key, + Cow::Borrowed(function), + input, + )?; + let message_hash = unsigned_message.hash(); + + // Fake sign + let signature: Signature = [0_u8; 64]; + let signed = unsigned_message.sign(&signature)?; + + // Extract message body + let mut data = signed.message.body().trust_me(); + + let bit = data.get_next_bit()?; + assert!(bit); + + // Strip empty signature + data.move_by(SIGNATURE_LENGTH * 8)?; + + let meta = SignTransactionMeta::default(); + + let cell = data.into_cell(); + let boc = ton_types::serialize_toc(&cell)?; + + let signature = + ledger.sign_transaction(account, wallet_type, EVER_DECIMALS, EVER_TICKER, meta, &boc)?; + assert!(public_key.verify(message_hash, &signature).is_ok()); + + Ok(()) +} + +// This test requires interactive approval of message signing on the ledger. +#[test] +#[serial] +fn ledger_sign_send_token_transaction() -> anyhow::Result<()> { + let (ledger, _) = get_ledger(); + + let account = 0; + let wallet_type = WalletType::SafeMultisig; + + // Get public key + let public_key = ledger.get_pubkey(account, false)?; + + // Get address + let address_bytes = ledger.get_address(account, wallet_type, false)?; + let address = MsgAddressInt::with_standart( + None, + ton_block::BASE_WORKCHAIN_ID as i8, + AccountId::from(UInt256::from_be_bytes(&address_bytes)), + )?; + + // Prepare message + let message = ton_block::Message::with_ext_in_header(ton_block::ExternalInboundMessageHeader { + dst: address, + ..Default::default() + }); + + // Transfer parameters + let flags: u8 = 3; + let bounce = true; + let amount: u64 = 123_456_785_012; + let destination = MsgAddressInt::from_str( + "0:df112b59eb82792623575194c60d2f547c68d54366644a3a5e02b8132f3c4c56", + )?; + let body: ton_types::Cell = ton_types::deserialize_tree_of_cells(&mut base64::engine::general_purpose::STANDARD + .decode("te6ccgEBAwEAYAABa0ap1+wAAAAAAAAAAAAAAABJUE+AgBXkJWs9cE8kxGrqMpjBpeqPjRqobMyJR0vAVwJl54mK0AEBQ4AX5CVrPXBPJMRq6jKYwaXqj40aqGzMiUdLwFcCZeeJisgCAAA=")?.as_slice())?; + + let expiration = Expiration::Timeout(DEFAULT_EXPIRATION_TIMEOUT); + + let (function, input) = + MessageBuilder::new(nekoton_contracts::wallets::multisig::send_transaction()) + .arg(destination) + .arg(BigUint128(amount.into())) + .arg(bounce) + .arg(flags) + .arg(body) + .build(); + + // Create unsigned message + let unsigned_message = make_labs_unsigned_message( + &SimpleClock, + message, + expiration, + &public_key, + Cow::Borrowed(function), + input, + )?; + let message_hash = unsigned_message.hash(); + + // Fake sign + let signature: Signature = [0_u8; 64]; + let signed = unsigned_message.sign(&signature)?; + + // Extract message body + let mut data = signed.message.body().trust_me(); + + let bit = data.get_next_bit()?; + assert!(bit); + + // Strip empty signature + data.move_by(SIGNATURE_LENGTH * 8)?; + + let meta = SignTransactionMeta::default(); + + let cell = data.into_cell(); + let boc = ton_types::serialize_toc(&cell)?; + + let signature = + ledger.sign_transaction(account, wallet_type, USDT_DECIMALS, USDT_TICKER, meta, &boc)?; + assert!(public_key.verify(message_hash, &signature).is_ok()); + + Ok(()) +} + +// This test requires interactive approval of message signing on the ledger. +#[test] +#[serial] +fn ledger_sign_confirm_transaction() -> anyhow::Result<()> { + // let boc = base64::decode("te6ccgEBAQEAOwAAcbO621NdG4jQ5NYNMWVnsUSFaO+v3yGEbs0LoC462r+XAAAAxHGVwt0ySiJcDVOgdrJKDeYh5nYAwA==")?; + + let boc = base64::engine::general_purpose::STANDARD + .decode("te6ccgEBAQEAOwAAcfDmnGpQVUZxL24fHgfUfLGp2/wzR+YWmZukQraxETyqAAAAxHF5r4KyShssDVOgdrJKGvzpVh6gwA==")?; + + let cell = ton_types::deserialize_tree_of_cells(&mut boc.as_slice())?; + + let message_hash = cell.repr_hash(); + + let (ledger, _) = get_ledger(); + + let account = 0; + let wallet_type = WalletType::SafeMultisig; + + // Get public key + let public_key = ledger.get_pubkey(account, false)?; + + let meta = SignTransactionMeta::default(); + + let signature = + ledger.sign_transaction(account, wallet_type, EVER_DECIMALS, EVER_TICKER, meta, &boc)?; + assert!(public_key + .verify(message_hash.as_slice(), &signature) + .is_ok()); + + Ok(()) +} + +// This test requires interactive approval of message signing on the ledger. +#[test] +#[serial] +fn ledger_sign_submit_transaction() -> anyhow::Result<()> { + let boc = base64::engine::general_purpose::STANDARD + .decode("te6ccgEBBQEAyQABYbO621NdG4jQ5NYNMWVnsUSFaO+v3yGEbs0LoC462r+XAAAAxHGlca+ySiZfiY7BZsABAWOAG+Ilaz1wTyTEauoymMGl6o+NGqhszIlHS8BXAmXniYrAAAAAAAAAAAA202lAb5VWNAIBa0ap1+wAAAAAAAAAAAAAAABJUE+AgBXkJWs9cE8kxGrqMpjBpeqPjRqobMyJR0vAVwJl54mK0AMBQ4AX5CVrPXBPJMRq6jKYwaXqj40aqGzMiUdLwFcCZeeJisgEAAA=")?; + let cell = ton_types::deserialize_tree_of_cells(&mut boc.as_slice())?; + + let message_hash = cell.repr_hash(); + + let (ledger, _) = get_ledger(); + + let account = 0; + let wallet_type = WalletType::SafeMultisig; + + // Get public key + let public_key = ledger.get_pubkey(account, false)?; + + let meta = SignTransactionMeta::default(); + + let signature = + ledger.sign_transaction(account, wallet_type, USDT_DECIMALS, USDT_TICKER, meta, &boc)?; + assert!(public_key + .verify(message_hash.as_slice(), &signature) + .is_ok()); + + Ok(()) +} + +// This test requires interactive approval of message signing on the ledger. +#[test] +#[serial] +fn ledger_sign_burn_transaction() -> anyhow::Result<()> { + let boc = base64::engine::general_purpose::STANDARD + .decode("te6ccgEBBQEAyQABYbO621NdG4jQ5NYNMWVnsUSFaO+v3yGEbs0LoC462r+XAAAAxHGxjJEySil5CY7BZsABAWOAG+Ilaz1wTyTEauoymMGl6o+NGqhszIlHS8BXAmXniYrAAAAAAAAAAAA202lAb5VWNAIBa1YlSK0AAAAAAAAAAAAAAABJUE+AgBXkJWs9cE8kxGrqMpjBpeqPjRqobMyJR0vAVwJl54mK0AMBQ4AX5CVrPXBPJMRq6jKYwaXqj40aqGzMiUdLwFcCZeeJitAEAAA=")?; + + let cell = ton_types::deserialize_tree_of_cells(&mut boc.as_slice())?; + + let message_hash = cell.repr_hash(); + + let (ledger, _) = get_ledger(); + + let account = 0; + let wallet_type = WalletType::SafeMultisig; + + // Get public key + let public_key = ledger.get_pubkey(account, false)?; + + let meta = SignTransactionMeta::default(); + + let signature = + ledger.sign_transaction(account, wallet_type, USDT_DECIMALS, USDT_TICKER, meta, &boc)?; + assert!(public_key + .verify(message_hash.as_slice(), &signature) + .is_ok()); + + Ok(()) +} + +// This test requires interactive approval of message signing on the ledger. +// Chunks test +#[test] +#[serial] +fn ledger_sign_large_transaction() -> anyhow::Result<()> { + let boc = base64::engine::general_purpose::STANDARD + .decode("te6ccgECBgEAASwAIWHw5pxqUFVGcS9uHx4H1Hyxqdv8M0fmFpmbpEK2sRE8qgAAAMVB8+fysn958qZ3MjZAASFlgBpSNW8J55zSsfWhyOd5rDEjZgefz1LcWODp5B1bqgHogAAAAAAAAAAAAAAAJUC+QBA4AiOVEMgafQAACAoJgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACBQQDKEgBAUZsZIPd9xkGAco8YjJOBZgvCE3wlneY/Wx25kfOjumaAAAoSAEB1IDh09lVWihGkWEM9d9w01WXUrJVmfTd7p+dAZMyU/oAAChIAQGQCROE6sQnHzRREUyjfCGGj+o03d7B++Lo06vNLc44JgAA")?; + + let cell = ton_types::deserialize_tree_of_cells(&mut boc.as_slice())?; + + let message_hash = cell.hash(0); // pruned hash + + let (ledger, _) = get_ledger(); + + let account = 0; + let wallet_type = WalletType::SafeMultisig; + + // Get public key + let public_key = ledger.get_pubkey(account, false)?; + + let meta = SignTransactionMeta::default(); + + let signature = + ledger.sign_transaction(account, wallet_type, EVER_DECIMALS, EVER_TICKER, meta, &boc)?; + assert!(public_key + .verify(message_hash.as_slice(), &signature) + .is_ok()); + + Ok(()) +} diff --git a/client/tests/utils/mod.rs b/client/tests/utils/mod.rs new file mode 100644 index 0000000..d670372 --- /dev/null +++ b/client/tests/utils/mod.rs @@ -0,0 +1,48 @@ +use std::rc::Rc; + +use ed25519_dalek::PublicKey; +use everscale_ledger_wallet::ledger::LedgerWallet; +use everscale_ledger_wallet::locator::Manufacturer; +use everscale_ledger_wallet::remote_wallet::initialize_wallet_manager; + +#[allow(dead_code)] +pub const WALLET_ID: u32 = 0x4BA92D8A; + +#[allow(dead_code)] +pub const EVER_DECIMALS: u8 = 9; +#[allow(dead_code)] +pub const EVER_TICKER: &str = "EVER"; + +#[allow(dead_code)] +pub const USDT_DECIMALS: u8 = 9; +#[allow(dead_code)] +pub const USDT_TICKER: &str = "USDT"; + +#[allow(dead_code)] +pub const DEFAULT_EXPIRATION_TIMEOUT: u32 = 60; // sec + +pub fn get_ledger() -> (Rc, PublicKey) { + let wallet_manager = initialize_wallet_manager().expect("Couldn't start wallet manager"); + + // Update device list + const NO_DEVICE_HELP: &str = "No Ledger found, make sure you have a unlocked Ledger connected with the Ledger Wallet Everscale running"; + wallet_manager.update_devices().expect(NO_DEVICE_HELP); + assert!( + !wallet_manager.list_devices().is_empty(), + "{}", + NO_DEVICE_HELP + ); + + // Fetch the device path and base pubkey of a connected ledger device + let (base_pubkey, device_path) = wallet_manager + .list_devices() + .iter() + .find(|d| d.manufacturer == Manufacturer::Ledger) + .cloned() + .map(|d| (d.pubkey, d.host_device_path)) + .expect("No ledger device detected"); + + let ledger = wallet_manager.get_ledger(&device_path).expect("get device"); + + (ledger, base_pubkey) +} From b8b4c0ed840b149d802e404ac26c563f8cd03a33 Mon Sep 17 00:00:00 2001 From: Alexey Pashinov Date: Mon, 17 Mar 2025 00:56:45 +0100 Subject: [PATCH 66/67] extend cell tree depth to 16 --- client/tests/sign_transaction.rs | 30 ++++++++++++++++++++++++++++++ src/globals.h | 2 +- 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/client/tests/sign_transaction.rs b/client/tests/sign_transaction.rs index 0729ac6..203796c 100644 --- a/client/tests/sign_transaction.rs +++ b/client/tests/sign_transaction.rs @@ -305,3 +305,33 @@ fn ledger_sign_large_transaction() -> anyhow::Result<()> { Ok(()) } + +#[test] +#[serial] +fn ledger_many_msig_custodians_transaction() -> anyhow::Result<()> { + // Multisig with 15 custodians + let boc = base64::engine::general_purpose::STANDARD + .decode("te6ccgECHwEAApQAAmuzuttTXRuI0OTWDTFlZ7FEhWjvr98hhG7NC6AuOtq/lwAAAMrQsOrKM+uyhxXYd8eAAAAHwGACAQAIAAAAAQIDzkAQAwIBIAkEAgEgBgUAQUYLBilvnAvo1CkFGNMQGOqQO13kBQQZKVO/Yx8ei1a5KAIBIAgHAEEULBilvnAvo1CkFGNMQGOqQO13kBQQZKVO/Yx8ei1a5KAAQRAsGKW+cC+jUKQUY0xAY6pA7XeQFBBkpU79jHx6LVrkoAIBIA0KAgEgDAsAQQwsGKW+cC+jUKQUY0zAY6pA7XeQFBBkpU79jHy6LVrAoABBCCwYpb5wL6NQpBRfTEBjqkDtd5AUEGSlTv2MfLotWsCgAgEgDw4AQQQsGKW+cC+jUKQUX0yAY6pA7XeQFBBkpU79jHy6LVrAoABBJuwYpb5wL6NQpBRfTMBjqkDtd5AUEGSlTv2MfLotWsCgAgEgGBECASAVEgIBIBQTAEEi7BilvnAvo1CkFF9MwGOoQO13kBQQZKVO/Yx8ui1awKAAQR7sGKW+cC+jUKQUX0zAY6oA7XeQFBBkpU79jHy6LVrAoAIBIBcWAEEa7BilvnAvo1CkFF9MwGOoQO13kBQQZKVO/Yx8ui1awuAAQRbsGKW+cC+jUKQUX0zAY6pA7XeQFBBkpU79jHy6LVrC4AIBIBwZAgEgGxoAQRLsGKW+cC+jUKQUX0zAY6pA7XeQFBBkpU79jHy6LVrC4ABBDuwYpb5wL6NQpBRfTMBjqkDtd5AUEGSlTv2MfLotWsLgAgEgHh0AQQrsGKW+cC+jUKQUX0zAY6pA7XeQFBBkpU79jHy6LVrC4ABBBuwYpb5wL6NQpBRfTMBjqkDtd5AUEGSlTv2MfLotWsLg")?; + + let cell = ton_types::deserialize_tree_of_cells(&mut boc.as_slice())?; + + let message_hash = cell.repr_hash(); + + let (ledger, _) = get_ledger(); + + let account = 0; + let wallet_type = WalletType::SafeMultisig; + + // Get public key + let public_key = ledger.get_pubkey(account, false)?; + + let meta = SignTransactionMeta::default(); + + let signature = + ledger.sign_transaction(account, wallet_type, EVER_DECIMALS, EVER_TICKER, meta, &boc)?; + assert!(public_key + .verify(message_hash.as_slice(), &signature) + .is_ok()); + + Ok(()) +} diff --git a/src/globals.h b/src/globals.h index 0c2ecfc..58338bb 100644 --- a/src/globals.h +++ b/src/globals.h @@ -34,7 +34,7 @@ #define WALLET_ID 0x4BA92D8A -#define MAX_CONTRACT_CELLS_COUNT 7 +#define MAX_CONTRACT_CELLS_COUNT 16 #define HASHES_BUFFER_SIZE (MAX_CONTRACT_CELLS_COUNT * HASH_SIZE) #define MAX_PUBLIC_KEY_CELL_DATA_SIZE 36 // label(3) + public key(32) + tag(1) From 7695775455731f3bfc5d369e54d40889e1385974 Mon Sep 17 00:00:00 2001 From: Alexey Pashinov Date: Wed, 19 Mar 2025 13:45:25 +0100 Subject: [PATCH 67/67] fix warnings --- src/apdu/dispatcher.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/apdu/dispatcher.c b/src/apdu/dispatcher.c index 738054e..4a463d6 100644 --- a/src/apdu/dispatcher.c +++ b/src/apdu/dispatcher.c @@ -99,7 +99,7 @@ int apdu_dispatcher(const command_t* cmd, volatile unsigned int* flags) { return handleSign(&buf, flags); case INS_SIGN_TRANSACTION: - if (cmd->p1 != P1_CONFIRM || (cmd->p2 < 0 || cmd->p2 > 3)) { + if (cmd->p1 != P1_CONFIRM || cmd->p2 > 3) { return io_send_sw(ERR_WRONG_P1P2); }